From d838c7da1def3cbc126b03801214276e1a3481b7 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 10 Sep 2024 08:01:05 -0700 Subject: [PATCH 001/421] Change brushes to store HSV colors such that the color picker can operate on them directly --- external/bonsai_stdlib | 2 +- generated/are_equal_brush_settings.h | 2 +- generated/default_marshal_brush_settings_0.h | 4 +- generated/default_marshal_brush_settings_1.h | 4 +- generated/default_marshal_brush_settings_2.h | 4 +- .../default_marshal_layered_brush_editor_0.h | 2 +- .../default_marshal_layered_brush_editor_1.h | 2 +- .../default_marshal_layered_brush_editor_2.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 4 +- generated/serdes_struct_brush_settings.h | 4 +- src/engine/editor.cpp | 47 +++++++++---------- src/engine/editor.h | 11 +++-- 12 files changed, 44 insertions(+), 44 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 41ebc2a47..b69b0e15b 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 41ebc2a47c8a6d01ba4b6bb76a4fcf7f703280d2 +Subproject commit b69b0e15b11360d2ac35d50f040048817b1e1853 diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 31e0b12f3..0e7c3378c 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:912:0 +// src/engine/editor.h:913:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index a5558a52c..64706e18b 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:977:0 +// src/engine/editor.h:978:0 Live->Type = Stored->Type; @@ -28,5 +28,5 @@ Live->Offset = Stored->Offset; -Live->RGBColor = MagicaVoxelDefaultPaletteToRGB(Stored->Color); +Live->HSVColor = MagicaVoxelDefaultPaletteToHSV(Stored->Color); diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index f5202671d..260a13d1d 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:970:0 +// src/engine/editor.h:971:0 Live->Type = Stored->Type; @@ -32,5 +32,5 @@ Live->NoiseBasisOffset = Stored->NoiseBasisOffset; -Live->RGBColor = MagicaVoxelDefaultPaletteToRGB(Stored->Color); +Live->HSVColor = MagicaVoxelDefaultPaletteToHSV(Stored->Color); diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index 969e11d15..765fc8b38 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:963:0 +// src/engine/editor.h:964:0 Live->Type = Stored->Type; @@ -32,7 +32,7 @@ Live->NoiseBasisOffset = Stored->NoiseBasisOffset; -Live->RGBColor = MagicaVoxelDefaultPaletteToRGB(Stored->Color); +Live->HSVColor = MagicaVoxelDefaultPaletteToHSV(Stored->Color); diff --git a/generated/default_marshal_layered_brush_editor_0.h b/generated/default_marshal_layered_brush_editor_0.h index 2304c3b95..b7d31bfa7 100644 --- a/generated/default_marshal_layered_brush_editor_0.h +++ b/generated/default_marshal_layered_brush_editor_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1075:0 +// src/engine/editor.h:1076:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_layered_brush_editor_1.h b/generated/default_marshal_layered_brush_editor_1.h index 36562e431..39478d442 100644 --- a/generated/default_marshal_layered_brush_editor_1.h +++ b/generated/default_marshal_layered_brush_editor_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1068:0 +// src/engine/editor.h:1069:0 RangeIterator(Index, (256)) { diff --git a/generated/default_marshal_layered_brush_editor_2.h b/generated/default_marshal_layered_brush_editor_2.h index b64633e9a..ae92cb1a5 100644 --- a/generated/default_marshal_layered_brush_editor_2.h +++ b/generated/default_marshal_layered_brush_editor_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1061:0 +// src/engine/editor.h:1062:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index ab108cc34..047c6e24f 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -150,8 +150,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->RGBColor), - CSz("RGBColor"), + Cast(v3*,&Element->HSVColor), + CSz("HSVColor"), Params ); diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index e364c6a8e..b53739938 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -82,7 +82,7 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings *BaseElement, umm Count = - Result &= Serialize(Bytes, &Element->RGBColor); + Result &= Serialize(Bytes, &Element->HSVColor); @@ -202,7 +202,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->RGBColor, Memory); + Result &= Deserialize(Bytes, &Element->HSVColor, Memory); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 863ff0fb3..f6e37bca5 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1089,7 +1089,7 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br generic_noise_params NoiseParams = {}; void *UserData = {}; - NoiseParams.RGBColor = Settings->RGBColor; + NoiseParams.RGBColor = HSVtoRGB(Settings->HSVColor); switch (Noise->Type) { case NoiseType_White: @@ -1251,7 +1251,7 @@ DoSettingsForBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thum /* Settings->Offset.Max = Max(V3i( Settings->Iterations), Settings->Offset.Max); */ { - ui_style Style = UiStyleFromLightestColor(Settings->RGBColor); + ui_style Style = UiStyleFromLightestColor(HSVtoRGB(Settings->HSVColor)); PushUntexturedQuad(Ui, {}, V2(Global_Font.Size.y), zDepth_Text, &Style, DefaultGenericPadding); @@ -1263,7 +1263,7 @@ DoSettingsForBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thum } PushNewRow(Ui); - ColorPickerModal(Engine, ColorPickerModalId, &Settings->RGBColor, False); + ColorPickerModal(Engine, ColorPickerModalId, &Settings->HSVColor, False); PushNewRow(Ui); } @@ -1342,7 +1342,7 @@ ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *P if (Iterations > 1) { Info("%d", Iterations); } RangeIterator(IterIndex, Iterations) { - work_queue_entry_update_world_region Job = WorkQueueEntryUpdateWorldRegion(Mode, Modifier, SimFloodOrigin, &Shape, Layer->Settings.RGBColor, {}, {}, {}, {}, 0); + work_queue_entry_update_world_region Job = WorkQueueEntryUpdateWorldRegion(Mode, Modifier, SimFloodOrigin, &Shape, HSVtoRGB(Layer->Settings.HSVColor), {}, {}, {}, {}, 0); ApplyUpdateToRegion(GetThreadLocalState(ThreadLocal_ThreadIndex), &Job, UpdateBounds, DestChunk, Layer->Settings.Invert); DestChunk->FilledCount = MarkBoundaryVoxels_MakeExteriorFaces( DestChunk->Voxels, DestChunk->Dim, {{}}, DestChunk->Dim ); } @@ -2102,22 +2102,21 @@ ColorIndexToV3(u16 ColorIndex) link_internal void -DoColorPickerSection(engine_resources *Engine, window_layout *Window, v3 *HSVDest, u32 ElementIndex, u32 Slices, v2 WidgetDim, r32 CurrentValue) +DoColorPickerSection(engine_resources *Engine, window_layout *Window, v3 *HSVDest, u32 ElementIndex, u32 Slices, v2 WidgetDim) { UNPACK_ENGINE_RESOURCES(Engine); + v2 QuadDim = V2(WidgetDim.x/r32(Slices), WidgetDim.y); + v4 Padding = V4(0); + v3 HSV = *HSVDest; + + r32 CurrentValue = HSVDest->E[ElementIndex]; + ui_element_reference SaturationTable = PushTableStart(Ui); RangeIterator_t(u8, ColorIndex, Slices) { - /* v3 Color = GetColorData(u32(ColorIndex)); */ - - v2 QuadDim = V2(WidgetDim.x/r32(Slices), WidgetDim.y); - v4 Padding = V4(0); - v3 BorderColor = V3(1.0f); - r32 Value = r32(ColorIndex)/r32(Slices); - v3 HSV = *HSVDest; HSV.E[ElementIndex] = Value; v3 RGB = HSVtoRGB(HSV); @@ -2131,6 +2130,7 @@ DoColorPickerSection(engine_resources *Engine, window_layout *Window, v3 *HSVDes if (Selected || ButtonHover) { f32 BorderDim = 1.f; + v3 BorderColor = V3(1.0f); PushRelativeBorder(Ui, V2(-1.f,1.f)*QuadDim, BorderColor, V4(BorderDim)); } @@ -2149,7 +2149,7 @@ DoColorPickerSection(engine_resources *Engine, window_layout *Window, v3 *HSVDes } link_internal void -DoColorPicker(engine_resources *Engine, window_layout *Window, v3 *RGBDest, b32 ShowColorSwatch) +DoColorPicker(engine_resources *Engine, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch) { UNPACK_ENGINE_RESOURCES(Engine); @@ -2164,26 +2164,25 @@ DoColorPicker(engine_resources *Engine, window_layout *Window, v3 *RGBDest, b32 v2 ColorPickerSectionDim = V2(256, 30); - v3 HSV = RGBtoHSV(*RGBDest); + /* v3 HSV = *HSVDest; // NOTE(Jesse): Must copy so we don't stomp on the dest value */ - DoColorPickerSection(Engine, Window, &HSV, 0, HueSlices, ColorPickerSectionDim, RGBDest->h); - DoColorPickerSection(Engine, Window, &HSV, 1, SaturationSlices, ColorPickerSectionDim, RGBDest->s); - DoColorPickerSection(Engine, Window, &HSV, 2, ValueSlices, ColorPickerSectionDim, RGBDest->v); + DoColorPickerSection(Engine, Window, HSVDest, 0, HueSlices, ColorPickerSectionDim); + DoColorPickerSection(Engine, Window, HSVDest, 1, SaturationSlices, ColorPickerSectionDim); + DoColorPickerSection(Engine, Window, HSVDest, 2, ValueSlices, ColorPickerSectionDim); PushNewRow(Ui); - *RGBDest = HSVtoRGB(HSV); - + v3 RGB = HSVtoRGB(*HSVDest); if (ShowColorSwatch) { v2 QuadDim = V2(ColorPickerSectionDim.x, ColorPickerSectionDim.x); - ui_style Style = FlatUiStyle(*RGBDest); + ui_style Style = FlatUiStyle(RGB); PushUntexturedQuad(Ui, {}, QuadDim, zDepth_Text, &Style, {} ); PushNewRow(Ui); } - cs HSVColorString = FSz("HSV (%.2V3)", &HSV); - cs RGBColorString = FSz("RGB (%.2V3)", RGBDest); + cs HSVColorString = FSz("HSV (%.2V3)", HSVDest); + cs RGBColorString = FSz("RGB (%.2V3)", &RGB); PushColumn(Ui, HSVColorString ); PushNewRow(Ui); @@ -2195,13 +2194,13 @@ DoColorPicker(engine_resources *Engine, window_layout *Window, v3 *RGBDest, b32 } link_internal void -ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *RGBDest, b32 ShowColorSwatch /* = True */) +ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowColorSwatch /* = True */) { UNPACK_ENGINE_RESOURCES(Engine); if (window_layout *Window = ModalIsActive(Ui, ModalId)) { - DoColorPicker(Engine, Window, RGBDest, ShowColorSwatch); + DoColorPicker(Engine, Window, HSVDest, ShowColorSwatch); PushNewRow(Ui); diff --git a/src/engine/editor.h b/src/engine/editor.h index 541915e45..fa2242143 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -878,8 +878,9 @@ struct brush_settings poof(@version(3)) v3i NoiseBasisOffset; - /* v3 HSVColor = DEFAULT_HSV_COLOR; */ - v3 RGBColor = DEFAULT_RGB_COLOR; + // NOTE(Jesse): The color picker operates in HSV, so we need this to be HSV for now + v3 HSVColor = DEFAULT_HSV_COLOR; + /* v3 RGBColor = DEFAULT_RGB_COLOR; */ b8 Invert; }; @@ -906,7 +907,7 @@ struct brush_settings_2 v3i NoiseBasisOffset; - u16 Color = 1; poof(@custom_marshal(Live->RGBColor = MagicaVoxelDefaultPaletteToRGB(Stored->Color);)) // Default to white + u16 Color = 1; poof(@custom_marshal(Live->HSVColor = MagicaVoxelDefaultPaletteToHSV(Stored->Color);)) // Default to white b8 Invert; }; poof(are_equal(brush_settings)) @@ -933,7 +934,7 @@ struct brush_settings_1 v3i NoiseBasisOffset; - u16 Color = 1; poof(@custom_marshal(Live->RGBColor = MagicaVoxelDefaultPaletteToRGB(Stored->Color);)) // Default to white + u16 Color = 1; poof(@custom_marshal(Live->HSVColor = MagicaVoxelDefaultPaletteToHSV(Stored->Color);)) // Default to white }; struct brush_settings_0 @@ -954,7 +955,7 @@ struct brush_settings_0 // Used to inflate or contract the area affected by the brush. rect3i Offset; - u16 Color = 1; poof(@custom_marshal(Live->RGBColor = MagicaVoxelDefaultPaletteToRGB(Stored->Color);)) // Default to white + u16 Color = 1; poof(@custom_marshal(Live->HSVColor = MagicaVoxelDefaultPaletteToHSV(Stored->Color);)) // Default to white }; link_internal void From 56095e29843edbb85a2c4dcd689beec16c1f39bd Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 10 Sep 2024 09:45:08 -0700 Subject: [PATCH 002/421] Move `sturct world` to world.h --- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_standing_spot.h | 2 +- .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- generated/maybe_standing_spot.h | 2 +- src/engine/api.cpp | 6 +- src/engine/editor.cpp | 4 - src/engine/world.h | 143 ++++++++++++++++++ src/engine/world_chunk.h | 143 ------------------ 9 files changed, 151 insertions(+), 155 deletions(-) diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 20313c99f..5c241ebf4 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:523:0 +// src/engine/world_chunk.h:503:0 struct standing_spot_block { diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 9183be470..65cfd9545 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:566:0 +// src/engine/world_chunk.h:530:0 struct standing_spot_buffer { diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index e0dd90723..69f68636e 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:572:0 +// src/engine/world_chunk.h:536:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index f193f5d93..bfff53fda 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:569:0 +// src/engine/world_chunk.h:533:0 struct standing_spot_stream_chunk { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 1fed2462e..595587733 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:520:0 +// src/engine/world_chunk.h:500:0 struct maybe_standing_spot { diff --git a/src/engine/api.cpp b/src/engine/api.cpp index c0c1f47a7..67deb2696 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -78,7 +78,7 @@ Bonsai_FrameBegin(engine_resources *Resources) // NOTE(Jesse): Must come before we update the frame index becaues // CollectUnusedChunks picks the hashtable based on the frame index. // - CollectUnusedChunksAndClearCurrentTable(Resources, Resources->World->VisibleRegion); + /* CollectUnusedChunksAndClearCurrentTable(Resources, Resources->World->VisibleRegion); */ /* DEBUG_AssertWorldChunkHashtableIsEmpty(Resources, CurrentWorldHashtable(Resources)); */ @@ -86,11 +86,11 @@ Bonsai_FrameBegin(engine_resources *Resources) // sim pulls chunks out of the hashtable. // Resources->FrameIndex += 1; - Resources->World->ChunkHash = CurrentWorldHashtable(Resources); + /* Resources->World->ChunkHash = CurrentWorldHashtable(Resources); */ /* DEBUG_AssertWorldChunkHashtableIsEmpty(Resources, NextWorldHashtable(Resources)); */ - ComputeDrawListsAndQueueUnallocatedChunks(Resources); + /* ComputeDrawListsAndQueueUnallocatedChunks(Resources); */ /* DEBUG_AssertWorldChunkHashtableIsEmpty(Resources, NextWorldHashtable(Resources)); */ diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index f6e37bca5..ff92817c6 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2164,8 +2164,6 @@ DoColorPicker(engine_resources *Engine, window_layout *Window, v3 *HSVDest, b32 v2 ColorPickerSectionDim = V2(256, 30); - /* v3 HSV = *HSVDest; // NOTE(Jesse): Must copy so we don't stomp on the dest value */ - DoColorPickerSection(Engine, Window, HSVDest, 0, HueSlices, ColorPickerSectionDim); DoColorPickerSection(Engine, Window, HSVDest, 1, SaturationSlices, ColorPickerSectionDim); DoColorPickerSection(Engine, Window, HSVDest, 2, ValueSlices, ColorPickerSectionDim); @@ -2189,8 +2187,6 @@ DoColorPicker(engine_resources *Engine, window_layout *Window, v3 *HSVDest, b32 PushColumn(Ui, RGBColorString ); PushNewRow(Ui); - - /* DoEditorUi(Ui, &Window, &Editor->HSVColorSelection, CSz("HSV Color") ); */ } link_internal void diff --git a/src/engine/world.h b/src/engine/world.h index fda311707..571f51be5 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -4,3 +4,146 @@ link_internal world * GetWorld(); link_internal void GatherRangesOverlapping(world *World, rect3i SimSpaceAABB, world_chunk_ptr_buffer *ChunkBuffer, rect3i_buffer *ResultRanges); +struct world +{ + v3i Center; + v3i VisibleRegion; // The number of chunks in xyz we're going to update and render + + u32 HashSlotsUsed; + u32 HashSize; + world_chunk **ChunkHashMemory[2]; poof(@ui_skip) + world_chunk **ChunkHash; poof(@array_length(Element->HashSize)) + + + bonsai_futex ChunkFreelistFutex; poof(@ui_skip) + world_chunk ChunkFreelistSentinal; poof(@ui_skip) + s32 FreeChunkCount; + + v3i ChunkDim; poof(@ui_skip) + memory_arena *ChunkMemory; poof(@ui_skip) + world_flag Flags; poof(@ui_skip) +}; + +inline canonical_position +Canonicalize( world *World, canonical_position CP ) +{ + canonical_position Result = Canonicalize( World->ChunkDim, CP.Offset, CP.WorldP ); + return Result; +} + +// NOTE(Jesse): Technically, these should always be strictly less than the chunkdim, +// but because of float-ness we can actually hit directly on it. +inline b32 +IsCanonical( world *World, canonical_position CP ) +{ + b32 Result = CP.Offset <= V3(World->ChunkDim); + return Result; +} + +link_internal v3 +GetSimSpaceP(world *World, world_position P) +{ + v3i CenterToP = P - World->Center; + v3 Result = V3(CenterToP*World->ChunkDim); + return Result; +} + +link_internal v3 +GetSimSpaceP(world *World, canonical_position P) +{ + cp WorldCenter = Canonical_Position(V3(0), World->Center); + cp CenterToP = P - WorldCenter; + v3 Result = CenterToP.Offset + (CenterToP.WorldP*World->ChunkDim); + return Result; +} + +link_internal v3 +GetSimSpaceP(world *World, picked_voxel *P, picked_voxel_position Pos = PickedVoxel_FirstFilled) +{ + v3 Result = GetSimSpaceP(World, Canonical_Position(P, Pos)); + return Result; +} + +link_internal v3i +GetSimSpacePi(world *World, world_chunk *Chunk) +{ + world_position CenterToP = Chunk->WorldP - World->Center; + v3i Result = CenterToP*World->ChunkDim; + return Result; +} + +link_internal v3 +GetSimSpaceP(world *World, world_chunk *Chunk) +{ + v3 Result = V3(GetSimSpacePi(World, Chunk)); + return Result; +} + +link_internal rect3i +GetSimSpaceAABBi(world *World, world_chunk *Chunk) +{ + v3i SimSpaceMin = GetSimSpacePi(World, Chunk); + rect3i Result = Rect3iMinDim(SimSpaceMin, World->ChunkDim ); + return Result; +} + +link_internal aabb +GetSimSpaceAABB(world *World, world_chunk *Chunk) +{ + v3 SimSpaceMin = GetSimSpaceP(World, Chunk); + aabb Result = AABBMinDim(SimSpaceMin, V3(World->ChunkDim) ); + return Result; +} + +link_internal v3 +GetSimSpaceCenterP(world *World, standing_spot *Spot) +{ + v3 Result = GetSimSpaceP(World, Spot->P) + Global_StandingSpotHalfDim; + return Result; +} + +link_internal v3 +GetSimSpaceBaseP(world *World, standing_spot *Spot) +{ + v3 Result = GetSimSpaceP(World, Spot->P) + V3(Global_StandingSpotHalfDim.xy, 0.f); + return Result; +} + +link_internal cp +GetSpotMidpoint(world *World, standing_spot *Spot) +{ + cp Result = Canonical_Position(World->ChunkDim, Spot->P.Offset+Global_StandingSpotHalfDim, Spot->P.WorldP); + return Result; +} + +link_internal rect3i +GetVisibleRegionRect(world *World) +{ + world_position CenterP = World->Center; + chunk_dimension Radius = (World->VisibleRegion/2); + world_position Min = CenterP - Radius; + world_position Max = CenterP + Radius + 1; // Add one so we can pass to functions that expect an open-interval + + return RectMinMax(Min, Max); +} + +link_internal b32 +IsInsideVisibleRegion(world *World, v3i P) +{ + rect3i VRRect = GetVisibleRegionRect(World); + b32 Result = IsInside(P, VRRect); + return Result; +} + +inline voxel* +TryGetVoxel(world *World, cp P) +{ + voxel *Result = {}; + world_chunk *Chunk = GetWorldChunkFromHashtable(World, P.WorldP); + if (Chunk) + { + Result = TryGetVoxel(Chunk, V3i(P.Offset)); + } + return Result; +} + diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index abbf20fd3..5063d199a 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -491,26 +491,6 @@ enum world_flag /* WorldFlag_WorldCenterFollowsCameraTarget = (1 << 0), */ }; -struct world -{ - v3i Center; - v3i VisibleRegion; // The number of chunks in xyz we're going to update and render - - u32 HashSlotsUsed; - u32 HashSize; - world_chunk **ChunkHashMemory[2]; poof(@ui_skip) - world_chunk **ChunkHash; poof(@array_length(Element->HashSize)) - - - bonsai_futex ChunkFreelistFutex; poof(@ui_skip) - world_chunk ChunkFreelistSentinal; poof(@ui_skip) - s32 FreeChunkCount; - - v3i ChunkDim; poof(@ui_skip) - memory_arena *ChunkMemory; poof(@ui_skip) - world_flag Flags; poof(@ui_skip) -}; - struct standing_spot { b32 CanStand; @@ -539,22 +519,6 @@ Canonical_Position(picked_voxel *V, picked_voxel_position Pos = PickedVoxel_Firs return Result; } -inline canonical_position -Canonicalize( world *World, canonical_position CP ) -{ - canonical_position Result = Canonicalize( World->ChunkDim, CP.Offset, CP.WorldP ); - return Result; -} - -// NOTE(Jesse): Technically, these should always be strictly less than the chunkdim, -// but because of float-ness we can actually hit directly on it. -inline b32 -IsCanonical( world *World, canonical_position CP ) -{ - b32 Result = CP.Offset <= V3(World->ChunkDim); - return Result; -} - inline b32 IsCanonical( v3i WorldChunkDim, canonical_position CP ) { @@ -572,61 +536,6 @@ poof(generate_stream(standing_spot)) poof(generate_stream_compact(standing_spot)) #include -link_internal v3 -GetSimSpaceP(world *World, world_position P) -{ - v3i CenterToP = P - World->Center; - v3 Result = V3(CenterToP*World->ChunkDim); - return Result; -} - -link_internal v3 -GetSimSpaceP(world *World, canonical_position P) -{ - cp WorldCenter = Canonical_Position(V3(0), World->Center); - cp CenterToP = P - WorldCenter; - v3 Result = CenterToP.Offset + (CenterToP.WorldP*World->ChunkDim); - return Result; -} - -link_internal v3 -GetSimSpaceP(world *World, picked_voxel *P, picked_voxel_position Pos = PickedVoxel_FirstFilled) -{ - v3 Result = GetSimSpaceP(World, Canonical_Position(P, Pos)); - return Result; -} - -link_internal v3i -GetSimSpacePi(world *World, world_chunk *Chunk) -{ - world_position CenterToP = Chunk->WorldP - World->Center; - v3i Result = CenterToP*World->ChunkDim; - return Result; -} - -link_internal v3 -GetSimSpaceP(world *World, world_chunk *Chunk) -{ - v3 Result = V3(GetSimSpacePi(World, Chunk)); - return Result; -} - -link_internal rect3i -GetSimSpaceAABBi(world *World, world_chunk *Chunk) -{ - v3i SimSpaceMin = GetSimSpacePi(World, Chunk); - rect3i Result = Rect3iMinDim(SimSpaceMin, World->ChunkDim ); - return Result; -} - -link_internal aabb -GetSimSpaceAABB(world *World, world_chunk *Chunk) -{ - v3 SimSpaceMin = GetSimSpaceP(World, Chunk); - aabb Result = AABBMinDim(SimSpaceMin, V3(World->ChunkDim) ); - return Result; -} - inline bool IsRightChunkBoundary( chunk_dimension ChunkDim, int idx ) { @@ -668,27 +577,6 @@ global_variable v3i Global_ChunkApronMaxDim = V3i(1,1,3); /* CAssert(Global_ChunkApronDim.z == Global_ChunkApronMinDim.z + Global_ChunkApronMaxDim.z); */ -link_internal v3 -GetSimSpaceCenterP(world *World, standing_spot *Spot) -{ - v3 Result = GetSimSpaceP(World, Spot->P) + Global_StandingSpotHalfDim; - return Result; -} - -link_internal v3 -GetSimSpaceBaseP(world *World, standing_spot *Spot) -{ - v3 Result = GetSimSpaceP(World, Spot->P) + V3(Global_StandingSpotHalfDim.xy, 0.f); - return Result; -} - -link_internal cp -GetSpotMidpoint(world *World, standing_spot *Spot) -{ - cp Result = Canonical_Position(World->ChunkDim, Spot->P.Offset+Global_StandingSpotHalfDim, Spot->P.WorldP); - return Result; -} - struct mesh_freelist; link_internal void @@ -742,25 +630,6 @@ GetStandingSpotsWithinRadius_FilteredByStandable(world *World, canonical_positio /* link_internal untextured_3d_geometry_buffer * */ /* SetMesh(world_chunk *Chunk, world_chunk_mesh_bitfield MeshBit, mesh_freelist *MeshFreelist, memory_arena *PermMemory); */ -link_internal rect3i -GetVisibleRegionRect(world *World) -{ - world_position CenterP = World->Center; - chunk_dimension Radius = (World->VisibleRegion/2); - world_position Min = CenterP - Radius; - world_position Max = CenterP + Radius + 1; // Add one so we can pass to functions that expect an open-interval - - return RectMinMax(Min, Max); -} - -link_internal b32 -IsInsideVisibleRegion(world *World, v3i P) -{ - rect3i VRRect = GetVisibleRegionRect(World); - b32 Result = IsInside(P, VRRect); - return Result; -} - inline voxel* TryGetVoxel(world_chunk* Chunk, voxel_position VoxelP) { @@ -778,18 +647,6 @@ GetVoxel(world_chunk* Chunk, voxel_position VoxelP) return Result; } -inline voxel* -TryGetVoxel(world *World, cp P) -{ - voxel *Result = {}; - world_chunk *Chunk = GetWorldChunkFromHashtable(World, P.WorldP); - if (Chunk) - { - Result = TryGetVoxel(Chunk, V3i(P.Offset)); - } - return Result; -} - link_internal void MarshalMagicaVoxelEncodedColors(voxel *Src, voxel *Dest, v3i Dim) { From ed353e8fb7b2a7e2abbf77df2bae32ce140d630c Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Sep 2024 07:46:31 -0700 Subject: [PATCH 003/421] DEBUG COMMIT FOR REMEDY REPRO --- examples/transparency/remedy_repro.rdbg | Bin 0 -> 13378 bytes generated/are_equal_octree_node.h | 25 +++ generated/block_array_entity_ptr_688856411.h | 2 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 18 +-- generated/for_datatypes_0XxWqGSZ.h | 6 + generated/for_datatypes_fkubhsYl.h | 6 + generated/for_datatypes_kv3WBTai.h | 6 + generated/freelist_allocator_octree_node.h | 22 +++ generated/gen_constructor_voxel_lighting.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 95 +++++++++++ .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- ...e_string_table_world_chunk_mesh_bitfield.h | 2 +- ...rate_string_table_world_chunk_mesh_index.h | 2 +- generated/maybe_chunk_data.h | 2 +- generated/maybe_standing_spot.h | 2 +- .../string_and_value_tables_chunk_flag.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/api.cpp | 5 +- src/engine/debug.cpp | 11 ++ src/engine/resources.cpp | 4 + src/engine/world.cpp | 152 +++++++++++++++++- src/engine/world.h | 49 +++++- src/engine/world_chunk.cpp | 27 +++- src/engine/world_chunk.h | 4 +- 31 files changed, 415 insertions(+), 47 deletions(-) create mode 100644 examples/transparency/remedy_repro.rdbg create mode 100644 generated/are_equal_octree_node.h create mode 100644 generated/freelist_allocator_octree_node.h create mode 100644 generated/generate_stack_octree_node_ptr_0.h diff --git a/examples/transparency/remedy_repro.rdbg b/examples/transparency/remedy_repro.rdbg new file mode 100644 index 0000000000000000000000000000000000000000..10b9ade079eca2c6c866100b76544411c6fd5721 GIT binary patch literal 13378 zcmcgzS(7U_6}~Bo<(Uw8;gt#xr15Td!V;1|SW`t(sQ~3FA$QAG-{~#A%-rF3@dNpe zTJ2VQW+b&8GF2XXJl4_C(OJH;`14Ob`t~`x*W6>mg* ze#PpBM|Z4&_$>VcR2ZoR+69oZ}K^nZO?I9#7v|j z6M56WWxb0)=HKSAj>|5RH!Cn%MvjO{k(LM(>W>Ax zhw!|Orfgx65C*~&*?9&(O^3Q;U$>$a3(`TMeuHL|L{V8wl5jH zQ2&ZWZB@ew-4|~}s$-m1-9U0*YDerJvtyE`&$#P(7;abd?QFs3oB4JX&Q~)A|Gn5Q zw%ctWKk(gz?t^5ANN|s9A*OK^U)q;jf@YcW2L3nOLqV2{?l}xHe%J}g(0bNMJ z9-!%>64e=9{L{YqAWo|;Ew*bwrPXrI=Ck>39j?QWAlNNBv<&3Z&f7?+bEhKm%~A$s|4;v{@s@&$K8z}l;hF{)}9d6 z(pD)7WlP)TW(B!jU|TeZ_E^;mV)AuwVPqA@$MM zbP&yhz@If?X-DpNX|bJCqyzP6LxT^{BrkdWE$IqFe@olNDqJ8-_Ky=?W)B`5CUtov z!<8u#P~hK9k!r?EcF$8l;-(-Gp9HH&vKu=QLn%~2NFcL~8Wo%u-YYxbbmS3i_XdcB z+&hpCCuZ=g;n_L1%C$GcUD-=HRZktXo&dd_4vD;PJP19-S1RU>;^^_BOz_L!pOFbz!$5P)Yz>)!aSy(^dWM9-T38 z*st@*Dm~Rzq?Tf~!=TOesOv|XYb@<+QPfunHz*qcpra!1XlfX4=_1RZJHG|nsna+R zfw6lR(f2yACwbBk0}gXE)?ae(s`U((EYQ|Sa#Z-cz8G!mk0#78gM}XY(ulgL_p0SU zTlu5Qa~5Vy{LvL z?Q%VG8d=c|cdtDRcySbkEW(S>&oz7lXgPwop}^17U2jNBsev^iq$7l|L(;IJuBn2c zBZ^ui0Ve2*1zguEhRb5)(>?7o*nU#0wuD}$B`^P|AtiF zG^q*s%|(kHlPsO#PMF9UNSs7NvoPB9m-F>(t|xNV%ayZ`Xt^{!{zCHdk40Top4RwB zJiSIb{A8~Y@xEKok2&aqI2xJWMN>`STy$XT5bgB&d=omc@xVp@iugcnjoSZttlDa2 zfvDkcq@{eUlStuB?-LC7uL}sOYMtcA!fB^H-!VFi5JZRO$HJV@6CU41Uq1W7*T9Bz zkRD&2g@u@V*zCgPav9EX!46DeJz3WSh9jV963}wY0t~eD3C|rf1Y`#=e6kiALIXL^ zfs?Q7lCs$6xczZCfdLD2xXYKg)b^z6D1^WR>45PAp(mkM0S|bmyhv(vCorNHNQZ7r zJ#k+N^&XLU!eqtc1Y?DSk-E`FJ@aH>ByZxL^B3FQ8slBN-G(&Lzjmjw$~VK!Znas2 z^Kd<5i_La3+ie#+;^z9;XvncEi%=?qz*GQUIefe2(v|8s3j~7>jvbQ02$C_Lp}g$v zM8=dl6r?q|r{$>mzQom`qRF;l{Nh8q6R?xPXdZG*|31t3SZX!3v=mEy^6Bm1VsYec z+MqF3A?;5!nf_#?PyXXUV9dL;G>GJxAZEJyK>piTxS)vw5Rch_3yxKhVbHe+p=r`I z$gePwnDCtK))>fJ%vYEL{>*m|`)qa?E_T}xhB(0tdr43PC-l+HZfYlf5R%^~81_4+ zoaTJ4H*TFms@a1}suSShxisY8o9;}wEfI@U(b0c!Y_w9og*&1jdiJlnDjI}m-@!Us z`dvJ}pl>tKAKyEC@MC&D|9l^>-p1pZZ&^@Ld3c+?WpPonHs*SseCtAO@B-m?pAg2J z(0PV%5~-g*A$3SOX5;%|I%=MqUk0(U^;1nt=b%(zpTx^E$1=WnF^QC7v;XxSyr65c z{m`AN$LMljSV6?z>VAHp*S+w`;cZ&;Lp(I%Wy2S4eqy|Pp&&mp{$*bAJI4E?`%(&{ WzLUe4aSbCnhD^HashSlotsUsed), - CSz("HashSlotsUsed"), + Cast(octree_node*,&Element->Root), + CSz("Root"), Params ); @@ -70,13 +70,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - PushNewRow(Ui); - + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->HashSize), - CSz("HashSize"), + Cast(memory_arena*,&Element->OctreeMemory), + CSz("OctreeMemory"), Params ); @@ -86,13 +85,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - PushNewRow(Ui); - + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_chunk*, Element->ChunkHash), - CSz("ChunkHash"), + Cast(octree_node_freelist*,&Element->OctreeNodeFreelist), + CSz("OctreeNodeFreelist"), Params ); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 8de192134..baef5bafc 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -184,6 +184,7 @@ + struct render_to_texture_async_params; @@ -630,6 +631,11 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 74609cd29..ddd6ea254 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -184,6 +184,7 @@ + render_to_texture_async_params render_to_texture_async_params; @@ -620,6 +621,11 @@ render_to_texture_async_params render_to_texture_async_params; + + + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index c9bfbc533..5d818d85b 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -184,6 +184,7 @@ + type_render_to_texture_async_params, @@ -620,6 +621,11 @@ type_render_to_texture_async_params, + + + + + diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h new file mode 100644 index 000000000..c8512713f --- /dev/null +++ b/generated/freelist_allocator_octree_node.h @@ -0,0 +1,22 @@ +// src/engine/world.h:28:0 + +struct octree_node_freelist +{ + octree_node *Freelist; + memory_arena *Memory; +}; + +link_internal octree_node * +GetOrAllocate(octree_node_freelist *Freelist) +{ + octree_node *Result = {}; + NotImplemented; + return Result; +} + +link_internal void +Free(octree_node_freelist *Freelist, octree_node *Element) +{ + NotImplemented; +} + diff --git a/generated/gen_constructor_voxel_lighting.h b/generated/gen_constructor_voxel_lighting.h index 240522733..f9c7390b4 100644 --- a/generated/gen_constructor_voxel_lighting.h +++ b/generated/gen_constructor_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:135:0 +// src/engine/world_chunk.h:133:0 link_internal voxel_lighting VoxelLighting( u8 Emission ) diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h new file mode 100644 index 000000000..a94d1b4f1 --- /dev/null +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -0,0 +1,95 @@ +// src/engine/world.h:25:0 + +struct octree_node_ptr_stack +{ + octree_node_ptr *Start; + umm At; + umm End; + +}; + +link_internal octree_node_ptr_stack +OctreeNodePtrStack(umm ElementCount, memory_arena* Memory) +{ + octree_node_ptr *Start = (octree_node_ptr*)PushStruct(Memory, sizeof(octree_node_ptr)*ElementCount, 1, 0); + octree_node_ptr_stack Result = { + .Start = Start, + .End = ElementCount, + .At = 0, + }; + return Result; +} + +link_internal umm +CurrentCount(octree_node_ptr_stack *Cursor) +{ + umm Result = Cursor->At; + return Result; +} + +link_internal s32 +LastIndex(octree_node_ptr_stack *Cursor) +{ + s32 Result = s32(Cursor->At)-1; + return Result; +} + +link_internal octree_node_ptr +Get(octree_node_ptr_stack *Cursor, umm ElementIndex) +{ + Assert(ElementIndex < Cursor->At); + octree_node_ptr Result = Cursor->Start[ElementIndex]; + return Result; +} + +link_internal void +Set(octree_node_ptr_stack *Cursor, umm ElementIndex, octree_node_ptr Element) +{ + umm CurrentElementCount = Cursor->At; + Assert (ElementIndex <= CurrentElementCount); + + Cursor->Start[ElementIndex] = Element; + if (ElementIndex == CurrentElementCount) + { + Cursor->At++; + } +} + +link_internal octree_node_ptr * +Push(octree_node_ptr_stack *Cursor, octree_node_ptr Element) +{ + Assert( Cursor->At < Cursor->End ); + octree_node_ptr *Result = Cursor->Start+Cursor->At; + Cursor->Start[Cursor->At++] = Element; + return Result; +} + +link_internal octree_node_ptr +Pop(octree_node_ptr_stack *Cursor) +{ + Assert( Cursor->At > 0 ); + octree_node_ptr Result = Cursor->Start[LastIndex(Cursor)]; + Cursor->At--; + return Result; +} + +link_internal b32 +RemoveUnordered(octree_node_ptr_stack *Cursor, octree_node_ptr Query) +{ + b32 Result = False; + StackIterator(ElementIndex, Cursor) + { + octree_node_ptr Element = Get(Cursor, ElementIndex); + if (AreEqual(Element, Query)) + { + b32 IsLastIndex = LastIndex(Cursor) == s32(ElementIndex); + octree_node_ptr Tmp = Pop(Cursor); + + if (IsLastIndex) { Assert(AreEqual(Tmp, Query)); } + else { Set(Cursor, ElementIndex, Tmp); } + Result = True; + } + } + return Result; +} + diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 69f68636e..434084228 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:536:0 +// src/engine/world_chunk.h:534:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 8dad50541..78cd0fa69 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3026:0 +// src/engine/world_chunk.cpp:3043:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index bfff53fda..de2846ba5 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:533:0 +// src/engine/world_chunk.h:531:0 struct standing_spot_stream_chunk { diff --git a/generated/generate_string_table_world_chunk_mesh_bitfield.h b/generated/generate_string_table_world_chunk_mesh_bitfield.h index e40848c71..d736d40e5 100644 --- a/generated/generate_string_table_world_chunk_mesh_bitfield.h +++ b/generated/generate_string_table_world_chunk_mesh_bitfield.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:237:0 +// src/engine/world_chunk.h:235:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_bitfield Type) diff --git a/generated/generate_string_table_world_chunk_mesh_index.h b/generated/generate_string_table_world_chunk_mesh_index.h index 3045b2d8d..c230cbfed 100644 --- a/generated/generate_string_table_world_chunk_mesh_index.h +++ b/generated/generate_string_table_world_chunk_mesh_index.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:240:0 +// src/engine/world_chunk.h:238:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_index Type) diff --git a/generated/maybe_chunk_data.h b/generated/maybe_chunk_data.h index f8718b562..b85d9b339 100644 --- a/generated/maybe_chunk_data.h +++ b/generated/maybe_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:201:0 +// src/engine/world_chunk.h:199:0 struct maybe_chunk_data { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 595587733..0fbc6b8b6 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:500:0 +// src/engine/world_chunk.h:498:0 struct maybe_standing_spot { diff --git a/generated/string_and_value_tables_chunk_flag.h b/generated/string_and_value_tables_chunk_flag.h index eb56e1f0e..70d1ba9b3 100644 --- a/generated/string_and_value_tables_chunk_flag.h +++ b/generated/string_and_value_tables_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:85:0 +// src/engine/world_chunk.h:83:0 link_internal counted_string ToStringPrefixless(chunk_flag Type) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index b6191b752..2b66c5abe 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2057:0 +// src/engine/world_chunk.cpp:2074:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 1c1b64267..6efc84cb5 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2060:0 +// src/engine/world_chunk.cpp:2077:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 67deb2696..9a7a00ba7 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -71,7 +71,7 @@ Bonsai_FrameBegin(engine_resources *Resources) // NOTE(Jesse): This gets cleared before CollectUnusedChunks because that's // the thing that is populating the next hashtable - Resources->World->HashSlotsUsed = 0; + /* Resources->World->HashSlotsUsed = 0; */ /* DEBUG_AssertWorldChunkHashtableIsEmpty(Resources, NextWorldHashtable(Resources)); */ @@ -86,6 +86,9 @@ Bonsai_FrameBegin(engine_resources *Resources) // sim pulls chunks out of the hashtable. // Resources->FrameIndex += 1; + + MaintainWorldOctree(Resources); + /* Resources->World->ChunkHash = CurrentWorldHashtable(Resources); */ /* DEBUG_AssertWorldChunkHashtableIsEmpty(Resources, NextWorldHashtable(Resources)); */ diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index c0425f7f8..f584a3bdf 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -14,7 +14,10 @@ DoLevelWindow(engine_resources *Engine) { u8_cursor_block_array OutputStream = BeginSerialization(); + u32 ChunkCount = 0; + NotImplemented; +#if 0 RangeIterator(HashIndex, s32(World->HashSize)) { if (World->ChunkHash[HashIndex]) @@ -22,6 +25,7 @@ DoLevelWindow(engine_resources *Engine) ++ChunkCount; } } +#endif level_header Header = {}; Header.ChunkCount = ChunkCount; @@ -45,6 +49,9 @@ DoLevelWindow(engine_resources *Engine) Serialize(&OutputStream, &Header); u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; + + NotImplemented; +#if 0 RangeIterator(HashIndex, s32(World->HashSize)) { if (world_chunk *Chunk = World->ChunkHash[HashIndex]) @@ -52,6 +59,7 @@ DoLevelWindow(engine_resources *Engine) SerializeChunk(Chunk, &OutputStream); } } +#endif Ensure(Serialize(&OutputStream, &Delimeter)); @@ -193,6 +201,8 @@ DoLevelWindow(engine_resources *Engine) } + NotImplemented; +#if 0 RangeIterator_t(u32, ChunkIndex, World->HashSize) { if (world_chunk *Chunk = World->ChunkHash[ChunkIndex]) @@ -206,6 +216,7 @@ DoLevelWindow(engine_resources *Engine) QueueChunkForMeshRebuild(&GetEngineResources()->Stdlib.Plat.LowPriority, Chunk, Flags); } } +#endif #endif diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 6ac047d3a..ea79cda0a 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -486,6 +486,9 @@ SoftResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag CancelAllWorkQueueJobs(Engine); + // TODO(Jesse): Free octree here. + NotImplemented; +#if 0 u32 ChunksFreed = 0; RangeIterator(HashIndex, s32(World->HashSize)) { @@ -497,6 +500,7 @@ SoftResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag ++ChunksFreed; } } +#endif RangeIterator_t(u32, EntityIndex, TOTAL_ENTITY_COUNT) { diff --git a/src/engine/world.cpp b/src/engine/world.cpp index f60b20e1e..b901be1bb 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -1,5 +1,5 @@ link_internal world * -AllocateWorld(world* World, world_position Center, voxel_position WorldChunkDim, chunk_dimension VisibleRegion) +AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) { Clear(World); @@ -7,14 +7,17 @@ AllocateWorld(world* World, world_position Center, voxel_position WorldChunkDim, World->ChunkMemory = WorldChunkMemory; DEBUG_REGISTER_ARENA(World->ChunkMemory, 0); - World->HashSize = (u32)(Volume(VisibleRegion)*4); + /* World->HashSize = (u32)(Volume(VisibleRegion)*4); */ /* World->HashSize = WorldHashSize; */ - World->ChunkHashMemory[0] = Allocate(world_chunk*, WorldChunkMemory, World->HashSize ); - World->ChunkHashMemory[1] = Allocate(world_chunk*, WorldChunkMemory, World->HashSize ); + /* World->ChunkHashMemory[0] = Allocate(world_chunk*, WorldChunkMemory, World->HashSize ); */ + /* World->ChunkHashMemory[1] = Allocate(world_chunk*, WorldChunkMemory, World->HashSize ); */ - World->ChunkHash = World->ChunkHashMemory[0]; + /* World->ChunkHash = World->ChunkHashMemory[0]; */ /* World->FreeChunks = Allocate(world_chunk*, WorldChunkMemory, FREELIST_SIZE ); */ + + World->Root.Chunk.Dim = VisibleRegion; + World->ChunkDim = WorldChunkDim; World->VisibleRegion = VisibleRegion; World->Center = Center; @@ -170,3 +173,142 @@ GatherVoxelsOverlappingArea(engine_resources *Engine, rect3cp Rect, memory_arena return Result; } +link_internal b32 +ContainsCamera(octree_node *Node, camera *Camera) +{ + b32 Result = {}; + NotImplemented; + return Result; +} + +link_internal b32 +OctreeNodeNeedsToSplit(world *World, octree_node *Node, camera *Camera) +{ + Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); + + b32 Result = Node->Chunk.Dim > World->ChunkDim && Node->LodLevel > 0 && ContainsCamera(Node, Camera); + return Result; +} + +link_internal b32 +OctreeChildrenNeedToMerge(world *World, octree_node *Node, camera *Camera) +{ + Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); + + b32 Result = ContainsCamera(Node, Camera) == False; + return Result; +} + +link_internal u32 +SplitOctreeNode(world *World, work_queue *Queue, octree_node *Node, memory_arena *Memory) +{ + Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); + Assert(Node->Flags == OctreeNodeFlag_Leaf); + + RangeIterator_t(umm, ChildIndex, ArrayCount(Node->Children)) + { + Node->Children[ChildIndex] = Allocate(octree_node, Memory, 1); + } + + RangeIterator(Index, 8) + { + Assert(Node->Children[Index] == 0); + + Node->Children[Index] = GetOrAllocate(&World->OctreeNodeFreelist); + world_chunk *Chunk = &Node->Children[Index]->Chunk; + + AllocateWorldChunk({}, World->ChunkDim, World->ChunkMemory); + + Chunk->Dim = Node->Chunk.Dim = World->ChunkDim; + Assert(Chunk->Dim % World->ChunkDim == V3i(0)); + + QueueChunkForInit(Queue, Chunk, MeshBit_Lod0); + /* Node->Children[Index]->Chunk = Chunk; */ + } + + return 8; +} + +link_internal void +CheckedDeallocateChildNode(engine_resources *Engine, octree_node *Node) +{ + Assert(Node->Flags == OctreeNodeFlag_Leaf); + Free(&Engine->World->OctreeNodeFreelist, Node); +} + +link_internal u32 +MergeOctreeChildren(engine_resources *Engine, octree_node *Node) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); + Assert(Node->Flags == OctreeNodeFlag_Transit); + + u32 Result = False; + + v3i Dim = Node->Chunk.Dim; + + CheckedDeallocateChildNode(Engine, Node->Children[0]); + CheckedDeallocateChildNode(Engine, Node->Children[1]); + CheckedDeallocateChildNode(Engine, Node->Children[2]); + CheckedDeallocateChildNode(Engine, Node->Children[3]); + CheckedDeallocateChildNode(Engine, Node->Children[4]); + CheckedDeallocateChildNode(Engine, Node->Children[5]); + CheckedDeallocateChildNode(Engine, Node->Children[6]); + CheckedDeallocateChildNode(Engine, Node->Children[7]); + + QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); + + return 1; +} + + + +// TODO(Jesse): Definitely compute this from the number of worker threads available on the system +#define MAX_WORLD_CHUNKS_QUEUED_PER_FRAME (16) +link_internal void +MaintainWorldOctree(engine_resources *Engine) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + SleepMs(1000); + + b32 Continue = True; + u32 ChunksQueued = 0; + + octree_node_ptr_stack Stack = OctreeNodePtrStack(1024, &World->OctreeMemory); + Push(&Stack, &World->Root); + + while (CurrentCount(&Stack) && (ChunksQueued < MAX_WORLD_CHUNKS_QUEUED_PER_FRAME) ) + { + octree_node *Current = Pop(&Stack); + + if (OctreeNodeNeedsToSplit(World, Current, Camera)) + { + ChunksQueued += SplitOctreeNode(World, &Plat->LowPriority, Current, &World->OctreeMemory); + } + + if (OctreeChildrenNeedToMerge(World, Current, Camera)) + { + ChunksQueued += MergeOctreeChildren(Engine, Current); + } + + if (Current->Flags == OctreeNodeFlag_Transit) + { + if (Current->Children[0]) { Push(&Stack, Current->Children[0]); } + if (Current->Children[1]) { Push(&Stack, Current->Children[1]); } + if (Current->Children[2]) { Push(&Stack, Current->Children[2]); } + if (Current->Children[3]) { Push(&Stack, Current->Children[3]); } + if (Current->Children[4]) { Push(&Stack, Current->Children[4]); } + if (Current->Children[5]) { Push(&Stack, Current->Children[5]); } + if (Current->Children[6]) { Push(&Stack, Current->Children[6]); } + if (Current->Children[7]) { Push(&Stack, Current->Children[7]); } + } + } +} + + + + + + diff --git a/src/engine/world.h b/src/engine/world.h index 571f51be5..ec278ebd8 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -1,18 +1,46 @@ +enum octree_node_flags +{ + OctreeNodeFlag_Undefined, -link_internal world * GetWorld(); + OctreeNodeFlag_Transit, + OctreeNodeFlag_Leaf, +}; -link_internal void -GatherRangesOverlapping(world *World, rect3i SimSpaceAABB, world_chunk_ptr_buffer *ChunkBuffer, rect3i_buffer *ResultRanges); +struct octree_node +{ + octree_node_flags Flags; + + u32 LodLevel; // Multiply by Chunk->Dim to get the world-space dimensions of the chunk + + // TODO(Jesse): Maybe make this a pointer ..? + world_chunk Chunk; + + octree_node *Children[8]; +}; + +typedef octree_node* octree_node_ptr; + +poof(are_equal(octree_node)) +#include +poof(generate_stack(octree_node_ptr, {})) +#include + +poof(freelist_allocator(octree_node)) +#include struct world { v3i Center; v3i VisibleRegion; // The number of chunks in xyz we're going to update and render - u32 HashSlotsUsed; - u32 HashSize; - world_chunk **ChunkHashMemory[2]; poof(@ui_skip) - world_chunk **ChunkHash; poof(@array_length(Element->HashSize)) + /* u32 HashSlotsUsed; */ + /* u32 HashSize; */ + /* world_chunk **ChunkHashMemory[2]; poof(@ui_skip) */ + /* world_chunk **ChunkHash; poof(@array_length(Element->HashSize)) */ + + octree_node Root; + memory_arena OctreeMemory; + octree_node_freelist OctreeNodeFreelist; bonsai_futex ChunkFreelistFutex; poof(@ui_skip) @@ -24,6 +52,8 @@ struct world world_flag Flags; poof(@ui_skip) }; + + inline canonical_position Canonicalize( world *World, canonical_position CP ) { @@ -147,3 +177,8 @@ TryGetVoxel(world *World, cp P) return Result; } + +link_internal world * GetWorld(); + +link_internal void +GatherRangesOverlapping(world *World, rect3i SimSpaceAABB, world_chunk_ptr_buffer *ChunkBuffer, rect3i_buffer *ResultRanges); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index cc94ad3f2..db4bafcf4 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -116,6 +116,9 @@ GetWorldChunkHash(world_position P, chunk_dimension VisibleRegion, u32 WorldHash link_internal b32 InsertChunkIntoWorld(world_chunk **WorldChunkHash, world_chunk *Chunk, chunk_dimension VisibleRegion, u32 WorldHashSize) { + NotImplemented; + return {}; +#if 0 /* TIMED_FUNCTION(); */ GetWorld()->HashSlotsUsed += 1; @@ -172,12 +175,15 @@ InsertChunkIntoWorld(world_chunk **WorldChunkHash, world_chunk *Chunk, chunk_dim *Current = Chunk; return Result; +#endif } link_internal b32 InsertChunkIntoWorld(world *World, world_chunk *Chunk) { - b32 Result = InsertChunkIntoWorld(World->ChunkHash, Chunk, World->VisibleRegion, World->HashSize); + NotImplemented; + /* b32 Result = InsertChunkIntoWorld(World->ChunkHash, Chunk, World->VisibleRegion, World->HashSize); */ + b32 Result = {}; return Result; } @@ -341,6 +347,9 @@ GetWorldChunkFromHashtable(world *World, world_position P) { /* TIMED_FUNCTION(); */ // This makes things much slower + NotImplemented; + return {}; +#if 0 u32 HashIndex = GetWorldChunkHash(P, World->VisibleRegion, World->HashSize); u32 StartingHashIndex = HashIndex; @@ -375,21 +384,26 @@ GetWorldChunkFromHashtable(world *World, world_position P) } return Result; +#endif } link_internal world_chunk** CurrentWorldHashtable(engine_resources *Engine) { - u32 Index = Engine->FrameIndex % 2; - world_chunk **Hashtable = Engine->World->ChunkHashMemory[Index]; + /* u32 Index = Engine->FrameIndex % 2; */ + /* world_chunk **Hashtable = Engine->World->ChunkHashMemory[Index]; */ + NotImplemented; + world_chunk **Hashtable = {}; return Hashtable; } link_internal world_chunk** NextWorldHashtable(engine_resources *Engine) { - u32 Index = (Engine->FrameIndex+1) % 2; - world_chunk **Hashtable = Engine->World->ChunkHashMemory[Index]; + /* u32 Index = (Engine->FrameIndex+1) % 2; */ + /* world_chunk **Hashtable = Engine->World->ChunkHashMemory[Index]; */ + NotImplemented; + world_chunk **Hashtable = {}; return Hashtable; } @@ -397,7 +411,9 @@ link_internal void CollectUnusedChunksAndClearCurrentTable(engine_resources *Engine, chunk_dimension VisibleRegion) { TIMED_FUNCTION(); + NotImplemented; +#if 0 UNPACK_ENGINE_RESOURCES(Engine); #if 1 @@ -484,6 +500,7 @@ CollectUnusedChunksAndClearCurrentTable(engine_resources *Engine, chunk_dimensio #endif return; +#endif } #if 0 diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 5063d199a..313cbf7fb 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -1,7 +1,5 @@ #define INVALID_WORLD_CHUNK_POSITION (V3i(s32_MAX, s32_MAX, s32_MAX)) -struct world; -struct world_chunk; struct heap_allocator; struct entity; @@ -355,8 +353,8 @@ struct world_chunk poof(@version(1)) v3i WorldP; s32 FilledCount; poof(@no_serialize) - b32 DrawBoundingVoxels; poof(@no_serialize) + b32 DrawBoundingVoxels; poof(@no_serialize) s32 PointsToLeaveRemaining; poof(@no_serialize) u32 TriCount; poof(@no_serialize) s32 EdgeBoundaryVoxelCount; poof(@no_serialize) From feda8bb3a6a88138a4f1f4bdf721817e406cc259 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Sep 2024 12:17:55 -0700 Subject: [PATCH 004/421] Octree nominally initializing and queueing chunks for update --- examples/blank_project/game_constants.h | 2 +- external/bonsai_stdlib | 2 +- generated/are_equal_octree_node.h | 2 +- generated/are_equal_rect3cp.h | 2 +- ...on_pattern_199741702_161749140_632272777.h | 2 +- ..._iteration_pattern_275071431_101859599_0.h | 2 +- ..._iteration_pattern_275071431_785723886_0.h | 2 +- ..._iteration_pattern_846291950_267608728_0.h | 2 +- generated/freelist_allocator_octree_node.h | 20 ++- generated/gen_rect_helpers_rect2_v2.h | 10 +- generated/gen_rect_helpers_rect3_v3.h | 10 +- generated/gen_rect_helpers_rect3i_v3i.h | 10 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- generated/maybe_v3.h | 2 +- generated/maybe_v3i.h | 2 +- .../rectalinear_iteration_pattern_398799212.h | 2 +- .../rectalinear_iteration_pattern_416827956.h | 2 +- .../rectalinear_iteration_pattern_428632106.h | 2 +- .../rectalinear_iteration_pattern_530902269.h | 2 +- .../rectalinear_iteration_pattern_583358156.h | 2 +- .../rectalinear_iteration_pattern_631222419.h | 2 +- .../rectalinear_iteration_pattern_643608995.h | 2 +- .../rectalinear_iteration_pattern_812652930.h | 2 +- .../rectalinear_iteration_pattern_920026661.h | 2 +- .../rectalinear_iteration_pattern_992879728.h | 2 +- .../rectalinear_iteration_pattern_99934950.h | 2 +- jesse.make.sh | 4 +- src/engine/canonical_position.h | 22 ++- src/engine/entity.cpp | 16 +- src/engine/render.cpp | 3 + src/engine/world.cpp | 167 ++++++++++++++---- src/engine/world.h | 21 ++- src/engine/world_update.cpp | 63 ------- 33 files changed, 239 insertions(+), 151 deletions(-) diff --git a/examples/blank_project/game_constants.h b/examples/blank_project/game_constants.h index d83dba30a..74309b25c 100644 --- a/examples/blank_project/game_constants.h +++ b/examples/blank_project/game_constants.h @@ -7,7 +7,7 @@ global_variable chunk_dimension WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); #else global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(8, 8, 4); +g_VisibleRegion = Chunk_Dimension(8, 8, 8); global_variable chunk_dimension WORLD_CHUNK_DIM = Chunk_Dimension(64, 64, 64); diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index b69b0e15b..0bb9e8257 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit b69b0e15b11360d2ac35d50f040048817b1e1853 +Subproject commit 0bb9e8257f7e214cc86364314c6311820e21cef1 diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index 6b8152460..99fb4124d 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:23:0 +// src/engine/world.h:27:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/are_equal_rect3cp.h b/generated/are_equal_rect3cp.h index 352897f98..14e4a3526 100644 --- a/generated/are_equal_rect3cp.h +++ b/generated/are_equal_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/canonical_position.h:239:0 +// src/engine/canonical_position.h:243:0 link_internal b32 AreEqual(rect3cp *Thing1, rect3cp *Thing2) diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index 7ff156aa7..5317bd211 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:620:0 +// src/engine/world_update.cpp:557:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h index c4650a042..7dbe6b429 100644 --- a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:860:0 +// src/engine/world_update.cpp:797:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h index 6d60505be..1fe18d8a9 100644 --- a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:844:0 +// src/engine/world_update.cpp:781:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h index 2de880a70..2a03b9c21 100644 --- a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h +++ b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:724:0 +// src/engine/world_update.cpp:661:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index c8512713f..aa66fd237 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,22 +1,32 @@ -// src/engine/world.h:28:0 +// src/engine/world.h:32:0 struct octree_node_freelist { - octree_node *Freelist; + octree_node *First; memory_arena *Memory; }; link_internal octree_node * GetOrAllocate(octree_node_freelist *Freelist) { - octree_node *Result = {}; - NotImplemented; + octree_node *Result = Freelist->First; + + if (Result) + { + Freelist->First = Result->Next; + } + else + { + Result = Allocate( octree_node, Freelist->Memory, 1 ); + } + return Result; } link_internal void Free(octree_node_freelist *Freelist, octree_node *Element) { - NotImplemented; + Element->Next = Freelist->First; + Freelist->First = Element; } diff --git a/generated/gen_rect_helpers_rect2_v2.h b/generated/gen_rect_helpers_rect2_v2.h index 0d2330f80..53c6d995f 100644 --- a/generated/gen_rect_helpers_rect2_v2.h +++ b/generated/gen_rect_helpers_rect2_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/rect.h:129:0 +// external/bonsai_stdlib/src/rect.h:137:0 link_internal rect2 RectMinMax(v2 Min, v2 Max) @@ -53,4 +53,12 @@ IsInside(v2 P, rect2 Rect) return Result; } +// TODO(Jesse)(duplicate): make Contains primal and get rid of IsInside ..? +link_internal b32 +Contains(rect2 Rect, v2 P) +{ + b32 Result = IsInside(P, Rect); + return Result; +} + diff --git a/generated/gen_rect_helpers_rect3_v3.h b/generated/gen_rect_helpers_rect3_v3.h index 8582f5106..308b6e159 100644 --- a/generated/gen_rect_helpers_rect3_v3.h +++ b/generated/gen_rect_helpers_rect3_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/rect.h:133:0 +// external/bonsai_stdlib/src/rect.h:141:0 link_internal rect3 RectMinMax(v3 Min, v3 Max) @@ -53,4 +53,12 @@ IsInside(v3 P, rect3 Rect) return Result; } +// TODO(Jesse)(duplicate): make Contains primal and get rid of IsInside ..? +link_internal b32 +Contains(rect3 Rect, v3 P) +{ + b32 Result = IsInside(P, Rect); + return Result; +} + diff --git a/generated/gen_rect_helpers_rect3i_v3i.h b/generated/gen_rect_helpers_rect3i_v3i.h index 20d2de808..5814a5cfe 100644 --- a/generated/gen_rect_helpers_rect3i_v3i.h +++ b/generated/gen_rect_helpers_rect3i_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/rect.h:136:0 +// external/bonsai_stdlib/src/rect.h:144:0 link_internal rect3i RectMinMax(v3i Min, v3i Max) @@ -53,4 +53,12 @@ IsInside(v3i P, rect3i Rect) return Result; } +// TODO(Jesse)(duplicate): make Contains primal and get rid of IsInside ..? +link_internal b32 +Contains(rect3i Rect, v3i P) +{ + b32 Result = IsInside(P, Rect); + return Result; +} + diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index a94d1b4f1..bcc690cc9 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:25:0 +// src/engine/world.h:29:0 struct octree_node_ptr_stack { diff --git a/generated/maybe_v3.h b/generated/maybe_v3.h index 147ba5fa2..27faef6ba 100644 --- a/generated/maybe_v3.h +++ b/generated/maybe_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1118:0 +// external/bonsai_stdlib/src/vector.h:1124:0 struct maybe_v3 { diff --git a/generated/maybe_v3i.h b/generated/maybe_v3i.h index d3a397631..4c1b3d97e 100644 --- a/generated/maybe_v3i.h +++ b/generated/maybe_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1120:0 +// external/bonsai_stdlib/src/vector.h:1126:0 struct maybe_v3i { diff --git a/generated/rectalinear_iteration_pattern_398799212.h b/generated/rectalinear_iteration_pattern_398799212.h index 7b3122148..56352b376 100644 --- a/generated/rectalinear_iteration_pattern_398799212.h +++ b/generated/rectalinear_iteration_pattern_398799212.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:580:0 +// src/engine/world_update.cpp:517:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_416827956.h b/generated/rectalinear_iteration_pattern_416827956.h index f209ab38d..cc754ace4 100644 --- a/generated/rectalinear_iteration_pattern_416827956.h +++ b/generated/rectalinear_iteration_pattern_416827956.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:751:0 +// src/engine/world_update.cpp:688:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_428632106.h b/generated/rectalinear_iteration_pattern_428632106.h index d87ba0cdf..64656a702 100644 --- a/generated/rectalinear_iteration_pattern_428632106.h +++ b/generated/rectalinear_iteration_pattern_428632106.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:902:0 +// src/engine/world_update.cpp:839:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_530902269.h b/generated/rectalinear_iteration_pattern_530902269.h index 97e6de798..6549b9a82 100644 --- a/generated/rectalinear_iteration_pattern_530902269.h +++ b/generated/rectalinear_iteration_pattern_530902269.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:699:0 +// src/engine/world_update.cpp:636:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_583358156.h b/generated/rectalinear_iteration_pattern_583358156.h index fedc9869b..208c2faac 100644 --- a/generated/rectalinear_iteration_pattern_583358156.h +++ b/generated/rectalinear_iteration_pattern_583358156.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:876:0 +// src/engine/world_update.cpp:813:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_631222419.h b/generated/rectalinear_iteration_pattern_631222419.h index 62f7a278f..025f03107 100644 --- a/generated/rectalinear_iteration_pattern_631222419.h +++ b/generated/rectalinear_iteration_pattern_631222419.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:792:0 +// src/engine/world_update.cpp:729:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_643608995.h b/generated/rectalinear_iteration_pattern_643608995.h index d99cbaea6..7cc16dfef 100644 --- a/generated/rectalinear_iteration_pattern_643608995.h +++ b/generated/rectalinear_iteration_pattern_643608995.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:680:0 +// src/engine/world_update.cpp:617:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index 210867881..33fe7bfdc 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:652:0 +// src/engine/world_update.cpp:589:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_920026661.h b/generated/rectalinear_iteration_pattern_920026661.h index f45e49756..196fe2475 100644 --- a/generated/rectalinear_iteration_pattern_920026661.h +++ b/generated/rectalinear_iteration_pattern_920026661.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:600:0 +// src/engine/world_update.cpp:537:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_992879728.h b/generated/rectalinear_iteration_pattern_992879728.h index cfcfc5648..8f7296e70 100644 --- a/generated/rectalinear_iteration_pattern_992879728.h +++ b/generated/rectalinear_iteration_pattern_992879728.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:813:0 +// src/engine/world_update.cpp:750:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_99934950.h b/generated/rectalinear_iteration_pattern_99934950.h index 3c702c01f..e9930979a 100644 --- a/generated/rectalinear_iteration_pattern_99934950.h +++ b/generated/rectalinear_iteration_pattern_99934950.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:759:0 +// src/engine/world_update.cpp:696:0 DimIterator(x, y, z, UpdateDim) { diff --git a/jesse.make.sh b/jesse.make.sh index 66df8c0b6..e8fdce1b2 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,9 +11,9 @@ ./make.sh $OPT \ BuildExecutables \ - BuildSingleExample examples/transparency \ - BuildSingleExample examples/project_and_level_picker \ BuildSingleExample examples/blank_project \ + # BuildSingleExample examples/transparency \ + # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/tools/voxel_synthesis_rule_baker \ # BuildSingleExample examples/turn_based \ # BuildSingleExample examples/terrain_gen \ diff --git a/src/engine/canonical_position.h b/src/engine/canonical_position.h index 0523dd716..7bf00e3f5 100644 --- a/src/engine/canonical_position.h +++ b/src/engine/canonical_position.h @@ -202,28 +202,32 @@ operator-(canonical_position P1, canonical_position P2) inline b32 operator>(cp P1, cp P2) { - b32 Result = (P1.WorldP > P2.WorldP) && (P1.Offset > P2.Offset); + b32 Result = (P1.WorldP > P2.WorldP) || + (P1.WorldP == P2.WorldP && (P1.Offset > P2.Offset)); return Result; } inline b32 operator<(cp P1, cp P2) { - b32 Result = (P1.WorldP < P2.WorldP) && (P1.Offset < P2.Offset); + b32 Result = (P1.WorldP < P2.WorldP) || + (P1.WorldP == P2.WorldP && (P1.Offset < P2.Offset)); return Result; } inline b32 operator>=(cp P1, cp P2) { - b32 Result = (P1.WorldP >= P2.WorldP) && (P1.Offset >= P2.Offset); + b32 Result = (P1.WorldP >= P2.WorldP) || + (P1.WorldP == P2.WorldP && (P1.Offset >= P2.Offset)); return Result; } inline b32 operator<=(cp P1, cp P2) { - b32 Result = (P1.WorldP <= P2.WorldP) && (P1.Offset <= P2.Offset); + b32 Result = (P1.WorldP <= P2.WorldP) || + (P1.WorldP == P2.WorldP && (P1.Offset <= P2.Offset)); return Result; } @@ -255,6 +259,8 @@ Rect3CP(rect3 *Rect) return Result; } +/* poof(gen_rect_helpers(rect3cp, cp)) */ + link_internal rect3cp RectMinMax(cp Min, cp Max) { @@ -289,6 +295,14 @@ IsInside(cp P, rect3cp Rect) return Result; } +link_internal b32 +Contains(rect3cp Rect, cp P) +{ + b32 Result = (P >= Rect.Min && P < Rect.Max); + return Result; +} + + link_internal cp Max(cp P0, cp P1) { diff --git a/src/engine/entity.cpp b/src/engine/entity.cpp index 7f39d9c92..03af0537f 100644 --- a/src/engine/entity.cpp +++ b/src/engine/entity.cpp @@ -415,14 +415,16 @@ SpawnEntity(entity *Entity) { /* canonical_position CP = Canonicalize(World->ChunkDim, V3(x, y, z), InitialP->WorldP); */ cp CP = Canonical_Position(V3(0), V3i(x,y,z)); - world_chunk *Chunk = GetWorldChunkFromHashtable( World, CP.WorldP ); - if (Chunk == 0) + /* world_chunk *Chunk = GetWorldChunkFromHashtable( World, CP.WorldP ); */ + octree_node *Node = GetWorldChunkFromOctree( World, CP.WorldP ); + if (Node == 0) { - Chunk = AllocateAndInsertChunk(World, CP.WorldP); - if (Chunk) - { - QueueChunkForInit(&GetEngineResources()->Stdlib.Plat.HighPriority, Chunk, MeshBit_Lod0); - } + NotImplemented; + /* Chunk = AllocateAndInsertChunk(World, CP.WorldP); */ + /* if (Chunk) */ + /* { */ + /* QueueChunkForInit(&GetEngineResources()->Stdlib.Plat.HighPriority, Chunk, MeshBit_Lod0); */ + /* } */ } } } diff --git a/src/engine/render.cpp b/src/engine/render.cpp index 66b9f80b4..d92de6070 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1450,6 +1450,8 @@ DrawEntitiesToGBuffer( v2i ApplicationResolution, link_internal void ComputeDrawListsAndQueueUnallocatedChunks(engine_resources *Engine) { + NotImplemented; +#if 0 TIMED_FUNCTION(); UNPACK_ENGINE_RESOURCES(Engine); @@ -1504,6 +1506,7 @@ ComputeDrawListsAndQueueUnallocatedChunks(engine_resources *Engine) { InvalidCodePath(); } } } +#endif } link_internal void diff --git a/src/engine/world.cpp b/src/engine/world.cpp index b901be1bb..3e51eebe1 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -16,7 +16,18 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) /* World->FreeChunks = Allocate(world_chunk*, WorldChunkMemory, FREELIST_SIZE ); */ - World->Root.Chunk.Dim = VisibleRegion; + Assert(VisibleRegion.x == VisibleRegion.y); + Assert(VisibleRegion.y == VisibleRegion.z); + + Assert(WorldChunkDim.x == WorldChunkDim.y); + Assert(WorldChunkDim.y == WorldChunkDim.z); + + + World->Root.Type = OctreeNodeType_Leaf; + World->Root.DimInChunks = VisibleRegion; + AllocateWorldChunk(&World->Root.Chunk, {}, WorldChunkDim, World->ChunkMemory); + + World->OctreeNodeFreelist.Memory = &World->OctreeMemory; World->ChunkDim = WorldChunkDim; World->VisibleRegion = VisibleRegion; @@ -173,20 +184,51 @@ GatherVoxelsOverlappingArea(engine_resources *Engine, rect3cp Rect, memory_arena return Result; } + + + + + + + + + + + + +// +// Octree implementation +// + +link_internal rect3cp +GetBoundingBox(world *World, octree_node *Node) +{ + cp Min = Canonical_Position(Node->Chunk.WorldP, {}); + cp Max = Canonicalize(World, Canonical_Position(V3(Node->DimInChunks), Node->Chunk.WorldP)); + + rect3cp Rect = RectMinMax(Min, Max); + return Rect; +} + link_internal b32 -ContainsCamera(octree_node *Node, camera *Camera) +ContainsCamera(world *World, octree_node *Node, camera *Camera) { - b32 Result = {}; - NotImplemented; + rect3cp Rect = GetBoundingBox(World, Node); + b32 Result = Contains(Rect, Camera->CurrentP); return Result; } link_internal b32 OctreeNodeNeedsToSplit(world *World, octree_node *Node, camera *Camera) { - Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); + Assert(Node->Chunk.Dim == World->ChunkDim); + Assert(Node->Type); + Assert(Node->DimInChunks >= V3i(1)); + + b32 Result = Node->DimInChunks > V3i(1); + Result &= (Node->Chunk.Flags & Chunk_Queued) == 0; + Result &= ContainsCamera(World, Node, Camera); - b32 Result = Node->Chunk.Dim > World->ChunkDim && Node->LodLevel > 0 && ContainsCamera(Node, Camera); return Result; } @@ -195,44 +237,57 @@ OctreeChildrenNeedToMerge(world *World, octree_node *Node, camera *Camera) { Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); - b32 Result = ContainsCamera(Node, Camera) == False; + b32 Result = Node->Type == OctreeNodeType_Transit; + Result &= ContainsCamera(World, Node, Camera) == False; return Result; } + +link_internal void +InitOctreeNodeAndQueueChunkForInit(world *World, work_queue *Queue, octree_node *Node, v3i WorldP, v3i DimInChunks) +{ + Node->Type = OctreeNodeType_Leaf; + Node->DimInChunks = DimInChunks; + + world_chunk *Chunk = &Node->Chunk; + AllocateWorldChunk(Chunk, WorldP, World->ChunkDim, World->ChunkMemory); + QueueChunkForInit(Queue, Chunk, MeshBit_Lod0); +} + link_internal u32 -SplitOctreeNode(world *World, work_queue *Queue, octree_node *Node, memory_arena *Memory) +SplitOctreeNode(world *World, work_queue *Queue, octree_node *Parent, memory_arena *Memory) { - Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); - Assert(Node->Flags == OctreeNodeFlag_Leaf); + Assert(Parent->Chunk.Dim % World->ChunkDim == V3i(0)); + Assert(Parent->Type == OctreeNodeType_Leaf); + Parent->Type = OctreeNodeType_Transit; - RangeIterator_t(umm, ChildIndex, ArrayCount(Node->Children)) - { - Node->Children[ChildIndex] = Allocate(octree_node, Memory, 1); - } + v3i ChildDimInChunks = Parent->DimInChunks / 2; - RangeIterator(Index, 8) + RangeIterator(Index, s32(ArrayCount(Parent->Children))) { - Assert(Node->Children[Index] == 0); - - Node->Children[Index] = GetOrAllocate(&World->OctreeNodeFreelist); - world_chunk *Chunk = &Node->Children[Index]->Chunk; + Assert(Parent->Children[Index] == 0); - AllocateWorldChunk({}, World->ChunkDim, World->ChunkMemory); + // NOTE(Jesse): This is used as a mask so we can drop out dimensions that are on the min edge + // when computing RelWorldP + v3i P = PositionFromIndex(Index, V3i(2,2,2)); + v3i RelWorldP = P * ChildDimInChunks; - Chunk->Dim = Node->Chunk.Dim = World->ChunkDim; - Assert(Chunk->Dim % World->ChunkDim == V3i(0)); + octree_node *Child = GetOrAllocate(&World->OctreeNodeFreelist); + Parent->Children[Index] = Child; - QueueChunkForInit(Queue, Chunk, MeshBit_Lod0); - /* Node->Children[Index]->Chunk = Chunk; */ + InitOctreeNodeAndQueueChunkForInit(World, Queue, Child, Parent->Chunk.WorldP + RelWorldP, ChildDimInChunks); } return 8; } link_internal void -CheckedDeallocateChildNode(engine_resources *Engine, octree_node *Node) +CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) { - Assert(Node->Flags == OctreeNodeFlag_Leaf); + octree_node *Node = *Bucket; + *Bucket = 0; + + Assert(Node->Type == OctreeNodeType_Leaf); Free(&Engine->World->OctreeNodeFreelist, Node); } @@ -242,20 +297,20 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) UNPACK_ENGINE_RESOURCES(Engine); Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); - Assert(Node->Flags == OctreeNodeFlag_Transit); + Assert(Node->Type == OctreeNodeType_Transit); u32 Result = False; v3i Dim = Node->Chunk.Dim; - CheckedDeallocateChildNode(Engine, Node->Children[0]); - CheckedDeallocateChildNode(Engine, Node->Children[1]); - CheckedDeallocateChildNode(Engine, Node->Children[2]); - CheckedDeallocateChildNode(Engine, Node->Children[3]); - CheckedDeallocateChildNode(Engine, Node->Children[4]); - CheckedDeallocateChildNode(Engine, Node->Children[5]); - CheckedDeallocateChildNode(Engine, Node->Children[6]); - CheckedDeallocateChildNode(Engine, Node->Children[7]); + CheckedDeallocateChildNode(Engine, Node->Children+0); + CheckedDeallocateChildNode(Engine, Node->Children+1); + CheckedDeallocateChildNode(Engine, Node->Children+2); + CheckedDeallocateChildNode(Engine, Node->Children+3); + CheckedDeallocateChildNode(Engine, Node->Children+4); + CheckedDeallocateChildNode(Engine, Node->Children+5); + CheckedDeallocateChildNode(Engine, Node->Children+6); + CheckedDeallocateChildNode(Engine, Node->Children+7); QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); @@ -271,8 +326,6 @@ MaintainWorldOctree(engine_resources *Engine) { UNPACK_ENGINE_RESOURCES(Engine); - SleepMs(1000); - b32 Continue = True; u32 ChunksQueued = 0; @@ -293,7 +346,6 @@ MaintainWorldOctree(engine_resources *Engine) ChunksQueued += MergeOctreeChildren(Engine, Current); } - if (Current->Flags == OctreeNodeFlag_Transit) { if (Current->Children[0]) { Push(&Stack, Current->Children[0]); } if (Current->Children[1]) { Push(&Stack, Current->Children[1]); } @@ -308,6 +360,45 @@ MaintainWorldOctree(engine_resources *Engine) } +link_internal octree_node * +GetWorldChunkFromOctree(world *World, v3i QueryP) +{ + octree_node *Result = {}; + octree_node *Current = &World->Root; + + b32 Done = False; + while (Done == False) + { + rect3cp Box = GetBoundingBox(World, Current); + if (Contains(Box, Canonical_Position(V3(0), QueryP))) + { + v3i CurrentToQuery = QueryP - Current->Chunk.WorldP; + v3i Cell = CurrentToQuery / Current->DimInChunks; + Assert(Cell < V3i(2)); + + s32 Index = GetIndex(Cell, V3i(2)); Assert(Index < 8); + + if (Current->Type == OctreeNodeType_Transit) + { + Current = Current->Children[Index]; + } + else + { + Assert (Current->Type == OctreeNodeType_Leaf); + Result = Current; + Done = True; + } + + } + else + { + Done = True; + } + + } + + return Result; +} diff --git a/src/engine/world.h b/src/engine/world.h index ec278ebd8..e791cc487 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -1,21 +1,25 @@ -enum octree_node_flags +enum octree_node_type { - OctreeNodeFlag_Undefined, + OctreeNodeType_Undefined, - OctreeNodeFlag_Transit, - OctreeNodeFlag_Leaf, + OctreeNodeType_Transit, + OctreeNodeType_Leaf, }; struct octree_node { - octree_node_flags Flags; + octree_node_type Type; - u32 LodLevel; // Multiply by Chunk->Dim to get the world-space dimensions of the chunk + // This is the world-space dimension of the node, in chunks + v3i DimInChunks; // TODO(Jesse): Maybe make this a pointer ..? world_chunk Chunk; - octree_node *Children[8]; + union { + octree_node *Next; // NOTE(Jesse): Freelist Next + octree_node *Children[8]; + }; }; typedef octree_node* octree_node_ptr; @@ -182,3 +186,6 @@ link_internal world * GetWorld(); link_internal void GatherRangesOverlapping(world *World, rect3i SimSpaceAABB, world_chunk_ptr_buffer *ChunkBuffer, rect3i_buffer *ResultRanges); + +link_internal octree_node * +GetWorldChunkFromOctree(world *World, v3i QueryP); diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index e49195512..4ac03e74a 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -89,69 +89,6 @@ WorldUpdateThread_Main(void *ThreadStartupParams) return Result; } -link_internal void -BlitAssetIntoWorld(engine_resources *Engine, asset *Asset, cp Origin) -{ - world *World = Engine->World; - - Assert(Asset->LoadState == AssetLoadState_Loaded); - - world_chunk SrcChunk = {}; - chunk_dimension ModelDim = {}; - switch (Asset->Type) - { - InvalidCase(AssetType_Undefined); - - case AssetType_Models: - { - Assert(Asset->Models.Count > 0); - chunk_data *VoxData = Asset->Models.Start[0].Vox.ChunkData; - - ModelDim = Asset->Models.Start[0].Dim; - - SrcChunk = { - .Flags = VoxData->Flags, - .Dim = VoxData->Dim, - .Voxels = VoxData->Voxels, - }; - - } break; - - case AssetType_WorldChunk: - { - SrcChunk = Asset->Chunk; - ModelDim = Asset->Chunk.Dim; - } break; - } - - // TODO(Jesse): Need to account for model offset in its chunk here. - chunk_dimension ChunkCounts = ChunkCountForDim(ModelDim + Origin.Offset, World->ChunkDim); - - DebugLine("%d %d %d", ChunkCounts.x, ChunkCounts.y, ChunkCounts.z); - - DimIterator(xChunk, yChunk, zChunk, ChunkCounts) - { - v3i SrcWorldP = V3i(xChunk, yChunk, zChunk); - - v3i DestWorldP = Origin.WorldP + SrcWorldP; - world_chunk *DestChunk = GetWorldChunkFromHashtable(World, DestWorldP); - if (DestChunk) - { - Assert(DestChunk->Flags & Chunk_VoxelsInitialized); - - v3i SrcVoxelsOffset = (SrcWorldP*World->ChunkDim) - V3i(Origin.Offset); - - MergeChunksOffset(&SrcChunk, DestChunk, SrcVoxelsOffset); - - // NOTE(Jesse): We have to either call MarkBoundaryVoxels_??? here or somehow infer - // what the face values are in the Merge routine - NotImplemented; - - QueueChunkForMeshRebuild(&Engine->Stdlib.Plat.LowPriority, DestChunk); - } - } -} - link_internal void QueueWorldUpdateForRegion( engine_resources *Engine, world_edit_mode Mode, From 09180d12c4e44519f1874f480f795a92f880022f Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Sep 2024 13:00:47 -0700 Subject: [PATCH 005/421] Octree generation & traversal nominally working --- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_octree_node.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- .../default_marshal_layered_brush_editor_0.h | 2 +- .../default_marshal_layered_brush_editor_1.h | 2 +- .../default_marshal_layered_brush_editor_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 5 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 3 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...i_for_compound_type_layered_brush_editor.h | 5 +- ...editor_ui_for_compound_type_level_editor.h | 3 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 5 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 115 ++++++++++++++++++ ...tor_ui_for_compound_type_octree_node_ptr.h | 114 +++++++++++++++++ .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 4 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- .../do_editor_ui_for_compound_type_rect3.h | 2 +- .../do_editor_ui_for_compound_type_rect3cp.h | 2 +- .../do_editor_ui_for_compound_type_rect3i.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 4 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 3 +- ...or_ui_for_compound_type_world_edit_brush.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...editor_ui_for_radio_enum_world_edit_mode.h | 2 +- ..._for_radio_enum_world_edit_mode_modifier.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/freelist_allocator_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- .../string_and_value_tables_world_edit_mode.h | 2 +- ...nd_value_tables_world_edit_mode_modifier.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ..._value_tables_world_update_op_shape_type.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/editor.cpp | 9 +- src/engine/editor.h | 8 +- src/engine/entity.cpp | 91 +++++++++++++- src/engine/world.cpp | 88 ++++++++------ src/engine/world.h | 7 +- src/engine/world_chunk.cpp | 19 ++- 135 files changed, 548 insertions(+), 173 deletions(-) create mode 100644 generated/do_editor_ui_for_compound_type_octree_node.h create mode 100644 generated/do_editor_ui_for_compound_type_octree_node_ptr.h diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 0e7c3378c..319c84f97 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:913:0 +// src/engine/editor.h:919:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index 99fb4124d..dc7657f16 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:27:0 +// src/engine/world.h:28:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 08090b018..5876a06d9 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:657:0 +// src/engine/editor.h:663:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 39241abdd..82b4a5127 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:518:0 +// src/engine/editor.h:524:0 struct asset_thumbnail_block { diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 64706e18b..3bd5ddda6 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:978:0 +// src/engine/editor.h:984:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index 260a13d1d..cb23a5563 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:971:0 +// src/engine/editor.h:977:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index 765fc8b38..b96178f06 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:964:0 +// src/engine/editor.h:970:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_layered_brush_editor_0.h b/generated/default_marshal_layered_brush_editor_0.h index b7d31bfa7..c129c95bc 100644 --- a/generated/default_marshal_layered_brush_editor_0.h +++ b/generated/default_marshal_layered_brush_editor_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1076:0 +// src/engine/editor.h:1082:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_layered_brush_editor_1.h b/generated/default_marshal_layered_brush_editor_1.h index 39478d442..1f4a473e8 100644 --- a/generated/default_marshal_layered_brush_editor_1.h +++ b/generated/default_marshal_layered_brush_editor_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1069:0 +// src/engine/editor.h:1075:0 RangeIterator(Index, (256)) { diff --git a/generated/default_marshal_layered_brush_editor_2.h b/generated/default_marshal_layered_brush_editor_2.h index ae92cb1a5..51035a7c4 100644 --- a/generated/default_marshal_layered_brush_editor_2.h +++ b/generated/default_marshal_layered_brush_editor_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1062:0 +// src/engine/editor.h:1068:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 4ec612773..bebba3026 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:842:0 +// src/engine/editor.h:848:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index ddfeee3a3..8371bb72c 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:216:0 +// src/engine/editor.cpp:215:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 333841fff..4341b7938 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:313:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 029589c19..f3c5445c4 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:305:0 +// src/engine/editor.cpp:310:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 44371d81e..a266ccb0a 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:335:0 +// src/engine/editor.cpp:340:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 74eb8a5e6..1aee43be8 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:222:0 +// src/engine/editor.cpp:221:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 9bb7e3baa..a15af38d6 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:153:0 +// src/engine/editor.cpp:154:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 185d80401..2d3c0e0b0 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:344:0 +// src/engine/editor.cpp:349:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 047c6e24f..32cdb7e90 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:108:0 +// src/engine/editor.cpp:109:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 9b462e349..320874adb 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:329:0 +// src/engine/editor.cpp:334:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 782ad1b9e..96d5e2c76 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:252:0 +// src/engine/editor.cpp:251:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 982a1e3b5..e48a5b30a 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:338:0 +// src/engine/editor.cpp:343:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index dd2acd392..eba149c13 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:316:0 +// src/engine/editor.cpp:321:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 68351bedd..be330e635 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:149:0 +// src/engine/editor.cpp:150:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -334,6 +334,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name RangeIterator(ArrayIndex, (128)) { DoEditorUi(Ui, Window, Element->Frames+ArrayIndex, FSz("Frames[%d]", ArrayIndex), Params); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); @@ -382,6 +383,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name RangeIterator(ArrayIndex, (1024)) { DoEditorUi(Ui, Window, Element->RegisteredMemoryArenas+ArrayIndex, FSz("RegisteredMemoryArenas[%d]", ArrayIndex), Params); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); @@ -398,6 +400,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name RangeIterator(ArrayIndex, (4096)) { DoEditorUi(Ui, Window, Element->TrackedDrawCalls+ArrayIndex, FSz("TrackedDrawCalls[%d]", ArrayIndex), Params); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index bef647892..ccb57ffdd 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:419:0 +// src/engine/editor.cpp:424:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index b113db3bd..1a931bdd8 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:446:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 1e7dafaf5..ebb879efa 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:437:0 +// src/engine/editor.cpp:442:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 2e7e69ca9..e50d0cf67 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:291:0 +// src/engine/editor.cpp:290:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index c97bd6f61..273eb6dc4 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:288:0 +// src/engine/editor.cpp:287:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 2cc0709bd..48663d4ab 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:319:0 +// src/engine/editor.cpp:324:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 561f92b11..10b0ee870 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:276:0 +// src/engine/editor.cpp:275:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 119d18605..800a6e3b0 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:326:0 +// src/engine/editor.cpp:331:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 8c835dfcf..c8afd6cf7 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:407:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index fce7a6223..48b7965fd 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:401:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 356df9acc..648d25bcb 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:258:0 +// src/engine/editor.cpp:257:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index e820ba9c6..21108ea02 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:261:0 +// src/engine/editor.cpp:260:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index f036303c4..8c3eea0d6 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:410:0 +// src/engine/editor.cpp:415:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -361,6 +361,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u RangeIterator(ArrayIndex, 2) { DoEditorUi(Ui, Window, Element->GpuBuffers+ArrayIndex, FSz("GpuBuffers[%d]", ArrayIndex), Params); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 87fd3a714..ec36fde41 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:434:0 +// src/engine/editor.cpp:439:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 0207b7906..8141ba07a 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:142:0 +// src/engine/editor.cpp:143:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 90c6d4130..b19638ba1 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:139:0 +// src/engine/editor.cpp:140:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 2e83aae56..fad73af5c 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:213:0 +// src/engine/editor.cpp:212:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush_editor.h b/generated/do_editor_ui_for_compound_type_layered_brush_editor.h index cc75c5c69..1a9610af7 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush_editor.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:347:0 +// src/engine/editor.cpp:352:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -33,6 +33,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush_editor *Element RangeIterator(ArrayIndex, (256) + 1) { DoEditorUi(Ui, Window, Element->NameBuf+ArrayIndex, FSz("NameBuf[%d]", ArrayIndex), Params); + PushNewRow(Ui); } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); @@ -66,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush_editor *Element RangeIterator(ArrayIndex, 16) { DoEditorUi(Ui, Window, Element->Layers+ArrayIndex, FSz("Layers[%d]", ArrayIndex), Params); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); @@ -82,6 +84,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush_editor *Element RangeIterator(ArrayIndex, 16) { DoEditorUi(Ui, Window, Element->LayerPreviews+ArrayIndex, FSz("LayerPreviews[%d]", ArrayIndex), Params); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index c704a619a..6cd7f7f26 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:425:0 +// src/engine/editor.cpp:430:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -391,6 +391,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam RangeIterator(ArrayIndex, 512) { DoEditorUi(Ui, Window, Element->NewAssetFromSelectionFilename+ArrayIndex, FSz("NewAssetFromSelectionFilename[%d]", ArrayIndex), Params); + PushNewRow(Ui); } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 93f7bf0b4..6dc6e485f 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:404:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index e179411fd..47d451022 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:192:0 +// src/engine/editor.cpp:191:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 48e1670ad..902dfe9de 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:264:0 +// src/engine/editor.cpp:263:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -49,6 +49,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, RangeIterator(ArrayIndex, MeshIndex_Count) { DoEditorUi(Ui, Window, Element->GpuBufferHandles+ArrayIndex, FSz("GpuBufferHandles[%d]", ArrayIndex), Params); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); @@ -65,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, RangeIterator(ArrayIndex, MeshIndex_Count) { DoEditorUi(Ui, Window, Element->E+ArrayIndex, FSz("E[%d]", ArrayIndex), Params); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); @@ -81,6 +83,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, RangeIterator(ArrayIndex, MeshIndex_Count) { DoEditorUi(Ui, Window, Element->Locks+ArrayIndex, FSz("Locks[%d]", ArrayIndex), Params); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 358f14709..25b421e5a 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:267:0 +// src/engine/editor.cpp:266:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index d33fa4754..53bbc1e19 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:341:0 +// src/engine/editor.cpp:346:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h new file mode 100644 index 000000000..babab4a50 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -0,0 +1,115 @@ +// src/engine/editor.cpp:300:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle octree_node", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node_type*,&Element->Type), + CSz("Type"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*,&Element->DimInChunks), + CSz("DimInChunks"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_chunk*,&Element->Chunk), + CSz("Chunk"), + Params + ); + + + + + + + + + if (ToggleButton(Ui, CSz("v Children[8]"), CSz("> Children[8]"), UiId(Window, "toggle octree_node octree_node Children", Element->Children), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 8) + { +if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[ArrayIndex], CSz("Child"), Params);}; + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node*, Element->Next), + CSz("Next"), + Params + ); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_octree_node_ptr.h b/generated/do_editor_ui_for_compound_type_octree_node_ptr.h new file mode 100644 index 000000000..5ced76578 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_octree_node_ptr.h @@ -0,0 +1,114 @@ +// src/engine/editor.cpp:303:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node_ptr *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle octree_node_ptr", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node_type*,&Element->Type), + CSz("Type"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*,&Element->DimInChunks), + CSz("DimInChunks"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_chunk*,&Element->Chunk), + CSz("Chunk"), + Params + ); + + + + + + + + + if (ToggleButton(Ui, CSz("v Children[8]"), CSz("> Children[8]"), UiId(Window, "toggle octree_node_ptr octree_node Children", Element->Children), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 8) + { + DoEditorUi(Ui, Window, Element->Children+ArrayIndex, FSz("Children[%d]", ArrayIndex), Params); + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node*, Element->Next), + CSz("Next"), + Params + ); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index edfb30b39..80be568a8 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:207:0 +// src/engine/editor.cpp:206:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index bbf437e30..5cdcafe3e 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:210:0 +// src/engine/editor.cpp:209:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -363,6 +363,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs RangeIterator(ArrayIndex, 6) { DoEditorUi(Ui, Window, Element->PackedHSVColors+ArrayIndex, FSz("PackedHSVColors[%d]", ArrayIndex), Params); + PushNewRow(Ui); } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); @@ -380,6 +381,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs RangeIterator(ArrayIndex, (4096)) { DoEditorUi(Ui, Window, Element->Particles+ArrayIndex, FSz("Particles[%d]", ArrayIndex), Params); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 33febf5b5..9c6012c81 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:94:0 +// src/engine/editor.cpp:95:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 2cc151ee9..741f58982 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:198:0 +// src/engine/editor.cpp:197:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 88ee35034..6c9f20acb 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:323:0 +// src/engine/editor.cpp:328:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 38c895136..ad79e4b43 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:145:0 +// src/engine/editor.cpp:146:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index d51491290..eb184e98d 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:201:0 +// src/engine/editor.cpp:200:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index 45916a3df..25c2adf50 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:509:0 +// src/engine/editor.h:515:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index c1ff81ddd..af9660061 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:515:0 +// src/engine/editor.h:521:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 938458d43..6bfc2ac4a 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:512:0 +// src/engine/editor.h:518:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 5d1a53bdc..962ae54a4 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:395:0 +// src/engine/editor.cpp:400:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 00c0a16dc..4b4c4f061 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:413:0 +// src/engine/editor.cpp:418:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index ccd6643e7..2c9861b36 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:195:0 +// src/engine/editor.cpp:194:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 7228ebdea..ea2b994ab 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:398:0 +// src/engine/editor.cpp:403:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -169,6 +169,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name RangeIterator(ArrayIndex, 64) { DoEditorUi(Ui, Window, Element->MinimizedWindowBuffer+ArrayIndex, FSz("MinimizedWindowBuffer[%d]", ArrayIndex), Params); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); @@ -363,6 +364,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name RangeIterator(ArrayIndex, 128) { DoEditorUi(Ui, Window, Element->DebugColors+ArrayIndex, FSz("DebugColors[%d]", ArrayIndex), Params); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index fca20aa40..06a17d439 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:392:0 +// src/engine/editor.cpp:397:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 51abf148d..fb4822413 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:106:0 +// src/engine/editor.cpp:107:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 135db4b0c..1a95ca586 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:332:0 +// src/engine/editor.cpp:337:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 1c71a3b1e..90f0b05dd 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:416:0 +// src/engine/editor.cpp:421:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index a9d61dd61..50f70ddf6 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:115:0 +// src/engine/editor.cpp:116:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 1d75ae5d0..4752980bb 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:118:0 +// src/engine/editor.cpp:119:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 1455da6e2..3d1a41d0d 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:225:0 +// src/engine/editor.cpp:224:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 160f9a583..c4243459e 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:219:0 +// src/engine/editor.cpp:218:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 386ea0d09..fff999516 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:97:0 +// src/engine/editor.cpp:98:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 754827d0e..b49b3934f 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:255:0 +// src/engine/editor.cpp:254:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 3ab6c01ac..d5d41a24b 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:246:0 +// src/engine/editor.cpp:245:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 6b115127a..dd9c4fb71 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:249:0 +// src/engine/editor.cpp:248:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 4d21555df..d1544aa2f 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:91:0 +// src/engine/editor.cpp:92:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 06f28d9ca..c3f0d2ed3 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:136:0 +// src/engine/editor.cpp:137:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 7dce80638..41b635c13 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:133:0 +// src/engine/editor.cpp:134:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 06751c99d..7dd900e04 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:189:0 +// src/engine/editor.cpp:303:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index d0b599370..44e3f1fc9 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:298:0 +// src/engine/editor.cpp:297:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -277,6 +277,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name RangeIterator(ArrayIndex, 28) { DoEditorUi(Ui, Window, Element->_Pad1+ArrayIndex, FSz("_Pad1[%d]", ArrayIndex), Params); + PushNewRow(Ui); } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); diff --git a/generated/do_editor_ui_for_compound_type_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_world_edit_brush.h index 5cac4793e..71d2a9f81 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:779:0 +// src/engine/editor.h:785:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index b34ccc13d..fa8ca99b5 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:102:0 +// src/engine/editor.cpp:103:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 8f5e26cf8..088fe3ef9 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:100:0 +// src/engine/editor.cpp:101:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index c21a31bd0..ce636bd7a 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:295:0 +// src/engine/editor.cpp:294:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 792661d54..6b885eebe 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:270:0 +// src/engine/editor.cpp:269:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 0704f5296..0c2e83a2a 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:127:0 +// src/engine/editor.cpp:128:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 17a3b0a23..1b5525ae2 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:112:0 +// src/engine/editor.cpp:113:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 73eb0a4dc..b0acfb328 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:310:0 +// src/engine/editor.cpp:315:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 3b202e76b..0dfe120eb 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:243:0 +// src/engine/editor.cpp:242:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index cf312dfa7..367165071 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:506:0 +// src/engine/editor.h:512:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 1a372facc..73946e05f 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:422:0 +// src/engine/editor.cpp:427:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 05094c13b..2122de0b7 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:181:0 +// src/engine/editor.cpp:182:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 7338e9643..8b6b70572 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:178:0 +// src/engine/editor.cpp:179:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 730068ed6..7aaf3cb98 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:273:0 +// src/engine/editor.cpp:272:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 18814311f..dde317abf 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:204:0 +// src/engine/editor.cpp:203:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 0921cc19b..417facab6 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:428:0 +// src/engine/editor.cpp:433:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 537b26061..41995d121 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:431:0 +// src/engine/editor.cpp:436:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 2dc4aeabf..7284d0ea8 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:104:0 +// src/engine/editor.cpp:105:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index de8a2d4d1..6a446d4b3 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:184:0 +// src/engine/editor.cpp:185:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 4c25356f3..975c2bb85 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:547:0 +// src/engine/editor.h:553:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index c8ec89173..e5b0108af 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:683:0 +// src/engine/editor.h:689:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 0c2468b3b..174a1e644 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:856:0 +// src/engine/editor.h:862:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 4dd7b4b36..37bf109c5 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:697:0 +// src/engine/editor.h:703:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_mode.h index fbee1fd67..196aed6dc 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:691:0 +// src/engine/editor.h:697:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h index 4022f3c97..d7f3e84d3 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:670:0 +// src/engine/editor.h:676:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_mode_modifier Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 7583cf80e..753249966 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:694:0 +// src/engine/editor.h:700:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index a47eba4ec..859a4c24e 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:381:0 +// src/engine/editor.h:387:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index 9a1ac3e8e..f0dacd968 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:493:0 +// src/engine/editor.h:499:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index aa66fd237..2dd1cce8a 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:32:0 +// src/engine/world.h:33:0 struct octree_node_freelist { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index bcc690cc9..874ceea75 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:29:0 +// src/engine/world.h:30:0 struct octree_node_ptr_stack { diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 78cd0fa69..97074c2ba 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3043:0 +// src/engine/world_chunk.cpp:3060:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 0af0d431a..f263bc019 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:533:0 +// src/engine/editor.h:539:0 link_internal ui_toggle_button_group RadioButtonGroup_level_editor_flags( renderer_2d *Ui, diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 7bf5b2f09..d12771406 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:545:0 +// src/engine/editor.h:551:0 link_internal ui_toggle_button_group RadioButtonGroup_ui_noise_type( renderer_2d *Ui, diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 18ac5d62e..529b0543a 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:308:0 +// src/engine/editor.cpp:313:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 6cce13062..ba4a5af1c 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:504:0 +// src/engine/editor.h:510:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 64a9f3206..6e636ffd5 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:174:0 +// src/engine/editor.cpp:175:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index c83a61396..3550d3544 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:168:0 +// src/engine/editor.cpp:169:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 75f2be226..ece11082d 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:165:0 +// src/engine/editor.cpp:166:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 60087d8c5..ca5caf141 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:806:0 +// src/engine/editor.h:812:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 054e90bc2..88ff974f5 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:171:0 +// src/engine/editor.cpp:172:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 8bdd8a66b..9e448c9f8 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:543:0 +// src/engine/editor.h:549:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_mode.h b/generated/string_and_value_tables_world_edit_mode.h index 645da345d..c4f858bbb 100644 --- a/generated/string_and_value_tables_world_edit_mode.h +++ b/generated/string_and_value_tables_world_edit_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:686:0 +// src/engine/editor.h:692:0 link_internal counted_string ToStringPrefixless(world_edit_mode Type) diff --git a/generated/string_and_value_tables_world_edit_mode_modifier.h b/generated/string_and_value_tables_world_edit_mode_modifier.h index 0abe04583..bdeb54f55 100644 --- a/generated/string_and_value_tables_world_edit_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:673:0 +// src/engine/editor.h:679:0 link_internal counted_string ToStringPrefixless(world_edit_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 3afffdf56..5a659cfeb 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:577:0 +// src/engine/editor.h:583:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/string_and_value_tables_world_update_op_shape_type.h b/generated/string_and_value_tables_world_update_op_shape_type.h index b9f821e48..6a1e35867 100644 --- a/generated/string_and_value_tables_world_update_op_shape_type.h +++ b/generated/string_and_value_tables_world_update_op_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:719:0 +// src/engine/editor.h:725:0 link_internal counted_string ToStringPrefixless(world_update_op_shape_type Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 251e47eff..a7e302727 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:678:0 +// src/engine/editor.h:684:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 2b66c5abe..27b517acb 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2074:0 +// src/engine/world_chunk.cpp:2091:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 6efc84cb5..d92d61e61 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2077:0 +// src/engine/world_chunk.cpp:2094:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index ff92817c6..09409eff6 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -88,6 +88,7 @@ GetUiDebug() } + poof(do_editor_ui_for_compound_type(white_noise_params)) #include @@ -186,8 +187,6 @@ poof(do_editor_ui_for_enum(tone_mapping_type)) -poof(do_editor_ui_for_compound_type(world)) -#include poof(do_editor_ui_for_compound_type(lighting_settings)) #include @@ -298,6 +297,12 @@ poof(do_editor_ui_for_container(entity_ptr_block_array)) poof(do_editor_ui_for_compound_type(world_chunk)) #include +poof(do_editor_ui_for_compound_type(octree_node)) +#include + +poof(do_editor_ui_for_compound_type(world)) +#include + // NOTE(Jesse): Had to hack this slightly because the asset_load_state on Enitity is marked volatile /* poof(do_editor_ui_for_enum(asset_load_state)) */ #include diff --git a/src/engine/editor.h b/src/engine/editor.h index fa2242143..4be13be55 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -193,7 +193,13 @@ poof( PushNewRow(Ui); RangeIterator(ArrayIndex, member.array) { - DoEditorUi(Ui, Window, Element->(member.name)+ArrayIndex, FSz("member.name[%d]", ArrayIndex), Params); + member.has_tag(custom_ui)? + { + member.tag_value(custom_ui); + } + { + DoEditorUi(Ui, Window, Element->(member.name)+ArrayIndex, FSz("member.name[%d]", ArrayIndex), Params); + } member.is_primitive? { PushNewRow(Ui); } } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); diff --git a/src/engine/entity.cpp b/src/engine/entity.cpp index 03af0537f..debd0354b 100644 --- a/src/engine/entity.cpp +++ b/src/engine/entity.cpp @@ -7,7 +7,21 @@ Deactivate(particle_system *System) link_internal void Destroy(entity *Entity) { - DropEntityFromPreviouslyOccupiedChunks(GetEngineResources()->World, Entity, GetTranArena()); + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + /* DropEntityFromPreviouslyOccupiedChunks(GetEngineResources()->World, Entity, GetTranArena()); */ Assert( Spawned(Entity) ); Entity->State = EntityState_Destroyed; @@ -18,7 +32,21 @@ Destroy(entity *Entity) link_internal void Unspawn(entity *Entity) { - DropEntityFromPreviouslyOccupiedChunks(GetEngineResources()->World, Entity, GetTranArena()); + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + /* DropEntityFromPreviouslyOccupiedChunks(GetEngineResources()->World, Entity, GetTranArena()); */ Entity->State = EntityState_Free; Assert(Entity->Emitter); @@ -431,7 +459,26 @@ SpawnEntity(entity *Entity) } } - InsertEntityIntoChunks(World, Entity, GetTranArena()); + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + /* InsertEntityIntoChunks(World, Entity, GetTranArena()); */ Entity->State = EntityState_Spawned; } @@ -1505,9 +1552,43 @@ SimulateEntity(engine_resources *Resources, entity *Entity, r32 dt, v3i VisibleR } - DropEntityFromPreviouslyOccupiedChunks(World, Entity, GetTranArena()); + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + /* DropEntityFromPreviouslyOccupiedChunks(World, Entity, GetTranArena()); */ FinalizeEntityUpdate(Entity); - InsertEntityIntoChunks(World, Entity, GetTranArena()); + // + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + // nopush + /* InsertEntityIntoChunks(World, Entity, GetTranArena()); */ } link_internal void diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 3e51eebe1..0d192373d 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -211,36 +211,41 @@ GetBoundingBox(world *World, octree_node *Node) } link_internal b32 -ContainsCamera(world *World, octree_node *Node, camera *Camera) +ContainsCameraGhost(world *World, entity **EntityTable, octree_node *Node, camera *Camera) { rect3cp Rect = GetBoundingBox(World, Node); - b32 Result = Contains(Rect, Camera->CurrentP); + + b32 Result = {}; + if (entity *Ghost = GetEntity(EntityTable, Camera->GhostId)) + { + Result = Contains(Rect, Ghost->P); + } return Result; } -link_internal b32 -OctreeNodeNeedsToSplit(world *World, octree_node *Node, camera *Camera) -{ - Assert(Node->Chunk.Dim == World->ChunkDim); - Assert(Node->Type); - Assert(Node->DimInChunks >= V3i(1)); +/* link_internal b32 */ +/* OctreeNodeNeedsToSplit(world *World, octree_node *Node, camera *Camera) */ +/* { */ +/* Assert(Node->Chunk.Dim == World->ChunkDim); */ +/* Assert(Node->Type); */ +/* Assert(Node->DimInChunks >= V3i(1)); */ - b32 Result = Node->DimInChunks > V3i(1); - Result &= (Node->Chunk.Flags & Chunk_Queued) == 0; - Result &= ContainsCamera(World, Node, Camera); +/* b32 Result = Node->DimInChunks > V3i(1); */ +/* Result &= (Node->Chunk.Flags & Chunk_Queued) == 0; */ +/* Result &= ContainsCamera(World, Node, Camera); */ - return Result; -} +/* return Result; */ +/* } */ -link_internal b32 -OctreeChildrenNeedToMerge(world *World, octree_node *Node, camera *Camera) -{ - Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); +/* link_internal b32 */ +/* OctreeChildrenNeedToMerge(world *World, octree_node *Node, camera *Camera) */ +/* { */ +/* Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); */ - b32 Result = Node->Type == OctreeNodeType_Transit; - Result &= ContainsCamera(World, Node, Camera) == False; - return Result; -} +/* b32 Result = Node->Type == OctreeNodeType_Transit; */ +/* Result &= ContainsCamera(World, Node, Camera) == False; */ +/* return Result; */ +/* } */ link_internal void @@ -298,6 +303,7 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); Assert(Node->Type == OctreeNodeType_Transit); + Node->Type = OctreeNodeType_Leaf; u32 Result = False; @@ -332,29 +338,43 @@ MaintainWorldOctree(engine_resources *Engine) octree_node_ptr_stack Stack = OctreeNodePtrStack(1024, &World->OctreeMemory); Push(&Stack, &World->Root); + /* RuntimeBreak(); */ while (CurrentCount(&Stack) && (ChunksQueued < MAX_WORLD_CHUNKS_QUEUED_PER_FRAME) ) { - octree_node *Current = Pop(&Stack); + octree_node *Node = Pop(&Stack); + + Assert(Node->Chunk.Dim == World->ChunkDim); + Assert(Node->Type); + Assert(Node->DimInChunks >= V3i(1)); - if (OctreeNodeNeedsToSplit(World, Current, Camera)) + b32 OctreeNodeNeedsToSplit = (Node->DimInChunks > V3i(1)); + OctreeNodeNeedsToSplit &= (Node->Type == OctreeNodeType_Leaf); + OctreeNodeNeedsToSplit &= (Node->Chunk.Flags & Chunk_Queued) == 0; + OctreeNodeNeedsToSplit &= ContainsCameraGhost(World, EntityTable, Node, Camera); + if (OctreeNodeNeedsToSplit) { - ChunksQueued += SplitOctreeNode(World, &Plat->LowPriority, Current, &World->OctreeMemory); + ChunksQueued += SplitOctreeNode(World, &Plat->LowPriority, Node, &World->OctreeMemory); } - if (OctreeChildrenNeedToMerge(World, Current, Camera)) + + + b32 OctreeChildrenNeedToMerge = Node->Type == OctreeNodeType_Transit; + OctreeChildrenNeedToMerge &= (Node->Chunk.Flags & Chunk_Queued) == 0; + OctreeChildrenNeedToMerge &= ContainsCameraGhost(World, EntityTable, Node, Camera) == False; + if (OctreeChildrenNeedToMerge) { - ChunksQueued += MergeOctreeChildren(Engine, Current); + ChunksQueued += MergeOctreeChildren(Engine, Node); } { - if (Current->Children[0]) { Push(&Stack, Current->Children[0]); } - if (Current->Children[1]) { Push(&Stack, Current->Children[1]); } - if (Current->Children[2]) { Push(&Stack, Current->Children[2]); } - if (Current->Children[3]) { Push(&Stack, Current->Children[3]); } - if (Current->Children[4]) { Push(&Stack, Current->Children[4]); } - if (Current->Children[5]) { Push(&Stack, Current->Children[5]); } - if (Current->Children[6]) { Push(&Stack, Current->Children[6]); } - if (Current->Children[7]) { Push(&Stack, Current->Children[7]); } + if (Node->Children[0]) { Push(&Stack, Node->Children[0]); } + if (Node->Children[1]) { Push(&Stack, Node->Children[1]); } + if (Node->Children[2]) { Push(&Stack, Node->Children[2]); } + if (Node->Children[3]) { Push(&Stack, Node->Children[3]); } + if (Node->Children[4]) { Push(&Stack, Node->Children[4]); } + if (Node->Children[5]) { Push(&Stack, Node->Children[5]); } + if (Node->Children[6]) { Push(&Stack, Node->Children[6]); } + if (Node->Children[7]) { Push(&Stack, Node->Children[7]); } } } } diff --git a/src/engine/world.h b/src/engine/world.h index e791cc487..696eaad13 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -16,10 +16,11 @@ struct octree_node // TODO(Jesse): Maybe make this a pointer ..? world_chunk Chunk; - union { + // NOTE(Jesse): Took the union out because the UI doesn't know how to deal.. + /* union { */ + octree_node *Children[8]; poof(@custom_ui(if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[ArrayIndex], CSz("Child"), Params);})) octree_node *Next; // NOTE(Jesse): Freelist Next - octree_node *Children[8]; - }; + /* }; */ }; typedef octree_node* octree_node_ptr; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index db4bafcf4..1b08ade49 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -347,7 +347,24 @@ GetWorldChunkFromHashtable(world *World, world_position P) { /* TIMED_FUNCTION(); */ // This makes things much slower - NotImplemented; + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- + // nopush- return {}; #if 0 u32 HashIndex = GetWorldChunkHash(P, World->VisibleRegion, World->HashSize); From 0284020d2e7cb6396774c7f6a6409c3d5fbe37f4 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Sep 2024 15:01:01 -0700 Subject: [PATCH 006/421] LODs drawing! --- examples/blank_project/game_constants.h | 5 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 15 ------ ..._editor_ui_for_compound_type_world_chunk.h | 15 ++++++ .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- generated/maybe_standing_spot.h | 2 +- generated/serdes_struct_world_chunk.h | 14 ++++++ jesse.make.sh | 4 +- src/engine/render.cpp | 2 +- src/engine/render.h | 2 + src/engine/resources.cpp | 37 +++++++++++++++ src/engine/world.cpp | 47 +++++++++++++------ src/engine/world.h | 2 +- src/engine/world_chunk.h | 1 + 18 files changed, 116 insertions(+), 42 deletions(-) diff --git a/examples/blank_project/game_constants.h b/examples/blank_project/game_constants.h index 74309b25c..1dc25d578 100644 --- a/examples/blank_project/game_constants.h +++ b/examples/blank_project/game_constants.h @@ -7,7 +7,10 @@ global_variable chunk_dimension WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); #else global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(8, 8, 8); +/* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ +g_VisibleRegion = Chunk_Dimension(16, 16, 16); +/* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ +/* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ global_variable chunk_dimension WORLD_CHUNK_DIM = Chunk_Dimension(64, 64, 64); diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index f59739831..de3bc77ea 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:460:0 +// src/engine/world_chunk.h:461:0 struct world_chunk_ptr_block { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 469add53e..025a9fdb2 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:501:0 +// src/engine/world_chunk.h:502:0 struct standing_spot_block { diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 08deea56f..f836b71b8 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:528:0 +// src/engine/world_chunk.h:529:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index fa5565a94..3c6ef878c 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:457:0 +// src/engine/world_chunk.h:458:0 struct world_chunk_ptr_buffer { diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index babab4a50..3d7093f51 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -41,21 +41,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->DimInChunks), - CSz("DimInChunks"), - Params - ); - - - - - - - - DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 44e3f1fc9..75362002c 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -131,6 +131,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*,&Element->DimInChunks), + CSz("DimInChunks"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 434084228..3081b64f9 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:534:0 +// src/engine/world_chunk.h:535:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index de2846ba5..c97072484 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:531:0 +// src/engine/world_chunk.h:532:0 struct standing_spot_stream_chunk { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 0fbc6b8b6..37662c7a8 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:498:0 +// src/engine/world_chunk.h:499:0 struct maybe_standing_spot { diff --git a/generated/serdes_struct_world_chunk.h b/generated/serdes_struct_world_chunk.h index 50a07eea7..f1ff7c1b1 100644 --- a/generated/serdes_struct_world_chunk.h +++ b/generated/serdes_struct_world_chunk.h @@ -53,6 +53,12 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) + Result &= Serialize(Bytes, &Element->DimInChunks); + + + + + Result &= Serialize(Bytes, &Element->WorldP); @@ -130,6 +136,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->DimInChunks, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldP, Memory); diff --git a/jesse.make.sh b/jesse.make.sh index e8fdce1b2..841a62191 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 @@ -12,8 +12,8 @@ ./make.sh $OPT \ BuildExecutables \ BuildSingleExample examples/blank_project \ + BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ - # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/tools/voxel_synthesis_rule_baker \ # BuildSingleExample examples/turn_based \ # BuildSingleExample examples/terrain_gen \ diff --git a/src/engine/render.cpp b/src/engine/render.cpp index d92de6070..ea0c5a4cf 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1527,7 +1527,7 @@ RenderDrawList(engine_resources *Engine, world_chunk_ptr_paged_list *DrawList, s AssertNoGlErrors; v3 Basis = GetRenderP(Engine, Chunk->WorldP); - DrawLod(Engine, Shader, &Chunk->Meshes, 0.f, Basis); + DrawLod(Engine, Shader, &Chunk->Meshes, 0.f, Basis, Quaternion(), V3(Chunk->DimInChunks)); AssertNoGlErrors; } } diff --git a/src/engine/render.h b/src/engine/render.h index 971ddd7a3..013f1d7b6 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -176,3 +176,5 @@ CopyToGpuBuffer(untextured_3d_geometry_buffer *Mesh, gpu_mapped_element_buffer * link_internal void DeallocateGpuElementBuffer(gpu_mapped_element_buffer *Buf); +link_internal b32 +SyncGpuBuffersAsync(engine_resources *Engine, lod_element_buffer *Meshes); diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index ea79cda0a..2ea176c0c 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -28,6 +28,40 @@ DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk) FullBarrier; } +link_internal void +RenderOctree(engine_resources *Engine, shader *Shader) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + b32 Continue = True; + u32 ChunksQueued = 0; + + octree_node_ptr_stack Stack = OctreeNodePtrStack(1024, &World->OctreeMemory); + Push(&Stack, &World->Root); + + /* RuntimeBreak(); */ + while (CurrentCount(&Stack) && (ChunksQueued < MAX_WORLD_CHUNKS_QUEUED_PER_FRAME) ) + { + octree_node *Node = Pop(&Stack); + + if (Node->Type == OctreeNodeType_Leaf) + { + SyncGpuBuffersImmediate(Engine, &Node->Chunk.Meshes); + DrawLod(Engine, Shader, &Node->Chunk.Meshes, 0, {}, Quaternion(), V3(1)); + } + + if (Node->Children[0]) { Push(&Stack, Node->Children[0]); } + if (Node->Children[1]) { Push(&Stack, Node->Children[1]); } + if (Node->Children[2]) { Push(&Stack, Node->Children[2]); } + if (Node->Children[3]) { Push(&Stack, Node->Children[3]); } + if (Node->Children[4]) { Push(&Stack, Node->Children[4]); } + if (Node->Children[5]) { Push(&Stack, Node->Children[5]); } + if (Node->Children[6]) { Push(&Stack, Node->Children[6]); } + if (Node->Children[7]) { Push(&Stack, Node->Children[7]); } + } +} + + link_internal void RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { @@ -245,6 +279,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } Clear(&GpuMap->Buffer); + // NOTE(Jesse): I observed the AO lagging a frame behind if this is re-ordered // after the transparency/luminance textures. I have literally 0 ideas as to // why that would be, but here we are. @@ -259,6 +294,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) /* if (Graphics->Settings.UseLightingBloom) { GaussianBlurTexture(&Graphics->Gaussian, &Graphics->Lighting.BloomTex, &Graphics->Lighting.BloomFBO); } */ + + CompositeGameTexturesAndDisplay(Plat, Graphics); UiFrameEnd(&Engine->Ui); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 0d192373d..bd76e2ad1 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -24,7 +24,7 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) World->Root.Type = OctreeNodeType_Leaf; - World->Root.DimInChunks = VisibleRegion; + World->Root.Chunk.DimInChunks = VisibleRegion; AllocateWorldChunk(&World->Root.Chunk, {}, WorldChunkDim, World->ChunkMemory); World->OctreeNodeFreelist.Memory = &World->OctreeMemory; @@ -204,7 +204,7 @@ link_internal rect3cp GetBoundingBox(world *World, octree_node *Node) { cp Min = Canonical_Position(Node->Chunk.WorldP, {}); - cp Max = Canonicalize(World, Canonical_Position(V3(Node->DimInChunks), Node->Chunk.WorldP)); + cp Max = Canonicalize(World, Canonical_Position(V3(Node->Chunk.DimInChunks), Node->Chunk.WorldP)); rect3cp Rect = RectMinMax(Min, Max); return Rect; @@ -252,7 +252,7 @@ link_internal void InitOctreeNodeAndQueueChunkForInit(world *World, work_queue *Queue, octree_node *Node, v3i WorldP, v3i DimInChunks) { Node->Type = OctreeNodeType_Leaf; - Node->DimInChunks = DimInChunks; + Node->Chunk.DimInChunks = DimInChunks; world_chunk *Chunk = &Node->Chunk; AllocateWorldChunk(Chunk, WorldP, World->ChunkDim, World->ChunkMemory); @@ -266,7 +266,7 @@ SplitOctreeNode(world *World, work_queue *Queue, octree_node *Parent, memory_are Assert(Parent->Type == OctreeNodeType_Leaf); Parent->Type = OctreeNodeType_Transit; - v3i ChildDimInChunks = Parent->DimInChunks / 2; + v3i ChildDimInChunks = Parent->Chunk.DimInChunks / 2; RangeIterator(Index, s32(ArrayCount(Parent->Children))) { @@ -338,6 +338,18 @@ MaintainWorldOctree(engine_resources *Engine) octree_node_ptr_stack Stack = OctreeNodePtrStack(1024, &World->OctreeMemory); Push(&Stack, &World->Root); + world_chunk_ptr_paged_list *MainDrawList = &Graphics->MainDrawList; + world_chunk_ptr_paged_list *ShadowMapDrawList = &Graphics->ShadowMapDrawList; + + // Reset world_chunk draw lists + { + Clear(MainDrawList); + Clear(ShadowMapDrawList); + + MainDrawList->Memory = GetTranArena(); + ShadowMapDrawList->Memory = GetTranArena(); + } + /* RuntimeBreak(); */ while (CurrentCount(&Stack) && (ChunksQueued < MAX_WORLD_CHUNKS_QUEUED_PER_FRAME) ) { @@ -345,9 +357,9 @@ MaintainWorldOctree(engine_resources *Engine) Assert(Node->Chunk.Dim == World->ChunkDim); Assert(Node->Type); - Assert(Node->DimInChunks >= V3i(1)); + Assert(Node->Chunk.DimInChunks >= V3i(1)); - b32 OctreeNodeNeedsToSplit = (Node->DimInChunks > V3i(1)); + b32 OctreeNodeNeedsToSplit = (Node->Chunk.DimInChunks > V3i(1)); OctreeNodeNeedsToSplit &= (Node->Type == OctreeNodeType_Leaf); OctreeNodeNeedsToSplit &= (Node->Chunk.Flags & Chunk_Queued) == 0; OctreeNodeNeedsToSplit &= ContainsCameraGhost(World, EntityTable, Node, Camera); @@ -366,16 +378,21 @@ MaintainWorldOctree(engine_resources *Engine) ChunksQueued += MergeOctreeChildren(Engine, Node); } + if (Node->Type == OctreeNodeType_Leaf) { - if (Node->Children[0]) { Push(&Stack, Node->Children[0]); } - if (Node->Children[1]) { Push(&Stack, Node->Children[1]); } - if (Node->Children[2]) { Push(&Stack, Node->Children[2]); } - if (Node->Children[3]) { Push(&Stack, Node->Children[3]); } - if (Node->Children[4]) { Push(&Stack, Node->Children[4]); } - if (Node->Children[5]) { Push(&Stack, Node->Children[5]); } - if (Node->Children[6]) { Push(&Stack, Node->Children[6]); } - if (Node->Children[7]) { Push(&Stack, Node->Children[7]); } + auto Chunk = &Node->Chunk; + SyncGpuBuffersAsync(Engine, &Chunk->Meshes); + Push(MainDrawList, &Chunk); } + + if (Node->Children[0]) { Push(&Stack, Node->Children[0]); } + if (Node->Children[1]) { Push(&Stack, Node->Children[1]); } + if (Node->Children[2]) { Push(&Stack, Node->Children[2]); } + if (Node->Children[3]) { Push(&Stack, Node->Children[3]); } + if (Node->Children[4]) { Push(&Stack, Node->Children[4]); } + if (Node->Children[5]) { Push(&Stack, Node->Children[5]); } + if (Node->Children[6]) { Push(&Stack, Node->Children[6]); } + if (Node->Children[7]) { Push(&Stack, Node->Children[7]); } } } @@ -393,7 +410,7 @@ GetWorldChunkFromOctree(world *World, v3i QueryP) if (Contains(Box, Canonical_Position(V3(0), QueryP))) { v3i CurrentToQuery = QueryP - Current->Chunk.WorldP; - v3i Cell = CurrentToQuery / Current->DimInChunks; + v3i Cell = CurrentToQuery / Current->Chunk.DimInChunks; Assert(Cell < V3i(2)); s32 Index = GetIndex(Cell, V3i(2)); Assert(Index < 8); diff --git a/src/engine/world.h b/src/engine/world.h index 696eaad13..fd98c3d98 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -11,7 +11,7 @@ struct octree_node octree_node_type Type; // This is the world-space dimension of the node, in chunks - v3i DimInChunks; + /* v3i DimInChunks; */ // TODO(Jesse): Maybe make this a pointer ..? world_chunk Chunk; diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 313cbf7fb..784a9adc4 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -350,6 +350,7 @@ struct world_chunk poof(@version(1)) voxel_position_cursor StandingSpots; poof(@no_serialize) + v3i DimInChunks; v3i WorldP; s32 FilledCount; poof(@no_serialize) From aa63941fefea6f6096d76c4dd8d63251af13a0c6 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Sep 2024 15:26:23 -0700 Subject: [PATCH 007/421] Fix a shader bug when scaling geometry (normals were scaled too!) --- shaders/gBuffer.vertexshader | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shaders/gBuffer.vertexshader b/shaders/gBuffer.vertexshader index 30eb81b3f..d099e96de 100644 --- a/shaders/gBuffer.vertexshader +++ b/shaders/gBuffer.vertexshader @@ -44,7 +44,9 @@ void main() v4 WorldVertex = ModelMatrix*vec4(vertexPosition_modelspace, 1); vertexP_worldspace = WorldVertex.xyz; - vertexN_worldspace = mat3(NormalMatrix) * V3(vertexNormal_modelspace); + + // NOTE(Jesse): We have to normalize because a scale factor will grow/shrink the normal! + vertexN_worldspace = normalize(mat3(NormalMatrix) * V3(vertexNormal_modelspace)); gl_Position = ViewProjection * WorldVertex; } From 527734caa54774d807416a5d80a4867f89562cee Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Sep 2024 18:50:20 -0700 Subject: [PATCH 008/421] blank_project rendering perlin2d terrain with seams --- examples/blank_project/game.cpp | 2 +- examples/blank_project/game_constants.h | 5 +- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- jesse.make.sh | 2 +- src/engine/api.cpp | 4 +- src/engine/editor.cpp | 6 +- src/engine/render.cpp | 2 +- src/engine/render/render_init.cpp | 4 +- src/engine/resources.h | 1 + src/engine/world.cpp | 64 ++++++++++++++++--- src/engine/world_chunk.cpp | 22 +++++-- src/engine/world_chunk.h | 4 +- 14 files changed, 89 insertions(+), 33 deletions(-) diff --git a/examples/blank_project/game.cpp b/examples/blank_project/game.cpp index 713bfcdf8..8a4ef94ce 100644 --- a/examples/blank_project/game.cpp +++ b/examples/blank_project/game.cpp @@ -68,7 +68,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() world_position WorldCenter = {}; canonical_position CameraTargetP = {}; - StandardCamera(Graphics->Camera, 10000.0f, 1000.0f); + StandardCamera(Graphics->Camera, 30000.0f, 1000.0f); AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); diff --git a/examples/blank_project/game_constants.h b/examples/blank_project/game_constants.h index 1dc25d578..b37e9fadf 100644 --- a/examples/blank_project/game_constants.h +++ b/examples/blank_project/game_constants.h @@ -8,9 +8,12 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); #else global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ -g_VisibleRegion = Chunk_Dimension(16, 16, 16); +/* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ +/* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ +g_VisibleRegion = Chunk_Dimension(256, 256, 256); // 1.63km +/* g_VisibleRegion = Chunk_Dimension(1024, 1024, 1024); */ global_variable chunk_dimension WORLD_CHUNK_DIM = Chunk_Dimension(64, 64, 64); diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 97074c2ba..c62fdf466 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3060:0 +// src/engine/world_chunk.cpp:3066:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 27b517acb..7255380fe 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2091:0 +// src/engine/world_chunk.cpp:2097:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index d92d61e61..1854072fe 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2094:0 +// src/engine/world_chunk.cpp:2100:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, diff --git a/jesse.make.sh b/jesse.make.sh index 841a62191..d88934930 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 9a7a00ba7..28f0ee659 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -601,8 +601,8 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ { s32 Period = 150; s32 Amplititude = 10; - s32 StartingZDepth = 0; - v3 Color = HSV_GRASS_GREEN; + s32 StartingZDepth = 120; + v3 Color = RGB_GRASS_GREEN; Assert(Chunk->Dim == World->ChunkDim); u32 Octaves = 1; diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 09409eff6..17bb2eabf 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1034,7 +1034,7 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br // /* DeallocateWorldChunk(Chunk, MeshFreelist); */ DeallocateGpuBuffers(RenderQ, Chunk); - AllocateWorldChunk(Chunk, {}, RequiredLayerDim, Editor->Memory); + AllocateWorldChunk(Chunk, {}, RequiredLayerDim, {}, Editor->Memory); } if (UpdateVoxels) @@ -1743,7 +1743,7 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti else { // @editor_chunk_memory_question - AllocateWorldChunk(Root_LayeredBrushPreview, {}, LargestLayerDim, Editor->Memory); + AllocateWorldChunk(Root_LayeredBrushPreview, {}, LargestLayerDim, {}, Editor->Memory); } world_chunk *SeedChunk = &LayeredBrush->SeedLayer.Chunk; @@ -1753,7 +1753,7 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti } else { - AllocateWorldChunk(SeedChunk, {}, LargestLayerDim, Editor->Memory); + AllocateWorldChunk(SeedChunk, {}, LargestLayerDim, {}, Editor->Memory); } diff --git a/src/engine/render.cpp b/src/engine/render.cpp index ea0c5a4cf..4ebd24b9b 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1526,7 +1526,7 @@ RenderDrawList(engine_resources *Engine, world_chunk_ptr_paged_list *DrawList, s /* SyncGpuBuffersImmediate(Engine, &Chunk->Meshes); */ AssertNoGlErrors; - v3 Basis = GetRenderP(Engine, Chunk->WorldP); + v3 Basis = GetRenderP(Engine, Chunk->WorldP); // - (Chunk->DimInChunks/2.f); DrawLod(Engine, Shader, &Chunk->Meshes, 0.f, Basis, Quaternion(), V3(Chunk->DimInChunks)); AssertNoGlErrors; } diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 8036082c6..87d0c7169 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -615,8 +615,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Lighting->DuskIntensity = 0.50f; } - StandardCamera(&Result->GameCamera, 10000.f, 500.f); - StandardCamera(&Result->DebugCamera, 10000.f, 500.f); + StandardCamera(&Result->GameCamera, 100000.f, 500.f); + StandardCamera(&Result->DebugCamera, 100000.f, 500.f); Result->Camera = &Result->GameCamera; diff --git a/src/engine/resources.h b/src/engine/resources.h index 6a97866b7..b9ff0526a 100644 --- a/src/engine/resources.h +++ b/src/engine/resources.h @@ -170,5 +170,6 @@ GetCameraGhost(engine_resources *Engine) gpu_mapped_element_buffer *GpuMap = GetCurrentGpuMap(Graphics); \ g_buffer_render_group *gBuffer = Graphics->gBuffer; \ camera *Camera = Graphics->Camera; \ + camera *GameCamera = &Graphics->GameCamera; \ work_queue *RenderQ = &Plat->RenderQ diff --git a/src/engine/world.cpp b/src/engine/world.cpp index bd76e2ad1..07969d596 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -24,8 +24,7 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) World->Root.Type = OctreeNodeType_Leaf; - World->Root.Chunk.DimInChunks = VisibleRegion; - AllocateWorldChunk(&World->Root.Chunk, {}, WorldChunkDim, World->ChunkMemory); + AllocateWorldChunk(&World->Root.Chunk, {}, WorldChunkDim, VisibleRegion, World->ChunkMemory); World->OctreeNodeFreelist.Memory = &World->OctreeMemory; @@ -203,8 +202,8 @@ GatherVoxelsOverlappingArea(engine_resources *Engine, rect3cp Rect, memory_arena link_internal rect3cp GetBoundingBox(world *World, octree_node *Node) { - cp Min = Canonical_Position(Node->Chunk.WorldP, {}); - cp Max = Canonicalize(World, Canonical_Position(V3(Node->Chunk.DimInChunks), Node->Chunk.WorldP)); + cp Min = Canonical_Position(V3(0), Node->Chunk.WorldP); + cp Max = Canonicalize(World, Canonical_Position(V3(0), Node->Chunk.WorldP+Node->Chunk.DimInChunks)); rect3cp Rect = RectMinMax(Min, Max); return Rect; @@ -252,10 +251,9 @@ link_internal void InitOctreeNodeAndQueueChunkForInit(world *World, work_queue *Queue, octree_node *Node, v3i WorldP, v3i DimInChunks) { Node->Type = OctreeNodeType_Leaf; - Node->Chunk.DimInChunks = DimInChunks; world_chunk *Chunk = &Node->Chunk; - AllocateWorldChunk(Chunk, WorldP, World->ChunkDim, World->ChunkMemory); + AllocateWorldChunk(Chunk, WorldP, World->ChunkDim, DimInChunks, World->ChunkMemory); QueueChunkForInit(Queue, Chunk, MeshBit_Lod0); } @@ -286,14 +284,30 @@ SplitOctreeNode(world *World, work_queue *Queue, octree_node *Parent, memory_are return 8; } +link_internal u32 +MergeOctreeChildren(engine_resources *Engine, octree_node *Node); + link_internal void CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) { octree_node *Node = *Bucket; *Bucket = 0; - Assert(Node->Type == OctreeNodeType_Leaf); - Free(&Engine->World->OctreeNodeFreelist, Node); + switch(Node->Type) + { + InvalidCase(OctreeNodeType_Undefined); + + case OctreeNodeType_Leaf: + { + DeallocateAndClearWorldChunk(Engine, &Node->Chunk); + Free(&Engine->World->OctreeNodeFreelist, Node); + } break; + + case OctreeNodeType_Transit: + { + MergeOctreeChildren(Engine, Node); + } break; + } } link_internal u32 @@ -362,7 +376,7 @@ MaintainWorldOctree(engine_resources *Engine) b32 OctreeNodeNeedsToSplit = (Node->Chunk.DimInChunks > V3i(1)); OctreeNodeNeedsToSplit &= (Node->Type == OctreeNodeType_Leaf); OctreeNodeNeedsToSplit &= (Node->Chunk.Flags & Chunk_Queued) == 0; - OctreeNodeNeedsToSplit &= ContainsCameraGhost(World, EntityTable, Node, Camera); + OctreeNodeNeedsToSplit &= ContainsCameraGhost(World, EntityTable, Node, GameCamera); if (OctreeNodeNeedsToSplit) { ChunksQueued += SplitOctreeNode(World, &Plat->LowPriority, Node, &World->OctreeMemory); @@ -372,9 +386,10 @@ MaintainWorldOctree(engine_resources *Engine) b32 OctreeChildrenNeedToMerge = Node->Type == OctreeNodeType_Transit; OctreeChildrenNeedToMerge &= (Node->Chunk.Flags & Chunk_Queued) == 0; - OctreeChildrenNeedToMerge &= ContainsCameraGhost(World, EntityTable, Node, Camera) == False; + OctreeChildrenNeedToMerge &= ContainsCameraGhost(World, EntityTable, Node, GameCamera) == False; if (OctreeChildrenNeedToMerge) { + ContainsCameraGhost(World, EntityTable, Node, Camera); ChunksQueued += MergeOctreeChildren(Engine, Node); } @@ -385,6 +400,35 @@ MaintainWorldOctree(engine_resources *Engine) Push(MainDrawList, &Chunk); } + switch(Node->Type) + { + InvalidCase(OctreeNodeType_Undefined); + + case OctreeNodeType_Leaf: + { + Assert(Node->Children[0] == 0); + Assert(Node->Children[1] == 0); + Assert(Node->Children[2] == 0); + Assert(Node->Children[3] == 0); + Assert(Node->Children[4] == 0); + Assert(Node->Children[5] == 0); + Assert(Node->Children[6] == 0); + Assert(Node->Children[7] == 0); + } break; + + case OctreeNodeType_Transit: + { + Assert(Node->Children[0]); + Assert(Node->Children[1]); + Assert(Node->Children[2]); + Assert(Node->Children[3]); + Assert(Node->Children[4]); + Assert(Node->Children[5]); + Assert(Node->Children[6]); + Assert(Node->Children[7]); + } break; + } + if (Node->Children[0]) { Push(&Stack, Node->Children[0]); } if (Node->Children[1]) { Push(&Stack, Node->Children[1]); } if (Node->Children[2]) { Push(&Stack, Node->Children[2]); } diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 1b08ade49..e24990eb2 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -69,7 +69,7 @@ ChunkIsGarbage(world_chunk* Chunk) } link_internal void -AllocateWorldChunk(world_chunk *Result, world_position WorldP, chunk_dimension Dim, memory_arena *Storage) +AllocateWorldChunk(world_chunk *Result, v3i WorldP, v3i Dim, v3i DimInChunks, memory_arena *Storage) { u32 MaxLodMeshVerts = POINT_BUFFER_SIZE*3; @@ -77,6 +77,7 @@ AllocateWorldChunk(world_chunk *Result, world_position WorldP, chunk_dimension D Result->WorldP = WorldP; Result->Dim = Dim; + Result->DimInChunks = DimInChunks; /* Result->DimX = SafeTruncateU8(Dim.x); */ /* Result->DimY = SafeTruncateU8(Dim.y); */ /* Result->DimZ = SafeTruncateU8(Dim.z); */ @@ -85,10 +86,10 @@ AllocateWorldChunk(world_chunk *Result, world_position WorldP, chunk_dimension D } link_internal world_chunk * -AllocateWorldChunk(world_position WorldP, chunk_dimension Dim, memory_arena *Storage) +AllocateWorldChunk(v3i WorldP, v3i Dim, v3i DimInChunks, memory_arena *Storage) { world_chunk *Result = AllocateAlignedProtection(world_chunk, Storage, 1, CACHE_LINE_SIZE, false); - AllocateWorldChunk(Result, WorldP, Dim, Storage); + AllocateWorldChunk(Result, WorldP, Dim, DimInChunks, Storage); return Result; } @@ -192,7 +193,10 @@ AllocateAndInsertChunk(world *World, world_position P) { TIMED_FUNCTION(); + NotImplemented; + world_chunk *Result = 0; +#if 0 if (IsInsideVisibleRegion(World, P)) { @@ -219,6 +223,7 @@ AllocateAndInsertChunk(world *World, world_position P) } } +#endif return Result; } @@ -242,7 +247,7 @@ GetFreeWorldChunk(world *World) else { /* Info("Allocated World Chunk"); */ - Result = AllocateWorldChunk({}, World->ChunkDim, World->ChunkMemory); + Result = AllocateWorldChunk({}, World->ChunkDim, {}, World->ChunkMemory); Assert(Result->Flags == Chunk_Uninitialized); } @@ -707,7 +712,7 @@ Terrain_FBM2D( world_chunk *Chunk, u32 Octaves = *(u32*)OctaveCount; for ( s32 z = 0; z < Dim.z; ++ z) { - s64 WorldZ = z - SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z); + s64 WorldZ = (Chunk->DimInChunks.z/2) + (z*Chunk->DimInChunks.z) + (Chunk->WorldP.z*WorldChunkDim.z) - SrcToDest.z ; s64 WorldZBiased = WorldZ - zMin; /* s64 WorldZ = z + NoiseBasis.z; */ /* s64 WorldZBiased = WorldZ - zMin; */ @@ -724,7 +729,8 @@ Terrain_FBM2D( world_chunk *Chunk, s32 InteriorAmp = Amplitude; for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { - v3 NoiseInput = MapWorldPositionToNoiseInputValue(V3(NoiseBasis), V3(x,y,z), IPeriod); + Assert(Chunk->DimInChunks > V3i(0)); + v3 NoiseInput = MapWorldPositionToNoiseInputValue(V3(NoiseBasis), V3(x,y,z)*V3(Chunk->DimInChunks) + Chunk->DimInChunks/2.f, IPeriod) ; r32 Warp = 0.f; r32 N = PerlinNoise(NoiseInput+Warp); @@ -3665,7 +3671,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, v3i SynChunkP = DestChunk->WorldP; - world_chunk *SyntheticChunk = AllocateWorldChunk(SynChunkP, SynChunkDim, Thread->TempMemory); + world_chunk *SyntheticChunk = AllocateWorldChunk(SynChunkP, SynChunkDim, DestChunk->DimInChunks, Thread->TempMemory); // Map to absolute space. Very bad, no good, do not try this at home. @@ -4368,6 +4374,7 @@ MousePickVoxel(engine_resources *Resources) UNPACK_ENGINE_RESOURCES(Resources); +#if 0 maybe_ray MaybeRay = Resources->MaybeMouseRay; if (MaybeRay.Tag == Maybe_Yes) { @@ -4382,6 +4389,7 @@ MousePickVoxel(engine_resources *Resources) Result.Value = RayResult; } } +#endif return Result; } diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 784a9adc4..bd9c6f35b 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -579,10 +579,10 @@ global_variable v3i Global_ChunkApronMaxDim = V3i(1,1,3); struct mesh_freelist; link_internal void -AllocateWorldChunk(world_chunk *Result, world_position WorldP, chunk_dimension Dim, memory_arena *Storage); +AllocateWorldChunk(world_chunk *Result, v3i WorldP, v3i Dim, v3i DimInChunks, memory_arena *Storage); link_internal world_chunk * -AllocateWorldChunk(world_position WorldP, chunk_dimension Dim, memory_arena *Storage); +AllocateWorldChunk(v3i WorldP, v3i Dim, v3i DimInChunks, memory_arena *Storage); link_internal void BufferWorld(platform* Plat, untextured_3d_geometry_buffer*, untextured_3d_geometry_buffer*, world* World, graphics *Graphics, heap_allocator *Heap); From 4c07995f585cf75db1f20407a22beb1fe4e8bad2 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Sep 2024 19:11:11 -0700 Subject: [PATCH 009/421] Start wading into terrain_gen --- examples/terrain_gen/game.cpp | 4 ++-- examples/terrain_gen/game_constants.h | 5 +++-- jesse.bonsai.rdbg | Bin 13286 -> 13422 bytes jesse.make.sh | 2 +- src/engine/entity.cpp | 4 +++- src/engine/terrain.cpp | 6 +++--- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 018a58fa0..c796c69e6 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -708,7 +708,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() world_position WorldCenter = {}; canonical_position CameraTargetP = {}; - StandardCamera(Graphics->Camera, 10000.0f, 5000.0f); + StandardCamera(Graphics->Camera, 100000.0f, 5000.0f); AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); @@ -727,7 +727,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* CameraGhost->P.WorldP = V3i(-25, -75, 2); */ /* CameraGhost->P.WorldP = V3i(-5, -121, 2); */ - CameraGhost->P.WorldP = V3i(330, -87, 2); + /* CameraGhost->P.WorldP = V3i(330, -87, 2); */ /* CameraGhost->P.WorldP = V3i(33, -87, 2); */ /* CameraGhost->P.WorldP = V3i(5, -73, 2); */ CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 9e2a3b117..dbb37846c 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -10,7 +10,8 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(120, 120, 6); */ -/* g_VisibleRegion = Chunk_Dimension(64, 64, 16); */ +g_VisibleRegion = Chunk_Dimension(128, 128, 128); +/* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(80, 80, 8); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 8); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 6); */ @@ -21,7 +22,7 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(32, 32, 4); */ /* g_VisibleRegion = Chunk_Dimension(24, 24, 4); */ /* g_VisibleRegion = Chunk_Dimension(24, 24, 6); */ -g_VisibleRegion = Chunk_Dimension(24, 24, 8); +/* g_VisibleRegion = Chunk_Dimension(24, 24, 8); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 8); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 6); */ /* g_VisibleRegion = Chunk_Dimension(10, 10, 10); */ diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index cb9adbf12f0bba7781ce250da0ba9d5f4cfaaa99..45d914d68efb7b48a6b0c35a432dd5939ae59f51 100644 GIT binary patch delta 2196 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.z); + s64 WorldZ = (Chunk->DimInChunks.z/2) + (z*Chunk->DimInChunks.z) + (Chunk->WorldP.z*WorldChunkDim.z) + SrcToDest.z ; s64 WorldZSubZMin = WorldZ - zMin; for ( s32 y = 0; y < Dim.y; ++ y) { - s64 WorldY = y + SrcToDest.y + (WorldChunkDim.y*Chunk->WorldP.y); + s64 WorldY = (Chunk->DimInChunks.y/2) + (y*Chunk->DimInChunks.y) + SrcToDest.y + (WorldChunkDim.y*Chunk->WorldP.y); for ( s32 x = 0; x < Dim.x; ++ x) { - s64 WorldX = x + SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); + s64 WorldX = (Chunk->DimInChunks.x/2) + (x*Chunk->DimInChunks.x) + SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); s32 VoxIndex = GetIndex(V3i(x,y,z), Dim); r32 NoiseValue = ((Sin(r32(WorldX)/Period.x)+1.f)/2.f) + ((Cos(r32(WorldY)/Period.y)+1.f)/4.f); From de4fad181ec87d20db1f2fa89c3522a19bd48695 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Sep 2024 19:26:49 -0700 Subject: [PATCH 010/421] Fixed SinCos terrain --- generated/do_editor_ui_for_compound_type_world.h | 15 +++++++++++++++ src/engine/terrain.cpp | 13 +++---------- src/engine/world.cpp | 11 +++++++++-- src/engine/world.h | 1 + 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 7dd900e04..7af5c5475 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -101,6 +101,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node_freelist*,&Element->OctreeNodeDeferFreelist), + CSz("OctreeNodeDeferFreelist"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index b8422d2e3..e98a86ae1 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -2238,9 +2238,6 @@ Terrain_SinCos( world_chunk *Chunk, u32 ChunkSum = 0; - s32 MinZ = Chunk->WorldP.z*WorldChunkDim.z; - s32 MaxZ = MinZ+WorldChunkDim.z ; - for ( s32 z = 0; z < Dim.z; ++ z) { s64 WorldZ = (Chunk->DimInChunks.z/2) + (z*Chunk->DimInChunks.z) + (Chunk->WorldP.z*WorldChunkDim.z) + SrcToDest.z ; @@ -2262,21 +2259,17 @@ Terrain_SinCos( world_chunk *Chunk, } } -/* s64 ChunkWorldZThresh = SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z) - zMin; */ -/* NotImplemented; */ -/* /1* ComputeNormalsForChunkFromNoiseValues(ChunkWorldZThresh, NoiseValues, Normals); *1/ */ - for ( s32 z = 0; z < Dim.z; ++ z) { - s64 WorldZ = z + SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z); + s64 WorldZ = (Chunk->DimInChunks.z/2) + (z*Chunk->DimInChunks.z) + (Chunk->WorldP.z*WorldChunkDim.z) + SrcToDest.z ; s64 WorldZSubZMin = WorldZ - zMin; for ( s32 y = 0; y < Dim.y; ++ y) { - s64 WorldY = y + SrcToDest.y + (WorldChunkDim.y*Chunk->WorldP.y); + s64 WorldY = (Chunk->DimInChunks.y/2) + (y*Chunk->DimInChunks.y) + SrcToDest.y + (WorldChunkDim.y*Chunk->WorldP.y); for ( s32 x = 0; x < Dim.x; ++ x) { - s64 WorldX = x + SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); + s64 WorldX = (Chunk->DimInChunks.x/2) + (x*Chunk->DimInChunks.x) + SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); s32 VoxIndex = GetIndex(V3i(x,y,z), Dim); r32 *NoiseValue = NoiseValues+VoxIndex; diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 07969d596..54f6af5b0 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -299,8 +299,15 @@ CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) case OctreeNodeType_Leaf: { - DeallocateAndClearWorldChunk(Engine, &Node->Chunk); - Free(&Engine->World->OctreeNodeFreelist, Node); + if (Node->Chunk.Flags & Chunk_Queued) + { + Free(&Engine->World->OctreeNodeDeferFreelist, Node); + } + else + { + DeallocateAndClearWorldChunk(Engine, &Node->Chunk); + Free(&Engine->World->OctreeNodeFreelist, Node); + } } break; case OctreeNodeType_Transit: diff --git a/src/engine/world.h b/src/engine/world.h index fd98c3d98..b6f935cdb 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -46,6 +46,7 @@ struct world octree_node Root; memory_arena OctreeMemory; octree_node_freelist OctreeNodeFreelist; + octree_node_freelist OctreeNodeDeferFreelist; // Chunks that were queued, to be freed later. bonsai_futex ChunkFreelistFutex; poof(@ui_skip) From 3dd97cc39284dfcaf78b41e86dda5729cbd6dc95 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Sep 2024 20:05:43 -0700 Subject: [PATCH 011/421] Defer free chunks --- src/engine/world.cpp | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 54f6af5b0..446896865 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -301,7 +301,15 @@ CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) { if (Node->Chunk.Flags & Chunk_Queued) { - Free(&Engine->World->OctreeNodeDeferFreelist, Node); + if ((Node->Chunk.Flags&Chunk_Deallocate) == 0) + { + { + octree_node *TestNode = Engine->World->OctreeNodeDeferFreelist.First; + while (TestNode) { Assert(TestNode != Node); TestNode = TestNode->Next; } + } + Node->Chunk.Flags = chunk_flag(Node->Chunk.Flags|Chunk_Deallocate); + Free(&Engine->World->OctreeNodeDeferFreelist, Node); + } } else { @@ -356,6 +364,33 @@ MaintainWorldOctree(engine_resources *Engine) b32 Continue = True; u32 ChunksQueued = 0; + + + // Free deferred chunks that are complete + { + while (World->OctreeNodeDeferFreelist.First) + { + octree_node *Node = World->OctreeNodeDeferFreelist.First; + octree_node *Next = Node->Next; + + if (Node->Chunk.Flags & Chunk_Queued) + { + break; + } + else + { + DeallocateAndClearWorldChunk(Engine, &Node->Chunk); + Free(&World->OctreeNodeFreelist, Node); + + } + + Node = Next; + World->OctreeNodeDeferFreelist.First = Node; + } + } + + + octree_node_ptr_stack Stack = OctreeNodePtrStack(1024, &World->OctreeMemory); Push(&Stack, &World->Root); From c085f8c6df05ad9f9b53ce4d07fb1bf23cf437f4 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 12 Sep 2024 12:03:01 -0700 Subject: [PATCH 012/421] Tweaks for getting FBM2D more working --- examples/terrain_gen/game.cpp | 14 ++++++++------ examples/terrain_gen/game_constants.h | 6 ++++-- generated/anonymous_input_5Nt8cwGP.h | 2 +- generated/anonymous_input_nPw6miGy.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- ...sh_functions_untextured_3d_geometry_buffer_v3.h | 2 +- ...functions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- jesse.make.sh | 2 +- shaders/Lighting.fragmentshader | 2 +- src/engine/terrain.h | 2 ++ src/engine/world.cpp | 3 ++- src/engine/world_chunk.cpp | 2 ++ 12 files changed, 25 insertions(+), 16 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index c796c69e6..1992079fb 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -452,10 +452,10 @@ BONSAI_API_WORKER_THREAD_CALLBACK() case TerrainGenType_FBM2D: { // FBM params - v3 Period = V3(300); - s32 Amplititude = 220; - s32 StartingZDepth = -200; - u32 Octaves = 4; + v3 Period = V3(18000); + s32 Amplititude = 10000; + s32 StartingZDepth = 200; + u32 Octaves = 6; /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; v3 Color = RGB_GRASS_GREEN; @@ -567,7 +567,7 @@ BONSAI_API_WORKER_THREAD_CALLBACK() // Custom FBM noise example generating slightly-more-complex game-world-like terrain v3 Period = V3(0); // Ignored s32 Amplititude = 0; // Ignored - s32 StartingZDepth = -100; + s32 StartingZDepth = 100; u32 OctaveCount = 1; octave_buffer OctaveBuf = { OctaveCount, {} }; @@ -716,7 +716,9 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* GameState->TerrainGenType = TerrainGenType_GrassyTerracedTerrain; */ - GameState->TerrainGenType = TerrainGenType_SinCos; + /* GameState->TerrainGenType = TerrainGenType_SinCos; */ + /* GameState->TerrainGenType = TerrainGenType_TerracedTerrain; */ + GameState->TerrainGenType = TerrainGenType_FBM2D; /* GameState->TerrainGenType = TerrainGenType_GrassyTerracedTerrain4; */ /* GameState->TerrainGenType = TerrainGenType_Voronoi; */ /* World->Center = V3i(-22, 101, 1); */ diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index dbb37846c..4c7711bd2 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -9,8 +9,10 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); #else global_variable chunk_dimension -/* g_VisibleRegion = Chunk_Dimension(120, 120, 6); */ -g_VisibleRegion = Chunk_Dimension(128, 128, 128); +g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); +/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); */ +/* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ +/* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(80, 80, 8); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 8); */ diff --git a/generated/anonymous_input_5Nt8cwGP.h b/generated/anonymous_input_5Nt8cwGP.h index 8c01ef416..86adfdaa5 100644 --- a/generated/anonymous_input_5Nt8cwGP.h +++ b/generated/anonymous_input_5Nt8cwGP.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:411:0 +// external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:420:0 BindKeyupToInput(VK_RETURN, Enter); diff --git a/generated/anonymous_input_nPw6miGy.h b/generated/anonymous_input_nPw6miGy.h index 70b7fef67..4b7d3cde4 100644 --- a/generated/anonymous_input_nPw6miGy.h +++ b/generated/anonymous_input_nPw6miGy.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:439:0 +// external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:448:0 BindKeydownToInput(VK_RETURN, Enter); diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index c62fdf466..a096095d2 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3066:0 +// src/engine/world_chunk.cpp:3068:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 7255380fe..8ff42f79f 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2097:0 +// src/engine/world_chunk.cpp:2099:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 1854072fe..5aca5ef33 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2100:0 +// src/engine/world_chunk.cpp:2102:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, diff --git a/jesse.make.sh b/jesse.make.sh index 1a93e0230..a405a5f0e 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/Lighting.fragmentshader b/shaders/Lighting.fragmentshader index 0f6d3d7b4..ef4eb6265 100644 --- a/shaders/Lighting.fragmentshader +++ b/shaders/Lighting.fragmentshader @@ -303,7 +303,7 @@ void main() */ // TODO(Jesse): Can do squared? float DistanceToFrag = distance(CameraP, FragWorldP); - float MaxFogDist = 20000.f; + float MaxFogDist = 200000.f; float FogContrib = clamp( DistanceToFrag / MaxFogDist, 0.f, 1.f); v3 Fog = FogContrib * FogColor * FogPower; diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 58daf436b..b1c733c27 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -1,3 +1,5 @@ +#define COMPUTE_NOISE_INPUT(channel_name, chunk) (chunk->DimInChunks.channel_name/2) + (channel_name*chunk->DimInChunks.channel_name) + (chunk->WorldP.channel_name*WorldChunkDim.channel_name) + SrcToDest.channel_name + struct noise_value_to_material_index { diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 446896865..5388227b7 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -322,6 +322,7 @@ CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) { MergeOctreeChildren(Engine, Node); } break; + } } @@ -355,7 +356,7 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) // TODO(Jesse): Definitely compute this from the number of worker threads available on the system -#define MAX_WORLD_CHUNKS_QUEUED_PER_FRAME (16) +#define MAX_WORLD_CHUNKS_QUEUED_PER_FRAME (128) link_internal void MaintainWorldOctree(engine_resources *Engine) { diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index e24990eb2..719e7a7ed 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -674,6 +674,7 @@ Terrain_FBM2D( world_chunk *Chunk, u32 ChunkSum = 0; +#if 0 s32 MinZ = Chunk->WorldP.z*WorldChunkDim.z; s32 MaxZ = MinZ+WorldChunkDim.z ; @@ -690,6 +691,7 @@ Terrain_FBM2D( world_chunk *Chunk, if (MinZ > Amplitude) return ChunkSum; +#endif #if VOXEL_DEBUG_COLOR memory_arena *TempArena = GetThreadLocalState(ThreadLocal_ThreadIndex)->PermMemory; From 545712357af98564b695a917bb5ca4ddf0c25aec Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 12 Sep 2024 12:03:53 -0700 Subject: [PATCH 013/421] Update stdlib --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 0bb9e8257..c6c789bde 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 0bb9e8257f7e214cc86364314c6311820e21cef1 +Subproject commit c6c789bde5c532a440497b4528de6cc577e1c5e3 From 9d66d17210426efc0b03d11289feed696dd6a931 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 14 Sep 2024 05:45:49 -0700 Subject: [PATCH 014/421] Octree splitting w/ arbitrary distance condition working --- examples/terrain_gen/game.cpp | 2 +- examples/terrain_gen/game_constants.h | 5 +- generated/are_equal_octree_node.h | 2 +- generated/are_equal_rect3cp.h | 2 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + generated/freelist_allocator_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- generated/maybe_standing_spot.h | 2 +- src/engine/canonical_position.cpp | 27 ++ src/engine/canonical_position.h | 11 + src/engine/debug_draw.cpp | 2 +- src/engine/mesh.h | 4 +- src/engine/world.cpp | 380 ++++++++++++------ src/engine/world.h | 20 +- src/engine/world_chunk.cpp | 3 +- src/engine/world_chunk.h | 3 + src/game_loader.cpp | 2 + 25 files changed, 349 insertions(+), 135 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 1992079fb..0b441dd56 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -455,7 +455,7 @@ BONSAI_API_WORKER_THREAD_CALLBACK() v3 Period = V3(18000); s32 Amplititude = 10000; s32 StartingZDepth = 200; - u32 Octaves = 6; + u32 Octaves = 4; /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; v3 Color = RGB_GRASS_GREEN; diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 4c7711bd2..73d439edd 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -9,11 +9,14 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); #else global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); +g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); +/* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ +/* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ +/* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(80, 80, 8); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 8); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 6); */ diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index dc7657f16..f6f4ce531 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:28:0 +// src/engine/world.h:26:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/are_equal_rect3cp.h b/generated/are_equal_rect3cp.h index 14e4a3526..d9566f96b 100644 --- a/generated/are_equal_rect3cp.h +++ b/generated/are_equal_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/canonical_position.h:243:0 +// src/engine/canonical_position.h:254:0 link_internal b32 AreEqual(rect3cp *Thing1, rect3cp *Thing2) diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index de3bc77ea..b275eadaa 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:461:0 +// src/engine/world_chunk.h:464:0 struct world_chunk_ptr_block { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 025a9fdb2..434a7597a 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:502:0 +// src/engine/world_chunk.h:505:0 struct standing_spot_block { diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index f836b71b8..0ee6a7de2 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:529:0 +// src/engine/world_chunk.h:532:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index 3c6ef878c..866616d7c 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:458:0 +// src/engine/world_chunk.h:461:0 struct world_chunk_ptr_buffer { diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index baef5bafc..f59412ef4 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -640,6 +640,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index ddd6ea254..56ab4b97b 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -630,6 +630,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 5d818d85b..ee9de101d 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -630,6 +630,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index 2dd1cce8a..b960cc8b7 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:33:0 +// src/engine/world.h:31:0 struct octree_node_freelist { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index 874ceea75..5ab696ff3 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:30:0 +// src/engine/world.h:28:0 struct octree_node_ptr_stack { diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 3081b64f9..96ae0f164 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:535:0 +// src/engine/world_chunk.h:538:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index c97072484..40349ed7a 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:532:0 +// src/engine/world_chunk.h:535:0 struct standing_spot_stream_chunk { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 37662c7a8..79424258b 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:499:0 +// src/engine/world_chunk.h:502:0 struct maybe_standing_spot { diff --git a/src/engine/canonical_position.cpp b/src/engine/canonical_position.cpp index 986bd14ed..7a550fc16 100644 --- a/src/engine/canonical_position.cpp +++ b/src/engine/canonical_position.cpp @@ -33,6 +33,33 @@ Canonicalize( world *World, canonical_position *P) *P = Canonicalize(World->ChunkDim, P->Offset, P->WorldP); } +// Canonical add +link_internal cp +CAdd(world *World, cp P1, cp P2) +{ + cp Result = { + P1.Offset + P2.Offset, + P1.WorldP + P2.WorldP + }; + + Canonicalize(World, &Result); + return Result; +} + +// Canonical add +link_internal cp +CSub(world *World, cp P1, cp P2) +{ + cp Result = { + P1.Offset - P2.Offset, + P1.WorldP - P2.WorldP + }; + + Canonicalize(World, &Result); + return Result; +} + + link_internal cp SimSpaceToCanonical(world *World, v3 P) { diff --git a/src/engine/canonical_position.h b/src/engine/canonical_position.h index 7bf00e3f5..032ce3683 100644 --- a/src/engine/canonical_position.h +++ b/src/engine/canonical_position.h @@ -168,6 +168,16 @@ operator+(canonical_position A, v3 B) return Result; } +inline canonical_position +operator/(canonical_position A, s32 Int) +{ + canonical_position Result = A; + Result.Offset /= f32(Int); + Result.WorldP /= Int; + return Result; +} + + inline canonical_position& operator+=(canonical_position& A, float B) { @@ -234,6 +244,7 @@ operator<=(cp P1, cp P2) + struct rect3cp { cp Min; diff --git a/src/engine/debug_draw.cpp b/src/engine/debug_draw.cpp index 95f40af1e..45c7a6ec9 100644 --- a/src/engine/debug_draw.cpp +++ b/src/engine/debug_draw.cpp @@ -294,7 +294,7 @@ DEBUG_DrawChunkAABB( untextured_3d_geometry_buffer *Mesh, graphics *Graphics, wo chunk_dimension WorldChunkDim, v3 RGBColor, r32 Thickness = DEFAULT_LINE_THICKNESS) { v3 MinP = GetRenderP(WorldChunkDim, Canonical_Position(V3(0,0,0), Chunk->WorldP), Graphics->Camera); - v3 MaxP = GetRenderP(WorldChunkDim, Canonical_Position(WorldChunkDim, Chunk->WorldP), Graphics->Camera); + v3 MaxP = GetRenderP(WorldChunkDim, Canonical_Position(WorldChunkDim*Chunk->DimInChunks, Chunk->WorldP), Graphics->Camera); DEBUG_DrawAABB(Mesh, MinP, MaxP, RGBColor, Thickness); diff --git a/src/engine/mesh.h b/src/engine/mesh.h index 372017ba8..cc0de4b15 100644 --- a/src/engine/mesh.h +++ b/src/engine/mesh.h @@ -739,9 +739,9 @@ DrawVoxel( untextured_3d_geometry_buffer *Mesh, v3 RenderP_VoxelCenter, u16 Pack } inline void -DrawVoxel( untextured_3d_geometry_buffer *Mesh, v3 RenderP_VoxelCenter, v3 HSVColor, v3 Diameter, v2 TransEmiss = V2(0.f, 0.f)) +DrawVoxel( untextured_3d_geometry_buffer *Mesh, v3 RenderP_VoxelCenter, v3 RGBColor, v3 Diameter, v2 TransEmiss = V2(0.f, 0.f)) { - DrawVoxel(Mesh, RenderP_VoxelCenter, PackHSVColor(HSVColor), Diameter, TransEmiss); + DrawVoxel(Mesh, RenderP_VoxelCenter, RGBtoPackedHSV(RGBColor), Diameter, TransEmiss); } inline void diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 5388227b7..8ff728a77 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -25,6 +25,9 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) World->Root.Type = OctreeNodeType_Leaf; AllocateWorldChunk(&World->Root.Chunk, {}, WorldChunkDim, VisibleRegion, World->ChunkMemory); + /* AllocateWorldChunk(&World->Root.Chunk, {}, WorldChunkDim, VisibleRegion, World->ChunkMemory); */ + + /* SplitOctreeNode(World, &Plat->LowPriority, EntityTable, Camera, &World->Root, &World->OctreeMemory); */ World->OctreeNodeFreelist.Memory = &World->OctreeMemory; @@ -209,6 +212,26 @@ GetBoundingBox(world *World, octree_node *Node) return Rect; } +link_internal rect3 +GetSimSpaceAABB(world *World, octree_node *Node) +{ + rect3cp CPRect = GetBoundingBox(World, Node); + rect3 Result = GetSimSpaceAABB(World, CPRect); + return Result; +} + +link_internal cp +GetCenter(world *World, octree_node *Node) +{ + cp Min = Canonical_Position(V3(0), Node->Chunk.WorldP); + cp Max = Canonicalize(World, Canonical_Position(V3(0), Node->Chunk.WorldP+Node->Chunk.DimInChunks)); + + cp Rad = (Max-Min)/2; + + cp Center = CAdd(World, Min, Rad); + return Center; +} + link_internal b32 ContainsCameraGhost(world *World, entity **EntityTable, octree_node *Node, camera *Camera) { @@ -248,40 +271,202 @@ ContainsCameraGhost(world *World, entity **EntityTable, octree_node *Node, camer link_internal void -InitOctreeNodeAndQueueChunkForInit(world *World, work_queue *Queue, octree_node *Node, v3i WorldP, v3i DimInChunks) +InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks) { Node->Type = OctreeNodeType_Leaf; - world_chunk *Chunk = &Node->Chunk; - AllocateWorldChunk(Chunk, WorldP, World->ChunkDim, DimInChunks, World->ChunkMemory); - QueueChunkForInit(Queue, Chunk, MeshBit_Lod0); + Chunk->WorldP = WorldP; + Chunk->DimInChunks = DimInChunks; } -link_internal u32 -SplitOctreeNode(world *World, work_queue *Queue, octree_node *Parent, memory_arena *Memory) +link_internal octree_node * +GetParentNodeFor(world *World, octree_node *QueryNode) +{ + rect3cp QueryBox = GetBoundingBox(World, QueryNode); + + v3i NodeWorldMidpoint = QueryBox.Min.WorldP + ((QueryBox.Max.WorldP - QueryBox.Min.WorldP)/2); + cp NodeMidpoint = Canonical_Position(V3(0.f), NodeWorldMidpoint); + + octree_node *Result = {}; + octree_node *Parent = {}; + octree_node *Current = &World->Root; + + b32 Done = False; + while (Done == False) + { + + { + rect3cp CurrentBox = GetBoundingBox(World, Current); + Assert (Contains(CurrentBox, NodeMidpoint)); + } + { + v3i CurrentToQuery = NodeMidpoint.WorldP - Current->Chunk.WorldP; + v3i Cell = CurrentToQuery / (Current->Chunk.DimInChunks/2); + Assert(Cell < V3i(2)); + + s32 Index = GetIndex(Cell, V3i(2)); Assert(Index < 8); + + switch(Current->Type) + { + InvalidCase(OctreeNodeType_Undefined); + + case OctreeNodeType_Leaf: + { + Assert(Current == &World->Root); + Done = True; + } break; + + case OctreeNodeType_Branch: + { + if ( Current->Children[Index] == QueryNode ) + { + Result = Current; + Done = True; + } + else + { + Current = Current->Children[Index]; + { + rect3cp CurrentBox = GetBoundingBox(World, Current); + Assert (Contains(CurrentBox, NodeMidpoint)); + } + } + + } break; + } + } + /* else */ + { + /* Done = True; */ + } + + } + + if (QueryNode != &World->Root) + { + Assert(Result); + } + return Result; +} + +link_internal void +DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats *Stats, world_chunk_ptr_paged_list *MainDrawList, world_chunk_ptr_paged_list *ShadowMapDrawList) { - Assert(Parent->Chunk.Dim % World->ChunkDim == V3i(0)); - Assert(Parent->Type == OctreeNodeType_Leaf); - Parent->Type = OctreeNodeType_Transit; + UNPACK_ENGINE_RESOURCES(Engine); - v3i ChildDimInChunks = Parent->Chunk.DimInChunks / 2; + Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); - RangeIterator(Index, s32(ArrayCount(Parent->Children))) + Assert (Node); { - Assert(Parent->Children[Index] == 0); + switch(Node->Type) + { + InvalidCase(OctreeNodeType_Undefined); - // NOTE(Jesse): This is used as a mask so we can drop out dimensions that are on the min edge - // when computing RelWorldP - v3i P = PositionFromIndex(Index, V3i(2,2,2)); - v3i RelWorldP = P * ChildDimInChunks; + case OctreeNodeType_Branch: + { + /* DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, 5.0f); */ + DrawOctreeRecursive(Engine, Node->Children[0], Stats, MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[1], Stats, MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[2], Stats, MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[3], Stats, MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[4], Stats, MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[5], Stats, MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[6], Stats, MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[7], Stats, MainDrawList, ShadowMapDrawList); + ++Stats->TotalBranches; + } break; + + case OctreeNodeType_Leaf: + { + /* DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_GREEN, 5.0f); */ - octree_node *Child = GetOrAllocate(&World->OctreeNodeFreelist); - Parent->Children[Index] = Child; + SyncGpuBuffersAsync(Engine, &Node->Chunk.Meshes); + world_chunk *Chunk = &Node->Chunk; + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); + ++Stats->TotalLeaves; + } break; - InitOctreeNodeAndQueueChunkForInit(World, Queue, Child, Parent->Chunk.WorldP + RelWorldP, ChildDimInChunks); + } } - return 8; + if (Node->Chunk.Flags & Chunk_Queued) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_RED, 8.0f); + ++Stats->TotalQueued; + } +} + +link_internal void +SplitOctreeNode_Recursive( engine_resources *Engine, octree_node *NodeToSplit, memory_arena *Memory) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + Assert(NodeToSplit->Chunk.Dim % World->ChunkDim == V3i(0)); + + Assert (NodeToSplit); + { + switch(NodeToSplit->Type) + { + InvalidCase(OctreeNodeType_Undefined); + + case OctreeNodeType_Branch: + { + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[0], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[1], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[2], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[3], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[4], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[5], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[6], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[7], Memory); + } break; + + case OctreeNodeType_Leaf: + { + if (OctreeLeafShouldSplit(World, EntityTable, GameCamera, NodeToSplit)) + { + NodeToSplit->Type = OctreeNodeType_Branch; + + v3i ChildDimInChunks = NodeToSplit->Chunk.DimInChunks / 2; + Assert(ChildDimInChunks >= V3i(1)); + + RangeIterator(Index, s32(ArrayCount(NodeToSplit->Children))) + { + Assert(NodeToSplit->Children[Index] == 0); + + // NOTE(Jesse): This is used as a mask so we can drop out dimensions that are on the min edge + // when computing RelWorldP + v3i P = PositionFromIndex(Index, V3i(2)); + Assert(P < V3i(2)); + v3i RelWorldP = P * ChildDimInChunks; + + octree_node *Child = GetOrAllocate(&World->OctreeNodeFreelist); + NodeToSplit->Children[Index] = Child; + InitOctreeNode(World, Child, NodeToSplit->Chunk.WorldP + RelWorldP, ChildDimInChunks); + + /* world_chunk *Chunk = &Child->Chunk; */ + /* AllocateWorldChunk(Chunk, Child->Chunk.WorldP + RelWorldP, World->ChunkDim, ChildDimInChunks, World->ChunkMemory); */ + + if (OctreeLeafShouldSplit(World, EntityTable, GameCamera, Child)) + { + SplitOctreeNode_Recursive(Engine, Child, Memory); + } + else + { + world_chunk *Chunk = &Child->Chunk; + Assert(Chunk->Flags == Chunk_Uninitialized); + AllocateWorldChunk(Chunk, Child->Chunk.WorldP, World->ChunkDim, ChildDimInChunks, World->ChunkMemory); + QueueChunkForInit(&Plat->LowPriority, &Child->Chunk, MeshBit_Lod0); + } + + } + } + + } break; + + } + } } link_internal u32 @@ -318,7 +503,7 @@ CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) } } break; - case OctreeNodeType_Transit: + case OctreeNodeType_Branch: { MergeOctreeChildren(Engine, Node); } break; @@ -332,13 +517,9 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) UNPACK_ENGINE_RESOURCES(Engine); Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); - Assert(Node->Type == OctreeNodeType_Transit); + Assert(Node->Type == OctreeNodeType_Branch); Node->Type = OctreeNodeType_Leaf; - u32 Result = False; - - v3i Dim = Node->Chunk.Dim; - CheckedDeallocateChildNode(Engine, Node->Children+0); CheckedDeallocateChildNode(Engine, Node->Children+1); CheckedDeallocateChildNode(Engine, Node->Children+2); @@ -350,10 +531,48 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); - return 1; + u32 Result = 1; + return Result; } +#if 0 +link_internal v3i +ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + rect3 Rect = GetSimSpaceAABB(World, Node); + + v3i Result = {}; + if (entity *Ghost = GetEntity(EntityTable, Camera->GhostId)) + { + v3 SimSpaceP = GetSimSpaceP(World, Ghost); + r32 Distance = DistanceToBox(SimSpaceP, Rect); + Result = Distance < 100 ? V3i(1) : V3i(100); + } + + return Result; +} +#endif + + +link_internal b32 +OctreeLeafShouldSplit(world *World, entity **EntityTable, camera *Camera, octree_node *Node) +{ + b32 Result = False; + rect3 Rect = GetSimSpaceAABB(World, Node); + + if (entity *Ghost = GetEntity(EntityTable, Camera->GhostId)) + { + v3 SimSpaceP = GetSimSpaceP(World, Ghost); + r32 Distance = DistanceToBox(SimSpaceP, Rect); + Result = (Node->Chunk.Flags & Chunk_Queued) == 0 && + (Node->Chunk.DimInChunks > V3i(1)) && + (Distance < 100.f); + } + return Result; +} // TODO(Jesse): Definitely compute this from the number of worker threads available on the system #define MAX_WORLD_CHUNKS_QUEUED_PER_FRAME (128) @@ -365,8 +584,6 @@ MaintainWorldOctree(engine_resources *Engine) b32 Continue = True; u32 ChunksQueued = 0; - - // Free deferred chunks that are complete { while (World->OctreeNodeDeferFreelist.First) @@ -407,85 +624,17 @@ MaintainWorldOctree(engine_resources *Engine) ShadowMapDrawList->Memory = GetTranArena(); } - /* RuntimeBreak(); */ - while (CurrentCount(&Stack) && (ChunksQueued < MAX_WORLD_CHUNKS_QUEUED_PER_FRAME) ) - { - octree_node *Node = Pop(&Stack); - - Assert(Node->Chunk.Dim == World->ChunkDim); - Assert(Node->Type); - Assert(Node->Chunk.DimInChunks >= V3i(1)); - - b32 OctreeNodeNeedsToSplit = (Node->Chunk.DimInChunks > V3i(1)); - OctreeNodeNeedsToSplit &= (Node->Type == OctreeNodeType_Leaf); - OctreeNodeNeedsToSplit &= (Node->Chunk.Flags & Chunk_Queued) == 0; - OctreeNodeNeedsToSplit &= ContainsCameraGhost(World, EntityTable, Node, GameCamera); - if (OctreeNodeNeedsToSplit) - { - ChunksQueued += SplitOctreeNode(World, &Plat->LowPriority, Node, &World->OctreeMemory); - } - - - - b32 OctreeChildrenNeedToMerge = Node->Type == OctreeNodeType_Transit; - OctreeChildrenNeedToMerge &= (Node->Chunk.Flags & Chunk_Queued) == 0; - OctreeChildrenNeedToMerge &= ContainsCameraGhost(World, EntityTable, Node, GameCamera) == False; - if (OctreeChildrenNeedToMerge) - { - ContainsCameraGhost(World, EntityTable, Node, Camera); - ChunksQueued += MergeOctreeChildren(Engine, Node); - } - if (Node->Type == OctreeNodeType_Leaf) - { - auto Chunk = &Node->Chunk; - SyncGpuBuffersAsync(Engine, &Chunk->Meshes); - Push(MainDrawList, &Chunk); - } + SplitOctreeNode_Recursive(Engine, &World->Root, &World->OctreeMemory); - switch(Node->Type) - { - InvalidCase(OctreeNodeType_Undefined); - - case OctreeNodeType_Leaf: - { - Assert(Node->Children[0] == 0); - Assert(Node->Children[1] == 0); - Assert(Node->Children[2] == 0); - Assert(Node->Children[3] == 0); - Assert(Node->Children[4] == 0); - Assert(Node->Children[5] == 0); - Assert(Node->Children[6] == 0); - Assert(Node->Children[7] == 0); - } break; - - case OctreeNodeType_Transit: - { - Assert(Node->Children[0]); - Assert(Node->Children[1]); - Assert(Node->Children[2]); - Assert(Node->Children[3]); - Assert(Node->Children[4]); - Assert(Node->Children[5]); - Assert(Node->Children[6]); - Assert(Node->Children[7]); - } break; - } - - if (Node->Children[0]) { Push(&Stack, Node->Children[0]); } - if (Node->Children[1]) { Push(&Stack, Node->Children[1]); } - if (Node->Children[2]) { Push(&Stack, Node->Children[2]); } - if (Node->Children[3]) { Push(&Stack, Node->Children[3]); } - if (Node->Children[4]) { Push(&Stack, Node->Children[4]); } - if (Node->Children[5]) { Push(&Stack, Node->Children[5]); } - if (Node->Children[6]) { Push(&Stack, Node->Children[6]); } - if (Node->Children[7]) { Push(&Stack, Node->Children[7]); } - } + octree_stats Stats = {}; + DrawOctreeRecursive(Engine, &World->Root, &Stats, MainDrawList, ShadowMapDrawList); + Info("TotalLeaves(%d) TotalBranches(%d) TotalQueued(%d) NewQueues(%d)", Stats.TotalLeaves, Stats.TotalBranches, Stats.TotalQueued, Stats.NewQueues); } link_internal octree_node * -GetWorldChunkFromOctree(world *World, v3i QueryP) +GetWorldChunkFromOctree(world *World, v3i WorldP) { octree_node *Result = {}; octree_node *Current = &World->Root; @@ -494,25 +643,30 @@ GetWorldChunkFromOctree(world *World, v3i QueryP) while (Done == False) { rect3cp Box = GetBoundingBox(World, Current); - if (Contains(Box, Canonical_Position(V3(0), QueryP))) + if (Contains(Box, Canonical_Position(V3(0), WorldP))) { - v3i CurrentToQuery = QueryP - Current->Chunk.WorldP; + v3i CurrentToQuery = WorldP - Current->Chunk.WorldP; v3i Cell = CurrentToQuery / Current->Chunk.DimInChunks; Assert(Cell < V3i(2)); s32 Index = GetIndex(Cell, V3i(2)); Assert(Index < 8); - if (Current->Type == OctreeNodeType_Transit) + switch(Current->Type) { - Current = Current->Children[Index]; - } - else - { - Assert (Current->Type == OctreeNodeType_Leaf); - Result = Current; - Done = True; - } + InvalidCase(OctreeNodeType_Undefined); + case OctreeNodeType_Leaf: + { + Assert (Current->Type == OctreeNodeType_Leaf); + Result = Current; + Done = True; + } break; + + case OctreeNodeType_Branch: + { + Current = Current->Children[Index]; + } break; + } } else { diff --git a/src/engine/world.h b/src/engine/world.h index b6f935cdb..4eb28bcdc 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -2,17 +2,15 @@ enum octree_node_type { OctreeNodeType_Undefined, - OctreeNodeType_Transit, - OctreeNodeType_Leaf, + OctreeNodeType_Branch, // Interior edge + /* OctreeNodeType_Twig, // Edge directly connected to leaf */ + OctreeNodeType_Leaf, // .. leaf }; struct octree_node { octree_node_type Type; - // This is the world-space dimension of the node, in chunks - /* v3i DimInChunks; */ - // TODO(Jesse): Maybe make this a pointer ..? world_chunk Chunk; @@ -59,6 +57,15 @@ struct world }; +struct octree_stats +{ + s32 NewQueues = 0; + s32 TotalQueued = 0; + s32 TotalLeaves = 0; + s32 TotalBranches = 0; +}; + + inline canonical_position Canonicalize( world *World, canonical_position CP ) @@ -191,3 +198,6 @@ GatherRangesOverlapping(world *World, rect3i SimSpaceAABB, world_chunk_ptr_buffe link_internal octree_node * GetWorldChunkFromOctree(world *World, v3i QueryP); + +link_internal b32 +OctreeLeafShouldSplit(world *World, entity **EntityTable, camera *Camera, octree_node *Node); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 719e7a7ed..3306b56fb 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3634,6 +3634,7 @@ RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOff // NOTE(Jesse): Chunk flags modified by caller; this routine gets called multiple times per job } + link_internal void InitializeChunkWithNoise( chunk_init_callback NoiseCallback, thread_local_state *Thread, @@ -3921,7 +3922,7 @@ DebugHighlightWorldChunkBasedOnState(graphics *Graphics, world_chunk *Chunk, unt } #endif #if 0 - v3 RGBColor = 0; + v3 RGBColor = {}; if (Chunk) { diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index bd9c6f35b..1f6411ccc 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -350,7 +350,10 @@ struct world_chunk poof(@version(1)) voxel_position_cursor StandingSpots; poof(@no_serialize) + // TODO(Jesse): Rename v3i DimInChunks; + /* v3i Resolution; */ + v3i WorldP; s32 FilledCount; poof(@no_serialize) diff --git a/src/game_loader.cpp b/src/game_loader.cpp index 5ac109ad7..023e512e5 100644 --- a/src/game_loader.cpp +++ b/src/game_loader.cpp @@ -235,6 +235,8 @@ main( s32 ArgCount, const char ** Args ) * Main Game loop */ + /* SleepMs(2000); */ + r32 LastMs = 0; while (Os->ContinueRunning) { From 2cbf92e5a34666ff7176cc65cfa2677c9590595a Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 14 Sep 2024 08:06:04 -0700 Subject: [PATCH 015/421] Cleanup split/collapse logic --- examples/terrain_gen/game.cpp | 6 +- examples/terrain_gen/game_constants.h | 42 ++------ external/bonsai_stdlib | 2 +- src/engine/world.cpp | 137 ++++++++++++++++---------- src/engine/world.h | 5 +- 5 files changed, 101 insertions(+), 91 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 0b441dd56..3a7666946 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -454,8 +454,8 @@ BONSAI_API_WORKER_THREAD_CALLBACK() // FBM params v3 Period = V3(18000); s32 Amplititude = 10000; - s32 StartingZDepth = 200; - u32 Octaves = 4; + s32 StartingZDepth = 100; + u32 Octaves = 6; /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; v3 Color = RGB_GRASS_GREEN; @@ -708,7 +708,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() world_position WorldCenter = {}; canonical_position CameraTargetP = {}; - StandardCamera(Graphics->Camera, 100000.0f, 5000.0f); + StandardCamera(Graphics->Camera, 200000.0f, 50000.0f); AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 73d439edd..17a93a03d 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -9,45 +9,17 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); #else global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); -/* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ -/* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); */ -/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); */ +/* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); */ +g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); +/* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ +/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ -/* g_VisibleRegion = Chunk_Dimension(80, 80, 8); */ -/* g_VisibleRegion = Chunk_Dimension(64, 64, 8); */ -/* g_VisibleRegion = Chunk_Dimension(64, 64, 6); */ -/* g_VisibleRegion = Chunk_Dimension(32, 32, 16); */ -/* g_VisibleRegion = Chunk_Dimension(32, 32, 10); */ -/* g_VisibleRegion = Chunk_Dimension(32, 32, 8); */ -/* g_VisibleRegion = Chunk_Dimension(32, 32, 6); */ -/* g_VisibleRegion = Chunk_Dimension(32, 32, 4); */ -/* g_VisibleRegion = Chunk_Dimension(24, 24, 4); */ -/* g_VisibleRegion = Chunk_Dimension(24, 24, 6); */ -/* g_VisibleRegion = Chunk_Dimension(24, 24, 8); */ -/* g_VisibleRegion = Chunk_Dimension(16, 16, 8); */ -/* g_VisibleRegion = Chunk_Dimension(16, 16, 6); */ -/* g_VisibleRegion = Chunk_Dimension(10, 10, 10); */ -/* g_VisibleRegion = Chunk_Dimension(8, 8, 6); */ - - -/* global_variable chunk_dimension */ -/* WORLD_CHUNK_DIM = Chunk_Dimension(16, 16, 16); */ - -/* global_variable chunk_dimension */ -/* WORLD_CHUNK_DIM = Chunk_Dimension(16, 16, 16); */ - -/* global_variable chunk_dimension */ -/* WORLD_CHUNK_DIM = Chunk_Dimension(28, 28, 28); */ - -/* global_variable chunk_dimension */ -/* WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 32); */ - -/* global_variable chunk_dimension */ -/* WORLD_CHUNK_DIM = Chunk_Dimension(64, 64, 64); */ +/* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ +/* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ + global_variable chunk_dimension diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index c6c789bde..2a7ae98e0 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit c6c789bde5c532a440497b4528de6cc577e1c5e3 +Subproject commit 2a7ae98e019246044279f7a86ab590e4e830d6a4 diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 8ff728a77..b43e6fb3b 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -356,6 +356,7 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); + f32 AABBLineDim = Max(1.f, Node->Chunk.DimInChunks.x/12.f); Assert (Node); { switch(Node->Type) @@ -364,7 +365,7 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * case OctreeNodeType_Branch: { - /* DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, 5.0f); */ + /* DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); */ DrawOctreeRecursive(Engine, Node->Children[0], Stats, MainDrawList, ShadowMapDrawList); DrawOctreeRecursive(Engine, Node->Children[1], Stats, MainDrawList, ShadowMapDrawList); DrawOctreeRecursive(Engine, Node->Children[2], Stats, MainDrawList, ShadowMapDrawList); @@ -378,7 +379,7 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * case OctreeNodeType_Leaf: { - /* DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_GREEN, 5.0f); */ + /* DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); */ SyncGpuBuffersAsync(Engine, &Node->Chunk.Meshes); world_chunk *Chunk = &Node->Chunk; @@ -392,11 +393,75 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * if (Node->Chunk.Flags & Chunk_Queued) { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_RED, 8.0f); + /* DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_RED, AABBLineDim*2.f); */ ++Stats->TotalQueued; } } +link_internal v3i +ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + v3i Result = {}; + + if (entity *Ghost = GetEntity(EntityTable, Camera->GhostId)) + { + rect3 NodeRect = GetSimSpaceAABB(World, Node); + v3 GhostP = GetSimSpaceP(World, Ghost); + r32 Distance = DistanceToBox(GhostP, NodeRect); + s32 DistanceInChunks = s32(Distance) / s32(World->ChunkDim.x); + + Result = Max(V3i(1), V3i(DistanceInChunks / 2)); + /* Result = V3i(DistanceInChunks); */ + } + + return Result; +} +link_internal b32 +OctreeBranchShouldCollapse(engine_resources *Engine, octree_node *Node) +{ + UNPACK_ENGINE_RESOURCES(Engine); + Assert(Node->Type == OctreeNodeType_Branch); + + b32 Result = False; + if (Node->Chunk.Flags & Chunk_Queued) return Result; + + if (entity *Ghost = GetEntity(EntityTable, Camera->GhostId)) + { + v3i Res = ComputeNodeDesiredResolution(Engine, Node); + if (Res > Node->Chunk.DimInChunks) + { + Result = True; + } + } + return Result; +} + +link_internal b32 +OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) +{ + UNPACK_ENGINE_RESOURCES(Engine); + Assert(Node->Type == OctreeNodeType_Leaf); + + b32 Result = False; + if (Node->Chunk.Flags & Chunk_Queued) return Result; + + if (entity *Ghost = GetEntity(EntityTable, Camera->GhostId)) + { + if (Node->Chunk.DimInChunks > V3i(1)) + { + v3i Res = ComputeNodeDesiredResolution(Engine, Node); + if (Res < Node->Chunk.DimInChunks) + { + Result = True; + } + } + } + return Result; +} + + link_internal void SplitOctreeNode_Recursive( engine_resources *Engine, octree_node *NodeToSplit, memory_arena *Memory) { @@ -412,19 +477,26 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node *NodeToSplit, m case OctreeNodeType_Branch: { - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[0], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[1], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[2], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[3], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[4], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[5], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[6], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[7], Memory); + if (OctreeBranchShouldCollapse(Engine, NodeToSplit)) + { + MergeOctreeChildren(Engine, NodeToSplit); + } + else + { + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[0], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[1], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[2], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[3], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[4], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[5], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[6], Memory); + SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[7], Memory); + } } break; case OctreeNodeType_Leaf: { - if (OctreeLeafShouldSplit(World, EntityTable, GameCamera, NodeToSplit)) + if (OctreeLeafShouldSplit(Engine, NodeToSplit)) { NodeToSplit->Type = OctreeNodeType_Branch; @@ -448,7 +520,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node *NodeToSplit, m /* world_chunk *Chunk = &Child->Chunk; */ /* AllocateWorldChunk(Chunk, Child->Chunk.WorldP + RelWorldP, World->ChunkDim, ChildDimInChunks, World->ChunkMemory); */ - if (OctreeLeafShouldSplit(World, EntityTable, GameCamera, Child)) + if (OctreeLeafShouldSplit(Engine, Child)) { SplitOctreeNode_Recursive(Engine, Child, Memory); } @@ -469,9 +541,6 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node *NodeToSplit, m } } -link_internal u32 -MergeOctreeChildren(engine_resources *Engine, octree_node *Node); - link_internal void CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) { @@ -536,44 +605,10 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) } -#if 0 -link_internal v3i -ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) -{ - UNPACK_ENGINE_RESOURCES(Engine); - - rect3 Rect = GetSimSpaceAABB(World, Node); - - v3i Result = {}; - if (entity *Ghost = GetEntity(EntityTable, Camera->GhostId)) - { - v3 SimSpaceP = GetSimSpaceP(World, Ghost); - r32 Distance = DistanceToBox(SimSpaceP, Rect); - Result = Distance < 100 ? V3i(1) : V3i(100); - } - - return Result; -} +#if 1 #endif -link_internal b32 -OctreeLeafShouldSplit(world *World, entity **EntityTable, camera *Camera, octree_node *Node) -{ - b32 Result = False; - rect3 Rect = GetSimSpaceAABB(World, Node); - - if (entity *Ghost = GetEntity(EntityTable, Camera->GhostId)) - { - v3 SimSpaceP = GetSimSpaceP(World, Ghost); - r32 Distance = DistanceToBox(SimSpaceP, Rect); - Result = (Node->Chunk.Flags & Chunk_Queued) == 0 && - (Node->Chunk.DimInChunks > V3i(1)) && - (Distance < 100.f); - } - return Result; -} - // TODO(Jesse): Definitely compute this from the number of worker threads available on the system #define MAX_WORLD_CHUNKS_QUEUED_PER_FRAME (128) link_internal void diff --git a/src/engine/world.h b/src/engine/world.h index 4eb28bcdc..3fc8eb8d1 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -200,4 +200,7 @@ link_internal octree_node * GetWorldChunkFromOctree(world *World, v3i QueryP); link_internal b32 -OctreeLeafShouldSplit(world *World, entity **EntityTable, camera *Camera, octree_node *Node); +OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node); + +link_internal u32 +MergeOctreeChildren(engine_resources *Engine, octree_node *Node); From dbc8276d2158636114f072c77673a6757df37037 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 14 Sep 2024 15:23:02 -0700 Subject: [PATCH 016/421] Nominal priority queue enabled --- examples/terrain_gen/game.cpp | 4 +- examples/terrain_gen/game_constants.h | 4 +- generated/for_datatypes_0XxWqGSZ.h | 2 + generated/for_datatypes_fkubhsYl.h | 2 + generated/for_datatypes_kv3WBTai.h | 2 + jesse.make.sh | 2 +- src/engine/resources.cpp | 6 +- src/engine/world.cpp | 134 ++++++++++++++++++++------ 8 files changed, 121 insertions(+), 35 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 3a7666946..10dc9d082 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -716,9 +716,9 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* GameState->TerrainGenType = TerrainGenType_GrassyTerracedTerrain; */ - /* GameState->TerrainGenType = TerrainGenType_SinCos; */ + GameState->TerrainGenType = TerrainGenType_SinCos; /* GameState->TerrainGenType = TerrainGenType_TerracedTerrain; */ - GameState->TerrainGenType = TerrainGenType_FBM2D; + /* GameState->TerrainGenType = TerrainGenType_FBM2D; */ /* GameState->TerrainGenType = TerrainGenType_GrassyTerracedTerrain4; */ /* GameState->TerrainGenType = TerrainGenType_Voronoi; */ /* World->Center = V3i(-22, 101, 1); */ diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 17a93a03d..87111d174 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -10,9 +10,9 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); */ -g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); +/* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ -/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ +g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index f59412ef4..b4e6f02ec 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -185,6 +185,7 @@ + struct render_to_texture_async_params; @@ -641,6 +642,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 56ab4b97b..ba8291ea3 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -185,6 +185,7 @@ + render_to_texture_async_params render_to_texture_async_params; @@ -631,6 +632,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index ee9de101d..183819d8e 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -185,6 +185,7 @@ + type_render_to_texture_async_params, @@ -631,6 +632,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/jesse.make.sh b/jesse.make.sh index a405a5f0e..1a93e0230 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 2ea176c0c..52ad9fd51 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -5,7 +5,8 @@ DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk) Assert(Chunk->DEBUG_OwnedByThread == 0); Chunk->DEBUG_OwnedByThread = ThreadLocal_ThreadIndex; - Assert(Chunk->Flags & Chunk_Deallocate|Chunk_VoxelsInitialized); + Assert( (Chunk->Flags & Chunk_Queued) == 0); + Assert( Chunk->Flags & (Chunk_Deallocate|Chunk_VoxelsInitialized)); DeallocateMeshes(&Chunk->Meshes, MeshFreelist); @@ -34,13 +35,12 @@ RenderOctree(engine_resources *Engine, shader *Shader) UNPACK_ENGINE_RESOURCES(Engine); b32 Continue = True; - u32 ChunksQueued = 0; octree_node_ptr_stack Stack = OctreeNodePtrStack(1024, &World->OctreeMemory); Push(&Stack, &World->Root); /* RuntimeBreak(); */ - while (CurrentCount(&Stack) && (ChunksQueued < MAX_WORLD_CHUNKS_QUEUED_PER_FRAME) ) + while (CurrentCount(&Stack)) { octree_node *Node = Pop(&Stack); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index b43e6fb3b..11c37daef 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -398,6 +398,8 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * } } +#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (2) + link_internal v3i ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) { @@ -412,7 +414,7 @@ ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) r32 Distance = DistanceToBox(GhostP, NodeRect); s32 DistanceInChunks = s32(Distance) / s32(World->ChunkDim.x); - Result = Max(V3i(1), V3i(DistanceInChunks / 2)); + Result = Max(V3i(1), V3i(DistanceInChunks / OCTREE_CHUNKS_PER_RESOLUTION_STEP)); /* Result = V3i(DistanceInChunks); */ } @@ -445,8 +447,6 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) Assert(Node->Type == OctreeNodeType_Leaf); b32 Result = False; - if (Node->Chunk.Flags & Chunk_Queued) return Result; - if (entity *Ghost = GetEntity(EntityTable, Camera->GhostId)) { if (Node->Chunk.DimInChunks > V3i(1)) @@ -462,8 +462,32 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) } +poof(generate_cursor(octree_node_ptr)) +#include + +#define MAX_OCTREE_NODE_BUCKETS (8) +#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (2) +struct octree_node_priority_queue +{ + octree_node_ptr_cursor Lists[MAX_OCTREE_NODE_BUCKETS]; +}; + +link_internal void +PushOctreeNodeToPriorityQueue(octree_node_priority_queue *Queue, octree_node *Node) +{ + Assert(Node->Chunk.Flags == Chunk_Uninitialized); + + /* Assert(Node->Chunk.DimInChunks.x%OCTREE_CHUNKS_PER_RESOLUTION_STEP == 0); */ + s32 ListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, Node->Chunk.DimInChunks.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); + + if (Remaining(&Queue->Lists[ListIndex])) + { + Push(&Queue->Lists[ListIndex], Node); + } +} + link_internal void -SplitOctreeNode_Recursive( engine_resources *Engine, octree_node *NodeToSplit, memory_arena *Memory) +SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue *Queue, octree_node *NodeToSplit, memory_arena *Memory) { UNPACK_ENGINE_RESOURCES(Engine); @@ -483,14 +507,14 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node *NodeToSplit, m } else { - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[0], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[1], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[2], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[3], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[4], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[5], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[6], Memory); - SplitOctreeNode_Recursive(Engine, NodeToSplit->Children[7], Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[0], Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[1], Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[2], Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[3], Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[4], Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[5], Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[6], Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[7], Memory); } } break; @@ -517,23 +541,30 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node *NodeToSplit, m NodeToSplit->Children[Index] = Child; InitOctreeNode(World, Child, NodeToSplit->Chunk.WorldP + RelWorldP, ChildDimInChunks); - /* world_chunk *Chunk = &Child->Chunk; */ - /* AllocateWorldChunk(Chunk, Child->Chunk.WorldP + RelWorldP, World->ChunkDim, ChildDimInChunks, World->ChunkMemory); */ - if (OctreeLeafShouldSplit(Engine, Child)) { - SplitOctreeNode_Recursive(Engine, Child, Memory); + SplitOctreeNode_Recursive(Engine, Queue, Child, Memory); } else { - world_chunk *Chunk = &Child->Chunk; - Assert(Chunk->Flags == Chunk_Uninitialized); - AllocateWorldChunk(Chunk, Child->Chunk.WorldP, World->ChunkDim, ChildDimInChunks, World->ChunkMemory); - QueueChunkForInit(&Plat->LowPriority, &Child->Chunk, MeshBit_Lod0); + if ( (Child->Chunk.Flags & Chunk_Queued) == 0 && + (Child->Chunk.Flags & Chunk_VoxelsInitialized) == 0) + { + PushOctreeNodeToPriorityQueue(Queue, Child); + } } } } + else + { + if ( (NodeToSplit->Chunk.Flags & Chunk_Queued) == 0 && + (NodeToSplit->Chunk.Flags & Chunk_VoxelsInitialized) == 0 ) + + { + PushOctreeNodeToPriorityQueue(Queue, NodeToSplit); + } + } } break; @@ -567,8 +598,15 @@ CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) } else { - DeallocateAndClearWorldChunk(Engine, &Node->Chunk); - Free(&Engine->World->OctreeNodeFreelist, Node); + if (Node->Chunk.Flags == Chunk_VoxelsInitialized) + { + DeallocateAndClearWorldChunk(Engine, &Node->Chunk); + Free(&Engine->World->OctreeNodeFreelist, Node); + } + else + { + Assert(Node->Chunk.Flags == Chunk_Uninitialized); + } } } break; @@ -598,7 +636,7 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) CheckedDeallocateChildNode(Engine, Node->Children+6); CheckedDeallocateChildNode(Engine, Node->Children+7); - QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); + /* QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); */ u32 Result = 1; return Result; @@ -609,16 +647,18 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) #endif -// TODO(Jesse): Definitely compute this from the number of worker threads available on the system -#define MAX_WORLD_CHUNKS_QUEUED_PER_FRAME (128) link_internal void MaintainWorldOctree(engine_resources *Engine) { UNPACK_ENGINE_RESOURCES(Engine); + + Assert(EntityTable); + b32 Continue = True; u32 ChunksQueued = 0; +#if 1 // Free deferred chunks that are complete { while (World->OctreeNodeDeferFreelist.First) @@ -632,15 +672,16 @@ MaintainWorldOctree(engine_resources *Engine) } else { + Assert(Node->Chunk.Flags & Chunk_VoxelsInitialized); DeallocateAndClearWorldChunk(Engine, &Node->Chunk); Free(&World->OctreeNodeFreelist, Node); - } Node = Next; World->OctreeNodeDeferFreelist.First = Node; } } +#endif @@ -659,10 +700,49 @@ MaintainWorldOctree(engine_resources *Engine) ShadowMapDrawList->Memory = GetTranArena(); } + octree_node_priority_queue Queue = {}; + RangeIterator(ListIndex, MAX_OCTREE_NODE_BUCKETS) + { + Queue.Lists[ListIndex] = OctreeNodePtrCursor(MAX_OCTREE_NODES_QUEUED_PER_FRAME, GetTranArena()); + } - SplitOctreeNode_Recursive(Engine, &World->Root, &World->OctreeMemory); + SplitOctreeNode_Recursive(Engine, &Queue, &World->Root, &World->OctreeMemory); octree_stats Stats = {}; + + u32 NumQueued = 0; + RangeIterator(ListIndex, MAX_OCTREE_NODE_BUCKETS) + { + octree_node_ptr_cursor List = Queue.Lists[ListIndex]; + RangeIterator(BucketIndex, MAX_OCTREE_NODES_QUEUED_PER_FRAME) + { + octree_node **NodeP = GetPtr(&List, umm(BucketIndex)); + if (NodeP) + { + octree_node *Node = *NodeP; + Assert(Node->Type == OctreeNodeType_Leaf); + + world_chunk *Chunk = &Node->Chunk; + if ((Chunk->Flags & Chunk_Queued) == 0) + { + if (Node->Chunk.Flags == Chunk_Uninitialized) + { + AllocateWorldChunk(Chunk, Chunk->WorldP, World->ChunkDim, Chunk->DimInChunks, World->ChunkMemory); + } + QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); + ++Stats.NewQueues; + } + + if (++NumQueued == MAX_OCTREE_NODES_QUEUED_PER_FRAME) goto done_queueing_nodes; + } + else + { + break; + } + } + } +done_queueing_nodes: + DrawOctreeRecursive(Engine, &World->Root, &Stats, MainDrawList, ShadowMapDrawList); Info("TotalLeaves(%d) TotalBranches(%d) TotalQueued(%d) NewQueues(%d)", Stats.TotalLeaves, Stats.TotalBranches, Stats.TotalQueued, Stats.NewQueues); } From 18fa50cfa25dae4d498f80043182df53011f483f Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 14 Sep 2024 15:46:30 -0700 Subject: [PATCH 017/421] Update some generated files --- .../asyncify_render_function_c_DrawLod.h | 2 +- ...yncify_render_function_c_RenderToTexture.h | 2 +- .../asyncify_render_function_h_DrawLod.h | 2 +- ...yncify_render_function_h_RenderToTexture.h | 2 +- .../d_union_constructors_work_queue_entry.h | 2 +- generated/d_union_work_queue_entry.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 2 +- generated/for_datatypes_fkubhsYl.h | 2 +- generated/for_datatypes_kv3WBTai.h | 2 +- generated/generate_cursor_octree_node.h | 183 ++++++++++++++++++ ...icbuffer_octree_node_688856411_975905964.h | 41 ++++ jesse.make.sh | 2 +- src/engine/work_queue.h | 101 ++-------- src/engine/world.cpp | 50 ++--- 14 files changed, 281 insertions(+), 114 deletions(-) create mode 100644 generated/generate_cursor_octree_node.h create mode 100644 generated/staticbuffer_octree_node_688856411_975905964.h diff --git a/generated/asyncify_render_function_c_DrawLod.h b/generated/asyncify_render_function_c_DrawLod.h index 43edcbabb..96636f74f 100644 --- a/generated/asyncify_render_function_c_DrawLod.h +++ b/generated/asyncify_render_function_c_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:363:0 +// src/engine/work_queue.h:309:0 link_internal void DrawLod_Async(work_queue *Queue,engine_resources *Engine ,shader *Shader ,lod_element_buffer *Meshes ,r32 DistanceSquared ,v3 Basis ,Quaternion Rotation ,v3 Scale ) diff --git a/generated/asyncify_render_function_c_RenderToTexture.h b/generated/asyncify_render_function_c_RenderToTexture.h index 76f870909..c18508ab6 100644 --- a/generated/asyncify_render_function_c_RenderToTexture.h +++ b/generated/asyncify_render_function_c_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:360:0 +// src/engine/work_queue.h:306:0 link_internal void RenderToTexture_Async(work_queue *Queue,engine_resources *Engine ,asset_thumbnail *Thumb ,lod_element_buffer *Meshes ,v3 Offset ,camera *Camera ) diff --git a/generated/asyncify_render_function_h_DrawLod.h b/generated/asyncify_render_function_h_DrawLod.h index 15ffc9807..4c327865a 100644 --- a/generated/asyncify_render_function_h_DrawLod.h +++ b/generated/asyncify_render_function_h_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:240:0 +// src/engine/work_queue.h:167:0 struct draw_lod_async_params poof(@async_function_params) { diff --git a/generated/asyncify_render_function_h_RenderToTexture.h b/generated/asyncify_render_function_h_RenderToTexture.h index ea65b2322..5b710917b 100644 --- a/generated/asyncify_render_function_h_RenderToTexture.h +++ b/generated/asyncify_render_function_h_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:237:0 +// src/engine/work_queue.h:164:0 struct render_to_texture_async_params poof(@async_function_params) { diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 87f5ac584..8fde7cbe3 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:325:0 +// src/engine/work_queue.h:252:0 link_internal work_queue_entry diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index fc568a4b5..396d0bed8 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:297:0 +// src/engine/work_queue.h:224:0 enum work_queue_entry_type { diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index b4e6f02ec..c55a97631 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:336:0 +// src/engine/work_queue.h:282:0 diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index ba8291ea3..3266c1224 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:280:0 +// src/engine/work_queue.h:207:0 diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 183819d8e..64b37a8e8 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:261:0 +// src/engine/work_queue.h:188:0 diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h new file mode 100644 index 000000000..ee64481e5 --- /dev/null +++ b/generated/generate_cursor_octree_node.h @@ -0,0 +1,183 @@ +// src/engine/world.cpp:465:0 + +struct octree_node_ptr_cursor +{ + octree_node_ptr *Start; + // TODO(Jesse)(immediate): For the love of fucksakes change these to indices + octree_node_ptr *At; + octree_node_ptr *End; + /* OWNED_BY_THREAD_MEMBER(); */ +}; + + + +link_internal octree_node_ptr_cursor +OctreeNodePtrCursor(umm ElementCount, memory_arena* Memory) +{ + octree_node_ptr *Start = (octree_node_ptr*)PushStruct(Memory, sizeof(octree_node_ptr)*ElementCount, 1, 0); + octree_node_ptr_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + /* OWNED_BY_THREAD_MEMBER_INIT() */ + }; + return Result; +} + +link_internal octree_node_ptr* +GetPtr(octree_node_ptr_cursor *Cursor, umm ElementIndex) +{ + /* ENSURE_OWNED_BY_THREAD(Cursor); */ + + octree_node_ptr *Result = {}; + if (ElementIndex < AtElements(Cursor)) { Result = Cursor->Start+ElementIndex; } + return Result; +} + +link_internal octree_node_ptr* +GetPtrUnsafe(octree_node_ptr_cursor *Cursor, umm ElementIndex) +{ + /* ENSURE_OWNED_BY_THREAD(Cursor); */ + + octree_node_ptr *Result = {}; + if (ElementIndex < TotalElements(Cursor)) { Result = Cursor->Start+ElementIndex; } + return Result; +} + +link_internal octree_node_ptr +Get(octree_node_ptr_cursor *Cursor, umm ElementIndex) +{ + /* ENSURE_OWNED_BY_THREAD(Cursor); */ + + Assert(ElementIndex < CurrentCount(Cursor)); + octree_node_ptr Result = Cursor->Start[ElementIndex]; + return Result; +} + +link_internal void +Set(octree_node_ptr_cursor *Cursor, umm ElementIndex, octree_node_ptr Element) +{ + /* ENSURE_OWNED_BY_THREAD(Cursor); */ + + umm CurrentElementCount = CurrentCount(Cursor); + Assert (ElementIndex <= CurrentElementCount); + + Cursor->Start[ElementIndex] = Element; + if (ElementIndex == CurrentElementCount) + { + Cursor->At++; + } +} + +link_internal octree_node_ptr* +Advance(octree_node_ptr_cursor *Cursor) +{ + /* ENSURE_OWNED_BY_THREAD(Cursor); */ + + octree_node_ptr * Result = {}; + if ( Cursor->At < Cursor->End ) { Result = Cursor->At++; } + return Result; +} + +link_internal octree_node_ptr * +Push(octree_node_ptr_cursor *Cursor, octree_node_ptr Element) +{ + /* ENSURE_OWNED_BY_THREAD(Cursor); */ + + Assert( Cursor->At < Cursor->End ); + octree_node_ptr *Result = Cursor->At; + *Cursor->At++ = Element; + return Result; +} + +link_internal octree_node_ptr +Pop(octree_node_ptr_cursor *Cursor) +{ + /* ENSURE_OWNED_BY_THREAD(Cursor); */ + + Assert( Cursor->At > Cursor->Start ); + octree_node_ptr Result = Cursor->At[-1]; + Cursor->At--; + return Result; +} + +link_internal s32 +LastIndex(octree_node_ptr_cursor *Cursor) +{ + /* ENSURE_OWNED_BY_THREAD(Cursor); */ + + s32 Result = s32(CurrentCount(Cursor))-1; + return Result; +} + +link_internal octree_node_ptr* +LastElement(octree_node_ptr_cursor *Cursor) +{ + octree_node_ptr *Result = {}; + s32 I = LastIndex(Cursor); + if (I > -1) { Result = Cursor->Start + I; } + return Result; +} + +link_internal b32 +Remove(octree_node_ptr_cursor *Cursor, octree_node_ptr Query) +{ + /* ENSURE_OWNED_BY_THREAD(Cursor); */ + + b32 Result = False; + CursorIterator(ElementIndex, Cursor) + { + octree_node_ptr Element = Get(Cursor, ElementIndex); + if (AreEqual(Element, Query)) + { + b32 IsLastIndex = LastIndex(Cursor) == s32(ElementIndex); + octree_node_ptr Tmp = Pop(Cursor); + + if (IsLastIndex) { Assert(AreEqual(Tmp, Query)); } + else { Set(Cursor, ElementIndex, Tmp); } + Result = True; + } + } + return Result; +} + + +link_internal b32 +ResizeCursor(octree_node_ptr_cursor *Cursor, umm Count, memory_arena *Memory) +{ + /* ENSURE_OWNED_BY_THREAD(Cursor); */ + + umm CurrentSize = TotalSize(Cursor); + + TruncateToElementCount(Cursor, Count); + umm NewSize = TotalSize(Cursor); + + Assert(NewSize/sizeof(octree_node_ptr) == Count); + + /* Info("Attempting to reallocate CurrentSize(%u), NewSize(%u)", CurrentSize, NewSize); */ + Ensure(Reallocate((u8*)Cursor->Start, Memory, CurrentSize, NewSize)); + return 0; +} + +link_internal void +Unshift( octree_node_ptr_cursor *Cursor ) +{ + /* ENSURE_OWNED_BY_THREAD(Cursor); */ + umm Count = AtElements(Cursor); + if (Count) + { + for (umm Index = 1; Index < Count; ++Index) + { + Cursor->Start[Index-1] = Cursor->Start[Index]; + } + + // NOTE(Jesse): This is actually correct, even though it doesn't look + // like it at first glance. At is OnePastLast, so decrementing and + // then clearing overwrites the last value that was set. + Cursor->At--; + *Cursor->At = {}; + } +} + + + diff --git a/generated/staticbuffer_octree_node_688856411_975905964.h b/generated/staticbuffer_octree_node_688856411_975905964.h new file mode 100644 index 000000000..88e9b45ae --- /dev/null +++ b/generated/staticbuffer_octree_node_688856411_975905964.h @@ -0,0 +1,41 @@ +// src/engine/world.cpp:467:0 + +struct octree_node_static_buffer +{ + octree_node Start[8]; +}; + +link_inline octree_node* +GetPtr( octree_node_static_buffer *Buf, umm Index) +{ + octree_node *Result = {}; + if ( Index < umm(8) ) + { + Result = Buf->Start+Index; + } + return Result; +} + +link_inline octree_node +Get( octree_node_static_buffer *Buf, umm Index) +{ + Assert(Index >= 0); + Assert(Index < umm(8)); + octree_node Result = Buf->Start[Index]; + return Result; +} + +link_internal umm +AtElements( octree_node_static_buffer *Buf) +{ + return 8; +} + +link_internal umm +TotalElements( octree_node_static_buffer *Buf) +{ + return 8; +} + + + diff --git a/jesse.make.sh b/jesse.make.sh index 1a93e0230..a405a5f0e 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index f448e4c13..d93d1daaa 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -117,79 +117,6 @@ global_variable voxel Global_UnsetVoxel = { 0xff, 0xff, 0xffff }; #endif -#if 0 -poof( - func rectilinear_world_update_inplace(type_poof_symbol MetaMode, - type_poof_symbol MetaModifier, - type_poof_symbol MetaShapeType, - type_poof_symbol UserCode) - { - link_internal void - RectilinearWorldUpdate_(MetaMode)_(MetaModifier)_(MetaShapeType) - ( world_edit_mode Mode, - world_edit_mode_modifier Modifier, - world_update_op_shape *Shape, - world_chunk **ChunkBuffer, - u32 ChunkCount, - rect3i *SimSpaceQueryAABB, - voxel *CopiedVoxels ) - { - - Assert(Mode == MetaMode); - Assert(Modifier == MetaModifier); - Assert(Shape->Type == MetaShapeType); - - /* v3i SimSpaceQueryMinP = V3i(SimSpaceQueryAABB->Min); */ - v3i SimSpaceQueryDim = GetDim(*SimSpaceQueryAABB); - Assert(SimSpaceQueryDim.x % Global_StandingSpotDim.x == 0); - Assert(SimSpaceQueryDim.y % Global_StandingSpotDim.y == 0); - - DimIterator(x, y, z, SimSpaceQueryDim) - { - v3i SimRelVoxP = V3i(x,y,z); - /* v3i SimVoxP = SimRelVoxP + SimSpaceQueryAABB.Min; */ - voxel *V = CopiedVoxels + GetIndex(SimRelVoxP, SimSpaceQueryDim); - - UserCode - } - } - - // Unfortunately, the C compiler is too stupid to do this. I'm leaving - // this here such that when adding a new callback you can manually paste - // this line into Initialize_Global_UpdateWorldCallbackTable() - // - static const char* lolwut_StringHack_(MetaMode)_(MetaModifier)_(MetaShapeType) = "Global_WorldUpdateCallbackTable[MetaMode][MetaModifier][MetaShapeType] = RectilinearWorldUpdate_(MetaMode)_(MetaModifier)_(MetaShapeType);"; - } -) - - -typedef void(*world_update_callback)(world_edit_mode, world_edit_mode_modifier, world_update_op_shape *, world_chunk **, u32, rect3i *, voxel *); - -global_variable world_update_callback -Global_WorldUpdateCallbackTable[WorldEdit_Mode_Count][WorldEdit_Modifier_Count][type_world_update_op_shape_params_count]; - - -poof(rectilinear_world_update_inplace( {WorldEdit_Mode_Attach}, - {WorldEdit_Modifier_None}, - {type_world_update_op_shape_params_rect}, - { - world_update_op_shape_params_rect *Rect = SafeCast(world_update_op_shape_params_rect, Shape); - rect3i SSRect = {V3i(Rect->P0), V3i(Rect->P1)}; - - /* voxel NewVoxelValue = { Voxel_Filled, NewTransparency, NewColor}; */ - /* if (Contains(SSRect, SimVoxP)) { *V = NewVoxelValue; } */ - } -)) -#include - -link_internal void -Initialize_Global_UpdateWorldCallbackTable() -{ - Global_WorldUpdateCallbackTable[WorldEdit_Mode_Attach][WorldEdit_Modifier_None][type_world_update_op_shape_params_rect] = RectilinearWorldUpdate_WorldEdit_Mode_Attach_WorldEdit_Modifier_None_type_world_update_op_shape_params_rect; -} -#endif - - @@ -329,6 +256,25 @@ poof(d_union_constructors(work_queue_entry)) +link_internal u32 +EventsCurrentlyInQueue(work_queue *Queue) +{ + u32 Enqueue = Queue->EnqueueIndex; + u32 Dequeue = Queue->DequeueIndex; + + u32 Result = 0; + if (Enqueue < Dequeue) + { + Result = Dequeue - Enqueue; + } + else if (Dequeue < Enqueue) + { + Result = (WORK_QUEUE_SIZE - Dequeue) + Enqueue; + } + + return Result; +} + @@ -415,15 +361,6 @@ HandleJob(volatile work_queue_entry *Entry, thread_local_state *Thread, applicat } -/* link_internal untextured_3d_geometry_buffer * */ -/* GetMeshFor(threadsafe_geometry_buffer *Buf, world_chunk_mesh_bitfield MeshBit); */ - -/* link_internal untextured_3d_geometry_buffer * */ -/* TakeOwnershipSync(threadsafe_geometry_buffer *Buf, world_chunk_mesh_bitfield MeshBit); */ - -/* link_internal void */ -/* ReleaseOwnership(threadsafe_geometry_buffer *Src, world_chunk_mesh_bitfield MeshBit, untextured_3d_geometry_buffer *Buf); */ - link_internal untextured_3d_geometry_buffer * TakeOwnershipSync(lod_element_buffer *Buf, world_chunk_mesh_bitfield MeshBit); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 11c37daef..15d2b9761 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -466,7 +466,7 @@ poof(generate_cursor(octree_node_ptr)) #include #define MAX_OCTREE_NODE_BUCKETS (8) -#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (2) +#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (4) struct octree_node_priority_queue { octree_node_ptr_cursor Lists[MAX_OCTREE_NODE_BUCKETS]; @@ -710,34 +710,40 @@ MaintainWorldOctree(engine_resources *Engine) octree_stats Stats = {}; - u32 NumQueued = 0; - RangeIterator(ListIndex, MAX_OCTREE_NODE_BUCKETS) + s32 LowPriorityQueueCount = s32(EventsCurrentlyInQueue(&Plat->LowPriority)); + + s32 MaxToQueueThisFrame = Max(0, MAX_OCTREE_NODES_QUEUED_PER_FRAME - LowPriorityQueueCount); + s32 NumQueuedThisFrame = 0; + if (MaxToQueueThisFrame) { - octree_node_ptr_cursor List = Queue.Lists[ListIndex]; - RangeIterator(BucketIndex, MAX_OCTREE_NODES_QUEUED_PER_FRAME) + RangeIterator(ListIndex, MAX_OCTREE_NODE_BUCKETS) { - octree_node **NodeP = GetPtr(&List, umm(BucketIndex)); - if (NodeP) + octree_node_ptr_cursor List = Queue.Lists[ListIndex]; + RangeIterator(BucketIndex, MAX_OCTREE_NODES_QUEUED_PER_FRAME) { - octree_node *Node = *NodeP; - Assert(Node->Type == OctreeNodeType_Leaf); - - world_chunk *Chunk = &Node->Chunk; - if ((Chunk->Flags & Chunk_Queued) == 0) + octree_node **NodeP = GetPtr(&List, umm(BucketIndex)); + if (NodeP) { - if (Node->Chunk.Flags == Chunk_Uninitialized) + octree_node *Node = *NodeP; + Assert(Node->Type == OctreeNodeType_Leaf); + + world_chunk *Chunk = &Node->Chunk; + if ((Chunk->Flags & Chunk_Queued) == 0) { - AllocateWorldChunk(Chunk, Chunk->WorldP, World->ChunkDim, Chunk->DimInChunks, World->ChunkMemory); + if (Node->Chunk.Flags == Chunk_Uninitialized) + { + AllocateWorldChunk(Chunk, Chunk->WorldP, World->ChunkDim, Chunk->DimInChunks, World->ChunkMemory); + } + QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); + ++Stats.NewQueues; } - QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); - ++Stats.NewQueues; - } - if (++NumQueued == MAX_OCTREE_NODES_QUEUED_PER_FRAME) goto done_queueing_nodes; - } - else - { - break; + if (++NumQueuedThisFrame == MaxToQueueThisFrame) goto done_queueing_nodes; + } + else + { + break; + } } } } From f3c05cb3bd63f2b0bdfc2d99d7933a3c68b4bd26 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 14 Sep 2024 16:42:53 -0700 Subject: [PATCH 018/421] Prefer nodes within frustum --- examples/terrain_gen/game.cpp | 7 +-- ...editor_ui_for_compound_type_engine_debug.h | 48 +++++++++++++++++++ generated/generate_cursor_octree_node.h | 2 +- src/engine/api.cpp | 4 ++ src/engine/camera.cpp | 4 +- src/engine/debug.h | 4 ++ src/engine/world.cpp | 42 ++++++++++------ 7 files changed, 91 insertions(+), 20 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 10dc9d082..c1e2f3efd 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -454,7 +454,8 @@ BONSAI_API_WORKER_THREAD_CALLBACK() // FBM params v3 Period = V3(18000); s32 Amplititude = 10000; - s32 StartingZDepth = 100; + /* s32 StartingZDepth = 100; */ + s32 StartingZDepth = 0; u32 Octaves = 6; /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; @@ -716,9 +717,9 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* GameState->TerrainGenType = TerrainGenType_GrassyTerracedTerrain; */ - GameState->TerrainGenType = TerrainGenType_SinCos; + /* GameState->TerrainGenType = TerrainGenType_SinCos; */ /* GameState->TerrainGenType = TerrainGenType_TerracedTerrain; */ - /* GameState->TerrainGenType = TerrainGenType_FBM2D; */ + GameState->TerrainGenType = TerrainGenType_FBM2D; /* GameState->TerrainGenType = TerrainGenType_GrassyTerracedTerrain4; */ /* GameState->TerrainGenType = TerrainGenType_Voronoi; */ /* World->Center = V3i(-22, 101, 1); */ diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index ccb57ffdd..f584699cf 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -178,6 +178,54 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*,&Element->DrawBranchNodes), + CSz("DrawBranchNodes"), + Params + ); + + + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*,&Element->DrawLeafNodes), + CSz("DrawLeafNodes"), + Params + ); + + + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*,&Element->DrawQueuedNodes), + CSz("DrawQueuedNodes"), + Params + ); + + + + + + + PushNewRow(Ui); DoEditorUi(Ui, diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index ee64481e5..07313f764 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.cpp:465:0 +// src/engine/world.cpp:474:0 struct octree_node_ptr_cursor { diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 28f0ee659..14f074773 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -290,6 +290,10 @@ Bonsai_Simulate(engine_resources *Resources) { if (Graphics->Camera == &Graphics->GameCamera) { + entity_id Prev = Graphics->DebugCamera.GhostId; + Graphics->DebugCamera = Graphics->GameCamera; + Graphics->DebugCamera.GhostId = Prev; + Graphics->Camera = &Graphics->DebugCamera; } else diff --git a/src/engine/camera.cpp b/src/engine/camera.cpp index e09a51487..d3a8dcb35 100644 --- a/src/engine/camera.cpp +++ b/src/engine/camera.cpp @@ -219,8 +219,8 @@ IsInFrustum(world *World, camera *Camera, canonical_position P) link_internal bool IsInFrustum( world *World, camera *Camera, world_chunk *Chunk ) { - v3 ChunkMid = World->ChunkDim/2.0f; - canonical_position P1 = Canonical_Position(ChunkMid, Chunk->WorldP ); + v3 ChunkMid = (Chunk->DimInChunks*World->ChunkDim)/2.f; + cp P1 = Canonical_Position(ChunkMid, Chunk->WorldP ); bool Result = IsInFrustum(World, Camera, P1); return Result; } diff --git a/src/engine/debug.h b/src/engine/debug.h index 38a309cfd..d359b322b 100644 --- a/src/engine/debug.h +++ b/src/engine/debug.h @@ -58,6 +58,10 @@ struct engine_debug b8 TriggerRuntimeBreak; b8 ResetAssetNodeView; + b8 DrawBranchNodes; + b8 DrawLeafNodes; + b8 DrawQueuedNodes; + u8 PickedChunkState; world_chunk *PickedChunk; diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 15d2b9761..86c2a9364 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -365,7 +365,10 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * case OctreeNodeType_Branch: { - /* DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); */ + if (EngineDebug->DrawBranchNodes) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); + } DrawOctreeRecursive(Engine, Node->Children[0], Stats, MainDrawList, ShadowMapDrawList); DrawOctreeRecursive(Engine, Node->Children[1], Stats, MainDrawList, ShadowMapDrawList); DrawOctreeRecursive(Engine, Node->Children[2], Stats, MainDrawList, ShadowMapDrawList); @@ -379,7 +382,10 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * case OctreeNodeType_Leaf: { - /* DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); */ + if (EngineDebug->DrawLeafNodes) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + } SyncGpuBuffersAsync(Engine, &Node->Chunk.Meshes); world_chunk *Chunk = &Node->Chunk; @@ -393,12 +399,15 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * if (Node->Chunk.Flags & Chunk_Queued) { - /* DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_RED, AABBLineDim*2.f); */ + if (EngineDebug->DrawQueuedNodes) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_RED, AABBLineDim*2.f); + } ++Stats->TotalQueued; } } -#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (2) +#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (4) link_internal v3i ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) @@ -407,7 +416,7 @@ ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) v3i Result = {}; - if (entity *Ghost = GetEntity(EntityTable, Camera->GhostId)) + if (entity *Ghost = GetEntity(EntityTable, GameCamera->GhostId)) { rect3 NodeRect = GetSimSpaceAABB(World, Node); v3 GhostP = GetSimSpaceP(World, Ghost); @@ -429,7 +438,7 @@ OctreeBranchShouldCollapse(engine_resources *Engine, octree_node *Node) b32 Result = False; if (Node->Chunk.Flags & Chunk_Queued) return Result; - if (entity *Ghost = GetEntity(EntityTable, Camera->GhostId)) + if (entity *Ghost = GetEntity(EntityTable, GameCamera->GhostId)) { v3i Res = ComputeNodeDesiredResolution(Engine, Node); if (Res > Node->Chunk.DimInChunks) @@ -447,7 +456,7 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) Assert(Node->Type == OctreeNodeType_Leaf); b32 Result = False; - if (entity *Ghost = GetEntity(EntityTable, Camera->GhostId)) + if (entity *Ghost = GetEntity(EntityTable, GameCamera->GhostId)) { if (Node->Chunk.DimInChunks > V3i(1)) { @@ -473,16 +482,21 @@ struct octree_node_priority_queue }; link_internal void -PushOctreeNodeToPriorityQueue(octree_node_priority_queue *Queue, octree_node *Node) +PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_priority_queue *Queue, octree_node *Node) { Assert(Node->Chunk.Flags == Chunk_Uninitialized); - /* Assert(Node->Chunk.DimInChunks.x%OCTREE_CHUNKS_PER_RESOLUTION_STEP == 0); */ - s32 ListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, Node->Chunk.DimInChunks.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); + s32 IdealListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, + Node->Chunk.DimInChunks.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); + + if (IsInFrustum(World, GameCamera, &Node->Chunk) == False) + { + IdealListIndex = MAX_OCTREE_NODE_BUCKETS-1; + } - if (Remaining(&Queue->Lists[ListIndex])) + if (Remaining(&Queue->Lists[IdealListIndex])) { - Push(&Queue->Lists[ListIndex], Node); + Push(&Queue->Lists[IdealListIndex], Node); } } @@ -550,7 +564,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue if ( (Child->Chunk.Flags & Chunk_Queued) == 0 && (Child->Chunk.Flags & Chunk_VoxelsInitialized) == 0) { - PushOctreeNodeToPriorityQueue(Queue, Child); + PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Child); } } @@ -562,7 +576,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue (NodeToSplit->Chunk.Flags & Chunk_VoxelsInitialized) == 0 ) { - PushOctreeNodeToPriorityQueue(Queue, NodeToSplit); + PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit); } } From 2326580855df3cf7615016bbbd069d45c69e28f6 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 15 Sep 2024 07:09:12 -0700 Subject: [PATCH 019/421] Pull terrain_iteration_pattern out into poof func and do FBM2D in terms of it --- generated/generate_stream_compact_v3i.h | 2 +- generated/maybe_v3.h | 2 +- generated/maybe_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/api.cpp | 6 +- src/engine/terrain.cpp | 6 +- src/engine/terrain.h | 60 ++++++++++++++ src/engine/world.cpp | 2 +- src/engine/world_chunk.cpp | 82 ++++--------------- 10 files changed, 91 insertions(+), 75 deletions(-) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index a096095d2..f687e48e4 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3068:0 +// src/engine/world_chunk.cpp:3033:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/maybe_v3.h b/generated/maybe_v3.h index 27faef6ba..7106994e9 100644 --- a/generated/maybe_v3.h +++ b/generated/maybe_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1124:0 +// external/bonsai_stdlib/src/vector.h:1138:0 struct maybe_v3 { diff --git a/generated/maybe_v3i.h b/generated/maybe_v3i.h index 4c1b3d97e..2962c1a7a 100644 --- a/generated/maybe_v3i.h +++ b/generated/maybe_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1126:0 +// external/bonsai_stdlib/src/vector.h:1140:0 struct maybe_v3i { diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 8ff42f79f..d4342c2c1 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2099:0 +// src/engine/world_chunk.cpp:2064:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 5aca5ef33..fa89285eb 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2102:0 +// src/engine/world_chunk.cpp:2067:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 14f074773..17abbf89c 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -290,9 +290,9 @@ Bonsai_Simulate(engine_resources *Resources) { if (Graphics->Camera == &Graphics->GameCamera) { - entity_id Prev = Graphics->DebugCamera.GhostId; - Graphics->DebugCamera = Graphics->GameCamera; - Graphics->DebugCamera.GhostId = Prev; + /* entity_id Prev = Graphics->DebugCamera.GhostId; */ + /* Graphics->DebugCamera = Graphics->GameCamera; */ + /* Graphics->DebugCamera.GhostId = Prev; */ Graphics->Camera = &Graphics->DebugCamera; } diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index e98a86ae1..aac8c08de 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -532,6 +532,10 @@ ComputeNormalsForChunkFromNoiseValues( r32 ChunkWorldZ, r32 *NoiseValues, v3i No { TIMED_FUNCTION(); + // NOTE(Jesse): For this function to work the noise has to be one voxel larger + // than the normal data + Assert(NoiseDim == NormalsDim+2); + #if 1 for ( s32 z = 0; z < NormalsDim.z; ++ z) { @@ -1590,7 +1594,7 @@ GrassyTerracedTerrain4( world_chunk *Chunk, #endif // NOTE(Jesse): Perlin_8x needs a multiple of 8 here. - /* Assert(Dim.x % 8 == 0); */ + Assert(Dim.x % 8 == 0); s32 xNoiseBlockCount = NoiseDim.x / 8; { diff --git a/src/engine/terrain.h b/src/engine/terrain.h index b1c733c27..5909238f8 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -1,6 +1,66 @@ + +#define MIN_TERRAIN_NOISE_WIDTH (8) + + #define COMPUTE_NOISE_INPUT(channel_name, chunk) (chunk->DimInChunks.channel_name/2) + (channel_name*chunk->DimInChunks.channel_name) + (chunk->WorldP.channel_name*WorldChunkDim.channel_name) + SrcToDest.channel_name +poof( + func terrain_iteration_pattern( type_poof_symbol noise_input_name, + type_poof_symbol noise_value_name, + type_poof_symbol packed_HSV_color_value_name, + type_poof_symbol user_code) + @code_fragment + { + Period = Max(Period, V3(1.f)); + + for ( s32 z = 0; z < Dim.z; ++ z) + { + s64 WorldZ = COMPUTE_NOISE_INPUT(z, Chunk); + s64 WorldZBiased = WorldZ - zMin; + for ( s32 y = 0; y < Dim.y; ++ y) + { + for ( s32 x = 0; x < Dim.x; ++ x) + { + s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); + Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + + v3 noise_input_name = V3( + COMPUTE_NOISE_INPUT(x, Chunk), + COMPUTE_NOISE_INPUT(y, Chunk), + COMPUTE_NOISE_INPUT(z, Chunk) + ); + + + r32 noise_value_name = 0.f; + + user_code + + b32 NoiseChoice = r64((noise_value_name)) > r64(WorldZBiased); + + SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); + Chunk->Voxels[VoxIndex].Color = packed_HSV_color_value_name*u16(NoiseChoice); + ChunkSum += NoiseChoice; + + Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); + + if (NoiseChoice) + { + Assert( IsSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); + } + else + { + Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); + } + } + } + } + } +) + + + + struct noise_value_to_material_index { f32 NoiseValue; diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 86c2a9364..b17ddfcff 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -407,7 +407,7 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * } } -#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (4) +#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (3) link_internal v3i ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 3306b56fb..a7401cf07 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -660,13 +660,15 @@ Terrain_Flat( world_chunk *Chunk, } +// Starting 227k link_internal u32 Terrain_FBM2D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *OctaveCount ) { - TIMED_FUNCTION(); + HISTOGRAM_FUNCTION(); + /* TIMED_FUNCTION(); */ UNPACK_NOISE_PARAMS(NoiseParams); @@ -712,30 +714,21 @@ Terrain_FBM2D( world_chunk *Chunk, Period = Max(Period, V3(1.f)); u32 Octaves = *(u32*)OctaveCount; - for ( s32 z = 0; z < Dim.z; ++ z) - { - s64 WorldZ = (Chunk->DimInChunks.z/2) + (z*Chunk->DimInChunks.z) + (Chunk->WorldP.z*WorldChunkDim.z) - SrcToDest.z ; - s64 WorldZBiased = WorldZ - zMin; - /* s64 WorldZ = z + NoiseBasis.z; */ - /* s64 WorldZBiased = WorldZ - zMin; */ - for ( s32 y = 0; y < Dim.y; ++ y) - { - for ( s32 x = 0; x < Dim.x; ++ x) - { - r32 NoiseValue = 0.f; - s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); + poof( + terrain_iteration_pattern({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, + { v3 IPeriod = Period; // Interior Period s32 InteriorAmp = Amplitude; for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { Assert(Chunk->DimInChunks > V3i(0)); - v3 NoiseInput = MapWorldPositionToNoiseInputValue(V3(NoiseBasis), V3(x,y,z)*V3(Chunk->DimInChunks) + Chunk->DimInChunks/2.f, IPeriod) ; + v3 WorldP; + r32 Warp = 0.f; - r32 N = PerlinNoise(NoiseInput+Warp); + v3 ThisInput = NoiseInput / IPeriod; + r32 N = PerlinNoise(ThisInput+Warp); Assert(N <= 1.05f); Assert(N > -1.05f); @@ -751,41 +744,13 @@ Terrain_FBM2D( world_chunk *Chunk, IPeriod = Max(V3(1.f), IPeriod/2); } -#if VOXEL_DEBUG_COLOR - s32 NoiseIndex = GetIndex(V3i(x,y,z)+1, NoiseDim); - Chunk->NoiseValues[NoiseIndex] = NoiseValue; -#endif - b32 NoiseChoice = r64(NoiseValue) > r64(WorldZBiased); - - if (NoiseChoice) - { - u32 BreakHere = 54; - BreakHere ++; - } - - /* u16 ThisColor = SafeTruncateToU16(RandomBetween(u32(Color), &GenColorEntropy, u32(Color)+2));; */ - u16 ThisColor = RGBtoPackedHSV(RGBColor); - - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); - Chunk->Voxels[VoxIndex].Color = ThisColor*u16(NoiseChoice); - ChunkSum += NoiseChoice; - - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); - - if (NoiseChoice) - { - Assert( IsSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); } - } - } + )) +#include - s64 ChunkWorldZThresh = SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z) - zMin; - ComputeNormalsForChunkFromNoiseValues(ChunkWorldZThresh, NoiseValues, NoiseDim, Normals, NormalDim); + /* s64 ChunkWorldZThresh = SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z) - zMin; */ + /* ComputeNormalsForChunkFromNoiseValues(ChunkWorldZThresh, NoiseValues, NoiseDim, Normals, NormalDim); */ return ChunkSum; } @@ -3659,21 +3624,12 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, Assert(!ChunkIsGarbage(DestChunk)); - /* Assert(MeshBit == MeshBit_Lod0); */ - - - - // TODO(Jesse): Pretty sure this is unnecessary - /* ClearChunkVoxels(DestChunk->Voxels, DestChunk->Dim); */ - untextured_3d_geometry_buffer* Mesh = 0; - /* untextured_3d_geometry_buffer* DebugMesh = 0; */ - /* untextured_3d_geometry_buffer* TransparencyMesh = 0; */ - v3i SynChunkDim = (DestChunk->Dim + Global_ChunkApronDim); + v3i SynChunkDimMin = (DestChunk->Dim + Global_ChunkApronDim); + v3i SynChunkDim = RoundToMultiple(SynChunkDimMin, V3i(MIN_TERRAIN_NOISE_WIDTH)); v3i SynChunkP = DestChunk->WorldP; - world_chunk *SyntheticChunk = AllocateWorldChunk(SynChunkP, SynChunkDim, DestChunk->DimInChunks, Thread->TempMemory); @@ -3691,8 +3647,6 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, #if 1 && VOXEL_DEBUG_COLOR DestChunk->NoiseValues = SyntheticChunk->NoiseValues; DestChunk->NormalValues = SyntheticChunk->NormalValues; - -#if 1 if (DestChunk->NoiseValues) { for ( s32 z = 0; z < SyntheticChunk->Dim.z; ++ z) @@ -3711,8 +3665,6 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, } #endif -#endif - if (MakeExteriorFaces) { From 48df0bdb3978860a92b125c0fd709f7c9014c635 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 15 Sep 2024 11:12:19 -0700 Subject: [PATCH 020/421] Move Terrain_FBM2D to use Perlin8x --- examples/terrain_gen/game.cpp | 11 ++- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/editor.h | 18 ++--- src/engine/terrain.h | 76 +++++++++++++++++-- src/engine/world_chunk.cpp | 50 ++++++++---- 7 files changed, 127 insertions(+), 34 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index c1e2f3efd..960da6a56 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -452,11 +452,16 @@ BONSAI_API_WORKER_THREAD_CALLBACK() case TerrainGenType_FBM2D: { // FBM params - v3 Period = V3(18000); - s32 Amplititude = 10000; + /* v3 Period = V3(18000); */ + /* s32 Amplititude = 10000; */ + + v3 Period = V3(125); + s32 Amplititude = 125; + /* v3 Period = V3(1500); */ + /* s32 Amplititude = 1500; */ /* s32 StartingZDepth = 100; */ s32 StartingZDepth = 0; - u32 Octaves = 6; + u32 Octaves = 1; /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; v3 Color = RGB_GRASS_GREEN; diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index f687e48e4..752809d1a 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3033:0 +// src/engine/world_chunk.cpp:3055:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index d4342c2c1..f5d0c2b0c 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2064:0 +// src/engine/world_chunk.cpp:2086:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index fa89285eb..836eabebe 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2067:0 +// src/engine/world_chunk.cpp:2089:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, diff --git a/src/engine/editor.h b/src/engine/editor.h index 4be13be55..079ec59d8 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -637,15 +637,15 @@ struct generic_noise_params }; // TODO(Jesse): Get rid of zMin -#define UNPACK_NOISE_PARAMS(P) \ - v3i WorldChunkDim = GetWorldChunkDim(); \ - v3i Dim = Chunk->Dim; \ - r32 Thresh = Cast(generic_noise_params*, (P))->Threshold; \ - s64 zMin = s64(Cast(generic_noise_params*, (P))->Threshold); \ - v3 Period = Cast(generic_noise_params*, (P))->Period; \ - s32 Amplitude = s32(Cast(generic_noise_params*, (P))->Amplitude); \ - v3 RGBColor = Cast(generic_noise_params*, (P))->RGBColor; \ - v3i SrcToDest = {-1*Global_ChunkApronMinDim}; +#define UNPACK_NOISE_PARAMS(P) \ + v3i WorldChunkDim = GetWorldChunkDim(); \ + v3i Dim = Chunk->Dim; \ + r32 Thresh = Cast(generic_noise_params*, (P))->Threshold; \ + s64 zMin = s64(Cast(generic_noise_params*, (P))->Threshold); \ + v3 Period = Cast(generic_noise_params*, (P))->Period; \ + s32 Amplitude = s32(Cast(generic_noise_params*, (P))->Amplitude); \ + v3 RGBColor = Cast(generic_noise_params*, (P))->RGBColor; \ + v3i SrcToDest = {-1*Global_ChunkApronMinDim}; struct white_noise_params diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 5909238f8..2f59388b4 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -2,7 +2,7 @@ #define MIN_TERRAIN_NOISE_WIDTH (8) -#define COMPUTE_NOISE_INPUT(channel_name, chunk) (chunk->DimInChunks.channel_name/2) + (channel_name*chunk->DimInChunks.channel_name) + (chunk->WorldP.channel_name*WorldChunkDim.channel_name) + SrcToDest.channel_name +#define COMPUTE_NOISE_INPUT(channel_name, offset, chunk) (chunk->DimInChunks.channel_name/2) + ((f32(offset)+channel_name)*chunk->DimInChunks.channel_name) + (chunk->WorldP.channel_name*WorldChunkDim.channel_name) + SrcToDest.channel_name poof( @@ -16,7 +16,7 @@ poof( for ( s32 z = 0; z < Dim.z; ++ z) { - s64 WorldZ = COMPUTE_NOISE_INPUT(z, Chunk); + s64 WorldZ = s64(COMPUTE_NOISE_INPUT(z, 0, Chunk)); s64 WorldZBiased = WorldZ - zMin; for ( s32 y = 0; y < Dim.y; ++ y) { @@ -26,9 +26,9 @@ poof( Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; v3 noise_input_name = V3( - COMPUTE_NOISE_INPUT(x, Chunk), - COMPUTE_NOISE_INPUT(y, Chunk), - COMPUTE_NOISE_INPUT(z, Chunk) + COMPUTE_NOISE_INPUT(x, 0, Chunk), + COMPUTE_NOISE_INPUT(y, 0, Chunk), + COMPUTE_NOISE_INPUT(z, 0, Chunk) ); @@ -60,6 +60,72 @@ poof( +poof( + func terrain_iteration_pattern_8x( type_poof_symbol noise_input_name, + type_poof_symbol noise_value_name, + type_poof_symbol packed_HSV_color_value_name, + type_poof_symbol user_code) + @code_fragment + { + // NOTE(Jesse): This must hold true for using any Noise_8x func + Assert(Chunk->Dim % V3i(MIN_TERRAIN_NOISE_WIDTH) == V3i(0)); + + Period = Max(Period, V3(1.f)); + + for ( s32 z = 0; z < Dim.z; ++ z) + { + f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); + f32 WorldZBiased = zCoord - zMin; + for ( s32 y = 0; y < Dim.y; ++ y) + { + f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); + for ( s32 x = 0; x < Dim.x; x += MIN_TERRAIN_NOISE_WIDTH) + { + s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); + Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + + f32 xCoords[MIN_TERRAIN_NOISE_WIDTH] = + { + (COMPUTE_NOISE_INPUT(x, 0, Chunk)), + (COMPUTE_NOISE_INPUT(x, 1, Chunk)), + (COMPUTE_NOISE_INPUT(x, 2, Chunk)), + (COMPUTE_NOISE_INPUT(x, 3, Chunk)), + (COMPUTE_NOISE_INPUT(x, 4, Chunk)), + (COMPUTE_NOISE_INPUT(x, 5, Chunk)), + (COMPUTE_NOISE_INPUT(x, 6, Chunk)), + (COMPUTE_NOISE_INPUT(x, 7, Chunk)), + }; + + user_code + + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + s32 ThisIndex = VoxIndex+ValueIndex; + b32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; + ChunkSum += NoiseChoice; + + SetFlag(&Chunk->Voxels[ThisIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); + Chunk->Voxels[ThisIndex].Color = packed_HSV_color_value_name*u16(NoiseChoice); + + Assert( (Chunk->Voxels[ThisIndex].Flags&VoxelFaceMask) == 0); + if (NoiseChoice) + { + Assert( IsSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); + } + else + { + Assert( NotSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); + } + } + + } + } + } + } +) + + + struct noise_value_to_material_index { diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index a7401cf07..fc05e07c1 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -715,6 +715,8 @@ Terrain_FBM2D( world_chunk *Chunk, u32 Octaves = *(u32*)OctaveCount; + +#if 0 poof( terrain_iteration_pattern({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, { @@ -722,32 +724,52 @@ Terrain_FBM2D( world_chunk *Chunk, s32 InteriorAmp = Amplitude; for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { - Assert(Chunk->DimInChunks > V3i(0)); - v3 WorldP; + NoiseValue = PerlinNoise(NoiseInput/IPeriod) * InteriorAmp; + InteriorAmp = Max(1, InteriorAmp/2); + IPeriod = Max(V3(1.f), IPeriod/2); + } - r32 Warp = 0.f; - v3 ThisInput = NoiseInput / IPeriod; - r32 N = PerlinNoise(ThisInput+Warp); - Assert(N <= 1.05f); - Assert(N > -1.05f); + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + } + )) +#include +#endif +#if 1 + poof( + terrain_iteration_pattern_8x({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, + { + v3 InteriorPeriod = Period; + r32 InteriorAmp = r32(Amplitude); + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + Assert(Chunk->DimInChunks > V3i(0)); - s32 zValue = (s32)Abs( (N*InteriorAmp) ); + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + xCoords[ValueIndex] /= InteriorPeriod.x; + } + f32 yIn = yCoord/InteriorPeriod.y; + f32 zIn = zCoord/InteriorPeriod.z; - b32 IsUnderground = zValue < WorldZBiased; - b32 NoiseChoice = IsUnderground; + // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues + f32 TmpPerlinResults[8]; + PerlinNoise_8x(xCoords, yIn, zIn, TmpPerlinResults); - NoiseValue += N*(r32(OctaveIndex+1)); - NoiseValue += N*InteriorAmp; + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; + } - InteriorAmp = Max(1, InteriorAmp/2); - IPeriod = Max(V3(1.f), IPeriod/2); + InteriorAmp = Max(1.f, InteriorAmp/2.f); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2); } u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); } )) #include +#endif /* s64 ChunkWorldZThresh = SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z) - zMin; */ /* ComputeNormalsForChunkFromNoiseValues(ChunkWorldZThresh, NoiseValues, NoiseDim, Normals, NormalDim); */ From d8baf091e54151157150f67aaebac5626a2363a1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 15 Sep 2024 14:13:51 -0700 Subject: [PATCH 021/421] Fix terrain being stretched due to modifying xCoord every octave --- examples/terrain_gen/game.cpp | 17 +++++++----- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/terrain.h | 27 ++++++++++--------- src/engine/world_chunk.cpp | 15 ++++++++++- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 960da6a56..e35f1bc08 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -455,13 +455,16 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* v3 Period = V3(18000); */ /* s32 Amplititude = 10000; */ - v3 Period = V3(125); - s32 Amplititude = 125; - /* v3 Period = V3(1500); */ - /* s32 Amplititude = 1500; */ - /* s32 StartingZDepth = 100; */ - s32 StartingZDepth = 0; - u32 Octaves = 1; + /* v3 Period = V3(125); */ + /* s32 Amplititude = 125; */ + /* u32 Octaves = 1; */ + /* s32 StartingZDepth = 0; */ + + v3 Period = V3(2500); + s32 Amplititude = 1500; + s32 StartingZDepth = 100; + u32 Octaves = 6; + /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; v3 Color = RGB_GRASS_GREEN; diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 752809d1a..2609e2a1d 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3055:0 +// src/engine/world_chunk.cpp:3069:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index f5d0c2b0c..ce0bebeb8 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2086:0 +// src/engine/world_chunk.cpp:2100:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 836eabebe..b2c014db2 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2089:0 +// src/engine/world_chunk.cpp:2103:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 2f59388b4..573365332 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -72,6 +72,9 @@ poof( Period = Max(Period, V3(1.f)); + + /* s32 xChunkMax = Dim.x/MIN_TERRAIN_NOISE_WIDTH; */ + for ( s32 z = 0; z < Dim.z; ++ z) { f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); @@ -79,22 +82,22 @@ poof( for ( s32 y = 0; y < Dim.y; ++ y) { f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); - for ( s32 x = 0; x < Dim.x; x += MIN_TERRAIN_NOISE_WIDTH) + for ( s32 x = 0; x < Dim.x; x += MIN_TERRAIN_NOISE_WIDTH ) { s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; - f32 xCoords[MIN_TERRAIN_NOISE_WIDTH] = - { - (COMPUTE_NOISE_INPUT(x, 0, Chunk)), - (COMPUTE_NOISE_INPUT(x, 1, Chunk)), - (COMPUTE_NOISE_INPUT(x, 2, Chunk)), - (COMPUTE_NOISE_INPUT(x, 3, Chunk)), - (COMPUTE_NOISE_INPUT(x, 4, Chunk)), - (COMPUTE_NOISE_INPUT(x, 5, Chunk)), - (COMPUTE_NOISE_INPUT(x, 6, Chunk)), - (COMPUTE_NOISE_INPUT(x, 7, Chunk)), - }; +/* f32 xCoords[MIN_TERRAIN_NOISE_WIDTH] = */ +/* { */ +/* (COMPUTE_NOISE_INPUT(x, 0, Chunk)), */ +/* (COMPUTE_NOISE_INPUT(x, 1, Chunk)), */ +/* (COMPUTE_NOISE_INPUT(x, 2, Chunk)), */ +/* (COMPUTE_NOISE_INPUT(x, 3, Chunk)), */ +/* (COMPUTE_NOISE_INPUT(x, 4, Chunk)), */ +/* (COMPUTE_NOISE_INPUT(x, 5, Chunk)), */ +/* (COMPUTE_NOISE_INPUT(x, 6, Chunk)), */ +/* (COMPUTE_NOISE_INPUT(x, 7, Chunk)), */ +/* }; */ user_code diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index fc05e07c1..89da437fd 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -661,6 +661,7 @@ Terrain_Flat( world_chunk *Chunk, // Starting 227k +// Perlin_8x 110k link_internal u32 Terrain_FBM2D( world_chunk *Chunk, v3i NoiseBasis, @@ -745,6 +746,18 @@ Terrain_FBM2D( world_chunk *Chunk, { Assert(Chunk->DimInChunks > V3i(0)); + f32 xCoords[MIN_TERRAIN_NOISE_WIDTH] = + { + (COMPUTE_NOISE_INPUT(x, 0, Chunk)), + (COMPUTE_NOISE_INPUT(x, 1, Chunk)), + (COMPUTE_NOISE_INPUT(x, 2, Chunk)), + (COMPUTE_NOISE_INPUT(x, 3, Chunk)), + (COMPUTE_NOISE_INPUT(x, 4, Chunk)), + (COMPUTE_NOISE_INPUT(x, 5, Chunk)), + (COMPUTE_NOISE_INPUT(x, 6, Chunk)), + (COMPUTE_NOISE_INPUT(x, 7, Chunk)), + }; + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) { xCoords[ValueIndex] /= InteriorPeriod.x; @@ -762,7 +775,7 @@ Terrain_FBM2D( world_chunk *Chunk, } InteriorAmp = Max(1.f, InteriorAmp/2.f); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); From 5fc0070fcbdbcb7f1172072ef51597e63b3537ec Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 15 Sep 2024 15:36:27 -0700 Subject: [PATCH 022/421] Update stdlib --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 2a7ae98e0..c86e10aa4 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 2a7ae98e019246044279f7a86ab590e4e830d6a4 +Subproject commit c86e10aa4263ae001b926835a921a3e8f449a7cc From 1718c4a4efadd2efe3ce392424bcd6ff00df9803 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 16 Sep 2024 06:22:46 -0700 Subject: [PATCH 023/421] Position to SIMD PerlinNoise_8x --- generated/generate_stream_compact_v3i.h | 2 +- ...unctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...tions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/terrain.h | 12 ------------ src/engine/world_chunk.cpp | 18 ++++-------------- 5 files changed, 7 insertions(+), 29 deletions(-) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 2609e2a1d..70030ef1c 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3069:0 +// src/engine/world_chunk.cpp:3058:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index ce0bebeb8..4ea5c9a47 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2100:0 +// src/engine/world_chunk.cpp:2089:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index b2c014db2..8cd5d9cb0 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2103:0 +// src/engine/world_chunk.cpp:2092:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 573365332..fb610d8cd 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -87,18 +87,6 @@ poof( s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; -/* f32 xCoords[MIN_TERRAIN_NOISE_WIDTH] = */ -/* { */ -/* (COMPUTE_NOISE_INPUT(x, 0, Chunk)), */ -/* (COMPUTE_NOISE_INPUT(x, 1, Chunk)), */ -/* (COMPUTE_NOISE_INPUT(x, 2, Chunk)), */ -/* (COMPUTE_NOISE_INPUT(x, 3, Chunk)), */ -/* (COMPUTE_NOISE_INPUT(x, 4, Chunk)), */ -/* (COMPUTE_NOISE_INPUT(x, 5, Chunk)), */ -/* (COMPUTE_NOISE_INPUT(x, 6, Chunk)), */ -/* (COMPUTE_NOISE_INPUT(x, 7, Chunk)), */ -/* }; */ - user_code RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 89da437fd..d3801ea7c 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -746,27 +746,17 @@ Terrain_FBM2D( world_chunk *Chunk, { Assert(Chunk->DimInChunks > V3i(0)); - f32 xCoords[MIN_TERRAIN_NOISE_WIDTH] = - { - (COMPUTE_NOISE_INPUT(x, 0, Chunk)), - (COMPUTE_NOISE_INPUT(x, 1, Chunk)), - (COMPUTE_NOISE_INPUT(x, 2, Chunk)), - (COMPUTE_NOISE_INPUT(x, 3, Chunk)), - (COMPUTE_NOISE_INPUT(x, 4, Chunk)), - (COMPUTE_NOISE_INPUT(x, 5, Chunk)), - (COMPUTE_NOISE_INPUT(x, 6, Chunk)), - (COMPUTE_NOISE_INPUT(x, 7, Chunk)), - }; - + f32 xCoords[MIN_TERRAIN_NOISE_WIDTH]; RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) { - xCoords[ValueIndex] /= InteriorPeriod.x; + xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; } + f32 yIn = yCoord/InteriorPeriod.y; f32 zIn = zCoord/InteriorPeriod.z; // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues - f32 TmpPerlinResults[8]; + f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; PerlinNoise_8x(xCoords, yIn, zIn, TmpPerlinResults); RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) From c685b8d841a016944d63d613a4d128232e816884 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 16 Sep 2024 09:48:12 -0700 Subject: [PATCH 024/421] Interm SIMD Perlin_8x --- generated/copy_vertex_buffer_v3_u8_v3.h | 24 +++--- generated/copy_vertex_buffer_v3_u8_v3_u8.h | 24 +++--- generated/copy_vertex_buffer_v3_v3.h | 24 +++--- generated/copy_vertex_buffer_v3_v3_u8_f32.h | 24 +++--- generated/gen_common_vector_v2.h | 2 +- generated/gen_common_vector_v3.h | 2 +- generated/gen_common_vector_v3i.h | 2 +- generated/gen_lerp_v2.h | 2 +- generated/gen_lerp_v3.h | 2 +- generated/gen_vector_area_v2.h | 2 +- generated/gen_vector_area_v2i.h | 2 +- .../gen_vector_infix_operator_v3i_688856393.h | 2 +- .../gen_vector_infix_operator_v3i_688856449.h | 2 +- generated/gen_vector_normalize_funcs_v2.h | 2 +- generated/gen_vector_normalize_funcs_v3.h | 2 +- generated/maybe_v3.h | 2 +- generated/maybe_v3i.h | 2 +- ..._102235355_126003659_545884473_807650077.h | 78 +++++++++++++++++++ jesse.make.sh | 4 +- src/engine/mesh.h | 24 +++--- 20 files changed, 153 insertions(+), 75 deletions(-) create mode 100644 generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h diff --git a/generated/copy_vertex_buffer_v3_u8_v3.h b/generated/copy_vertex_buffer_v3_u8_v3.h index e07572313..7afc51c54 100644 --- a/generated/copy_vertex_buffer_v3_u8_v3.h +++ b/generated/copy_vertex_buffer_v3_u8_v3.h @@ -20,9 +20,9 @@ CopyVertexBuffer( v3_u8 *Dest, v3 *Src, u32 NumVerts, v3 Offset, v3 Scale, Quate auto Src1 = Rotate(Src[VertIndex + 1], Rot); auto Src2 = Rotate(Src[VertIndex + 2], Rot); - f32_reg Vert0; - f32_reg Vert1; - f32_reg Vert2; + f32_4x Vert0; + f32_4x Vert1; + f32_4x Vert2; Vert0.Sse = _mm_set_ps(0, Src0.z, Src0.y, Src0.x); Vert1.Sse = _mm_set_ps(0, Src1.z, Src1.y, Src1.x); @@ -32,9 +32,9 @@ CopyVertexBuffer( v3_u8 *Dest, v3 *Src, u32 NumVerts, v3 Offset, v3 Scale, Quate Vert1.Sse = _mm_add_ps( _mm_mul_ps(Vert1.Sse, mmScale), mmOffset); Vert2.Sse = _mm_add_ps( _mm_mul_ps(Vert2.Sse, mmScale), mmOffset); - v3_u8 Result0 = {{ u8(Vert0.F[0]), u8(Vert0.F[1]), u8(Vert0.F[2]) }}; - v3_u8 Result1 = {{ u8(Vert1.F[0]), u8(Vert1.F[1]), u8(Vert1.F[2]) }}; - v3_u8 Result2 = {{ u8(Vert2.F[0]), u8(Vert2.F[1]), u8(Vert2.F[2]) }}; + v3_u8 Result0 = {{ u8(Vert0.E[0]), u8(Vert0.E[1]), u8(Vert0.E[2]) }}; + v3_u8 Result1 = {{ u8(Vert1.E[0]), u8(Vert1.E[1]), u8(Vert1.E[2]) }}; + v3_u8 Result2 = {{ u8(Vert2.E[0]), u8(Vert2.E[1]), u8(Vert2.E[2]) }}; Dest[0] = Result0; Dest[1] = Result1; @@ -63,9 +63,9 @@ CopyVertexBuffer( v3_u8 *Dest, v3 *Src, u32 NumVerts, v3 Offset, v3 Scale ) auto Src1 = Src[VertIndex + 1]; auto Src2 = Src[VertIndex + 2]; - f32_reg Vert0; - f32_reg Vert1; - f32_reg Vert2; + f32_4x Vert0; + f32_4x Vert1; + f32_4x Vert2; Vert0.Sse = _mm_set_ps(0, Src0.z, Src0.y, Src0.x); Vert1.Sse = _mm_set_ps(0, Src1.z, Src1.y, Src1.x); @@ -75,9 +75,9 @@ CopyVertexBuffer( v3_u8 *Dest, v3 *Src, u32 NumVerts, v3 Offset, v3 Scale ) Vert1.Sse = _mm_add_ps( _mm_mul_ps(Vert1.Sse, mmScale), mmOffset); Vert2.Sse = _mm_add_ps( _mm_mul_ps(Vert2.Sse, mmScale), mmOffset); - v3_u8 Result0 = {{ u8(Vert0.F[0]), u8(Vert0.F[1]), u8(Vert0.F[2]) }}; - v3_u8 Result1 = {{ u8(Vert1.F[0]), u8(Vert1.F[1]), u8(Vert1.F[2]) }}; - v3_u8 Result2 = {{ u8(Vert2.F[0]), u8(Vert2.F[1]), u8(Vert2.F[2]) }}; + v3_u8 Result0 = {{ u8(Vert0.E[0]), u8(Vert0.E[1]), u8(Vert0.E[2]) }}; + v3_u8 Result1 = {{ u8(Vert1.E[0]), u8(Vert1.E[1]), u8(Vert1.E[2]) }}; + v3_u8 Result2 = {{ u8(Vert2.E[0]), u8(Vert2.E[1]), u8(Vert2.E[2]) }}; Dest[0] = Result0; Dest[1] = Result1; diff --git a/generated/copy_vertex_buffer_v3_u8_v3_u8.h b/generated/copy_vertex_buffer_v3_u8_v3_u8.h index 27c94ada2..c4c7f35c8 100644 --- a/generated/copy_vertex_buffer_v3_u8_v3_u8.h +++ b/generated/copy_vertex_buffer_v3_u8_v3_u8.h @@ -20,9 +20,9 @@ CopyVertexBuffer( v3_u8 *Dest, v3_u8 *Src, u32 NumVerts, v3 Offset, v3 Scale, Qu auto Src1 = Rotate(Src[VertIndex + 1], Rot); auto Src2 = Rotate(Src[VertIndex + 2], Rot); - f32_reg Vert0; - f32_reg Vert1; - f32_reg Vert2; + f32_4x Vert0; + f32_4x Vert1; + f32_4x Vert2; Vert0.Sse = _mm_set_ps(0, Src0.z, Src0.y, Src0.x); Vert1.Sse = _mm_set_ps(0, Src1.z, Src1.y, Src1.x); @@ -32,9 +32,9 @@ CopyVertexBuffer( v3_u8 *Dest, v3_u8 *Src, u32 NumVerts, v3 Offset, v3 Scale, Qu Vert1.Sse = _mm_add_ps( _mm_mul_ps(Vert1.Sse, mmScale), mmOffset); Vert2.Sse = _mm_add_ps( _mm_mul_ps(Vert2.Sse, mmScale), mmOffset); - v3_u8 Result0 = {{ u8(Vert0.F[0]), u8(Vert0.F[1]), u8(Vert0.F[2]) }}; - v3_u8 Result1 = {{ u8(Vert1.F[0]), u8(Vert1.F[1]), u8(Vert1.F[2]) }}; - v3_u8 Result2 = {{ u8(Vert2.F[0]), u8(Vert2.F[1]), u8(Vert2.F[2]) }}; + v3_u8 Result0 = {{ u8(Vert0.E[0]), u8(Vert0.E[1]), u8(Vert0.E[2]) }}; + v3_u8 Result1 = {{ u8(Vert1.E[0]), u8(Vert1.E[1]), u8(Vert1.E[2]) }}; + v3_u8 Result2 = {{ u8(Vert2.E[0]), u8(Vert2.E[1]), u8(Vert2.E[2]) }}; Dest[0] = Result0; Dest[1] = Result1; @@ -63,9 +63,9 @@ CopyVertexBuffer( v3_u8 *Dest, v3_u8 *Src, u32 NumVerts, v3 Offset, v3 Scale ) auto Src1 = Src[VertIndex + 1]; auto Src2 = Src[VertIndex + 2]; - f32_reg Vert0; - f32_reg Vert1; - f32_reg Vert2; + f32_4x Vert0; + f32_4x Vert1; + f32_4x Vert2; Vert0.Sse = _mm_set_ps(0, Src0.z, Src0.y, Src0.x); Vert1.Sse = _mm_set_ps(0, Src1.z, Src1.y, Src1.x); @@ -75,9 +75,9 @@ CopyVertexBuffer( v3_u8 *Dest, v3_u8 *Src, u32 NumVerts, v3 Offset, v3 Scale ) Vert1.Sse = _mm_add_ps( _mm_mul_ps(Vert1.Sse, mmScale), mmOffset); Vert2.Sse = _mm_add_ps( _mm_mul_ps(Vert2.Sse, mmScale), mmOffset); - v3_u8 Result0 = {{ u8(Vert0.F[0]), u8(Vert0.F[1]), u8(Vert0.F[2]) }}; - v3_u8 Result1 = {{ u8(Vert1.F[0]), u8(Vert1.F[1]), u8(Vert1.F[2]) }}; - v3_u8 Result2 = {{ u8(Vert2.F[0]), u8(Vert2.F[1]), u8(Vert2.F[2]) }}; + v3_u8 Result0 = {{ u8(Vert0.E[0]), u8(Vert0.E[1]), u8(Vert0.E[2]) }}; + v3_u8 Result1 = {{ u8(Vert1.E[0]), u8(Vert1.E[1]), u8(Vert1.E[2]) }}; + v3_u8 Result2 = {{ u8(Vert2.E[0]), u8(Vert2.E[1]), u8(Vert2.E[2]) }}; Dest[0] = Result0; Dest[1] = Result1; diff --git a/generated/copy_vertex_buffer_v3_v3.h b/generated/copy_vertex_buffer_v3_v3.h index 793a09f2a..f3cf67fe7 100644 --- a/generated/copy_vertex_buffer_v3_v3.h +++ b/generated/copy_vertex_buffer_v3_v3.h @@ -20,9 +20,9 @@ CopyVertexBuffer( v3 *Dest, v3 *Src, u32 NumVerts, v3 Offset, v3 Scale, Quaterni auto Src1 = Rotate(Src[VertIndex + 1], Rot); auto Src2 = Rotate(Src[VertIndex + 2], Rot); - f32_reg Vert0; - f32_reg Vert1; - f32_reg Vert2; + f32_4x Vert0; + f32_4x Vert1; + f32_4x Vert2; Vert0.Sse = _mm_set_ps(0, Src0.z, Src0.y, Src0.x); Vert1.Sse = _mm_set_ps(0, Src1.z, Src1.y, Src1.x); @@ -32,9 +32,9 @@ CopyVertexBuffer( v3 *Dest, v3 *Src, u32 NumVerts, v3 Offset, v3 Scale, Quaterni Vert1.Sse = _mm_add_ps( _mm_mul_ps(Vert1.Sse, mmScale), mmOffset); Vert2.Sse = _mm_add_ps( _mm_mul_ps(Vert2.Sse, mmScale), mmOffset); - v3 Result0 = {{ f32(Vert0.F[0]), f32(Vert0.F[1]), f32(Vert0.F[2]) }}; - v3 Result1 = {{ f32(Vert1.F[0]), f32(Vert1.F[1]), f32(Vert1.F[2]) }}; - v3 Result2 = {{ f32(Vert2.F[0]), f32(Vert2.F[1]), f32(Vert2.F[2]) }}; + v3 Result0 = {{ f32(Vert0.E[0]), f32(Vert0.E[1]), f32(Vert0.E[2]) }}; + v3 Result1 = {{ f32(Vert1.E[0]), f32(Vert1.E[1]), f32(Vert1.E[2]) }}; + v3 Result2 = {{ f32(Vert2.E[0]), f32(Vert2.E[1]), f32(Vert2.E[2]) }}; Dest[0] = Result0; Dest[1] = Result1; @@ -63,9 +63,9 @@ CopyVertexBuffer( v3 *Dest, v3 *Src, u32 NumVerts, v3 Offset, v3 Scale ) auto Src1 = Src[VertIndex + 1]; auto Src2 = Src[VertIndex + 2]; - f32_reg Vert0; - f32_reg Vert1; - f32_reg Vert2; + f32_4x Vert0; + f32_4x Vert1; + f32_4x Vert2; Vert0.Sse = _mm_set_ps(0, Src0.z, Src0.y, Src0.x); Vert1.Sse = _mm_set_ps(0, Src1.z, Src1.y, Src1.x); @@ -75,9 +75,9 @@ CopyVertexBuffer( v3 *Dest, v3 *Src, u32 NumVerts, v3 Offset, v3 Scale ) Vert1.Sse = _mm_add_ps( _mm_mul_ps(Vert1.Sse, mmScale), mmOffset); Vert2.Sse = _mm_add_ps( _mm_mul_ps(Vert2.Sse, mmScale), mmOffset); - v3 Result0 = {{ f32(Vert0.F[0]), f32(Vert0.F[1]), f32(Vert0.F[2]) }}; - v3 Result1 = {{ f32(Vert1.F[0]), f32(Vert1.F[1]), f32(Vert1.F[2]) }}; - v3 Result2 = {{ f32(Vert2.F[0]), f32(Vert2.F[1]), f32(Vert2.F[2]) }}; + v3 Result0 = {{ f32(Vert0.E[0]), f32(Vert0.E[1]), f32(Vert0.E[2]) }}; + v3 Result1 = {{ f32(Vert1.E[0]), f32(Vert1.E[1]), f32(Vert1.E[2]) }}; + v3 Result2 = {{ f32(Vert2.E[0]), f32(Vert2.E[1]), f32(Vert2.E[2]) }}; Dest[0] = Result0; Dest[1] = Result1; diff --git a/generated/copy_vertex_buffer_v3_v3_u8_f32.h b/generated/copy_vertex_buffer_v3_v3_u8_f32.h index f87937e0e..ca137f381 100644 --- a/generated/copy_vertex_buffer_v3_v3_u8_f32.h +++ b/generated/copy_vertex_buffer_v3_v3_u8_f32.h @@ -20,9 +20,9 @@ CopyVertexBuffer( v3 *Dest, v3_u8 *Src, u32 NumVerts, v3 Offset, v3 Scale, Quate auto Src1 = Rotate(Src[VertIndex + 1], Rot); auto Src2 = Rotate(Src[VertIndex + 2], Rot); - f32_reg Vert0; - f32_reg Vert1; - f32_reg Vert2; + f32_4x Vert0; + f32_4x Vert1; + f32_4x Vert2; Vert0.Sse = _mm_set_ps(0, Src0.z, Src0.y, Src0.x); Vert1.Sse = _mm_set_ps(0, Src1.z, Src1.y, Src1.x); @@ -32,9 +32,9 @@ CopyVertexBuffer( v3 *Dest, v3_u8 *Src, u32 NumVerts, v3 Offset, v3 Scale, Quate Vert1.Sse = _mm_add_ps( _mm_mul_ps(Vert1.Sse, mmScale), mmOffset); Vert2.Sse = _mm_add_ps( _mm_mul_ps(Vert2.Sse, mmScale), mmOffset); - v3 Result0 = {{ f32(Vert0.F[0]), f32(Vert0.F[1]), f32(Vert0.F[2]) }}; - v3 Result1 = {{ f32(Vert1.F[0]), f32(Vert1.F[1]), f32(Vert1.F[2]) }}; - v3 Result2 = {{ f32(Vert2.F[0]), f32(Vert2.F[1]), f32(Vert2.F[2]) }}; + v3 Result0 = {{ f32(Vert0.E[0]), f32(Vert0.E[1]), f32(Vert0.E[2]) }}; + v3 Result1 = {{ f32(Vert1.E[0]), f32(Vert1.E[1]), f32(Vert1.E[2]) }}; + v3 Result2 = {{ f32(Vert2.E[0]), f32(Vert2.E[1]), f32(Vert2.E[2]) }}; Dest[0] = Result0; Dest[1] = Result1; @@ -63,9 +63,9 @@ CopyVertexBuffer( v3 *Dest, v3_u8 *Src, u32 NumVerts, v3 Offset, v3 Scale ) auto Src1 = Src[VertIndex + 1]; auto Src2 = Src[VertIndex + 2]; - f32_reg Vert0; - f32_reg Vert1; - f32_reg Vert2; + f32_4x Vert0; + f32_4x Vert1; + f32_4x Vert2; Vert0.Sse = _mm_set_ps(0, Src0.z, Src0.y, Src0.x); Vert1.Sse = _mm_set_ps(0, Src1.z, Src1.y, Src1.x); @@ -75,9 +75,9 @@ CopyVertexBuffer( v3 *Dest, v3_u8 *Src, u32 NumVerts, v3 Offset, v3 Scale ) Vert1.Sse = _mm_add_ps( _mm_mul_ps(Vert1.Sse, mmScale), mmOffset); Vert2.Sse = _mm_add_ps( _mm_mul_ps(Vert2.Sse, mmScale), mmOffset); - v3 Result0 = {{ f32(Vert0.F[0]), f32(Vert0.F[1]), f32(Vert0.F[2]) }}; - v3 Result1 = {{ f32(Vert1.F[0]), f32(Vert1.F[1]), f32(Vert1.F[2]) }}; - v3 Result2 = {{ f32(Vert2.F[0]), f32(Vert2.F[1]), f32(Vert2.F[2]) }}; + v3 Result0 = {{ f32(Vert0.E[0]), f32(Vert0.E[1]), f32(Vert0.E[2]) }}; + v3 Result1 = {{ f32(Vert1.E[0]), f32(Vert1.E[1]), f32(Vert1.E[2]) }}; + v3 Result2 = {{ f32(Vert2.E[0]), f32(Vert2.E[1]), f32(Vert2.E[2]) }}; Dest[0] = Result0; Dest[1] = Result1; diff --git a/generated/gen_common_vector_v2.h b/generated/gen_common_vector_v2.h index f40109615..27a186f63 100644 --- a/generated/gen_common_vector_v2.h +++ b/generated/gen_common_vector_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:788:0 +// external/bonsai_stdlib/src/vector.h:782:0 inline r32 LengthSq( v2 Vec ) diff --git a/generated/gen_common_vector_v3.h b/generated/gen_common_vector_v3.h index 6d2b74eef..6d7e76e63 100644 --- a/generated/gen_common_vector_v3.h +++ b/generated/gen_common_vector_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:791:0 +// external/bonsai_stdlib/src/vector.h:785:0 inline r32 LengthSq( v3 Vec ) diff --git a/generated/gen_common_vector_v3i.h b/generated/gen_common_vector_v3i.h index 10f478493..17915d817 100644 --- a/generated/gen_common_vector_v3i.h +++ b/generated/gen_common_vector_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:794:0 +// external/bonsai_stdlib/src/vector.h:788:0 inline s32 LengthSq( v3i Vec ) diff --git a/generated/gen_lerp_v2.h b/generated/gen_lerp_v2.h index 801286d62..ca87f8c48 100644 --- a/generated/gen_lerp_v2.h +++ b/generated/gen_lerp_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:771:0 +// external/bonsai_stdlib/src/vector.h:765:0 inline v2 Lerp(r32 t, v2 P1, v2 P2) diff --git a/generated/gen_lerp_v3.h b/generated/gen_lerp_v3.h index c263fe0f8..e6a43ddbd 100644 --- a/generated/gen_lerp_v3.h +++ b/generated/gen_lerp_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:774:0 +// external/bonsai_stdlib/src/vector.h:768:0 inline v3 Lerp(r32 t, v3 P1, v3 P2) diff --git a/generated/gen_vector_area_v2.h b/generated/gen_vector_area_v2.h index 2420e773b..5a01ba207 100644 --- a/generated/gen_vector_area_v2.h +++ b/generated/gen_vector_area_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:782:0 +// external/bonsai_stdlib/src/vector.h:776:0 inline r32 Area( v2 Vec ) diff --git a/generated/gen_vector_area_v2i.h b/generated/gen_vector_area_v2i.h index adfa2b4f5..57c0e4fce 100644 --- a/generated/gen_vector_area_v2i.h +++ b/generated/gen_vector_area_v2i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:785:0 +// external/bonsai_stdlib/src/vector.h:779:0 inline s32 Area( v2i Vec ) diff --git a/generated/gen_vector_infix_operator_v3i_688856393.h b/generated/gen_vector_infix_operator_v3i_688856393.h index d00a795c6..634e0f98e 100644 --- a/generated/gen_vector_infix_operator_v3i_688856393.h +++ b/generated/gen_vector_infix_operator_v3i_688856393.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:768:0 +// external/bonsai_stdlib/src/vector.h:762:0 inline v3i operator&( v3i P1, v3i P2 ) diff --git a/generated/gen_vector_infix_operator_v3i_688856449.h b/generated/gen_vector_infix_operator_v3i_688856449.h index ccfd0b5c5..6085bbf5c 100644 --- a/generated/gen_vector_infix_operator_v3i_688856449.h +++ b/generated/gen_vector_infix_operator_v3i_688856449.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:765:0 +// external/bonsai_stdlib/src/vector.h:759:0 inline v3i operator^( v3i P1, v3i P2 ) diff --git a/generated/gen_vector_normalize_funcs_v2.h b/generated/gen_vector_normalize_funcs_v2.h index 7cfb74479..1a1d47f9b 100644 --- a/generated/gen_vector_normalize_funcs_v2.h +++ b/generated/gen_vector_normalize_funcs_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:797:0 +// external/bonsai_stdlib/src/vector.h:791:0 inline v2 Normalize( v2 Vec, r32 Length) diff --git a/generated/gen_vector_normalize_funcs_v3.h b/generated/gen_vector_normalize_funcs_v3.h index 597def2ce..b8a5ca372 100644 --- a/generated/gen_vector_normalize_funcs_v3.h +++ b/generated/gen_vector_normalize_funcs_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:800:0 +// external/bonsai_stdlib/src/vector.h:794:0 inline v3 Normalize( v3 Vec, r32 Length) diff --git a/generated/maybe_v3.h b/generated/maybe_v3.h index 7106994e9..db4e42731 100644 --- a/generated/maybe_v3.h +++ b/generated/maybe_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1138:0 +// external/bonsai_stdlib/src/vector.h:1132:0 struct maybe_v3 { diff --git a/generated/maybe_v3i.h b/generated/maybe_v3i.h index 2962c1a7a..a086427cd 100644 --- a/generated/maybe_v3i.h +++ b/generated/maybe_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1140:0 +// external/bonsai_stdlib/src/vector.h:1134:0 struct maybe_v3i { diff --git a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h new file mode 100644 index 000000000..16b5dfd3b --- /dev/null +++ b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h @@ -0,0 +1,78 @@ +// src/engine/world_chunk.cpp:741:0 + +// NOTE(Jesse): This must hold true for using any Noise_8x func +Assert(Chunk->Dim % V3i(MIN_TERRAIN_NOISE_WIDTH) == V3i(0)); + +Period = Max(Period, V3(1.f)); + + +/* s32 xChunkMax = Dim.x/MIN_TERRAIN_NOISE_WIDTH; */ + +for ( s32 z = 0; z < Dim.z; ++ z) +{ + f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); + f32 WorldZBiased = zCoord - zMin; + for ( s32 y = 0; y < Dim.y; ++ y) + { + f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); + for ( s32 x = 0; x < Dim.x; x += MIN_TERRAIN_NOISE_WIDTH ) + { + s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); + Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + + + v3 InteriorPeriod = Period; + r32 InteriorAmp = r32(Amplitude); + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + Assert(Chunk->DimInChunks > V3i(0)); + + f32 xCoords[MIN_TERRAIN_NOISE_WIDTH]; + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; + } + + f32 yIn = yCoord/InteriorPeriod.y; + f32 zIn = zCoord/InteriorPeriod.z; + + // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues + f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; + PerlinNoise_8x(xCoords, yIn, zIn, TmpPerlinResults); + + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; + } + + InteriorAmp = Max(1.f, InteriorAmp/2.f); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } + + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + + + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + s32 ThisIndex = VoxIndex+ValueIndex; + b32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; + ChunkSum += NoiseChoice; + + SetFlag(&Chunk->Voxels[ThisIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); + Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + + Assert( (Chunk->Voxels[ThisIndex].Flags&VoxelFaceMask) == 0); + if (NoiseChoice) + { + Assert( IsSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); + } + else + { + Assert( NotSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); + } + } + + } + } +} + diff --git a/jesse.make.sh b/jesse.make.sh index a405a5f0e..c68d3c716 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,9 +11,9 @@ OPT="-O2" ./make.sh $OPT \ BuildExecutables \ - BuildSingleExample examples/blank_project \ - BuildSingleExample examples/project_and_level_picker \ BuildSingleExample examples/terrain_gen \ + # BuildSingleExample examples/blank_project \ + # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ # BuildSingleExample examples/tools/voxel_synthesis_rule_baker \ # BuildSingleExample examples/turn_based \ diff --git a/src/engine/mesh.h b/src/engine/mesh.h index cc0de4b15..e1767ce64 100644 --- a/src/engine/mesh.h +++ b/src/engine/mesh.h @@ -174,9 +174,9 @@ poof( auto Src1 = Rotate(Src[VertIndex + 1], Rot); auto Src2 = Rotate(Src[VertIndex + 2], Rot); - f32_reg Vert0; - f32_reg Vert1; - f32_reg Vert2; + f32_4x Vert0; + f32_4x Vert1; + f32_4x Vert2; Vert0.Sse = _mm_set_ps(0, Src0.z, Src0.y, Src0.x); Vert1.Sse = _mm_set_ps(0, Src1.z, Src1.y, Src1.x); @@ -186,9 +186,9 @@ poof( Vert1.Sse = _mm_add_ps( _mm_mul_ps(Vert1.Sse, mmScale), mmOffset); Vert2.Sse = _mm_add_ps( _mm_mul_ps(Vert2.Sse, mmScale), mmOffset); - dest_t.name Result0 = {{ result_primitive_t.name(Vert0.F[0]), result_primitive_t.name(Vert0.F[1]), result_primitive_t.name(Vert0.F[2]) }}; - dest_t.name Result1 = {{ result_primitive_t.name(Vert1.F[0]), result_primitive_t.name(Vert1.F[1]), result_primitive_t.name(Vert1.F[2]) }}; - dest_t.name Result2 = {{ result_primitive_t.name(Vert2.F[0]), result_primitive_t.name(Vert2.F[1]), result_primitive_t.name(Vert2.F[2]) }}; + dest_t.name Result0 = {{ result_primitive_t.name(Vert0.E[0]), result_primitive_t.name(Vert0.E[1]), result_primitive_t.name(Vert0.E[2]) }}; + dest_t.name Result1 = {{ result_primitive_t.name(Vert1.E[0]), result_primitive_t.name(Vert1.E[1]), result_primitive_t.name(Vert1.E[2]) }}; + dest_t.name Result2 = {{ result_primitive_t.name(Vert2.E[0]), result_primitive_t.name(Vert2.E[1]), result_primitive_t.name(Vert2.E[2]) }}; Dest[0] = Result0; Dest[1] = Result1; @@ -217,9 +217,9 @@ poof( auto Src1 = Src[VertIndex + 1]; auto Src2 = Src[VertIndex + 2]; - f32_reg Vert0; - f32_reg Vert1; - f32_reg Vert2; + f32_4x Vert0; + f32_4x Vert1; + f32_4x Vert2; Vert0.Sse = _mm_set_ps(0, Src0.z, Src0.y, Src0.x); Vert1.Sse = _mm_set_ps(0, Src1.z, Src1.y, Src1.x); @@ -229,9 +229,9 @@ poof( Vert1.Sse = _mm_add_ps( _mm_mul_ps(Vert1.Sse, mmScale), mmOffset); Vert2.Sse = _mm_add_ps( _mm_mul_ps(Vert2.Sse, mmScale), mmOffset); - dest_t.name Result0 = {{ result_primitive_t.name(Vert0.F[0]), result_primitive_t.name(Vert0.F[1]), result_primitive_t.name(Vert0.F[2]) }}; - dest_t.name Result1 = {{ result_primitive_t.name(Vert1.F[0]), result_primitive_t.name(Vert1.F[1]), result_primitive_t.name(Vert1.F[2]) }}; - dest_t.name Result2 = {{ result_primitive_t.name(Vert2.F[0]), result_primitive_t.name(Vert2.F[1]), result_primitive_t.name(Vert2.F[2]) }}; + dest_t.name Result0 = {{ result_primitive_t.name(Vert0.E[0]), result_primitive_t.name(Vert0.E[1]), result_primitive_t.name(Vert0.E[2]) }}; + dest_t.name Result1 = {{ result_primitive_t.name(Vert1.E[0]), result_primitive_t.name(Vert1.E[1]), result_primitive_t.name(Vert1.E[2]) }}; + dest_t.name Result2 = {{ result_primitive_t.name(Vert2.E[0]), result_primitive_t.name(Vert2.E[1]), result_primitive_t.name(Vert2.E[2]) }}; Dest[0] = Result0; Dest[1] = Result1; From d5c76ae843a66666759ce49169684785447854cc Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 16 Sep 2024 17:09:02 -0700 Subject: [PATCH 025/421] Finish SIMD optimizing Perlin8x .. for now --- examples/terrain_gen/game.cpp | 2 +- external/bonsai_stdlib | 2 +- jesse.make.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index e35f1bc08..eb7968eb2 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -463,7 +463,7 @@ BONSAI_API_WORKER_THREAD_CALLBACK() v3 Period = V3(2500); s32 Amplititude = 1500; s32 StartingZDepth = 100; - u32 Octaves = 6; + u32 Octaves = 3; /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index c86e10aa4..2e1e8e4bf 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit c86e10aa4263ae001b926835a921a3e8f449a7cc +Subproject commit 2e1e8e4bf618a3eba301eadf22f35ef6d9852f42 diff --git a/jesse.make.sh b/jesse.make.sh index c68d3c716..ea3da9380 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -10,8 +10,8 @@ OPT="-O2" # ./make.sh RunTests ./make.sh $OPT \ - BuildExecutables \ BuildSingleExample examples/terrain_gen \ + BuildExecutables \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ From d999d4524d5844c22901747d74943bdc303a08ea Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 17 Sep 2024 10:35:04 -0700 Subject: [PATCH 026/421] Fix a bug in the scalar version of Terrain_FBM2D --- src/engine/world_chunk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index d3801ea7c..128c6173c 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -725,7 +725,7 @@ Terrain_FBM2D( world_chunk *Chunk, s32 InteriorAmp = Amplitude; for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { - NoiseValue = PerlinNoise(NoiseInput/IPeriod) * InteriorAmp; + NoiseValue += PerlinNoise(NoiseInput/IPeriod) * InteriorAmp; InteriorAmp = Max(1, InteriorAmp/2); IPeriod = Max(V3(1.f), IPeriod/2); From fe88e63cef4f07592c0e1cf231f14c66cf96a855 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 17 Sep 2024 21:57:52 -0700 Subject: [PATCH 027/421] Minor profiling / histogram tweaks --- external/bonsai_stdlib | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 15 +++++ .../gen_default_equality_operator_ui_id.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- ..._102235355_126003659_545884473_807650077.h | 61 ++++++++++--------- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/terrain.h | 18 +++--- src/engine/world_chunk.cpp | 45 ++++++++------ 9 files changed, 87 insertions(+), 62 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 2e1e8e4bf..b06a70486 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 2e1e8e4bf618a3eba301eadf22f35ef6d9852f42 +Subproject commit b06a70486d05a828ee16c37a8aee9043f0d4e52b diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index be330e635..16031f87c 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -280,6 +280,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bonsai_futex*,&Element->HistogramFutex), + CSz("HistogramFutex"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/gen_default_equality_operator_ui_id.h b/generated/gen_default_equality_operator_ui_id.h index d5012f64b..cdf26f088 100644 --- a/generated/gen_default_equality_operator_ui_id.h +++ b/generated/gen_default_equality_operator_ui_id.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/interactable.h:29:0 +// external/bonsai_stdlib/src/ui/interactable.h:27:0 link_internal b32 operator==( ui_id E1, ui_id E2 ) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 70030ef1c..4f73b169d 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3058:0 +// src/engine/world_chunk.cpp:3063:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h index 16b5dfd3b..3aa0dcb4a 100644 --- a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h +++ b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h @@ -21,35 +21,40 @@ for ( s32 z = 0; z < Dim.z; ++ z) Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; - v3 InteriorPeriod = Period; - r32 InteriorAmp = r32(Amplitude); - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + { - Assert(Chunk->DimInChunks > V3i(0)); + HISTOGRAM_FUNCTION(); + v3 InteriorPeriod = Period; + r32 InteriorAmp = r32(Amplitude); f32 xCoords[MIN_TERRAIN_NOISE_WIDTH]; - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { - xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; - } + Assert(Chunk->DimInChunks > V3i(0)); - f32 yIn = yCoord/InteriorPeriod.y; - f32 zIn = zCoord/InteriorPeriod.z; + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; + } - // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues - f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; - PerlinNoise_8x(xCoords, yIn, zIn, TmpPerlinResults); + f32 yIn = yCoord/InteriorPeriod.y; + f32 zIn = zCoord/InteriorPeriod.z; - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) - { - NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; + // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues + f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; + PerlinNoise_8x(xCoords, yIn, zIn, TmpPerlinResults); + + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; + } + + InteriorAmp = Max(1.f, InteriorAmp/2.f); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - InteriorAmp = Max(1.f, InteriorAmp/2.f); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - - u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) @@ -61,15 +66,15 @@ for ( s32 z = 0; z < Dim.z; ++ z) SetFlag(&Chunk->Voxels[ThisIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); - Assert( (Chunk->Voxels[ThisIndex].Flags&VoxelFaceMask) == 0); - if (NoiseChoice) - { - Assert( IsSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); - } + /* Assert( (Chunk->Voxels[ThisIndex].Flags&VoxelFaceMask) == 0); */ + /* if (NoiseChoice) */ + /* { */ + /* Assert( IsSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); */ + /* } */ + /* else */ + /* { */ + /* Assert( NotSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); */ + /* } */ } } diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 4ea5c9a47..0c03d8b1f 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2089:0 +// src/engine/world_chunk.cpp:2094:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 8cd5d9cb0..2f78f6c40 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2092:0 +// src/engine/world_chunk.cpp:2097:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, diff --git a/src/engine/terrain.h b/src/engine/terrain.h index fb610d8cd..bfd26d2c0 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -98,15 +98,15 @@ poof( SetFlag(&Chunk->Voxels[ThisIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); Chunk->Voxels[ThisIndex].Color = packed_HSV_color_value_name*u16(NoiseChoice); - Assert( (Chunk->Voxels[ThisIndex].Flags&VoxelFaceMask) == 0); - if (NoiseChoice) - { - Assert( IsSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); - } + /* Assert( (Chunk->Voxels[ThisIndex].Flags&VoxelFaceMask) == 0); */ + /* if (NoiseChoice) */ + /* { */ + /* Assert( IsSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); */ + /* } */ + /* else */ + /* { */ + /* Assert( NotSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); */ + /* } */ } } diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 128c6173c..9ba9c3a42 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -668,7 +668,7 @@ Terrain_FBM2D( world_chunk *Chunk, void *NoiseParams, void *OctaveCount ) { - HISTOGRAM_FUNCTION(); + /* HISTOGRAM_FUNCTION(); */ /* TIMED_FUNCTION(); */ UNPACK_NOISE_PARAMS(NoiseParams); @@ -740,35 +740,40 @@ Terrain_FBM2D( world_chunk *Chunk, poof( terrain_iteration_pattern_8x({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, { - v3 InteriorPeriod = Period; - r32 InteriorAmp = r32(Amplitude); - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + { - Assert(Chunk->DimInChunks > V3i(0)); + HISTOGRAM_FUNCTION(); + v3 InteriorPeriod = Period; + r32 InteriorAmp = r32(Amplitude); f32 xCoords[MIN_TERRAIN_NOISE_WIDTH]; - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { - xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; - } + Assert(Chunk->DimInChunks > V3i(0)); - f32 yIn = yCoord/InteriorPeriod.y; - f32 zIn = zCoord/InteriorPeriod.z; + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; + } - // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues - f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; - PerlinNoise_8x(xCoords, yIn, zIn, TmpPerlinResults); + f32 yIn = yCoord/InteriorPeriod.y; + f32 zIn = zCoord/InteriorPeriod.z; - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) - { - NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; + // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues + f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; + PerlinNoise_8x(xCoords, yIn, zIn, TmpPerlinResults); + + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; + } + + InteriorAmp = Max(1.f, InteriorAmp/2.f); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - InteriorAmp = Max(1.f, InteriorAmp/2.f); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - - u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); } )) #include From 83692a2720a8d1952c2567f46721dc99706c9464 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 18 Sep 2024 07:37:14 -0700 Subject: [PATCH 028/421] Move Voxel_Filled bit into it's own discrete array --- examples/terrain_gen/game.cpp | 32 +--- ..._voxel_synthesis_change_propagation_info.h | 2 +- generated/block_array_entity_ptr_688856411.h | 2 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 16 ++ ..._editor_ui_for_compound_type_world_chunk.h | 20 +- ...on_pattern_199741702_161749140_632272777.h | 11 +- ..._iteration_pattern_275071431_101859599_0.h | 8 +- ..._iteration_pattern_275071431_785723886_0.h | 8 +- ..._iteration_pattern_846291950_267608728_0.h | 14 +- ..._voxel_synthesis_change_propagation_info.h | 2 +- ...thesis_change_propagation_info_803395170.h | 2 +- .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- ...e_string_table_world_chunk_mesh_bitfield.h | 2 +- ...rate_string_table_world_chunk_mesh_index.h | 2 +- generated/hashtable_voxel_synth_tile.h | 2 +- generated/maybe_chunk_data.h | 2 +- generated/maybe_standing_spot.h | 2 +- .../rectalinear_iteration_pattern_398799212.h | 7 +- .../rectalinear_iteration_pattern_416827956.h | 2 +- .../rectalinear_iteration_pattern_428632106.h | 5 +- .../rectalinear_iteration_pattern_530902269.h | 2 +- .../rectalinear_iteration_pattern_583358156.h | 5 +- .../rectalinear_iteration_pattern_631222419.h | 5 +- .../rectalinear_iteration_pattern_643608995.h | 8 +- .../rectalinear_iteration_pattern_812652930.h | 2 +- .../rectalinear_iteration_pattern_920026661.h | 2 +- .../rectalinear_iteration_pattern_992879728.h | 5 +- .../rectalinear_iteration_pattern_99934950.h | 5 +- generated/serdes_struct_world_chunk.h | 28 +++ ..._102235355_126003659_545884473_807650077.h | 24 +-- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/api.cpp | 1 + src/engine/asset.cpp | 2 +- src/engine/bonsai.h | 41 +--- src/engine/chunk.cpp | 49 +++-- src/engine/debug.cpp | 2 +- src/engine/editor.cpp | 14 +- src/engine/engine.cpp | 2 + src/engine/engine.h | 1 + src/engine/entity.cpp | 4 +- src/engine/loaders/vox.cpp | 22 +-- src/engine/terrain.cpp | 118 +++--------- src/engine/terrain.h | 22 +-- src/engine/voxel.cpp | 29 +++ src/engine/voxel.h | 23 +++ src/engine/voxel_synthesis.cpp | 4 +- src/engine/voxel_synthesis.h | 11 +- src/engine/world_chunk.cpp | 177 ++++++++++-------- src/engine/world_chunk.h | 16 +- src/engine/world_update.cpp | 79 +++++--- 57 files changed, 466 insertions(+), 396 deletions(-) create mode 100644 src/engine/voxel.cpp create mode 100644 src/engine/voxel.h diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index eb7968eb2..1cd5175fe 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -32,7 +32,8 @@ Terrain_Checkerboard( world_chunk *Chunk, if (WorldZ < zMin) { s32 Index = GetIndex(Voxel_Position(x,y,z), Dim); - Chunk->Voxels[Index].Flags = Voxel_Filled; + /* Chunk->Voxels[Index].Flags = Voxel_Filled; */ + SetOccupancyBit(Chunk, Index, VoxelOccupancy_Filled); Chunk->Voxels[Index].Color = RGBtoPackedHSV(RGBColor); ++Result; } @@ -71,7 +72,7 @@ GrassyIslandTerrain( world_chunk *Chunk, s64 WorldX = x - SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); + /* Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); */ r32 NoiseValue = 0.f; for (u32 OctaveIndex = 0; OctaveIndex < OctaveCount; ++OctaveIndex) @@ -223,23 +224,13 @@ GrassyIslandTerrain( world_chunk *Chunk, } #endif - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); + /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); */ + SetOccupancyBit(Chunk, VoxIndex, s32(NoiseChoice)); Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor)*u16(NoiseChoice); Chunk->Voxels[VoxIndex].Transparency = ThisTransparency; ChunkSum += NoiseChoice; - - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); - - if (NoiseChoice) - { - Assert( IsSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } } } } @@ -276,7 +267,6 @@ WarpedTerrain( world_chunk *Chunk, s64 WorldX = x - SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); r32 NoiseValue = 0.f; for (u32 OctaveIndex = 0; OctaveIndex < OctaveCount; ++OctaveIndex) @@ -323,20 +313,12 @@ WarpedTerrain( world_chunk *Chunk, } #endif - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); + /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); */ + SetOccupancyBit(Chunk, VoxIndex, s32(NoiseChoice)); Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor)*u16(NoiseChoice); ChunkSum += NoiseChoice; Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); - - if (NoiseChoice) - { - Assert( IsSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } } } } diff --git a/generated/are_equal_voxel_synthesis_change_propagation_info.h b/generated/are_equal_voxel_synthesis_change_propagation_info.h index f00ef89c5..23e9937dc 100644 --- a/generated/are_equal_voxel_synthesis_change_propagation_info.h +++ b/generated/are_equal_voxel_synthesis_change_propagation_info.h @@ -1,4 +1,4 @@ -// src/engine/voxel_synthesis.h:307:0 +// src/engine/voxel_synthesis.h:312:0 link_internal b32 AreEqual(voxel_synthesis_change_propagation_info *Thing1, voxel_synthesis_change_propagation_info *Thing2) diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h index e2e6ce4f7..5d65c86ff 100644 --- a/generated/block_array_entity_ptr_688856411.h +++ b/generated/block_array_entity_ptr_688856411.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:326:0 +// src/engine/world_chunk.h:327:0 struct entity_ptr_block { diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index b275eadaa..1e8d1ffb1 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:464:0 +// src/engine/world_chunk.h:466:0 struct world_chunk_ptr_block { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 434a7597a..7b19384d1 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:505:0 +// src/engine/world_chunk.h:507:0 struct standing_spot_block { diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 0ee6a7de2..29b2939db 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:532:0 +// src/engine/world_chunk.h:534:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index 866616d7c..f97560ba2 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:461:0 +// src/engine/world_chunk.h:463:0 struct world_chunk_ptr_buffer { diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 96d5e2c76..545084dea 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -56,6 +56,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u8*, Element->Occupancy), + CSz("Occupancy"), + Params + ); + + + + + + + + PushNewRow(Ui); + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 75362002c..5edca7f3a 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -71,6 +71,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u8*, Element->Occupancy), + CSz("Occupancy"), + Params + ); + + + + + + + + PushNewRow(Ui); + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there @@ -285,11 +301,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v _Pad1[28]"), CSz("> _Pad1[28]"), UiId(Window, "toggle world_chunk u8 _Pad1", Element->_Pad1), Params )) + if (ToggleButton(Ui, CSz("v _Pad1[20]"), CSz("> _Pad1[20]"), UiId(Window, "toggle world_chunk u8 _Pad1", Element->_Pad1), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 28) + RangeIterator(ArrayIndex, 20) { DoEditorUi(Ui, Window, Element->_Pad1+ArrayIndex, FSz("_Pad1[%d]", ArrayIndex), Params); diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index 5317bd211..7f5f6de12 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:557:0 +// src/engine/world_update.cpp:559:0 random_series ColorEntropy = {4654376543246}; @@ -27,7 +27,8 @@ while (AtElements(&Stack)) v3i CenterToVoxP = SimVoxP - FloodOrigin; - if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&Voxel_Filled) == 0) + NotImplemented; + /* if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&Voxel_Filled) == 0) */ { if ( (V->Flags & Voxel_MarkBit) == 0) @@ -42,7 +43,8 @@ while (AtElements(&Stack)) } - if ( Length(CenterToVoxP) < SquareRoot(RadiusSquared)-1.f && (V->Flags&Voxel_Filled) ) + NotImplemented; + /* if ( Length(CenterToVoxP) < SquareRoot(RadiusSquared)-1.f && (V->Flags&Voxel_Filled) ) */ { V->Flags = Voxel_Empty; } @@ -82,7 +84,8 @@ while (AtElements(&Stack)) v3i CenterToVoxP = SimVoxP - EditCenterP; if (Length(CenterToVoxP) < SquareRoot(RadiusSquared)-1.f) { - if (V->Flags & Voxel_Filled) + NotImplemented; + /* if (V->Flags & Voxel_Filled) */ { V->Color = MagicaVoxelDefaultPaletteToPackedHSV(SafeTruncateU8(RandomBetween((u32)MCV_GREY_5, &ColorEntropy, (u32)MCV_GREY_8+1))); } diff --git a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h index 7dbe6b429..cd3c65c32 100644 --- a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:797:0 +// src/engine/world_update.cpp:813:0 random_series ColorEntropy = {4654376543246}; @@ -29,7 +29,8 @@ while (AtElements(&Stack)) v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - if (Contains(SSRect, SimVoxP) && (V->Flags&Voxel_Filled) == 0) + NotImplemented; + /* if (Contains(SSRect, SimVoxP) && (V->Flags&Voxel_Filled) == 0) */ { if ( (V->Flags & Voxel_MarkBit) == 0) @@ -44,7 +45,8 @@ while (AtElements(&Stack)) } - if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { *V = {}; } + NotImplemented; + /* if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { *V = {}; } */ V->Flags |= Voxel_MarkBit; diff --git a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h index 1fe18d8a9..169444b81 100644 --- a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:781:0 +// src/engine/world_update.cpp:795:0 random_series ColorEntropy = {4654376543246}; @@ -29,7 +29,8 @@ while (AtElements(&Stack)) v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - if ((V->Flags&Voxel_Filled)) + NotImplemented; + /* if ((V->Flags&Voxel_Filled)) */ { if ( (V->Flags & Voxel_MarkBit) == 0) @@ -44,7 +45,8 @@ while (AtElements(&Stack)) } - if ( ((V->Flags&Voxel_Filled) == 0) && NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { *V = *NewVoxelValue; } + NotImplemented; + /* if ( ((V->Flags&Voxel_Filled) == 0) && NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { *V = *NewVoxelValue; } */ V->Flags |= Voxel_MarkBit; diff --git a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h index 2a03b9c21..c2d1e135c 100644 --- a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h +++ b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:661:0 +// src/engine/world_update.cpp:668:0 random_series ColorEntropy = {4654376543246}; @@ -26,7 +26,10 @@ while (AtElements(&Stack)) v3i CenterToVoxP = SimVoxP - FloodOrigin; - if ( (V->Flags&Voxel_Filled) == (Voxel_Filled*(Mode==WorldEdit_Mode_Attach)) ) + + NotImplemented; + /* { if ( (V->Flags&Voxel_Filled) == (Voxel_Filled*(Mode==WorldEdit_Mode_Attach)) ) }, */ + { if ( (V->Flags & Voxel_MarkBit) == 0) { @@ -40,9 +43,10 @@ while (AtElements(&Stack)) } - if ( Mode == WorldEdit_Mode_Attach && (V->Flags&Voxel_Filled) ) - { } - else + NotImplemented; + /* if ( Mode == WorldEdit_Mode_Attach && (V->Flags&Voxel_Filled) ) */ + /* { } */ + /* else */ { OverwriteVoxel = True; } diff --git a/generated/gen_constructor_voxel_synthesis_change_propagation_info.h b/generated/gen_constructor_voxel_synthesis_change_propagation_info.h index 07de319f4..beb2cf292 100644 --- a/generated/gen_constructor_voxel_synthesis_change_propagation_info.h +++ b/generated/gen_constructor_voxel_synthesis_change_propagation_info.h @@ -1,4 +1,4 @@ -// src/engine/voxel_synthesis.h:304:0 +// src/engine/voxel_synthesis.h:309:0 link_internal voxel_synthesis_change_propagation_info VoxelSynthesisChangePropagationInfo( tile_rule PrevTileOptions , v3i PrevTileP , v3i DirOfTravel ) diff --git a/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h b/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h index 31a5ec0ca..74a7ecacb 100644 --- a/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h +++ b/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h @@ -1,4 +1,4 @@ -// src/engine/voxel_synthesis.h:310:0 +// src/engine/voxel_synthesis.h:315:0 struct voxel_synthesis_change_propagation_info_stack { diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 96ae0f164..38adfeb90 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:538:0 +// src/engine/world_chunk.h:540:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 4f73b169d..cd4f576cf 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3063:0 +// src/engine/world_chunk.cpp:3087:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index 40349ed7a..cc59f1217 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:535:0 +// src/engine/world_chunk.h:537:0 struct standing_spot_stream_chunk { diff --git a/generated/generate_string_table_world_chunk_mesh_bitfield.h b/generated/generate_string_table_world_chunk_mesh_bitfield.h index d736d40e5..d16b8c2fd 100644 --- a/generated/generate_string_table_world_chunk_mesh_bitfield.h +++ b/generated/generate_string_table_world_chunk_mesh_bitfield.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:235:0 +// src/engine/world_chunk.h:236:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_bitfield Type) diff --git a/generated/generate_string_table_world_chunk_mesh_index.h b/generated/generate_string_table_world_chunk_mesh_index.h index c230cbfed..03c37a280 100644 --- a/generated/generate_string_table_world_chunk_mesh_index.h +++ b/generated/generate_string_table_world_chunk_mesh_index.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:238:0 +// src/engine/world_chunk.h:239:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_index Type) diff --git a/generated/hashtable_voxel_synth_tile.h b/generated/hashtable_voxel_synth_tile.h index 580f05c67..ee2701b54 100644 --- a/generated/hashtable_voxel_synth_tile.h +++ b/generated/hashtable_voxel_synth_tile.h @@ -1,4 +1,4 @@ -// src/engine/voxel_synthesis.h:158:0 +// src/engine/voxel_synthesis.h:163:0 struct voxel_synth_tile_linked_list_node { diff --git a/generated/maybe_chunk_data.h b/generated/maybe_chunk_data.h index b85d9b339..ad2999db4 100644 --- a/generated/maybe_chunk_data.h +++ b/generated/maybe_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:199:0 +// src/engine/world_chunk.h:200:0 struct maybe_chunk_data { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 79424258b..4f5d5db08 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:502:0 +// src/engine/world_chunk.h:504:0 struct maybe_standing_spot { diff --git a/generated/rectalinear_iteration_pattern_398799212.h b/generated/rectalinear_iteration_pattern_398799212.h index 56352b376..db048a2fe 100644 --- a/generated/rectalinear_iteration_pattern_398799212.h +++ b/generated/rectalinear_iteration_pattern_398799212.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:517:0 +// src/engine/world_update.cpp:518:0 DimIterator(x, y, z, UpdateDim) { @@ -13,11 +13,12 @@ DimIterator(x, y, z, UpdateDim) v3i CenterToVoxP = SimVoxP - EditCenterP; - if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&Voxel_Filled) == False) + NotImplemented; + /* if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&Voxel_Filled) == False) */ { b32 IsUnfilledBorder = False; poof_check_for_unfilled_border() - Assert(NewVoxelValue->Flags & Voxel_Filled); + /* Assert(NewVoxelValue->Flags & Voxel_Filled); */ if (IsUnfilledBorder) { OverwriteVoxel = True; diff --git a/generated/rectalinear_iteration_pattern_416827956.h b/generated/rectalinear_iteration_pattern_416827956.h index cc754ace4..60b20ee8b 100644 --- a/generated/rectalinear_iteration_pattern_416827956.h +++ b/generated/rectalinear_iteration_pattern_416827956.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:688:0 +// src/engine/world_update.cpp:699:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_428632106.h b/generated/rectalinear_iteration_pattern_428632106.h index 64656a702..ff8253639 100644 --- a/generated/rectalinear_iteration_pattern_428632106.h +++ b/generated/rectalinear_iteration_pattern_428632106.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:839:0 +// src/engine/world_update.cpp:858:0 DimIterator(x, y, z, UpdateDim) { @@ -14,7 +14,8 @@ DimIterator(x, y, z, UpdateDim) v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; voxel *AssetV = TryGetVoxel(Data, OriginToCurrentVoxP); voxel *NewVoxelValue = &InvertV; - if ( (AssetV && (AssetV->Flags&Voxel_Filled)) || Params->PersistWhitespace ) + NotImplemented; + /* if ( (AssetV && (AssetV->Flags&Voxel_Filled)) || Params->PersistWhitespace ) */ { NewVoxelValue = AssetV; OverwriteVoxel = True; diff --git a/generated/rectalinear_iteration_pattern_530902269.h b/generated/rectalinear_iteration_pattern_530902269.h index 6549b9a82..93d5642b7 100644 --- a/generated/rectalinear_iteration_pattern_530902269.h +++ b/generated/rectalinear_iteration_pattern_530902269.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:636:0 +// src/engine/world_update.cpp:643:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_583358156.h b/generated/rectalinear_iteration_pattern_583358156.h index 208c2faac..cb420d836 100644 --- a/generated/rectalinear_iteration_pattern_583358156.h +++ b/generated/rectalinear_iteration_pattern_583358156.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:813:0 +// src/engine/world_update.cpp:831:0 DimIterator(x, y, z, UpdateDim) { @@ -13,7 +13,8 @@ DimIterator(x, y, z, UpdateDim) v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { V->Color = NewVoxelValue->Color; } + NotImplemented; + /* if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { V->Color = NewVoxelValue->Color; } */ if ( ((OverwriteVoxel == True ) && (Invert == False)) || diff --git a/generated/rectalinear_iteration_pattern_631222419.h b/generated/rectalinear_iteration_pattern_631222419.h index 025f03107..6568cda54 100644 --- a/generated/rectalinear_iteration_pattern_631222419.h +++ b/generated/rectalinear_iteration_pattern_631222419.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:729:0 +// src/engine/world_update.cpp:741:0 DimIterator(x, y, z, UpdateDim) { @@ -15,7 +15,8 @@ DimIterator(x, y, z, UpdateDim) v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - if ((V->Flags&Voxel_Filled)==False) + NotImplemented; + /* if ((V->Flags&Voxel_Filled)==False) */ { b32 IsUnfilledBorder = False; poof_check_for_unfilled_border() diff --git a/generated/rectalinear_iteration_pattern_643608995.h b/generated/rectalinear_iteration_pattern_643608995.h index 7cc16dfef..c50bc5d04 100644 --- a/generated/rectalinear_iteration_pattern_643608995.h +++ b/generated/rectalinear_iteration_pattern_643608995.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:617:0 +// src/engine/world_update.cpp:622:0 DimIterator(x, y, z, UpdateDim) { @@ -12,11 +12,13 @@ DimIterator(x, y, z, UpdateDim) { - if ((V->Flags&Voxel_Filled) == False) + NotImplemented; + /* if ((V->Flags&Voxel_Filled) == False) */ { b32 IsUnfilledBorder = False; poof_check_for_unfilled_border() - Assert(NewVoxelValue->Flags & Voxel_Filled); + NotImplemented; + /* Assert(NewVoxelValue->Flags & Voxel_Filled); */ if (IsUnfilledBorder) { OverwriteVoxel = True; diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index 33fe7bfdc..3e6eca3aa 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:589:0 +// src/engine/world_update.cpp:594:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_920026661.h b/generated/rectalinear_iteration_pattern_920026661.h index 196fe2475..bc6c5a8dc 100644 --- a/generated/rectalinear_iteration_pattern_920026661.h +++ b/generated/rectalinear_iteration_pattern_920026661.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:537:0 +// src/engine/world_update.cpp:539:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_992879728.h b/generated/rectalinear_iteration_pattern_992879728.h index 8f7296e70..37b67be94 100644 --- a/generated/rectalinear_iteration_pattern_992879728.h +++ b/generated/rectalinear_iteration_pattern_992879728.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:750:0 +// src/engine/world_update.cpp:763:0 DimIterator(x, y, z, UpdateDim) { @@ -15,7 +15,8 @@ DimIterator(x, y, z, UpdateDim) voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); if (NewVoxelValue) { - if ( (V->Flags&VoxelFaceMask) && (NewVoxelValue->Flags&Voxel_Filled) ) + NotImplemented; + /* if ( (V->Flags&VoxelFaceMask) && (NewVoxelValue->Flags&Voxel_Filled) ) */ { OverwriteVoxel = True; } diff --git a/generated/rectalinear_iteration_pattern_99934950.h b/generated/rectalinear_iteration_pattern_99934950.h index e9930979a..9e3398617 100644 --- a/generated/rectalinear_iteration_pattern_99934950.h +++ b/generated/rectalinear_iteration_pattern_99934950.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:696:0 +// src/engine/world_update.cpp:707:0 DimIterator(x, y, z, UpdateDim) { @@ -11,7 +11,8 @@ DimIterator(x, y, z, UpdateDim) if (Contains(SSRect, SimVoxP)) { - if (V->Flags & Voxel_Filled) + NotImplemented; + /* if (V->Flags & Voxel_Filled) */ { OverwriteVoxel = True; } diff --git a/generated/serdes_struct_world_chunk.h b/generated/serdes_struct_world_chunk.h index f1ff7c1b1..71ce75f6e 100644 --- a/generated/serdes_struct_world_chunk.h +++ b/generated/serdes_struct_world_chunk.h @@ -43,6 +43,11 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) + if (Element->Occupancy) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } + + + if (Element->Voxels) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } @@ -67,6 +72,10 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) + if (Element->Occupancy) { Result &= Serialize(Bytes, Element->Occupancy); } + + + if (Element->Voxels) { Result &= Serialize(Bytes, Element->Voxels, Cast(umm, Volume(Element->Dim)) ); } @@ -126,6 +135,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * + b64 HadOccupancyPointer = Read_u64(Bytes); + Assert(HadOccupancyPointer < 2); // Should be 0 or 1 + + + b64 HadVoxelsPointer = Read_u64(Bytes); Assert(HadVoxelsPointer < 2); // Should be 0 or 1 @@ -154,6 +168,20 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * + if (HadOccupancyPointer) + { + umm Count = 1; + + + if (Element->Occupancy == 0) + { + Element->Occupancy = Allocate(u8, Memory, Count); + } + + Result &= Deserialize(Bytes, Element->Occupancy, Memory, Count); + } + + if (HadVoxelsPointer) { umm Count = Cast(umm, Volume(Element->Dim)); diff --git a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h index 3aa0dcb4a..7878cf21f 100644 --- a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h +++ b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:741:0 +// src/engine/world_chunk.cpp:760:0 // NOTE(Jesse): This must hold true for using any Noise_8x func Assert(Chunk->Dim % V3i(MIN_TERRAIN_NOISE_WIDTH) == V3i(0)); @@ -18,7 +18,7 @@ for ( s32 z = 0; z < Dim.z; ++ z) for ( s32 x = 0; x < Dim.x; x += MIN_TERRAIN_NOISE_WIDTH ) { s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); @@ -57,26 +57,20 @@ for ( s32 z = 0; z < Dim.z; ++ z) } + u8 OccupancyByte = 0; RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) { s32 ThisIndex = VoxIndex+ValueIndex; - b32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; - ChunkSum += NoiseChoice; + s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; + ChunkSum += u32(NoiseChoice); - SetFlag(&Chunk->Voxels[ThisIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); + OccupancyByte |= (NoiseChoice << ValueIndex); Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); - - /* Assert( (Chunk->Voxels[ThisIndex].Flags&VoxelFaceMask) == 0); */ - /* if (NoiseChoice) */ - /* { */ - /* Assert( IsSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); */ - /* } */ - /* else */ - /* { */ - /* Assert( NotSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); */ - /* } */ } + SetOccupancyByte(Chunk, VoxIndex, OccupancyByte); + /* s32 ByteIndex = VoxIndex/8; */ + /* Chunk->Occupancy[ByteIndex] = OccupancyByte; */ } } } diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 0c03d8b1f..50073fb70 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2094:0 +// src/engine/world_chunk.cpp:2135:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 2f78f6c40..6e5c2b9d5 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2097:0 +// src/engine/world_chunk.cpp:2138:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 17abbf89c..939f60709 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -570,6 +570,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ if (Job->Flags & ChunkInitFlag_ComputeStandingSpots) { ComputeStandingSpots( Chunk->Dim, + Chunk->Occupancy, Chunk->Voxels, {}, diff --git a/src/engine/asset.cpp b/src/engine/asset.cpp index 3f7544ea7..7a37cb637 100644 --- a/src/engine/asset.cpp +++ b/src/engine/asset.cpp @@ -607,7 +607,7 @@ InitAsset(asset *Asset, thread_local_state *Thread) // chunk is a weird one as the buffers can be of arbitrary size. Deserialize(&Bytes, Chunk, Thread->PermMemory, 1); - MarkBoundaryVoxels_MakeExteriorFaces(Chunk->Voxels, Chunk->Dim, V3i(0), Chunk->Dim); + MarkBoundaryVoxels_MakeExteriorFaces(Chunk->Occupancy, Chunk->Voxels, Chunk->Dim, V3i(0), Chunk->Dim); FinalizeChunkInitialization(Chunk); diff --git a/src/engine/bonsai.h b/src/engine/bonsai.h index 906187e4e..3ea1d0bb9 100644 --- a/src/engine/bonsai.h +++ b/src/engine/bonsai.h @@ -316,10 +316,10 @@ ClearWorldChunk( world_chunk *Chunk ) { Chunk->WorldP = INVALID_WORLD_CHUNK_POSITION; Chunk->FilledCount = {}; - Chunk->DrawBoundingVoxels = {}; - Chunk->PointsToLeaveRemaining = {}; - Chunk->TriCount = {}; - Chunk->EdgeBoundaryVoxelCount = {}; + /* Chunk->DrawBoundingVoxels = {}; */ + /* Chunk->PointsToLeaveRemaining = {}; */ + /* Chunk->TriCount = {}; */ + /* Chunk->EdgeBoundaryVoxelCount = {}; */ Chunk->StandingSpots.At = Chunk->StandingSpots.Start; Chunk->Entities = {}; Chunk->Next = {}; @@ -331,39 +331,6 @@ ClearWorldChunk( world_chunk *Chunk ) Chunk->Flags = {}; } -inline b32 -IsFilled(voxel *Voxel) -{ - b32 Result = (Voxel->Flags & Voxel_Filled) == Voxel_Filled; - -#if BONSAI_INTERNAL - if (!Result) Assert( (Voxel->Flags&VoxelFaceMask) == 0); -#endif - return Result; -} - -inline b32 -NotFilled(voxel *Voxel) -{ - b32 Result = !IsFilled(Voxel); - return Result; -} - -inline b32 -IsFilled( voxel *Voxels, voxel_position VoxelP, chunk_dimension Dim) -{ - s32 VoxelIndex = GetIndex(VoxelP, Dim); - b32 isFilled = IsSet(Voxels + VoxelIndex, Voxel_Filled); - return isFilled; -} - -inline b32 -NotFilled(voxel *Voxels, voxel_position VoxelP, chunk_dimension Dim) -{ - b32 Result = !IsFilled(Voxels, VoxelP, Dim); - return Result; -} - inline world_position GetAbsoluteP( world_position P, chunk_dimension WorldChunkDim) { diff --git a/src/engine/chunk.cpp b/src/engine/chunk.cpp index 78956e000..5e81a9618 100644 --- a/src/engine/chunk.cpp +++ b/src/engine/chunk.cpp @@ -6,22 +6,14 @@ AllocateChunkData(memory_arena *Storage, chunk_dimension Dim) // because multiple threads go to town on these memory blocks chunk_data *Result = AllocateAlignedProtection(chunk_data, Storage, 1, CACHE_LINE_SIZE, false); - s32 Vol = Volume(Dim); - if (Vol) { Result->Voxels = AllocateAlignedProtection(voxel, Storage , Vol, CACHE_LINE_SIZE, false); } - if (Vol) { Result->VoxelLighting = AllocateAlignedProtection(voxel_lighting, Storage , Vol, CACHE_LINE_SIZE, false); } - - /* ZeroChunk(Result); */ - - return Result; -} - -voxel * -AllocateVoxels(memory_arena *Storage, chunk_dimension Dim) -{ - voxel *Result = {}; - - s32 Vol = Volume(Dim); - if (Vol) { Result = AllocateAlignedProtection(voxel, Storage , Vol, CACHE_LINE_SIZE, false); } + s32 VoxCount = Volume(Dim); + if (VoxCount) + { + s32 OccupancyCount = (VoxCount+7) / 8; // Add seven so we round up when we divide if there's an extra one (or several) + Result->Occupancy = AllocateAlignedProtection( u8, Storage , OccupancyCount, CACHE_LINE_SIZE, false); + Result->Voxels = AllocateAlignedProtection( voxel, Storage , VoxCount, CACHE_LINE_SIZE, false); + Result->VoxelLighting = AllocateAlignedProtection(voxel_lighting, Storage , VoxCount, CACHE_LINE_SIZE, false); + } return Result; } @@ -38,12 +30,28 @@ IsFilledInChunk( world_chunk *Chunk, voxel_position VoxelP, chunk_dimension Dim) Assert(i > -1); Assert(i < Volume(Dim)); - isFilled = IsSet(&Chunk->Voxels[i], Voxel_Filled); + isFilled = b32(GetOccupancyBit(Chunk, i)); } return isFilled; } +inline b32 +NotFilled(u8 *Occupancy, u32 Index) +{ + b32 Result = {}; + NotImplemented; + return Result; +} + +inline b32 +NotFilled(u8 *Occupancy, v3i P, v3i Dim) +{ + b32 Result = {}; + NotImplemented; + return Result; +} + inline b32 NotFilledInChunk( world_chunk *Chunk, voxel_position VoxelP, chunk_dimension Dim) { @@ -52,19 +60,23 @@ NotFilledInChunk( world_chunk *Chunk, voxel_position VoxelP, chunk_dimension Dim } inline b32 -NotFilledInChunk( world_chunk *Chunk, s32 Index) +NotFilledInChunk(world_chunk *Chunk, s32 Index) { Assert(Chunk); b32 NotFilled = False; + NotImplemented; +#if 0 if (Index > -1) { NotFilled = !IsSet(&Chunk->Voxels[Index], Voxel_Filled); } +#endif return NotFilled; } +#if 0 void FillChunk(world_chunk *Chunk, chunk_dimension Dim, u8 ColorIndex = MCV_BLACK) { @@ -87,3 +99,4 @@ FillChunk(world_chunk *Chunk, chunk_dimension Dim, u8 ColorIndex = MCV_BLACK) SetFlag(Chunk, Chunk_VoxelsInitialized); } +#endif diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index f584a3bdf..a2b825d39 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -757,7 +757,7 @@ DoEngineDebug(engine_resources *Engine) { world_chunk *PickedChunk = EngineDebug->PickedChunk; /* MarkBoundaryVoxels_Debug(PickedChunk->Voxels, PickedChunk->Dim); */ - MarkBoundaryVoxels_NoExteriorFaces(PickedChunk->Voxels, PickedChunk->Dim, {}, PickedChunk->Dim); + MarkBoundaryVoxels_NoExteriorFaces(PickedChunk->Occupancy, PickedChunk->Voxels, PickedChunk->Dim, {}, PickedChunk->Dim); QueueChunkForMeshRebuild(&Plat->LowPriority, PickedChunk); } PushNewRow(Ui); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 17bb2eabf..8b6cf4ecb 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1331,7 +1331,7 @@ ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *P v3i DestRelativeMinCorner = (-1*SmallestMinOffset) + SrcOffsetMin; - chunk_data D = {SrcChunk->Flags, SrcChunk->Dim, SrcChunk->Voxels, SrcChunk->VoxelLighting}; + chunk_data D = {SrcChunk->Flags, SrcChunk->Dim, SrcChunk->Occupancy, SrcChunk->Voxels, SrcChunk->VoxelLighting}; world_update_op_shape_params_chunk_data ChunkDataShape = { D, V3(DestRelativeMinCorner) }; Assert(SrcChunk->Dim <= DestChunk->Dim); @@ -1349,7 +1349,7 @@ ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *P { work_queue_entry_update_world_region Job = WorkQueueEntryUpdateWorldRegion(Mode, Modifier, SimFloodOrigin, &Shape, HSVtoRGB(Layer->Settings.HSVColor), {}, {}, {}, {}, 0); ApplyUpdateToRegion(GetThreadLocalState(ThreadLocal_ThreadIndex), &Job, UpdateBounds, DestChunk, Layer->Settings.Invert); - DestChunk->FilledCount = MarkBoundaryVoxels_MakeExteriorFaces( DestChunk->Voxels, DestChunk->Dim, {{}}, DestChunk->Dim ); + DestChunk->FilledCount = MarkBoundaryVoxels_MakeExteriorFaces( DestChunk->Occupancy, DestChunk->Voxels, DestChunk->Dim, {{}}, DestChunk->Dim ); } } @@ -1789,7 +1789,7 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti /* } */ /* } */ - MarkBoundaryVoxels_MakeExteriorFaces(SeedChunk->Voxels, SeedChunk->Dim, {}, SeedChunk->Dim); + MarkBoundaryVoxels_MakeExteriorFaces(SeedChunk->Occupancy, SeedChunk->Voxels, SeedChunk->Dim, {}, SeedChunk->Dim); FinalizeChunkInitialization(SeedChunk); @@ -1818,7 +1818,11 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti data_type Type = GetMeshDatatypeForDimension(Chunk->Dim); auto *TempMesh = AllocateTempMesh(Thread->TempMemory, Type); - MarkBoundaryVoxels_MakeExteriorFaces(Root_LayeredBrushPreview->Voxels, Root_LayeredBrushPreview->Dim, {}, Root_LayeredBrushPreview->Dim-V3i(2)); + MarkBoundaryVoxels_MakeExteriorFaces( Root_LayeredBrushPreview->Occupancy, + Root_LayeredBrushPreview->Voxels, + Root_LayeredBrushPreview->Dim, + {}, + Root_LayeredBrushPreview->Dim-V3i(2)); RebuildWorldChunkMesh(Thread, Chunk, {}, Chunk->Dim, MeshBit_Lod0, TempMesh, Thread->TempMemory); } @@ -2440,7 +2444,7 @@ DoWorldEditor(engine_resources *Engine) Offset = Min(Layer->Settings.Offset.Min, Offset); } - chunk_data D = {Chunk->Flags, Chunk->Dim, Chunk->Voxels, Chunk->VoxelLighting}; + chunk_data D = {Chunk->Flags, Chunk->Dim, Chunk->Occupancy, Chunk->Voxels, Chunk->VoxelLighting}; world_update_op_shape_params_chunk_data ChunkDataShape = { D, V3(Offset) + GetSimSpaceP(World, Editor->SelectionRegion.Min) - V3i(1) }; world_edit_shape Shape = diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 84765813e..cf9e2b164 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1,4 +1,6 @@ +#include + #include #include diff --git a/src/engine/engine.h b/src/engine/engine.h index 59529ba12..a9ac779de 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -18,6 +18,7 @@ struct engine_resources; link_internal engine_resources *GetEngineResources(); #include +#include #include #include #include diff --git a/src/engine/entity.cpp b/src/engine/entity.cpp index 74f06213c..2748a3c5b 100644 --- a/src/engine/entity.cpp +++ b/src/engine/entity.cpp @@ -213,7 +213,9 @@ GetCollision( world *World, aabb SimSpaceCollisionDim ) { v3i Offset = V3i(x,y,z); s32 Index = GetIndex(Offset, Chunk->Dim); - if (Chunk->Voxels[Index].Flags & Voxel_Filled) + s32 vOccupancy = GetOccupancyBit(Chunk->Occupancy, Index); + + if (vOccupancy) { cp Hit = {V3(Offset), Chunk->WorldP}; /* Assert(Hit > Result.MaxP); */ diff --git a/src/engine/loaders/vox.cpp b/src/engine/loaders/vox.cpp index 7c0d111f2..1cd1ff0e7 100644 --- a/src/engine/loaders/vox.cpp +++ b/src/engine/loaders/vox.cpp @@ -387,7 +387,7 @@ LoadVoxData(v3_cursor *ColorPalette, memory_arena *TempMemory, memory_arena *Per minZ = Min(TestP.z, minZ); LocalVoxelCache[VoxelCacheIndex] = boundary_voxel(TestP.x, TestP.y, TestP.z, Color); - SetFlag(&LocalVoxelCache[VoxelCacheIndex], Voxel_Filled); + /* SetFlag(&LocalVoxelCache[VoxelCacheIndex], Voxel_Filled); */ } else { @@ -436,24 +436,8 @@ LoadVoxData(v3_cursor *ColorPalette, memory_arena *TempMemory, memory_arena *Per { boundary_voxel *Voxel = &LocalVoxelCache[VoxelCacheIndex]; Voxel->Offset = Voxel->Offset - Min + HalfApronMin; - s32 Index = GetIndex(Voxel->Offset, ModelDim); - - if (Voxel->V.Flags & Voxel_Filled) - /* if (Voxel->V.Flags & Voxel_Filled && VoxelCacheIndex == 16) */ - { - /* if (RandomUnilateral(&TMP) > 0.25f) { Voxel->V.Transparency = 255; } */ - /* Current.ChunkData->Voxels[Index].Transparency = 128; */ - /* Voxel->V.Transparency = 255; */ - } - else - { - /* Voxel->V.Transparency = 0; */ - Assert(Voxel->V.Transparency == 0); - Voxel->V.Transparency = 128; - /* Voxel->V.Emission = 128; */ - } - /* Voxel->V.Transparency = 0; */ + s32 Index = GetIndex(Voxel->Offset, ModelDim); Current.ChunkData->Voxels[Index] = Voxel->V; /* Result.ChunkData->VoxelLighting[Index] = VoxelLighting(0xff); */ } @@ -463,7 +447,7 @@ LoadVoxData(v3_cursor *ColorPalette, memory_arena *TempMemory, memory_arena *Per Current.ChunkData->Flags = Chunk_VoxelsInitialized; /* MarkBoundaryVoxels_NoExteriorFaces( Current.ChunkData->Voxels, Current.ChunkData->Dim, {}, Current.ChunkData->Dim); */ - MarkBoundaryVoxels_MakeExteriorFaces( Current.ChunkData->Voxels, Current.ChunkData->Dim, {}, Current.ChunkData->Dim); + MarkBoundaryVoxels_MakeExteriorFaces( Current.ChunkData->Occupancy, Current.ChunkData->Voxels, Current.ChunkData->Dim, {}, Current.ChunkData->Dim); Push(&Result, &Current); } break; diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index aac8c08de..fc225ef07 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -393,7 +393,7 @@ ComputeNormalsForChunkFromFilledFlag(world_chunk *Chunk, v3i WorldChunkDim, v3 * { s32 VoxIndex = GetIndex(V3i(x,y,z), ChunkDim); - if ( Chunk->Voxels[VoxIndex].Flags & Voxel_Filled ) + if ( GetOccupancyBit(Chunk, VoxIndex) ) { v3 Normal = {}; for ( s32 dz = -1; dz < 2; ++ dz) @@ -407,7 +407,7 @@ ComputeNormalsForChunkFromFilledFlag(world_chunk *Chunk, v3i WorldChunkDim, v3 * s32 dP = TryGetIndex(V3i(x+dx,y+dy,z+dz), ChunkDim); if (dP > -1) { - if ( Chunk->Voxels[dP].Flags & Voxel_Filled ) + if ( GetOccupancyBit(Chunk, dP) ) { Normal += V3(dx,dy,dz); } @@ -643,7 +643,7 @@ HoodooTerrain( world_chunk *Chunk, r32 NoiseValue = 0.f; s32 VoxIndex = GetIndex(V3i(x,y,z), Dim); Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); + /* Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); */ /* s32 Amp2 = Amplitude*2; */ r32 HighestNoise = 0.f; @@ -770,20 +770,12 @@ HoodooTerrain( world_chunk *Chunk, /* ThisColor = BLUE; */ /* } */ - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); + /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); */ + SetOccupancyBit(Chunk, VoxIndex, s32(IsFilled)); Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor)*u16(IsFilled); ChunkSum += IsFilled; Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); - - if (IsFilled) - { - Assert( IsSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } } } } @@ -994,23 +986,16 @@ TerracedTerrain( world_chunk *Chunk, } #endif - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); + /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); */ + SetOccupancyBit(Chunk, VoxIndex, s32(IsFilled)); Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor)*u16(IsFilled); Chunk->Voxels[VoxIndex].Transparency = ThisTransparency; ChunkSum += IsFilled; - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); - - if (IsFilled) - { - Assert( IsSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } + /* Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); */ + SetOccupancyBit(Chunk, VoxIndex, s32(IsFilled)); } } } @@ -1173,23 +1158,14 @@ GrassyTerracedTerrain2( world_chunk *Chunk, GrowGrassPerlin( Chunk, V3i(x,y,z), NoiseValue, 1.f-TerraceMask, SrcToDest, WorldChunkDim, WorldZSubZMin, &ThisColor, &IsFilled ); - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); + /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); */ + SetOccupancyBit(Chunk, VoxIndex, s32(IsFilled)); + Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor)*u8(IsFilled); Chunk->Voxels[VoxIndex].Transparency = ThisTransparency; ChunkSum += IsFilled; - - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); - - if (IsFilled) - { - Assert( IsSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } } } } @@ -1329,23 +1305,13 @@ GrassyTerracedTerrain3( world_chunk *Chunk, GrowGrassPerlin( Chunk, V3i(x,y,z), NoiseValue, 1.f-TerraceMask, SrcToDest, WorldChunkDim, WorldZSubZMin, &ThisColor, &IsFilled ); - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); + /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); */ + SetOccupancyBit(Chunk, VoxIndex, s32(IsFilled)); Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor)*u16(IsFilled); Chunk->Voxels[VoxIndex].Transparency = ThisTransparency; ChunkSum += IsFilled; - - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); - - if (IsFilled) - { - Assert( IsSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } } } } @@ -1776,24 +1742,12 @@ GrassyTerracedTerrain4( world_chunk *Chunk, /* NormalsHit[NormalIndex+Index] = 1; */ b32 IsFilled = NoiseValues[NoiseIndex+Index] > r32(z+ChunkWorldZThresh); - SetFlag(&Chunk->Voxels[NormalIndex+Index], (voxel_flag)(Voxel_Filled*IsFilled)); + /* SetFlag(&Chunk->Voxels[NormalIndex+Index], (voxel_flag)(Voxel_Filled*IsFilled)); */ + SetOccupancyBit(Chunk, NormalIndex+Index, s32(IsFilled)); Chunk->Voxels[NormalIndex+Index].Color = RGBtoPackedHSV(ThisColor[Index])*u16(IsFilled); /* Chunk->Voxels[NormalIndex].Transparency = ThisTransparency; */ ChunkSum += IsFilled; } - -#if 0 - Assert( (Chunk->Voxels[NormalIndex].Flags&VoxelFaceMask) == 0); - - if (IsFilled) - { - Assert( IsSet(&Chunk->Voxels[NormalIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[NormalIndex], Voxel_Filled) ); - } -#endif } s32 xFixupBase = (xShapingBlockCount * 8); @@ -1814,7 +1768,8 @@ GrassyTerracedTerrain4( world_chunk *Chunk, GrowGrassVoronoi( Chunk, V3i(x,y,z), NoiseValue, Normal, SrcToDest, WorldChunkDim, WorldZSubZMin, &ThisColor); b32 IsFilled = NoiseValues[NoiseIndex] > r32(z+ChunkWorldZThresh); - SetFlag(&Chunk->Voxels[NormalIndex], (voxel_flag)(Voxel_Filled*IsFilled)); + /* SetFlag(&Chunk->Voxels[NormalIndex], (voxel_flag)(Voxel_Filled*IsFilled)); */ + SetOccupancyBit(Chunk, NormalIndex, s32(IsFilled)); Chunk->Voxels[NormalIndex].Color = RGBtoPackedHSV(ThisColor)*u8(IsFilled); /* Chunk->Voxels[NormalIndex].Transparency = ThisTransparency; */ ChunkSum += IsFilled; @@ -2026,23 +1981,13 @@ GrassyTerracedTerrain( world_chunk *Chunk, GrowGrassPerlin( Chunk, V3i(x,y,z), NoiseValue, 1.f, SrcToDest, WorldChunkDim, WorldZSubZMin, &ThisColor, &IsFilled ); - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); + /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); */ + SetOccupancyBit(Chunk, VoxIndex, s32(IsFilled)); Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor)*u8(IsFilled); Chunk->Voxels[VoxIndex].Transparency = ThisTransparency; ChunkSum += IsFilled; - - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); - - if (IsFilled) - { - Assert( IsSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } } } } @@ -2185,23 +2130,13 @@ GrassyLargeTerracedTerrain( world_chunk *Chunk, GrowGrassPerlin( Chunk, V3i(x,y,z), NoiseValue, 1.f-Clamp01(TerraceMask), SrcToDest, WorldChunkDim, WorldZSubZMin, &ThisColor, &IsFilled ); /* GrowGrassPerlin( Chunk, V3i(x,y,z), NoiseValue, Clamp01(TerraceMask), SrcToDest, WorldChunkDim, WorldZSubZMin, &ThisColor, &IsFilled ); */ - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); + /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); */ + SetOccupancyBit(Chunk, VoxIndex, s32(IsFilled)); Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor)*u8(IsFilled); Chunk->Voxels[VoxIndex].Transparency = ThisTransparency; ChunkSum += IsFilled; - - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); - - if (IsFilled) - { - Assert( IsSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } } } } @@ -2284,7 +2219,8 @@ Terrain_SinCos( world_chunk *Chunk, b32 IsFilled = r32(*NoiseValue) > r32(WorldZSubZMin); - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); + /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); */ + SetOccupancyBit(Chunk, VoxIndex, s32(IsFilled)); Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor); ChunkSum += IsFilled; } @@ -2332,7 +2268,8 @@ Terrain_Voronoi3D( world_chunk *Chunk, b32 IsFilled = r32(NoiseValue) > r32(zMin) ; - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); + /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); */ + SetOccupancyBit(Chunk, VoxIndex, s32(IsFilled)); Chunk->Voxels[VoxIndex].Color = PackHSVColor(RGBColor)*u8(IsFilled); ChunkSum += IsFilled; } @@ -2382,7 +2319,8 @@ Terrain_Voronoi2D( world_chunk *Chunk, b32 IsFilled = r32(NoiseValue) > r32(WorldZSubZMin) ; - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); + /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); */ + SetOccupancyBit(Chunk, VoxIndex, s32(IsFilled)); Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(RGBColor)*u16(IsFilled); ChunkSum += IsFilled; } diff --git a/src/engine/terrain.h b/src/engine/terrain.h index bfd26d2c0..7adc8a462 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -85,30 +85,24 @@ poof( for ( s32 x = 0; x < Dim.x; x += MIN_TERRAIN_NOISE_WIDTH ) { s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ user_code + u8 OccupancyByte = 0; RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) { s32 ThisIndex = VoxIndex+ValueIndex; - b32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; - ChunkSum += NoiseChoice; + s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; + ChunkSum += u32(NoiseChoice); - SetFlag(&Chunk->Voxels[ThisIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); + OccupancyByte |= (NoiseChoice << ValueIndex); Chunk->Voxels[ThisIndex].Color = packed_HSV_color_value_name*u16(NoiseChoice); - - /* Assert( (Chunk->Voxels[ThisIndex].Flags&VoxelFaceMask) == 0); */ - /* if (NoiseChoice) */ - /* { */ - /* Assert( IsSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); */ - /* } */ - /* else */ - /* { */ - /* Assert( NotSet(&Chunk->Voxels[ThisIndex], Voxel_Filled) ); */ - /* } */ } + SetOccupancyByte(Chunk, VoxIndex, OccupancyByte); + /* s32 ByteIndex = VoxIndex/8; */ + /* Chunk->Occupancy[ByteIndex] = OccupancyByte; */ } } } diff --git a/src/engine/voxel.cpp b/src/engine/voxel.cpp new file mode 100644 index 000000000..fb1c337de --- /dev/null +++ b/src/engine/voxel.cpp @@ -0,0 +1,29 @@ +link_internal s32 +GetOccupancyBit(world_chunk *Chunk, s32 Index) +{ + /* Assert(Index < Volume(Chunk->Dim)); */ + s32 Result = GetOccupancyBit(Chunk->Occupancy, Index); + return Result; +} + +link_internal void +SetOccupancyBit(world_chunk *Chunk, s32 Index, s32 BitValue) +{ + /* Assert(BitValue == 0 || BitValue == 1); */ + s32 ByteIndex = Index/8; + s32 BitIndex = Index%8; + + Chunk->Occupancy[ByteIndex] &= ~(1 << BitIndex); // Unconditionally knock out the bit + Chunk->Occupancy[ByteIndex] |= (BitValue << BitIndex); // Set new value.. 0 just does nothing + + /* s32 Test = GetOccupancyBit(Chunk, Index); */ + /* Assert(Test == BitValue); */ +} + +link_internal void +SetOccupancyByte(world_chunk *Chunk, s32 Index, u8 ByteValue) +{ + /* Assert(Index % 8 == 0); */ + s32 ByteIndex = Index/8; + Chunk->Occupancy[ByteIndex] = ByteValue; +} diff --git a/src/engine/voxel.h b/src/engine/voxel.h new file mode 100644 index 000000000..fcaf6d678 --- /dev/null +++ b/src/engine/voxel.h @@ -0,0 +1,23 @@ + +enum voxel_occupancy +{ + VoxelOccupancy_Empty = 0, + VoxelOccupancy_Filled = 1, +}; + + +link_internal s32 +GetOccupancyBit(u8 *Occupancy, s32 Index) +{ + s32 ByteIndex = Index/8; + s32 BitIndex = Index%8; + s32 Result = (Occupancy[ByteIndex] >> BitIndex) & 1; + return Result; +} + + +link_internal void +SetOccupancyBit(world_chunk *Chunk, s32 Index, s32 BitValue); + +link_internal s32 +GetOccupancyBit(world_chunk *Chunk, s32 Index); diff --git a/src/engine/voxel_synthesis.cpp b/src/engine/voxel_synthesis.cpp index 9cd557bde..2bb8b0d44 100644 --- a/src/engine/voxel_synthesis.cpp +++ b/src/engine/voxel_synthesis.cpp @@ -71,11 +71,11 @@ BakeVoxelSynthesisRules(const char* InputVox) DimIterator(xIndex, yIndex, zIndex, FillDim) { s32 VIndex = GetIndex(xIndex, yIndex, zIndex, ModelDim); - Vox.ChunkData->Voxels[VIndex].Flags = Voxel_Filled; + Vox.ChunkData->Voxels[VIndex].Flags = {}; Vox.ChunkData->Voxels[VIndex].Color = RGBtoPackedHSV(RGB_GRASS_GREEN); } - MarkBoundaryVoxels_NoExteriorFaces(Vox.ChunkData->Voxels, Vox.ChunkData->Dim, {}, Vox.ChunkData->Dim); + MarkBoundaryVoxels_NoExteriorFaces(Vox.ChunkData->Occupancy, Vox.ChunkData->Voxels, Vox.ChunkData->Dim, {}, Vox.ChunkData->Dim); Assert(Vox.ChunkData->Dim.x % Global_TileDim.x == 0); Assert(Vox.ChunkData->Dim.y % Global_TileDim.y == 0); diff --git a/src/engine/voxel_synthesis.h b/src/engine/voxel_synthesis.h index 21926fccd..e150a5102 100644 --- a/src/engine/voxel_synthesis.h +++ b/src/engine/voxel_synthesis.h @@ -115,11 +115,14 @@ AreEqual(voxel_synth_tile *T0, voxel_synth_tile *T1) { auto i = GetIndex(xIndex, yIndex, zIndex, Global_TileDim); + // Need to use the occupancy mask here + NotImplemented; + Result &= #if VOXEL_FACE_FLAGS_CONTRIBUTE_TO_HASH (T0->Voxels[i].Flags) == (T1->Voxels[i].Flags) && #else - (T0->Voxels[i].Flags&Voxel_Filled) == (T1->Voxels[i].Flags&Voxel_Filled) && + /* (T0->Voxels[i].Flags&Voxel_Filled) == (T1->Voxels[i].Flags&Voxel_Filled) && */ #endif (T0->Voxels[i].Color) == (T1->Voxels[i].Color); @@ -144,10 +147,12 @@ Hash(voxel *V, v3i P) { // Air voxels don't contribute to the hash, which is why we do the multiply // + u64 Result = 0; + NotImplemented; #if VOXEL_FACE_FLAGS_CONTRIBUTE_TO_HASH - u64 Result = u64(P.x + P.y + P.z + V->Flags + V->Color) * (V->Flags & Voxel_Filled); + /* u64 Result = u64(P.x + P.y + P.z + V->Flags + V->Color) * (V->Flags & Voxel_Filled); */ #else - u64 Result = u64(P.x + P.y + P.z + V->Color) * (V->Flags & Voxel_Filled); + /* u64 Result = u64(P.x + P.y + P.z + V->Color) * (V->Flags & Voxel_Filled); */ #endif /* u64 Result = u64(V->Flags + V->Color); */ diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 9ba9c3a42..c464be986 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -73,9 +73,15 @@ AllocateWorldChunk(world_chunk *Result, v3i WorldP, v3i Dim, v3i DimInChunks, me { u32 MaxLodMeshVerts = POINT_BUFFER_SIZE*3; - Result->Voxels = AllocateVoxels(Storage, Dim); - Result->WorldP = WorldP; + s32 VoxCount = Volume(Dim); + if (VoxCount) + { + s32 OccupancyCount = (VoxCount+7) / 8; // Add seven so we round up when we divide if there's an extra one (or several) + Result->Occupancy = AllocateAlignedProtection(u8, Storage , OccupancyCount, CACHE_LINE_SIZE, false); + Result->Voxels = AllocateAlignedProtection(voxel, Storage , VoxCount, CACHE_LINE_SIZE, false); + } + Result->WorldP = WorldP; Result->Dim = Dim; Result->DimInChunks = DimInChunks; /* Result->DimX = SafeTruncateU8(Dim.x); */ @@ -578,11 +584,19 @@ MergeChunksOffset(world_chunk *Src, world_chunk *Dest, voxel_position Offset) s32 DestIndex = GetIndex(Voxel_Position(x,y,z), DestChunkDim); voxel *SrcV = Src->Voxels+SrcIndex; voxel *DestV = Dest->Voxels+DestIndex; - DestV->Flags |= (SrcV->Flags & Voxel_Filled); + + // TODO(Jesse): Can we do this branchless ..? + s32 SrcOccupancy = GetOccupancyBit(Src, SrcIndex); + if (SrcOccupancy) { SetOccupancyBit(Dest, DestIndex, SrcOccupancy); } + /* DestV->Flags |= (SrcV->Flags & Voxel_Filled); */ + if (SrcV->Color) { DestV->Color = SrcV->Color; } /* if (!DestV->Color) { DestV->Color = SrcV->Color; } */ - Dest->FilledCount += DestV->Flags & Voxel_Filled; - CAssert(Voxel_Filled == 1); + + Dest->FilledCount += SrcOccupancy; + /* Dest->FilledCount += DestV->Flags & Voxel_Filled; */ + +/* CAssert(Voxel_Filled == 1); */ // At the moment at least, I'm running under the assumption that the // dest chunk will be ready for the face mask computation to be run @@ -619,9 +633,15 @@ CopyChunkOffset(world_chunk *Src, v3i SrcChunkDim, world_chunk *Dest, v3i DestCh if (SrcIndex > -1) { s32 DestIndex = GetIndex(Voxel_Position(x,y,z), DestChunkDim); + + // TODO(Jesse): We can definitely do this much more efficiently by + // doing 8 wide or something. + s32 SrcOccupancy = GetOccupancyBit(Src, SrcIndex); + SetOccupancyBit(Dest, DestIndex, SrcOccupancy); + Dest->Voxels[DestIndex] = Src->Voxels[SrcIndex]; - Dest->FilledCount += Dest->Voxels[DestIndex].Flags & Voxel_Filled; - CAssert(Voxel_Filled == 1); + /* Dest->FilledCount += Dest->Voxels[DestIndex].Flags & Voxel_Filled; */ + /* CAssert(Voxel_Filled == 1); */ } } } @@ -648,7 +668,8 @@ Terrain_Flat( world_chunk *Chunk, if ((z + NoiseBasis.z) < Thresh) { s32 Index = GetIndex(Voxel_Position(x,y,z), Chunk->Dim); - Chunk->Voxels[Index].Flags = Voxel_Filled; + SetOccupancyBit(Chunk, Index, VoxelOccupancy_Filled); + /* Chunk->Voxels[Index].Flags = Voxel_Filled; */ Chunk->Voxels[Index].Color = RGBtoPackedHSV(RGBColor); ++Result; } @@ -660,8 +681,6 @@ Terrain_Flat( world_chunk *Chunk, } -// Starting 227k -// Perlin_8x 110k link_internal u32 Terrain_FBM2D( world_chunk *Chunk, v3i NoiseBasis, @@ -819,7 +838,7 @@ Terrain_Perlin3D( world_chunk *Chunk, s32 i = GetIndex(Voxel_Position(x,y,z), Dim); Chunk->Voxels[i].Flags = Voxel_Empty; - Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); + /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ v3 NoiseInput = MapWorldPositionToNoiseInputValue(V3(NoiseBasis), V3(x,y,z), Period); r32 NoiseValue = PerlinNoise(NoiseInput); @@ -827,17 +846,19 @@ Terrain_Perlin3D( world_chunk *Chunk, s32 NoiseChoice = NoiseValue*Amplitude > Thresh; Assert(NoiseChoice == 0 || NoiseChoice == 1); - SetFlag(&Chunk->Voxels[i], (voxel_flag)(NoiseChoice * Voxel_Filled)); + + SetOccupancyBit(Chunk, i, NoiseChoice); + /* SetFlag(&Chunk->Voxels[i], (voxel_flag)(NoiseChoice * Voxel_Filled)); */ if (NoiseChoice) { Chunk->Voxels[i].Color = RGBtoPackedHSV(RGBColor); - Assert( IsSet(&Chunk->Voxels[i], Voxel_Filled) ); + /* Assert( IsSet(&Chunk->Voxels[i], Voxel_Filled) ); */ ++Result; } else { - Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); + /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ } } @@ -870,7 +891,7 @@ Terrain_WhiteNoise( world_chunk *Chunk, s32 i = GetIndex(Voxel_Position(x,y,z), Dim); Chunk->Voxels[i].Flags = Voxel_Empty; - Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); + /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ v3 NoiseInput = MapWorldPositionToNoiseInputValue(V3(NoiseBasis), V3(x,y,z), Period); random_series Entropy = RandomSeriesFromV3(NoiseInput); @@ -880,17 +901,18 @@ Terrain_WhiteNoise( world_chunk *Chunk, s32 NoiseChoice = NoiseValue > Thresh; Assert(NoiseChoice == 0 || NoiseChoice == 1); - SetFlag(&Chunk->Voxels[i], (voxel_flag)(NoiseChoice * Voxel_Filled)); + SetOccupancyBit(Chunk, i, NoiseChoice); + /* SetFlag(&Chunk->Voxels[i], (voxel_flag)(NoiseChoice * Voxel_Filled)); */ if (NoiseChoice) { Chunk->Voxels[i].Color = RGBtoPackedHSV(RGBColor); - Assert( IsSet(&Chunk->Voxels[i], Voxel_Filled) ); + /* Assert( IsSet(&Chunk->Voxels[i], Voxel_Filled) ); */ ++Result; } else { - Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); + /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ } } @@ -917,6 +939,8 @@ TransparencyIncreases(voxel *SrcVox, voxel *DstVox) /* Assert(SrcVox->Flags & Voxel_Filled); */ b32 Result = False; + /* NotImplemented; */ +#if 0 if (SrcVox->Transparency) { // Transparent source voxels can only increase in transparency if the dest is unfilled @@ -941,6 +965,7 @@ TransparencyIncreases(voxel *SrcVox, voxel *DstVox) } } +#endif return Result; } @@ -951,9 +976,10 @@ TransparencyIncreases(voxel *Voxels, s32 SrcIndex, v3i DestP, v3i SrcChunkDim) voxel *SrcVox = Voxels+SrcIndex; voxel *DstVox = Voxels+DestIndex; - Assert(SrcVox->Flags & Voxel_Filled); + /* Assert(SrcVox->Flags & Voxel_Filled); */ b32 Result = False; +#if 0 if (SrcVox->Transparency) { // Transparent source voxels can only increase in transparency if the dest is unfilled @@ -978,10 +1004,12 @@ TransparencyIncreases(voxel *Voxels, s32 SrcIndex, v3i DestP, v3i SrcChunkDim) } } +#endif return Result; } +#if 0 link_internal void MarkBoundaryVoxels_Debug( voxel *Voxels, chunk_dimension SrcChunkDim) { @@ -1005,9 +1033,11 @@ MarkBoundaryVoxels_Debug( voxel *Voxels, chunk_dimension SrcChunkDim) } } } +#endif link_internal s32 -MarkBoundaryVoxels_MakeExteriorFaces( voxel *Voxels, +MarkBoundaryVoxels_MakeExteriorFaces( u8 *Occupancy, + voxel *Voxels, chunk_dimension SrcChunkDim, chunk_dimension SrcChunkMin, chunk_dimension SrcChunkMax ) @@ -1028,14 +1058,15 @@ MarkBoundaryVoxels_MakeExteriorFaces( voxel *Voxels, { voxel_position DestP = Voxel_Position(x,y,z); s32 SrcIndex = GetIndex(DestP, SrcChunkDim); + s32 VOccupancy = GetOccupancyBit(Occupancy, SrcIndex); voxel *Voxel = Voxels + SrcIndex; - Result += Voxel->Flags&Voxel_Filled; + Result += VOccupancy; - if (Voxel->Flags&Voxel_Filled) + if (VOccupancy) { - Voxel->Flags = Voxel_Filled; + Voxel->Flags = {}; voxel_position rightVoxel = DestP + V3i(1, 0, 0); voxel_position leftVoxel = DestP - V3i(1, 0, 0); @@ -1045,27 +1076,27 @@ MarkBoundaryVoxels_MakeExteriorFaces( voxel *Voxels, voxel_position backVoxel = DestP - V3i(0, 1, 0); - if ( !Contains( ClampedDim, rightVoxel) || NotFilled( Voxels, rightVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, rightVoxel, SrcChunkDim) ) + if ( !Contains( ClampedDim, rightVoxel) || NotFilled( Occupancy, rightVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, rightVoxel, SrcChunkDim) ) { Voxel->Flags |= Voxel_RightFace; } - if ( !Contains( ClampedDim, leftVoxel) || NotFilled( Voxels, leftVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, leftVoxel, SrcChunkDim) ) + if ( !Contains( ClampedDim, leftVoxel) || NotFilled( Occupancy, leftVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, leftVoxel, SrcChunkDim) ) { Voxel->Flags |= Voxel_LeftFace; } - if ( !Contains( ClampedDim, botVoxel) || NotFilled( Voxels, botVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, botVoxel, SrcChunkDim) ) + if ( !Contains( ClampedDim, botVoxel) || NotFilled( Occupancy, botVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, botVoxel, SrcChunkDim) ) { Voxel->Flags |= Voxel_BottomFace; } - if ( !Contains( ClampedDim, topVoxel) || NotFilled( Voxels, topVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, topVoxel, SrcChunkDim) ) + if ( !Contains( ClampedDim, topVoxel) || NotFilled( Occupancy, topVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, topVoxel, SrcChunkDim) ) { Voxel->Flags |= Voxel_TopFace; } - if ( !Contains( ClampedDim, frontVoxel) || NotFilled( Voxels, frontVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, frontVoxel, SrcChunkDim) ) + if ( !Contains( ClampedDim, frontVoxel) || NotFilled( Occupancy, frontVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, frontVoxel, SrcChunkDim) ) { Voxel->Flags |= Voxel_FrontFace; } - if ( !Contains( ClampedDim, backVoxel) || NotFilled( Voxels, backVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, backVoxel, SrcChunkDim) ) + if ( !Contains( ClampedDim, backVoxel) || NotFilled( Occupancy, backVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, backVoxel, SrcChunkDim) ) { Voxel->Flags |= Voxel_BackFace; } @@ -1078,7 +1109,8 @@ MarkBoundaryVoxels_MakeExteriorFaces( voxel *Voxels, } link_internal s32 -MarkBoundaryVoxels_NoExteriorFaces( voxel *Voxels, +MarkBoundaryVoxels_NoExteriorFaces( u8 *Occupancy, + voxel *Voxels, v3i SrcChunkDim, v3i SrcChunkMin, v3i SrcChunkMax ) @@ -1102,12 +1134,15 @@ MarkBoundaryVoxels_NoExteriorFaces( voxel *Voxels, { v3i SrcP = V3i(x,y,z); s32 SrcIndex = GetIndex(SrcP, SrcChunkDim); + s32 VOccupancy = GetOccupancyBit(Occupancy, SrcIndex); + voxel *Voxel = Voxels + SrcIndex; - Result += Voxel->Flags&Voxel_Filled; - if (Voxel->Flags & Voxel_Filled) + Result += VOccupancy; + + if (VOccupancy) { - Voxel->Flags = Voxel_Filled; + Voxel->Flags = {}; s32 RightIndex = TryGetIndex(SrcP + V3i(1, 0, 0), SrcChunkDim); s32 LeftIndex = TryGetIndex(SrcP - V3i(1, 0, 0), SrcChunkDim); @@ -1119,7 +1154,8 @@ MarkBoundaryVoxels_NoExteriorFaces( voxel *Voxels, if ( RightIndex >= 0 && RightIndex < MaxIndex ) { voxel *NextVoxel = Voxels + RightIndex; - if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) + /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ + if ( GetOccupancyBit(Occupancy, RightIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) { Voxel->Flags |= Voxel_RightFace; } @@ -1127,7 +1163,8 @@ MarkBoundaryVoxels_NoExteriorFaces( voxel *Voxels, if ( LeftIndex >= 0 && LeftIndex < MaxIndex ) { voxel *NextVoxel = Voxels + LeftIndex; - if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) + /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ + if ( GetOccupancyBit(Occupancy, LeftIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) { Voxel->Flags |= Voxel_LeftFace; } @@ -1136,7 +1173,8 @@ MarkBoundaryVoxels_NoExteriorFaces( voxel *Voxels, if ( TopIndex >= 0 && TopIndex < MaxIndex ) { voxel *NextVoxel = Voxels + TopIndex; - if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) + /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ + if ( GetOccupancyBit(Occupancy, TopIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) { Voxel->Flags |= Voxel_TopFace; } @@ -1144,7 +1182,8 @@ MarkBoundaryVoxels_NoExteriorFaces( voxel *Voxels, if ( BottomIndex >= 0 && BottomIndex < MaxIndex ) { voxel *NextVoxel = Voxels + BottomIndex; - if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) + /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ + if ( GetOccupancyBit(Occupancy, BottomIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) { Voxel->Flags |= Voxel_BottomFace; } @@ -1154,7 +1193,8 @@ MarkBoundaryVoxels_NoExteriorFaces( voxel *Voxels, if ( FrontIndex >= 0 && FrontIndex < MaxIndex ) { voxel *NextVoxel = Voxels + FrontIndex; - if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) + /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ + if ( GetOccupancyBit(Occupancy, FrontIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) { Voxel->Flags |= Voxel_FrontFace; } @@ -1162,7 +1202,8 @@ MarkBoundaryVoxels_NoExteriorFaces( voxel *Voxels, if ( BackIndex >= 0 && BackIndex < MaxIndex ) { voxel *NextVoxel = Voxels + BackIndex; - if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) + /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ + if ( GetOccupancyBit(Occupancy, BackIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) { Voxel->Flags |= Voxel_BackFace; } @@ -2594,28 +2635,6 @@ GetClosestPointRelativeTo(voxel_position* Query, voxel_position* Start, voxel_po return Result; } -link_internal b32 -AboveVoxelIsUnfilled(s32 Index, voxel *Voxels, chunk_dimension ChunkDim) -{ - TIMED_FUNCTION(); - - /* Assert( IsSet(Chunk, Chunk_VoxelsInitialized) ); */ - - s32 VolumeChunkDim = Volume(ChunkDim); - Assert(Index < VolumeChunkDim); - - voxel_position CurrentP = GetPosition(Index, ChunkDim); - - voxel_position TopVoxel = CurrentP + Voxel_Position(0, 0, 1); - s32 TopVoxelReadIndex = GetIndexUnsafe(TopVoxel, ChunkDim); - - b32 Result = False; - - if (TopVoxelReadIndex > -1 && TopVoxelReadIndex < VolumeChunkDim) - Result |= NotFilled( Voxels+TopVoxelReadIndex ); - - return Result; -} link_internal b32 HasUnfilledNeighbors(s32 Index, world_chunk* Chunk, chunk_dimension ChunkDim) { @@ -2670,6 +2689,8 @@ GetBoundingVoxelsClippedTo(world_chunk* Chunk, chunk_dimension ChunkDim, boundar { /* TIMED_FUNCTION(); */ + NotImplemented; +#if 0 v3 MinClip = GetMin(Clip); v3 MaxClip = GetMax(Clip); @@ -2703,6 +2724,7 @@ GetBoundingVoxelsClippedTo(world_chunk* Chunk, chunk_dimension ChunkDim, boundar } } } +#endif return; } @@ -2932,7 +2954,7 @@ GetBoundingVoxelsMidpoint(world_chunk *Chunk, v3i ChunkDim) /* // TODO(Jesse): This literally only accumulates an integer .. remove TempBoundingPoints and other ancillary shit */ standing_spot -ComputeStandingSpotFor8x8x2_V2(voxel *Voxels, v3i SrcChunkDim, v3i TileChunkOffset, v3i TileChunkDim) //, boundary_voxels *TempBoundingPoints) +ComputeStandingSpotFor8x8x2_V2(u8* Occupancy, voxel *Voxels, v3i SrcChunkDim, v3i TileChunkOffset, v3i TileChunkDim) //, boundary_voxels *TempBoundingPoints) { TIMED_FUNCTION(); standing_spot Result = {}; @@ -2952,7 +2974,9 @@ ComputeStandingSpotFor8x8x2_V2(voxel *Voxels, v3i SrcChunkDim, v3i TileChunkOffs s32 vIndex = GetIndex(P, SrcChunkDim); voxel *V = Voxels + vIndex; - if (IsSet(V, Voxel_Filled) && IsSet(V, Voxel_TopFace)) + s32 vOccupancy = GetOccupancyBit(Occupancy, vIndex); + + if (vOccupancy && IsSet(V, Voxel_TopFace)) { ++StandableCount; } @@ -3104,6 +3128,7 @@ IsValidForDestChunk(v3i Spot, v3i DestChunkDim) link_internal void ComputeStandingSpots( v3i SrcChunkDim, + u8 *Occupancy, voxel *Voxels, v3i SrcChunkOffset, @@ -3139,7 +3164,7 @@ ComputeStandingSpots( v3i SrcChunkDim, for (s32 zIndex = MinDim.z; zIndex <= MaxDim.z; zIndex += 1) { v3i TileOffset = V3i(xIndex, yIndex, zIndex); - standing_spot Spot = ComputeStandingSpotFor8x8x2_V2(Voxels, SrcChunkDim, TileOffset, TileDim); //, TempBoundingPoints); + standing_spot Spot = ComputeStandingSpotFor8x8x2_V2(Occupancy, Voxels, SrcChunkDim, TileOffset, TileDim); //, TempBoundingPoints); if (Spot.CanStand) { @@ -3185,7 +3210,7 @@ ComputeStandingSpots( v3i SrcChunkDim, /* memory_arena *PermMemory, */ memory_arena *TempMemory ) { - ComputeStandingSpots( SrcChunkDim, SrcChunk->Voxels, SrcChunkOffset, SrcChunkToDestChunk, TileDim, DestChunkDim, DebugMesh, DestStandingSpots, /* PermMemory, */ TempMemory ); + ComputeStandingSpots( SrcChunkDim, SrcChunk->Occupancy, SrcChunk->Voxels, SrcChunkOffset, SrcChunkToDestChunk, TileDim, DestChunkDim, DebugMesh, DestStandingSpots, /* PermMemory, */ TempMemory ); } #if 0 @@ -3698,11 +3723,11 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, if (MakeExteriorFaces) { - MarkBoundaryVoxels_MakeExteriorFaces(SyntheticChunk->Voxels, SynChunkDim, Global_ChunkApronMinDim, SynChunkDim-Global_ChunkApronMaxDim); + MarkBoundaryVoxels_MakeExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->Voxels, SynChunkDim, Global_ChunkApronMinDim, SynChunkDim-Global_ChunkApronMaxDim); } else { - MarkBoundaryVoxels_NoExteriorFaces(SyntheticChunk->Voxels, SynChunkDim, {}, SynChunkDim); + MarkBoundaryVoxels_NoExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->Voxels, SynChunkDim, {}, SynChunkDim); } CopyChunkOffset(SyntheticChunk, SynChunkDim, DestChunk, DestChunk->Dim, Global_ChunkApronMinDim); @@ -4565,17 +4590,17 @@ PushChunkDetails(renderer_2d* Group, world_chunk* Chunk, window_layout* Window) PushColumn(Group, CS(Chunk->WorldP.z)); PushNewRow(Group); - PushColumn(Group, CSz("PointsToLeaveRemaining")); - PushColumn(Group, CS(Chunk->PointsToLeaveRemaining)); - PushNewRow(Group); + /* PushColumn(Group, CSz("PointsToLeaveRemaining")); */ + /* PushColumn(Group, CS(Chunk->PointsToLeaveRemaining)); */ + /* PushNewRow(Group); */ - PushColumn(Group, CSz("BoundaryVoxels Count")); - PushColumn(Group, CS(Chunk->EdgeBoundaryVoxelCount)); - PushNewRow(Group); + /* PushColumn(Group, CSz("BoundaryVoxels Count")); */ + /* PushColumn(Group, CS(Chunk->EdgeBoundaryVoxelCount)); */ + /* PushNewRow(Group); */ - PushColumn(Group, CSz("Triangles")); - PushColumn(Group, CS(Chunk->TriCount)); - PushNewRow(Group); + /* PushColumn(Group, CSz("Triangles")); */ + /* PushColumn(Group, CS(Chunk->TriCount)); */ + /* PushNewRow(Group); */ PushColumn(Group, CSz("StandingSpots")); PushColumn(Group, CS(AtElements(&Chunk->StandingSpots))); diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 1f6411ccc..be8dcee50 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -89,7 +89,7 @@ poof(string_and_value_tables(chunk_flag)) enum voxel_flag { Voxel_Empty = 0, - Voxel_Filled = 1 << 0, + /* Voxel_Filled = 1 << 0, // NOTE(Jesse): This now lives in the Occupancy buffer */ Voxel_LeftFace = 1 << 1, Voxel_RightFace = 1 << 2, @@ -192,6 +192,7 @@ struct chunk_data { chunk_flag Flags; v3i Dim; // TODO(Jesse): can (should?) be 3x u8 instead of 3x s32 + u8 *Occupancy; voxel *Voxels; voxel_lighting *VoxelLighting; }; @@ -334,7 +335,8 @@ struct world_chunk poof(@version(1)) // chunk_data { chunk_flag Flags; poof(@no_serialize) - v3i Dim; // could be compressed? + v3i Dim; // could/should be compressed? + u8 *Occupancy; voxel *Voxels; poof(@array_length( Cast(umm, Volume(Element->Dim)))) voxel_lighting *VoxelLighting; poof(@array_length( Cast(umm, Volume(Element->Dim)))) // } @@ -375,9 +377,9 @@ struct world_chunk poof(@version(1)) #if VOXEL_DEBUG_COLOR f32 *NoiseValues; poof(@no_serialize @array_length(Volume(Element->Dim))) v3 *NormalValues; poof(@no_serialize @array_length(Volume(Element->Dim))) - u8 _Pad1[16]; poof(@no_serialize) + u8 _Pad1[8]; poof(@no_serialize) #else - u8 _Pad1[28]; poof(@no_serialize) + u8 _Pad1[20]; poof(@no_serialize) #endif }; // TODO(Jesse, id: 87, tags: speed, cache_friendly): Re-enable this @@ -386,7 +388,7 @@ struct world_chunk poof(@version(1)) // TODO(Jesse, id: 87, tags: speed, cache_friendly): Re-enable this // @world-chunk-cache-line-size -CAssert(sizeof(chunk_data) == 32); +/* CAssert(sizeof(chunk_data) == 32); */ /* CAssert(sizeof(threadsafe_geometry_buffer) == 112); */ CAssert(sizeof(voxel_position_cursor) == 24); /* CAssert(sizeof(world_chunk) == 32 + 112 + 24 + 48 + 40); */ @@ -562,6 +564,8 @@ IsBottomChunkBoundary( chunk_dimension ChunkDim, int idx ) return (idx/(int)ChunkDim.x) % (int)ChunkDim.y == 0; } + + global_variable v3i Global_StandingSpotDim = V3i(8,8,3); global_variable v3 Global_StandingSpotHalfDim = Global_StandingSpotDim/2.f; @@ -664,7 +668,7 @@ link_internal void DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk); link_internal s32 -MarkBoundaryVoxels_MakeExteriorFaces( voxel *Voxels, chunk_dimension SrcChunkDim, chunk_dimension SrcChunkMin, chunk_dimension SrcChunkMax ); +MarkBoundaryVoxels_MakeExteriorFaces(u8 *Occupancy, voxel *Voxels, chunk_dimension SrcChunkDim, chunk_dimension SrcChunkMin, chunk_dimension SrcChunkMax ); /* link_internal world_chunk_geometry_buffer* */ /* AllocateTempWorldChunkMesh(memory_arena* TempMemory); */ diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 4ac03e74a..f06b803b8 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -263,7 +263,8 @@ MapIntoQueryBox(v3 SimSpaceVoxP, v3 UpdateMinP, v3i UpdateDim) link_internal void DEBUG_AssertVoxelFloodStartsInEmptyVoxel(v3i SimSphereP, rect3i *SimSpaceUpdateBounds, voxel *CopiedVoxels) { -#if 1 + NotImplemented; +#if 0 #if BONSAI_INTERNAL v3i UpdateDim = GetDim(*SimSpaceUpdateBounds); @@ -517,11 +518,12 @@ WorldEdit_shape_sphere_Surface(apply_world_edit_params *Params, r32 RadiusSquare poof(rectalinear_iteration_pattern({ v3i CenterToVoxP = SimVoxP - EditCenterP; - if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&Voxel_Filled) == False) + NotImplemented; + /* if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&Voxel_Filled) == False) */ { b32 IsUnfilledBorder = False; poof_check_for_unfilled_border() - Assert(NewVoxelValue->Flags & Voxel_Filled); + /* Assert(NewVoxelValue->Flags & Voxel_Filled); */ if (IsUnfilledBorder) { OverwriteVoxel = True; @@ -556,17 +558,20 @@ WorldEdit_shape_sphere_Flood(apply_world_edit_params *Params, thread_local_state poof(flood_fill_iteration_pattern( { - if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&Voxel_Filled) == 0) + NotImplemented; + /* if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&Voxel_Filled) == 0) */ }, { - if ( Length(CenterToVoxP) < SquareRoot(RadiusSquared)-1.f && (V->Flags&Voxel_Filled) ) + NotImplemented; + /* if ( Length(CenterToVoxP) < SquareRoot(RadiusSquared)-1.f && (V->Flags&Voxel_Filled) ) */ { V->Flags = Voxel_Empty; } }, { v3i CenterToVoxP = SimVoxP - EditCenterP; if (Length(CenterToVoxP) < SquareRoot(RadiusSquared)-1.f) { - if (V->Flags & Voxel_Filled) + NotImplemented; + /* if (V->Flags & Voxel_Filled) */ { V->Color = MagicaVoxelDefaultPaletteToPackedHSV(SafeTruncateU8(RandomBetween((u32)MCV_GREY_5, &ColorEntropy, (u32)MCV_GREY_8+1))); } @@ -616,11 +621,13 @@ WorldEdit_shape_rect_Surface(apply_world_edit_params *Params, voxel *NewVoxelVal { poof(rectalinear_iteration_pattern({ - if ((V->Flags&Voxel_Filled) == False) + NotImplemented; + /* if ((V->Flags&Voxel_Filled) == False) */ { b32 IsUnfilledBorder = False; poof_check_for_unfilled_border() - Assert(NewVoxelValue->Flags & Voxel_Filled); + NotImplemented; + /* Assert(NewVoxelValue->Flags & Voxel_Filled); */ if (IsUnfilledBorder) { OverwriteVoxel = True; @@ -659,11 +666,15 @@ WorldEdit_shape_rect_Flood( apply_world_edit_params *Params, thread_local_state case WorldEdit_Mode_Remove: { poof(flood_fill_iteration_pattern( - { if ( (V->Flags&Voxel_Filled) == (Voxel_Filled*(Mode==WorldEdit_Mode_Attach)) ) }, { - if ( Mode == WorldEdit_Mode_Attach && (V->Flags&Voxel_Filled) ) - { } - else + NotImplemented; + /* { if ( (V->Flags&Voxel_Filled) == (Voxel_Filled*(Mode==WorldEdit_Mode_Attach)) ) }, */ + }, + { + NotImplemented; + /* if ( Mode == WorldEdit_Mode_Attach && (V->Flags&Voxel_Filled) ) */ + /* { } */ + /* else */ { OverwriteVoxel = True; } @@ -694,7 +705,8 @@ WorldEdit_shape_rect_Default(apply_world_edit_params *Params, voxel *NewVoxelVal case WorldEdit_Mode_Paint: { poof(rectalinear_iteration_pattern({ - if (V->Flags & Voxel_Filled) + NotImplemented; + /* if (V->Flags & Voxel_Filled) */ { OverwriteVoxel = True; } @@ -731,7 +743,8 @@ WorldEdit_shape_chunk_data_Surface(apply_world_edit_params *Params, v3 SimOrigin v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - if ((V->Flags&Voxel_Filled)==False) + NotImplemented; + /* if ((V->Flags&Voxel_Filled)==False) */ { b32 IsUnfilledBorder = False; poof_check_for_unfilled_border() @@ -752,7 +765,8 @@ WorldEdit_shape_chunk_data_Surface(apply_world_edit_params *Params, v3 SimOrigin voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); if (NewVoxelValue) { - if ( (V->Flags&VoxelFaceMask) && (NewVoxelValue->Flags&Voxel_Filled) ) + NotImplemented; + /* if ( (V->Flags&VoxelFaceMask) && (NewVoxelValue->Flags&Voxel_Filled) ) */ { OverwriteVoxel = True; } @@ -782,10 +796,12 @@ WorldEdit_shape_chunk_data_Flood( { v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - if ((V->Flags&Voxel_Filled)) + NotImplemented; + /* if ((V->Flags&Voxel_Filled)) */ }, { - if ( ((V->Flags&Voxel_Filled) == 0) && NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { *V = *NewVoxelValue; } + NotImplemented; + /* if ( ((V->Flags&Voxel_Filled) == 0) && NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { *V = *NewVoxelValue; } */ }, {} )) @@ -798,10 +814,12 @@ WorldEdit_shape_chunk_data_Flood( { v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - if (Contains(SSRect, SimVoxP) && (V->Flags&Voxel_Filled) == 0) + NotImplemented; + /* if (Contains(SSRect, SimVoxP) && (V->Flags&Voxel_Filled) == 0) */ }, { - if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { *V = {}; } + NotImplemented; + /* if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { *V = {}; } */ }, {} )) @@ -813,7 +831,8 @@ WorldEdit_shape_chunk_data_Flood( poof(rectalinear_iteration_pattern({ v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { V->Color = NewVoxelValue->Color; } + NotImplemented; + /* if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { V->Color = NewVoxelValue->Color; } */ })) #include } break; @@ -826,7 +845,7 @@ WorldEdit_shape_chunk_data_Default(apply_world_edit_params *Params, v3 SimOrigin { UNPACK_APPLY_WORLD_EDIT_PARAMS(Params); - voxel InvertV = { Voxel_Filled, Params->Transparency, Params->Color }; + voxel InvertV = { VoxelOccupancy_Filled, Params->Transparency, Params->Color }; switch (Mode) { @@ -840,7 +859,8 @@ WorldEdit_shape_chunk_data_Default(apply_world_edit_params *Params, v3 SimOrigin v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; voxel *AssetV = TryGetVoxel(Data, OriginToCurrentVoxP); voxel *NewVoxelValue = &InvertV; - if ( (AssetV && (AssetV->Flags&Voxel_Filled)) || Params->PersistWhitespace ) + NotImplemented; + /* if ( (AssetV && (AssetV->Flags&Voxel_Filled)) || Params->PersistWhitespace ) */ { NewVoxelValue = AssetV; OverwriteVoxel = True; @@ -878,9 +898,9 @@ ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_re if (Mode == WorldEdit_Mode_Attach || Mode == WorldEdit_Mode_Paint) { #if VOXEL_DEBUG_COLOR - _NewVoxelValue = { Voxel_Filled, NewTransparency, NewColor, {}, {}}; + _NewVoxelValue = { VoxelOccupancy_Filled, NewTransparency, NewColor, {}, {}}; #else - _NewVoxelValue = { Voxel_Filled, NewTransparency, NewColor}; + _NewVoxelValue = { VoxelOccupancy_Filled, NewTransparency, NewColor}; #endif } @@ -1117,7 +1137,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ // NOTE(Jesse): We can actually do the entire dim here, but it's probably // better (faster) to just do what we actually need to - MarkBoundaryVoxels_NoExteriorFaces( CopiedChunk.Voxels, UpdateDim, {{1,1,1}}, UpdateDim-1); + MarkBoundaryVoxels_NoExteriorFaces( CopiedChunk.Occupancy, CopiedChunk.Voxels, UpdateDim, {{1,1,1}}, UpdateDim-1); /* MarkBoundaryVoxels_NoExteriorFaces( CopiedChunk.Voxels, UpdateDim, {}, UpdateDim); */ /* MarkBoundaryVoxels_MakeExteriorFaces( CopiedChunk.Voxels, UpdateDim, {{1,1,1}}, UpdateDim-1); */ /* MarkBoundaryVoxels_MakeExteriorFaces( CopiedChunk.Voxels, UpdateDim, {}, UpdateDim); */ @@ -1160,7 +1180,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ Assert(CopiedChunk.Voxels[Index].Color != Global_UnsetVoxel.Color); Assert( (V->Flags & Voxel_MarkBit) == 0); - StartedFilled += (V->Flags&Voxel_Filled); + StartedFilled += GetOccupancyBit(Chunk, s32(Index)); #if VOXEL_DEBUG_COLOR V->Flags = CopiedChunk.Voxels[Index].Flags; V->Color = CopiedChunk.Voxels[Index].Color; @@ -1168,7 +1188,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ #else *V = CopiedChunk.Voxels[Index]; #endif - EndedFilled += (V->Flags&Voxel_Filled); + EndedFilled += GetOccupancyBit(&CopiedChunk, s32(Index)); Assert( (V->Flags & Voxel_MarkBit) == 0); } } @@ -1221,7 +1241,10 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ NotImplemented; #else { - ComputeStandingSpots( UpdateDim, CopiedChunk.Voxels, {}, + ComputeStandingSpots( UpdateDim, + CopiedChunk.Occupancy, + CopiedChunk.Voxels, + {}, {}, Global_StandingSpotDim, UpdateDim, From 8a6b27182ba1fbc704239aaf7c304a8d044fab44 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 18 Sep 2024 07:42:31 -0700 Subject: [PATCH 029/421] Move some terrain generators into terrain.cpp from world_chunk.cpp --- generated/generate_stream_compact_v3i.h | 2 +- ..._102235355_126003659_545884473_807650077.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/terrain.cpp | 273 ++++++++++++++++++ src/engine/terrain.h | 15 + src/engine/world_chunk.cpp | 273 ------------------ 7 files changed, 292 insertions(+), 277 deletions(-) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index cd4f576cf..e16e91de0 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3087:0 +// src/engine/world_chunk.cpp:2814:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h index 7878cf21f..4e8df790f 100644 --- a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h +++ b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:760:0 +// src/engine/terrain.cpp:109:0 // NOTE(Jesse): This must hold true for using any Noise_8x func Assert(Chunk->Dim % V3i(MIN_TERRAIN_NOISE_WIDTH) == V3i(0)); diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 50073fb70..984f35789 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2135:0 +// src/engine/world_chunk.cpp:1862:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 6e5c2b9d5..59bacf115 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2138:0 +// src/engine/world_chunk.cpp:1865:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index fc225ef07..9f8072b92 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -1,3 +1,276 @@ +link_internal u32 +Terrain_Flat( world_chunk *Chunk, + v3i NoiseBasis, + void *NoiseParams, + void *UserData ) +{ + UNPACK_NOISE_PARAMS(NoiseParams); + + u32 Result = 0; + for ( s32 z = 0; z < Chunk->Dim.z; ++ z) + { + /* s64 WorldZ = s64(z - zMin + NoiseBasis.z + (GetWorldChunkDim().z*Chunk->WorldP.z)); */ + for ( s32 y = 0; y < Chunk->Dim.y; ++ y) + { + for ( s32 x = 0; x < Chunk->Dim.x; ++ x) + { + if ((z + NoiseBasis.z) < Thresh) + { + s32 Index = GetIndex(Voxel_Position(x,y,z), Chunk->Dim); + SetOccupancyBit(Chunk, Index, VoxelOccupancy_Filled); + /* Chunk->Voxels[Index].Flags = Voxel_Filled; */ + Chunk->Voxels[Index].Color = RGBtoPackedHSV(RGBColor); + ++Result; + } + } + } + } + + return Result;; +} + + +link_internal u32 +Terrain_FBM2D( world_chunk *Chunk, + v3i NoiseBasis, + void *NoiseParams, + void *OctaveCount ) +{ + /* HISTOGRAM_FUNCTION(); */ + /* TIMED_FUNCTION(); */ + + UNPACK_NOISE_PARAMS(NoiseParams); + + random_series GenColorEntropy = {12653763234231}; + + u32 ChunkSum = 0; + +#if 0 + s32 MinZ = Chunk->WorldP.z*WorldChunkDim.z; + s32 MaxZ = MinZ+WorldChunkDim.z ; + + if (MaxZ < -Amplitude) + { + s32 MaxIndex = Volume(Dim); + for ( s32 VoxIndex = 0; VoxIndex < MaxIndex; ++VoxIndex) + { + Chunk->Voxels[VoxIndex].Flags = Voxel_Filled; + Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(RGBColor); + } + return (u32)MaxIndex; + } + + if (MinZ > Amplitude) + return ChunkSum; +#endif + +#if VOXEL_DEBUG_COLOR + memory_arena *TempArena = GetThreadLocalState(ThreadLocal_ThreadIndex)->PermMemory; +#else + memory_arena *TempArena = GetTranArena(); +#endif + + v3i NoiseDim = Chunk->Dim + 2; + v3i NormalDim = Chunk->Dim; + r32 *NoiseValues = Allocate(r32, TempArena, Volume(NoiseDim)); + v3 *Normals = Allocate( v3, TempArena, Volume(NormalDim)); + +#if VOXEL_DEBUG_COLOR + Chunk->NoiseValues = NoiseValues; + Chunk->NormalValues = Normals; +#endif + + Period = Max(Period, V3(1.f)); + + u32 Octaves = *(u32*)OctaveCount; + + +#if 0 + poof( + terrain_iteration_pattern({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, + { + v3 IPeriod = Period; // Interior Period + s32 InteriorAmp = Amplitude; + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + NoiseValue += PerlinNoise(NoiseInput/IPeriod) * InteriorAmp; + + InteriorAmp = Max(1, InteriorAmp/2); + IPeriod = Max(V3(1.f), IPeriod/2); + } + + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + } + )) +#include +#endif +#if 1 + poof( + terrain_iteration_pattern_8x({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, + { + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + + { + HISTOGRAM_FUNCTION(); + + v3 InteriorPeriod = Period; + r32 InteriorAmp = r32(Amplitude); + f32 xCoords[MIN_TERRAIN_NOISE_WIDTH]; + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + Assert(Chunk->DimInChunks > V3i(0)); + + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; + } + + f32 yIn = yCoord/InteriorPeriod.y; + f32 zIn = zCoord/InteriorPeriod.z; + + // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues + f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; + PerlinNoise_8x(xCoords, yIn, zIn, TmpPerlinResults); + + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; + } + + InteriorAmp = Max(1.f, InteriorAmp/2.f); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } + + } + } + )) +#include +#endif + + /* s64 ChunkWorldZThresh = SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z) - zMin; */ + /* ComputeNormalsForChunkFromNoiseValues(ChunkWorldZThresh, NoiseValues, NoiseDim, Normals, NormalDim); */ + + return ChunkSum; +} + +link_internal u32 +Terrain_Perlin2D( world_chunk *Chunk, + v3i NoiseBasis, + void *NoiseParams, + void *UserData ) +{ + TIMED_FUNCTION(); + u32 SyntheticChunkSum = Terrain_FBM2D( Chunk, NoiseBasis, NoiseParams, UserData ); + return SyntheticChunkSum; +} + +link_internal u32 +Terrain_Perlin3D( world_chunk *Chunk, + v3i NoiseBasis, + void *NoiseParams, + void *UserData ) +{ + TIMED_FUNCTION(); + + UNPACK_NOISE_PARAMS(NoiseParams); + + u32 Result = 0; + + Assert(Chunk); + + for ( s32 z = 0; z < Dim.z; ++ z) + { + for ( s32 y = 0; y < Dim.y; ++ y) + { + for ( s32 x = 0; x < Dim.x; ++ x) + { + s32 i = GetIndex(Voxel_Position(x,y,z), Dim); + Chunk->Voxels[i].Flags = Voxel_Empty; + + /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ + + v3 NoiseInput = MapWorldPositionToNoiseInputValue(V3(NoiseBasis), V3(x,y,z), Period); + r32 NoiseValue = PerlinNoise(NoiseInput); + + s32 NoiseChoice = NoiseValue*Amplitude > Thresh; + Assert(NoiseChoice == 0 || NoiseChoice == 1); + + + SetOccupancyBit(Chunk, i, NoiseChoice); + /* SetFlag(&Chunk->Voxels[i], (voxel_flag)(NoiseChoice * Voxel_Filled)); */ + + if (NoiseChoice) + { + Chunk->Voxels[i].Color = RGBtoPackedHSV(RGBColor); + /* Assert( IsSet(&Chunk->Voxels[i], Voxel_Filled) ); */ + ++Result; + } + else + { + /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ + } + + } + } + } + + return Result; +} + +link_internal u32 +Terrain_WhiteNoise( world_chunk *Chunk, + v3i NoiseBasis, + void *NoiseParams, + void *UserData ) +{ + TIMED_FUNCTION(); + + UNPACK_NOISE_PARAMS(NoiseParams); + + u32 Result = 0; + + Assert(Chunk); + + for ( s32 z = 0; z < Dim.z; ++ z) + { + for ( s32 y = 0; y < Dim.y; ++ y) + { + for ( s32 x = 0; x < Dim.x; ++ x) + { + s32 i = GetIndex(Voxel_Position(x,y,z), Dim); + Chunk->Voxels[i].Flags = Voxel_Empty; + + /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ + + v3 NoiseInput = MapWorldPositionToNoiseInputValue(V3(NoiseBasis), V3(x,y,z), Period); + random_series Entropy = RandomSeriesFromV3(NoiseInput); + + r32 NoiseValue = RandomUnilateral(&Entropy); + + s32 NoiseChoice = NoiseValue > Thresh; + Assert(NoiseChoice == 0 || NoiseChoice == 1); + + SetOccupancyBit(Chunk, i, NoiseChoice); + /* SetFlag(&Chunk->Voxels[i], (voxel_flag)(NoiseChoice * Voxel_Filled)); */ + + if (NoiseChoice) + { + Chunk->Voxels[i].Color = RGBtoPackedHSV(RGBColor); + /* Assert( IsSet(&Chunk->Voxels[i], Voxel_Filled) ); */ + ++Result; + } + else + { + /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ + } + + } + } + } + + return Result; +} + link_internal void GrowGrassPerlin( world_chunk *Chunk, v3i P, r32 NoiseValue, r32 MaskValue, v3i SrcToDest, v3i WorldChunkDim, r32 WorldZSubZMin, v3 *ThisColor, b32 *IsFilled ) { diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 7adc8a462..3457c70ef 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -259,3 +259,18 @@ ComputeNormalsForChunkFromNoiseValues( r32 ChunkWorldZ, r32 *NoiseValues, v3i No link_internal u32 Terrain_Voronoi3D( world_chunk *, v3i, void *, void * ); + +link_internal u32 +Terrain_WhiteNoise( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); + +link_internal u32 +Terrain_Perlin3D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); + +link_internal u32 +Terrain_Perlin2D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); + +link_internal u32 +Terrain_Voronoi3D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); + +link_internal u32 +Terrain_Voronoi2D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index c464be986..f0c3cf8bc 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -649,279 +649,6 @@ CopyChunkOffset(world_chunk *Src, v3i SrcChunkDim, world_chunk *Dest, v3i DestCh } -link_internal u32 -Terrain_Flat( world_chunk *Chunk, - v3i NoiseBasis, - void *NoiseParams, - void *UserData ) -{ - UNPACK_NOISE_PARAMS(NoiseParams); - - u32 Result = 0; - for ( s32 z = 0; z < Chunk->Dim.z; ++ z) - { - /* s64 WorldZ = s64(z - zMin + NoiseBasis.z + (GetWorldChunkDim().z*Chunk->WorldP.z)); */ - for ( s32 y = 0; y < Chunk->Dim.y; ++ y) - { - for ( s32 x = 0; x < Chunk->Dim.x; ++ x) - { - if ((z + NoiseBasis.z) < Thresh) - { - s32 Index = GetIndex(Voxel_Position(x,y,z), Chunk->Dim); - SetOccupancyBit(Chunk, Index, VoxelOccupancy_Filled); - /* Chunk->Voxels[Index].Flags = Voxel_Filled; */ - Chunk->Voxels[Index].Color = RGBtoPackedHSV(RGBColor); - ++Result; - } - } - } - } - - return Result;; -} - - -link_internal u32 -Terrain_FBM2D( world_chunk *Chunk, - v3i NoiseBasis, - void *NoiseParams, - void *OctaveCount ) -{ - /* HISTOGRAM_FUNCTION(); */ - /* TIMED_FUNCTION(); */ - - UNPACK_NOISE_PARAMS(NoiseParams); - - random_series GenColorEntropy = {12653763234231}; - - u32 ChunkSum = 0; - -#if 0 - s32 MinZ = Chunk->WorldP.z*WorldChunkDim.z; - s32 MaxZ = MinZ+WorldChunkDim.z ; - - if (MaxZ < -Amplitude) - { - s32 MaxIndex = Volume(Dim); - for ( s32 VoxIndex = 0; VoxIndex < MaxIndex; ++VoxIndex) - { - Chunk->Voxels[VoxIndex].Flags = Voxel_Filled; - Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(RGBColor); - } - return (u32)MaxIndex; - } - - if (MinZ > Amplitude) - return ChunkSum; -#endif - -#if VOXEL_DEBUG_COLOR - memory_arena *TempArena = GetThreadLocalState(ThreadLocal_ThreadIndex)->PermMemory; -#else - memory_arena *TempArena = GetTranArena(); -#endif - - v3i NoiseDim = Chunk->Dim + 2; - v3i NormalDim = Chunk->Dim; - r32 *NoiseValues = Allocate(r32, TempArena, Volume(NoiseDim)); - v3 *Normals = Allocate( v3, TempArena, Volume(NormalDim)); - -#if VOXEL_DEBUG_COLOR - Chunk->NoiseValues = NoiseValues; - Chunk->NormalValues = Normals; -#endif - - Period = Max(Period, V3(1.f)); - - u32 Octaves = *(u32*)OctaveCount; - - -#if 0 - poof( - terrain_iteration_pattern({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, - { - v3 IPeriod = Period; // Interior Period - s32 InteriorAmp = Amplitude; - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) - { - NoiseValue += PerlinNoise(NoiseInput/IPeriod) * InteriorAmp; - - InteriorAmp = Max(1, InteriorAmp/2); - IPeriod = Max(V3(1.f), IPeriod/2); - } - - u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); - } - )) -#include -#endif -#if 1 - poof( - terrain_iteration_pattern_8x({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, - { - u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); - - { - HISTOGRAM_FUNCTION(); - - v3 InteriorPeriod = Period; - r32 InteriorAmp = r32(Amplitude); - f32 xCoords[MIN_TERRAIN_NOISE_WIDTH]; - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) - { - Assert(Chunk->DimInChunks > V3i(0)); - - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) - { - xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; - } - - f32 yIn = yCoord/InteriorPeriod.y; - f32 zIn = zCoord/InteriorPeriod.z; - - // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues - f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; - PerlinNoise_8x(xCoords, yIn, zIn, TmpPerlinResults); - - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) - { - NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; - } - - InteriorAmp = Max(1.f, InteriorAmp/2.f); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); - } - - } - } - )) -#include -#endif - - /* s64 ChunkWorldZThresh = SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z) - zMin; */ - /* ComputeNormalsForChunkFromNoiseValues(ChunkWorldZThresh, NoiseValues, NoiseDim, Normals, NormalDim); */ - - return ChunkSum; -} - -link_internal u32 -Terrain_Perlin2D( world_chunk *Chunk, - v3i NoiseBasis, - void *NoiseParams, - void *UserData ) -{ - TIMED_FUNCTION(); - u32 SyntheticChunkSum = Terrain_FBM2D( Chunk, NoiseBasis, NoiseParams, UserData ); - return SyntheticChunkSum; -} - -link_internal u32 -Terrain_Perlin3D( world_chunk *Chunk, - v3i NoiseBasis, - void *NoiseParams, - void *UserData ) -{ - TIMED_FUNCTION(); - - UNPACK_NOISE_PARAMS(NoiseParams); - - u32 Result = 0; - - Assert(Chunk); - - for ( s32 z = 0; z < Dim.z; ++ z) - { - for ( s32 y = 0; y < Dim.y; ++ y) - { - for ( s32 x = 0; x < Dim.x; ++ x) - { - s32 i = GetIndex(Voxel_Position(x,y,z), Dim); - Chunk->Voxels[i].Flags = Voxel_Empty; - - /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ - - v3 NoiseInput = MapWorldPositionToNoiseInputValue(V3(NoiseBasis), V3(x,y,z), Period); - r32 NoiseValue = PerlinNoise(NoiseInput); - - s32 NoiseChoice = NoiseValue*Amplitude > Thresh; - Assert(NoiseChoice == 0 || NoiseChoice == 1); - - - SetOccupancyBit(Chunk, i, NoiseChoice); - /* SetFlag(&Chunk->Voxels[i], (voxel_flag)(NoiseChoice * Voxel_Filled)); */ - - if (NoiseChoice) - { - Chunk->Voxels[i].Color = RGBtoPackedHSV(RGBColor); - /* Assert( IsSet(&Chunk->Voxels[i], Voxel_Filled) ); */ - ++Result; - } - else - { - /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ - } - - } - } - } - - return Result; -} - -link_internal u32 -Terrain_WhiteNoise( world_chunk *Chunk, - v3i NoiseBasis, - void *NoiseParams, - void *UserData ) -{ - TIMED_FUNCTION(); - - UNPACK_NOISE_PARAMS(NoiseParams); - - u32 Result = 0; - - Assert(Chunk); - - for ( s32 z = 0; z < Dim.z; ++ z) - { - for ( s32 y = 0; y < Dim.y; ++ y) - { - for ( s32 x = 0; x < Dim.x; ++ x) - { - s32 i = GetIndex(Voxel_Position(x,y,z), Dim); - Chunk->Voxels[i].Flags = Voxel_Empty; - - /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ - - v3 NoiseInput = MapWorldPositionToNoiseInputValue(V3(NoiseBasis), V3(x,y,z), Period); - random_series Entropy = RandomSeriesFromV3(NoiseInput); - - r32 NoiseValue = RandomUnilateral(&Entropy); - - s32 NoiseChoice = NoiseValue > Thresh; - Assert(NoiseChoice == 0 || NoiseChoice == 1); - - SetOccupancyBit(Chunk, i, NoiseChoice); - /* SetFlag(&Chunk->Voxels[i], (voxel_flag)(NoiseChoice * Voxel_Filled)); */ - - if (NoiseChoice) - { - Chunk->Voxels[i].Color = RGBtoPackedHSV(RGBColor); - /* Assert( IsSet(&Chunk->Voxels[i], Voxel_Filled) ); */ - ++Result; - } - else - { - /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ - } - - } - } - } - - return Result; -} - typedef u32 (*chunk_init_callback)( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, From 3ac604bdd40b4e3397fe275c56a7a7fb3ee35f40 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 18 Sep 2024 07:54:07 -0700 Subject: [PATCH 030/421] Small cleanup, update stdlib/debug --- examples/terrain_gen/game.cpp | 2 +- external/bonsai_debug | 2 +- external/bonsai_stdlib | 2 +- src/engine/terrain.h | 6 ------ src/engine/world_chunk.cpp | 10 ---------- 5 files changed, 3 insertions(+), 19 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 1cd5175fe..e474630ee 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -444,7 +444,7 @@ BONSAI_API_WORKER_THREAD_CALLBACK() v3 Period = V3(2500); s32 Amplititude = 1500; - s32 StartingZDepth = 100; + s32 StartingZDepth = -400; u32 Octaves = 3; /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ diff --git a/external/bonsai_debug b/external/bonsai_debug index 0468de9df..21a01fb4e 160000 --- a/external/bonsai_debug +++ b/external/bonsai_debug @@ -1 +1 @@ -Subproject commit 0468de9dffa78892c6777c0d36971c39f59cee59 +Subproject commit 21a01fb4e3067a7faf35be994e655a2a2865b123 diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index b06a70486..74f1490cf 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit b06a70486d05a828ee16c37a8aee9043f0d4e52b +Subproject commit 74f1490cfa812dffba93126a0ab1c6cc672f631d diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 3457c70ef..0bd75c701 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -254,12 +254,6 @@ link_internal void ComputeNormalsForChunkFromNoiseValues( r32 ChunkWorldZ, r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim); -/* link_internal u32 */ -/* Terrain_Voronoi2D( world_chunk *, v3i, v3i, v3i, u16, s32, s32, s64, v3i, void *); */ - -link_internal u32 -Terrain_Voronoi3D( world_chunk *, v3i, void *, void * ); - link_internal u32 Terrain_WhiteNoise( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index f0c3cf8bc..d9d1c54c9 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3217,13 +3217,6 @@ ComputeLodMesh( thread_local_state *Thread, #if 1 #endif -/* link_internal chunk_dimension */ -/* ChunkDimension(world_chunk* Chunk) */ -/* { */ -/* chunk_dimension Result = Chunk->Dim; */ -/* return Result; */ -/* } */ - link_internal void InitializeWorldChunkEmpty(world_chunk *DestChunk) { @@ -3252,9 +3245,6 @@ InitializeWorldChunkEmpty(world_chunk *DestChunk) return; } -// TODO(Jesse)(hack): Remove this! -global_variable memory_arena Global_PermMemory = {}; - inline void QueueChunkForInit(work_queue *Queue, world_chunk *Chunk, world_chunk_mesh_bitfield MeshBit) { From 231afdf54e3f7a778a8acae824a2ace5b74c8832 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 18 Sep 2024 15:15:11 -0700 Subject: [PATCH 031/421] Begin doing smarter scheduling & rendering --- examples/terrain_gen/game_constants.h | 4 +- ...editor_ui_for_compound_type_engine_debug.h | 16 ++++ generated/generate_cursor_octree_node.h | 2 +- ..._102235355_126003659_545884473_807650077.h | 5 +- jesse.make.sh | 2 +- src/engine/debug.h | 3 +- src/engine/resources.h | 2 + src/engine/terrain.cpp | 2 +- src/engine/terrain.h | 4 +- src/engine/world.cpp | 96 +++++++++++++------ src/engine/world_chunk.cpp | 2 +- 11 files changed, 93 insertions(+), 45 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 87111d174..e582b6724 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -12,11 +12,11 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ -g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km +/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ -/* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ +g_VisibleRegion = Chunk_Dimension(32, 32, 32); /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index f584699cf..1e97c6bdb 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -178,6 +178,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*,&Element->DrawBranchNodesWithMeshes), + CSz("DrawBranchNodesWithMeshes"), + Params + ); + + + + + + + PushNewRow(Ui); DoEditorUi(Ui, diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index 07313f764..707470d88 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.cpp:474:0 +// src/engine/world.cpp:504:0 struct octree_node_ptr_cursor { diff --git a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h index 4e8df790f..7ea33da35 100644 --- a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h +++ b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h @@ -18,13 +18,12 @@ for ( s32 z = 0; z < Dim.z; ++ z) for ( s32 x = 0; x < Dim.x; x += MIN_TERRAIN_NOISE_WIDTH ) { s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); - /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); { - HISTOGRAM_FUNCTION(); + /* HISTOGRAM_FUNCTION(); */ v3 InteriorPeriod = Period; r32 InteriorAmp = r32(Amplitude); @@ -69,8 +68,6 @@ for ( s32 z = 0; z < Dim.z; ++ z) } SetOccupancyByte(Chunk, VoxIndex, OccupancyByte); - /* s32 ByteIndex = VoxIndex/8; */ - /* Chunk->Occupancy[ByteIndex] = OccupancyByte; */ } } } diff --git a/jesse.make.sh b/jesse.make.sh index ea3da9380..5bc648b61 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/debug.h b/src/engine/debug.h index d359b322b..12add709e 100644 --- a/src/engine/debug.h +++ b/src/engine/debug.h @@ -58,9 +58,10 @@ struct engine_debug b8 TriggerRuntimeBreak; b8 ResetAssetNodeView; + b8 DrawBranchNodesWithMeshes = 1; b8 DrawBranchNodes; b8 DrawLeafNodes; - b8 DrawQueuedNodes; + b8 DrawQueuedNodes = 1; u8 PickedChunkState; world_chunk *PickedChunk; diff --git a/src/engine/resources.h b/src/engine/resources.h index b9ff0526a..cb4632edb 100644 --- a/src/engine/resources.h +++ b/src/engine/resources.h @@ -62,6 +62,8 @@ struct engine_resources asset_system AssetSystem; + // TODO(Jesse): Rename this to FrameNumber because it's incremented at the + // beginning of the frame, meaning we never see (FrameIndex == 0) u32 FrameIndex; // At 120fps we get 9k hours (385 days) of frames in 32bits tiered_mesh_freelist geo_u3d_MeshFreelist; diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 9f8072b92..1d6806c16 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -111,7 +111,7 @@ Terrain_FBM2D( world_chunk *Chunk, u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); { - HISTOGRAM_FUNCTION(); + /* HISTOGRAM_FUNCTION(); */ v3 InteriorPeriod = Period; r32 InteriorAmp = r32(Amplitude); diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 0bd75c701..28d26eaad 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -85,7 +85,6 @@ poof( for ( s32 x = 0; x < Dim.x; x += MIN_TERRAIN_NOISE_WIDTH ) { s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); - /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ user_code @@ -101,8 +100,6 @@ poof( } SetOccupancyByte(Chunk, VoxIndex, OccupancyByte); - /* s32 ByteIndex = VoxIndex/8; */ - /* Chunk->Occupancy[ByteIndex] = OccupancyByte; */ } } } @@ -264,6 +261,7 @@ link_internal u32 Terrain_Perlin2D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); link_internal u32 + Terrain_Voronoi3D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); link_internal u32 diff --git a/src/engine/world.cpp b/src/engine/world.cpp index b17ddfcff..194e1deb2 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -349,16 +349,21 @@ GetParentNodeFor(world *World, octree_node *QueryNode) return Result; } -link_internal void +link_internal s32 DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats *Stats, world_chunk_ptr_paged_list *MainDrawList, world_chunk_ptr_paged_list *ShadowMapDrawList) { UNPACK_ENGINE_RESOURCES(Engine); + s32 Result = 0; + + world_chunk *Chunk = &Node->Chunk; Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); f32 AABBLineDim = Max(1.f, Node->Chunk.DimInChunks.x/12.f); Assert (Node); { + SyncGpuBuffersAsync(Engine, &Node->Chunk.Meshes); + switch(Node->Type) { InvalidCase(OctreeNodeType_Undefined); @@ -369,15 +374,36 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * { DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); } - DrawOctreeRecursive(Engine, Node->Children[0], Stats, MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[1], Stats, MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[2], Stats, MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[3], Stats, MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[4], Stats, MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[5], Stats, MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[6], Stats, MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[7], Stats, MainDrawList, ShadowMapDrawList); + + if (HasGpuMesh(&Node->Chunk.Meshes) && EngineDebug->DrawBranchNodesWithMeshes) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); + } + + s32 ChildrenDrew = DrawOctreeRecursive(Engine, Node->Children[0], Stats, MainDrawList, ShadowMapDrawList); + ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[1], Stats, MainDrawList, ShadowMapDrawList); + ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[2], Stats, MainDrawList, ShadowMapDrawList); + ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[3], Stats, MainDrawList, ShadowMapDrawList); + ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[4], Stats, MainDrawList, ShadowMapDrawList); + ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[5], Stats, MainDrawList, ShadowMapDrawList); + ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[6], Stats, MainDrawList, ShadowMapDrawList); + ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[7], Stats, MainDrawList, ShadowMapDrawList); + + Assert(ChildrenDrew <= 8); + s32 AllChildrenDrew = (ChildrenDrew == 8); + if (AllChildrenDrew) + { + // All good, kids took care of it + } + else + { + // Draw ourselves; the mesh composed of the children has a hole. + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); + } + ++Stats->TotalBranches; + Result = AllChildrenDrew; } break; case OctreeNodeType_Leaf: @@ -387,11 +413,13 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); } - SyncGpuBuffersAsync(Engine, &Node->Chunk.Meshes); - world_chunk *Chunk = &Node->Chunk; Push(MainDrawList, &Chunk); Push(ShadowMapDrawList, &Chunk); + + if (HasGpuMesh(&Node->Chunk.Meshes)) { Assert(Chunk->FilledCount); } + ++Stats->TotalLeaves; + Result = s32(HasGpuMesh(&Node->Chunk.Meshes)) || Node->Chunk.FilledCount == 0; } break; } @@ -405,6 +433,8 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * } ++Stats->TotalQueued; } + + return Result; } #define OCTREE_CHUNKS_PER_RESOLUTION_STEP (3) @@ -507,6 +537,14 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue Assert(NodeToSplit->Chunk.Dim % World->ChunkDim == V3i(0)); + // Queue node to be initialized + if ( (NodeToSplit->Chunk.Flags & Chunk_Queued) == 0 && + (NodeToSplit->Chunk.Flags & Chunk_VoxelsInitialized) == 0 ) + + { + PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit); + } + Assert (NodeToSplit); { switch(NodeToSplit->Type) @@ -545,8 +583,8 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue { Assert(NodeToSplit->Children[Index] == 0); - // NOTE(Jesse): This is used as a mask so we can drop out dimensions that are on the min edge - // when computing RelWorldP + // NOTE(Jesse): This is used as a mask so we can drop out + // dimensions that are on the min edge when computing RelWorldP v3i P = PositionFromIndex(Index, V3i(2)); Assert(P < V3i(2)); v3i RelWorldP = P * ChildDimInChunks; @@ -555,29 +593,25 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue NodeToSplit->Children[Index] = Child; InitOctreeNode(World, Child, NodeToSplit->Chunk.WorldP + RelWorldP, ChildDimInChunks); - if (OctreeLeafShouldSplit(Engine, Child)) - { - SplitOctreeNode_Recursive(Engine, Queue, Child, Memory); - } - else + // NOTE(Jesse): Intentionally initializing the tree from the top-down + // so we get increasing LoDs + /* if (OctreeLeafShouldSplit(Engine, Child)) */ + /* { */ + /* SplitOctreeNode_Recursive(Engine, Queue, Child, Memory); */ + /* } */ + /* else */ { - if ( (Child->Chunk.Flags & Chunk_Queued) == 0 && - (Child->Chunk.Flags & Chunk_VoxelsInitialized) == 0) - { - PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Child); - } + /* if ( (Child->Chunk.Flags & Chunk_Queued) == 0 && */ + /* (Child->Chunk.Flags & Chunk_VoxelsInitialized) == 0) */ + /* { */ + /* PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Child); */ + /* } */ } } } else { - if ( (NodeToSplit->Chunk.Flags & Chunk_Queued) == 0 && - (NodeToSplit->Chunk.Flags & Chunk_VoxelsInitialized) == 0 ) - - { - PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit); - } } } break; @@ -739,10 +773,10 @@ MaintainWorldOctree(engine_resources *Engine) if (NodeP) { octree_node *Node = *NodeP; - Assert(Node->Type == OctreeNodeType_Leaf); + /* Assert(Node->Type == OctreeNodeType_Leaf); */ world_chunk *Chunk = &Node->Chunk; - if ((Chunk->Flags & Chunk_Queued) == 0) + Assert((Chunk->Flags & Chunk_Queued) == 0); { if (Node->Chunk.Flags == Chunk_Uninitialized) { diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index d9d1c54c9..af29a99bd 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -640,7 +640,7 @@ CopyChunkOffset(world_chunk *Src, v3i SrcChunkDim, world_chunk *Dest, v3i DestCh SetOccupancyBit(Dest, DestIndex, SrcOccupancy); Dest->Voxels[DestIndex] = Src->Voxels[SrcIndex]; - /* Dest->FilledCount += Dest->Voxels[DestIndex].Flags & Voxel_Filled; */ + Dest->FilledCount += SrcOccupancy; /* CAssert(Voxel_Filled == 1); */ } } From e0c01065ec712152e3f1e8729eb93d618623b761 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 19 Sep 2024 08:04:48 -0700 Subject: [PATCH 032/421] Drawing most-complete LoD of octree --- examples/terrain_gen/game.cpp | 16 +- examples/terrain_gen/game_constants.h | 6 +- generated/are_equal_octree_node.h | 2 +- generated/freelist_allocator_octree_node.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- jesse.make.sh | 2 +- src/engine/world.cpp | 358 ++++++++++++------- src/engine/world.h | 1 + 9 files changed, 237 insertions(+), 154 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index e474630ee..fc5906449 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -434,18 +434,20 @@ BONSAI_API_WORKER_THREAD_CALLBACK() case TerrainGenType_FBM2D: { // FBM params - /* v3 Period = V3(18000); */ - /* s32 Amplititude = 10000; */ + v3 Period = V3(18000); + s32 Amplititude = 10000; + s32 StartingZDepth = 0; + u32 Octaves = 7; /* v3 Period = V3(125); */ /* s32 Amplititude = 125; */ - /* u32 Octaves = 1; */ /* s32 StartingZDepth = 0; */ + /* u32 Octaves = 1; */ - v3 Period = V3(2500); - s32 Amplititude = 1500; - s32 StartingZDepth = -400; - u32 Octaves = 3; + /* v3 Period = V3(2500); */ + /* s32 Amplititude = 1500; */ + /* s32 StartingZDepth = -400; */ + /* u32 Octaves = 3; */ /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index e582b6724..0de844ef5 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -10,13 +10,13 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); */ -/* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ -/* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ +/* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ // 26km +g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ -g_VisibleRegion = Chunk_Dimension(32, 32, 32); +/* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index f6f4ce531..99fb4124d 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:26:0 +// src/engine/world.h:27:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index b960cc8b7..aa66fd237 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:31:0 +// src/engine/world.h:32:0 struct octree_node_freelist { diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index 707470d88..0a2ec02ea 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.cpp:504:0 +// src/engine/world.cpp:491:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index 5ab696ff3..bcc690cc9 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:28:0 +// src/engine/world.h:29:0 struct octree_node_ptr_stack { diff --git a/jesse.make.sh b/jesse.make.sh index 5bc648b61..ea3da9380 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 194e1deb2..7c9dab1d7 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -350,79 +350,68 @@ GetParentNodeFor(world *World, octree_node *QueryNode) } link_internal s32 -DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats *Stats, world_chunk_ptr_paged_list *MainDrawList, world_chunk_ptr_paged_list *ShadowMapDrawList) +CountsAsDrawable(octree_node *Node) +{ + world_chunk *Chunk = &Node->Chunk; + + // NOTE(Jesse): Queued nodes don't necessarily mean they can't be drawn, but + // I'm going to say this is true to avoid data races for now + b32 NotQueued = (Chunk->Flags&Chunk_Queued) == 0; + b32 IsInitialized = (Chunk->Flags&Chunk_VoxelsInitialized); + b32 ChunkIsFullOrEmpty = (Chunk->FilledCount == 0) || Chunk->FilledCount == s32(Volume(Chunk)); + + /* s32 Result = ( NotQueued && (ChunkIsFullOrEmpty || HasGpuMesh(&Chunk->Meshes)) ); */ + s32 Result = ( NotQueued && IsInitialized && (ChunkIsFullOrEmpty || HasGpuMesh(&Chunk->Meshes)) ); + return Result; +} + +link_internal void +DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats *Stats) { UNPACK_ENGINE_RESOURCES(Engine); s32 Result = 0; world_chunk *Chunk = &Node->Chunk; - Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); - f32 AABBLineDim = Max(1.f, Node->Chunk.DimInChunks.x/12.f); - Assert (Node); + switch(Node->Type) { - SyncGpuBuffersAsync(Engine, &Node->Chunk.Meshes); + InvalidCase(OctreeNodeType_Undefined); - switch(Node->Type) + case OctreeNodeType_Branch: { - InvalidCase(OctreeNodeType_Undefined); + if (EngineDebug->DrawBranchNodes) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); + } - case OctreeNodeType_Branch: + if (HasGpuMesh(&Node->Chunk.Meshes) && EngineDebug->DrawBranchNodesWithMeshes) { - if (EngineDebug->DrawBranchNodes) - { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); - } + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); + } - if (HasGpuMesh(&Node->Chunk.Meshes) && EngineDebug->DrawBranchNodesWithMeshes) - { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); - } + DEBUG_OctreeTraversal(Engine, Node->Children[0], Stats); + DEBUG_OctreeTraversal(Engine, Node->Children[1], Stats); + DEBUG_OctreeTraversal(Engine, Node->Children[2], Stats); + DEBUG_OctreeTraversal(Engine, Node->Children[3], Stats); + DEBUG_OctreeTraversal(Engine, Node->Children[4], Stats); + DEBUG_OctreeTraversal(Engine, Node->Children[5], Stats); + DEBUG_OctreeTraversal(Engine, Node->Children[6], Stats); + DEBUG_OctreeTraversal(Engine, Node->Children[7], Stats); - s32 ChildrenDrew = DrawOctreeRecursive(Engine, Node->Children[0], Stats, MainDrawList, ShadowMapDrawList); - ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[1], Stats, MainDrawList, ShadowMapDrawList); - ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[2], Stats, MainDrawList, ShadowMapDrawList); - ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[3], Stats, MainDrawList, ShadowMapDrawList); - ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[4], Stats, MainDrawList, ShadowMapDrawList); - ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[5], Stats, MainDrawList, ShadowMapDrawList); - ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[6], Stats, MainDrawList, ShadowMapDrawList); - ChildrenDrew += DrawOctreeRecursive(Engine, Node->Children[7], Stats, MainDrawList, ShadowMapDrawList); - - Assert(ChildrenDrew <= 8); - s32 AllChildrenDrew = (ChildrenDrew == 8); - if (AllChildrenDrew) - { - // All good, kids took care of it - } - else - { - // Draw ourselves; the mesh composed of the children has a hole. - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); - } - - ++Stats->TotalBranches; - Result = AllChildrenDrew; - } break; + ++Stats->TotalBranches; + } break; - case OctreeNodeType_Leaf: + case OctreeNodeType_Leaf: + { + if (EngineDebug->DrawLeafNodes) { - if (EngineDebug->DrawLeafNodes) - { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); - } - - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); - - if (HasGpuMesh(&Node->Chunk.Meshes)) { Assert(Chunk->FilledCount); } + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + } - ++Stats->TotalLeaves; - Result = s32(HasGpuMesh(&Node->Chunk.Meshes)) || Node->Chunk.FilledCount == 0; - } break; + ++Stats->TotalLeaves; + } break; - } } if (Node->Chunk.Flags & Chunk_Queued) @@ -433,8 +422,6 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_stats * } ++Stats->TotalQueued; } - - return Result; } #define OCTREE_CHUNKS_PER_RESOLUTION_STEP (3) @@ -504,7 +491,7 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) poof(generate_cursor(octree_node_ptr)) #include -#define MAX_OCTREE_NODE_BUCKETS (8) +#define MAX_OCTREE_NODE_BUCKETS (512) #define MAX_OCTREE_NODES_QUEUED_PER_FRAME (4) struct octree_node_priority_queue { @@ -519,6 +506,8 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio s32 IdealListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, Node->Chunk.DimInChunks.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); + IdealListIndex = (MAX_OCTREE_NODE_BUCKETS-1)-IdealListIndex; + if (IsInFrustum(World, GameCamera, &Node->Chunk) == False) { IdealListIndex = MAX_OCTREE_NODE_BUCKETS-1; @@ -530,12 +519,90 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio } } + link_internal void +CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) +{ + octree_node *Node = *Bucket; + *Bucket = 0; + + switch(Node->Type) + { + InvalidCase(OctreeNodeType_Undefined); + + case OctreeNodeType_Leaf: + { + if (Node->Chunk.Flags & Chunk_Queued) + { + if ((Node->Chunk.Flags&Chunk_Deallocate) == 0) + { + { + octree_node *TestNode = Engine->World->OctreeNodeDeferFreelist.First; + while (TestNode) { Assert(TestNode != Node); TestNode = TestNode->Next; } + } + Node->Chunk.Flags = chunk_flag(Node->Chunk.Flags|Chunk_Deallocate); + Free(&Engine->World->OctreeNodeDeferFreelist, Node); + } + } + else + { + if (Node->Chunk.Flags == Chunk_VoxelsInitialized) + { + DeallocateAndClearWorldChunk(Engine, &Node->Chunk); + Free(&Engine->World->OctreeNodeFreelist, Node); + } + else + { + Assert(Node->Chunk.Flags == Chunk_Uninitialized); + } + } + } break; + + case OctreeNodeType_Branch: + { + MergeOctreeChildren(Engine, Node); + } break; + + } +} + +link_internal u32 +MergeOctreeChildren(engine_resources *Engine, octree_node *Node) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); + Assert(Node->Type == OctreeNodeType_Branch); + Node->Type = OctreeNodeType_Leaf; + + CheckedDeallocateChildNode(Engine, Node->Children+0); + CheckedDeallocateChildNode(Engine, Node->Children+1); + CheckedDeallocateChildNode(Engine, Node->Children+2); + CheckedDeallocateChildNode(Engine, Node->Children+3); + CheckedDeallocateChildNode(Engine, Node->Children+4); + CheckedDeallocateChildNode(Engine, Node->Children+5); + CheckedDeallocateChildNode(Engine, Node->Children+6); + CheckedDeallocateChildNode(Engine, Node->Children+7); + + /* QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); */ + + u32 Result = 1; + return Result; +} + + + +link_internal s32 SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue *Queue, octree_node *NodeToSplit, memory_arena *Memory) { UNPACK_ENGINE_RESOURCES(Engine); + SyncGpuBuffersAsync(Engine, &NodeToSplit->Chunk.Meshes); + + s32 Result = False; + Assert(NodeToSplit->Chunk.Dim % World->ChunkDim == V3i(0)); + b32 PushedToPriorityQueue = False; // Queue node to be initialized if ( (NodeToSplit->Chunk.Flags & Chunk_Queued) == 0 && @@ -543,8 +610,11 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue { PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit); + PushedToPriorityQueue = True; } + /* NodeToSplit->AllChildrenCanDraw = False; */ + Assert (NodeToSplit); { switch(NodeToSplit->Type) @@ -556,17 +626,21 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue if (OctreeBranchShouldCollapse(Engine, NodeToSplit)) { MergeOctreeChildren(Engine, NodeToSplit); + /* Result = True; */ } else { - SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[0], Memory); - SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[1], Memory); - SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[2], Memory); - SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[3], Memory); - SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[4], Memory); - SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[5], Memory); - SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[6], Memory); - SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[7], Memory); + s32 ChildrenReadyToDraw = SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[0], Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[1], Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[2], Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[3], Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[4], Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[5], Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[6], Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[7], Memory); + + /* NodeToSplit->AllChildrenCanDraw = (ChildrenReadyToDraw == 8); */ + /* Result = NodeToSplit->AllChildrenCanDraw; */ } } break; @@ -592,108 +666,113 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue octree_node *Child = GetOrAllocate(&World->OctreeNodeFreelist); NodeToSplit->Children[Index] = Child; InitOctreeNode(World, Child, NodeToSplit->Chunk.WorldP + RelWorldP, ChildDimInChunks); - - // NOTE(Jesse): Intentionally initializing the tree from the top-down - // so we get increasing LoDs - /* if (OctreeLeafShouldSplit(Engine, Child)) */ - /* { */ - /* SplitOctreeNode_Recursive(Engine, Queue, Child, Memory); */ - /* } */ - /* else */ - { - /* if ( (Child->Chunk.Flags & Chunk_Queued) == 0 && */ - /* (Child->Chunk.Flags & Chunk_VoxelsInitialized) == 0) */ - /* { */ - /* PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Child); */ - /* } */ - } - } } else { + if (PushedToPriorityQueue == False) + { + Result = CountsAsDrawable(NodeToSplit); + } } } break; } } + + return Result; } -link_internal void -CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) +link_internal s32 +AllChildrenCanDraw(octree_node *Node) { - octree_node *Node = *Bucket; - *Bucket = 0; + s32 Result = CountsAsDrawable(Node->Children[0]); + Result &= CountsAsDrawable(Node->Children[1]); + Result &= CountsAsDrawable(Node->Children[2]); + Result &= CountsAsDrawable(Node->Children[3]); + Result &= CountsAsDrawable(Node->Children[4]); + Result &= CountsAsDrawable(Node->Children[5]); + Result &= CountsAsDrawable(Node->Children[6]); + Result &= CountsAsDrawable(Node->Children[7]); - switch(Node->Type) - { - InvalidCase(OctreeNodeType_Undefined); + return Result; +} - case OctreeNodeType_Leaf: +link_internal s32 +DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_ptr_paged_list *MainDrawList, world_chunk_ptr_paged_list *ShadowMapDrawList) +{ + UNPACK_ENGINE_RESOURCES(Engine); + s32 Result = 0; + + world_chunk *Chunk = &Node->Chunk; + + Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); + + f32 AABBLineDim = Max(1.f, Node->Chunk.DimInChunks.x/12.f); + Assert (Node); + { + switch(Node->Type) { - if (Node->Chunk.Flags & Chunk_Queued) + InvalidCase(OctreeNodeType_Undefined); + + case OctreeNodeType_Branch: { - if ((Node->Chunk.Flags&Chunk_Deallocate) == 0) + if (EngineDebug->DrawBranchNodes) { - { - octree_node *TestNode = Engine->World->OctreeNodeDeferFreelist.First; - while (TestNode) { Assert(TestNode != Node); TestNode = TestNode->Next; } - } - Node->Chunk.Flags = chunk_flag(Node->Chunk.Flags|Chunk_Deallocate); - Free(&Engine->World->OctreeNodeDeferFreelist, Node); + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); } - } - else - { - if (Node->Chunk.Flags == Chunk_VoxelsInitialized) + + if (HasGpuMesh(&Node->Chunk.Meshes) && EngineDebug->DrawBranchNodesWithMeshes) { - DeallocateAndClearWorldChunk(Engine, &Node->Chunk); - Free(&Engine->World->OctreeNodeFreelist, Node); + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); + } + + if (AllChildrenCanDraw(Node)) + { + DrawOctreeRecursive(Engine, Node->Children[0], MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[1], MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[2], MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[3], MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[4], MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[5], MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[6], MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[7], MainDrawList, ShadowMapDrawList); + + Result = True; } else { - Assert(Node->Chunk.Flags == Chunk_Uninitialized); + // Draw ourselves; the mesh composed of the children has a hole. + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); + Result = True; } - } - } break; - - case OctreeNodeType_Branch: - { - MergeOctreeChildren(Engine, Node); - } break; - - } -} + } break; -link_internal u32 -MergeOctreeChildren(engine_resources *Engine, octree_node *Node) -{ - UNPACK_ENGINE_RESOURCES(Engine); + case OctreeNodeType_Leaf: + { + if (EngineDebug->DrawLeafNodes) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + } - Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); - Assert(Node->Type == OctreeNodeType_Branch); - Node->Type = OctreeNodeType_Leaf; + if (HasGpuMesh(&Node->Chunk.Meshes)) + { + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); + Assert(Chunk->FilledCount); + } - CheckedDeallocateChildNode(Engine, Node->Children+0); - CheckedDeallocateChildNode(Engine, Node->Children+1); - CheckedDeallocateChildNode(Engine, Node->Children+2); - CheckedDeallocateChildNode(Engine, Node->Children+3); - CheckedDeallocateChildNode(Engine, Node->Children+4); - CheckedDeallocateChildNode(Engine, Node->Children+5); - CheckedDeallocateChildNode(Engine, Node->Children+6); - CheckedDeallocateChildNode(Engine, Node->Children+7); + } break; - /* QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); */ + } + } - u32 Result = 1; return Result; } -#if 1 -#endif - link_internal void MaintainWorldOctree(engine_resources *Engine) @@ -761,6 +840,8 @@ MaintainWorldOctree(engine_resources *Engine) s32 LowPriorityQueueCount = s32(EventsCurrentlyInQueue(&Plat->LowPriority)); s32 MaxToQueueThisFrame = Max(0, MAX_OCTREE_NODES_QUEUED_PER_FRAME - LowPriorityQueueCount); + Assert(MaxToQueueThisFrame <= MAX_OCTREE_NODES_QUEUED_PER_FRAME); + s32 NumQueuedThisFrame = 0; if (MaxToQueueThisFrame) { @@ -797,7 +878,9 @@ MaintainWorldOctree(engine_resources *Engine) } done_queueing_nodes: - DrawOctreeRecursive(Engine, &World->Root, &Stats, MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, &World->Root, MainDrawList, ShadowMapDrawList); + + DEBUG_OctreeTraversal(Engine, &World->Root, &Stats); Info("TotalLeaves(%d) TotalBranches(%d) TotalQueued(%d) NewQueues(%d)", Stats.TotalLeaves, Stats.TotalBranches, Stats.TotalQueued, Stats.NewQueues); } @@ -847,6 +930,3 @@ GetWorldChunkFromOctree(world *World, v3i WorldP) return Result; } - - - diff --git a/src/engine/world.h b/src/engine/world.h index 3fc8eb8d1..e264294d6 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -10,6 +10,7 @@ enum octree_node_type struct octree_node { octree_node_type Type; + /* s32 AllChildrenCanDraw; */ // TODO(Jesse): Maybe make this a pointer ..? world_chunk Chunk; From 8447498692c1c47ccf8a3c6109c66d42d8a36a9c Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 19 Sep 2024 13:17:45 -0700 Subject: [PATCH 033/421] Better performance analysis, improve AVX by a bit --- examples/terrain_gen/game.cpp | 16 ++--- examples/terrain_gen/game_constants.h | 4 +- generated/anonymous_input_5Nt8cwGP.h | 2 +- generated/anonymous_input_nPw6miGy.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 48 ++++++++++++++ ..._102235355_126003659_545884473_807650077.h | 29 ++++++--- src/engine/debug.cpp | 16 +++++ src/engine/debug.h | 4 ++ src/engine/terrain.cpp | 39 ++++++++++- src/engine/terrain.h | 65 ++++++++++++++----- 10 files changed, 187 insertions(+), 38 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index fc5906449..028c67004 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -434,20 +434,20 @@ BONSAI_API_WORKER_THREAD_CALLBACK() case TerrainGenType_FBM2D: { // FBM params - v3 Period = V3(18000); - s32 Amplititude = 10000; - s32 StartingZDepth = 0; - u32 Octaves = 7; + /* v3 Period = V3(18000); */ + /* s32 Amplititude = 10000; */ + /* s32 StartingZDepth = 0; */ + /* u32 Octaves = 7; */ /* v3 Period = V3(125); */ /* s32 Amplititude = 125; */ /* s32 StartingZDepth = 0; */ /* u32 Octaves = 1; */ - /* v3 Period = V3(2500); */ - /* s32 Amplititude = 1500; */ - /* s32 StartingZDepth = -400; */ - /* u32 Octaves = 3; */ + v3 Period = V3(2500); + s32 Amplititude = 1500; + s32 StartingZDepth = -400; + u32 Octaves = 6; /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 0de844ef5..206122b90 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -11,8 +11,8 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ // 26km -g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km -/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ +/* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ +g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ diff --git a/generated/anonymous_input_5Nt8cwGP.h b/generated/anonymous_input_5Nt8cwGP.h index 86adfdaa5..7cad4234c 100644 --- a/generated/anonymous_input_5Nt8cwGP.h +++ b/generated/anonymous_input_5Nt8cwGP.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:420:0 +// external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:410:0 BindKeyupToInput(VK_RETURN, Enter); diff --git a/generated/anonymous_input_nPw6miGy.h b/generated/anonymous_input_nPw6miGy.h index 4b7d3cde4..ad178c02a 100644 --- a/generated/anonymous_input_nPw6miGy.h +++ b/generated/anonymous_input_nPw6miGy.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:448:0 +// external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:438:0 BindKeydownToInput(VK_RETURN, Enter); diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 1e97c6bdb..3cb7a6b3a 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -242,6 +242,54 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r64*,&Element->ChunkGenTimeElapsedMS), + CSz("ChunkGenTimeElapsedMS"), + Params + ); + + + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*,&Element->CellsGenerated), + CSz("CellsGenerated"), + Params + ); + + + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r64*,&Element->ChunkGenCyclesElapsed), + CSz("ChunkGenCyclesElapsed"), + Params + ); + + + + + + + PushNewRow(Ui); DoEditorUi(Ui, diff --git a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h index 7ea33da35..69afe565c 100644 --- a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h +++ b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h @@ -1,13 +1,10 @@ -// src/engine/terrain.cpp:109:0 +// src/engine/terrain.cpp:112:0 // NOTE(Jesse): This must hold true for using any Noise_8x func -Assert(Chunk->Dim % V3i(MIN_TERRAIN_NOISE_WIDTH) == V3i(0)); +Assert(Chunk->Dim % V3i(8) == V3i(0)); Period = Max(Period, V3(1.f)); - -/* s32 xChunkMax = Dim.x/MIN_TERRAIN_NOISE_WIDTH; */ - for ( s32 z = 0; z < Dim.z; ++ z) { f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); @@ -15,7 +12,7 @@ for ( s32 z = 0; z < Dim.z; ++ z) for ( s32 y = 0; y < Dim.y; ++ y) { f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); - for ( s32 x = 0; x < Dim.x; x += MIN_TERRAIN_NOISE_WIDTH ) + for ( s32 x = 0; x < Dim.x; x += 8 ) { s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); @@ -42,7 +39,23 @@ for ( s32 z = 0; z < Dim.z; ++ z) // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; - PerlinNoise_8x(xCoords, yIn, zIn, TmpPerlinResults); + + // best 102.7 million points/sec + // best 26.15 cycles/cell + /* PerlinNoise_8x_sse(xCoords, yIn, zIn, TmpPerlinResults); */ + + // best 143 million points/sec + // best 18.75 cycles/cell + PerlinNoise_8x_avx2(xCoords, yIn, zIn, TmpPerlinResults); + + /* TmpPerlinResults[0] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[1] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[2] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[3] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[4] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[5] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[6] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[7] = f32(PackedHSVColorValue); */ RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) { @@ -57,7 +70,7 @@ for ( s32 z = 0; z < Dim.z; ++ z) u8 OccupancyByte = 0; - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + RangeIterator(ValueIndex, 8) { s32 ThisIndex = VoxIndex+ValueIndex; s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index a2b825d39..49859e55e 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -714,6 +714,22 @@ DoEngineDebug(engine_resources *Engine) ui_toggle_button_group EditorButtonGroup = ToggleButtonGroup_engine_debug_view_mode(Ui, 0, CS(""), &Engine->EngineDebug.ViewMode, &DefaultUiRenderParams_Column); + r64 ChunkGenSeconds = EngineDebug->ChunkGenTimeElapsedMS / 1000.0; + r64 CyclesPerCell = EngineDebug->ChunkGenCyclesElapsed / EngineDebug->CellsGenerated; + + if (ChunkGenSeconds != 0.0) + { + u64 CellsGenerated = EngineDebug->CellsGenerated; + r64 CellsPerSecond = (CellsGenerated/ChunkGenSeconds); + + Text(Ui, CSz("CellsPerSecond : ")); + Text(Ui, CS(CellsPerSecond)); + PushNewRow(Ui); + + Text(Ui, CSz("CyclesPerCell : ")); + Text(Ui, CS(CyclesPerCell)); + } + engine_debug_view_mode ViewMode = Engine->EngineDebug.ViewMode; /* Editor->EngineDebugViewModeToggleBits = EditorButtonGroup.ToggleBits; */ diff --git a/src/engine/debug.h b/src/engine/debug.h index 12add709e..fa35d5379 100644 --- a/src/engine/debug.h +++ b/src/engine/debug.h @@ -63,6 +63,10 @@ struct engine_debug b8 DrawLeafNodes; b8 DrawQueuedNodes = 1; + r64 ChunkGenTimeElapsedMS; + u64 CellsGenerated; + r64 ChunkGenCyclesElapsed; + u8 PickedChunkState; world_chunk *PickedChunk; diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 1d6806c16..5586e0804 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -85,6 +85,9 @@ Terrain_FBM2D( world_chunk *Chunk, u32 Octaves = *(u32*)OctaveCount; + r64 NoiseTimeStart = GetHighPrecisionClock(); + u64 CycleCountStart = GetCycleCount(); + #if 0 poof( terrain_iteration_pattern({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, @@ -130,7 +133,26 @@ Terrain_FBM2D( world_chunk *Chunk, // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; - PerlinNoise_8x(xCoords, yIn, zIn, TmpPerlinResults); + + // best 102.7 million points/sec + // best 26.15 cycles/cell + /* PerlinNoise_8x_sse(xCoords, yIn, zIn, TmpPerlinResults); */ + + // best 143 million points/sec + // best 157 million points/sec + // + // best 18.75 cycles/cell + // best 17.11 cycles/cell + PerlinNoise_8x_avx2(xCoords, yIn, zIn, TmpPerlinResults); + + /* TmpPerlinResults[0] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[1] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[2] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[3] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[4] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[5] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[6] = f32(PackedHSVColorValue); */ + /* TmpPerlinResults[7] = f32(PackedHSVColorValue); */ RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) { @@ -147,6 +169,19 @@ Terrain_FBM2D( world_chunk *Chunk, #include #endif + u64 CycleCountEnd = GetCycleCount(); + r64 NoiseTimeEnd = GetHighPrecisionClock(); + + u64 CyclesElapsed = CycleCountEnd-CycleCountStart; + r64 NoiseTimeElapsed = NoiseTimeEnd-NoiseTimeStart; + + engine_debug *ED = GetEngineDebug(); + ED->ChunkGenCyclesElapsed += CyclesElapsed; + ED->ChunkGenTimeElapsedMS += NoiseTimeElapsed; + ED->CellsGenerated += u64(Volume(Chunk->Dim)) * Octaves; + + /* PushHistogramDataPoint(); */ + /* s64 ChunkWorldZThresh = SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z) - zMin; */ /* ComputeNormalsForChunkFromNoiseValues(ChunkWorldZThresh, NoiseValues, NoiseDim, Normals, NormalDim); */ @@ -1876,7 +1911,7 @@ GrassyTerracedTerrain4( world_chunk *Chunk, }; f32 TmpPerlinResults[8]; - PerlinNoise_8x(xCoords, InY, InZ, TmpPerlinResults); + PerlinNoise_8x_avx2(xCoords, InY, InZ, TmpPerlinResults); RangeIterator(Index, 8) { diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 28d26eaad..706237cbf 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -36,22 +36,14 @@ poof( user_code - b32 NoiseChoice = r64((noise_value_name)) > r64(WorldZBiased); + s32 NoiseChoice = r64((noise_value_name)) > r64(WorldZBiased); - SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); + SetOccupancyBit(Chunk, VoxIndex, NoiseChoice); + /* SetOccupancyByte(Chunk, VoxIndex, OccupancyByte); */ Chunk->Voxels[VoxIndex].Color = packed_HSV_color_value_name*u16(NoiseChoice); - ChunkSum += NoiseChoice; + ChunkSum += u32(NoiseChoice); Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); - - if (NoiseChoice) - { - Assert( IsSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } - else - { - Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); - } } } } @@ -68,12 +60,53 @@ poof( @code_fragment { // NOTE(Jesse): This must hold true for using any Noise_8x func - Assert(Chunk->Dim % V3i(MIN_TERRAIN_NOISE_WIDTH) == V3i(0)); + Assert(Chunk->Dim % V3i(8) == V3i(0)); Period = Max(Period, V3(1.f)); + for ( s32 z = 0; z < Dim.z; ++ z) + { + f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); + f32 WorldZBiased = zCoord - zMin; + for ( s32 y = 0; y < Dim.y; ++ y) + { + f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); + for ( s32 x = 0; x < Dim.x; x += 8 ) + { + s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); + + user_code + + u8 OccupancyByte = 0; + RangeIterator(ValueIndex, 8) + { + s32 ThisIndex = VoxIndex+ValueIndex; + s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; + ChunkSum += u32(NoiseChoice); + + OccupancyByte |= (NoiseChoice << ValueIndex); + Chunk->Voxels[ThisIndex].Color = packed_HSV_color_value_name*u16(NoiseChoice); + } + + SetOccupancyByte(Chunk, VoxIndex, OccupancyByte); + } + } + } + } +) + +poof( + func terrain_iteration_pattern_16x( type_poof_symbol noise_input_name, + type_poof_symbol noise_value_name, + type_poof_symbol packed_HSV_color_value_name, + type_poof_symbol user_code) + @code_fragment + { + // NOTE(Jesse): This must hold true for using any Noise_8x func + Assert(Chunk->Dim % V3i(16) == V3i(0)); + + Period = Max(Period, V3(1.f)); - /* s32 xChunkMax = Dim.x/MIN_TERRAIN_NOISE_WIDTH; */ for ( s32 z = 0; z < Dim.z; ++ z) { @@ -82,14 +115,14 @@ poof( for ( s32 y = 0; y < Dim.y; ++ y) { f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); - for ( s32 x = 0; x < Dim.x; x += MIN_TERRAIN_NOISE_WIDTH ) + for ( s32 x = 0; x < Dim.x; x += 16 ) { s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); user_code u8 OccupancyByte = 0; - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + RangeIterator(ValueIndex, 16) { s32 ThisIndex = VoxIndex+ValueIndex; s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; From 384842e0e12d0a7fdf65af541ad28f6acb04d73f Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 19 Sep 2024 13:18:52 -0700 Subject: [PATCH 034/421] Update stdlib --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 74f1490cf..2eb06a6f3 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 74f1490cfa812dffba93126a0ab1c6cc672f631d +Subproject commit 2eb06a6f3bcfbe5831302257656c3d5f521f9825 From bca8e7946738833ea5c1286c1d889c72b632c917 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Sep 2024 10:05:50 -0700 Subject: [PATCH 035/421] More SIMD hacking --- examples/terrain_gen/game.cpp | 11 ++- external/bonsai_stdlib | 2 +- ..._102235355_126003659_545884473_807650077.h | 45 ++++++----- jesse.bonsai.rdbg | Bin 13422 -> 13786 bytes src/engine/debug.cpp | 7 ++ src/engine/terrain.cpp | 71 +++++++++++++++++- src/engine/terrain.h | 11 ++- 7 files changed, 114 insertions(+), 33 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 028c67004..10e1dee63 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -444,11 +444,18 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* s32 StartingZDepth = 0; */ /* u32 Octaves = 1; */ - v3 Period = V3(2500); - s32 Amplititude = 1500; + v3 Period = V3(1000); + s32 Amplititude = 800; s32 StartingZDepth = -400; + /* u32 Octaves = 1; */ u32 Octaves = 6; +/* v3 Period = V3(2500); */ +/* s32 Amplititude = 1500; */ +/* s32 StartingZDepth = -400; */ +/* u32 Octaves = 1; */ +/* /1* u32 Octaves = 4; *1/ */ + /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; v3 Color = RGB_GRASS_GREEN; diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 2eb06a6f3..319d3b2c3 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 2eb06a6f3bcfbe5831302257656c3d5f521f9825 +Subproject commit 319d3b2c35b01aeb18bb3a481124051a8c3d5c11 diff --git a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h index 69afe565c..21d2ee9b5 100644 --- a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h +++ b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h @@ -1,7 +1,7 @@ -// src/engine/terrain.cpp:112:0 +// src/engine/terrain.cpp:185:0 -// NOTE(Jesse): This must hold true for using any Noise_8x func -Assert(Chunk->Dim % V3i(8) == V3i(0)); +// NOTE(Jesse): This must hold true for using any Noise_16x func +Assert(Chunk->Dim % V3i(16) == V3i(0)); Period = Max(Period, V3(1.f)); @@ -12,7 +12,7 @@ for ( s32 z = 0; z < Dim.z; ++ z) for ( s32 y = 0; y < Dim.y; ++ y) { f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); - for ( s32 x = 0; x < Dim.x; x += 8 ) + for ( s32 x = 0; x < Dim.x; x += 16 ) { s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); @@ -24,12 +24,12 @@ for ( s32 z = 0; z < Dim.z; ++ z) v3 InteriorPeriod = Period; r32 InteriorAmp = r32(Amplitude); - f32 xCoords[MIN_TERRAIN_NOISE_WIDTH]; + f32 xCoords[16]; for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { Assert(Chunk->DimInChunks > V3i(0)); - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + RangeIterator(ValueIndex, 16) { xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; } @@ -38,26 +38,25 @@ for ( s32 z = 0; z < Dim.z; ++ z) f32 zIn = zCoord/InteriorPeriod.z; // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues - f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; + f32 TmpPerlinResults[16]; // best 102.7 million points/sec // best 26.15 cycles/cell /* PerlinNoise_8x_sse(xCoords, yIn, zIn, TmpPerlinResults); */ + // // best 143 million points/sec + // best 157 million points/sec + // best 199 million points/sec + // // best 18.75 cycles/cell - PerlinNoise_8x_avx2(xCoords, yIn, zIn, TmpPerlinResults); - - /* TmpPerlinResults[0] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[1] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[2] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[3] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[4] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[5] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[6] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[7] = f32(PackedHSVColorValue); */ - - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + // best 17.11 cycles/cell + // best 13.51 cycles/cell + // + // targ 9-10 cycles/cell + PerlinNoise_16x_avx2(xCoords, yIn, zIn, TmpPerlinResults); + + RangeIterator(ValueIndex, 16) { NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; } @@ -69,8 +68,8 @@ for ( s32 z = 0; z < Dim.z; ++ z) } - u8 OccupancyByte = 0; - RangeIterator(ValueIndex, 8) + u16 OccupancyByte = 0; + RangeIterator(ValueIndex, 16) { s32 ThisIndex = VoxIndex+ValueIndex; s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; @@ -79,8 +78,8 @@ for ( s32 z = 0; z < Dim.z; ++ z) OccupancyByte |= (NoiseChoice << ValueIndex); Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); } - - SetOccupancyByte(Chunk, VoxIndex, OccupancyByte); + SetOccupancyByte(Chunk, VoxIndex, u8(OccupancyByte)); + SetOccupancyByte(Chunk, VoxIndex+8, u8(OccupancyByte>>8)); } } } diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 45d914d68efb7b48a6b0c35a432dd5939ae59f51..bd6621de35206c4f88541f8d2bb86ffedeade972 100644 GIT binary patch delta 2174 zcmZ8iTWl0%6z;$G`)>Ez%XYWh8@pRNd+WB{UZg-8GcCkTX6L`mIsbRQbI$kw zCEi*&J8%5FrKM#j@cx2Bk*eh)e|#;=i9>LyD*<<-MmX!71dq!Mzj}x0+{l$04G}Ks z>D)-ZP|OeK$Hs<-M{~uo^yo-FogN+499v5D zN?qPO#qBc@5n_%6aOnhl-%cgSFh$@l3rAO%i)ERAou0b~&rQHRN5sf0iqM3wxfODh zVuAbIgq{;;*?5ZUhRZ|8w4J4)DNTegdYbR zaIxP2Ukrvc)BS@}B*ln`4qC|qv$~P&hh0el^vNCM5M>RHSR(M5s~i2;;GIMl{M|`? z+L*6XT^;ap!b--N7hS>&?+rv@Uw@~$$}cT(VgWsLgEM4-GjTsWFwVhDJcPa{4LMHC zQ6sA?DD_pjBq*@BZIaAt24+ZYi^1>SBs?0hqSI+I4w=|6yggtg&m&OA66_xEfj2U4 zs`5=)S_4lcrXg#G4c9oV^gGBLjiI$vuPOD4P^|JLxvp^H3tKLJ>hqJmTPRC?afpX# ze65h`v!nCJvHsZ`fNu<=a0TBRF2<`z=4<78wWtWPB%s^<)b07+LG-9X^uSj=AvkSG z!0nU+>ODa??Mj-2T2pGS!?oA~nZgg_jLI7!w_eF*fs5^b!n{2eQd4APB?V7~pR%$M zp0;z#_CR+V8DS|1bbCmajqXMrP{L3!8SqKeL`KqJ(P za5Cb8UEy(9j93`C$Awa}F2e_1Svc6Wm$0nC&p`*)GzJ47ht2B9P!$vrPKC$NdKdT; z^k@$hV>Wo#XY$HItt`kzWnF0sRa)ybpJO_{0eqr|fxOb`ATu;uaHP`(XTnJcciIs4 zW(D2r@Is^GX$n}S%vKTPM)5dS66tA`-MKIRxiqJz4e1kv_k ztS9Qm(LM$Zli73>3xt<|55?eYTa4BCbX$fLG%8J2WxduE1w~Te!_X`eJFO9VH)?Wh z?Q!Cm2DcM7f(1Ao%+eY*vMy)2Yl^bKmpM@l^ija27ARb3bt8-Ezykc{-@DmFy5$Ny z)80$jF|JClJf7KbwklB;GZf$xJw(;)j?ae8jO-%u0gMwVH7-{;QEhd%&x!@9*2PV4 zE6d?wuURLiS*(Y>Hq1gMFbC(H6E+Pl9t6jFRhtW~UdkP+=QZrUW^}?JV}UT{HdWz! zj}Hr*_fH~fPJD?G9rxr(2}f$<-g8H{bmXohW~TkXiI3&4S}zL~xayimcv-@b>9K;~ z7hh&ema!F3xGku0GjPZ`#iXMEb51uopq;ZF6vu89+yjK^zo{v#HCJVLGn|5pb~BuG z4dL5@P#@Y-u)}DEiroeeY_muJt&JN=E8MaLL9ykbzdHdZtTvBYC&lJ^LnunMr8-_8 zs^-k=eVctvl7n#A?y{Ensvz^6c#wHJVdYRh5-_hv9<2tHOnPdn&#Fg`Fe7_V*HpQU zVJMr3{1z`0W=fj}uABYjp!QY3x+GNuS_3a?;d&ro?qwqTttmukPb6W@v z+c{d{rZLP?Q?S(Pk|J>8oOVanPybsKb8bRM*bTXl K9O@3+Zut-0WS{o{ delta 2051 zcmZ8iOKe+36wNsC=h^Wu{v}P~Pnw^U^|5_ zP)ZS>CFx;>5VY!o4WB~9f(?|4O$DMU2o^{cp;84>QI!Z)Vu2d&j9-F8q?frfbA4y- zIp^N_<=jK%t)tr2hK7a#{1y&s^U6}`9DdbA@x@>-SW^&-gMR$rh$1~`Voz`%Y{hN3 z)EmZkaS2mBDZCc%z(hOS2K)D0i}HE7m{sK5tXzpHdqj*s zVrF)Pc0+hC=4a!$qwB|sSU2uP$JiltX0gmvma0m&D%Wa-(tH)~TatJ^>Y}i9cMH-{ z2YV8m?j#;Z^lXX(1~D0K$7;lmSHp*KI^tPb3BedSj$2_5Ed_DKY{ztXH&*+7uzK1d zg*)*|C?j$`5woBiYGJ2ENGa?>B-Bjz+&=DB(8-3yY&qz_RSV@j;L~K|__Y5F+rRCm z%jXv4N)GGMFzq`~>^HDcv02g?;q7n1s5gZ5J`)=wq{4WouS4Bm4(f5H&qXP1pXlo| z;-HJXdkwf6596a=iG1xHDU=af9=C zkT4q4C=&wnk=;G)n6NgwdRbnzy!fEY2iA2KHv*%$7#P7wV1%WF03rb=0a&MC!`}j? z^I@Q)tC6mQ4R;FOPBX4h!hXLI-}r`5jn#cueRd|KibbCUO+c(_=8ISk1&B`@EOsOQ z^14Jo&hK@vk?>9sE?)-@G*NhNr1kSfo_U%Rt=i*)bfwdQN9tMLPTP*X;kV+Mj&Xcu zPf0bULSl|7^^%#DXO`x1!`FxJ+pVayCrKikZa)T0dYo-{qTAwIxo$&omr0|fMeg@^ zxrt(4B;VSsx}`lsF(oNB;!I0^7J`!V@7~qN(!%<=&BIk7&6G>kTp^~U#OhqzFk)?1 z%8ZA4)apjQ*$01<5udcSp}RGNhJ;glt3>6s=}zFT$Ifqts7b=x9tYnXnAX-dJ85b9N;PkTyY2A4_Un^IHS*;Py3s`fcP;Cj} z9|s}0UjX%n!$nBbjU85z#kAK9m%~bMaXuF)R!kY%hSZRq%jM;mBD$A-o{BRo&&|;> zRW5;1agRVtE1{RdpLT;PuiH$=)pA_bvJHye!zR?E{X6_QG1XBAec9#{rJAuBNUcF= zY+d-#?8B8%J8oJ%*ke6KsH%l+uH;Iy!pYU4_+Hl8wl0COm zPhXjx)cttBn>X9)92s9&%GKmbsZcHvXaSXfHz&M#j5--_i5p#BOg1~H^y(Dquw{}6 zEZ)r{0S6jcl)AdMiQ^%fMAQ^wd-?WdlZDkg_BpRnh-2D#fcog9WiUQCoJb~;$!wg< zcU$ofC0CsV+>mrs3H*qf)IyTxB7NZ8Wy~%OXV32;1=Yd0Yv^RBL`wC3DQ;j$3?

POe~PL-f(y@WO096cF9e6DL(pN*342t6bg4C~B*wuFGT!e;2~ zAnrG%*@B4qw02ChG>omr2?`Lz^NsrvZ#+ljs#s}rReEzscM+>7?(A$O_aeup-f1ss zg7nTEK}KVu>bk5EHFlfnm+2L4Fw)mVU#2`OTWCCap;S}kS|NXkzpN6ijLFrSm~6Yb zY4Jp!v@Y`>Wn_7_`fT~+VzE%$_Rx^WOJ#Mh=syjmJX7#iz;tM`U}Vp!j6U`DV+ Y0JcPn_ChunkGenTimeElapsedMS / 1000.0; r64 CyclesPerCell = EngineDebug->ChunkGenCyclesElapsed / EngineDebug->CellsGenerated; + if (ChunkGenSeconds > 3.) + { + EngineDebug->ChunkGenTimeElapsedMS = 0.; + EngineDebug->ChunkGenCyclesElapsed = 0; + EngineDebug->CellsGenerated = 0; + } + if (ChunkGenSeconds != 0.0) { u64 CellsGenerated = EngineDebug->CellsGenerated; diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 5586e0804..c33978b82 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -107,7 +107,7 @@ Terrain_FBM2D( world_chunk *Chunk, )) #include #endif -#if 1 +#if 0 poof( terrain_iteration_pattern_8x({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, { @@ -138,12 +138,24 @@ Terrain_FBM2D( world_chunk *Chunk, // best 26.15 cycles/cell /* PerlinNoise_8x_sse(xCoords, yIn, zIn, TmpPerlinResults); */ + // // best 143 million points/sec // best 157 million points/sec + // best 199 million points/sec // // best 18.75 cycles/cell // best 17.11 cycles/cell + // best 13.51 cycles/cell + // + // targ 9-10 cycles/cell PerlinNoise_8x_avx2(xCoords, yIn, zIn, TmpPerlinResults); + /* PerlinNoise_8x_avx2(xCoords+1, yIn, zIn, TmpPerlinResults+1); */ + /* PerlinNoise_8x_avx2(xCoords+2, yIn, zIn, TmpPerlinResults+2); */ + /* PerlinNoise_8x_avx2(xCoords+3, yIn, zIn, TmpPerlinResults+3); */ + /* PerlinNoise_8x_avx2(xCoords+4, yIn, zIn, TmpPerlinResults+4); */ + /* PerlinNoise_8x_avx2(xCoords+5, yIn, zIn, TmpPerlinResults+5); */ + /* PerlinNoise_8x_avx2(xCoords+6, yIn, zIn, TmpPerlinResults+6); */ + /* PerlinNoise_8x_avx2(xCoords+7, yIn, zIn, TmpPerlinResults+7); */ /* TmpPerlinResults[0] = f32(PackedHSVColorValue); */ /* TmpPerlinResults[1] = f32(PackedHSVColorValue); */ @@ -167,6 +179,63 @@ Terrain_FBM2D( world_chunk *Chunk, } )) #include +#endif +#if 1 + poof( + terrain_iteration_pattern_16x({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, + { + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + + { + /* HISTOGRAM_FUNCTION(); */ + + v3 InteriorPeriod = Period; + r32 InteriorAmp = r32(Amplitude); + f32 xCoords[16]; + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + Assert(Chunk->DimInChunks > V3i(0)); + + RangeIterator(ValueIndex, 16) + { + xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; + } + + f32 yIn = yCoord/InteriorPeriod.y; + f32 zIn = zCoord/InteriorPeriod.z; + + // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues + f32 TmpPerlinResults[16]; + + // best 102.7 million points/sec + // best 26.15 cycles/cell + /* PerlinNoise_8x_sse(xCoords, yIn, zIn, TmpPerlinResults); */ + + // + // best 143 million points/sec + // best 157 million points/sec + // best 199 million points/sec + // + // best 18.75 cycles/cell + // best 17.11 cycles/cell + // best 13.51 cycles/cell + // + // targ 9-10 cycles/cell + PerlinNoise_16x_avx2(xCoords, yIn, zIn, TmpPerlinResults); + + RangeIterator(ValueIndex, 16) + { + NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; + } + + InteriorAmp = Max(1.f, InteriorAmp/2.f); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } + + } + } + )) +#include #endif u64 CycleCountEnd = GetCycleCount(); diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 706237cbf..15dc614a5 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -1,5 +1,5 @@ -#define MIN_TERRAIN_NOISE_WIDTH (8) +#define MIN_TERRAIN_NOISE_WIDTH (16) #define COMPUTE_NOISE_INPUT(channel_name, offset, chunk) (chunk->DimInChunks.channel_name/2) + ((f32(offset)+channel_name)*chunk->DimInChunks.channel_name) + (chunk->WorldP.channel_name*WorldChunkDim.channel_name) + SrcToDest.channel_name @@ -102,12 +102,11 @@ poof( type_poof_symbol user_code) @code_fragment { - // NOTE(Jesse): This must hold true for using any Noise_8x func + // NOTE(Jesse): This must hold true for using any Noise_16x func Assert(Chunk->Dim % V3i(16) == V3i(0)); Period = Max(Period, V3(1.f)); - for ( s32 z = 0; z < Dim.z; ++ z) { f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); @@ -121,7 +120,7 @@ poof( user_code - u8 OccupancyByte = 0; + u16 OccupancyByte = 0; RangeIterator(ValueIndex, 16) { s32 ThisIndex = VoxIndex+ValueIndex; @@ -131,8 +130,8 @@ poof( OccupancyByte |= (NoiseChoice << ValueIndex); Chunk->Voxels[ThisIndex].Color = packed_HSV_color_value_name*u16(NoiseChoice); } - - SetOccupancyByte(Chunk, VoxIndex, OccupancyByte); + SetOccupancyByte(Chunk, VoxIndex, u8(OccupancyByte)); + SetOccupancyByte(Chunk, VoxIndex+8, u8(OccupancyByte>>8)); } } } From 1fb96804967d3cd687f1ed1bc50f58db19176d5d Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Sep 2024 14:02:34 -0700 Subject: [PATCH 036/421] Beat FastNoise2! --- external/bonsai_stdlib | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + ..._102235355_126003659_545884473_807650077.h | 29 ++++++------ src/engine/debug.cpp | 17 +++---- src/engine/terrain.cpp | 44 +++++++------------ 7 files changed, 41 insertions(+), 54 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 319d3b2c3..901395399 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 319d3b2c35b01aeb18bb3a481124051a8c3d5c11 +Subproject commit 901395399a45b400451310d315f05097848a1191 diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index c55a97631..2182496ec 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -186,6 +186,7 @@ + struct render_to_texture_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 3266c1224..6874a2486 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -186,6 +186,7 @@ + render_to_texture_async_params render_to_texture_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 64b37a8e8..e4e1b4f11 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -186,6 +186,7 @@ + type_render_to_texture_async_params, diff --git a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h index 21d2ee9b5..56504a20d 100644 --- a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h +++ b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h @@ -1,7 +1,7 @@ -// src/engine/terrain.cpp:185:0 +// src/engine/terrain.cpp:112:0 -// NOTE(Jesse): This must hold true for using any Noise_16x func -Assert(Chunk->Dim % V3i(16) == V3i(0)); +// NOTE(Jesse): This must hold true for using any Noise_8x func +Assert(Chunk->Dim % V3i(8) == V3i(0)); Period = Max(Period, V3(1.f)); @@ -12,7 +12,9 @@ for ( s32 z = 0; z < Dim.z; ++ z) for ( s32 y = 0; y < Dim.y; ++ y) { f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); - for ( s32 x = 0; x < Dim.x; x += 16 ) + + ComputePerlinParameters(y); + for ( s32 x = 0; x < Dim.x; x += 8 ) { s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); @@ -24,12 +26,12 @@ for ( s32 z = 0; z < Dim.z; ++ z) v3 InteriorPeriod = Period; r32 InteriorAmp = r32(Amplitude); - f32 xCoords[16]; + f32 xCoords[MIN_TERRAIN_NOISE_WIDTH]; for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { Assert(Chunk->DimInChunks > V3i(0)); - RangeIterator(ValueIndex, 16) + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) { xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; } @@ -38,7 +40,7 @@ for ( s32 z = 0; z < Dim.z; ++ z) f32 zIn = zCoord/InteriorPeriod.z; // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues - f32 TmpPerlinResults[16]; + f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; // best 102.7 million points/sec // best 26.15 cycles/cell @@ -54,9 +56,8 @@ for ( s32 z = 0; z < Dim.z; ++ z) // best 13.51 cycles/cell // // targ 9-10 cycles/cell - PerlinNoise_16x_avx2(xCoords, yIn, zIn, TmpPerlinResults); - - RangeIterator(ValueIndex, 16) + PerlinNoise_8x_avx2(xCoords, yIn, zIn, TmpPerlinResults); + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) { NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; } @@ -68,8 +69,8 @@ for ( s32 z = 0; z < Dim.z; ++ z) } - u16 OccupancyByte = 0; - RangeIterator(ValueIndex, 16) + u8 OccupancyByte = 0; + RangeIterator(ValueIndex, 8) { s32 ThisIndex = VoxIndex+ValueIndex; s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; @@ -78,8 +79,8 @@ for ( s32 z = 0; z < Dim.z; ++ z) OccupancyByte |= (NoiseChoice << ValueIndex); Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); } - SetOccupancyByte(Chunk, VoxIndex, u8(OccupancyByte)); - SetOccupancyByte(Chunk, VoxIndex+8, u8(OccupancyByte>>8)); + + SetOccupancyByte(Chunk, VoxIndex, OccupancyByte); } } } diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index 8b26b5e24..e04394a56 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -714,27 +714,24 @@ DoEngineDebug(engine_resources *Engine) ui_toggle_button_group EditorButtonGroup = ToggleButtonGroup_engine_debug_view_mode(Ui, 0, CS(""), &Engine->EngineDebug.ViewMode, &DefaultUiRenderParams_Column); - r64 ChunkGenSeconds = EngineDebug->ChunkGenTimeElapsedMS / 1000.0; - r64 CyclesPerCell = EngineDebug->ChunkGenCyclesElapsed / EngineDebug->CellsGenerated; + u64 CellsGenerated = EngineDebug->CellsGenerated; - if (ChunkGenSeconds > 3.) + if (CellsGenerated) { - EngineDebug->ChunkGenTimeElapsedMS = 0.; - EngineDebug->ChunkGenCyclesElapsed = 0; - EngineDebug->CellsGenerated = 0; + r64 CyclesPerCell = EngineDebug->ChunkGenCyclesElapsed / CellsGenerated; + Text(Ui, CSz("CyclesPerCell : ")); + Text(Ui, CS(CyclesPerCell)); + PushNewRow(Ui); } + r64 ChunkGenSeconds = EngineDebug->ChunkGenTimeElapsedMS / 1000.0; if (ChunkGenSeconds != 0.0) { - u64 CellsGenerated = EngineDebug->CellsGenerated; r64 CellsPerSecond = (CellsGenerated/ChunkGenSeconds); Text(Ui, CSz("CellsPerSecond : ")); Text(Ui, CS(CellsPerSecond)); PushNewRow(Ui); - - Text(Ui, CSz("CyclesPerCell : ")); - Text(Ui, CS(CyclesPerCell)); } engine_debug_view_mode ViewMode = Engine->EngineDebug.ViewMode; diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index c33978b82..bfae25cda 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -85,8 +85,8 @@ Terrain_FBM2D( world_chunk *Chunk, u32 Octaves = *(u32*)OctaveCount; - r64 NoiseTimeStart = GetHighPrecisionClock(); - u64 CycleCountStart = GetCycleCount(); + /* r64 NoiseTimeStart = GetHighPrecisionClock(); */ + /* u64 CycleCountStart = GetCycleCount(); */ #if 0 poof( @@ -149,23 +149,6 @@ Terrain_FBM2D( world_chunk *Chunk, // // targ 9-10 cycles/cell PerlinNoise_8x_avx2(xCoords, yIn, zIn, TmpPerlinResults); - /* PerlinNoise_8x_avx2(xCoords+1, yIn, zIn, TmpPerlinResults+1); */ - /* PerlinNoise_8x_avx2(xCoords+2, yIn, zIn, TmpPerlinResults+2); */ - /* PerlinNoise_8x_avx2(xCoords+3, yIn, zIn, TmpPerlinResults+3); */ - /* PerlinNoise_8x_avx2(xCoords+4, yIn, zIn, TmpPerlinResults+4); */ - /* PerlinNoise_8x_avx2(xCoords+5, yIn, zIn, TmpPerlinResults+5); */ - /* PerlinNoise_8x_avx2(xCoords+6, yIn, zIn, TmpPerlinResults+6); */ - /* PerlinNoise_8x_avx2(xCoords+7, yIn, zIn, TmpPerlinResults+7); */ - - /* TmpPerlinResults[0] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[1] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[2] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[3] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[4] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[5] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[6] = f32(PackedHSVColorValue); */ - /* TmpPerlinResults[7] = f32(PackedHSVColorValue); */ - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) { NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; @@ -180,7 +163,7 @@ Terrain_FBM2D( world_chunk *Chunk, )) #include #endif -#if 1 +#if 0 poof( terrain_iteration_pattern_16x({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, { @@ -223,6 +206,7 @@ Terrain_FBM2D( world_chunk *Chunk, // targ 9-10 cycles/cell PerlinNoise_16x_avx2(xCoords, yIn, zIn, TmpPerlinResults); + RangeIterator(ValueIndex, 16) { NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; @@ -235,19 +219,21 @@ Terrain_FBM2D( world_chunk *Chunk, } } )) -#include +#include #endif - u64 CycleCountEnd = GetCycleCount(); - r64 NoiseTimeEnd = GetHighPrecisionClock(); +#include + + /* u64 CycleCountEnd = GetCycleCount(); */ + /* r64 NoiseTimeEnd = GetHighPrecisionClock(); */ - u64 CyclesElapsed = CycleCountEnd-CycleCountStart; - r64 NoiseTimeElapsed = NoiseTimeEnd-NoiseTimeStart; + /* u64 CyclesElapsed = CycleCountEnd-CycleCountStart; */ + /* r64 NoiseTimeElapsed = NoiseTimeEnd-NoiseTimeStart; */ - engine_debug *ED = GetEngineDebug(); - ED->ChunkGenCyclesElapsed += CyclesElapsed; - ED->ChunkGenTimeElapsedMS += NoiseTimeElapsed; - ED->CellsGenerated += u64(Volume(Chunk->Dim)) * Octaves; + /* engine_debug *ED = GetEngineDebug(); */ + /* ED->ChunkGenCyclesElapsed += CyclesElapsed; */ + /* ED->ChunkGenTimeElapsedMS += NoiseTimeElapsed; */ + /* ED->CellsGenerated += u64(Volume(Chunk->Dim)) * Octaves; */ /* PushHistogramDataPoint(); */ From 65f196ad9e8d65f5f6c088a12c9a8bec203a3d60 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Sep 2024 16:24:23 -0700 Subject: [PATCH 037/421] 9cycles/cell --- external/bonsai_stdlib | 2 +- ..._102235355_126003659_545884473_590747459.h | 72 +++++++++++++ ..._102235355_126003659_545884473_634032968.h | 102 ++++++++++++++++++ 3 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_590747459.h create mode 100644 generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 901395399..541db6a80 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 901395399a45b400451310d315f05097848a1191 +Subproject commit 541db6a802f389049e2a62098fe61583d7233859 diff --git a/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_590747459.h b/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_590747459.h new file mode 100644 index 000000000..3e1d131a3 --- /dev/null +++ b/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_590747459.h @@ -0,0 +1,72 @@ +// src/engine/terrain.cpp:152:0 + +// NOTE(Jesse): This must hold true for using any Noise_8x func +Assert(Chunk->Dim % V3i(16) == V3i(0)); + +Period = Max(Period, V3(1.f)); + + +for ( s32 z = 0; z < Dim.z; ++ z) +{ + f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); + f32 WorldZBiased = zCoord - zMin; + for ( s32 y = 0; y < Dim.y; ++ y) + { + f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); + for ( s32 x = 0; x < Dim.x; x += 16 ) + { + s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); + + + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + + { + /* HISTOGRAM_FUNCTION(); */ + + v3 InteriorPeriod = Period; + r32 InteriorAmp = r32(Amplitude); + f32 xCoords[MIN_TERRAIN_NOISE_WIDTH]; + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + Assert(Chunk->DimInChunks > V3i(0)); + + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; + } + + f32 yIn = yCoord/InteriorPeriod.y; + f32 zIn = zCoord/InteriorPeriod.z; + + // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues + f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; + PerlinNoise_16x(xCoords, yIn, zIn, TmpPerlinResults); + + RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) + { + NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; + } + + InteriorAmp = Max(1.f, InteriorAmp/2.f); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } + + } + + + u8 OccupancyByte = 0; + RangeIterator(ValueIndex, 16) + { + s32 ThisIndex = VoxIndex+ValueIndex; + s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; + ChunkSum += u32(NoiseChoice); + + OccupancyByte |= (NoiseChoice << ValueIndex); + Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + } + + SetOccupancyByte(Chunk, VoxIndex, OccupancyByte); + } + } +} + diff --git a/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h b/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h new file mode 100644 index 000000000..949f71e21 --- /dev/null +++ b/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h @@ -0,0 +1,102 @@ +// src/engine/terrain.cpp:168:0 + +// NOTE(Jesse): This must hold true for using any Noise_16x func +Assert(Chunk->Dim % V3i(16) == V3i(0)); + +Period = Max(Period, V3(1.f)); + +auto PrimeX = U32_8X(501125321); +auto PrimeY = U32_8X(1136930381); +auto PrimeZ = U32_8X(1720413743); + +u64 CycleCountStart = GetCycleCount(); + +// TODO(Jesse): Make this dynamic +Assert(Octaves < 8); +perlin_params zParams[8]; +perlin_params yParams[8]; +perlin_params xParams[16]; + +for ( s32 z = 0; z < Dim.z; ++ z) +{ + f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); + f32 WorldZBiased = zCoord - zMin; + + v3 InteriorPeriod = Period; + RangeIterator_t(u32, OctaveIndex, Octaves) + { + zParams[OctaveIndex] = ComputePerlinParameters(F32_8X(zCoord/InteriorPeriod.z), PrimeZ); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } + + for ( s32 y = 0; y < Dim.y; ++ y) + { + f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); + + InteriorPeriod = Period; + RangeIterator_t(u32, OctaveIndex, Octaves) + { + yParams[OctaveIndex] = ComputePerlinParameters(F32_8X(yCoord/InteriorPeriod.y), PrimeY); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } + + for ( s32 x = 0; x < Dim.x; x += 16 ) + { + s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); + + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + + r32 InteriorAmp = r32(Amplitude); + f32 xCoords[16]; + u32 ParamsIndex = 0; + InteriorPeriod = Period; + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + RangeIterator(ValueIndex, 16) + { + xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; + } + auto Index = 0; + auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); + auto _x1 = F32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); + xParams[ParamsIndex++] = ComputePerlinParameters(_x0, PrimeX); + xParams[ParamsIndex++] = ComputePerlinParameters(_x1, PrimeX); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } + + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + f32 TmpPerlinResults[16]; + PerlinNoise_16x_avx2(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, TmpPerlinResults); + RangeIterator(ValueIndex, 16) + { + NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; + } + + InteriorAmp = Max(1.f, InteriorAmp/2.f); + } + + + + u16 OccupancyByte = 0; + RangeIterator(ValueIndex, 16) + { + s32 ThisIndex = VoxIndex+ValueIndex; + s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; + ChunkSum += u32(NoiseChoice); + + OccupancyByte |= (NoiseChoice << ValueIndex); + Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + } + SetOccupancyByte(Chunk, VoxIndex, u8(OccupancyByte)); + SetOccupancyByte(Chunk, VoxIndex+8, u8(OccupancyByte>>8)); + } + } +} + +u64 CycleCountEnd = GetCycleCount(); +u64 CyclesElapsed = CycleCountEnd-CycleCountStart; + +engine_debug *ED = GetEngineDebug(); +ED->ChunkGenCyclesElapsed += CyclesElapsed; +ED->CellsGenerated += u64(Volume(Chunk->Dim))*u64(Octaves); From 22a0edae6aec4afdf6fc0cbded3e184949c0a963 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Sep 2024 20:35:59 -0700 Subject: [PATCH 038/421] 8.85 cycles/cell --- ...ern_16x_102235355_126003659_545884473_634032968.h | 12 +++++------- src/engine/terrain.cpp | 3 +++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h b/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h index 949f71e21..ee8a40752 100644 --- a/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h +++ b/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h @@ -11,6 +11,8 @@ auto PrimeZ = U32_8X(1720413743); u64 CycleCountStart = GetCycleCount(); +Assert(u64(NoiseValues) % 32 == 0); + // TODO(Jesse): Make this dynamic Assert(Octaves < 8); perlin_params zParams[8]; @@ -59,6 +61,8 @@ for ( s32 z = 0; z < Dim.z; ++ z) auto Index = 0; auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); auto _x1 = F32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); + /* auto _x0 = F32_8X( xCoords[7], xCoords[6], xCoords[5], xCoords[4], xCoords[3], xCoords[2], xCoords[1], xCoords[0] ); */ + /* auto _x1 = F32_8X( xCoords[15], xCoords[14], xCoords[13], xCoords[12], xCoords[11], xCoords[10], xCoords[9], xCoords[8] ); */ xParams[ParamsIndex++] = ComputePerlinParameters(_x0, PrimeX); xParams[ParamsIndex++] = ComputePerlinParameters(_x1, PrimeX); InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); @@ -66,13 +70,7 @@ for ( s32 z = 0; z < Dim.z; ++ z) for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { - f32 TmpPerlinResults[16]; - PerlinNoise_16x_avx2(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, TmpPerlinResults); - RangeIterator(ValueIndex, 16) - { - NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; - } - + PerlinNoise_16x_avx2(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+VoxIndex, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); } diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index bfae25cda..d4a9d5b73 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -222,6 +222,9 @@ Terrain_FBM2D( world_chunk *Chunk, #include #endif + + // 8.85 cycles/cell + #include /* u64 CycleCountEnd = GetCycleCount(); */ From 673114ec295c160372de41336ab2bdf1bcc2451e Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 21 Sep 2024 07:04:03 -0700 Subject: [PATCH 039/421] Add perlin performance test harness --- external/bonsai_stdlib | 2 +- jesse.make.sh | 6 +- make.sh | 27 +++++---- src/engine/terrain.cpp | 1 + src/terrain_iterator.cpp | 123 ++++++++++++++++++++++++++++++++++++++ src/tests/chunk.cpp | 6 +- src/tests/perlin_perf.cpp | 121 +++++++++++++++++++++++++++++++++++++ 7 files changed, 266 insertions(+), 20 deletions(-) create mode 100644 src/terrain_iterator.cpp create mode 100644 src/tests/perlin_perf.cpp diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 541db6a80..5b4b57ce8 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 541db6a802f389049e2a62098fe61583d7233859 +Subproject commit 5b4b57ce8ca0b9f3e76b64aa5898a16b92ef35d0 diff --git a/jesse.make.sh b/jesse.make.sh index ea3da9380..77bbafd79 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -10,15 +10,15 @@ OPT="-O2" # ./make.sh RunTests ./make.sh $OPT \ - BuildSingleExample examples/terrain_gen \ - BuildExecutables \ + BuildTests \ + # BuildSingleExample examples/terrain_gen \ + # BuildExecutables \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ # BuildSingleExample examples/tools/voxel_synthesis_rule_baker \ # BuildSingleExample examples/turn_based \ # BuildSingleExample examples/the_wanderer \ -# BuildTests \ # ./make.sh BundleRelease diff --git a/make.sh b/make.sh index c7d9370c7..684f443bd 100755 --- a/make.sh +++ b/make.sh @@ -350,20 +350,21 @@ function RunPoof } + # $TESTS/chunk.cpp + # $TESTS/ui_command_buffer.cpp + # $TESTS/m4.cpp + # $TESTS/colladaloader.cpp + # $TESTS/test_bitmap.cpp + # $TESTS/bonsai_string.cpp + # $TESTS/objloader.cpp + # $TESTS/callgraph.cpp + # $TESTS/heap_allocation.cpp + # $TESTS/rng.cpp + # $TESTS/file.cpp + # $TESTS/sort.cpp + # $TESTS/containers/block_array.cpp TESTS_TO_BUILD=" - $TESTS/chunk.cpp - $TESTS/ui_command_buffer.cpp - $TESTS/m4.cpp - $TESTS/colladaloader.cpp - $TESTS/test_bitmap.cpp - $TESTS/bonsai_string.cpp - $TESTS/objloader.cpp - $TESTS/callgraph.cpp - $TESTS/heap_allocation.cpp - $TESTS/rng.cpp - $TESTS/file.cpp - $TESTS/sort.cpp - $TESTS/containers/block_array.cpp + $TESTS/perlin_perf.cpp " BuildAll() { diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index d4a9d5b73..e4cce74d5 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -224,6 +224,7 @@ Terrain_FBM2D( world_chunk *Chunk, // 8.85 cycles/cell + // 7.72 cycles/cell #include diff --git a/src/terrain_iterator.cpp b/src/terrain_iterator.cpp new file mode 100644 index 000000000..4a4b63a47 --- /dev/null +++ b/src/terrain_iterator.cpp @@ -0,0 +1,123 @@ +// src/engine/terrain.cpp:168:0 + +// NOTE(Jesse): This must hold true for using any Noise_16x func +Assert(Chunk->Dim % V3i(16) == V3i(0)); + +Period = Max(Period, V3(1.f)); + +auto PrimeX = U32_8X(501125321); +auto PrimeY = U32_8X(1136930381); +auto PrimeZ = U32_8X(1720413743); + +u64 CycleCountStart = GetCycleCount(); + +// TODO(Jesse): Make this dynamic +Assert(Octaves < 8); +perlin_params zParams[16]; +perlin_params yParams[16]; +perlin_params xParams[16]; + +for ( s32 z = 0; z < Dim.z; z += 1) +{ + f32 zCoord0 = COMPUTE_NOISE_INPUT(z, 0, Chunk); + /* f32 zCoord1 = COMPUTE_NOISE_INPUT(z, 1, Chunk); */ + + f32 WorldZBiased0 = zCoord0 - zMin; + /* f32 WorldZBiased1 = zCoord1 - zMin; */ + + u32 ParamsIndex = 0; + v3 InteriorPeriod = Period; + RangeIterator_t(u32, OctaveIndex, Octaves) + { + zParams[ParamsIndex++] = ComputePerlinParameters(F32_8X(zCoord0/InteriorPeriod.z), PrimeZ); + /* zParams[ParamsIndex++] = ComputePerlinParameters(F32_8X(zCoord1/InteriorPeriod.z), PrimeZ); */ + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } + /* Assert(ParamsIndex==16); */ + + for ( s32 y = 0; y < Dim.y; y += 1) + { + f32 yCoord0 = COMPUTE_NOISE_INPUT(y, 0, Chunk); + /* f32 yCoord1 = COMPUTE_NOISE_INPUT(y, 1, Chunk); */ + + ParamsIndex = 0; + InteriorPeriod = Period; + RangeIterator_t(u32, OctaveIndex, Octaves) + { + yParams[ParamsIndex++] = ComputePerlinParameters(F32_8X(yCoord0/InteriorPeriod.y), PrimeY); + /* yParams[ParamsIndex++] = ComputePerlinParameters(F32_8X(yCoord1/InteriorPeriod.y), PrimeY); */ + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } + /* Assert(ParamsIndex==16); */ + + for ( s32 x = 0; x < Dim.x; x += 16 ) + { + v3i VoxP = V3i(x,y,z); + s32 VoxIndex = GetIndex(VoxP, Dim); + + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + + f32 xCoords[16]; + ParamsIndex = 0; + InteriorPeriod = Period; + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + RangeIterator(ValueIndex, 16) + { + xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)); + } + auto Index = 0; + auto xCoord0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); + auto xCoord1 = F32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); + xParams[ParamsIndex++] = ComputePerlinParameters(xCoord0/F32_8X(InteriorPeriod.x), PrimeX); + xParams[ParamsIndex++] = ComputePerlinParameters(xCoord1/F32_8X(InteriorPeriod.x), PrimeX); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } + /* Assert(ParamsIndex==16); */ + + r32 InteriorAmp = r32(Amplitude); + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + f32 TmpPerlinResults[16*2*2]; + PerlinNoise_16x1x1_avx2(xParams+(OctaveIndex*2), yParams+(OctaveIndex*2), zParams, TmpPerlinResults); + + RangeIterator(zIndex, 1) + RangeIterator(yIndex, 1) + RangeIterator(xIndex, 16) + { + s32 TmpIndex = GetIndex(V3i(xIndex, yIndex, zIndex), V3i(16,1,1)); + s32 NoiseIndex = GetIndex(VoxP+V3i(xIndex, yIndex, zIndex), Dim); + NoiseValues[NoiseIndex] += TmpPerlinResults[TmpIndex]*InteriorAmp; + } + + InteriorAmp = Max(1.f, InteriorAmp/2.f); + } + + + RangeIterator(zIndex, 1) + { + /* r32 WorldZBiased = zIndex == 0 ? WorldZBiased0 : WorldZBiased1; */ + r32 WorldZBiased = WorldZBiased0; + RangeIterator(yIndex, 1) + { + RangeIterator(xIndex, 16) + { + s32 ThisIndex = GetIndex(VoxP+V3i(xIndex, yIndex, zIndex), Dim); + s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; + ChunkSum += u32(NoiseChoice); + + SetOccupancyBit(Chunk, ThisIndex, NoiseChoice); + Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + } + } + } + } + } +} + +u64 CycleCountEnd = GetCycleCount(); +u64 CyclesElapsed = CycleCountEnd-CycleCountStart; + +engine_debug *ED = GetEngineDebug(); +ED->ChunkGenCyclesElapsed += CyclesElapsed; +ED->CellsGenerated += u64(Volume(Chunk->Dim)*s32(Octaves)); diff --git a/src/tests/chunk.cpp b/src/tests/chunk.cpp index 1d6f682c5..9fbe8eea0 100644 --- a/src/tests/chunk.cpp +++ b/src/tests/chunk.cpp @@ -19,7 +19,7 @@ TestChunkCopy(memory_arena *Memory) temp_memory_handle TmpMemHandle = BeginTemporaryMemory(Memory); /* world_chunk *SyntheticChunk = AllocateWorldChunk(Memory, SynChunkP, SynChunkDim); */ - world_chunk *DestChunk = AllocateWorldChunk(DestChunkP, DestChunkDim, Memory); + world_chunk *DestChunk = AllocateWorldChunk(DestChunkP, DestChunkDim, V3i(1), Memory); // NOTE(Jesse): This is a hack because this function checks to make sure // it's called from a worker thread. Kinda janky, but worth the jank IMO @@ -55,8 +55,8 @@ TestChunkCopy(memory_arena *Memory) { // Ensure copy works as intended temp_memory_handle TmpMemHandle = BeginTemporaryMemory(Memory); - world_chunk *SyntheticChunk = AllocateWorldChunk(SynChunkP, SynChunkDim, Memory); - world_chunk *DestChunk = AllocateWorldChunk(DestChunkP, DestChunkDim, Memory); + world_chunk *SyntheticChunk = AllocateWorldChunk(SynChunkP, SynChunkDim, V3i(1), Memory); + world_chunk *DestChunk = AllocateWorldChunk(DestChunkP, DestChunkDim, V3i(1), Memory); // @set_chunk_queued_hack SetFlag(SyntheticChunk, Chunk_Queued); diff --git a/src/tests/perlin_perf.cpp b/src/tests/perlin_perf.cpp new file mode 100644 index 000000000..60db75700 --- /dev/null +++ b/src/tests/perlin_perf.cpp @@ -0,0 +1,121 @@ +#include +#include + +s32 +main(s32 ArgCount, const char** Args) +{ + TestSuiteBegin("Perlin Performance", ArgCount, Args); + + memory_arena BootstrapArena = {}; + engine_resources Engine = {}; + Global_EngineResources = &Engine; + Ensure( InitializeBonsaiStdlib( BonsaiInit_Default, + {}, + &Engine.Stdlib, + &BootstrapArena ) ); + + timeBeginPeriod(1); + + s32 PhysicalProcessorIndex = 0; + + s32 ThreadIndex = 0; + SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *RelationshipBuffer = Allocate(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, GetTranArena(), 64); + unsigned long AllocatedSize = sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX)*64; + if (GetLogicalProcessorInformationEx(RelationProcessorCore, RelationshipBuffer, &AllocatedSize)) + { + // Count physical processors + SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *Info = RelationshipBuffer; + for (u32 Offset = 0; Offset < AllocatedSize; Offset += Info->Size) + { + Info = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*)((u8*)RelationshipBuffer + Offset); + Assert(Info->Processor.GroupCount == 1); + if (PhysicalProcessorIndex == ThreadIndex) + { + SetThreadAffinityMask(GetCurrentThread(), Info->Processor.GroupMask->Mask); + } + + PhysicalProcessorIndex++; + } + + Info = RelationshipBuffer; + for (u32 Offset = 0; Offset < AllocatedSize; Offset += Info->Size) + { + Info = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*)((u8*)RelationshipBuffer + Offset); + } + + } + else + { + SoftError("GetLogicalProcessorInformationEx Failed"); + } + + memory_arena *Memory = AllocateArena(Megabytes(32)); + + + v3i Dim = V3i(32); + r32 *NoiseValues = Allocate(r32, Memory, Volume(Dim)); + + auto PrimeX = U32_8X(501125321); + auto PrimeY = U32_8X(1136930381); + auto PrimeZ = U32_8X(1720413743); + + + f32_8x RunningInc = F32_8X(0.f, 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f); + + perlin_params zParams; + perlin_params yParams; + perlin_params xParams[2]; + + u64 CyclesElapsed = 0; + u64 CellsGenerated = 0; + RangeIterator(Index, 4096*32) + { + u64 CycleCountStart = GetCycleCount(); + + u32 DestIndex = 0; + for ( s32 z = 0; z < Dim.z; ++ z) + { + zParams = ComputePerlinParameters(F32_8X(z), PrimeZ); + + for ( s32 y = 0; y < Dim.y; ++ y) + { + yParams = ComputePerlinParameters(F32_8X(y), PrimeY); + + for ( s32 x = 0; x < Dim.x; x += 16 ) + { + u32 ParamsIndex = 0; + auto _x0 = F32_8X(x) + RunningInc; + auto _x1 = F32_8X(x) + RunningInc + RunningInc; + xParams[0] = ComputePerlinParameters(_x0, PrimeX); + xParams[1] = ComputePerlinParameters(_x1, PrimeX); + + PerlinNoise_16x_avx2(xParams, &yParams, &zParams, NoiseValues+DestIndex, 1.f); + DestIndex += 16; + } + } + } + + u64 CycleCountEnd = GetCycleCount(); + u64 Elapsed = CycleCountEnd-CycleCountStart; + + /* SleepMs(1); */ + + CyclesElapsed += Elapsed; + CellsGenerated += u64(Volume(Dim)); + + if (Index % 512 == 0) + { + r64 CyclesPerCell = r64(CyclesElapsed)/r64(CellsGenerated); + printf("CyclesPerCell (%.2f)\n", CyclesPerCell); + } + } + + + /* RangeIterator(Index, 4096) */ + /* { */ + /* PerlinNoise_16x_avx2(); */ + /* PerlinNoise_16x_avx2(perlin_params *perlinX, perlin_params *perlinY, perlin_params *perlinZ, f32 *Dest, f32 Amplitude) */ + /* } */ + + TestSuiteEnd(); +} From 4a375a6aaae810540e4af519d7918668d86940e5 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 21 Sep 2024 13:55:14 -0700 Subject: [PATCH 040/421] 6.6 cycles/cell! --- external/bonsai_debug | 2 +- external/bonsai_stdlib | 2 +- .../do_editor_ui_for_compound_type_debug_state.h | 15 --------------- jesse.make.sh | 4 ++-- src/engine/terrain.cpp | 2 +- 5 files changed, 5 insertions(+), 20 deletions(-) diff --git a/external/bonsai_debug b/external/bonsai_debug index 21a01fb4e..0468de9df 160000 --- a/external/bonsai_debug +++ b/external/bonsai_debug @@ -1 +1 @@ -Subproject commit 21a01fb4e3067a7faf35be994e655a2a2865b123 +Subproject commit 0468de9dffa78892c6777c0d36971c39f59cee59 diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 5b4b57ce8..90047655d 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 5b4b57ce8ca0b9f3e76b64aa5898a16b92ef35d0 +Subproject commit 90047655da5f119d33f360c6fc73addeb0538c0c diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 16031f87c..be330e635 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -280,21 +280,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(bonsai_futex*,&Element->HistogramFutex), - CSz("HistogramFutex"), - Params - ); - - - - - - - - DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/jesse.make.sh b/jesse.make.sh index 77bbafd79..ddb001b50 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,8 +11,8 @@ OPT="-O2" ./make.sh $OPT \ BuildTests \ - # BuildSingleExample examples/terrain_gen \ - # BuildExecutables \ + BuildSingleExample examples/terrain_gen \ + BuildExecutables \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index e4cce74d5..6716a6959 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -36,7 +36,7 @@ Terrain_FBM2D( world_chunk *Chunk, void *NoiseParams, void *OctaveCount ) { - /* HISTOGRAM_FUNCTION(); */ + HISTOGRAM_FUNCTION(); /* TIMED_FUNCTION(); */ UNPACK_NOISE_PARAMS(NoiseParams); From 3b26958a1c70a3f4d462080dd8fdf17121116bb6 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 22 Sep 2024 09:33:03 -0700 Subject: [PATCH 041/421] 7.3 cycles/cell --- examples/terrain_gen/game.cpp | 2 +- external/bonsai_stdlib | 2 +- ..._102235355_126003659_545884473_634032968.h | 27 ++++++++------ src/engine/terrain.cpp | 2 +- src/engine/terrain.h | 2 +- src/engine/world.cpp | 35 +++++++++++-------- 6 files changed, 41 insertions(+), 29 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 10e1dee63..2e7dddd19 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -446,7 +446,7 @@ BONSAI_API_WORKER_THREAD_CALLBACK() v3 Period = V3(1000); s32 Amplititude = 800; - s32 StartingZDepth = -400; + s32 StartingZDepth = 1000; /* u32 Octaves = 1; */ u32 Octaves = 6; diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 90047655d..1e9d84020 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 90047655da5f119d33f360c6fc73addeb0538c0c +Subproject commit 1e9d840203f2534ec94c100c60434630d24715ba diff --git a/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h b/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h index ee8a40752..ef252d2c6 100644 --- a/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h +++ b/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h @@ -9,7 +9,6 @@ auto PrimeX = U32_8X(501125321); auto PrimeY = U32_8X(1136930381); auto PrimeZ = U32_8X(1720413743); -u64 CycleCountStart = GetCycleCount(); Assert(u64(NoiseValues) % 32 == 0); @@ -18,6 +17,9 @@ Assert(Octaves < 8); perlin_params zParams[8]; perlin_params yParams[8]; perlin_params xParams[16]; +f32 xCoords[16]; + +/* u64 CycleCountStart = GetCycleCount(); */ for ( s32 z = 0; z < Dim.z; ++ z) { @@ -44,12 +46,11 @@ for ( s32 z = 0; z < Dim.z; ++ z) for ( s32 x = 0; x < Dim.x; x += 16 ) { - s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); + s32 VoxIndex = GetIndex(x,y,z, Dim); u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); r32 InteriorAmp = r32(Amplitude); - f32 xCoords[16]; u32 ParamsIndex = 0; InteriorPeriod = Period; for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) @@ -61,18 +62,23 @@ for ( s32 z = 0; z < Dim.z; ++ z) auto Index = 0; auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); auto _x1 = F32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); - /* auto _x0 = F32_8X( xCoords[7], xCoords[6], xCoords[5], xCoords[4], xCoords[3], xCoords[2], xCoords[1], xCoords[0] ); */ - /* auto _x1 = F32_8X( xCoords[15], xCoords[14], xCoords[13], xCoords[12], xCoords[11], xCoords[10], xCoords[9], xCoords[8] ); */ xParams[ParamsIndex++] = ComputePerlinParameters(_x0, PrimeX); xParams[ParamsIndex++] = ComputePerlinParameters(_x1, PrimeX); InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } + u64 CycleCountStart = GetCycleCount(); for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { PerlinNoise_16x_avx2(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+VoxIndex, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); } + u64 CycleCountEnd = GetCycleCount(); + u64 CyclesElapsed = CycleCountEnd-CycleCountStart; + + engine_debug *ED = GetEngineDebug(); + ED->ChunkGenCyclesElapsed += CyclesElapsed; + ED->CellsGenerated += u64(16)*u64(Octaves); @@ -91,10 +97,9 @@ for ( s32 z = 0; z < Dim.z; ++ z) } } } +/* u64 CycleCountEnd = GetCycleCount(); */ +/* u64 CyclesElapsed = CycleCountEnd-CycleCountStart; */ -u64 CycleCountEnd = GetCycleCount(); -u64 CyclesElapsed = CycleCountEnd-CycleCountStart; - -engine_debug *ED = GetEngineDebug(); -ED->ChunkGenCyclesElapsed += CyclesElapsed; -ED->CellsGenerated += u64(Volume(Chunk->Dim))*u64(Octaves); +/* engine_debug *ED = GetEngineDebug(); */ +/* ED->ChunkGenCyclesElapsed += CyclesElapsed; */ +/* ED->CellsGenerated += u64(Volume(Chunk->Dim))*u64(Octaves); */ diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 6716a6959..dc95e867a 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -73,7 +73,7 @@ Terrain_FBM2D( world_chunk *Chunk, v3i NoiseDim = Chunk->Dim + 2; v3i NormalDim = Chunk->Dim; r32 *NoiseValues = Allocate(r32, TempArena, Volume(NoiseDim)); - v3 *Normals = Allocate( v3, TempArena, Volume(NormalDim)); + /* v3 *Normals = Allocate( v3, TempArena, Volume(NormalDim)); */ #if VOXEL_DEBUG_COLOR Chunk->NoiseValues = NoiseValues; diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 15dc614a5..4c687b0b2 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -2,7 +2,7 @@ #define MIN_TERRAIN_NOISE_WIDTH (16) -#define COMPUTE_NOISE_INPUT(channel_name, offset, chunk) (chunk->DimInChunks.channel_name/2) + ((f32(offset)+channel_name)*chunk->DimInChunks.channel_name) + (chunk->WorldP.channel_name*WorldChunkDim.channel_name) + SrcToDest.channel_name +#define COMPUTE_NOISE_INPUT(channel_name, offset, chunk) (chunk->DimInChunks.channel_name/2.f) + ((f32(offset)+channel_name)*chunk->DimInChunks.channel_name) + (chunk->WorldP.channel_name*WorldChunkDim.channel_name) poof( diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 7c9dab1d7..2d8e84b72 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -424,7 +424,7 @@ DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats } } -#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (3) +#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (4) link_internal v3i ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) @@ -499,7 +499,7 @@ struct octree_node_priority_queue }; link_internal void -PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_priority_queue *Queue, octree_node *Node) +PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_priority_queue *Queue, octree_node *Node, octree_node *Parent) { Assert(Node->Chunk.Flags == Chunk_Uninitialized); @@ -508,9 +508,16 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio IdealListIndex = (MAX_OCTREE_NODE_BUCKETS-1)-IdealListIndex; + // if (IsInFrustum(World, GameCamera, &Node->Chunk) == False) { - IdealListIndex = MAX_OCTREE_NODE_BUCKETS-1; + IdealListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, IdealListIndex+1);; + } + + // Prefer chunks who have a high chance of having geometry + if (Parent && HasGpuMesh(&Parent->Chunk.Meshes)) + { + IdealListIndex = Max(0, IdealListIndex-1); } if (Remaining(&Queue->Lists[IdealListIndex])) @@ -593,7 +600,7 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) link_internal s32 -SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue *Queue, octree_node *NodeToSplit, memory_arena *Memory) +SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue *Queue, octree_node *NodeToSplit, octree_node *Parent, memory_arena *Memory) { UNPACK_ENGINE_RESOURCES(Engine); @@ -609,7 +616,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue (NodeToSplit->Chunk.Flags & Chunk_VoxelsInitialized) == 0 ) { - PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit); + PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit, Parent); PushedToPriorityQueue = True; } @@ -630,14 +637,14 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue } else { - s32 ChildrenReadyToDraw = SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[0], Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[1], Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[2], Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[3], Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[4], Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[5], Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[6], Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[7], Memory); + s32 ChildrenReadyToDraw = SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[0], NodeToSplit, Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[1], NodeToSplit, Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[2], NodeToSplit, Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[3], NodeToSplit, Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[4], NodeToSplit, Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[5], NodeToSplit, Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[6], NodeToSplit, Memory); + ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[7], NodeToSplit, Memory); /* NodeToSplit->AllChildrenCanDraw = (ChildrenReadyToDraw == 8); */ /* Result = NodeToSplit->AllChildrenCanDraw; */ @@ -833,7 +840,7 @@ MaintainWorldOctree(engine_resources *Engine) Queue.Lists[ListIndex] = OctreeNodePtrCursor(MAX_OCTREE_NODES_QUEUED_PER_FRAME, GetTranArena()); } - SplitOctreeNode_Recursive(Engine, &Queue, &World->Root, &World->OctreeMemory); + SplitOctreeNode_Recursive(Engine, &Queue, &World->Root, 0, &World->OctreeMemory); octree_stats Stats = {}; From b1d6003f5a34b8896696a386c8acb283815b9be9 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 22 Sep 2024 10:23:00 -0700 Subject: [PATCH 042/421] 6.3 cyc/cell --- external/bonsai_stdlib | 2 +- src/engine/world.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 1e9d84020..e2bfc016b 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 1e9d840203f2534ec94c100c60434630d24715ba +Subproject commit e2bfc016bd343b4e4f45eb34df329ac076c5bfa2 diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 2d8e84b72..8fe2a4918 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -424,7 +424,7 @@ DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats } } -#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (4) +#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (3) link_internal v3i ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) From d73872b93ef9affd30d37319dc73e09769e72a28 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 22 Sep 2024 16:41:44 -0700 Subject: [PATCH 043/421] Soft-remove SrcToDest --- src/engine/editor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/editor.h b/src/engine/editor.h index 079ec59d8..363491307 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -645,7 +645,7 @@ struct generic_noise_params v3 Period = Cast(generic_noise_params*, (P))->Period; \ s32 Amplitude = s32(Cast(generic_noise_params*, (P))->Amplitude); \ v3 RGBColor = Cast(generic_noise_params*, (P))->RGBColor; \ - v3i SrcToDest = {-1*Global_ChunkApronMinDim}; + v3i SrcToDest = {} struct white_noise_params From c658fb733483879f3f7dad1cef598b49b6d385bc Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 23 Sep 2024 17:28:17 -0700 Subject: [PATCH 044/421] Update to clang 19; fix a bunch of uninitialized members --- examples/terrain_gen/game.cpp | 2 +- external/bonsai_debug | 2 +- external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/cursor_v3i.h | 10 +- ..._work_queue_entry__bonsai_render_command.h | 2 + .../generate_cursor_debug_profile_scope.h | 10 +- ...generate_cursor_functions_c_token_cursor.h | 10 +- generated/generate_cursor_functions_u64.h | 10 +- generated/generate_cursor_octree_node.h | 10 +- generated/generate_cursor_parser.h | 10 +- generated/generate_cursor_texture.h | 10 +- generated/generate_cursor_u8.h | 10 +- generated/generate_cursor_v3.h | 10 +- .../generate_cursor_voxel_stack_element.h | 10 +- generated/generate_stack_octree_node_ptr_0.h | 9 +- ...thesis_change_propagation_info_803395170.h | 9 +- generated/parse_integer_136174807.h | 2 +- generated/stream_and_cursor_counted_string.h | 10 +- generated/stream_and_cursor_s32.h | 10 +- generated/stream_and_cursor_u32.h | 10 +- ..._102235355_126003659_545884473_634032968.h | 105 --------- generated/to_hex_64_272205387.h | 2 +- jesse.make.sh | 4 +- src/engine/api.cpp | 12 +- src/engine/asset.h | 1 + src/engine/resources.cpp | 3 +- src/engine/terrain.cpp | 213 +++++++----------- src/engine/voxel_synthesis.cpp | 2 + src/engine/world.cpp | 6 +- 32 files changed, 165 insertions(+), 347 deletions(-) delete mode 100644 generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 2e7dddd19..dfaacca8c 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -558,7 +558,7 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* chunk_init_flags InitFlags = ChunkInitFlag_GenMipMapLODs; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( GrassyTerracedTerrain4, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, MeshBit_Lod0, InitFlags, (void*)&OctaveBuf); + /* InitializeChunkWithNoise( GrassyTerracedTerrain4, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, MeshBit_Lod0, InitFlags, (void*)&OctaveBuf); */ } break; diff --git a/external/bonsai_debug b/external/bonsai_debug index 0468de9df..960fa7dcb 160000 --- a/external/bonsai_debug +++ b/external/bonsai_debug @@ -1 +1 @@ -Subproject commit 0468de9dffa78892c6777c0d36971c39f59cee59 +Subproject commit 960fa7dcb8781fe9317a15dc7bf3a2268fda6323 diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index e2bfc016b..1c6b31b99 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit e2bfc016bd343b4e4f45eb34df329ac076c5bfa2 +Subproject commit 1c6b31b9993642f6a6ab2d564ebd0f2143674f66 diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index e317488fb..dd78de6d6 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2311:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2317:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 1fd4730c1..05d6cd6a1 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3279:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3291:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index ac77fec0e..aed826427 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2264:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2270:0 case type_ui_render_command_window_start: { diff --git a/generated/cursor_v3i.h b/generated/cursor_v3i.h index 4396c066b..266a19a1c 100644 --- a/generated/cursor_v3i.h +++ b/generated/cursor_v3i.h @@ -15,12 +15,10 @@ link_internal v3i_cursor V3iCursor(umm ElementCount, memory_arena* Memory) { v3i *Start = (v3i*)PushStruct(Memory, sizeof(v3i)*ElementCount, 1, 0); - v3i_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + v3i_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index 1911280a4..d54737733 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -290,6 +290,8 @@ link_internal bonsai_render_command_deallocate_buffers BonsaiRenderCommandDeallocateBuffers( u32* Buffers , s32 Count ) { bonsai_render_command_deallocate_buffers Reuslt = { + .Buffers = {} +, .Count = Count }; diff --git a/generated/generate_cursor_debug_profile_scope.h b/generated/generate_cursor_debug_profile_scope.h index 77cb3ffc8..102fd71f4 100644 --- a/generated/generate_cursor_debug_profile_scope.h +++ b/generated/generate_cursor_debug_profile_scope.h @@ -15,12 +15,10 @@ link_internal debug_profile_scope_cursor DebugProfileScopeCursor(umm ElementCount, memory_arena* Memory) { debug_profile_scope *Start = (debug_profile_scope*)PushStruct(Memory, sizeof(debug_profile_scope)*ElementCount, 1, 0); - debug_profile_scope_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + debug_profile_scope_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/generate_cursor_functions_c_token_cursor.h b/generated/generate_cursor_functions_c_token_cursor.h index 8107f33e3..f71bf2664 100644 --- a/generated/generate_cursor_functions_c_token_cursor.h +++ b/generated/generate_cursor_functions_c_token_cursor.h @@ -5,12 +5,10 @@ link_internal c_token_cursor CTokenCursor(umm ElementCount, memory_arena* Memory) { c_token *Start = (c_token*)PushStruct(Memory, sizeof(c_token)*ElementCount, 1, 0); - c_token_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + c_token_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/generate_cursor_functions_u64.h b/generated/generate_cursor_functions_u64.h index 150fd8902..495eea4cd 100644 --- a/generated/generate_cursor_functions_u64.h +++ b/generated/generate_cursor_functions_u64.h @@ -5,12 +5,10 @@ link_internal u64_cursor U64Cursor(umm ElementCount, memory_arena* Memory) { u64 *Start = (u64*)PushStruct(Memory, sizeof(u64)*ElementCount, 1, 0); - u64_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + u64_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index 0a2ec02ea..f2c6fe85d 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -15,12 +15,10 @@ link_internal octree_node_ptr_cursor OctreeNodePtrCursor(umm ElementCount, memory_arena* Memory) { octree_node_ptr *Start = (octree_node_ptr*)PushStruct(Memory, sizeof(octree_node_ptr)*ElementCount, 1, 0); - octree_node_ptr_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + octree_node_ptr_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/generate_cursor_parser.h b/generated/generate_cursor_parser.h index 7b24b6b6d..9282fb69e 100644 --- a/generated/generate_cursor_parser.h +++ b/generated/generate_cursor_parser.h @@ -15,12 +15,10 @@ link_internal parser_cursor ParserCursor(umm ElementCount, memory_arena* Memory) { parser *Start = (parser*)PushStruct(Memory, sizeof(parser)*ElementCount, 1, 0); - parser_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + parser_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/generate_cursor_texture.h b/generated/generate_cursor_texture.h index f3f0727b7..c2f45e9eb 100644 --- a/generated/generate_cursor_texture.h +++ b/generated/generate_cursor_texture.h @@ -15,12 +15,10 @@ link_internal texture_cursor TextureCursor(umm ElementCount, memory_arena* Memory) { texture *Start = (texture*)PushStruct(Memory, sizeof(texture)*ElementCount, 1, 0); - texture_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + texture_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/generate_cursor_u8.h b/generated/generate_cursor_u8.h index e06d2fc2e..2fa8aaaab 100644 --- a/generated/generate_cursor_u8.h +++ b/generated/generate_cursor_u8.h @@ -15,12 +15,10 @@ link_internal u8_cursor U8Cursor(umm ElementCount, memory_arena* Memory) { u8 *Start = (u8*)PushStruct(Memory, sizeof(u8)*ElementCount, 1, 0); - u8_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + u8_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/generate_cursor_v3.h b/generated/generate_cursor_v3.h index 3476dd807..2c0a8fa0b 100644 --- a/generated/generate_cursor_v3.h +++ b/generated/generate_cursor_v3.h @@ -15,12 +15,10 @@ link_internal v3_cursor V3Cursor(umm ElementCount, memory_arena* Memory) { v3 *Start = (v3*)PushStruct(Memory, sizeof(v3)*ElementCount, 1, 0); - v3_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + v3_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/generate_cursor_voxel_stack_element.h b/generated/generate_cursor_voxel_stack_element.h index 5471bc13f..d66e55f46 100644 --- a/generated/generate_cursor_voxel_stack_element.h +++ b/generated/generate_cursor_voxel_stack_element.h @@ -15,12 +15,10 @@ link_internal voxel_stack_element_cursor VoxelStackElementCursor(umm ElementCount, memory_arena* Memory) { voxel_stack_element *Start = (voxel_stack_element*)PushStruct(Memory, sizeof(voxel_stack_element)*ElementCount, 1, 0); - voxel_stack_element_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + voxel_stack_element_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index bcc690cc9..eb6ac880f 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -12,11 +12,10 @@ link_internal octree_node_ptr_stack OctreeNodePtrStack(umm ElementCount, memory_arena* Memory) { octree_node_ptr *Start = (octree_node_ptr*)PushStruct(Memory, sizeof(octree_node_ptr)*ElementCount, 1, 0); - octree_node_ptr_stack Result = { - .Start = Start, - .End = ElementCount, - .At = 0, - }; + octree_node_ptr_stack Result = {}; + Result.Start = Start; + Result.End = ElementCount; + Result.At = 0; return Result; } diff --git a/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h b/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h index 74a7ecacb..96a4cfbd8 100644 --- a/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h +++ b/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h @@ -12,11 +12,10 @@ link_internal voxel_synthesis_change_propagation_info_stack VoxelSynthesisChangePropagationInfoStack(umm ElementCount, memory_arena* Memory) { voxel_synthesis_change_propagation_info *Start = (voxel_synthesis_change_propagation_info*)PushStruct(Memory, sizeof(voxel_synthesis_change_propagation_info)*ElementCount, 1, 0); - voxel_synthesis_change_propagation_info_stack Result = { - .Start = Start, - .End = ElementCount, - .At = 0, - }; + voxel_synthesis_change_propagation_info_stack Result = {}; + Result.Start = Start; + Result.End = ElementCount; + Result.At = 0; return Result; } diff --git a/generated/parse_integer_136174807.h b/generated/parse_integer_136174807.h index b13072c4d..dfedf3330 100644 --- a/generated/parse_integer_136174807.h +++ b/generated/parse_integer_136174807.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.h:854:0 +// external/bonsai_stdlib/src/counted_string.h:855:0 link_internal b32 ParseInteger(cs String, u32 *Out) diff --git a/generated/stream_and_cursor_counted_string.h b/generated/stream_and_cursor_counted_string.h index 2ef9d5ec7..4d98cb99e 100644 --- a/generated/stream_and_cursor_counted_string.h +++ b/generated/stream_and_cursor_counted_string.h @@ -15,12 +15,10 @@ link_internal counted_string_cursor CountedStringCursor(umm ElementCount, memory_arena* Memory) { counted_string *Start = (counted_string*)PushStruct(Memory, sizeof(counted_string)*ElementCount, 1, 0); - counted_string_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + counted_string_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/stream_and_cursor_s32.h b/generated/stream_and_cursor_s32.h index 010b70c98..eabe5cf7c 100644 --- a/generated/stream_and_cursor_s32.h +++ b/generated/stream_and_cursor_s32.h @@ -15,12 +15,10 @@ link_internal s32_cursor S32Cursor(umm ElementCount, memory_arena* Memory) { s32 *Start = (s32*)PushStruct(Memory, sizeof(s32)*ElementCount, 1, 0); - s32_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + s32_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/stream_and_cursor_u32.h b/generated/stream_and_cursor_u32.h index c0fe40b6e..0302adb66 100644 --- a/generated/stream_and_cursor_u32.h +++ b/generated/stream_and_cursor_u32.h @@ -15,12 +15,10 @@ link_internal u32_cursor U32Cursor(umm ElementCount, memory_arena* Memory) { u32 *Start = (u32*)PushStruct(Memory, sizeof(u32)*ElementCount, 1, 0); - u32_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - /* OWNED_BY_THREAD_MEMBER_INIT() */ - }; + u32_cursor Result = {}; + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; return Result; } diff --git a/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h b/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h deleted file mode 100644 index ef252d2c6..000000000 --- a/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_634032968.h +++ /dev/null @@ -1,105 +0,0 @@ -// src/engine/terrain.cpp:168:0 - -// NOTE(Jesse): This must hold true for using any Noise_16x func -Assert(Chunk->Dim % V3i(16) == V3i(0)); - -Period = Max(Period, V3(1.f)); - -auto PrimeX = U32_8X(501125321); -auto PrimeY = U32_8X(1136930381); -auto PrimeZ = U32_8X(1720413743); - - -Assert(u64(NoiseValues) % 32 == 0); - -// TODO(Jesse): Make this dynamic -Assert(Octaves < 8); -perlin_params zParams[8]; -perlin_params yParams[8]; -perlin_params xParams[16]; -f32 xCoords[16]; - -/* u64 CycleCountStart = GetCycleCount(); */ - -for ( s32 z = 0; z < Dim.z; ++ z) -{ - f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); - f32 WorldZBiased = zCoord - zMin; - - v3 InteriorPeriod = Period; - RangeIterator_t(u32, OctaveIndex, Octaves) - { - zParams[OctaveIndex] = ComputePerlinParameters(F32_8X(zCoord/InteriorPeriod.z), PrimeZ); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); - } - - for ( s32 y = 0; y < Dim.y; ++ y) - { - f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); - - InteriorPeriod = Period; - RangeIterator_t(u32, OctaveIndex, Octaves) - { - yParams[OctaveIndex] = ComputePerlinParameters(F32_8X(yCoord/InteriorPeriod.y), PrimeY); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); - } - - for ( s32 x = 0; x < Dim.x; x += 16 ) - { - s32 VoxIndex = GetIndex(x,y,z, Dim); - - u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); - - r32 InteriorAmp = r32(Amplitude); - u32 ParamsIndex = 0; - InteriorPeriod = Period; - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) - { - RangeIterator(ValueIndex, 16) - { - xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; - } - auto Index = 0; - auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); - auto _x1 = F32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); - xParams[ParamsIndex++] = ComputePerlinParameters(_x0, PrimeX); - xParams[ParamsIndex++] = ComputePerlinParameters(_x1, PrimeX); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); - } - - u64 CycleCountStart = GetCycleCount(); - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) - { - PerlinNoise_16x_avx2(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+VoxIndex, InteriorAmp); - InteriorAmp = Max(1.f, InteriorAmp/2.f); - } - u64 CycleCountEnd = GetCycleCount(); - u64 CyclesElapsed = CycleCountEnd-CycleCountStart; - - engine_debug *ED = GetEngineDebug(); - ED->ChunkGenCyclesElapsed += CyclesElapsed; - ED->CellsGenerated += u64(16)*u64(Octaves); - - - - u16 OccupancyByte = 0; - RangeIterator(ValueIndex, 16) - { - s32 ThisIndex = VoxIndex+ValueIndex; - s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; - ChunkSum += u32(NoiseChoice); - - OccupancyByte |= (NoiseChoice << ValueIndex); - Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); - } - SetOccupancyByte(Chunk, VoxIndex, u8(OccupancyByte)); - SetOccupancyByte(Chunk, VoxIndex+8, u8(OccupancyByte>>8)); - } - } -} -/* u64 CycleCountEnd = GetCycleCount(); */ -/* u64 CyclesElapsed = CycleCountEnd-CycleCountStart; */ - -/* engine_debug *ED = GetEngineDebug(); */ -/* ED->ChunkGenCyclesElapsed += CyclesElapsed; */ -/* ED->CellsGenerated += u64(Volume(Chunk->Dim))*u64(Octaves); */ diff --git a/generated/to_hex_64_272205387.h b/generated/to_hex_64_272205387.h index ca340352f..15a05c9c5 100644 --- a/generated/to_hex_64_272205387.h +++ b/generated/to_hex_64_272205387.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:822:0 +// external/bonsai_stdlib/src/counted_string.cpp:825:0 link_internal cs ToHex( s64 Value ) diff --git a/jesse.make.sh b/jesse.make.sh index ddb001b50..790ce1d41 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -10,9 +10,9 @@ OPT="-O2" # ./make.sh RunTests ./make.sh $OPT \ - BuildTests \ BuildSingleExample examples/terrain_gen \ - BuildExecutables \ + # BuildTests \ + # BuildExecutables \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 939f60709..b44b65b5e 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -469,7 +469,8 @@ Bonsai_Render(engine_resources *Engine) .Type = ShaderUniform_U32, .U32 = &Global_False, .ID = INVALID_SHADER_UNIFORM, - .Name = "DrawMinorGrid" + .Name = "DrawMinorGrid", + .Next = 0, }; shader_uniform MajorGridUniform = @@ -477,7 +478,8 @@ Bonsai_Render(engine_resources *Engine) .Type = ShaderUniform_U32, .U32 = &Global_False, .ID = INVALID_SHADER_UNIFORM, - .Name = "DrawMajorGrid" + .Name = "DrawMajorGrid", + .Next = 0, }; @@ -499,7 +501,11 @@ Bonsai_Render(engine_resources *Engine) { layout DefaultLayout = {}; DefaultLayout.DrawBounds = InvertedInfinityRectangle(); - render_state RenderState = { .Layout = &DefaultLayout, .ClipRect = DISABLE_CLIPPING }; + + render_state RenderState = {}; + RenderState.Layout = &DefaultLayout; + RenderState.ClipRect = DISABLE_CLIPPING; + SetWindowZDepths(Ui->CommandBuffer); FlushCommandBuffer(Ui, &RenderState, Ui->CommandBuffer, &DefaultLayout); } diff --git a/src/engine/asset.h b/src/engine/asset.h index c687e3851..e9ac1bc68 100644 --- a/src/engine/asset.h +++ b/src/engine/asset.h @@ -263,6 +263,7 @@ GetChunkDataForAssetModel(asset *Asset, u32 ModelIndex) .Flags = Asset->Chunk.Flags, .Dim = Asset->Chunk.Dim, .Voxels = Asset->Chunk.Voxels, + .Occupancy = Asset->Chunk.Occupancy, .VoxelLighting = Asset->Chunk.VoxelLighting, }; } break; diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 52ad9fd51..564415217 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -403,7 +403,8 @@ RenderThread_Main(void *ThreadStartupParams) memory_arena *UiMemory = AllocateArena(); InitRenderer2D(&Engine->Ui, &Engine->Heap, UiMemory, &Plat->MouseP, &Plat->MouseDP, &Plat->ScreenDim, &Plat->Input); - bitmap_block_array Bitmaps = { .Memory = GetTranArena() }; + bitmap_block_array Bitmaps = {}; + Bitmaps.Memory = GetTranArena(); LoadBitmapsFromFolderOrdered(CSz("assets/mystic_rpg_icon_pack/Sprites/300%/64x64_sprites"), &Bitmaps, GetTranArena(), GetTranArena()); LoadBitmapsFromFolderOrdered(CSz("assets/mystic_rpg_icon_pack/Sprites/300%/44x44_sprites"), &Bitmaps, GetTranArena(), GetTranArena()); Engine->Ui.SpriteTextureArray = CreateTextureArrayFromBitmapBlockArray(&Bitmaps, V2i(64,64)); diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index dc95e867a..8a9f85c49 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -84,165 +84,102 @@ Terrain_FBM2D( world_chunk *Chunk, u32 Octaves = *(u32*)OctaveCount; + // NOTE(Jesse): This must hold true for using any Noise_16x func + Assert(Chunk->Dim % V3i(16) == V3i(0)); - /* r64 NoiseTimeStart = GetHighPrecisionClock(); */ - /* u64 CycleCountStart = GetCycleCount(); */ - -#if 0 - poof( - terrain_iteration_pattern({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, - { - v3 IPeriod = Period; // Interior Period - s32 InteriorAmp = Amplitude; - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) - { - NoiseValue += PerlinNoise(NoiseInput/IPeriod) * InteriorAmp; + Period = Max(Period, V3(1.f)); - InteriorAmp = Max(1, InteriorAmp/2); - IPeriod = Max(V3(1.f), IPeriod/2); - } + auto PrimeX = U32_8X(501125321); + auto PrimeY = U32_8X(1136930381); + auto PrimeZ = U32_8X(1720413743); - u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); - } - )) -#include -#endif -#if 0 - poof( - terrain_iteration_pattern_8x({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, - { - u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); - { - /* HISTOGRAM_FUNCTION(); */ + Assert(u64(NoiseValues) % 32 == 0); - v3 InteriorPeriod = Period; - r32 InteriorAmp = r32(Amplitude); - f32 xCoords[MIN_TERRAIN_NOISE_WIDTH]; - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) - { - Assert(Chunk->DimInChunks > V3i(0)); + // TODO(Jesse): Make this dynamic + Assert(Octaves < 8); + perlin_params zParams[8]; + perlin_params yParams[8]; + perlin_params xParams[16]; + f32 xCoords[16]; - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) - { - xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; - } + for ( s32 z = 0; z < Dim.z; ++ z) + { + f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); + f32 WorldZBiased = zCoord - zMin; - f32 yIn = yCoord/InteriorPeriod.y; - f32 zIn = zCoord/InteriorPeriod.z; - - // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues - f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; - - // best 102.7 million points/sec - // best 26.15 cycles/cell - /* PerlinNoise_8x_sse(xCoords, yIn, zIn, TmpPerlinResults); */ - - // - // best 143 million points/sec - // best 157 million points/sec - // best 199 million points/sec - // - // best 18.75 cycles/cell - // best 17.11 cycles/cell - // best 13.51 cycles/cell - // - // targ 9-10 cycles/cell - PerlinNoise_8x_avx2(xCoords, yIn, zIn, TmpPerlinResults); - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) - { - NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; - } + v3 InteriorPeriod = Period; + RangeIterator_t(u32, OctaveIndex, Octaves) + { + zParams[OctaveIndex] = ComputePerlinParameters(F32_8X(zCoord/InteriorPeriod.z), PrimeZ); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } - InteriorAmp = Max(1.f, InteriorAmp/2.f); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); - } + for ( s32 y = 0; y < Dim.y; ++ y) + { + f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); - } + InteriorPeriod = Period; + RangeIterator_t(u32, OctaveIndex, Octaves) + { + yParams[OctaveIndex] = ComputePerlinParameters(F32_8X(yCoord/InteriorPeriod.y), PrimeY); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - )) -#include -#endif -#if 0 - poof( - terrain_iteration_pattern_16x({NoiseInput}, {NoiseValue}, {PackedHSVColorValue}, + + for ( s32 x = 0; x < Dim.x; x += 16 ) { + s32 VoxIndex = GetIndex(x,y,z, Dim); + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + r32 InteriorAmp = r32(Amplitude); + u32 ParamsIndex = 0; + InteriorPeriod = Period; + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { - /* HISTOGRAM_FUNCTION(); */ - - v3 InteriorPeriod = Period; - r32 InteriorAmp = r32(Amplitude); - f32 xCoords[16]; - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + RangeIterator(ValueIndex, 16) { - Assert(Chunk->DimInChunks > V3i(0)); - - RangeIterator(ValueIndex, 16) - { - xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; - } - - f32 yIn = yCoord/InteriorPeriod.y; - f32 zIn = zCoord/InteriorPeriod.z; - - // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues - f32 TmpPerlinResults[16]; - - // best 102.7 million points/sec - // best 26.15 cycles/cell - /* PerlinNoise_8x_sse(xCoords, yIn, zIn, TmpPerlinResults); */ - - // - // best 143 million points/sec - // best 157 million points/sec - // best 199 million points/sec - // - // best 18.75 cycles/cell - // best 17.11 cycles/cell - // best 13.51 cycles/cell - // - // targ 9-10 cycles/cell - PerlinNoise_16x_avx2(xCoords, yIn, zIn, TmpPerlinResults); - - - RangeIterator(ValueIndex, 16) - { - NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; - } - - InteriorAmp = Max(1.f, InteriorAmp/2.f); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; } - + auto Index = 0; + auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); + auto _x1 = F32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); + xParams[ParamsIndex++] = ComputePerlinParameters(_x0, PrimeX); + xParams[ParamsIndex++] = ComputePerlinParameters(_x1, PrimeX); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - } - )) -#include -#endif - - - // 8.85 cycles/cell - // 7.72 cycles/cell -#include - - /* u64 CycleCountEnd = GetCycleCount(); */ - /* r64 NoiseTimeEnd = GetHighPrecisionClock(); */ + u64 CycleCountStart = GetCycleCount(); + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + PerlinNoise_16x_avx2(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+VoxIndex, InteriorAmp); + InteriorAmp = Max(1.f, InteriorAmp/2.f); + } +# + u64 CycleCountEnd = GetCycleCount(); + u64 CyclesElapsed = CycleCountEnd-CycleCountStart; - /* u64 CyclesElapsed = CycleCountEnd-CycleCountStart; */ - /* r64 NoiseTimeElapsed = NoiseTimeEnd-NoiseTimeStart; */ + engine_debug *ED = GetEngineDebug(); + ED->ChunkGenCyclesElapsed += CyclesElapsed; + ED->CellsGenerated += u64(16)*u64(Octaves); - /* engine_debug *ED = GetEngineDebug(); */ - /* ED->ChunkGenCyclesElapsed += CyclesElapsed; */ - /* ED->ChunkGenTimeElapsedMS += NoiseTimeElapsed; */ - /* ED->CellsGenerated += u64(Volume(Chunk->Dim)) * Octaves; */ + - /* PushHistogramDataPoint(); */ + u16 OccupancyByte = 0; + RangeIterator(ValueIndex, 16) + { + s32 ThisIndex = VoxIndex+ValueIndex; + s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; + ChunkSum += u32(NoiseChoice); - /* s64 ChunkWorldZThresh = SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z) - zMin; */ - /* ComputeNormalsForChunkFromNoiseValues(ChunkWorldZThresh, NoiseValues, NoiseDim, Normals, NormalDim); */ + OccupancyByte |= (NoiseChoice << ValueIndex); + Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + } + SetOccupancyByte(Chunk, VoxIndex, u8(OccupancyByte)); + SetOccupancyByte(Chunk, VoxIndex+8, u8(OccupancyByte>>8)); + } + } + } return ChunkSum; } @@ -1883,6 +1820,7 @@ MakeCliffs_8x(world_chunk *Chunk, s32 NormalsIndex, s32 WorldX, s32 WorldY, s32 #endif } +#if 0 link_internal u32 GrassyTerracedTerrain4( world_chunk *Chunk, v3i NoiseBasis, @@ -2218,6 +2156,7 @@ GrassyTerracedTerrain4( world_chunk *Chunk, return ChunkSum; } +#endif link_internal u32 GrassyTerracedTerrain( world_chunk *Chunk, diff --git a/src/engine/voxel_synthesis.cpp b/src/engine/voxel_synthesis.cpp index 2bb8b0d44..ff3eb79e2 100644 --- a/src/engine/voxel_synthesis.cpp +++ b/src/engine/voxel_synthesis.cpp @@ -219,10 +219,12 @@ BakeVoxelSynthesisRules(const char* InputVox) voxel_synthesis_result Result = { + .Errors = {}, .VoxData = Vox, .Tiles = AllTiles, .Rules = Rules, .MaxTileEntropy = MaxTileEntropy, + .TileSuperpositionsDim = {}, }; #if 1 diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 8fe2a4918..cc852caf3 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -508,16 +508,16 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio IdealListIndex = (MAX_OCTREE_NODE_BUCKETS-1)-IdealListIndex; - // + // Penalize nodes not in the frustum if (IsInFrustum(World, GameCamera, &Node->Chunk) == False) { - IdealListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, IdealListIndex+1);; + IdealListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, IdealListIndex+3); } // Prefer chunks who have a high chance of having geometry if (Parent && HasGpuMesh(&Parent->Chunk.Meshes)) { - IdealListIndex = Max(0, IdealListIndex-1); + IdealListIndex = Max(0, IdealListIndex-3); } if (Remaining(&Queue->Lists[IdealListIndex])) From 88919516fbb1cb04932737125305d3b25d5d8d6e Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 25 Sep 2024 06:38:43 -0700 Subject: [PATCH 045/421] WIP optimize noise generation by sparsely computing it --- ..._editor_ui_for_compound_type_debug_state.h | 15 +++ generated/maybe_v3.h | 2 +- generated/maybe_v3i.h | 2 +- jesse.make.sh | 4 +- src/engine/chunk.cpp | 8 +- src/engine/debug.h | 2 +- src/engine/mesh.h | 2 +- src/engine/render/render_init.cpp | 2 +- src/engine/terrain.cpp | 101 +++++++++++++----- src/engine/world.cpp | 4 +- src/engine/world_chunk.cpp | 92 ++++++++-------- 11 files changed, 148 insertions(+), 86 deletions(-) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index be330e635..16031f87c 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -280,6 +280,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bonsai_futex*,&Element->HistogramFutex), + CSz("HistogramFutex"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/maybe_v3.h b/generated/maybe_v3.h index db4e42731..fdd40342b 100644 --- a/generated/maybe_v3.h +++ b/generated/maybe_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1132:0 +// external/bonsai_stdlib/src/vector.h:1145:0 struct maybe_v3 { diff --git a/generated/maybe_v3i.h b/generated/maybe_v3i.h index a086427cd..d802e31fe 100644 --- a/generated/maybe_v3i.h +++ b/generated/maybe_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1134:0 +// external/bonsai_stdlib/src/vector.h:1147:0 struct maybe_v3i { diff --git a/jesse.make.sh b/jesse.make.sh index 790ce1d41..60fb9ef2e 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,8 +11,8 @@ OPT="-O2" ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ - # BuildTests \ - # BuildExecutables \ + BuildTests \ + BuildExecutables \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ diff --git a/src/engine/chunk.cpp b/src/engine/chunk.cpp index 5e81a9618..a6045ad25 100644 --- a/src/engine/chunk.cpp +++ b/src/engine/chunk.cpp @@ -37,18 +37,16 @@ IsFilledInChunk( world_chunk *Chunk, voxel_position VoxelP, chunk_dimension Dim) } inline b32 -NotFilled(u8 *Occupancy, u32 Index) +NotFilled(u8 *Occupancy, s32 Index) { - b32 Result = {}; - NotImplemented; + b32 Result = b32(GetOccupancyBit(Occupancy, Index)) == 0; return Result; } inline b32 NotFilled(u8 *Occupancy, v3i P, v3i Dim) { - b32 Result = {}; - NotImplemented; + b32 Result = b32(GetOccupancyBit(Occupancy, GetIndex(P, Dim))) == 0; return Result; } diff --git a/src/engine/debug.h b/src/engine/debug.h index fa35d5379..459e17313 100644 --- a/src/engine/debug.h +++ b/src/engine/debug.h @@ -58,7 +58,7 @@ struct engine_debug b8 TriggerRuntimeBreak; b8 ResetAssetNodeView; - b8 DrawBranchNodesWithMeshes = 1; + b8 DrawBranchNodesWithMeshes; b8 DrawBranchNodes; b8 DrawLeafNodes; b8 DrawQueuedNodes = 1; diff --git a/src/engine/mesh.h b/src/engine/mesh.h index e1767ce64..a44b860ac 100644 --- a/src/engine/mesh.h +++ b/src/engine/mesh.h @@ -21,7 +21,7 @@ struct mesh_freelist #define TIERED_MESH_FREELIST_MAX_ELEMENTS (128) #define WORLD_CHUNK_MESH_MIN_SIZE (2048) -#define ELEMENTS_PER_TEMP_MESH (WORLD_CHUNK_MESH_MIN_SIZE*TIERED_MESH_FREELIST_MAX_ELEMENTS) +#define ELEMENTS_PER_TEMP_MESH (32*WORLD_CHUNK_MESH_MIN_SIZE*TIERED_MESH_FREELIST_MAX_ELEMENTS) poof( staticbuffer(mesh_freelist, {TIERED_MESH_FREELIST_MAX_ELEMENTS}, {tiered_mesh_freelist}) ) #include diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 87d0c7169..d6175f61c 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -575,7 +575,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Result->Settings.BravoilMyersOIT = True; Result->Settings.BravoilMcGuireOIT = True; - Result->Settings.UseShadowMapping = True; + /* Result->Settings.UseShadowMapping = True; */ Result->Settings.UseLightingBloom = True; Result->Settings.DrawMajorGrid = True; diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 8a9f85c49..3a3c14374 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -70,9 +70,16 @@ Terrain_FBM2D( world_chunk *Chunk, memory_arena *TempArena = GetTranArena(); #endif - v3i NoiseDim = Chunk->Dim + 2; - v3i NormalDim = Chunk->Dim; + v3i NoiseDim = RoundUp(Chunk->Dim/2, V3i(16)); // + 2; + // NOTE(Jesse): This must hold true for using any Noise_16x func + Assert(NoiseDim % V3i(16) == V3i(0)); + + // NOTE(Jesse): Must be true to use _mm256_store_ps, which we do in the 16x version of perlin + + /* v3i NoiseDim = Chunk->Dim + 2; */ r32 *NoiseValues = Allocate(r32, TempArena, Volume(NoiseDim)); + Assert(u64(NoiseValues) % 32 == 0); + /* v3i NormalDim = Chunk->Dim; */ /* v3 *Normals = Allocate( v3, TempArena, Volume(NormalDim)); */ #if VOXEL_DEBUG_COLOR @@ -84,8 +91,6 @@ Terrain_FBM2D( world_chunk *Chunk, u32 Octaves = *(u32*)OctaveCount; - // NOTE(Jesse): This must hold true for using any Noise_16x func - Assert(Chunk->Dim % V3i(16) == V3i(0)); Period = Max(Period, V3(1.f)); @@ -93,8 +98,8 @@ Terrain_FBM2D( world_chunk *Chunk, auto PrimeY = U32_8X(1136930381); auto PrimeZ = U32_8X(1720413743); + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); - Assert(u64(NoiseValues) % 32 == 0); // TODO(Jesse): Make this dynamic Assert(Octaves < 8); @@ -103,9 +108,15 @@ Terrain_FBM2D( world_chunk *Chunk, perlin_params xParams[16]; f32 xCoords[16]; - for ( s32 z = 0; z < Dim.z; ++ z) +#define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ + f32(basis_chunk_point.channel*WorldChunkDim.channel) \ + + f32(offset)*Chunk->DimInChunks.channel \ + + SrcToDest.channel \ + + v3i Basis = Chunk->WorldP; + for ( s32 z = 0; z < NoiseDim.z; ++ z) { - f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); + f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, z*2, Chunk->DimInChunks); f32 WorldZBiased = zCoord - zMin; v3 InteriorPeriod = Period; @@ -115,9 +126,9 @@ Terrain_FBM2D( world_chunk *Chunk, InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - for ( s32 y = 0; y < Dim.y; ++ y) + for ( s32 y = 0; y < NoiseDim.y; ++ y) { - f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); + f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, y*2, Chunk->DimInChunks); InteriorPeriod = Period; RangeIterator_t(u32, OctaveIndex, Octaves) @@ -126,11 +137,9 @@ Terrain_FBM2D( world_chunk *Chunk, InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - for ( s32 x = 0; x < Dim.x; x += 16 ) + for ( s32 x = 0; x < NoiseDim.x; x += 16 ) { - s32 VoxIndex = GetIndex(x,y,z, Dim); - - u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + s32 NoiseIndex = GetIndex(x,y,z, NoiseDim); r32 InteriorAmp = r32(Amplitude); u32 ParamsIndex = 0; @@ -139,7 +148,7 @@ Terrain_FBM2D( world_chunk *Chunk, { RangeIterator(ValueIndex, 16) { - xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; + xCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(x, Basis, (x+ValueIndex)*2, Chunk->DimInChunks)) / InteriorPeriod.x; } auto Index = 0; auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); @@ -152,35 +161,73 @@ Terrain_FBM2D( world_chunk *Chunk, u64 CycleCountStart = GetCycleCount(); for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { - PerlinNoise_16x_avx2(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+VoxIndex, InteriorAmp); + PerlinNoise_16x_avx2(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); } -# u64 CycleCountEnd = GetCycleCount(); u64 CyclesElapsed = CycleCountEnd-CycleCountStart; engine_debug *ED = GetEngineDebug(); ED->ChunkGenCyclesElapsed += CyclesElapsed; - ED->CellsGenerated += u64(16)*u64(Octaves); + ED->CellsGenerated += u64(16*Octaves); + } + } + } - + for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) + { + f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, zChunk, Chunk->DimInChunks); + f32 WorldZBiased = zCoord - zMin; + for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) + { + for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) + { + v3i ChunkP = V3i(xChunk, yChunk, zChunk); + v3i NoiseP = V3i(xChunk, yChunk, zChunk)/2; - u16 OccupancyByte = 0; - RangeIterator(ValueIndex, 16) + s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); + s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); + +#if 0 + f32 zNoiseV[2]; + f32 yNoiseV[2]; + f32 xNoiseV[2]; + xNoiseV[0] = yNoiseV[0] = zNoiseV[0] = xNoiseV[1] = yNoiseV[1] = zNoiseV[1] = NoiseValues[NoiseIndex]; + + s32 xNoiseIndex = TryGetIndex(NoiseP.x+1, NoiseP.y, NoiseP.z, NoiseDim); + s32 yNoiseIndex = TryGetIndex(NoiseP.x, NoiseP.y+1, NoiseP.z, NoiseDim); + s32 zNoiseIndex = TryGetIndex(NoiseP.x, NoiseP.y, NoiseP.z+1, NoiseDim); + + if (xNoiseIndex > -1) { - s32 ThisIndex = VoxIndex+ValueIndex; - s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; - ChunkSum += u32(NoiseChoice); + xNoiseV[1] = NoiseValues[xNoiseIndex]; + } - OccupancyByte |= (NoiseChoice << ValueIndex); - Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + if (yNoiseIndex > -1) + { + yNoiseV[1] = NoiseValues[yNoiseIndex]; } - SetOccupancyByte(Chunk, VoxIndex, u8(OccupancyByte)); - SetOccupancyByte(Chunk, VoxIndex+8, u8(OccupancyByte>>8)); + + if (zNoiseIndex > -1) + { + zNoiseV[1] = NoiseValues[zNoiseIndex]; + } + + r32 ThisNoiseV = (NoiseValues[NoiseIndex] + (Lerp(0.5f, xNoiseV[0], xNoiseV[1]) + Lerp(0.5f, yNoiseV[0], yNoiseV[1]) + Lerp(0.5f, zNoiseV[0], zNoiseV[1])) / 3.f)/2.f; +#else + r32 ThisNoiseV = NoiseValues[NoiseIndex]; +#endif + s32 NoiseChoice = ThisNoiseV > WorldZBiased; + ChunkSum += u32(NoiseChoice); + SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); + Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); } } } + + + return ChunkSum; } diff --git a/src/engine/world.cpp b/src/engine/world.cpp index cc852caf3..2cae3d264 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -511,10 +511,10 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio // Penalize nodes not in the frustum if (IsInFrustum(World, GameCamera, &Node->Chunk) == False) { - IdealListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, IdealListIndex+3); + IdealListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, IdealListIndex+5); } - // Prefer chunks who have a high chance of having geometry + // Prefer chunks who have a higher chance of having geometry if (Parent && HasGpuMesh(&Parent->Chunk.Meshes)) { IdealListIndex = Max(0, IdealListIndex-3); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index af29a99bd..3ecf1ad0d 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3414,73 +3414,75 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, NoiseParams, UserData ); - Assert(SyntheticChunk->Dim == SynChunkDim); + // If the chunk didn't have any voxels filled, we're done + if (SyntheticChunkSum) + { + Assert(SyntheticChunk->Dim == SynChunkDim); #if 1 && VOXEL_DEBUG_COLOR - DestChunk->NoiseValues = SyntheticChunk->NoiseValues; - DestChunk->NormalValues = SyntheticChunk->NormalValues; - if (DestChunk->NoiseValues) - { - for ( s32 z = 0; z < SyntheticChunk->Dim.z; ++ z) + DestChunk->NoiseValues = SyntheticChunk->NoiseValues; + DestChunk->NormalValues = SyntheticChunk->NormalValues; + if (DestChunk->NoiseValues) { - for ( s32 y = 0; y < SyntheticChunk->Dim.y; ++ y) + for ( s32 z = 0; z < SyntheticChunk->Dim.z; ++ z) { - for ( s32 x = 0; x < SyntheticChunk->Dim.x; ++ x) + for ( s32 y = 0; y < SyntheticChunk->Dim.y; ++ y) { - s32 NormalIndex = GetIndex(V3i(x,y,z), SyntheticChunk->Dim); - s32 NoiseIndex = GetIndex(V3i(x,y,z)+1, SyntheticChunk->Dim+2); - SyntheticChunk->Voxels[NormalIndex].DebugColor = SyntheticChunk->NormalValues[NormalIndex]; - SyntheticChunk->Voxels[NormalIndex].DebugNoiseValue = SyntheticChunk->NoiseValues[NoiseIndex]; + for ( s32 x = 0; x < SyntheticChunk->Dim.x; ++ x) + { + s32 NormalIndex = GetIndex(V3i(x,y,z), SyntheticChunk->Dim); + s32 NoiseIndex = GetIndex(V3i(x,y,z)+1, SyntheticChunk->Dim+2); + SyntheticChunk->Voxels[NormalIndex].DebugColor = SyntheticChunk->NormalValues[NormalIndex]; + SyntheticChunk->Voxels[NormalIndex].DebugNoiseValue = SyntheticChunk->NoiseValues[NoiseIndex]; + } } } } - } #endif - if (MakeExteriorFaces) - { - MarkBoundaryVoxels_MakeExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->Voxels, SynChunkDim, Global_ChunkApronMinDim, SynChunkDim-Global_ChunkApronMaxDim); - } - else - { - MarkBoundaryVoxels_NoExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->Voxels, SynChunkDim, {}, SynChunkDim); - } + /* MakeExteriorFaces = True; */ + if (MakeExteriorFaces) + { + MarkBoundaryVoxels_MakeExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->Voxels, SynChunkDim, Global_ChunkApronMinDim, SynChunkDim-Global_ChunkApronMaxDim); + } + else + { + MarkBoundaryVoxels_NoExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->Voxels, SynChunkDim, {}, SynChunkDim); + } - CopyChunkOffset(SyntheticChunk, SynChunkDim, DestChunk, DestChunk->Dim, Global_ChunkApronMinDim); + CopyChunkOffset(SyntheticChunk, SynChunkDim, DestChunk, DestChunk->Dim, Global_ChunkApronMinDim); - // NOTE(Jesse): You can use this for debug, but it doesn't work if you change it to NoExteriorFaces - /* MarkBoundaryVoxels_MakeExteriorFaces(DestChunk->Voxels, DestChunk->Dim, {}, DestChunk->Dim); */ + // NOTE(Jesse): You can use this for debug, but it doesn't work if you change it to NoExteriorFaces + /* MarkBoundaryVoxels_MakeExteriorFaces(DestChunk->Voxels, DestChunk->Dim, {}, DestChunk->Dim); */ - /* FullBarrier; */ + /* FullBarrier; */ - // NOTE(Jesse): The DestChunk is finalized at the end of the routine - /* SetFlag(DestChunk, Chunk_VoxelsInitialized); */ - FinalizeChunkInitialization(SyntheticChunk); + // NOTE(Jesse): The DestChunk is finalized at the end of the routine + /* SetFlag(DestChunk, Chunk_VoxelsInitialized); */ + FinalizeChunkInitialization(SyntheticChunk); - if (Flags & ChunkInitFlag_ComputeStandingSpots) - { - ComputeStandingSpots( SynChunkDim, SyntheticChunk, {{1,1,0}}, {{0,0,1}}, Global_StandingSpotDim, - DestChunk->Dim, 0, &DestChunk->StandingSpots, - Thread->TempMemory); - } + if (Flags & ChunkInitFlag_ComputeStandingSpots) + { + ComputeStandingSpots( SynChunkDim, SyntheticChunk, {{1,1,0}}, {{0,0,1}}, Global_StandingSpotDim, + DestChunk->Dim, 0, &DestChunk->StandingSpots, + Thread->TempMemory); + } #if 0 - if (SyntheticChunkSum && (Flags & ChunkInitFlag_GenSmoothLODs) ) - { - untextured_3d_geometry_buffer *TempMesh = AllocateTempWorldChunkMesh(Thread->TempMemory); - ComputeLodMesh( Thread, DestChunk, DestChunk->Dim, SyntheticChunk, SynChunkDim, TempMesh, True); - - if (TempMesh->At) + if (SyntheticChunkSum && (Flags & ChunkInitFlag_GenSmoothLODs) ) { - LodMesh = GetPermMeshForChunk(&EngineResources->MeshFreelist, TempMesh, Thread->PermMemory); - DeepCopy(TempMesh, LodMesh); + untextured_3d_geometry_buffer *TempMesh = AllocateTempWorldChunkMesh(Thread->TempMemory); + ComputeLodMesh( Thread, DestChunk, DestChunk->Dim, SyntheticChunk, SynChunkDim, TempMesh, True); + + if (TempMesh->At) + { + LodMesh = GetPermMeshForChunk(&EngineResources->MeshFreelist, TempMesh, Thread->PermMemory); + DeepCopy(TempMesh, LodMesh); + } } - } #endif - if (SyntheticChunkSum) - { geo_u3d *TempMesh = AllocateTempMesh(Thread->TempMemory, DataType_v3_u8); RebuildWorldChunkMesh(Thread, SyntheticChunk, Global_ChunkApronMinDim, Global_ChunkApronMinDim+DestChunk->Dim, MeshBit_Lod0, TempMesh, Thread->TempMemory); From 24b768ad17461d170fe3cab3698d914a7443d950 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 25 Sep 2024 10:17:23 -0700 Subject: [PATCH 046/421] WIP hacking --- external/bonsai_debug | 2 +- external/bonsai_stdlib | 2 +- src/engine/mesh.h | 2 +- src/engine/render/render_init.cpp | 2 +- src/engine/world_chunk.cpp | 22 +++++++++++----------- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/external/bonsai_debug b/external/bonsai_debug index 960fa7dcb..5a27ffc78 160000 --- a/external/bonsai_debug +++ b/external/bonsai_debug @@ -1 +1 @@ -Subproject commit 960fa7dcb8781fe9317a15dc7bf3a2268fda6323 +Subproject commit 5a27ffc7874e330d1e8e6b120331bee43fa560c6 diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 1c6b31b99..1ad8f24af 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 1c6b31b9993642f6a6ab2d564ebd0f2143674f66 +Subproject commit 1ad8f24af1830dc5a90a86b1f00d018063cd0803 diff --git a/src/engine/mesh.h b/src/engine/mesh.h index a44b860ac..e1767ce64 100644 --- a/src/engine/mesh.h +++ b/src/engine/mesh.h @@ -21,7 +21,7 @@ struct mesh_freelist #define TIERED_MESH_FREELIST_MAX_ELEMENTS (128) #define WORLD_CHUNK_MESH_MIN_SIZE (2048) -#define ELEMENTS_PER_TEMP_MESH (32*WORLD_CHUNK_MESH_MIN_SIZE*TIERED_MESH_FREELIST_MAX_ELEMENTS) +#define ELEMENTS_PER_TEMP_MESH (WORLD_CHUNK_MESH_MIN_SIZE*TIERED_MESH_FREELIST_MAX_ELEMENTS) poof( staticbuffer(mesh_freelist, {TIERED_MESH_FREELIST_MAX_ELEMENTS}, {tiered_mesh_freelist}) ) #include diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index d6175f61c..e4fa3d342 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -578,7 +578,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr /* Result->Settings.UseShadowMapping = True; */ Result->Settings.UseLightingBloom = True; - Result->Settings.DrawMajorGrid = True; + /* Result->Settings.DrawMajorGrid = True; */ Result->Settings.DrawMinorGrid = True; Result->Settings.MajorGridDim = 8.f; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 3ecf1ad0d..92a999d21 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -850,7 +850,8 @@ MarkBoundaryVoxels_NoExteriorFaces( u8 *Occupancy, v3i InnerDim = MaxDim-MinDim; - s32 MaxIndex = Volume(SrcChunkDim); + Assert(MinDim == V3i(0)); + Assert(MaxDim % V3i(8) == V3i(0)); s32 Result = 0; for ( s32 z = MinDim.z; z < MaxDim.z ; ++z ) @@ -878,38 +879,37 @@ MarkBoundaryVoxels_NoExteriorFaces( u8 *Occupancy, s32 FrontIndex = TryGetIndex(SrcP + V3i(0, 1, 0), SrcChunkDim); s32 BackIndex = TryGetIndex(SrcP - V3i(0, 1, 0), SrcChunkDim); - if ( RightIndex >= 0 && RightIndex < MaxIndex ) + /* RightFaces = (Bits >> 1) & (~Bits); */ + /* LeftFaces = (Bits << 1) & (~Bits); */ + + if ( RightIndex >= 0 ) { voxel *NextVoxel = Voxels + RightIndex; - /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ if ( GetOccupancyBit(Occupancy, RightIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) { Voxel->Flags |= Voxel_RightFace; } } - if ( LeftIndex >= 0 && LeftIndex < MaxIndex ) + if ( LeftIndex >= 0 ) { voxel *NextVoxel = Voxels + LeftIndex; - /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ if ( GetOccupancyBit(Occupancy, LeftIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) { Voxel->Flags |= Voxel_LeftFace; } } - if ( TopIndex >= 0 && TopIndex < MaxIndex ) + if ( TopIndex >= 0 ) { voxel *NextVoxel = Voxels + TopIndex; - /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ if ( GetOccupancyBit(Occupancy, TopIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) { Voxel->Flags |= Voxel_TopFace; } } - if ( BottomIndex >= 0 && BottomIndex < MaxIndex ) + if ( BottomIndex >= 0 ) { voxel *NextVoxel = Voxels + BottomIndex; - /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ if ( GetOccupancyBit(Occupancy, BottomIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) { Voxel->Flags |= Voxel_BottomFace; @@ -917,7 +917,7 @@ MarkBoundaryVoxels_NoExteriorFaces( u8 *Occupancy, } - if ( FrontIndex >= 0 && FrontIndex < MaxIndex ) + if ( FrontIndex >= 0 ) { voxel *NextVoxel = Voxels + FrontIndex; /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ @@ -926,7 +926,7 @@ MarkBoundaryVoxels_NoExteriorFaces( u8 *Occupancy, Voxel->Flags |= Voxel_FrontFace; } } - if ( BackIndex >= 0 && BackIndex < MaxIndex ) + if ( BackIndex >= 0 ) { voxel *NextVoxel = Voxels + BackIndex; /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ From 5c56b7d80f5e31914fb56ddb76a8a33d967901f2 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 26 Sep 2024 15:14:53 -0700 Subject: [PATCH 047/421] Binary meshing nominally working --- examples/terrain_gen/game.cpp | 86 ++- examples/terrain_gen/game_constants.h | 4 +- examples/terrain_gen/game_types.h | 2 + generated/block_array_entity_ptr_688856411.h | 2 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 18 +- .../do_editor_ui_for_compound_type_voxel.h | 16 - ..._editor_ui_for_compound_type_world_chunk.h | 18 +- ...on_pattern_199741702_161749140_632272777.h | 16 +- ..._iteration_pattern_275071431_101859599_0.h | 14 +- ..._iteration_pattern_275071431_785723886_0.h | 14 +- ..._iteration_pattern_846291950_267608728_0.h | 14 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + generated/gen_constructor_voxel_lighting.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- ...e_string_table_world_chunk_mesh_bitfield.h | 2 +- ...rate_string_table_world_chunk_mesh_index.h | 2 +- ...ent_buffer_untextured_3d_geometry_buffer.h | 2 +- generated/maybe_chunk_data.h | 2 +- generated/maybe_standing_spot.h | 2 +- ...group_for_bitfield_enum_terrain_gen_type.h | 3 +- .../rectalinear_iteration_pattern_398799212.h | 7 +- .../rectalinear_iteration_pattern_416827956.h | 5 +- .../rectalinear_iteration_pattern_428632106.h | 5 +- .../rectalinear_iteration_pattern_530902269.h | 8 +- .../rectalinear_iteration_pattern_583358156.h | 5 +- .../rectalinear_iteration_pattern_631222419.h | 7 +- .../rectalinear_iteration_pattern_643608995.h | 7 +- .../rectalinear_iteration_pattern_812652930.h | 5 +- .../rectalinear_iteration_pattern_920026661.h | 8 +- .../rectalinear_iteration_pattern_992879728.h | 5 +- .../rectalinear_iteration_pattern_99934950.h | 5 +- generated/serdes_struct_voxel.h | 14 - generated/serdes_struct_world_chunk.h | 30 +- ...string_and_value_tables_terrain_gen_type.h | 5 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 310 +++++++---- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 310 +++++++---- jesse.make.sh | 2 +- make.sh | 8 +- readme.md | 5 + src/engine/asset.h | 1 + src/engine/bonsai.h | 64 --- src/engine/chunk.cpp | 9 +- src/engine/debug.cpp | 2 +- src/engine/editor.cpp | 8 +- src/engine/render.cpp | 3 + src/engine/terrain.cpp | 50 +- src/engine/terrain.h | 2 +- src/engine/voxel.cpp | 16 +- src/engine/voxel.h | 8 +- src/engine/voxel_synthesis.cpp | 5 +- src/engine/work_queue.h | 2 +- src/engine/world.cpp | 5 +- src/engine/world_chunk.cpp | 496 +++++++++++------- src/engine/world_chunk.h | 43 +- src/engine/world_update.cpp | 56 +- 64 files changed, 1078 insertions(+), 681 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index dfaacca8c..6fd90208c 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -5,6 +5,38 @@ #include "game_constants.h" #include "game_types.h" +link_internal u32 +Terrain_Debug( world_chunk *Chunk, + v3i NoiseBasis, + void *NoiseParams, + void *UserData ) +{ + UNPACK_NOISE_PARAMS(NoiseParams); + + u32 Result = 0; + + auto AbsX = Abs(Chunk->WorldP.x); + auto AbsY = Abs(Chunk->WorldP.y); + + for ( s32 z = 0; z < Dim.z; ++ z) + { + for ( s32 y = 0; y < Dim.y; ++ y) + { + for ( s32 x = 0; x < Dim.x; ++ x) + { + if (x == 2 && y == 2 && z == 2) + { + s32 Index = GetIndex(Voxel_Position(x,y,z), Dim); + SetOccupancyBit(Chunk, Index, VoxelOccupancy_Filled); + Chunk->Voxels[Index].Color = RGBtoPackedHSV(RGBColor); + ++Result; + } + } + } + } + + return Result;; +} link_internal u32 Terrain_Checkerboard( world_chunk *Chunk, v3i NoiseBasis, @@ -71,7 +103,8 @@ GrassyIslandTerrain( world_chunk *Chunk, { s64 WorldX = x - SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + NotImplemented; + /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ /* Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); */ r32 NoiseValue = 0.f; @@ -230,7 +263,8 @@ GrassyIslandTerrain( world_chunk *Chunk, Chunk->Voxels[VoxIndex].Transparency = ThisTransparency; ChunkSum += NoiseChoice; - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); + NotImplemented; + /* Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); */ } } } @@ -266,7 +300,8 @@ WarpedTerrain( world_chunk *Chunk, { s64 WorldX = x - SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + NotImplemented; + /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ r32 NoiseValue = 0.f; for (u32 OctaveIndex = 0; OctaveIndex < OctaveCount; ++OctaveIndex) @@ -318,7 +353,8 @@ WarpedTerrain( world_chunk *Chunk, Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor)*u16(NoiseChoice); ChunkSum += NoiseChoice; - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); + NotImplemented; + /* Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); */ } } } @@ -352,7 +388,8 @@ BONSAI_API_WORKER_THREAD_CALLBACK() { // NOTE(Jesse): This is an optimization; the engine marks chunks that // have moved outside of the visible region as garbage. - Chunk->Flags = Chunk_Uninitialized; + NotImplemented; + /* Chunk->Flags = Chunk_Uninitialized; */ } else { @@ -363,6 +400,15 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* Info("%S", ToString(GenType)); */ switch (GenType) { + case TerrainGenType_Debug: + { + // Flat Params + v3 Period = {}; + s32 Amplititude = {}; + s32 StartingZDepth = {}; + v3 Color = RGB_GRASS_GREEN; + InitializeChunkWithNoise( Terrain_Debug, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, Ignored, ChunkInitFlag_Noop, 0); + } break; case TerrainGenType_Flat: { // Flat Params @@ -376,11 +422,11 @@ BONSAI_API_WORKER_THREAD_CALLBACK() case TerrainGenType_SinCos: { // Bumpy Sin(x)+Cos(y) noise. Useful for visualizing the polylines/splines mapping noise values to their final values. - v3 Period = V3(100); - s32 Amplititude = 250; + v3 Period = V3(20); + s32 Amplititude = 70; /* s32 Period = 100; */ /* s32 Amplititude = 2500; */ - s32 StartingZDepth = -1; + s32 StartingZDepth = 15; chunk_init_flags InitFlags = ChunkInitFlag_Noop; v3 Color = RGB_GRASS_GREEN; InitializeChunkWithNoise( Terrain_SinCos, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, Ignored, InitFlags, 0); @@ -439,16 +485,17 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* s32 StartingZDepth = 0; */ /* u32 Octaves = 7; */ - /* v3 Period = V3(125); */ - /* s32 Amplititude = 125; */ - /* s32 StartingZDepth = 0; */ - /* u32 Octaves = 1; */ + v3 Period = V3(125); + s32 Amplititude = 125; + s32 StartingZDepth = 0; + u32 Octaves = 1; - v3 Period = V3(1000); - s32 Amplititude = 800; - s32 StartingZDepth = 1000; - /* u32 Octaves = 1; */ - u32 Octaves = 6; + /* v3 Period = V3(1000); */ + /* s32 Amplititude = 800; */ + /* /1* s32 StartingZDepth = 1000; *1/ */ + /* s32 StartingZDepth = 0; */ + /* /1* u32 Octaves = 1; *1/ */ + /* u32 Octaves = 6; */ /* v3 Period = V3(2500); */ /* s32 Amplititude = 1500; */ @@ -716,9 +763,10 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* GameState->TerrainGenType = TerrainGenType_GrassyTerracedTerrain; */ - /* GameState->TerrainGenType = TerrainGenType_SinCos; */ + /* GameState->TerrainGenType = TerrainGenType_Debug; */ + GameState->TerrainGenType = TerrainGenType_SinCos; /* GameState->TerrainGenType = TerrainGenType_TerracedTerrain; */ - GameState->TerrainGenType = TerrainGenType_FBM2D; + /* GameState->TerrainGenType = TerrainGenType_FBM2D; */ /* GameState->TerrainGenType = TerrainGenType_GrassyTerracedTerrain4; */ /* GameState->TerrainGenType = TerrainGenType_Voronoi; */ /* World->Center = V3i(-22, 101, 1); */ diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 206122b90..7193ebbdd 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -12,13 +12,15 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ // 26km /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ -g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km +/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ +g_VisibleRegion = Chunk_Dimension(4, 4, 4); +/* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ diff --git a/examples/terrain_gen/game_types.h b/examples/terrain_gen/game_types.h index 0b44c0fea..b59764956 100644 --- a/examples/terrain_gen/game_types.h +++ b/examples/terrain_gen/game_types.h @@ -18,6 +18,8 @@ enum terrain_gen_type TerrainGenType_GrassyIsland = (1 << 13), TerrainGenType_Hoodoo = (1 << 14), TerrainGenType_Warped = (1 << 15), + + TerrainGenType_Debug = (1 << 16), }; poof(radio_button_group_for_bitfield_enum(terrain_gen_type)) diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h index 5d65c86ff..c6a1d1512 100644 --- a/generated/block_array_entity_ptr_688856411.h +++ b/generated/block_array_entity_ptr_688856411.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:327:0 +// src/engine/world_chunk.h:305:0 struct entity_ptr_block { diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index 1e8d1ffb1..2a459dc7b 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:466:0 +// src/engine/world_chunk.h:445:0 struct world_chunk_ptr_block { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 7b19384d1..a13878e3b 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:507:0 +// src/engine/world_chunk.h:486:0 struct standing_spot_block { diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 29b2939db..ab71211e4 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:534:0 +// src/engine/world_chunk.h:513:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index f97560ba2..e90975cdf 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:463:0 +// src/engine/world_chunk.h:442:0 struct world_chunk_ptr_buffer { diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 545084dea..b341112ed 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -59,7 +59,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u8*, Element->Occupancy), + Cast(u64*, Element->Occupancy), CSz("Occupancy"), Params ); @@ -70,6 +70,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, Element->FaceMasks), + CSz("FaceMasks"), + Params + ); + + + + + + + PushNewRow(Ui); DoEditorUi(Ui, diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index d5d41a24b..109896139 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -26,22 +26,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u8*,&Element->Flags), - CSz("Flags"), - Params - ); - - - - - - - - PushNewRow(Ui); - DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 5edca7f3a..b47f3bb64 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -74,7 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u8*, Element->Occupancy), + Cast(u64*, Element->Occupancy), CSz("Occupancy"), Params ); @@ -85,6 +85,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, Element->FaceMasks), + CSz("FaceMasks"), + Params + ); + + + + + + + PushNewRow(Ui); DoEditorUi(Ui, diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index 7f5f6de12..bcc631d30 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:559:0 +// src/engine/world_update.cpp:568:0 random_series ColorEntropy = {4654376543246}; @@ -31,7 +31,8 @@ while (AtElements(&Stack)) /* if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&Voxel_Filled) == 0) */ { - if ( (V->Flags & Voxel_MarkBit) == 0) + NotImplemented; + /* if ( (V->Flags & Voxel_MarkBit) == 0) */ { Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); @@ -45,10 +46,11 @@ while (AtElements(&Stack)) NotImplemented; /* if ( Length(CenterToVoxP) < SquareRoot(RadiusSquared)-1.f && (V->Flags&Voxel_Filled) ) */ - { V->Flags = Voxel_Empty; } + /* { V->Flags = Voxel_Empty; } */ - V->Flags |= Voxel_MarkBit; + NotImplemented; + /* V->Flags |= Voxel_MarkBit; */ if ( ((OverwriteVoxel == True) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True)) ) @@ -97,7 +99,8 @@ while (AtElements(&Stack)) } - if ( (V->Flags&Voxel_MarkBit)) + NotImplemented; + /* if ( (V->Flags&Voxel_MarkBit)) */ { Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); @@ -107,7 +110,8 @@ while (AtElements(&Stack)) Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegZ)); } - V->Flags &= ~Voxel_MarkBit; + NotImplemented; + /* V->Flags &= ~Voxel_MarkBit; */ } } } diff --git a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h index cd3c65c32..4b8b46bf3 100644 --- a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:813:0 +// src/engine/world_update.cpp:823:0 random_series ColorEntropy = {4654376543246}; @@ -33,7 +33,8 @@ while (AtElements(&Stack)) /* if (Contains(SSRect, SimVoxP) && (V->Flags&Voxel_Filled) == 0) */ { - if ( (V->Flags & Voxel_MarkBit) == 0) + NotImplemented; + /* if ( (V->Flags & Voxel_MarkBit) == 0) */ { Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); @@ -49,7 +50,8 @@ while (AtElements(&Stack)) /* if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { *V = {}; } */ - V->Flags |= Voxel_MarkBit; + NotImplemented; + /* V->Flags |= Voxel_MarkBit; */ if ( ((OverwriteVoxel == True) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True)) ) @@ -83,7 +85,8 @@ while (AtElements(&Stack)) - if ( (V->Flags&Voxel_MarkBit)) + NotImplemented; + /* if ( (V->Flags&Voxel_MarkBit)) */ { Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); @@ -93,7 +96,8 @@ while (AtElements(&Stack)) Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegZ)); } - V->Flags &= ~Voxel_MarkBit; + NotImplemented; + /* V->Flags &= ~Voxel_MarkBit; */ } } } diff --git a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h index 169444b81..fb6005d28 100644 --- a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:795:0 +// src/engine/world_update.cpp:805:0 random_series ColorEntropy = {4654376543246}; @@ -33,7 +33,8 @@ while (AtElements(&Stack)) /* if ((V->Flags&Voxel_Filled)) */ { - if ( (V->Flags & Voxel_MarkBit) == 0) + NotImplemented; + /* if ( (V->Flags & Voxel_MarkBit) == 0) */ { Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); @@ -49,7 +50,8 @@ while (AtElements(&Stack)) /* if ( ((V->Flags&Voxel_Filled) == 0) && NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { *V = *NewVoxelValue; } */ - V->Flags |= Voxel_MarkBit; + NotImplemented; + /* V->Flags |= Voxel_MarkBit; */ if ( ((OverwriteVoxel == True) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True)) ) @@ -83,7 +85,8 @@ while (AtElements(&Stack)) - if ( (V->Flags&Voxel_MarkBit)) + NotImplemented; + /* if ( (V->Flags&Voxel_MarkBit)) */ { Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); @@ -93,7 +96,8 @@ while (AtElements(&Stack)) Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegZ)); } - V->Flags &= ~Voxel_MarkBit; + NotImplemented; + /* V->Flags &= ~Voxel_MarkBit; */ } } } diff --git a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h index c2d1e135c..d87d3e768 100644 --- a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h +++ b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:668:0 +// src/engine/world_update.cpp:678:0 random_series ColorEntropy = {4654376543246}; @@ -31,7 +31,8 @@ while (AtElements(&Stack)) /* { if ( (V->Flags&Voxel_Filled) == (Voxel_Filled*(Mode==WorldEdit_Mode_Attach)) ) }, */ { - if ( (V->Flags & Voxel_MarkBit) == 0) + NotImplemented; + /* if ( (V->Flags & Voxel_MarkBit) == 0) */ { Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); @@ -52,7 +53,8 @@ while (AtElements(&Stack)) } - V->Flags |= Voxel_MarkBit; + NotImplemented; + /* V->Flags |= Voxel_MarkBit; */ if ( ((OverwriteVoxel == True) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True)) ) @@ -86,7 +88,8 @@ while (AtElements(&Stack)) - if ( (V->Flags&Voxel_MarkBit)) + NotImplemented; + /* if ( (V->Flags&Voxel_MarkBit)) */ { Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); @@ -96,7 +99,8 @@ while (AtElements(&Stack)) Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegZ)); } - V->Flags &= ~Voxel_MarkBit; + NotImplemented; + /* V->Flags &= ~Voxel_MarkBit; */ } } } diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 2182496ec..1ff1da8af 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -644,6 +644,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 6874a2486..d431884d8 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -634,6 +634,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index e4e1b4f11..8af862c88 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -634,6 +634,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/generated/gen_constructor_voxel_lighting.h b/generated/gen_constructor_voxel_lighting.h index f9c7390b4..54c5e7f76 100644 --- a/generated/gen_constructor_voxel_lighting.h +++ b/generated/gen_constructor_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:133:0 +// src/engine/world_chunk.h:127:0 link_internal voxel_lighting VoxelLighting( u8 Emission ) diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index f2c6fe85d..b48b2a94d 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.cpp:491:0 +// src/engine/world.cpp:492:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 38adfeb90..7a55dd24b 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:540:0 +// src/engine/world_chunk.h:519:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index e16e91de0..2113b0ac2 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2814:0 +// src/engine/world_chunk.cpp:2902:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index cc59f1217..6485449be 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:537:0 +// src/engine/world_chunk.h:516:0 struct standing_spot_stream_chunk { diff --git a/generated/generate_string_table_world_chunk_mesh_bitfield.h b/generated/generate_string_table_world_chunk_mesh_bitfield.h index d16b8c2fd..7a67efaf2 100644 --- a/generated/generate_string_table_world_chunk_mesh_bitfield.h +++ b/generated/generate_string_table_world_chunk_mesh_bitfield.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:236:0 +// src/engine/world_chunk.h:214:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_bitfield Type) diff --git a/generated/generate_string_table_world_chunk_mesh_index.h b/generated/generate_string_table_world_chunk_mesh_index.h index 03c37a280..116473af9 100644 --- a/generated/generate_string_table_world_chunk_mesh_index.h +++ b/generated/generate_string_table_world_chunk_mesh_index.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:239:0 +// src/engine/world_chunk.h:217:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_index Type) diff --git a/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h b/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h index 149231e39..e9302c3d2 100644 --- a/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h +++ b/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/render.cpp:1040:0 +// src/engine/render.cpp:1043:0 link_internal void diff --git a/generated/maybe_chunk_data.h b/generated/maybe_chunk_data.h index ad2999db4..e470bac98 100644 --- a/generated/maybe_chunk_data.h +++ b/generated/maybe_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:200:0 +// src/engine/world_chunk.h:178:0 struct maybe_chunk_data { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 4f5d5db08..a20f38eba 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:504:0 +// src/engine/world_chunk.h:483:0 struct maybe_standing_spot { diff --git a/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h b/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h index 50c8db321..d7e0beeab 100644 --- a/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h +++ b/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h @@ -1,4 +1,4 @@ -// examples/terrain_gen/game_types.h:23:0 +// examples/terrain_gen/game_types.h:25:0 link_internal ui_toggle_button_group RadioButtonGroup_terrain_gen_type( renderer_2d *Ui, @@ -26,6 +26,7 @@ RadioButtonGroup_terrain_gen_type( renderer_2d *Ui, { CSz("GrassyIsland"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyIsland")), TerrainGenType_GrassyIsland }, { CSz("Hoodoo"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Hoodoo")), TerrainGenType_Hoodoo }, { CSz("Warped"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Warped")), TerrainGenType_Warped }, + { CSz("Debug"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Debug")), TerrainGenType_Debug }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/rectalinear_iteration_pattern_398799212.h b/generated/rectalinear_iteration_pattern_398799212.h index db048a2fe..76568b889 100644 --- a/generated/rectalinear_iteration_pattern_398799212.h +++ b/generated/rectalinear_iteration_pattern_398799212.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:518:0 +// src/engine/world_update.cpp:526:0 DimIterator(x, y, z, UpdateDim) { @@ -17,7 +17,7 @@ DimIterator(x, y, z, UpdateDim) /* if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&Voxel_Filled) == False) */ { b32 IsUnfilledBorder = False; - poof_check_for_unfilled_border() + poof_check_for_unfilled_border(); /* Assert(NewVoxelValue->Flags & Voxel_Filled); */ if (IsUnfilledBorder) { @@ -42,7 +42,8 @@ DimIterator(x, y, z, UpdateDim) // Knock out face flags so the 'surface' algorithm doesn't "self-apply" // We recompute these, so it's fine there. It's slower on non-surface // paths, but .. when that's the bottleneck, we've won. - V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); + NotImplemented; + /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ } } } diff --git a/generated/rectalinear_iteration_pattern_416827956.h b/generated/rectalinear_iteration_pattern_416827956.h index 60b20ee8b..1cfc68d51 100644 --- a/generated/rectalinear_iteration_pattern_416827956.h +++ b/generated/rectalinear_iteration_pattern_416827956.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:699:0 +// src/engine/world_update.cpp:709:0 DimIterator(x, y, z, UpdateDim) { @@ -30,7 +30,8 @@ DimIterator(x, y, z, UpdateDim) // Knock out face flags so the 'surface' algorithm doesn't "self-apply" // We recompute these, so it's fine there. It's slower on non-surface // paths, but .. when that's the bottleneck, we've won. - V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); + NotImplemented; + /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ } } } diff --git a/generated/rectalinear_iteration_pattern_428632106.h b/generated/rectalinear_iteration_pattern_428632106.h index ff8253639..b29383cf5 100644 --- a/generated/rectalinear_iteration_pattern_428632106.h +++ b/generated/rectalinear_iteration_pattern_428632106.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:858:0 +// src/engine/world_update.cpp:868:0 DimIterator(x, y, z, UpdateDim) { @@ -38,7 +38,8 @@ DimIterator(x, y, z, UpdateDim) // Knock out face flags so the 'surface' algorithm doesn't "self-apply" // We recompute these, so it's fine there. It's slower on non-surface // paths, but .. when that's the bottleneck, we've won. - V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); + NotImplemented; + /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ } } } diff --git a/generated/rectalinear_iteration_pattern_530902269.h b/generated/rectalinear_iteration_pattern_530902269.h index 93d5642b7..e6ac6755b 100644 --- a/generated/rectalinear_iteration_pattern_530902269.h +++ b/generated/rectalinear_iteration_pattern_530902269.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:643:0 +// src/engine/world_update.cpp:652:0 DimIterator(x, y, z, UpdateDim) { @@ -11,7 +11,8 @@ DimIterator(x, y, z, UpdateDim) if (Contains(SSRect, SimVoxP)) { - if ( (V->Flags&VoxelFaceMask)) + NotImplemented; + /* if ( (V->Flags&VoxelFaceMask)) */ { OverwriteVoxel = True; } @@ -33,7 +34,8 @@ DimIterator(x, y, z, UpdateDim) // Knock out face flags so the 'surface' algorithm doesn't "self-apply" // We recompute these, so it's fine there. It's slower on non-surface // paths, but .. when that's the bottleneck, we've won. - V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); + NotImplemented; + /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ } } } diff --git a/generated/rectalinear_iteration_pattern_583358156.h b/generated/rectalinear_iteration_pattern_583358156.h index cb420d836..ba6ed39d2 100644 --- a/generated/rectalinear_iteration_pattern_583358156.h +++ b/generated/rectalinear_iteration_pattern_583358156.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:831:0 +// src/engine/world_update.cpp:841:0 DimIterator(x, y, z, UpdateDim) { @@ -33,7 +33,8 @@ DimIterator(x, y, z, UpdateDim) // Knock out face flags so the 'surface' algorithm doesn't "self-apply" // We recompute these, so it's fine there. It's slower on non-surface // paths, but .. when that's the bottleneck, we've won. - V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); + NotImplemented; + /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ } } } diff --git a/generated/rectalinear_iteration_pattern_631222419.h b/generated/rectalinear_iteration_pattern_631222419.h index 6568cda54..4d74e2cba 100644 --- a/generated/rectalinear_iteration_pattern_631222419.h +++ b/generated/rectalinear_iteration_pattern_631222419.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:741:0 +// src/engine/world_update.cpp:751:0 DimIterator(x, y, z, UpdateDim) { @@ -19,7 +19,7 @@ DimIterator(x, y, z, UpdateDim) /* if ((V->Flags&Voxel_Filled)==False) */ { b32 IsUnfilledBorder = False; - poof_check_for_unfilled_border() + poof_check_for_unfilled_border(); if (IsUnfilledBorder) { OverwriteVoxel = True; @@ -43,7 +43,8 @@ DimIterator(x, y, z, UpdateDim) // Knock out face flags so the 'surface' algorithm doesn't "self-apply" // We recompute these, so it's fine there. It's slower on non-surface // paths, but .. when that's the bottleneck, we've won. - V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); + NotImplemented; + /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ } } } diff --git a/generated/rectalinear_iteration_pattern_643608995.h b/generated/rectalinear_iteration_pattern_643608995.h index c50bc5d04..d88dde3fd 100644 --- a/generated/rectalinear_iteration_pattern_643608995.h +++ b/generated/rectalinear_iteration_pattern_643608995.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:622:0 +// src/engine/world_update.cpp:631:0 DimIterator(x, y, z, UpdateDim) { @@ -16,7 +16,7 @@ DimIterator(x, y, z, UpdateDim) /* if ((V->Flags&Voxel_Filled) == False) */ { b32 IsUnfilledBorder = False; - poof_check_for_unfilled_border() + poof_check_for_unfilled_border(); NotImplemented; /* Assert(NewVoxelValue->Flags & Voxel_Filled); */ if (IsUnfilledBorder) @@ -42,7 +42,8 @@ DimIterator(x, y, z, UpdateDim) // Knock out face flags so the 'surface' algorithm doesn't "self-apply" // We recompute these, so it's fine there. It's slower on non-surface // paths, but .. when that's the bottleneck, we've won. - V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); + NotImplemented; + /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ } } } diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index 3e6eca3aa..4ea2eee28 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:594:0 +// src/engine/world_update.cpp:603:0 DimIterator(x, y, z, UpdateDim) { @@ -34,7 +34,8 @@ DimIterator(x, y, z, UpdateDim) // Knock out face flags so the 'surface' algorithm doesn't "self-apply" // We recompute these, so it's fine there. It's slower on non-surface // paths, but .. when that's the bottleneck, we've won. - V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); + NotImplemented; + /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ } } } diff --git a/generated/rectalinear_iteration_pattern_920026661.h b/generated/rectalinear_iteration_pattern_920026661.h index bc6c5a8dc..87929f999 100644 --- a/generated/rectalinear_iteration_pattern_920026661.h +++ b/generated/rectalinear_iteration_pattern_920026661.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:539:0 +// src/engine/world_update.cpp:547:0 DimIterator(x, y, z, UpdateDim) { @@ -12,7 +12,8 @@ DimIterator(x, y, z, UpdateDim) { v3i CenterToVoxP = SimVoxP - EditCenterP; - if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&VoxelFaceMask)) + NotImplemented; + /* if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&VoxelFaceMask)) */ { OverwriteVoxel = True; } @@ -34,7 +35,8 @@ DimIterator(x, y, z, UpdateDim) // Knock out face flags so the 'surface' algorithm doesn't "self-apply" // We recompute these, so it's fine there. It's slower on non-surface // paths, but .. when that's the bottleneck, we've won. - V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); + NotImplemented; + /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ } } } diff --git a/generated/rectalinear_iteration_pattern_992879728.h b/generated/rectalinear_iteration_pattern_992879728.h index 37b67be94..817d5dc80 100644 --- a/generated/rectalinear_iteration_pattern_992879728.h +++ b/generated/rectalinear_iteration_pattern_992879728.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:763:0 +// src/engine/world_update.cpp:773:0 DimIterator(x, y, z, UpdateDim) { @@ -39,7 +39,8 @@ DimIterator(x, y, z, UpdateDim) // Knock out face flags so the 'surface' algorithm doesn't "self-apply" // We recompute these, so it's fine there. It's slower on non-surface // paths, but .. when that's the bottleneck, we've won. - V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); + NotImplemented; + /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ } } } diff --git a/generated/rectalinear_iteration_pattern_99934950.h b/generated/rectalinear_iteration_pattern_99934950.h index 9e3398617..e95f8a12e 100644 --- a/generated/rectalinear_iteration_pattern_99934950.h +++ b/generated/rectalinear_iteration_pattern_99934950.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:707:0 +// src/engine/world_update.cpp:717:0 DimIterator(x, y, z, UpdateDim) { @@ -34,7 +34,8 @@ DimIterator(x, y, z, UpdateDim) // Knock out face flags so the 'surface' algorithm doesn't "self-apply" // We recompute these, so it's fine there. It's slower on non-surface // paths, but .. when that's the bottleneck, we've won. - V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); + NotImplemented; + /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ } } } diff --git a/generated/serdes_struct_voxel.h b/generated/serdes_struct_voxel.h index dd3001f1b..29f5410bd 100644 --- a/generated/serdes_struct_voxel.h +++ b/generated/serdes_struct_voxel.h @@ -34,12 +34,6 @@ Serialize(u8_cursor_block_array *Bytes, voxel *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { voxel *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Flags); - - - - - Result &= Serialize(Bytes, &Element->Transparency); @@ -69,14 +63,6 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, voxel *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Flags, Memory); - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Transparency, Memory); diff --git a/generated/serdes_struct_world_chunk.h b/generated/serdes_struct_world_chunk.h index 71ce75f6e..939647387 100644 --- a/generated/serdes_struct_world_chunk.h +++ b/generated/serdes_struct_world_chunk.h @@ -48,6 +48,11 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) + if (Element->FaceMasks) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } + + + if (Element->Voxels) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } @@ -76,6 +81,10 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) + if (Element->FaceMasks) { Result &= Serialize(Bytes, Element->FaceMasks); } + + + if (Element->Voxels) { Result &= Serialize(Bytes, Element->Voxels, Cast(umm, Volume(Element->Dim)) ); } @@ -140,6 +149,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * + b64 HadFaceMasksPointer = Read_u64(Bytes); + Assert(HadFaceMasksPointer < 2); // Should be 0 or 1 + + + b64 HadVoxelsPointer = Read_u64(Bytes); Assert(HadVoxelsPointer < 2); // Should be 0 or 1 @@ -175,13 +189,27 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * if (Element->Occupancy == 0) { - Element->Occupancy = Allocate(u8, Memory, Count); + Element->Occupancy = Allocate(u64, Memory, Count); } Result &= Deserialize(Bytes, Element->Occupancy, Memory, Count); } + if (HadFaceMasksPointer) + { + umm Count = 1; + + + if (Element->FaceMasks == 0) + { + Element->FaceMasks = Allocate(u64, Memory, Count); + } + + Result &= Deserialize(Bytes, Element->FaceMasks, Memory, Count); + } + + if (HadVoxelsPointer) { umm Count = Cast(umm, Volume(Element->Dim)); diff --git a/generated/string_and_value_tables_terrain_gen_type.h b/generated/string_and_value_tables_terrain_gen_type.h index 6a5222023..7d322281c 100644 --- a/generated/string_and_value_tables_terrain_gen_type.h +++ b/generated/string_and_value_tables_terrain_gen_type.h @@ -1,4 +1,4 @@ -// examples/terrain_gen/game_types.h:26:0 +// examples/terrain_gen/game_types.h:28:0 link_internal counted_string ToStringPrefixless(terrain_gen_type Type) @@ -22,6 +22,7 @@ ToStringPrefixless(terrain_gen_type Type) case TerrainGenType_GrassyIsland: { Result = CSz("GrassyIsland"); } break; case TerrainGenType_Hoodoo: { Result = CSz("Hoodoo"); } break; case TerrainGenType_Warped: { Result = CSz("Warped"); } break; + case TerrainGenType_Debug: { Result = CSz("Debug"); } break; } @@ -51,6 +52,7 @@ ToString(terrain_gen_type Type) case TerrainGenType_GrassyIsland: { Result = CSz("TerrainGenType_GrassyIsland"); } break; case TerrainGenType_Hoodoo: { Result = CSz("TerrainGenType_Hoodoo"); } break; case TerrainGenType_Warped: { Result = CSz("TerrainGenType_Warped"); } break; + case TerrainGenType_Debug: { Result = CSz("TerrainGenType_Debug"); } break; } @@ -79,6 +81,7 @@ TerrainGenType(counted_string S) if (StringsMatch(S, CSz("TerrainGenType_GrassyIsland"))) { return TerrainGenType_GrassyIsland; } if (StringsMatch(S, CSz("TerrainGenType_Hoodoo"))) { return TerrainGenType_Hoodoo; } if (StringsMatch(S, CSz("TerrainGenType_Warped"))) { return TerrainGenType_Warped; } + if (StringsMatch(S, CSz("TerrainGenType_Debug"))) { return TerrainGenType_Debug; } return Result; } diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 984f35789..396011aa0 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,129 +1,239 @@ -// src/engine/world_chunk.cpp:1862:0 +// src/engine/world_chunk.cpp:1945:0 link_internal void -BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, - v3i SrcChunkDim, +BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, + v3i SrcChunkDim, - v3i SrcChunkMin, - v3i SrcChunkMax, + v3i SrcChunkMin, + v3i SrcChunkMax, - // TODO(Jesse)(immediate, poof): removing the braces here causes poof to bail .. why? - untextured_3d_geometry_buffer *DestGeometry, - untextured_3d_geometry_buffer *DestTransparentGeometry, - memory_arena *TempMemory, + // TODO(Jesse)(immediate, poof): @poof_parens_bug + untextured_3d_geometry_buffer *Dest, + untextured_3d_geometry_buffer *Unused, // NOTE(Jesse): This is so we can offset vertices such that we center // entity models about 0 and rotation works properly. - v3 VertexOffset = {}) + v3 VertexOffset = {}) { /* HISTOGRAM_FUNCTION(); */ TIMED_FUNCTION(); - Assert(DestGeometry->Type == DataType_v3); + Assert(SrcChunkMin == V3i(0)); + Assert(SrcChunkMax % V3i(64) == V3i(0)); + Assert(SrcChunkDim % V3i(64) == V3i(0)); + + v2i BlockDim = {{64,64}}; v3 VertexData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; - auto SrcMinP = SrcChunkMin; - auto MaxDim = Min(SrcChunkDim, SrcChunkMax); - - auto TmpDim = MaxDim-SrcMinP; - - u32 TmpVol = u32(Volume(TmpDim)); - auto TempVoxels = Allocate(voxel, TempMemory, TmpVol); - - // NOTE(Jesse): It's necessary to copy the voxel data because the meshing - // algorithm unsets the face flags for the voxels instead of marking them - // as being processed. When complete, there should be no face-flags left on - // this data. (This is not asserted, but maybe should be?) - // - // TODO(Jesse): Assert there are no face flags left in this copy at the end of - // this process? - // - // TODO(Jesse): Copy data into here as the algorithm proceedes instead of in - // one shot at the start? - // - u32 TmpIndex = 0; - for ( s32 zIndex = 0; zIndex < TmpDim.z ; ++zIndex ) + s32 Result = 0; + for ( s32 zBlock = 1; zBlock < 63; ++zBlock ) { - for ( s32 yIndex = 0; yIndex < TmpDim.y ; ++yIndex ) + s32 z = zBlock; + for ( s32 yBlock = 1; yBlock < 63; ++yBlock ) { - for ( s32 xIndex = 0; xIndex < TmpDim.x ; ++xIndex ) + s32 y = yBlock; + s32 OccupancyIndex = GetIndex(yBlock, zBlock, BlockDim); + + u64 LeftFaces = FaceMasks[(OccupancyIndex*6)+0]; + u64 RightFaces = FaceMasks[(OccupancyIndex*6)+1]; + u64 FrontFaces = FaceMasks[(OccupancyIndex*6)+2]; + u64 BackFaces = FaceMasks[(OccupancyIndex*6)+3]; + u64 TopFaces = FaceMasks[(OccupancyIndex*6)+4]; + u64 BotFaces = FaceMasks[(OccupancyIndex*6)+5]; + + /* Assert(LeftFaces == RightFaces); */ + + + while (LeftFaces) { - voxel_position SrcP = SrcMinP + Voxel_Position(xIndex, yIndex, zIndex); - s32 SrcIndex = GetIndex(SrcP, SrcChunkDim); - /* Assert(TmpIndex < TmpVol); */ - TempVoxels[TmpIndex] = Voxels[SrcIndex]; - TmpIndex++; + v3 Dim = V3(0.f, 1.f, 1.f); + u64 This = UnsetLeastSignificantSetBit(&LeftFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + LeftFaceVertexData( VertexOffset+V3(s32(xOffset)+1, y, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, v3_LeftFaceNormalData, Materials); } - } - } - Assert(TmpIndex == TmpVol); + while (RightFaces) + { + v3 Dim = V3(0.f, 1.f, 1.f); + u64 This = UnsetLeastSignificantSetBit(&RightFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, v3_RightFaceNormalData, Materials); + } - s32 Index = 0; - for ( s32 z = 0; z < TmpDim.z ; ++z ) - { - for ( s32 y = 0; y < TmpDim.y ; ++y ) - { - for ( s32 x = 0; x < TmpDim.x ; ++x ) + while (FrontFaces) + { + v3 Dim = V3(1.f, 0.f, 1.f); + u64 This = UnsetLeastSignificantSetBit(&FrontFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y+1, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, v3_FrontFaceNormalData, Materials); + } + + while (BackFaces) + { + v3 Dim = V3(1.f, 0.f, 1.f); + u64 This = UnsetLeastSignificantSetBit(&BackFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, v3_BackFaceNormalData, Materials); + } + + while (TopFaces) + { + v3 Dim = V3(1.f, 1.f, 0.f); + u64 This = UnsetLeastSignificantSetBit(&TopFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z+1), Dim, VertexData); + BufferFaceData(Dest, VertexData, v3_TopFaceNormalData, Materials); + } + + while (BotFaces) { - v3i TmpVoxP = V3i(x,y,z); - voxel *Voxel = TempVoxels + Index; - - FillArray(VertexMaterial(Voxel->Color, Voxel->Transparency, 0), Materials, VERTS_PER_FACE); - - untextured_3d_geometry_buffer *Dest = {}; - if (Voxel->Transparency) { Dest = DestTransparentGeometry; } else { Dest = DestGeometry; } - - if (Dest) - { - if (Voxel->Flags & Voxel_RightFace) - { - v3 Dim = DoXStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_RightFace, Voxel->Color, Voxel->Transparency); - RightFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, v3_RightFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_LeftFace) - { - v3 Dim = DoXStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_LeftFace, Voxel->Color, Voxel->Transparency); - LeftFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, v3_LeftFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_BottomFace) - { - v3 Dim = DoZStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_BottomFace, Voxel->Color, Voxel->Transparency); - BottomFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, v3_BottomFaceNormalData, Materials); - } - - if (Voxel->Flags & Voxel_TopFace) - { - v3 Dim = DoZStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_TopFace, Voxel->Color, Voxel->Transparency); - TopFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, v3_TopFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_FrontFace) - { - v3 Dim = DoYStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_FrontFace, Voxel->Color, Voxel->Transparency); - FrontFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, v3_FrontFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_BackFace) - { - v3 Dim = DoYStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_BackFace, Voxel->Color, Voxel->Transparency); - BackFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, v3_BackFaceNormalData, Materials); - } - } - - ++Index; + v3 Dim = V3(1.f, 1.f, 0.f); + u64 This = UnsetLeastSignificantSetBit(&BotFaces); + u32 xOffset = GetIndexOfSingleSetBit(This); + BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, v3_BottomFaceNormalData, Materials); } + + + } + } +} + + +link_internal void +BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3( voxel *Voxels, + v3i SrcChunkDim, + + v3i SrcChunkMin, + v3i SrcChunkMax, + + // TODO(Jesse)(immediate, poof, @poof_parens_bug): removing the parens here causes poof to bail .. why? + untextured_3d_geometry_buffer *DestGeometry, + untextured_3d_geometry_buffer *DestTransparentGeometry, + memory_arena *TempMemory, + + // NOTE(Jesse): This is so we can offset vertices such that we center + // entity models about 0 and rotation works properly. + v3 VertexOffset = {}) +{ + /* HISTOGRAM_FUNCTION(); */ + TIMED_FUNCTION(); + + NotImplemented; +/* Assert(DestGeometry->Type == DataType_(vert_t.name)); */ + +/* vert_t.name VertexData[VERTS_PER_FACE]; */ +/* matl Materials[VERTS_PER_FACE]; */ + +/* auto SrcMinP = SrcChunkMin; */ +/* auto MaxDim = Min(SrcChunkDim, SrcChunkMax); */ + +/* auto TmpDim = MaxDim-SrcMinP; */ + +/* u32 TmpVol = u32(Volume(TmpDim)); */ +/* auto TempVoxels = Allocate(voxel, TempMemory, TmpVol); */ + +/* // NOTE(Jesse): It's necessary to copy the voxel data because the meshing */ +/* // algorithm unsets the face flags for the voxels instead of marking them */ +/* // as being processed. When complete, there should be no face-flags left on */ +/* // this data. (This is not asserted, but maybe should be?) */ +/* // */ +/* // TODO(Jesse): Assert there are no face flags left in this copy at the end of */ +/* // this process? */ +/* // */ +/* // TODO(Jesse): Copy data into here as the algorithm proceedes instead of in */ +/* // one shot at the start? */ +/* // */ +/* u32 TmpIndex = 0; */ +/* for ( s32 zIndex = 0; zIndex < TmpDim.z ; ++zIndex ) */ +/* { */ +/* for ( s32 yIndex = 0; yIndex < TmpDim.y ; ++yIndex ) */ +/* { */ +/* for ( s32 xIndex = 0; xIndex < TmpDim.x ; ++xIndex ) */ +/* { */ +/* voxel_position SrcP = SrcMinP + Voxel_Position(xIndex, yIndex, zIndex); */ +/* s32 SrcIndex = GetIndex(SrcP, SrcChunkDim); */ +/* /1* Assert(TmpIndex < TmpVol); *1/ */ +/* TempVoxels[TmpIndex] = Voxels[SrcIndex]; */ +/* TmpIndex++; */ +/* } */ +/* } */ +/* } */ + +/* Assert(TmpIndex == TmpVol); */ + +/* s32 Index = 0; */ +/* for ( s32 z = 0; z < TmpDim.z ; ++z ) */ +/* { */ +/* for ( s32 y = 0; y < TmpDim.y ; ++y ) */ +/* { */ +/* for ( s32 x = 0; x < TmpDim.x ; ++x ) */ +/* { */ +/* v3i TmpVoxP = V3i(x,y,z); */ +/* voxel *Voxel = TempVoxels + Index; */ + +/* FillArray(VertexMaterial(Voxel->Color, Voxel->Transparency, 0), Materials, VERTS_PER_FACE); */ + +/* (buffer_t.name) *Dest = {}; */ +/* if (Voxel->Transparency) { Dest = DestTransparentGeometry; } else { Dest = DestGeometry; } */ + +/* if (Dest) */ +/* { */ +/* if (Voxel->Flags & Voxel_RightFace) */ +/* { */ +/* v3 Dim = DoXStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_RightFace, Voxel->Color, Voxel->Transparency); */ +/* RightFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_RightFaceNormalData, Materials); */ +/* } */ +/* if (Voxel->Flags & Voxel_LeftFace) */ +/* { */ +/* v3 Dim = DoXStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_LeftFace, Voxel->Color, Voxel->Transparency); */ +/* LeftFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_LeftFaceNormalData, Materials); */ +/* } */ +/* if (Voxel->Flags & Voxel_BottomFace) */ +/* { */ +/* v3 Dim = DoZStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_BottomFace, Voxel->Color, Voxel->Transparency); */ +/* BottomFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_BottomFaceNormalData, Materials); */ +/* } */ + +/* if (Voxel->Flags & Voxel_TopFace) */ +/* { */ +/* v3 Dim = DoZStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_TopFace, Voxel->Color, Voxel->Transparency); */ +/* TopFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_TopFaceNormalData, Materials); */ +/* } */ +/* if (Voxel->Flags & Voxel_FrontFace) */ +/* { */ +/* v3 Dim = DoYStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_FrontFace, Voxel->Color, Voxel->Transparency); */ +/* FrontFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_FrontFaceNormalData, Materials); */ +/* } */ +/* if (Voxel->Flags & Voxel_BackFace) */ +/* { */ +/* v3 Dim = DoYStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_BackFace, Voxel->Color, Voxel->Transparency); */ +/* BackFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_BackFaceNormalData, Materials); */ +/* } */ +/* } */ + +/* ++Index; */ +/* } */ +/* } */ +/* } */ + +/* if (DestGeometry) DestGeometry->Timestamp = __rdtsc(); */ +/* if (DestTransparentGeometry) DestTransparentGeometry->Timestamp = __rdtsc(); */ - if (DestGeometry) DestGeometry->Timestamp = __rdtsc(); - if (DestTransparentGeometry) DestTransparentGeometry->Timestamp = __rdtsc(); } link_internal void diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 59bacf115..60e67e63c 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,129 +1,239 @@ -// src/engine/world_chunk.cpp:1865:0 +// src/engine/world_chunk.cpp:1948:0 link_internal void -BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, - v3i SrcChunkDim, +BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, + v3i SrcChunkDim, - v3i SrcChunkMin, - v3i SrcChunkMax, + v3i SrcChunkMin, + v3i SrcChunkMax, - // TODO(Jesse)(immediate, poof): removing the braces here causes poof to bail .. why? - untextured_3d_geometry_buffer *DestGeometry, - untextured_3d_geometry_buffer *DestTransparentGeometry, - memory_arena *TempMemory, + // TODO(Jesse)(immediate, poof): @poof_parens_bug + untextured_3d_geometry_buffer *Dest, + untextured_3d_geometry_buffer *Unused, // NOTE(Jesse): This is so we can offset vertices such that we center // entity models about 0 and rotation works properly. - v3_u8 VertexOffset = {}) + v3_u8 VertexOffset = {}) { /* HISTOGRAM_FUNCTION(); */ TIMED_FUNCTION(); - Assert(DestGeometry->Type == DataType_v3_u8); + Assert(SrcChunkMin == V3i(0)); + Assert(SrcChunkMax % V3i(64) == V3i(0)); + Assert(SrcChunkDim % V3i(64) == V3i(0)); + + v2i BlockDim = {{64,64}}; v3_u8 VertexData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; - auto SrcMinP = SrcChunkMin; - auto MaxDim = Min(SrcChunkDim, SrcChunkMax); - - auto TmpDim = MaxDim-SrcMinP; - - u32 TmpVol = u32(Volume(TmpDim)); - auto TempVoxels = Allocate(voxel, TempMemory, TmpVol); - - // NOTE(Jesse): It's necessary to copy the voxel data because the meshing - // algorithm unsets the face flags for the voxels instead of marking them - // as being processed. When complete, there should be no face-flags left on - // this data. (This is not asserted, but maybe should be?) - // - // TODO(Jesse): Assert there are no face flags left in this copy at the end of - // this process? - // - // TODO(Jesse): Copy data into here as the algorithm proceedes instead of in - // one shot at the start? - // - u32 TmpIndex = 0; - for ( s32 zIndex = 0; zIndex < TmpDim.z ; ++zIndex ) + s32 Result = 0; + for ( s32 zBlock = 1; zBlock < 63; ++zBlock ) { - for ( s32 yIndex = 0; yIndex < TmpDim.y ; ++yIndex ) + s32 z = zBlock; + for ( s32 yBlock = 1; yBlock < 63; ++yBlock ) { - for ( s32 xIndex = 0; xIndex < TmpDim.x ; ++xIndex ) + s32 y = yBlock; + s32 OccupancyIndex = GetIndex(yBlock, zBlock, BlockDim); + + u64 LeftFaces = FaceMasks[(OccupancyIndex*6)+0]; + u64 RightFaces = FaceMasks[(OccupancyIndex*6)+1]; + u64 FrontFaces = FaceMasks[(OccupancyIndex*6)+2]; + u64 BackFaces = FaceMasks[(OccupancyIndex*6)+3]; + u64 TopFaces = FaceMasks[(OccupancyIndex*6)+4]; + u64 BotFaces = FaceMasks[(OccupancyIndex*6)+5]; + + /* Assert(LeftFaces == RightFaces); */ + + + while (LeftFaces) { - voxel_position SrcP = SrcMinP + Voxel_Position(xIndex, yIndex, zIndex); - s32 SrcIndex = GetIndex(SrcP, SrcChunkDim); - /* Assert(TmpIndex < TmpVol); */ - TempVoxels[TmpIndex] = Voxels[SrcIndex]; - TmpIndex++; + v3 Dim = V3(0.f, 1.f, 1.f); + u64 This = UnsetLeastSignificantSetBit(&LeftFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + LeftFaceVertexData( VertexOffset+V3(s32(xOffset)+1, y, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, v3_u8_LeftFaceNormalData, Materials); } - } - } - Assert(TmpIndex == TmpVol); + while (RightFaces) + { + v3 Dim = V3(0.f, 1.f, 1.f); + u64 This = UnsetLeastSignificantSetBit(&RightFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, v3_u8_RightFaceNormalData, Materials); + } - s32 Index = 0; - for ( s32 z = 0; z < TmpDim.z ; ++z ) - { - for ( s32 y = 0; y < TmpDim.y ; ++y ) - { - for ( s32 x = 0; x < TmpDim.x ; ++x ) + while (FrontFaces) + { + v3 Dim = V3(1.f, 0.f, 1.f); + u64 This = UnsetLeastSignificantSetBit(&FrontFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y+1, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, v3_u8_FrontFaceNormalData, Materials); + } + + while (BackFaces) + { + v3 Dim = V3(1.f, 0.f, 1.f); + u64 This = UnsetLeastSignificantSetBit(&BackFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, v3_u8_BackFaceNormalData, Materials); + } + + while (TopFaces) + { + v3 Dim = V3(1.f, 1.f, 0.f); + u64 This = UnsetLeastSignificantSetBit(&TopFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z+1), Dim, VertexData); + BufferFaceData(Dest, VertexData, v3_u8_TopFaceNormalData, Materials); + } + + while (BotFaces) { - v3i TmpVoxP = V3i(x,y,z); - voxel *Voxel = TempVoxels + Index; - - FillArray(VertexMaterial(Voxel->Color, Voxel->Transparency, 0), Materials, VERTS_PER_FACE); - - untextured_3d_geometry_buffer *Dest = {}; - if (Voxel->Transparency) { Dest = DestTransparentGeometry; } else { Dest = DestGeometry; } - - if (Dest) - { - if (Voxel->Flags & Voxel_RightFace) - { - v3 Dim = DoXStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_RightFace, Voxel->Color, Voxel->Transparency); - RightFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, v3_u8_RightFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_LeftFace) - { - v3 Dim = DoXStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_LeftFace, Voxel->Color, Voxel->Transparency); - LeftFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, v3_u8_LeftFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_BottomFace) - { - v3 Dim = DoZStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_BottomFace, Voxel->Color, Voxel->Transparency); - BottomFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, v3_u8_BottomFaceNormalData, Materials); - } - - if (Voxel->Flags & Voxel_TopFace) - { - v3 Dim = DoZStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_TopFace, Voxel->Color, Voxel->Transparency); - TopFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, v3_u8_TopFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_FrontFace) - { - v3 Dim = DoYStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_FrontFace, Voxel->Color, Voxel->Transparency); - FrontFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, v3_u8_FrontFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_BackFace) - { - v3 Dim = DoYStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_BackFace, Voxel->Color, Voxel->Transparency); - BackFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, v3_u8_BackFaceNormalData, Materials); - } - } - - ++Index; + v3 Dim = V3(1.f, 1.f, 0.f); + u64 This = UnsetLeastSignificantSetBit(&BotFaces); + u32 xOffset = GetIndexOfSingleSetBit(This); + BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, v3_u8_BottomFaceNormalData, Materials); } + + + } + } +} + + +link_internal void +BuildWorldChunkMeshFromMarkedVoxels_Greedy_v3_u8( voxel *Voxels, + v3i SrcChunkDim, + + v3i SrcChunkMin, + v3i SrcChunkMax, + + // TODO(Jesse)(immediate, poof, @poof_parens_bug): removing the parens here causes poof to bail .. why? + untextured_3d_geometry_buffer *DestGeometry, + untextured_3d_geometry_buffer *DestTransparentGeometry, + memory_arena *TempMemory, + + // NOTE(Jesse): This is so we can offset vertices such that we center + // entity models about 0 and rotation works properly. + v3_u8 VertexOffset = {}) +{ + /* HISTOGRAM_FUNCTION(); */ + TIMED_FUNCTION(); + + NotImplemented; +/* Assert(DestGeometry->Type == DataType_(vert_t.name)); */ + +/* vert_t.name VertexData[VERTS_PER_FACE]; */ +/* matl Materials[VERTS_PER_FACE]; */ + +/* auto SrcMinP = SrcChunkMin; */ +/* auto MaxDim = Min(SrcChunkDim, SrcChunkMax); */ + +/* auto TmpDim = MaxDim-SrcMinP; */ + +/* u32 TmpVol = u32(Volume(TmpDim)); */ +/* auto TempVoxels = Allocate(voxel, TempMemory, TmpVol); */ + +/* // NOTE(Jesse): It's necessary to copy the voxel data because the meshing */ +/* // algorithm unsets the face flags for the voxels instead of marking them */ +/* // as being processed. When complete, there should be no face-flags left on */ +/* // this data. (This is not asserted, but maybe should be?) */ +/* // */ +/* // TODO(Jesse): Assert there are no face flags left in this copy at the end of */ +/* // this process? */ +/* // */ +/* // TODO(Jesse): Copy data into here as the algorithm proceedes instead of in */ +/* // one shot at the start? */ +/* // */ +/* u32 TmpIndex = 0; */ +/* for ( s32 zIndex = 0; zIndex < TmpDim.z ; ++zIndex ) */ +/* { */ +/* for ( s32 yIndex = 0; yIndex < TmpDim.y ; ++yIndex ) */ +/* { */ +/* for ( s32 xIndex = 0; xIndex < TmpDim.x ; ++xIndex ) */ +/* { */ +/* voxel_position SrcP = SrcMinP + Voxel_Position(xIndex, yIndex, zIndex); */ +/* s32 SrcIndex = GetIndex(SrcP, SrcChunkDim); */ +/* /1* Assert(TmpIndex < TmpVol); *1/ */ +/* TempVoxels[TmpIndex] = Voxels[SrcIndex]; */ +/* TmpIndex++; */ +/* } */ +/* } */ +/* } */ + +/* Assert(TmpIndex == TmpVol); */ + +/* s32 Index = 0; */ +/* for ( s32 z = 0; z < TmpDim.z ; ++z ) */ +/* { */ +/* for ( s32 y = 0; y < TmpDim.y ; ++y ) */ +/* { */ +/* for ( s32 x = 0; x < TmpDim.x ; ++x ) */ +/* { */ +/* v3i TmpVoxP = V3i(x,y,z); */ +/* voxel *Voxel = TempVoxels + Index; */ + +/* FillArray(VertexMaterial(Voxel->Color, Voxel->Transparency, 0), Materials, VERTS_PER_FACE); */ + +/* (buffer_t.name) *Dest = {}; */ +/* if (Voxel->Transparency) { Dest = DestTransparentGeometry; } else { Dest = DestGeometry; } */ + +/* if (Dest) */ +/* { */ +/* if (Voxel->Flags & Voxel_RightFace) */ +/* { */ +/* v3 Dim = DoXStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_RightFace, Voxel->Color, Voxel->Transparency); */ +/* RightFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_RightFaceNormalData, Materials); */ +/* } */ +/* if (Voxel->Flags & Voxel_LeftFace) */ +/* { */ +/* v3 Dim = DoXStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_LeftFace, Voxel->Color, Voxel->Transparency); */ +/* LeftFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_LeftFaceNormalData, Materials); */ +/* } */ +/* if (Voxel->Flags & Voxel_BottomFace) */ +/* { */ +/* v3 Dim = DoZStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_BottomFace, Voxel->Color, Voxel->Transparency); */ +/* BottomFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_BottomFaceNormalData, Materials); */ +/* } */ + +/* if (Voxel->Flags & Voxel_TopFace) */ +/* { */ +/* v3 Dim = DoZStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_TopFace, Voxel->Color, Voxel->Transparency); */ +/* TopFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_TopFaceNormalData, Materials); */ +/* } */ +/* if (Voxel->Flags & Voxel_FrontFace) */ +/* { */ +/* v3 Dim = DoYStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_FrontFace, Voxel->Color, Voxel->Transparency); */ +/* FrontFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_FrontFaceNormalData, Materials); */ +/* } */ +/* if (Voxel->Flags & Voxel_BackFace) */ +/* { */ +/* v3 Dim = DoYStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_BackFace, Voxel->Color, Voxel->Transparency); */ +/* BackFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_BackFaceNormalData, Materials); */ +/* } */ +/* } */ + +/* ++Index; */ +/* } */ +/* } */ +/* } */ + +/* if (DestGeometry) DestGeometry->Timestamp = __rdtsc(); */ +/* if (DestTransparentGeometry) DestTransparentGeometry->Timestamp = __rdtsc(); */ - if (DestGeometry) DestGeometry->Timestamp = __rdtsc(); - if (DestTransparentGeometry) DestTransparentGeometry->Timestamp = __rdtsc(); } link_internal void diff --git a/jesse.make.sh b/jesse.make.sh index 60fb9ef2e..972503c96 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/make.sh b/make.sh index 684f443bd..c92b0de9d 100755 --- a/make.sh +++ b/make.sh @@ -325,14 +325,14 @@ function RunPoof # [ -d src/generated ] && rm -Rf src/generated # [ -d generated ] && rm -Rf generated - RunPoofHelper src/game_loader.cpp && echo -e "$Success poofed src/game_loader.cpp" & - TrackPid "" $! + # RunPoofHelper src/game_loader.cpp && echo -e "$Success poofed src/game_loader.cpp" & + # TrackPid "" $! # RunPoofHelper examples/turn_based/game.cpp && echo -e "$Success poofed examples/turn_based/game.cpp" & # TrackPid "" $! - # RunPoofHelper examples/terrain_gen/game.cpp && echo -e "$Success poofed examples/terrain_gen/game.cpp" & - # TrackPid "" $! + RunPoofHelper examples/terrain_gen/game.cpp && echo -e "$Success poofed examples/terrain_gen/game.cpp" & + TrackPid "" $! # RunPoofHelper examples/the_wanderer/game.cpp && echo -e "$Success poofed examples/the_wanderer/game.cpp" & # TrackPid "" $! diff --git a/readme.md b/readme.md index 220b6b3d1..9dc9deae2 100644 --- a/readme.md +++ b/readme.md @@ -143,6 +143,11 @@ See the docs on the [build process](docs/01_build_process.md). [ ] More interpolation goodies : https://paulbourke.net/miscellaneous/interpolation/ + +## Goodies + +[ ] Better (faster) Sin/Cos ? https://www.shadertoy.com/view/432yWW + ------------------------------------------------------------------------------- ## Profiler diff --git a/src/engine/asset.h b/src/engine/asset.h index e9ac1bc68..fb4bda2b9 100644 --- a/src/engine/asset.h +++ b/src/engine/asset.h @@ -264,6 +264,7 @@ GetChunkDataForAssetModel(asset *Asset, u32 ModelIndex) .Dim = Asset->Chunk.Dim, .Voxels = Asset->Chunk.Voxels, .Occupancy = Asset->Chunk.Occupancy, + .FaceMasks = Asset->Chunk.FaceMasks, .VoxelLighting = Asset->Chunk.VoxelLighting, }; } break; diff --git a/src/engine/bonsai.h b/src/engine/bonsai.h index 3ea1d0bb9..86ac56922 100644 --- a/src/engine/bonsai.h +++ b/src/engine/bonsai.h @@ -111,13 +111,6 @@ struct entity_entity_collision_event entity *Entity; }; -inline void -UnSetFlag( voxel_flag *Flags, voxel_flag Flag ) -{ - *Flags = (voxel_flag)(*Flags & ~Flag); - return; -} - inline void UnSetFlag( chunk_flag *Flags, chunk_flag Flag ) { @@ -139,14 +132,6 @@ UnSetFlag( world_chunk *Chunk, chunk_flag Flag ) /* return; */ /* } */ -inline void -SetFlag( u8 *Flags, voxel_flag Flag ) -{ - /* Assert(Flag < u8_MAX); */ - *Flags = (u8)(*Flags | Flag); - return; -} - inline void SetFlag( chunk_flag *Flags, chunk_flag Flag ) { @@ -169,27 +154,6 @@ SetFlag( world_chunk *Chunk, chunk_flag Flag ) return; } -inline void -SetFlag(voxel *Voxel, voxel_flag Flag ) -{ - SetFlag(&Voxel->Flags, Flag); - return; -} - -inline void -SetFlag(boundary_voxel *Voxel, voxel_flag Flag ) -{ - SetFlag(&Voxel->V.Flags, Flag); - return; -} - -inline b32 -IsSet( u8 Flags, voxel_flag Flag ) -{ - b32 Result = ( (Flags & Flag) != 0 ); - return Result; -} - inline b32 IsSet( chunk_flag Flags, chunk_flag Flag ) { @@ -211,27 +175,6 @@ IsSet( world_chunk *Chunk, chunk_flag Flag ) return Result; } -inline b32 -IsSet( voxel *V, voxel_flag Flag ) -{ - b32 Result = IsSet(V->Flags, Flag); - return Result; -} - -inline b32 -IsSet( boundary_voxel *V, voxel_flag Flag ) -{ - b32 Result = IsSet(&V->V, Flag); - return Result; -} - -inline b32 -NotSet( voxel_flag Flags, voxel_flag Flag ) -{ - b32 Result = !(IsSet(Flags, Flag)); - return Result; -} - inline b32 NotSet( chunk_flag Flags, chunk_flag Flag ) { @@ -253,13 +196,6 @@ NotSet( world_chunk *Chunk, chunk_flag Flag ) return Result; } -inline b32 -NotSet( voxel *Voxel, voxel_flag Flag ) -{ - b32 Result = !(IsSet(Voxel, Flag)); - return Result; -} - inline b32 Spawned(entity *Entity) { diff --git a/src/engine/chunk.cpp b/src/engine/chunk.cpp index a6045ad25..0fb3e6c2b 100644 --- a/src/engine/chunk.cpp +++ b/src/engine/chunk.cpp @@ -9,8 +9,9 @@ AllocateChunkData(memory_arena *Storage, chunk_dimension Dim) s32 VoxCount = Volume(Dim); if (VoxCount) { - s32 OccupancyCount = (VoxCount+7) / 8; // Add seven so we round up when we divide if there's an extra one (or several) - Result->Occupancy = AllocateAlignedProtection( u8, Storage , OccupancyCount, CACHE_LINE_SIZE, false); + s32 OccupancyCount = (VoxCount+63) / 64; // Add seven so we round up when we divide if there's an extra one (or several) + Result->Occupancy = AllocateAlignedProtection( u64, Storage , OccupancyCount, CACHE_LINE_SIZE, false); + Result->FaceMasks = AllocateAlignedProtection( u64, Storage , 6*OccupancyCount, CACHE_LINE_SIZE, false); Result->Voxels = AllocateAlignedProtection( voxel, Storage , VoxCount, CACHE_LINE_SIZE, false); Result->VoxelLighting = AllocateAlignedProtection(voxel_lighting, Storage , VoxCount, CACHE_LINE_SIZE, false); } @@ -37,14 +38,14 @@ IsFilledInChunk( world_chunk *Chunk, voxel_position VoxelP, chunk_dimension Dim) } inline b32 -NotFilled(u8 *Occupancy, s32 Index) +NotFilled(u64 *Occupancy, s32 Index) { b32 Result = b32(GetOccupancyBit(Occupancy, Index)) == 0; return Result; } inline b32 -NotFilled(u8 *Occupancy, v3i P, v3i Dim) +NotFilled(u64 *Occupancy, v3i P, v3i Dim) { b32 Result = b32(GetOccupancyBit(Occupancy, GetIndex(P, Dim))) == 0; return Result; diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index e04394a56..7dfc28d65 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -777,7 +777,7 @@ DoEngineDebug(engine_resources *Engine) { world_chunk *PickedChunk = EngineDebug->PickedChunk; /* MarkBoundaryVoxels_Debug(PickedChunk->Voxels, PickedChunk->Dim); */ - MarkBoundaryVoxels_NoExteriorFaces(PickedChunk->Occupancy, PickedChunk->Voxels, PickedChunk->Dim, {}, PickedChunk->Dim); + MarkBoundaryVoxels_NoExteriorFaces(PickedChunk->Occupancy, PickedChunk->FaceMasks, PickedChunk->Voxels, PickedChunk->Dim, {}, PickedChunk->Dim); QueueChunkForMeshRebuild(&Plat->LowPriority, PickedChunk); } PushNewRow(Ui); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 8b6cf4ecb..5cfc3c21b 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -724,8 +724,8 @@ DoSelectedVoxelDebugWindow(engine_resources *Engine, cp VoxelCP) if (V) { - DoEditorUi(Ui, &Window, &V->Flags, CSz("Voxel Flags")); - PushNewRow(Ui); + /* DoEditorUi(Ui, &Window, &V->Flags, CSz("Voxel Flags")); */ + /* PushNewRow(Ui); */ DoEditorUi(Ui, &Window, &VoxelCP, CSz("CP")); @@ -1331,7 +1331,7 @@ ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *P v3i DestRelativeMinCorner = (-1*SmallestMinOffset) + SrcOffsetMin; - chunk_data D = {SrcChunk->Flags, SrcChunk->Dim, SrcChunk->Occupancy, SrcChunk->Voxels, SrcChunk->VoxelLighting}; + chunk_data D = {SrcChunk->Flags, SrcChunk->Dim, SrcChunk->Occupancy, SrcChunk->FaceMasks, SrcChunk->Voxels, SrcChunk->VoxelLighting}; world_update_op_shape_params_chunk_data ChunkDataShape = { D, V3(DestRelativeMinCorner) }; Assert(SrcChunk->Dim <= DestChunk->Dim); @@ -2444,7 +2444,7 @@ DoWorldEditor(engine_resources *Engine) Offset = Min(Layer->Settings.Offset.Min, Offset); } - chunk_data D = {Chunk->Flags, Chunk->Dim, Chunk->Occupancy, Chunk->Voxels, Chunk->VoxelLighting}; + chunk_data D = {Chunk->Flags, Chunk->Dim, Chunk->Occupancy, Chunk->FaceMasks, Chunk->Voxels, Chunk->VoxelLighting}; world_update_op_shape_params_chunk_data ChunkDataShape = { D, V3(Offset) + GetSimSpaceP(World, Editor->SelectionRegion.Min) - V3i(1) }; world_edit_shape Shape = diff --git a/src/engine/render.cpp b/src/engine/render.cpp index 4ebd24b9b..04544b697 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -612,12 +612,15 @@ IsBoundaryVoxel(world_chunk *Chunk, voxel_position Offset, chunk_dimension Dim) voxel *V = &Chunk->Voxels[VoxelIndex]; b32 Result = False; + NotImplemented; +#if 0 Result |= IsSet( V, Voxel_BackFace); Result |= IsSet( V, Voxel_FrontFace); Result |= IsSet( V, Voxel_TopFace); Result |= IsSet( V, Voxel_BottomFace); Result |= IsSet( V, Voxel_LeftFace); Result |= IsSet( V, Voxel_RightFace); +#endif return Result; } diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 3a3c14374..844660161 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -36,8 +36,8 @@ Terrain_FBM2D( world_chunk *Chunk, void *NoiseParams, void *OctaveCount ) { - HISTOGRAM_FUNCTION(); - /* TIMED_FUNCTION(); */ + TIMED_FUNCTION(); + /* HISTOGRAM_FUNCTION(); */ UNPACK_NOISE_PARAMS(NoiseParams); @@ -263,7 +263,8 @@ Terrain_Perlin3D( world_chunk *Chunk, for ( s32 x = 0; x < Dim.x; ++ x) { s32 i = GetIndex(Voxel_Position(x,y,z), Dim); - Chunk->Voxels[i].Flags = Voxel_Empty; + NotImplemented; + /* Chunk->Voxels[i].Flags = Voxel_Empty; */ /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ @@ -316,7 +317,8 @@ Terrain_WhiteNoise( world_chunk *Chunk, for ( s32 x = 0; x < Dim.x; ++ x) { s32 i = GetIndex(Voxel_Position(x,y,z), Dim); - Chunk->Voxels[i].Flags = Voxel_Empty; + NotImplemented; + /* Chunk->Voxels[i].Flags = Voxel_Empty; */ /* Assert( NotSet(&Chunk->Voxels[i], Voxel_Filled) ); */ @@ -993,7 +995,8 @@ HoodooTerrain( world_chunk *Chunk, s64 WorldX = x + SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); r32 NoiseValue = 0.f; s32 VoxIndex = GetIndex(V3i(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + NotImplemented; + /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ /* Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); */ /* s32 Amp2 = Amplitude*2; */ @@ -1126,7 +1129,8 @@ HoodooTerrain( world_chunk *Chunk, Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor)*u16(IsFilled); ChunkSum += IsFilled; - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); + NotImplemented; + /* Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); */ } } } @@ -1162,7 +1166,8 @@ TerracedTerrain( world_chunk *Chunk, { /* s64 WorldX = x + SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); */ s32 VoxIndex = GetIndex(V3i(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + NotImplemented; + /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ /* Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); */ r32 NoiseValue = 0.f; @@ -1345,6 +1350,7 @@ TerracedTerrain( world_chunk *Chunk, + NotImplemented; /* Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); */ SetOccupancyBit(Chunk, VoxIndex, s32(IsFilled)); } @@ -1431,7 +1437,8 @@ GrassyTerracedTerrain2( world_chunk *Chunk, /* s64 WorldX = x + SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); */ s32 VoxIndex = GetIndex(V3i(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + NotImplemented; + /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ /* Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); */ r32 NoiseValue = 0.f; @@ -1516,7 +1523,8 @@ GrassyTerracedTerrain2( world_chunk *Chunk, Chunk->Voxels[VoxIndex].Transparency = ThisTransparency; ChunkSum += IsFilled; - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); + NotImplemented; + /* Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); */ } } } @@ -1593,7 +1601,8 @@ GrassyTerracedTerrain3( world_chunk *Chunk, s64 WorldX = x + SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); s32 VoxIndex = GetIndex(V3i(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + NotImplemented; + /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ /* Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); */ r32 NoiseValue = 0.f; @@ -1662,7 +1671,8 @@ GrassyTerracedTerrain3( world_chunk *Chunk, Chunk->Voxels[VoxIndex].Transparency = ThisTransparency; ChunkSum += IsFilled; - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); + NotImplemented; + /* Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); */ } } } @@ -2234,7 +2244,8 @@ GrassyTerracedTerrain( world_chunk *Chunk, { /* s64 WorldX = x + SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); */ s32 VoxIndex = GetIndex(V3i(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + NotImplemented; + /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ /* Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); */ r32 NoiseValue = 0.f; @@ -2340,7 +2351,8 @@ GrassyTerracedTerrain( world_chunk *Chunk, Chunk->Voxels[VoxIndex].Transparency = ThisTransparency; ChunkSum += IsFilled; - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); + NotImplemented; + /* Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); */ } } } @@ -2414,7 +2426,8 @@ GrassyLargeTerracedTerrain( world_chunk *Chunk, /* s64 WorldX = x + SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); */ s32 VoxIndex = GetIndex(V3i(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + NotImplemented; + /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ /* Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); */ r32 NoiseValue = 0.f; @@ -2489,7 +2502,8 @@ GrassyLargeTerracedTerrain( world_chunk *Chunk, Chunk->Voxels[VoxIndex].Transparency = ThisTransparency; ChunkSum += IsFilled; - Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); + NotImplemented; + /* Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); */ } } } @@ -2610,7 +2624,8 @@ Terrain_Voronoi3D( world_chunk *Chunk, for ( s32 x = 0; x < Dim.x; ++ x) { s32 VoxIndex = GetIndex(V3i(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + NotImplemented; + /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ v3 RepeatBasisInCells = V3(8); v3 NoiseInput = NoiseMod((V3(x,y,z) + NoiseBasis)/Period, RepeatBasisInCells); @@ -2662,7 +2677,8 @@ Terrain_Voronoi2D( world_chunk *Chunk, { s64 WorldX = x + SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); s32 VoxIndex = GetIndex(V3i(x,y,z), Dim); - Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; + NotImplemented; + /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ r32 NoiseValue = VoronoiNoise3D(V3(f32(WorldX), f32(WorldY), f32(WorldZ)) / Period, Squareness, MaskChance); /* r32 NoiseValue = VoronoiNoise3D(V3(s32(WorldX), s32(WorldY), s32(WorldZ)) * 0.04f) * 25.f; */ diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 4c687b0b2..92b220adb 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -1,5 +1,5 @@ -#define MIN_TERRAIN_NOISE_WIDTH (16) +#define MIN_TERRAIN_NOISE_WIDTH (64) #define COMPUTE_NOISE_INPUT(channel_name, offset, chunk) (chunk->DimInChunks.channel_name/2.f) + ((f32(offset)+channel_name)*chunk->DimInChunks.channel_name) + (chunk->WorldP.channel_name*WorldChunkDim.channel_name) diff --git a/src/engine/voxel.cpp b/src/engine/voxel.cpp index fb1c337de..4278e7527 100644 --- a/src/engine/voxel.cpp +++ b/src/engine/voxel.cpp @@ -9,21 +9,19 @@ GetOccupancyBit(world_chunk *Chunk, s32 Index) link_internal void SetOccupancyBit(world_chunk *Chunk, s32 Index, s32 BitValue) { - /* Assert(BitValue == 0 || BitValue == 1); */ - s32 ByteIndex = Index/8; - s32 BitIndex = Index%8; + s32 ByteIndex = Index/64; + s32 BitIndex = Index%64; - Chunk->Occupancy[ByteIndex] &= ~(1 << BitIndex); // Unconditionally knock out the bit - Chunk->Occupancy[ByteIndex] |= (BitValue << BitIndex); // Set new value.. 0 just does nothing + Chunk->Occupancy[ByteIndex] &= ~(u64(1) << BitIndex); // Unconditionally knock out the bit + Chunk->Occupancy[ByteIndex] |= (u64(BitValue) << BitIndex); // Set new value.. 0 just does nothing /* s32 Test = GetOccupancyBit(Chunk, Index); */ /* Assert(Test == BitValue); */ } link_internal void -SetOccupancyByte(world_chunk *Chunk, s32 Index, u8 ByteValue) +SetOccupancyMask(world_chunk *Chunk, s32 Index, u64 MaskValue) { - /* Assert(Index % 8 == 0); */ - s32 ByteIndex = Index/8; - Chunk->Occupancy[ByteIndex] = ByteValue; + s32 MaskIndex = Index/64; + Chunk->Occupancy[MaskIndex] = MaskValue; } diff --git a/src/engine/voxel.h b/src/engine/voxel.h index fcaf6d678..c367230fc 100644 --- a/src/engine/voxel.h +++ b/src/engine/voxel.h @@ -7,11 +7,11 @@ enum voxel_occupancy link_internal s32 -GetOccupancyBit(u8 *Occupancy, s32 Index) +GetOccupancyBit(u64 *Occupancy, s32 Index) { - s32 ByteIndex = Index/8; - s32 BitIndex = Index%8; - s32 Result = (Occupancy[ByteIndex] >> BitIndex) & 1; + s32 MaskIndex = Index/64; + s32 BitIndex = Index%64; + s32 Result = (Occupancy[MaskIndex] >> BitIndex) & 1; return Result; } diff --git a/src/engine/voxel_synthesis.cpp b/src/engine/voxel_synthesis.cpp index ff3eb79e2..067822df6 100644 --- a/src/engine/voxel_synthesis.cpp +++ b/src/engine/voxel_synthesis.cpp @@ -71,11 +71,12 @@ BakeVoxelSynthesisRules(const char* InputVox) DimIterator(xIndex, yIndex, zIndex, FillDim) { s32 VIndex = GetIndex(xIndex, yIndex, zIndex, ModelDim); - Vox.ChunkData->Voxels[VIndex].Flags = {}; + NotImplemented; + /* Vox.ChunkData->Voxels[VIndex].Flags = {}; */ Vox.ChunkData->Voxels[VIndex].Color = RGBtoPackedHSV(RGB_GRASS_GREEN); } - MarkBoundaryVoxels_NoExteriorFaces(Vox.ChunkData->Occupancy, Vox.ChunkData->Voxels, Vox.ChunkData->Dim, {}, Vox.ChunkData->Dim); + MarkBoundaryVoxels_NoExteriorFaces( Vox.ChunkData->Occupancy, Vox.ChunkData->FaceMasks, Vox.ChunkData->Voxels, Vox.ChunkData->Dim, {}, Vox.ChunkData->Dim); Assert(Vox.ChunkData->Dim.x % Global_TileDim.x == 0); Assert(Vox.ChunkData->Dim.y % Global_TileDim.y == 0); diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index d93d1daaa..110c4c7fb 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -113,7 +113,7 @@ CAssert( (sizeof(work_queue_entry__align_to_cache_line_helper)+8) % CACHE_LINE_S #if VOXEL_DEBUG_COLOR global_variable voxel Global_UnsetVoxel = { 0xff, 0xff, 0xffff, {}, {}}; #else -global_variable voxel Global_UnsetVoxel = { 0xff, 0xff, 0xffff }; +global_variable voxel Global_UnsetVoxel = { 0xff, 0xffff }; #endif diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 2cae3d264..e2afe6abb 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -124,7 +124,7 @@ GatherVoxelsOverlappingArea(world *World, rect3i SimSpaceAABB, world_chunk_ptr_b #if VOXEL_DEBUG_COLOR voxel UnsetVoxel = { 0xff, 0xff, 0xffff, {}, {} }; #else - voxel UnsetVoxel = { 0xff, 0xff, 0xffff }; + voxel UnsetVoxel = { 0xff, 0xffff }; #endif for (u32 VoxelIndex = 0; VoxelIndex < TotalVoxels; ++VoxelIndex) { Voxels[VoxelIndex] = UnsetVoxel; } @@ -153,7 +153,8 @@ GatherVoxelsOverlappingArea(world *World, rect3i SimSpaceAABB, world_chunk_ptr_b { voxel_position RelVoxP = Voxel_Position(s32(xVoxel), s32(yVoxel), s32(zVoxel)); voxel *V = GetVoxel(Chunk, RelVoxP); - Assert( (V->Flags & Voxel_MarkBit) == 0); + NotImplemented; + /* Assert( (V->Flags & Voxel_MarkBit) == 0); */ v3i SimSpaceVoxPExact = V3i(xVoxel, yVoxel, zVoxel) + SimSpaceChunkMin; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 92a999d21..e77df8bd1 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -76,8 +76,9 @@ AllocateWorldChunk(world_chunk *Result, v3i WorldP, v3i Dim, v3i DimInChunks, me s32 VoxCount = Volume(Dim); if (VoxCount) { - s32 OccupancyCount = (VoxCount+7) / 8; // Add seven so we round up when we divide if there's an extra one (or several) - Result->Occupancy = AllocateAlignedProtection(u8, Storage , OccupancyCount, CACHE_LINE_SIZE, false); + s32 OccupancyCount = (VoxCount+63) / 64; // Add seven so we round up when we divide if there's an extra one (or several) + Result->Occupancy = AllocateAlignedProtection(u64, Storage , OccupancyCount, CACHE_LINE_SIZE, false); + Result->FaceMasks = AllocateAlignedProtection(u64, Storage , 6*OccupancyCount, CACHE_LINE_SIZE, false); Result->Voxels = AllocateAlignedProtection(voxel, Storage , VoxCount, CACHE_LINE_SIZE, false); } @@ -763,7 +764,7 @@ MarkBoundaryVoxels_Debug( voxel *Voxels, chunk_dimension SrcChunkDim) #endif link_internal s32 -MarkBoundaryVoxels_MakeExteriorFaces( u8 *Occupancy, +MarkBoundaryVoxels_MakeExteriorFaces( u64 *Occupancy, voxel *Voxels, chunk_dimension SrcChunkDim, chunk_dimension SrcChunkMin, @@ -793,8 +794,6 @@ MarkBoundaryVoxels_MakeExteriorFaces( u8 *Occupancy, if (VOccupancy) { - Voxel->Flags = {}; - voxel_position rightVoxel = DestP + V3i(1, 0, 0); voxel_position leftVoxel = DestP - V3i(1, 0, 0); voxel_position topVoxel = DestP + V3i(0, 0, 1); @@ -802,7 +801,9 @@ MarkBoundaryVoxels_MakeExteriorFaces( u8 *Occupancy, voxel_position frontVoxel = DestP + V3i(0, 1, 0); voxel_position backVoxel = DestP - V3i(0, 1, 0); + NotImplemented; +#if 0 if ( !Contains( ClampedDim, rightVoxel) || NotFilled( Occupancy, rightVoxel, SrcChunkDim) || TransparencyIncreases( Voxels, SrcIndex, rightVoxel, SrcChunkDim) ) { Voxel->Flags |= Voxel_RightFace; @@ -827,6 +828,8 @@ MarkBoundaryVoxels_MakeExteriorFaces( u8 *Occupancy, { Voxel->Flags |= Voxel_BackFace; } +#endif + } } } @@ -836,7 +839,8 @@ MarkBoundaryVoxels_MakeExteriorFaces( u8 *Occupancy, } link_internal s32 -MarkBoundaryVoxels_NoExteriorFaces( u8 *Occupancy, +MarkBoundaryVoxels_NoExteriorFaces( u64 *Occupancy, + u64 *FaceMasks, voxel *Voxels, v3i SrcChunkDim, v3i SrcChunkMin, @@ -851,95 +855,57 @@ MarkBoundaryVoxels_NoExteriorFaces( u8 *Occupancy, v3i InnerDim = MaxDim-MinDim; Assert(MinDim == V3i(0)); - Assert(MaxDim % V3i(8) == V3i(0)); + Assert(MaxDim % V3i(64) == V3i(0)); + Assert(SrcChunkDim % V3i(64) == V3i(0)); + + v2i BlockDim = {{64,64}}; s32 Result = 0; - for ( s32 z = MinDim.z; z < MaxDim.z ; ++z ) + for ( s32 zBlock = 1; zBlock < 63; ++zBlock ) { - for ( s32 y = MinDim.y; y < MaxDim.y ; ++y ) + for ( s32 yBlock = 1; yBlock < 63; ++yBlock ) { - for ( s32 x = MinDim.x; x < MaxDim.x ; ++x ) - { - v3i SrcP = V3i(x,y,z); - s32 SrcIndex = GetIndex(SrcP, SrcChunkDim); - s32 VOccupancy = GetOccupancyBit(Occupancy, SrcIndex); + s32 OccupancyIndex = GetIndex(yBlock, zBlock, BlockDim); - voxel *Voxel = Voxels + SrcIndex; + u64 Bits = Occupancy[OccupancyIndex]; + u64 yBits = Occupancy[OccupancyIndex+1]; + u64 nyBits = Occupancy[OccupancyIndex-1]; + u64 zBits = Occupancy[OccupancyIndex+64]; + u64 nzBits = Occupancy[OccupancyIndex-64]; - Result += VOccupancy; - if (VOccupancy) - { - Voxel->Flags = {}; - - s32 RightIndex = TryGetIndex(SrcP + V3i(1, 0, 0), SrcChunkDim); - s32 LeftIndex = TryGetIndex(SrcP - V3i(1, 0, 0), SrcChunkDim); - s32 TopIndex = TryGetIndex(SrcP + V3i(0, 0, 1), SrcChunkDim); - s32 BottomIndex= TryGetIndex(SrcP - V3i(0, 0, 1), SrcChunkDim); - s32 FrontIndex = TryGetIndex(SrcP + V3i(0, 1, 0), SrcChunkDim); - s32 BackIndex = TryGetIndex(SrcP - V3i(0, 1, 0), SrcChunkDim); + u64 LeftFaces = (Bits>>1) & ~Bits; + u64 RightFaces = (Bits<<1) & ~Bits; + /* u64 LeftFaces = Bits & ~(Bits >> 1ULL); */ + /* u64 RightFaces = Bits & ~(Bits << 1ULL); */ - /* RightFaces = (Bits >> 1) & (~Bits); */ - /* LeftFaces = (Bits << 1) & (~Bits); */ - - if ( RightIndex >= 0 ) - { - voxel *NextVoxel = Voxels + RightIndex; - if ( GetOccupancyBit(Occupancy, RightIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) - { - Voxel->Flags |= Voxel_RightFace; - } - } - if ( LeftIndex >= 0 ) - { - voxel *NextVoxel = Voxels + LeftIndex; - if ( GetOccupancyBit(Occupancy, LeftIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) - { - Voxel->Flags |= Voxel_LeftFace; - } - } + /* u64 FrontFaces = 0; */ + /* u64 BackFaces = 0; */ + u64 FrontFaces = Bits & (~yBits); + u64 BackFaces = Bits & (~nyBits); - if ( TopIndex >= 0 ) - { - voxel *NextVoxel = Voxels + TopIndex; - if ( GetOccupancyBit(Occupancy, TopIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) - { - Voxel->Flags |= Voxel_TopFace; - } - } - if ( BottomIndex >= 0 ) - { - voxel *NextVoxel = Voxels + BottomIndex; - if ( GetOccupancyBit(Occupancy, BottomIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) - { - Voxel->Flags |= Voxel_BottomFace; - } - } + /* u64 TopFaces = 0; */ + /* u64 BotFaces = 0; */ + u64 TopFaces = Bits & (~zBits); + u64 BotFaces = Bits & (~nzBits); + /* Assert(LeftFaces == RightFaces); */ + /* Assert(LeftFaces == FrontFaces); */ + /* Assert(LeftFaces == BackFaces); */ + /* Assert(LeftFaces == TopFaces); */ + /* Assert(LeftFaces == BotFaces); */ - if ( FrontIndex >= 0 ) - { - voxel *NextVoxel = Voxels + FrontIndex; - /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ - if ( GetOccupancyBit(Occupancy, FrontIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) - { - Voxel->Flags |= Voxel_FrontFace; - } - } - if ( BackIndex >= 0 ) - { - voxel *NextVoxel = Voxels + BackIndex; - /* if ( !(NextVoxel->Flags&Voxel_Filled) || TransparencyIncreases(Voxel, NextVoxel)) */ - if ( GetOccupancyBit(Occupancy, BackIndex) == VoxelOccupancy_Empty || TransparencyIncreases(Voxel, NextVoxel)) - { - Voxel->Flags |= Voxel_BackFace; - } - } - - } - - } + /* if (LeftFaces) */ + /* { */ + /* int foo = 3; */ + /* } */ + FaceMasks[(OccupancyIndex*6)+0] = LeftFaces; + FaceMasks[(OccupancyIndex*6)+1] = RightFaces; + FaceMasks[(OccupancyIndex*6)+2] = FrontFaces; + FaceMasks[(OccupancyIndex*6)+3] = BackFaces; + FaceMasks[(OccupancyIndex*6)+4] = TopFaces; + FaceMasks[(OccupancyIndex*6)+5] = BotFaces; } } @@ -1069,6 +1035,9 @@ DrawDebugVoxels( voxel *Voxels, /* v3 Color = GetColorData(Voxel->Color); */ FillArray(VertexMaterial(Voxel->Color, 0.f, 0.f), Materials, VERTS_PER_FACE); + NotImplemented; + +#if 0 if (Voxel->Flags & Voxel_RightFace) { RightFaceVertexData( V3(SrcP-SrcChunkMin), Diameter, VertexData); @@ -1099,6 +1068,8 @@ DrawDebugVoxels( voxel *Voxels, BackFaceVertexData( V3(SrcP-SrcChunkMin), Diameter, VertexData); BufferFaceData(DestGeometry, VertexData, v3_BackFaceNormalData, Materials); } +#endif + } } } @@ -1135,6 +1106,7 @@ TransparencyIsSimilar(u8 T0, u8 T1) return Result; } +#if 0 link_internal b32 Step(voxel *Voxels, v3i SrcDim, v3i StepDir, v3i StepShape, v3i *AtP, voxel_flag FaceFlag, u16 PackedHSV, u8 Transparency) { @@ -1273,6 +1245,7 @@ DoZStepping(voxel *Voxels, v3i SrcChunkDim, v3i SrcP, voxel_flag Face, u16 Color v3 Result = V3(DidStepX, DidStepY, 0) + V3(1); return Result; } +#endif #if 0 link_internal void @@ -1373,129 +1346,239 @@ poof( func world_chunk_mesh_functions(buffer_t, vert_t) { link_internal void - BuildWorldChunkMeshFromMarkedVoxels_Greedy_(vert_t.name)( voxel *Voxels, - v3i SrcChunkDim, + BuildWorldChunkMeshFromMarkedVoxels_Naieve_(vert_t.name)( u64 *FaceMasks, + v3i SrcChunkDim, - v3i SrcChunkMin, - v3i SrcChunkMax, + v3i SrcChunkMin, + v3i SrcChunkMax, - // TODO(Jesse)(immediate, poof): removing the braces here causes poof to bail .. why? - (buffer_t.name) *DestGeometry, - (buffer_t.name) *DestTransparentGeometry, - memory_arena *TempMemory, + // TODO(Jesse)(immediate, poof): @poof_parens_bug + (buffer_t.name) *Dest, + (buffer_t.name) *Unused, - // NOTE(Jesse): This is so we can offset vertices such that we center - // entity models about 0 and rotation works properly. - vert_t.name VertexOffset = {}) + // NOTE(Jesse): This is so we can offset vertices such that we center + // entity models about 0 and rotation works properly. + vert_t.name VertexOffset = {}) { /* HISTOGRAM_FUNCTION(); */ TIMED_FUNCTION(); - Assert(DestGeometry->Type == DataType_(vert_t.name)); + Assert(SrcChunkMin == V3i(0)); + Assert(SrcChunkMax % V3i(64) == V3i(0)); + Assert(SrcChunkDim % V3i(64) == V3i(0)); + + v2i BlockDim = {{64,64}}; vert_t.name VertexData[VERTS_PER_FACE]; - matl Materials[VERTS_PER_FACE]; - - auto SrcMinP = SrcChunkMin; - auto MaxDim = Min(SrcChunkDim, SrcChunkMax); - - auto TmpDim = MaxDim-SrcMinP; - - u32 TmpVol = u32(Volume(TmpDim)); - auto TempVoxels = Allocate(voxel, TempMemory, TmpVol); - - // NOTE(Jesse): It's necessary to copy the voxel data because the meshing - // algorithm unsets the face flags for the voxels instead of marking them - // as being processed. When complete, there should be no face-flags left on - // this data. (This is not asserted, but maybe should be?) - // - // TODO(Jesse): Assert there are no face flags left in this copy at the end of - // this process? - // - // TODO(Jesse): Copy data into here as the algorithm proceedes instead of in - // one shot at the start? - // - u32 TmpIndex = 0; - for ( s32 zIndex = 0; zIndex < TmpDim.z ; ++zIndex ) + matl Materials[VERTS_PER_FACE]; + + s32 Result = 0; + for ( s32 zBlock = 1; zBlock < 63; ++zBlock ) { - for ( s32 yIndex = 0; yIndex < TmpDim.y ; ++yIndex ) + s32 z = zBlock; + for ( s32 yBlock = 1; yBlock < 63; ++yBlock ) { - for ( s32 xIndex = 0; xIndex < TmpDim.x ; ++xIndex ) + s32 y = yBlock; + s32 OccupancyIndex = GetIndex(yBlock, zBlock, BlockDim); + + u64 LeftFaces = FaceMasks[(OccupancyIndex*6)+0]; + u64 RightFaces = FaceMasks[(OccupancyIndex*6)+1]; + u64 FrontFaces = FaceMasks[(OccupancyIndex*6)+2]; + u64 BackFaces = FaceMasks[(OccupancyIndex*6)+3]; + u64 TopFaces = FaceMasks[(OccupancyIndex*6)+4]; + u64 BotFaces = FaceMasks[(OccupancyIndex*6)+5]; + + /* Assert(LeftFaces == RightFaces); */ + + + while (LeftFaces) { - voxel_position SrcP = SrcMinP + Voxel_Position(xIndex, yIndex, zIndex); - s32 SrcIndex = GetIndex(SrcP, SrcChunkDim); - /* Assert(TmpIndex < TmpVol); */ - TempVoxels[TmpIndex] = Voxels[SrcIndex]; - TmpIndex++; + v3 Dim = V3(0.f, 1.f, 1.f); + u64 This = UnsetLeastSignificantSetBit(&LeftFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + LeftFaceVertexData( VertexOffset+V3(s32(xOffset)+1, y, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, (vert_t.name)_LeftFaceNormalData, Materials); } - } - } - Assert(TmpIndex == TmpVol); + while (RightFaces) + { + v3 Dim = V3(0.f, 1.f, 1.f); + u64 This = UnsetLeastSignificantSetBit(&RightFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, (vert_t.name)_RightFaceNormalData, Materials); + } - s32 Index = 0; - for ( s32 z = 0; z < TmpDim.z ; ++z ) - { - for ( s32 y = 0; y < TmpDim.y ; ++y ) - { - for ( s32 x = 0; x < TmpDim.x ; ++x ) + while (FrontFaces) { - v3i TmpVoxP = V3i(x,y,z); - voxel *Voxel = TempVoxels + Index; + v3 Dim = V3(1.f, 0.f, 1.f); + u64 This = UnsetLeastSignificantSetBit(&FrontFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y+1, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, (vert_t.name)_FrontFaceNormalData, Materials); + } - FillArray(VertexMaterial(Voxel->Color, Voxel->Transparency, 0), Materials, VERTS_PER_FACE); + while (BackFaces) + { + v3 Dim = V3(1.f, 0.f, 1.f); + u64 This = UnsetLeastSignificantSetBit(&BackFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, (vert_t.name)_BackFaceNormalData, Materials); + } - (buffer_t.name) *Dest = {}; - if (Voxel->Transparency) { Dest = DestTransparentGeometry; } else { Dest = DestGeometry; } + while (TopFaces) + { + v3 Dim = V3(1.f, 1.f, 0.f); + u64 This = UnsetLeastSignificantSetBit(&TopFaces); + u64 xOffset = GetIndexOfSingleSetBit(This); + TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z+1), Dim, VertexData); + BufferFaceData(Dest, VertexData, (vert_t.name)_TopFaceNormalData, Materials); + } + + while (BotFaces) + { + v3 Dim = V3(1.f, 1.f, 0.f); + u64 This = UnsetLeastSignificantSetBit(&BotFaces); + u32 xOffset = GetIndexOfSingleSetBit(This); + BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BufferFaceData(Dest, VertexData, (vert_t.name)_BottomFaceNormalData, Materials); + } - if (Dest) - { - if (Voxel->Flags & Voxel_RightFace) - { - v3 Dim = DoXStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_RightFace, Voxel->Color, Voxel->Transparency); - RightFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, (vert_t.name)_RightFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_LeftFace) - { - v3 Dim = DoXStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_LeftFace, Voxel->Color, Voxel->Transparency); - LeftFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, (vert_t.name)_LeftFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_BottomFace) - { - v3 Dim = DoZStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_BottomFace, Voxel->Color, Voxel->Transparency); - BottomFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, (vert_t.name)_BottomFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_TopFace) - { - v3 Dim = DoZStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_TopFace, Voxel->Color, Voxel->Transparency); - TopFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, (vert_t.name)_TopFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_FrontFace) - { - v3 Dim = DoYStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_FrontFace, Voxel->Color, Voxel->Transparency); - FrontFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, (vert_t.name)_FrontFaceNormalData, Materials); - } - if (Voxel->Flags & Voxel_BackFace) - { - v3 Dim = DoYStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_BackFace, Voxel->Color, Voxel->Transparency); - BackFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); - BufferFaceData(Dest, VertexData, (vert_t.name)_BackFaceNormalData, Materials); - } - } - ++Index; - } } + } + } + + + link_internal void + BuildWorldChunkMeshFromMarkedVoxels_Greedy_(vert_t.name)( voxel *Voxels, + v3i SrcChunkDim, + + v3i SrcChunkMin, + v3i SrcChunkMax, + + // TODO(Jesse)(immediate, poof, @poof_parens_bug): removing the parens here causes poof to bail .. why? + (buffer_t.name) *DestGeometry, + (buffer_t.name) *DestTransparentGeometry, + memory_arena *TempMemory, + + // NOTE(Jesse): This is so we can offset vertices such that we center + // entity models about 0 and rotation works properly. + vert_t.name VertexOffset = {}) + { + /* HISTOGRAM_FUNCTION(); */ + TIMED_FUNCTION(); + + NotImplemented; +/* Assert(DestGeometry->Type == DataType_(vert_t.name)); */ + +/* vert_t.name VertexData[VERTS_PER_FACE]; */ +/* matl Materials[VERTS_PER_FACE]; */ + +/* auto SrcMinP = SrcChunkMin; */ +/* auto MaxDim = Min(SrcChunkDim, SrcChunkMax); */ + +/* auto TmpDim = MaxDim-SrcMinP; */ + +/* u32 TmpVol = u32(Volume(TmpDim)); */ +/* auto TempVoxels = Allocate(voxel, TempMemory, TmpVol); */ + +/* // NOTE(Jesse): It's necessary to copy the voxel data because the meshing */ +/* // algorithm unsets the face flags for the voxels instead of marking them */ +/* // as being processed. When complete, there should be no face-flags left on */ +/* // this data. (This is not asserted, but maybe should be?) */ +/* // */ +/* // TODO(Jesse): Assert there are no face flags left in this copy at the end of */ +/* // this process? */ +/* // */ +/* // TODO(Jesse): Copy data into here as the algorithm proceedes instead of in */ +/* // one shot at the start? */ +/* // */ +/* u32 TmpIndex = 0; */ +/* for ( s32 zIndex = 0; zIndex < TmpDim.z ; ++zIndex ) */ +/* { */ +/* for ( s32 yIndex = 0; yIndex < TmpDim.y ; ++yIndex ) */ +/* { */ +/* for ( s32 xIndex = 0; xIndex < TmpDim.x ; ++xIndex ) */ +/* { */ +/* voxel_position SrcP = SrcMinP + Voxel_Position(xIndex, yIndex, zIndex); */ +/* s32 SrcIndex = GetIndex(SrcP, SrcChunkDim); */ +/* /1* Assert(TmpIndex < TmpVol); *1/ */ +/* TempVoxels[TmpIndex] = Voxels[SrcIndex]; */ +/* TmpIndex++; */ +/* } */ +/* } */ +/* } */ + +/* Assert(TmpIndex == TmpVol); */ + +/* s32 Index = 0; */ +/* for ( s32 z = 0; z < TmpDim.z ; ++z ) */ +/* { */ +/* for ( s32 y = 0; y < TmpDim.y ; ++y ) */ +/* { */ +/* for ( s32 x = 0; x < TmpDim.x ; ++x ) */ +/* { */ +/* v3i TmpVoxP = V3i(x,y,z); */ +/* voxel *Voxel = TempVoxels + Index; */ + +/* FillArray(VertexMaterial(Voxel->Color, Voxel->Transparency, 0), Materials, VERTS_PER_FACE); */ + +/* (buffer_t.name) *Dest = {}; */ +/* if (Voxel->Transparency) { Dest = DestTransparentGeometry; } else { Dest = DestGeometry; } */ + +/* if (Dest) */ +/* { */ +/* if (Voxel->Flags & Voxel_RightFace) */ +/* { */ +/* v3 Dim = DoXStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_RightFace, Voxel->Color, Voxel->Transparency); */ +/* RightFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_RightFaceNormalData, Materials); */ +/* } */ +/* if (Voxel->Flags & Voxel_LeftFace) */ +/* { */ +/* v3 Dim = DoXStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_LeftFace, Voxel->Color, Voxel->Transparency); */ +/* LeftFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_LeftFaceNormalData, Materials); */ +/* } */ +/* if (Voxel->Flags & Voxel_BottomFace) */ +/* { */ +/* v3 Dim = DoZStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_BottomFace, Voxel->Color, Voxel->Transparency); */ +/* BottomFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_BottomFaceNormalData, Materials); */ +/* } */ + +/* if (Voxel->Flags & Voxel_TopFace) */ +/* { */ +/* v3 Dim = DoZStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_TopFace, Voxel->Color, Voxel->Transparency); */ +/* TopFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_TopFaceNormalData, Materials); */ +/* } */ +/* if (Voxel->Flags & Voxel_FrontFace) */ +/* { */ +/* v3 Dim = DoYStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_FrontFace, Voxel->Color, Voxel->Transparency); */ +/* FrontFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_FrontFaceNormalData, Materials); */ +/* } */ +/* if (Voxel->Flags & Voxel_BackFace) */ +/* { */ +/* v3 Dim = DoYStepping(TempVoxels, TmpDim, TmpVoxP, Voxel_BackFace, Voxel->Color, Voxel->Transparency); */ +/* BackFaceVertexData( VertexOffset+TmpVoxP, Dim, VertexData); */ +/* BufferFaceData(Dest, VertexData, (vert_t.name)_BackFaceNormalData, Materials); */ +/* } */ +/* } */ + +/* ++Index; */ +/* } */ +/* } */ +/* } */ + +/* if (DestGeometry) DestGeometry->Timestamp = __rdtsc(); */ +/* if (DestTransparentGeometry) DestTransparentGeometry->Timestamp = __rdtsc(); */ - if (DestGeometry) DestGeometry->Timestamp = __rdtsc(); - if (DestTransparentGeometry) DestTransparentGeometry->Timestamp = __rdtsc(); } link_internal void @@ -2645,6 +2728,8 @@ link_internal v3 ComputeNormalBonsai(world_chunk *DestChunk, v3i DestChunkDim, v3 BoundingVoxelMidpoint) { v3 Normal = {}; + NotImplemented; +#if 0 for ( s32 VoxelIndex = 0; VoxelIndex < Volume(DestChunkDim); ++VoxelIndex) @@ -2659,6 +2744,7 @@ ComputeNormalBonsai(world_chunk *DestChunk, v3i DestChunkDim, v3 BoundingVoxelMi } Normal = Normalize(Normal); +#endif return Normal; } @@ -2681,7 +2767,7 @@ GetBoundingVoxelsMidpoint(world_chunk *Chunk, v3i ChunkDim) /* // TODO(Jesse): This literally only accumulates an integer .. remove TempBoundingPoints and other ancillary shit */ standing_spot -ComputeStandingSpotFor8x8x2_V2(u8* Occupancy, voxel *Voxels, v3i SrcChunkDim, v3i TileChunkOffset, v3i TileChunkDim) //, boundary_voxels *TempBoundingPoints) +ComputeStandingSpotFor8x8x2_V2(u64* Occupancy, voxel *Voxels, v3i SrcChunkDim, v3i TileChunkOffset, v3i TileChunkDim) //, boundary_voxels *TempBoundingPoints) { TIMED_FUNCTION(); standing_spot Result = {}; @@ -2703,10 +2789,12 @@ ComputeStandingSpotFor8x8x2_V2(u8* Occupancy, voxel *Voxels, v3i SrcChunkDim, v3 voxel *V = Voxels + vIndex; s32 vOccupancy = GetOccupancyBit(Occupancy, vIndex); +#if 0 if (vOccupancy && IsSet(V, Voxel_TopFace)) { ++StandableCount; } +#endif } } } @@ -2855,7 +2943,7 @@ IsValidForDestChunk(v3i Spot, v3i DestChunkDim) link_internal void ComputeStandingSpots( v3i SrcChunkDim, - u8 *Occupancy, + u64 *Occupancy, voxel *Voxels, v3i SrcChunkOffset, @@ -3230,11 +3318,10 @@ InitializeWorldChunkEmpty(world_chunk *DestChunk) ZeroChunk(DestChunk, Volume(WorldChunkDim)); #else for ( s32 VoxelIndex = 0; - VoxelIndex < Volume(DestChunk->Dim); - ++VoxelIndex) + VoxelIndex < Volume(DestChunk->Dim); + ++VoxelIndex) { voxel *Voxel = &DestChunk->Voxels[VoxelIndex]; - Voxel->Flags = Voxel_Empty; Voxel->Color = 0; } #endif @@ -3296,6 +3383,17 @@ QueueChunkForMeshRebuild(work_queue *Queue, world_chunk *Chunk, chunk_init_flags PushWorkQueueEntry(Queue, &Entry); } +link_internal void +BuildWorldChunkMeshFromMarkedVoxels_Naieve( u64 *FaceMasks, v3i SrcChunkDim, v3i SrcChunkMin, v3i SrcChunkMax, untextured_3d_geometry_buffer *DestGeometry, untextured_3d_geometry_buffer *DestTransparentGeometry, v3 VertexOffset = {}) +{ + switch(DestGeometry->Type) + { + InvalidCase(DataType_Undefinded); + case DataType_v3: BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3(FaceMasks, SrcChunkDim, SrcChunkMin, SrcChunkMax, DestGeometry, DestTransparentGeometry, VertexOffset); break; + case DataType_v3_u8: BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8(FaceMasks, SrcChunkDim, SrcChunkMin, SrcChunkMax, DestGeometry, DestTransparentGeometry, V3U8(VertexOffset)); break; + } +} + link_internal void BuildWorldChunkMeshFromMarkedVoxels_Greedy( voxel *Voxels, v3i SrcChunkDim, v3i SrcChunkMin, v3i SrcChunkMax, untextured_3d_geometry_buffer *DestGeometry, untextured_3d_geometry_buffer *DestTransparentGeometry, memory_arena *TempMemory, v3 VertexOffset = {}) { @@ -3342,11 +3440,13 @@ RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOff if (MeshBit == MeshBit_Lod0) { -#if VOXEL_DEBUG_COLOR - BuildWorldChunkMeshFromMarkedVoxels_Naieve( Chunk->Voxels, Chunk->Dim, MinOffset, MaxOffset, TempMesh, 0); -#else - BuildWorldChunkMeshFromMarkedVoxels_Greedy( Chunk->Voxels, Chunk->Dim, MinOffset, MaxOffset, TempMesh, 0, TempMem, VertexOffset); -#endif + BuildWorldChunkMeshFromMarkedVoxels_Naieve( Chunk->FaceMasks, Chunk->Dim, MinOffset, MaxOffset, TempMesh, 0); + +/* #if VOXEL_DEBUG_COLOR */ +/* BuildWorldChunkMeshFromMarkedVoxels_Naieve( Chunk->Voxels, Chunk->Dim, MinOffset, MaxOffset, TempMesh, 0); */ +/* #else */ +/* BuildWorldChunkMeshFromMarkedVoxels_Greedy( Chunk->Voxels, Chunk->Dim, MinOffset, MaxOffset, TempMesh, 0, TempMem, VertexOffset); */ +/* #endif */ } else { @@ -3385,7 +3485,8 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, b32 MakeExteriorFaces = False, v3i NoiseBasisOffset = {} ) { - TIMED_FUNCTION(); + HISTOGRAM_FUNCTION(); + /* TIMED_FUNCTION(); */ engine_resources *EngineResources = GetEngineResources(); @@ -3398,7 +3499,9 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, untextured_3d_geometry_buffer* Mesh = 0; - v3i SynChunkDimMin = (DestChunk->Dim + Global_ChunkApronDim); + /* v3i SynChunkDimMin = (DestChunk->Dim + Global_ChunkApronDim); */ + v3i SynChunkDimMin = (DestChunk->Dim); + Assert(SynChunkDimMin == V3i(64)); v3i SynChunkDim = RoundToMultiple(SynChunkDimMin, V3i(MIN_TERRAIN_NOISE_WIDTH)); v3i SynChunkP = DestChunk->WorldP; @@ -3448,7 +3551,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, } else { - MarkBoundaryVoxels_NoExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->Voxels, SynChunkDim, {}, SynChunkDim); + MarkBoundaryVoxels_NoExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->FaceMasks, SyntheticChunk->Voxels, SynChunkDim, {}, SynChunkDim); } CopyChunkOffset(SyntheticChunk, SynChunkDim, DestChunk, DestChunk->Dim, Global_ChunkApronMinDim); @@ -3485,7 +3588,8 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, geo_u3d *TempMesh = AllocateTempMesh(Thread->TempMemory, DataType_v3_u8); - RebuildWorldChunkMesh(Thread, SyntheticChunk, Global_ChunkApronMinDim, Global_ChunkApronMinDim+DestChunk->Dim, MeshBit_Lod0, TempMesh, Thread->TempMemory); + /* RebuildWorldChunkMesh(Thread, SyntheticChunk, Global_ChunkApronMinDim, Global_ChunkApronMinDim+DestChunk->Dim, MeshBit_Lod0, TempMesh, Thread->TempMemory); */ + RebuildWorldChunkMesh(Thread, SyntheticChunk, {}, {}, MeshBit_Lod0, TempMesh, Thread->TempMemory); TempMesh->At = 0; if (Flags & ChunkInitFlag_GenLODs) diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index be8dcee50..9b597b553 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -86,6 +86,7 @@ poof(string_and_value_tables(chunk_flag)) // If we make a mapping between these bit-flags and another face_index enum we // could delete a bit of code. // @duplicate_face_index_enum +#if 0 enum voxel_flag { Voxel_Empty = 0, @@ -105,25 +106,18 @@ enum voxel_flag Voxel_MarkBit = 1 << 7, }; CAssert(Voxel_MarkBit < u8_MAX); +#endif -global_variable u8 VoxelFaceMask = Voxel_LeftFace | Voxel_RightFace | Voxel_TopFace | Voxel_BottomFace | Voxel_FrontFace | Voxel_BackFace; +/* global_variable u8 VoxelFaceMask = Voxel_LeftFace | Voxel_RightFace | Voxel_TopFace | Voxel_BottomFace | Voxel_FrontFace | Voxel_BackFace; */ #define VOXEL_DEBUG_COLOR (0) // TODO(Jesse): Surely we can compress this.. but do we care? struct voxel { - u8 Flags; u8 Transparency; u16 Color; - - /* v3 Derivs; */ -#if VOXEL_DEBUG_COLOR - v3 DebugColor; poof(@no_serialize) - f32 DebugNoiseValue; poof(@no_serialize) -#endif }; -/* CAssert(sizeof(voxel) == 8); */ struct voxel_lighting { @@ -133,27 +127,10 @@ struct voxel_lighting poof(gen_constructor(voxel_lighting)) #include -#if 0 -link_internal b32 -IsValid(voxel *V) -{ - b32 Result = (V->Flags & Voxel_INVALID_BIT) == 0; - if (V->Flags & Voxel_Filled) - { - Result &= (V->Flags & Voxel_INVALID_BIT) == 0; - } - else - { - Result &= (V->Flags & VoxelFaceMask) == 0; - } - return Result; -} -#endif - b32 -operator ==(voxel &V1, voxel &V2) +operator==(voxel &V1, voxel &V2) { - b32 Result = V1.Flags == V2.Flags && V1.Color == V2.Color; + b32 Result = V1.Transparency == V2.Transparency && V1.Color == V2.Color; return Result; } @@ -177,7 +154,7 @@ struct boundary_voxel this->V.Color = w; - this->V.Flags = Voxel_Empty; + /* this->V.Flags = Voxel_Empty; */ this->V.Transparency = 0; } @@ -192,7 +169,8 @@ struct chunk_data { chunk_flag Flags; v3i Dim; // TODO(Jesse): can (should?) be 3x u8 instead of 3x s32 - u8 *Occupancy; + u64 *Occupancy; + u64 *FaceMasks; voxel *Voxels; voxel_lighting *VoxelLighting; }; @@ -336,7 +314,8 @@ struct world_chunk poof(@version(1)) // chunk_data { chunk_flag Flags; poof(@no_serialize) v3i Dim; // could/should be compressed? - u8 *Occupancy; + u64 *Occupancy; + u64 *FaceMasks; voxel *Voxels; poof(@array_length( Cast(umm, Volume(Element->Dim)))) voxel_lighting *VoxelLighting; poof(@array_length( Cast(umm, Volume(Element->Dim)))) // } @@ -668,7 +647,7 @@ link_internal void DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk); link_internal s32 -MarkBoundaryVoxels_MakeExteriorFaces(u8 *Occupancy, voxel *Voxels, chunk_dimension SrcChunkDim, chunk_dimension SrcChunkMin, chunk_dimension SrcChunkMax ); +MarkBoundaryVoxels_MakeExteriorFaces(u64 *Occupancy, voxel *Voxels, chunk_dimension SrcChunkDim, chunk_dimension SrcChunkMin, chunk_dimension SrcChunkMax ); /* link_internal world_chunk_geometry_buffer* */ /* AllocateTempWorldChunkMesh(memory_arena* TempMemory); */ diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index f06b803b8..975d0a4fd 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -323,7 +323,8 @@ poof( (FloodPredicate) { - if ( (V->Flags & Voxel_MarkBit) == 0) + NotImplemented; + /* if ( (V->Flags & Voxel_MarkBit) == 0) */ { Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); @@ -336,7 +337,8 @@ poof( (UserCode) - V->Flags |= Voxel_MarkBit; + NotImplemented; + /* V->Flags |= Voxel_MarkBit; */ if ( ((OverwriteVoxel == True) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True)) ) @@ -370,7 +372,8 @@ poof( (UserCode2) - if ( (V->Flags&Voxel_MarkBit)) + NotImplemented; + /* if ( (V->Flags&Voxel_MarkBit)) */ { Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); @@ -380,7 +383,8 @@ poof( Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegZ)); } - V->Flags &= ~Voxel_MarkBit; + NotImplemented; + /* V->Flags &= ~Voxel_MarkBit; */ } } } @@ -419,7 +423,8 @@ poof( // Knock out face flags so the 'surface' algorithm doesn't "self-apply" // We recompute these, so it's fine there. It's slower on non-surface // paths, but .. when that's the bottleneck, we've won. - V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); + NotImplemented; + /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ } } } @@ -428,7 +433,9 @@ poof( ) // TODO(Jesse): Make this not a macro. -#define poof_check_for_unfilled_border() \ +#define poof_check_for_unfilled_border() NotImplemented + +#if 0 { \ if (voxel *Vn = TryGetVoxel(CopiedChunk, VoxP + V3(1,0,0))) \ { \ @@ -456,7 +463,8 @@ poof( { \ if ((Vn->Flags&VoxelFaceMask)) { IsUnfilledBorder = True; } \ } \ - } \ + } +#endif #if 0 poof( @@ -522,7 +530,7 @@ WorldEdit_shape_sphere_Surface(apply_world_edit_params *Params, r32 RadiusSquare /* if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&Voxel_Filled) == False) */ { b32 IsUnfilledBorder = False; - poof_check_for_unfilled_border() + poof_check_for_unfilled_border(); /* Assert(NewVoxelValue->Flags & Voxel_Filled); */ if (IsUnfilledBorder) { @@ -538,7 +546,8 @@ WorldEdit_shape_sphere_Surface(apply_world_edit_params *Params, r32 RadiusSquare { poof(rectalinear_iteration_pattern({ v3i CenterToVoxP = SimVoxP - EditCenterP; - if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&VoxelFaceMask)) + NotImplemented; + /* if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&VoxelFaceMask)) */ { OverwriteVoxel = True; } @@ -564,7 +573,7 @@ WorldEdit_shape_sphere_Flood(apply_world_edit_params *Params, thread_local_state { NotImplemented; /* if ( Length(CenterToVoxP) < SquareRoot(RadiusSquared)-1.f && (V->Flags&Voxel_Filled) ) */ - { V->Flags = Voxel_Empty; } + /* { V->Flags = Voxel_Empty; } */ }, { v3i CenterToVoxP = SimVoxP - EditCenterP; @@ -625,7 +634,7 @@ WorldEdit_shape_rect_Surface(apply_world_edit_params *Params, voxel *NewVoxelVal /* if ((V->Flags&Voxel_Filled) == False) */ { b32 IsUnfilledBorder = False; - poof_check_for_unfilled_border() + poof_check_for_unfilled_border(); NotImplemented; /* Assert(NewVoxelValue->Flags & Voxel_Filled); */ if (IsUnfilledBorder) @@ -641,7 +650,8 @@ WorldEdit_shape_rect_Surface(apply_world_edit_params *Params, voxel *NewVoxelVal case WorldEdit_Mode_Remove: { poof(rectalinear_iteration_pattern({ - if ( (V->Flags&VoxelFaceMask)) + NotImplemented; + /* if ( (V->Flags&VoxelFaceMask)) */ { OverwriteVoxel = True; } @@ -747,7 +757,7 @@ WorldEdit_shape_chunk_data_Surface(apply_world_edit_params *Params, v3 SimOrigin /* if ((V->Flags&Voxel_Filled)==False) */ { b32 IsUnfilledBorder = False; - poof_check_for_unfilled_border() + poof_check_for_unfilled_border(); if (IsUnfilledBorder) { OverwriteVoxel = True; @@ -845,7 +855,7 @@ WorldEdit_shape_chunk_data_Default(apply_world_edit_params *Params, v3 SimOrigin { UNPACK_APPLY_WORLD_EDIT_PARAMS(Params); - voxel InvertV = { VoxelOccupancy_Filled, Params->Transparency, Params->Color }; + voxel InvertV = { Params->Transparency, Params->Color }; switch (Mode) { @@ -898,9 +908,9 @@ ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_re if (Mode == WorldEdit_Mode_Attach || Mode == WorldEdit_Mode_Paint) { #if VOXEL_DEBUG_COLOR - _NewVoxelValue = { VoxelOccupancy_Filled, NewTransparency, NewColor, {}, {}}; + _NewVoxelValue = { NewTransparency, NewColor, {}, {}}; #else - _NewVoxelValue = { VoxelOccupancy_Filled, NewTransparency, NewColor}; + _NewVoxelValue = { NewTransparency, NewColor}; #endif } @@ -1103,7 +1113,8 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ { v3i RelVoxP = V3i(s32(xVoxel), s32(yVoxel), s32(zVoxel)); voxel *V = GetVoxel(Chunk, RelVoxP); - Assert( (V->Flags & Voxel_MarkBit) == 0); + NotImplemented; + /* Assert( (V->Flags & Voxel_MarkBit) == 0); */ v3i SimSpaceVoxPExact = V3i(xVoxel, yVoxel, zVoxel) + SimSpaceChunkMin; @@ -1137,7 +1148,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ // NOTE(Jesse): We can actually do the entire dim here, but it's probably // better (faster) to just do what we actually need to - MarkBoundaryVoxels_NoExteriorFaces( CopiedChunk.Occupancy, CopiedChunk.Voxels, UpdateDim, {{1,1,1}}, UpdateDim-1); + MarkBoundaryVoxels_NoExteriorFaces( CopiedChunk.Occupancy, CopiedChunk.FaceMasks, CopiedChunk.Voxels, UpdateDim, {{1,1,1}}, UpdateDim-1); /* MarkBoundaryVoxels_NoExteriorFaces( CopiedChunk.Voxels, UpdateDim, {}, UpdateDim); */ /* MarkBoundaryVoxels_MakeExteriorFaces( CopiedChunk.Voxels, UpdateDim, {{1,1,1}}, UpdateDim-1); */ /* MarkBoundaryVoxels_MakeExteriorFaces( CopiedChunk.Voxels, UpdateDim, {}, UpdateDim); */ @@ -1175,11 +1186,13 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ Assert(UpdateMinP <= SimSpaceVoxPExact); u32 Index = MapIntoQueryBox(SimSpaceVoxPExact, UpdateMinP, UpdateDim); Assert(s32(Index) < TotalVoxels); - Assert(CopiedChunk.Voxels[Index].Flags != Global_UnsetVoxel.Flags); + /* Assert(CopiedChunk.Voxels[Index].Flags != Global_UnsetVoxel.Flags); */ Assert(CopiedChunk.Voxels[Index].Transparency != Global_UnsetVoxel.Transparency); Assert(CopiedChunk.Voxels[Index].Color != Global_UnsetVoxel.Color); - Assert( (V->Flags & Voxel_MarkBit) == 0); + NotImplemented; + /* Assert( (V->Flags & Voxel_MarkBit) == 0); */ + StartedFilled += GetOccupancyBit(Chunk, s32(Index)); #if VOXEL_DEBUG_COLOR V->Flags = CopiedChunk.Voxels[Index].Flags; @@ -1189,7 +1202,8 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ *V = CopiedChunk.Voxels[Index]; #endif EndedFilled += GetOccupancyBit(&CopiedChunk, s32(Index)); - Assert( (V->Flags & Voxel_MarkBit) == 0); + NotImplemented; + /* Assert( (V->Flags & Voxel_MarkBit) == 0); */ } } } From 155b97acac5e7c3dd52b8bd222b854328268f4e7 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 26 Sep 2024 18:59:36 -0700 Subject: [PATCH 048/421] Fix right-left faces being swapped --- examples/terrain_gen/game.cpp | 32 ++++++++--------- examples/terrain_gen/game_constants.h | 4 +-- external/bonsai_stdlib | 2 +- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 8 ++--- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 8 ++--- jesse.bonsai.rdbg | Bin 13786 -> 14383 bytes readme.md | 4 +++ src/engine/render.cpp | 6 +--- src/engine/world.cpp | 9 ++--- src/engine/world_chunk.cpp | 34 +++++------------- 11 files changed, 42 insertions(+), 67 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 6fd90208c..8a52715c1 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -485,23 +485,23 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* s32 StartingZDepth = 0; */ /* u32 Octaves = 7; */ - v3 Period = V3(125); - s32 Amplititude = 125; - s32 StartingZDepth = 0; - u32 Octaves = 1; + /* v3 Period = V3(125); */ + /* s32 Amplititude = 125; */ + /* s32 StartingZDepth = 0; */ + /* u32 Octaves = 1; */ - /* v3 Period = V3(1000); */ - /* s32 Amplititude = 800; */ - /* /1* s32 StartingZDepth = 1000; *1/ */ + v3 Period = V3(1000); + s32 Amplititude = 800; + s32 StartingZDepth = 1000; /* s32 StartingZDepth = 0; */ - /* /1* u32 Octaves = 1; *1/ */ - /* u32 Octaves = 6; */ + /* u32 Octaves = 1; */ + u32 Octaves = 6; -/* v3 Period = V3(2500); */ -/* s32 Amplititude = 1500; */ -/* s32 StartingZDepth = -400; */ -/* u32 Octaves = 1; */ -/* /1* u32 Octaves = 4; *1/ */ + /* v3 Period = V3(2500); */ + /* s32 Amplititude = 1500; */ + /* s32 StartingZDepth = -400; */ + /* u32 Octaves = 1; */ + /* /1* u32 Octaves = 4; *1/ */ /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; @@ -764,9 +764,9 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* GameState->TerrainGenType = TerrainGenType_GrassyTerracedTerrain; */ /* GameState->TerrainGenType = TerrainGenType_Debug; */ - GameState->TerrainGenType = TerrainGenType_SinCos; + /* GameState->TerrainGenType = TerrainGenType_SinCos; */ /* GameState->TerrainGenType = TerrainGenType_TerracedTerrain; */ - /* GameState->TerrainGenType = TerrainGenType_FBM2D; */ + GameState->TerrainGenType = TerrainGenType_FBM2D; /* GameState->TerrainGenType = TerrainGenType_GrassyTerracedTerrain4; */ /* GameState->TerrainGenType = TerrainGenType_Voronoi; */ /* World->Center = V3i(-22, 101, 1); */ diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 7193ebbdd..506866f94 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -12,14 +12,14 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ // 26km /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ -/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ +g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ -g_VisibleRegion = Chunk_Dimension(4, 4, 4); +/* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ /* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 1ad8f24af..74518c031 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 1ad8f24af1830dc5a90a86b1f00d018063cd0803 +Subproject commit 74518c03139df474917dc7341d88b61d19577744 diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 2113b0ac2..e1f35b979 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2902:0 +// src/engine/world_chunk.cpp:2883:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 396011aa0..d5056ae42 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:1945:0 +// src/engine/world_chunk.cpp:1926:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, @@ -43,15 +43,13 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, u64 TopFaces = FaceMasks[(OccupancyIndex*6)+4]; u64 BotFaces = FaceMasks[(OccupancyIndex*6)+5]; - /* Assert(LeftFaces == RightFaces); */ - while (LeftFaces) { v3 Dim = V3(0.f, 1.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - LeftFaceVertexData( VertexOffset+V3(s32(xOffset)+1, y, z), Dim, VertexData); + LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_LeftFaceNormalData, Materials); } @@ -60,7 +58,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, v3 Dim = V3(0.f, 1.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + RightFaceVertexData( VertexOffset+V3(s32(xOffset)+1, y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_RightFaceNormalData, Materials); } diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 60e67e63c..1b243e08d 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:1948:0 +// src/engine/world_chunk.cpp:1929:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, @@ -43,15 +43,13 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, u64 TopFaces = FaceMasks[(OccupancyIndex*6)+4]; u64 BotFaces = FaceMasks[(OccupancyIndex*6)+5]; - /* Assert(LeftFaces == RightFaces); */ - while (LeftFaces) { v3 Dim = V3(0.f, 1.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - LeftFaceVertexData( VertexOffset+V3(s32(xOffset)+1, y, z), Dim, VertexData); + LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_LeftFaceNormalData, Materials); } @@ -60,7 +58,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, v3 Dim = V3(0.f, 1.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + RightFaceVertexData( VertexOffset+V3(s32(xOffset)+1, y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_RightFaceNormalData, Materials); } diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index bd6621de35206c4f88541f8d2bb86ffedeade972..5db64276f3e3652da62b14b9209b1d826f2c7f96 100644 GIT binary patch delta 2454 zcmZ`*S!`R^5!I!{M?O;AM3L0WEwUu8q82J5&BV4M*j8-Iu3R?_f`)pcp7aQDD;L#D zQP547Ptc-qTA&{Vj4A~J1jqszMUZ?Hapzt>sz!kl zeBj)<^XAT+Gc%We-+i_Alk>(mdU|?FIGBx~z(x#<*YRBz=wF;)NX^e>7MGIR3_gfO zj0LS#*~LE$3A`~o3Dy@uZ8nI%xD&|DTG=AE!Gn|&&rinir<9EK6IuKyHHHhR2>hu8 zUYS{E8&E89lx7}fXE8f{(os_P)KXqkl`XZN)aHeckCHZaj&`H?MKZ`%@xC;T%gG7+ zGqJ*+&{uZ*X1&$W@(s1wELL_J_@zCAA16HIwqtHbF5za6;l4M6ui_@QP7Wiu5*x+s zxC=jsoyAje-@!o?miQ&S8}pGWf}1uMHe!$9_H+Oa-zenRIKCfU6S-ba+EI-Tu&0De zIp#q;+D~zIk9#*V$d<&a9dYAjJLNnRFyvEsZTe|;vTG(4l(Je^aF~eEz8j@!Gdm+T zE0P8N=>eSaM{zi1Wh;bK3_qJ1)A!pE6P}*(P)gks15*|(d&qjyjF(d}{AN-nTi00D zs$Orl>T0r3tF8Ul_hf*b(pL@~p0MhW9EF4U`H6nYQRM6-E^7I*TCUdjxr2-dmj(awdxS&I?=8QD@Jd5#mU%d3KPZQPB|^|Sor&SUu~=)l*;R`EMmR&Hu_D&}s>Y^j^A9oz{_ z;m@NE)JHQ^BKN&P%veo$c61OE_Q1g{CrTq$gO(Gye>mbLig}a#(dm#{^K(fpBQ{dZ zNOpFDlJoB!nPNF1{cYICt3ckYRvJn%sbz(Bdw2=SVFzW#U41^}MWH`{V4nrA4h>^s zD2n!wiI@M{kcrI+qtPLm+UveIje9;9j|>T`jGy}4oMWsxO*;PP8K*a6tJRC;VzaoX zHu$0Uy-5zQq|_*ei`^xzd3_v~-tA%u-I@@Cwzjr+*gWmQJQj%GWn54EU z0{VC`$l{cHv{!9tQ2KMyo?2*D>q2Za3Fk8Iy0d5uMDcGoA$U>%^@7_&NK?dahsa{X zZ-d9}Ah>6O=@C#xpt^I^Xm3C9n;_?a7M%t8W=ZbnD(j>Cs}$2CG# zZ){s#sccotG~4P$l~1;{WAa|K53@&wT|45$`?jm>o5%h1mTi!xAD?$SHfM(;%ePxf zQ>|Bu)e3xw>qn9OUsvG+_9%4u& ztWmbWw_mc_S!ZJJ`Yob3HY}%Tj$X0Pre>GYnRF(TPx12YR{UqOr^5p7$P#q|KcXoQ zP)YM5{djQ1l5Z{L_vWdBI$+#0kF#qcrOv#Sk+(e7M=hZU3=T~>8qfT4k?|GHqgPCW zIzbyI8F!^^x-ug8y)>#{8x`psT_koaNjAV(LC9EVn{;*rANJ)~S@?X?xMFB6;X&^O zauC5Yy(f|C-6e8$tc*&7?i{MSxI;8|eygs0hhx*3w9gwNbkCi`n!!rl^^!sK*n7;x zH2r#A)+0)Z+4|{uhd}Ly!=c2mZJWDm+h;R1Oa=o~tJ-j|!uU5KiZoaG(c6DrKzdS zV&Mt?ALDAP%->sFh>EYVE6XG-?>AL(2)7_-56SK3HSDE(+_JBT;>S*vcToRanP*5=msukUr~ lAyv=q59SUT^MR#9aHa?T=kemx1?&Ia?O5MhFe03O{Xd;8^V0wT delta 2096 zcmZ8iTWl0n80PF{c4v3H*S5Q*+r4yqo85MLg?8Jb1=>nVYq^LbAz7x|X=h|_%xs}G z8i>M!i3!p_COjCBnE0j`Fs3mipvL%Mf;6ZPY61iwBoTy!_+pIy=ghV>ZnBwk=FI<} z@BjYqeCKlMr=#!evaW2}v}rr6R;OLMnxD-`#}|7P)Cu%{|wm2_P$LwDyD;<3ugj~&}cfxRCVN4dFPg!&4b z{@FeTCU+FPdqqTyM)ub917S#tbodJ!prg zZPjpu8;4KZf|z^Q(km*xG>F$^y||!dWgV`y4wJD;fDJCT#^FF9358Z3la7!-0ULbv<6?cSkQ|(Ig^*NT2U93 zgX<}FHdm9Wb(FW8+TeVU*5`wZO-@X{QR|_m8tAq5LkOP<598IVNrl;BKBLQ;Dr4Hc zENv-~!juL^FLWk?@Wd{_WS0x>G}giscaoC}WwpEnV&eqah99;uE=NKhv)4C2rrU+{rOa)yiYAgmK z4K`zB$;-L|kHZ5Py#r1QbZaks7k9uv0nV?~YlDH*3Or_L+o%ET;{R3s}= z5kxJ*zUN9I(Y2;t70%Z6p`d7**Xjn~E@$IrP$7~EtHJnkU7TtBlTbHFSD55@eW_4Z zWL?$46B~N-L8T;iQ-B+1XxTjs&sRI}EF-r_dkt2J zgj(lwqGFu%lK~#(XsBW|;A0)U>9?7bE>`MIzXN-4sb-wIoTGvk_knu}BZl+)DRXFr zVru|?jSg8fln3Q)-4up=0hIM>^)P}Kl|zi?^WH5aizDOQ?(s&~ZDhJCZlk9`R5si% zU!0Y55cljtcs+z6GoyZBZ*{k=ENhyi7ATwO!gjQ{QTV!Q8*`2{d{*Tl`zrgi!+qCI z^xJ)enK@UM7t0G8{1NU1ugeCH+#UF|BUH)R374%l_{HgfBhE1-fGT4o#lwWN7VbN? zz`HR49`X*ap^{8_sU&CA!d!9LZIr!Y4y+yOW62cUbh`Phl$SM0RQ9uE4|x&ILx2@C z(#TuTFzKcjn|L!)gbmq^u4b5R94lD^blUD`woF;`LfT$U_E)~D;pfzxOcn5QrCKkX zu_c(r_Su5$8cM=%+$4O+1>sGT0Mk`I80EsOGiiIFsOqw)j90eWjNm5mh7c%pxMSh$ zc>R>s!n|%&7{Yf|c>0a?WeeIET3XuDXt;r!8laR@UuB5K5m6F8H%G}4Ry)0P4x0Nb zH(&%}W+x(gaUIpXDQxuEsVfqC1g*+2vj@a$+>`KtRGIMllQ;ns5+zhBZ4e?YhBww` zm4(7l8fU_*oBjy?M;KRlQ+sjY8hib}g%(`+1{Y|Q1^=1F@gB4Bq_5r!yzl}2U(NUZ UPKXJlt*!9GRu3BqaH4Meshes)) { v3 CameraP = GetSimSpaceP(World, Camera->CurrentP); - v3 ChunkP = GetSimSpaceP(World, Chunk->WorldP); - /* SyncGpuBuffersImmediate(Engine, &Chunk->Meshes); */ - AssertNoGlErrors; - - v3 Basis = GetRenderP(Engine, Chunk->WorldP); // - (Chunk->DimInChunks/2.f); + v3 Basis = GetRenderP(Engine, Chunk->WorldP); DrawLod(Engine, Shader, &Chunk->Meshes, 0.f, Basis, Quaternion(), V3(Chunk->DimInChunks)); AssertNoGlErrors; } diff --git a/src/engine/world.cpp b/src/engine/world.cpp index e2afe6abb..833388165 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -604,11 +604,10 @@ link_internal s32 SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue *Queue, octree_node *NodeToSplit, octree_node *Parent, memory_arena *Memory) { UNPACK_ENGINE_RESOURCES(Engine); + s32 Result = False; SyncGpuBuffersAsync(Engine, &NodeToSplit->Chunk.Meshes); - s32 Result = False; - Assert(NodeToSplit->Chunk.Dim % World->ChunkDim == V3i(0)); b32 PushedToPriorityQueue = False; @@ -634,7 +633,6 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue if (OctreeBranchShouldCollapse(Engine, NodeToSplit)) { MergeOctreeChildren(Engine, NodeToSplit); - /* Result = True; */ } else { @@ -646,9 +644,6 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[5], NodeToSplit, Memory); ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[6], NodeToSplit, Memory); ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[7], NodeToSplit, Memory); - - /* NodeToSplit->AllChildrenCanDraw = (ChildrenReadyToDraw == 8); */ - /* Result = NodeToSplit->AllChildrenCanDraw; */ } } break; @@ -769,7 +764,7 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt { Push(MainDrawList, &Chunk); Push(ShadowMapDrawList, &Chunk); - Assert(Chunk->FilledCount); + /* Assert(Chunk->FilledCount); */ } } break; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index e77df8bd1..08fcc0a33 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -874,32 +874,15 @@ MarkBoundaryVoxels_NoExteriorFaces( u64 *Occupancy, u64 nzBits = Occupancy[OccupancyIndex-64]; - u64 LeftFaces = (Bits>>1) & ~Bits; - u64 RightFaces = (Bits<<1) & ~Bits; - /* u64 LeftFaces = Bits & ~(Bits >> 1ULL); */ - /* u64 RightFaces = Bits & ~(Bits << 1ULL); */ + u64 RightFaces = (Bits>>1) & ~Bits; + u64 LeftFaces = (Bits<<1) & ~Bits; - /* u64 FrontFaces = 0; */ - /* u64 BackFaces = 0; */ u64 FrontFaces = Bits & (~yBits); u64 BackFaces = Bits & (~nyBits); - /* u64 TopFaces = 0; */ - /* u64 BotFaces = 0; */ u64 TopFaces = Bits & (~zBits); u64 BotFaces = Bits & (~nzBits); - /* Assert(LeftFaces == RightFaces); */ - /* Assert(LeftFaces == FrontFaces); */ - /* Assert(LeftFaces == BackFaces); */ - /* Assert(LeftFaces == TopFaces); */ - /* Assert(LeftFaces == BotFaces); */ - - /* if (LeftFaces) */ - /* { */ - /* int foo = 3; */ - /* } */ - FaceMasks[(OccupancyIndex*6)+0] = LeftFaces; FaceMasks[(OccupancyIndex*6)+1] = RightFaces; FaceMasks[(OccupancyIndex*6)+2] = FrontFaces; @@ -1388,15 +1371,13 @@ poof( u64 TopFaces = FaceMasks[(OccupancyIndex*6)+4]; u64 BotFaces = FaceMasks[(OccupancyIndex*6)+5]; - /* Assert(LeftFaces == RightFaces); */ - while (LeftFaces) { v3 Dim = V3(0.f, 1.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - LeftFaceVertexData( VertexOffset+V3(s32(xOffset)+1, y, z), Dim, VertexData); + LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_LeftFaceNormalData, Materials); } @@ -1405,7 +1386,7 @@ poof( v3 Dim = V3(0.f, 1.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + RightFaceVertexData( VertexOffset+V3(s32(xOffset)+1, y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_RightFaceNormalData, Materials); } @@ -3554,7 +3535,9 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, MarkBoundaryVoxels_NoExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->FaceMasks, SyntheticChunk->Voxels, SynChunkDim, {}, SynChunkDim); } - CopyChunkOffset(SyntheticChunk, SynChunkDim, DestChunk, DestChunk->Dim, Global_ChunkApronMinDim); + /* CopyChunkOffset(SyntheticChunk, SynChunkDim, DestChunk, DestChunk->Dim, Global_ChunkApronMinDim); */ + + DestChunk->FilledCount = SyntheticChunk->FilledCount; // NOTE(Jesse): You can use this for debug, but it doesn't work if you change it to NoExteriorFaces /* MarkBoundaryVoxels_MakeExteriorFaces(DestChunk->Voxels, DestChunk->Dim, {}, DestChunk->Dim); */ @@ -3606,11 +3589,12 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, RebuildWorldChunkMesh(Thread, SyntheticChunk, Global_ChunkApronMinDim, Global_ChunkApronMinDim+DestChunk->Dim, MeshBit_Lod4, TempMesh, Thread->TempMemory); TempMesh->At = 0; } + Assert( DestChunk->FilledCount == SyntheticChunk->FilledCount); } #define FINALIZE_MESH_FOR_CHUNK(Src, Dest, Bit) \ { \ - auto *SrcMesh = (Src)->Meshes.E[ToIndex(Bit)]; \ + auto *SrcMesh = (Src)->Meshes.E[ToIndex(Bit)]; \ if (SrcMesh) { \ if (SrcMesh->At) { \ AtomicReplaceMesh(&(Dest)->Meshes, Bit, SrcMesh, SrcMesh->Timestamp); \ From ccf6f9d086ac33d6d5ae7d6ffb64db6596cc33fa Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 28 Sep 2024 17:03:25 -0700 Subject: [PATCH 049/421] Cleaning up a little bit --- examples/terrain_gen/game.cpp | 10 +++++----- examples/terrain_gen/game_constants.h | 4 ++-- external/bonsai_stdlib | 2 +- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 6 ++++-- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 6 ++++-- jesse.bonsai.rdbg | Bin 14383 -> 14621 bytes jesse.make.sh | 2 +- src/engine/world.cpp | 2 +- src/engine/world_chunk.cpp | 16 ++++++---------- 10 files changed, 25 insertions(+), 25 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 8a52715c1..8c028fced 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -482,12 +482,12 @@ BONSAI_API_WORKER_THREAD_CALLBACK() // FBM params /* v3 Period = V3(18000); */ /* s32 Amplititude = 10000; */ - /* s32 StartingZDepth = 0; */ - /* u32 Octaves = 7; */ + /* s32 StartingZDepth = 5000; */ + /* u32 Octaves = 3; */ - /* v3 Period = V3(125); */ - /* s32 Amplititude = 125; */ - /* s32 StartingZDepth = 0; */ + /* v3 Period = V3(500); */ + /* s32 Amplititude = 500; */ + /* s32 StartingZDepth = 500; */ /* u32 Octaves = 1; */ v3 Period = V3(1000); diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 506866f94..5bea3de83 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -11,8 +11,8 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ // 26km -/* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ -g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km +g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km +/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 74518c031..4cce8aee9 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 74518c03139df474917dc7341d88b61d19577744 +Subproject commit 4cce8aee972739137c572a73f610b445bee675a0 diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index e1f35b979..8c7317d59 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2883:0 +// src/engine/world_chunk.cpp:2885:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index d5056ae42..d91fc511f 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,7 +1,7 @@ -// src/engine/world_chunk.cpp:1926:0 +// src/engine/world_chunk.cpp:1928:0 link_internal void -BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, +BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, v3i SrcChunkDim, v3i SrcChunkMin, @@ -27,6 +27,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, v3 VertexData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; + FillArray(VertexMaterial(PackHSVColor(HSV_GRASS_GREEN), 0.f, 0.f), Materials, VERTS_PER_FACE); + s32 Result = 0; for ( s32 zBlock = 1; zBlock < 63; ++zBlock ) { diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 1b243e08d..80e6fa8d2 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,7 +1,7 @@ -// src/engine/world_chunk.cpp:1929:0 +// src/engine/world_chunk.cpp:1931:0 link_internal void -BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, +BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, v3i SrcChunkDim, v3i SrcChunkMin, @@ -27,6 +27,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, v3_u8 VertexData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; + FillArray(VertexMaterial(PackHSVColor(HSV_GRASS_GREEN), 0.f, 0.f), Materials, VERTS_PER_FACE); + s32 Result = 0; for ( s32 zBlock = 1; zBlock < 63; ++zBlock ) { diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 5db64276f3e3652da62b14b9209b1d826f2c7f96..327ca5677d1db310650cc518f4b366a460d43005 100644 GIT binary patch delta 2203 zcmYjSYitx%6z<)}?9RTs+jh5fyN_;P+sE`t>9$1+v=vKhp@1MEDbww=GqNvcc7Yld zqF`cTg7n0M9|{r^;|~=B#t=gSYW!t_G^l^j0Kp&f1EdL26Jzw;JJaGOoBNn^&i&4J z&i(F%!h7o5TdkMN%E~suaz)CeDcQLh@$k`ZL2ifgND{7gaX>tSaNJ{q=|DTKc_Kr( zrTKKJ2C`kvgqhjX`AlA2^*I*c(B`x&31>T#Y@Fy!l3p6mJ15PS7G~yD@raNv6t-cc zBy4v_tfHn#Md<1{NM>nt*xxZ|7UWSj|3rvEKsaQ4`Kf&)$+7(*VT7CSL8vdXE~IbUvr$Gtx{}OsjcKkoT^I z*wRozCf88jtZ#-hL7HDVoU3jntnnD8=QeX5w7%V%daNmV2ayMu)- zBw8_~j?o7li6E@llQ7Zgg4=afu;OXqq+C%cE`m@uPBx-pGvjhNFS1S@-W$IDjRCO;l6bQHgU_iL=UV$F$o&S|8b}0Fuu|1cd)UfuIV)XJRwZ#xko7!sRUW-Tf%AKj z#P=)5VQ1y!>LoHQWZ-Ibf|6q`Df^$S9Jneel*BFy@W~xo@(jUq6%M@1$Su-diCH3{ z)`g59>o@&afX8;!yJ93z&MJ7_Z!^iAEY<6N2iD+xb0~#E zQviOA4q8-f56at`C=8Ydu&tLXh7hzM?_)Hd@vSFmoay&=yDz#XBUA3Ujot=9exiQa z{G615xOXeU>n04D8T$uzRCL*jlB$YIjpRdja11*;8yb~@mIa})`noiW_X!??2w?m5=O zJFz4@;2l1_OJ<6T1!+df&F7aqdfJ!Gfz?ZWsHGLIJ3V|_%u1>#$U9lE2fTpdk%Y@; zq>;CvVA4a+)$?Yg2n(_eRZSP$IA*d6=!D(RWSO$&gOt63>@=(@`FSNH(GGaQ$kqoZ zZ3!l^y|y5GhFah^ZUR2!g7CU22~+NJ7~#UKGAVm5uV|7Wj~Pd;LvR!LLL@14xNYI= z`1}-=+=8ZO7{Wa_-hTc2k_BZ9B`syC)78L31yIZ=FEK=8h^Pg=G)Kt+mOFiP_L?^s zFJJ^>W+x(geht-vDXiDnsmUU01kFkpv-`xSzmssExJ~%{iChw75+$@%nju6Qb#1In z%ca~w>Sx8LoBjy?;dFI3TnvDO0rIOcpiSZj8cc+blJk-s&vQ&42Vu_ODyZ?*?{#Ku0Td q^@T6J+Ph3V)I^6%NLdZ6^t}PYeOCCf&r9@Gp)UqUHhfH|Pw+pqUzNZB delta 2055 zcmYLKOKe+36zw>P?PtfoIJWckC(X~_I7#!dW9WydZAhDjpsG|zbsXm<&#LW&XD1X@ zD5Z$PlJu}bd|Gt@i$V(#i*6vT*i;~zg2b+(MXH2Ugc6}jEKtLp@k_8|`OeJsoqNx@ z_sqxYjm7tm*4)~&XHOohy+LGIlWy=F&NE-_VE?{&e_vv7IHvUAQ8-wWRhEip@tZD+ zTfLoN)j=%w`th?fid3(e4RRlB$L+Y-8OD!s2~!*>TfnGX+`A;9)dO=T79ijqIQ}Eb2}0cGuycH-v{> zW;RMlh4Eomi*~*eG~jfXi%QzL(br|dAs2af8gVrq#uuFu`8ryXX8BxsNtI*S#l?yL zV|V)4er;vL!w$0s$!41$A9d7HjlAY&J8`j?F35!i^$i{%A=3D#-LZNnsn0It7t|8I zbUcp>?M67-2Z-!YwJH~9@vSc|af9=Ch%g$}DdPh31A9BzF=1`Cb+W8xdGT4B53KDB z)&mD|A#eZ(0tZ-9G(aR!PXLN^u<5S@(^u^4eiJs`NqAc=xIzW{Y5l#g52aY;e9h-z zqE)fzlb{QTUEO>hE1>|@W{1^b!rxxkZor#f6X88TxZDoxucm6bkuuEZdF3fiv}TV9 z(v?;xo@#e_TkX5{rr(B_TE_6TBPo>?m6~~HWM<`=rFpFTy6{u84Qg|OT4c-ZM~~Tn zGtKpAxB6CZ+L3QE>y(tJ{c)3hFsw32_i-HRNX{C^`S`rY@Ee)~}5o z-UZUkLa~&|#gwGjoogIMtkFi5@la12+{o7Y;IB5}Mnfao8$wuVF!1)DXfUuo;ndt9 z(RgjS2k^k-;F%$6mhgec$vMV^-B3lK5dKFQr#E3)RC9$~IkzmA_@!I!7>8G%S)?3} z?JRN9?cuOg&E@iVv$F>qE>0Ouw#z7fH(UmtHul?by-`R^Oc@giJ*oGz2-O~{l1mCQ zwJH6woGmY?!Yq{u=K?mINtEhB_}57YjtHRMb-D;?%GhZWRZM#=a5-%R7w5A;v0_T! z4y4BPTqY~W6ro;@c^b~NJU2(zlz0mq6nO;d8VJ24{&X0%_PWRPyjzZIy=;f#@UU^M zX#XyM^_Xg@fWBh)iBX-f8>w4^(AnGYi^Yd4p=R8%dC+e=NvLXrZBaAD*@XgWo0^lk zvQ6xg_nx(p4GF)MpdI%uFSA#6=jl63J*gkpyLpSf!jb80!~!1D5-i)HOE7UMARH&`}px?vz1j8`>fX_ znq%6upLBH6+8gg39!Lx%66rW^-<^*COLA3Mz`CTTN#IwMr8;V9-lR|Jn@s7Y;q-Dp zbx;M22gX)*Qj}EDTM22?bJa8w8G*q=LyF{?KQ0oUkse($)N2Gy8zgM#=jh1@;v0Rl z_G}dON9ZB3VpwkhYKjQdsBDJr4&rfjiWNl67i&g!OT*Z%8m9n3yjnGac-2`VSHr3% zQ=&JA`YvJOY2qtu9ny$+_F=O|bfhpSadPvJK&LmBS+BkHp ztG%S%L|#KFSC~y_md{a@I(nA*htW4iXtnW?#$?|Z^Q>L!KgBHEVd|*4JUjRK1KnD1 m;1M(Pt;+vA2n?OK8~Fb#A0wF_+#b4&)5F(mcY@RAp8o*#zl{?B diff --git a/jesse.make.sh b/jesse.make.sh index 972503c96..60fb9ef2e 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 833388165..8ddcc20df 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -493,7 +493,7 @@ poof(generate_cursor(octree_node_ptr)) #include #define MAX_OCTREE_NODE_BUCKETS (512) -#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (4) +#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (256) struct octree_node_priority_queue { octree_node_ptr_cursor Lists[MAX_OCTREE_NODE_BUCKETS]; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 08fcc0a33..2b10d38f6 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -1329,11 +1329,11 @@ poof( func world_chunk_mesh_functions(buffer_t, vert_t) { link_internal void - BuildWorldChunkMeshFromMarkedVoxels_Naieve_(vert_t.name)( u64 *FaceMasks, - v3i SrcChunkDim, + BuildWorldChunkMeshFromMarkedVoxels_Naieve_(vert_t.name)( u64 *FaceMasks, + v3i SrcChunkDim, - v3i SrcChunkMin, - v3i SrcChunkMax, + v3i SrcChunkMin, + v3i SrcChunkMax, // TODO(Jesse)(immediate, poof): @poof_parens_bug (buffer_t.name) *Dest, @@ -1355,6 +1355,8 @@ poof( vert_t.name VertexData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; + FillArray(VertexMaterial(PackHSVColor(HSV_GRASS_GREEN), 0.f, 0.f), Materials, VERTS_PER_FACE); + s32 Result = 0; for ( s32 zBlock = 1; zBlock < 63; ++zBlock ) { @@ -3422,12 +3424,6 @@ RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOff if (MeshBit == MeshBit_Lod0) { BuildWorldChunkMeshFromMarkedVoxels_Naieve( Chunk->FaceMasks, Chunk->Dim, MinOffset, MaxOffset, TempMesh, 0); - -/* #if VOXEL_DEBUG_COLOR */ -/* BuildWorldChunkMeshFromMarkedVoxels_Naieve( Chunk->Voxels, Chunk->Dim, MinOffset, MaxOffset, TempMesh, 0); */ -/* #else */ -/* BuildWorldChunkMeshFromMarkedVoxels_Greedy( Chunk->Voxels, Chunk->Dim, MinOffset, MaxOffset, TempMesh, 0, TempMem, VertexOffset); */ -/* #endif */ } else { From 6cf8c8f7ac49ffef804cb27b2bb7a76950782135 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 30 Sep 2024 13:17:18 -0700 Subject: [PATCH 050/421] Fix y & z seams --- examples/terrain_gen/game.cpp | 20 +++---- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 33 +++++------ ...ions_untextured_3d_geometry_buffer_v3_u8.h | 33 +++++------ src/engine/terrain.cpp | 17 ++++-- src/engine/world_chunk.cpp | 57 ++++++++----------- 6 files changed, 74 insertions(+), 88 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 8c028fced..01a899222 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -480,22 +480,22 @@ BONSAI_API_WORKER_THREAD_CALLBACK() case TerrainGenType_FBM2D: { // FBM params - /* v3 Period = V3(18000); */ - /* s32 Amplititude = 10000; */ - /* s32 StartingZDepth = 5000; */ - /* u32 Octaves = 3; */ + v3 Period = V3(18000); + s32 Amplititude = 10000; + s32 StartingZDepth = 5000; + u32 Octaves = 6; /* v3 Period = V3(500); */ /* s32 Amplititude = 500; */ /* s32 StartingZDepth = 500; */ /* u32 Octaves = 1; */ - v3 Period = V3(1000); - s32 Amplititude = 800; - s32 StartingZDepth = 1000; - /* s32 StartingZDepth = 0; */ - /* u32 Octaves = 1; */ - u32 Octaves = 6; + /* v3 Period = V3(1000); */ + /* s32 Amplititude = 800; */ + /* s32 StartingZDepth = 1000; */ + /* /1* s32 StartingZDepth = 0; *1/ */ + /* /1* u32 Octaves = 1; *1/ */ + /* u32 Octaves = 6; */ /* v3 Period = V3(2500); */ /* s32 Amplititude = 1500; */ diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 8c7317d59..d7386a8f9 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2885:0 +// src/engine/world_chunk.cpp:2876:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index d91fc511f..d294c8745 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:1928:0 +// src/engine/world_chunk.cpp:1919:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, @@ -19,10 +19,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, TIMED_FUNCTION(); Assert(SrcChunkMin == V3i(0)); - Assert(SrcChunkMax % V3i(64) == V3i(0)); - Assert(SrcChunkDim % V3i(64) == V3i(0)); - - v2i BlockDim = {{64,64}}; + Assert(SrcChunkMax == V3i(0)); + Assert(SrcChunkDim == V3i(64, 66, 66)); v3 VertexData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; @@ -30,13 +28,13 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, FillArray(VertexMaterial(PackHSVColor(HSV_GRASS_GREEN), 0.f, 0.f), Materials, VERTS_PER_FACE); s32 Result = 0; - for ( s32 zBlock = 1; zBlock < 63; ++zBlock ) + for ( s32 zBlock = 0; zBlock < SrcChunkDim.z; ++zBlock ) { s32 z = zBlock; - for ( s32 yBlock = 1; yBlock < 63; ++yBlock ) + for ( s32 yBlock = 0; yBlock < SrcChunkDim.y; ++yBlock ) { s32 y = yBlock; - s32 OccupancyIndex = GetIndex(yBlock, zBlock, BlockDim); + s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); u64 LeftFaces = FaceMasks[(OccupancyIndex*6)+0]; u64 RightFaces = FaceMasks[(OccupancyIndex*6)+1]; @@ -45,58 +43,53 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, u64 TopFaces = FaceMasks[(OccupancyIndex*6)+4]; u64 BotFaces = FaceMasks[(OccupancyIndex*6)+5]; + v3 Dim = V3(1.f, 1.f, 1.f); while (LeftFaces) { - v3 Dim = V3(0.f, 1.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_LeftFaceNormalData, Materials); } while (RightFaces) { - v3 Dim = V3(0.f, 1.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - RightFaceVertexData( VertexOffset+V3(s32(xOffset)+1, y, z), Dim, VertexData); + RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_RightFaceNormalData, Materials); } while (FrontFaces) { - v3 Dim = V3(1.f, 0.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&FrontFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y+1, z), Dim, VertexData); + FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_FrontFaceNormalData, Materials); } while (BackFaces) { - v3 Dim = V3(1.f, 0.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&BackFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_BackFaceNormalData, Materials); } while (TopFaces) { - v3 Dim = V3(1.f, 1.f, 0.f); u64 This = UnsetLeastSignificantSetBit(&TopFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z+1), Dim, VertexData); + TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_TopFaceNormalData, Materials); } while (BotFaces) { - v3 Dim = V3(1.f, 1.f, 0.f); u64 This = UnsetLeastSignificantSetBit(&BotFaces); u32 xOffset = GetIndexOfSingleSetBit(This); - BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_BottomFaceNormalData, Materials); } diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 80e6fa8d2..0a7e19d3f 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:1931:0 +// src/engine/world_chunk.cpp:1922:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, @@ -19,10 +19,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, TIMED_FUNCTION(); Assert(SrcChunkMin == V3i(0)); - Assert(SrcChunkMax % V3i(64) == V3i(0)); - Assert(SrcChunkDim % V3i(64) == V3i(0)); - - v2i BlockDim = {{64,64}}; + Assert(SrcChunkMax == V3i(0)); + Assert(SrcChunkDim == V3i(64, 66, 66)); v3_u8 VertexData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; @@ -30,13 +28,13 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, FillArray(VertexMaterial(PackHSVColor(HSV_GRASS_GREEN), 0.f, 0.f), Materials, VERTS_PER_FACE); s32 Result = 0; - for ( s32 zBlock = 1; zBlock < 63; ++zBlock ) + for ( s32 zBlock = 0; zBlock < SrcChunkDim.z; ++zBlock ) { s32 z = zBlock; - for ( s32 yBlock = 1; yBlock < 63; ++yBlock ) + for ( s32 yBlock = 0; yBlock < SrcChunkDim.y; ++yBlock ) { s32 y = yBlock; - s32 OccupancyIndex = GetIndex(yBlock, zBlock, BlockDim); + s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); u64 LeftFaces = FaceMasks[(OccupancyIndex*6)+0]; u64 RightFaces = FaceMasks[(OccupancyIndex*6)+1]; @@ -45,58 +43,53 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, u64 TopFaces = FaceMasks[(OccupancyIndex*6)+4]; u64 BotFaces = FaceMasks[(OccupancyIndex*6)+5]; + v3 Dim = V3(1.f, 1.f, 1.f); while (LeftFaces) { - v3 Dim = V3(0.f, 1.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_LeftFaceNormalData, Materials); } while (RightFaces) { - v3 Dim = V3(0.f, 1.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - RightFaceVertexData( VertexOffset+V3(s32(xOffset)+1, y, z), Dim, VertexData); + RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_RightFaceNormalData, Materials); } while (FrontFaces) { - v3 Dim = V3(1.f, 0.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&FrontFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y+1, z), Dim, VertexData); + FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_FrontFaceNormalData, Materials); } while (BackFaces) { - v3 Dim = V3(1.f, 0.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&BackFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_BackFaceNormalData, Materials); } while (TopFaces) { - v3 Dim = V3(1.f, 1.f, 0.f); u64 This = UnsetLeastSignificantSetBit(&TopFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z+1), Dim, VertexData); + TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_TopFaceNormalData, Materials); } while (BotFaces) { - v3 Dim = V3(1.f, 1.f, 0.f); u64 This = UnsetLeastSignificantSetBit(&BotFaces); u32 xOffset = GetIndexOfSingleSetBit(This); - BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_BottomFaceNormalData, Materials); } diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 844660161..2c6aa6aba 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -70,7 +70,11 @@ Terrain_FBM2D( world_chunk *Chunk, memory_arena *TempArena = GetTranArena(); #endif - v3i NoiseDim = RoundUp(Chunk->Dim/2, V3i(16)); // + 2; + s32 NoiseUpsampleFactor = 1; + + /* v3i NoiseDim = RoundUp(Chunk->Dim/2, V3i(16)); */ + v3i NoiseDim = RoundUp(Chunk->Dim/NoiseUpsampleFactor, V3i(16)); + /* v3i NoiseDim = Chunk->Dim; */ // NOTE(Jesse): This must hold true for using any Noise_16x func Assert(NoiseDim % V3i(16) == V3i(0)); @@ -116,7 +120,7 @@ Terrain_FBM2D( world_chunk *Chunk, v3i Basis = Chunk->WorldP; for ( s32 z = 0; z < NoiseDim.z; ++ z) { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, z*2, Chunk->DimInChunks); + f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, z*NoiseUpsampleFactor, Chunk->DimInChunks); f32 WorldZBiased = zCoord - zMin; v3 InteriorPeriod = Period; @@ -128,7 +132,7 @@ Terrain_FBM2D( world_chunk *Chunk, for ( s32 y = 0; y < NoiseDim.y; ++ y) { - f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, y*2, Chunk->DimInChunks); + f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, y*NoiseUpsampleFactor, Chunk->DimInChunks); InteriorPeriod = Period; RangeIterator_t(u32, OctaveIndex, Octaves) @@ -148,7 +152,7 @@ Terrain_FBM2D( world_chunk *Chunk, { RangeIterator(ValueIndex, 16) { - xCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(x, Basis, (x+ValueIndex)*2, Chunk->DimInChunks)) / InteriorPeriod.x; + xCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(x, Basis, (x+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)) / InteriorPeriod.x; } auto Index = 0; auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); @@ -174,6 +178,7 @@ Terrain_FBM2D( world_chunk *Chunk, } } +#if 1 for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, zChunk, Chunk->DimInChunks); @@ -183,7 +188,8 @@ Terrain_FBM2D( world_chunk *Chunk, for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) { v3i ChunkP = V3i(xChunk, yChunk, zChunk); - v3i NoiseP = V3i(xChunk, yChunk, zChunk)/2; + /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ + v3i NoiseP = V3i(xChunk, yChunk, zChunk)/NoiseUpsampleFactor; s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); @@ -224,6 +230,7 @@ Terrain_FBM2D( world_chunk *Chunk, } } } +#endif diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 2b10d38f6..bcd118b7b 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -850,32 +850,30 @@ MarkBoundaryVoxels_NoExteriorFaces( u64 *Occupancy, TIMED_FUNCTION(); auto MinDim = SrcChunkMin; - auto MaxDim = Min(SrcChunkDim, SrcChunkMax); // SrcChunkMin+DestChunkDim+1 + auto MaxDim = Min(SrcChunkDim, SrcChunkMax); v3i InnerDim = MaxDim-MinDim; Assert(MinDim == V3i(0)); - Assert(MaxDim % V3i(64) == V3i(0)); - Assert(SrcChunkDim % V3i(64) == V3i(0)); - - v2i BlockDim = {{64,64}}; + Assert(MaxDim ==V3i(64, 66, 66)); + Assert(SrcChunkDim == V3i(64, 66, 66)); s32 Result = 0; - for ( s32 zBlock = 1; zBlock < 63; ++zBlock ) + for ( s32 zBlock = 1; zBlock < SrcChunkDim.z-1; ++zBlock ) { - for ( s32 yBlock = 1; yBlock < 63; ++yBlock ) + for ( s32 yBlock = 1; yBlock < SrcChunkDim.y-1; ++yBlock ) { - s32 OccupancyIndex = GetIndex(yBlock, zBlock, BlockDim); + s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); u64 Bits = Occupancy[OccupancyIndex]; u64 yBits = Occupancy[OccupancyIndex+1]; u64 nyBits = Occupancy[OccupancyIndex-1]; - u64 zBits = Occupancy[OccupancyIndex+64]; - u64 nzBits = Occupancy[OccupancyIndex-64]; + u64 zBits = Occupancy[OccupancyIndex+SrcChunkDim.z]; + u64 nzBits = Occupancy[OccupancyIndex-SrcChunkDim.z]; - u64 RightFaces = (Bits>>1) & ~Bits; - u64 LeftFaces = (Bits<<1) & ~Bits; + u64 RightFaces = (Bits>>1) & ~Bits; + u64 LeftFaces = (Bits<<1) & ~Bits; u64 FrontFaces = Bits & (~yBits); u64 BackFaces = Bits & (~nyBits); @@ -1347,10 +1345,8 @@ poof( TIMED_FUNCTION(); Assert(SrcChunkMin == V3i(0)); - Assert(SrcChunkMax % V3i(64) == V3i(0)); - Assert(SrcChunkDim % V3i(64) == V3i(0)); - - v2i BlockDim = {{64,64}}; + Assert(SrcChunkMax == V3i(0)); + Assert(SrcChunkDim == V3i(64, 66, 66)); vert_t.name VertexData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; @@ -1358,13 +1354,13 @@ poof( FillArray(VertexMaterial(PackHSVColor(HSV_GRASS_GREEN), 0.f, 0.f), Materials, VERTS_PER_FACE); s32 Result = 0; - for ( s32 zBlock = 1; zBlock < 63; ++zBlock ) + for ( s32 zBlock = 0; zBlock < SrcChunkDim.z; ++zBlock ) { s32 z = zBlock; - for ( s32 yBlock = 1; yBlock < 63; ++yBlock ) + for ( s32 yBlock = 0; yBlock < SrcChunkDim.y; ++yBlock ) { s32 y = yBlock; - s32 OccupancyIndex = GetIndex(yBlock, zBlock, BlockDim); + s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); u64 LeftFaces = FaceMasks[(OccupancyIndex*6)+0]; u64 RightFaces = FaceMasks[(OccupancyIndex*6)+1]; @@ -1373,58 +1369,53 @@ poof( u64 TopFaces = FaceMasks[(OccupancyIndex*6)+4]; u64 BotFaces = FaceMasks[(OccupancyIndex*6)+5]; + v3 Dim = V3(1.f, 1.f, 1.f); while (LeftFaces) { - v3 Dim = V3(0.f, 1.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_LeftFaceNormalData, Materials); } while (RightFaces) { - v3 Dim = V3(0.f, 1.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - RightFaceVertexData( VertexOffset+V3(s32(xOffset)+1, y, z), Dim, VertexData); + RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_RightFaceNormalData, Materials); } while (FrontFaces) { - v3 Dim = V3(1.f, 0.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&FrontFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y+1, z), Dim, VertexData); + FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_FrontFaceNormalData, Materials); } while (BackFaces) { - v3 Dim = V3(1.f, 0.f, 1.f); u64 This = UnsetLeastSignificantSetBit(&BackFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_BackFaceNormalData, Materials); } while (TopFaces) { - v3 Dim = V3(1.f, 1.f, 0.f); u64 This = UnsetLeastSignificantSetBit(&TopFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z+1), Dim, VertexData); + TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_TopFaceNormalData, Materials); } while (BotFaces) { - v3 Dim = V3(1.f, 1.f, 0.f); u64 This = UnsetLeastSignificantSetBit(&BotFaces); u32 xOffset = GetIndexOfSingleSetBit(This); - BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_BottomFaceNormalData, Materials); } @@ -3479,7 +3470,9 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, /* v3i SynChunkDimMin = (DestChunk->Dim + Global_ChunkApronDim); */ v3i SynChunkDimMin = (DestChunk->Dim); Assert(SynChunkDimMin == V3i(64)); - v3i SynChunkDim = RoundToMultiple(SynChunkDimMin, V3i(MIN_TERRAIN_NOISE_WIDTH)); + /* v3i SynChunkDim = RoundToMultiple(SynChunkDimMin, V3i(MIN_TERRAIN_NOISE_WIDTH)); */ + /* v3i SynChunkDim = SynChunkDimMin + V3i(0, 2, 4); */ + v3i SynChunkDim = SynChunkDimMin + V3i(0, 2, 2); v3i SynChunkP = DestChunk->WorldP; world_chunk *SyntheticChunk = AllocateWorldChunk(SynChunkP, SynChunkDim, DestChunk->DimInChunks, Thread->TempMemory); From 7b3af39ee544656f9c8823642976e5995712cf88 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 1 Oct 2024 16:42:23 -0700 Subject: [PATCH 051/421] Initial implementation of borders compiling but totally broken --- generated/block_array_entity_ptr_688856411.h | 2 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 16 + ..._editor_ui_for_compound_type_world_chunk.h | 16 + .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- ...e_string_table_world_chunk_mesh_bitfield.h | 2 +- ...rate_string_table_world_chunk_mesh_index.h | 2 +- generated/maybe_chunk_data.h | 2 +- generated/maybe_standing_spot.h | 2 +- generated/serdes_struct_world_chunk.h | 28 ++ ...nctions_untextured_3d_geometry_buffer_v3.h | 14 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 14 +- jesse.bonsai.rdbg | Bin 14621 -> 14214 bytes readme.md | 3 + src/engine/asset.h | 1 + src/engine/debug.cpp | 2 +- src/engine/editor.cpp | 4 +- src/engine/terrain.cpp | 307 ++++++++++++------ src/engine/voxel_face.h | 12 +- src/engine/voxel_synthesis.cpp | 2 +- src/engine/world_chunk.cpp | 32 +- src/engine/world_chunk.h | 8 + src/engine/world_update.cpp | 2 +- src/tests/perlin_perf.cpp | 2 +- 29 files changed, 337 insertions(+), 150 deletions(-) diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h index c6a1d1512..750e0a7ce 100644 --- a/generated/block_array_entity_ptr_688856411.h +++ b/generated/block_array_entity_ptr_688856411.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:305:0 +// src/engine/world_chunk.h:310:0 struct entity_ptr_block { diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index 2a459dc7b..f19693e1d 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:445:0 +// src/engine/world_chunk.h:453:0 struct world_chunk_ptr_block { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index a13878e3b..260144c30 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:486:0 +// src/engine/world_chunk.h:494:0 struct standing_spot_block { diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index ab71211e4..708235c0a 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:513:0 +// src/engine/world_chunk.h:521:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index e90975cdf..d6d8a3a53 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:442:0 +// src/engine/world_chunk.h:450:0 struct world_chunk_ptr_buffer { diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index b341112ed..51edbbaa4 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -70,6 +70,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, Element->xOccupancyBorder), + CSz("xOccupancyBorder"), + Params + ); + + + + + + + PushNewRow(Ui); DoEditorUi(Ui, diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index b47f3bb64..19008502f 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -85,6 +85,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, Element->xOccupancyBorder), + CSz("xOccupancyBorder"), + Params + ); + + + + + + + PushNewRow(Ui); DoEditorUi(Ui, diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 7a55dd24b..df6e5ff9f 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:519:0 +// src/engine/world_chunk.h:527:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index d7386a8f9..309eb5657 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2876:0 +// src/engine/world_chunk.cpp:2890:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index 6485449be..a7d9819e8 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:516:0 +// src/engine/world_chunk.h:524:0 struct standing_spot_stream_chunk { diff --git a/generated/generate_string_table_world_chunk_mesh_bitfield.h b/generated/generate_string_table_world_chunk_mesh_bitfield.h index 7a67efaf2..b06913d4d 100644 --- a/generated/generate_string_table_world_chunk_mesh_bitfield.h +++ b/generated/generate_string_table_world_chunk_mesh_bitfield.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:214:0 +// src/engine/world_chunk.h:219:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_bitfield Type) diff --git a/generated/generate_string_table_world_chunk_mesh_index.h b/generated/generate_string_table_world_chunk_mesh_index.h index 116473af9..b2be1b712 100644 --- a/generated/generate_string_table_world_chunk_mesh_index.h +++ b/generated/generate_string_table_world_chunk_mesh_index.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:217:0 +// src/engine/world_chunk.h:222:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_index Type) diff --git a/generated/maybe_chunk_data.h b/generated/maybe_chunk_data.h index e470bac98..11ae27c43 100644 --- a/generated/maybe_chunk_data.h +++ b/generated/maybe_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:178:0 +// src/engine/world_chunk.h:183:0 struct maybe_chunk_data { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index a20f38eba..8b2090786 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:483:0 +// src/engine/world_chunk.h:491:0 struct maybe_standing_spot { diff --git a/generated/serdes_struct_world_chunk.h b/generated/serdes_struct_world_chunk.h index 939647387..14e093682 100644 --- a/generated/serdes_struct_world_chunk.h +++ b/generated/serdes_struct_world_chunk.h @@ -48,6 +48,11 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) + if (Element->xOccupancyBorder) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } + + + if (Element->FaceMasks) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } @@ -81,6 +86,10 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) + if (Element->xOccupancyBorder) { Result &= Serialize(Bytes, Element->xOccupancyBorder); } + + + if (Element->FaceMasks) { Result &= Serialize(Bytes, Element->FaceMasks); } @@ -149,6 +158,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * + b64 HadxOccupancyBorderPointer = Read_u64(Bytes); + Assert(HadxOccupancyBorderPointer < 2); // Should be 0 or 1 + + + b64 HadFaceMasksPointer = Read_u64(Bytes); Assert(HadFaceMasksPointer < 2); // Should be 0 or 1 @@ -196,6 +210,20 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * } + if (HadxOccupancyBorderPointer) + { + umm Count = 1; + + + if (Element->xOccupancyBorder == 0) + { + Element->xOccupancyBorder = Allocate(u64, Memory, Count); + } + + Result &= Deserialize(Bytes, Element->xOccupancyBorder, Memory, Count); + } + + if (HadFaceMasksPointer) { umm Count = 1; diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index d294c8745..238d80daa 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:1919:0 +// src/engine/world_chunk.cpp:1933:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, @@ -49,7 +49,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_LeftFaceNormalData, Materials); } @@ -57,7 +57,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_RightFaceNormalData, Materials); } @@ -65,7 +65,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&FrontFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_FrontFaceNormalData, Materials); } @@ -73,7 +73,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&BackFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_BackFaceNormalData, Materials); } @@ -81,7 +81,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&TopFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_TopFaceNormalData, Materials); } @@ -89,7 +89,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&BotFaces); u32 xOffset = GetIndexOfSingleSetBit(This); - BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_BottomFaceNormalData, Materials); } diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 0a7e19d3f..164e7f97c 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:1922:0 +// src/engine/world_chunk.cpp:1936:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, @@ -49,7 +49,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_LeftFaceNormalData, Materials); } @@ -57,7 +57,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_RightFaceNormalData, Materials); } @@ -65,7 +65,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&FrontFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_FrontFaceNormalData, Materials); } @@ -73,7 +73,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&BackFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_BackFaceNormalData, Materials); } @@ -81,7 +81,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&TopFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_TopFaceNormalData, Materials); } @@ -89,7 +89,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&BotFaces); u32 xOffset = GetIndexOfSingleSetBit(This); - BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, v3_u8_BottomFaceNormalData, Materials); } diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 327ca5677d1db310650cc518f4b366a460d43005..bdec546442ce6cabce532ff1e5e56fdb6d0a318a 100644 GIT binary patch delta 2148 zcmZ8iU2Icj81`$owx?bH*0tN%=+7A2`ghh2Cu=D(#sbX2z!3yuLRY%8oreC*({|#8 z8Dc~)9gkN=1;T}1prVTx-Y61ph(;`#jo*kwo9Km94EATRn1nFTCGr?uj0HTg|l%lxowy`kcoTPcHH-+ z@F-?x)8sIWgV8Rm#N2o_x*JDg?aRv%SY!KfJ=#u7VO+4gF%#W{m4N`R4t2vC?ZzvS zDUs^|*?~%=l^qc-rKlINNDIZecHH%F8ygX`rLYGV9hCE6z>rPglYwJw+nSjvpDQU^ z4tL^F+V`M1U|~DOX4zzgf1njR{Sn;hx3O_TDvG!JyY>C0uo=hty_C}0iGhAA#=KZHJYbkkW6bVsoE;!s){N?wqJG|nz z65hjv%U7WtO_VJkWX$tLo_U57t&b-J>FP!g9_VNJH@eoxt3fB8?ViA=?zB`>H7aIV zZM4j+a-u$utAT!e*X4xPm7)^4?+aqkX2$WZHuO3I%U4_|Zm=2DjL7}&1|Lz(o8%jp z(^TIwB�kzmba=O8FK|Go|VEF(rgcDC~>kWN&})m%YV(_(e5a|CjylQQG39(4GS zZwVmSWW~oFo#^d|V5!5*%YUlF%!Y(fSBFIHb>BCP+wE>18R9kxZ?$_k$Cz@NjRXqe zzn5`(Q}zX|P%6|4i%OLrdfz8=culzliecZ{6o-B792VnTp@^6J265BNDWlHzTEzFJ z*KE++{&B)&5fUS-6C$8{Z9x{J+#^P%sv_5tF)b?jT16AXYK?F%;ie~zYHI|4dkDd8 z0;tzLUP788_BcfrGk!a~9w))Y`7DtySshw~)RLXcgArN=FBQ{b979Vm%vUD zN2s-f&`aZYw?!|n8_dM3Wxrm_E~xHyHmN5aT<5P1)7=fwms|nSs#7itRcjaqR}X%$ z2XGCU0Li#bJeXJ@tCiyWJV(w;Gd>7Ltz zDT9r=>zqOK*bQc8DwdOBA@DG>bmOsVxKMT_TERIHK!AMpXdUx^L{7}8*qVZToBi(*3 zSF9`5SaN8@w!St&f_{p}F}>GTo1OdMcIn|yxA?njSK#5=Yer~m?@DU;7ISgaM%dzP XBke@RB5OSSWWFfl*vMtZe+>KsY<{AF delta 2524 zcmZuyOKcn071iTs$l*^EDT{T1WJ3V95q-no#e)vFch(oRuSC*k!W0nSWwa5H=aq7ff_8Jom4 zPgHo_or5nAoFGicFY7hk*fr>mbEuFF2_PO2*!S}(ft0AT?y9oU+Nx9y={KU>Y(9=| z1b7fidnMCUEcig&CL7H4*WwYks4g*iUL1xuCNDZCo0IdT!S??=xyWtKAkJU2aZi?#9 zJ1+jZzn7fupp^ILAeW@^^}y8rAUb~->sO-*_|S6*ZsYe(gyl7ANR6squb7IVDd={U zx_x1^fF5m#QFw183D^Asd_ENdeWVYrNAjG~ur#X;ceAI+JSyf`D(@w`-R4XY#O&%G z^MP#AE|HhD6dX$(Z8}27%R)WNEloXkCKNA8OL&0Len;DKAV!PE$50K0p zIl@+7rxT9$m2}XhvX+D^=?E;O4#P^?&yssdkuBYTSBHwQK6IL}s=*h1A?#@k2L6=t z*^;NOm?~UL&7$=J^a}LqC{(fm_4!dqeKAzPMEAL7G{_8;u%D=#(7-G-IUl!y4I*hEC9`m&Kg)Xjc>gq+b5hCiX1igj zim93KT5<^!d)!Ir{R|iCoQdkJ19uSa^v%Kbz9Q{mFPm~!J4-bbsVb^=px-AVc7wu; zJ>8ha1Bp}cuin$UL*&}3!I^eDRIx#&S6qht^6gYHa+NA8ERJ~|Jg z`jGzWdR3{x+mVw9uSgg&H+B&GGd>Ofoe8r3j7I#(Z;S9`c%IS594v>s$(nP=1el={ zNVaP>jdPZ=W3>#pnwo-JK_6U+Oybv%Fux5 z_(mDQe#9l&Bb0|7ZUxF*65=ia?uUBdGjEEOWzOHwHB%AQW#_7W2yO-62Z2Hd-NX6u z@v*eVmg$7pkDFnfep_M0gEWSe_OW}!W`hXjKdGi&W{{QPZIlJQ(mm#!IayM^}+sv4d z)mCGhT6w$dKY|~~4iw>R@ilUsyNX+F z`_zwO!;yU`U*5Cr$UV5d&e+G&OP`VmRiVGGE<(BnVYOU<3+2?qUnvC5k_WDpgXBj}sb(q2H13vf6Y4kl1JG&< Ak^lez diff --git a/readme.md b/readme.md index 33f947d60..d599da07e 100644 --- a/readme.md +++ b/readme.md @@ -152,6 +152,9 @@ See the docs on the [build process](docs/01_build_process.md). https://www.intel.com/content/dam/develop/external/us/en/documents/spir-vtointe-ispcgpu-compute-on-the-cpu.pdf https://ispc.github.io/ +[ ] Look into using slang dual CPU/GPU world-gen? + https://github.com/shader-slang/slang + ------------------------------------------------------------------------------- ## Profiler diff --git a/src/engine/asset.h b/src/engine/asset.h index fb4bda2b9..37a41a0b3 100644 --- a/src/engine/asset.h +++ b/src/engine/asset.h @@ -264,6 +264,7 @@ GetChunkDataForAssetModel(asset *Asset, u32 ModelIndex) .Dim = Asset->Chunk.Dim, .Voxels = Asset->Chunk.Voxels, .Occupancy = Asset->Chunk.Occupancy, + .xOccupancyBorder = Asset->Chunk.xOccupancyBorder, .FaceMasks = Asset->Chunk.FaceMasks, .VoxelLighting = Asset->Chunk.VoxelLighting, }; diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index 7dfc28d65..18ef3c90d 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -777,7 +777,7 @@ DoEngineDebug(engine_resources *Engine) { world_chunk *PickedChunk = EngineDebug->PickedChunk; /* MarkBoundaryVoxels_Debug(PickedChunk->Voxels, PickedChunk->Dim); */ - MarkBoundaryVoxels_NoExteriorFaces(PickedChunk->Occupancy, PickedChunk->FaceMasks, PickedChunk->Voxels, PickedChunk->Dim, {}, PickedChunk->Dim); + MarkBoundaryVoxels_NoExteriorFaces(PickedChunk->Occupancy, PickedChunk->xOccupancyBorder, PickedChunk->FaceMasks, PickedChunk->Voxels, PickedChunk->Dim, {}, PickedChunk->Dim); QueueChunkForMeshRebuild(&Plat->LowPriority, PickedChunk); } PushNewRow(Ui); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 5cfc3c21b..c3e833eac 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1331,7 +1331,7 @@ ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *P v3i DestRelativeMinCorner = (-1*SmallestMinOffset) + SrcOffsetMin; - chunk_data D = {SrcChunk->Flags, SrcChunk->Dim, SrcChunk->Occupancy, SrcChunk->FaceMasks, SrcChunk->Voxels, SrcChunk->VoxelLighting}; + chunk_data D = {SrcChunk->Flags, SrcChunk->Dim, SrcChunk->Occupancy, SrcChunk->xOccupancyBorder, SrcChunk->FaceMasks, SrcChunk->Voxels, SrcChunk->VoxelLighting}; world_update_op_shape_params_chunk_data ChunkDataShape = { D, V3(DestRelativeMinCorner) }; Assert(SrcChunk->Dim <= DestChunk->Dim); @@ -2444,7 +2444,7 @@ DoWorldEditor(engine_resources *Engine) Offset = Min(Layer->Settings.Offset.Min, Offset); } - chunk_data D = {Chunk->Flags, Chunk->Dim, Chunk->Occupancy, Chunk->FaceMasks, Chunk->Voxels, Chunk->VoxelLighting}; + chunk_data D = {Chunk->Flags, Chunk->Dim, Chunk->Occupancy, Chunk->xOccupancyBorder, Chunk->FaceMasks, Chunk->Voxels, Chunk->VoxelLighting}; world_update_op_shape_params_chunk_data ChunkDataShape = { D, V3(Offset) + GetSimSpaceP(World, Editor->SelectionRegion.Min) - V3i(1) }; world_edit_shape Shape = diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 2c6aa6aba..e8f830b92 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -41,9 +41,20 @@ Terrain_FBM2D( world_chunk *Chunk, UNPACK_NOISE_PARAMS(NoiseParams); + u32 ChunkSum = 0; + random_series GenColorEntropy = {12653763234231}; - u32 ChunkSum = 0; + Period = Max(Period, V3(1.f)); + + auto PrimeX = U32_8X(501125321); + auto PrimeY = U32_8X(1136930381); + auto PrimeZ = U32_8X(1720413743); + + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + + + u32 Octaves = *(u32*)OctaveCount; #if 0 s32 MinZ = Chunk->WorldP.z*WorldChunkDim.z; @@ -81,156 +92,246 @@ Terrain_FBM2D( world_chunk *Chunk, // NOTE(Jesse): Must be true to use _mm256_store_ps, which we do in the 16x version of perlin /* v3i NoiseDim = Chunk->Dim + 2; */ - r32 *NoiseValues = Allocate(r32, TempArena, Volume(NoiseDim)); - Assert(u64(NoiseValues) % 32 == 0); - /* v3i NormalDim = Chunk->Dim; */ - /* v3 *Normals = Allocate( v3, TempArena, Volume(NormalDim)); */ -#if VOXEL_DEBUG_COLOR - Chunk->NoiseValues = NoiseValues; - Chunk->NormalValues = Normals; -#endif - - Period = Max(Period, V3(1.f)); - - u32 Octaves = *(u32*)OctaveCount; - - - Period = Max(Period, V3(1.f)); + v3i Basis = Chunk->WorldP; - auto PrimeX = U32_8X(501125321); - auto PrimeY = U32_8X(1136930381); - auto PrimeZ = U32_8X(1720413743); + { + r32 *NoiseValues = Allocate(r32, TempArena, Volume(NoiseDim)); + Assert(u64(NoiseValues) % 32 == 0); + /* v3i NormalDim = Chunk->Dim; */ + /* v3 *Normals = Allocate( v3, TempArena, Volume(NormalDim)); */ - u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); +#if VOXEL_DEBUG_COLOR + Chunk->NoiseValues = NoiseValues; + Chunk->NormalValues = Normals; +#endif - // TODO(Jesse): Make this dynamic - Assert(Octaves < 8); - perlin_params zParams[8]; - perlin_params yParams[8]; - perlin_params xParams[16]; - f32 xCoords[16]; + // TODO(Jesse): Make this dynamic + Assert(Octaves < 8); + perlin_params zParams[8]; + perlin_params yParams[8]; + perlin_params xParams[16]; + f32 xCoords[16]; #define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ - f32(basis_chunk_point.channel*WorldChunkDim.channel) \ - + f32(offset)*Chunk->DimInChunks.channel \ - + SrcToDest.channel \ - - v3i Basis = Chunk->WorldP; - for ( s32 z = 0; z < NoiseDim.z; ++ z) - { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, z*NoiseUpsampleFactor, Chunk->DimInChunks); - f32 WorldZBiased = zCoord - zMin; + f32(basis_chunk_point.channel*WorldChunkDim.channel) \ + + f32(offset)*Chunk->DimInChunks.channel \ + + SrcToDest.channel \ - v3 InteriorPeriod = Period; - RangeIterator_t(u32, OctaveIndex, Octaves) - { - zParams[OctaveIndex] = ComputePerlinParameters(F32_8X(zCoord/InteriorPeriod.z), PrimeZ); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); - } - - for ( s32 y = 0; y < NoiseDim.y; ++ y) + for ( s32 z = 0; z < NoiseDim.z; ++ z) { - f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, y*NoiseUpsampleFactor, Chunk->DimInChunks); + f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, z*NoiseUpsampleFactor, Chunk->DimInChunks); + f32 WorldZBiased = zCoord - zMin; - InteriorPeriod = Period; + v3 InteriorPeriod = Period; RangeIterator_t(u32, OctaveIndex, Octaves) { - yParams[OctaveIndex] = ComputePerlinParameters(F32_8X(yCoord/InteriorPeriod.y), PrimeY); + zParams[OctaveIndex] = ComputePerlinParameters(F32_8X(zCoord/InteriorPeriod.z), PrimeZ); InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - for ( s32 x = 0; x < NoiseDim.x; x += 16 ) + for ( s32 y = 0; y < NoiseDim.y; ++ y) { - s32 NoiseIndex = GetIndex(x,y,z, NoiseDim); + f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, y*NoiseUpsampleFactor, Chunk->DimInChunks); - r32 InteriorAmp = r32(Amplitude); - u32 ParamsIndex = 0; InteriorPeriod = Period; - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + RangeIterator_t(u32, OctaveIndex, Octaves) { - RangeIterator(ValueIndex, 16) - { - xCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(x, Basis, (x+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)) / InteriorPeriod.x; - } - auto Index = 0; - auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); - auto _x1 = F32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); - xParams[ParamsIndex++] = ComputePerlinParameters(_x0, PrimeX); - xParams[ParamsIndex++] = ComputePerlinParameters(_x1, PrimeX); + yParams[OctaveIndex] = ComputePerlinParameters(F32_8X(yCoord/InteriorPeriod.y), PrimeY); InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - u64 CycleCountStart = GetCycleCount(); - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + for ( s32 x = 0; x < NoiseDim.x; x += 16 ) { - PerlinNoise_16x_avx2(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); - InteriorAmp = Max(1.f, InteriorAmp/2.f); + s32 NoiseIndex = GetIndex(x,y,z, NoiseDim); + + r32 InteriorAmp = r32(Amplitude); + u32 ParamsIndex = 0; + InteriorPeriod = Period; + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + RangeIterator(ValueIndex, 16) + { + xCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(x, Basis, (x+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)) / InteriorPeriod.x; + } + auto Index = 0; + auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); + auto _x1 = F32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); + xParams[ParamsIndex++] = ComputePerlinParameters(_x0, PrimeX); + xParams[ParamsIndex++] = ComputePerlinParameters(_x1, PrimeX); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } + + u64 CycleCountStart = GetCycleCount(); + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + PerlinNoise_16x_avx2_x(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); + InteriorAmp = Max(1.f, InteriorAmp/2.f); + } + u64 CycleCountEnd = GetCycleCount(); + u64 CyclesElapsed = CycleCountEnd-CycleCountStart; + + engine_debug *ED = GetEngineDebug(); + ED->ChunkGenCyclesElapsed += CyclesElapsed; + ED->CellsGenerated += u64(16*Octaves); } - u64 CycleCountEnd = GetCycleCount(); - u64 CyclesElapsed = CycleCountEnd-CycleCountStart; + } + } + + for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) + { + f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, zChunk, Chunk->DimInChunks); + f32 WorldZBiased = zCoord - zMin; + for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) + { + for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) + { + v3i ChunkP = V3i(xChunk, yChunk, zChunk); + /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ + v3i NoiseP = V3i(xChunk, yChunk, zChunk)/NoiseUpsampleFactor; + + s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); + s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); + +#if 0 + f32 zNoiseV[2]; + f32 yNoiseV[2]; + f32 xNoiseV[2]; + xNoiseV[0] = yNoiseV[0] = zNoiseV[0] = xNoiseV[1] = yNoiseV[1] = zNoiseV[1] = NoiseValues[NoiseIndex]; + + s32 xNoiseIndex = TryGetIndex(NoiseP.x+1, NoiseP.y, NoiseP.z, NoiseDim); + s32 yNoiseIndex = TryGetIndex(NoiseP.x, NoiseP.y+1, NoiseP.z, NoiseDim); + s32 zNoiseIndex = TryGetIndex(NoiseP.x, NoiseP.y, NoiseP.z+1, NoiseDim); - engine_debug *ED = GetEngineDebug(); - ED->ChunkGenCyclesElapsed += CyclesElapsed; - ED->CellsGenerated += u64(16*Octaves); + if (xNoiseIndex > -1) + { + xNoiseV[1] = NoiseValues[xNoiseIndex]; + } + + if (yNoiseIndex > -1) + { + yNoiseV[1] = NoiseValues[yNoiseIndex]; + } + + if (zNoiseIndex > -1) + { + zNoiseV[1] = NoiseValues[zNoiseIndex]; + } + + r32 ThisNoiseV = (NoiseValues[NoiseIndex] + (Lerp(0.5f, xNoiseV[0], xNoiseV[1]) + Lerp(0.5f, yNoiseV[0], yNoiseV[1]) + Lerp(0.5f, zNoiseV[0], zNoiseV[1])) / 3.f)/2.f; +#else + r32 ThisNoiseV = NoiseValues[NoiseIndex]; +#endif + s32 NoiseChoice = ThisNoiseV > WorldZBiased; + ChunkSum += u32(NoiseChoice); + SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); + Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + } } } } -#if 1 - for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, zChunk, Chunk->DimInChunks); - f32 WorldZBiased = zCoord - zMin; - for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) + // Have to multiply by 64 because xOccupancyBorder_ElementCount is the number of + // u64 elements, and we need a value per bit + + v3i BorderValuesDim = V3i(2, xOccupancyBorder_Dim.y, xOccupancyBorder_Dim.z); + const s32 BorderValueCount = xOccupancyBorder_ElementCount*64; + f32 *BorderValues = Allocate(f32, GetTranArena(), BorderValueCount); + // TODO(Jesse): Make this dynamic + Assert(Octaves < 8); + perlin_params zParams[8]; + perlin_params yParams[16]; + perlin_params xParams[8]; + f32 yCoords[16]; + + for ( s32 z = 0; z < NoiseDim.z; ++ z) { - for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) - { - v3i ChunkP = V3i(xChunk, yChunk, zChunk); - /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ - v3i NoiseP = V3i(xChunk, yChunk, zChunk)/NoiseUpsampleFactor; + f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, z*NoiseUpsampleFactor, Chunk->DimInChunks); + f32 WorldZBiased = zCoord - zMin; - s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); - s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); + v3 InteriorPeriod = Period; + RangeIterator_t(u32, OctaveIndex, Octaves) + { + zParams[OctaveIndex] = ComputePerlinParameters(F32_8X(zCoord/InteriorPeriod.z), PrimeZ); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } -#if 0 - f32 zNoiseV[2]; - f32 yNoiseV[2]; - f32 xNoiseV[2]; - xNoiseV[0] = yNoiseV[0] = zNoiseV[0] = xNoiseV[1] = yNoiseV[1] = zNoiseV[1] = NoiseValues[NoiseIndex]; + for ( s32 y = 0; y < NoiseDim.y; y += 16) + { + f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, y*NoiseUpsampleFactor, Chunk->DimInChunks); - s32 xNoiseIndex = TryGetIndex(NoiseP.x+1, NoiseP.y, NoiseP.z, NoiseDim); - s32 yNoiseIndex = TryGetIndex(NoiseP.x, NoiseP.y+1, NoiseP.z, NoiseDim); - s32 zNoiseIndex = TryGetIndex(NoiseP.x, NoiseP.y, NoiseP.z+1, NoiseDim); + s32 BorderIndex = GetIndex(0, y, z, V3i(1, 64, 66)); + Assert(BorderIndex < BorderValueCount); - if (xNoiseIndex > -1) + RangeIterator(ValueIndex, 16) { - xNoiseV[1] = NoiseValues[xNoiseIndex]; + yCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(y, Basis, (y+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)) / InteriorPeriod.y; } + auto _y0 = F32_8X( yCoords[0], yCoords[1], yCoords[2], yCoords[3], yCoords[4], yCoords[5], yCoords[6], yCoords[7] ); + auto _y1 = F32_8X( yCoords[8], yCoords[9], yCoords[10], yCoords[11], yCoords[12], yCoords[13], yCoords[14], yCoords[15] ); - if (yNoiseIndex > -1) + InteriorPeriod = Period; + RangeIterator_t(u32, OctaveIndex, Octaves) { - yNoiseV[1] = NoiseValues[yNoiseIndex]; + yParams[0+OctaveIndex*2] = ComputePerlinParameters(_y0/F32_8X(InteriorPeriod.y), PrimeY); + yParams[1+OctaveIndex*2] = ComputePerlinParameters(_y1/F32_8X(InteriorPeriod.y), PrimeY); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - if (zNoiseIndex > -1) { - zNoiseV[1] = NoiseValues[zNoiseIndex]; + r32 InteriorAmp = r32(Amplitude); + InteriorPeriod = Period; + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + s32 x = -1; + auto xCoord0 = F32_8X(__COMPUTE_NOISE_INPUT(x, Basis, x*NoiseUpsampleFactor, Chunk->DimInChunks)); + xParams[OctaveIndex] = ComputePerlinParameters(xCoord0, PrimeX); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } + + u64 CycleCountStart = GetCycleCount(); + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + PerlinNoise_16x_avx2_y(xParams+OctaveIndex, yParams+(OctaveIndex*2), zParams+OctaveIndex, BorderValues+BorderIndex, InteriorAmp); + InteriorAmp = Max(1.f, InteriorAmp/2.f); + } + u64 CycleCountEnd = GetCycleCount(); + u64 CyclesElapsed = CycleCountEnd-CycleCountStart; + + engine_debug *ED = GetEngineDebug(); + ED->ChunkGenCyclesElapsed += CyclesElapsed; + ED->CellsGenerated += u64(16*Octaves); } + } + } + + for ( s32 zChunk = 0; zChunk < BorderValuesDim.z; ++ zChunk) + { + f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, zChunk, Chunk->DimInChunks); + f32 WorldZBiased = zCoord - zMin; + for ( s32 yChunk = 0; yChunk < BorderValuesDim.y; ++ yChunk) + { + // NOTE(Jesse): This is used to compute the index into buffers + // The actual world positions are -1 and 64 but we're going to use 0 and 1 here + s32 x = 0; + v3i ChunkP = V3i(x, yChunk, zChunk); + v3i NoiseP = V3i(x, yChunk, zChunk)/NoiseUpsampleFactor; + + s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); + s32 BorderIndex = GetIndex(NoiseP, BorderValuesDim); + + r32 ThisNoiseV = BorderValues[BorderIndex]; + + u64 NoiseChoice = ThisNoiseV > WorldZBiased; + Chunk->xOccupancyBorder[zChunk] |= NoiseChoice< WorldZBiased; - ChunkSum += u32(NoiseChoice); - SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); } } } -#endif + diff --git a/src/engine/voxel_face.h b/src/engine/voxel_face.h index c21c53c48..99d0eee1a 100644 --- a/src/engine/voxel_face.h +++ b/src/engine/voxel_face.h @@ -22,14 +22,14 @@ /* global_variable f32 ShimmerStrength = 0.f; */ /* global_variable v3 ShimmerFix = {{ShimmerStrength, ShimmerStrength, ShimmerStrength}}; */ -global_variable v3 TopPlane = {{ 1.f, 1.f, 0.f }}; -global_variable v3 BotPlane = {{ 1.f, 1.f, 0.f }}; +/* global_variable v3 TopPlane = {{ 1.f, 1.f, 0.f }}; */ +/* global_variable v3 BotPlane = {{ 1.f, 1.f, 0.f }}; */ -global_variable v3 LeftPlane = {{ 0.f, 1.f, 1.f }}; -global_variable v3 RightPlane = {{ 0.f, 1.f, 1.f }}; +/* global_variable v3 LeftPlane = {{ 0.f, 1.f, 1.f }}; */ +/* global_variable v3 RightPlane = {{ 0.f, 1.f, 1.f }}; */ -global_variable v3 FrontPlane = {{ 1.f, 0.f, 1.f }}; -global_variable v3 BackPlane = {{ 1.f, 0.f, 1.f }}; +/* global_variable v3 FrontPlane = {{ 1.f, 0.f, 1.f }}; */ +/* global_variable v3 BackPlane = {{ 1.f, 0.f, 1.f }}; */ global_variable v3 v3_RightFaceNormalData[] = { {{ 1, 0, 0}}, {{ 1, 0, 0}}, {{ 1, 0, 0}}, {{ 1, 0, 0}}, {{ 1, 0, 0}}, {{ 1, 0, 0}} }; diff --git a/src/engine/voxel_synthesis.cpp b/src/engine/voxel_synthesis.cpp index 067822df6..c467f5db0 100644 --- a/src/engine/voxel_synthesis.cpp +++ b/src/engine/voxel_synthesis.cpp @@ -76,7 +76,7 @@ BakeVoxelSynthesisRules(const char* InputVox) Vox.ChunkData->Voxels[VIndex].Color = RGBtoPackedHSV(RGB_GRASS_GREEN); } - MarkBoundaryVoxels_NoExteriorFaces( Vox.ChunkData->Occupancy, Vox.ChunkData->FaceMasks, Vox.ChunkData->Voxels, Vox.ChunkData->Dim, {}, Vox.ChunkData->Dim); + MarkBoundaryVoxels_NoExteriorFaces( Vox.ChunkData->Occupancy, Vox.ChunkData->xOccupancyBorder, Vox.ChunkData->FaceMasks, Vox.ChunkData->Voxels, Vox.ChunkData->Dim, {}, Vox.ChunkData->Dim); Assert(Vox.ChunkData->Dim.x % Global_TileDim.x == 0); Assert(Vox.ChunkData->Dim.y % Global_TileDim.y == 0); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index bcd118b7b..6e556648f 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -78,6 +78,7 @@ AllocateWorldChunk(world_chunk *Result, v3i WorldP, v3i Dim, v3i DimInChunks, me { s32 OccupancyCount = (VoxCount+63) / 64; // Add seven so we round up when we divide if there's an extra one (or several) Result->Occupancy = AllocateAlignedProtection(u64, Storage , OccupancyCount, CACHE_LINE_SIZE, false); + Result->xOccupancyBorder = AllocateAlignedProtection(u64, Storage , xOccupancyBorder_ElementCount, CACHE_LINE_SIZE, false); Result->FaceMasks = AllocateAlignedProtection(u64, Storage , 6*OccupancyCount, CACHE_LINE_SIZE, false); Result->Voxels = AllocateAlignedProtection(voxel, Storage , VoxCount, CACHE_LINE_SIZE, false); } @@ -840,6 +841,7 @@ MarkBoundaryVoxels_MakeExteriorFaces( u64 *Occupancy, link_internal s32 MarkBoundaryVoxels_NoExteriorFaces( u64 *Occupancy, + u64 *xOccupancyBorder, u64 *FaceMasks, voxel *Voxels, v3i SrcChunkDim, @@ -865,15 +867,27 @@ MarkBoundaryVoxels_NoExteriorFaces( u64 *Occupancy, { s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); + /* u64 LeftColumn = 0; */ + /* u64 RightColumn = 0; */ + u64 LeftColumn = xOccupancyBorder[zBlock]; + u64 RightColumn = xOccupancyBorder[zBlock+1]; + + u64 LeftBit = (LeftColumn >> yBlock) & 1; + u64 RightBit = (RightColumn >> yBlock) & 1; + u64 Bits = Occupancy[OccupancyIndex]; u64 yBits = Occupancy[OccupancyIndex+1]; u64 nyBits = Occupancy[OccupancyIndex-1]; u64 zBits = Occupancy[OccupancyIndex+SrcChunkDim.z]; u64 nzBits = Occupancy[OccupancyIndex-SrcChunkDim.z]; + /* u64 RightFaces = ( RightBit | (Bits>>1) ) & ~Bits; */ + /* u64 LeftFaces = ( LeftBit | (Bits<<1) ) & ~Bits; */ - u64 RightFaces = (Bits>>1) & ~Bits; - u64 LeftFaces = (Bits<<1) & ~Bits; + // NOTE(Jesse): When viewing these in the debugger they look backwards + // because it displays the values in register order. + u64 RightFaces = ( RightBit | Bits ) & ~(Bits>>1); + u64 LeftFaces = ( LeftBit | Bits ) & ~(Bits<<1); u64 FrontFaces = Bits & (~yBits); u64 BackFaces = Bits & (~nyBits); @@ -1375,7 +1389,7 @@ poof( { u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_LeftFaceNormalData, Materials); } @@ -1383,7 +1397,7 @@ poof( { u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_RightFaceNormalData, Materials); } @@ -1391,7 +1405,7 @@ poof( { u64 This = UnsetLeastSignificantSetBit(&FrontFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_FrontFaceNormalData, Materials); } @@ -1399,7 +1413,7 @@ poof( { u64 This = UnsetLeastSignificantSetBit(&BackFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_BackFaceNormalData, Materials); } @@ -1407,7 +1421,7 @@ poof( { u64 This = UnsetLeastSignificantSetBit(&TopFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_TopFaceNormalData, Materials); } @@ -1415,7 +1429,7 @@ poof( { u64 This = UnsetLeastSignificantSetBit(&BotFaces); u32 xOffset = GetIndexOfSingleSetBit(This); - BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z)-V3(1), Dim, VertexData); + BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); BufferFaceData(Dest, VertexData, (vert_t.name)_BottomFaceNormalData, Materials); } @@ -3521,7 +3535,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, } else { - MarkBoundaryVoxels_NoExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->FaceMasks, SyntheticChunk->Voxels, SynChunkDim, {}, SynChunkDim); + MarkBoundaryVoxels_NoExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->xOccupancyBorder, SyntheticChunk->FaceMasks, SyntheticChunk->Voxels, SynChunkDim, {}, SynChunkDim); } /* CopyChunkOffset(SyntheticChunk, SynChunkDim, DestChunk, DestChunk->Dim, Global_ChunkApronMinDim); */ diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 9b597b553..582bf0f85 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -165,11 +165,16 @@ struct boundary_voxel } }; +// 2 sides (1 bit per side), 66 z slices, each bit corresponds to a y index +#define xOccupancyBorder_Dim V3i(1, 2, 66) +#define xOccupancyBorder_ElementCount Volume(xOccupancyBorder_Dim) + struct chunk_data { chunk_flag Flags; v3i Dim; // TODO(Jesse): can (should?) be 3x u8 instead of 3x s32 u64 *Occupancy; + u64 *xOccupancyBorder; // [xOccupancyBorder_ElementCount]; u64 *FaceMasks; voxel *Voxels; voxel_lighting *VoxelLighting; @@ -305,6 +310,8 @@ typedef entity* entity_ptr; poof( block_array(entity_ptr, {8}) ) #include + + struct world_chunk poof(@version(1)) { // NOTE(Jesse): Since we waste so much space with padding this thing out we @@ -315,6 +322,7 @@ struct world_chunk poof(@version(1)) chunk_flag Flags; poof(@no_serialize) v3i Dim; // could/should be compressed? u64 *Occupancy; + u64 *xOccupancyBorder; // [xOccupancyBorder_ElementCount]; u64 *FaceMasks; voxel *Voxels; poof(@array_length( Cast(umm, Volume(Element->Dim)))) voxel_lighting *VoxelLighting; poof(@array_length( Cast(umm, Volume(Element->Dim)))) diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 975d0a4fd..643b0d825 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -1148,7 +1148,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ // NOTE(Jesse): We can actually do the entire dim here, but it's probably // better (faster) to just do what we actually need to - MarkBoundaryVoxels_NoExteriorFaces( CopiedChunk.Occupancy, CopiedChunk.FaceMasks, CopiedChunk.Voxels, UpdateDim, {{1,1,1}}, UpdateDim-1); + MarkBoundaryVoxels_NoExteriorFaces( CopiedChunk.Occupancy, CopiedChunk.xOccupancyBorder, CopiedChunk.FaceMasks, CopiedChunk.Voxels, UpdateDim, {{1,1,1}}, UpdateDim-1); /* MarkBoundaryVoxels_NoExteriorFaces( CopiedChunk.Voxels, UpdateDim, {}, UpdateDim); */ /* MarkBoundaryVoxels_MakeExteriorFaces( CopiedChunk.Voxels, UpdateDim, {{1,1,1}}, UpdateDim-1); */ /* MarkBoundaryVoxels_MakeExteriorFaces( CopiedChunk.Voxels, UpdateDim, {}, UpdateDim); */ diff --git a/src/tests/perlin_perf.cpp b/src/tests/perlin_perf.cpp index 60db75700..4d9ccb00a 100644 --- a/src/tests/perlin_perf.cpp +++ b/src/tests/perlin_perf.cpp @@ -89,7 +89,7 @@ main(s32 ArgCount, const char** Args) xParams[0] = ComputePerlinParameters(_x0, PrimeX); xParams[1] = ComputePerlinParameters(_x1, PrimeX); - PerlinNoise_16x_avx2(xParams, &yParams, &zParams, NoiseValues+DestIndex, 1.f); + PerlinNoise_16x_avx2_x(xParams, &yParams, &zParams, NoiseValues+DestIndex, 1.f); DestIndex += 16; } } From dafbbb9dd8d498b67773187b9cd392028c09cd8e Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 1 Oct 2024 17:02:19 -0700 Subject: [PATCH 052/421] Fix a couple fucky register-ordering mis-named variables --- examples/terrain_gen/game.cpp | 3 ++- external/bonsai_stdlib | 2 +- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/world_chunk.cpp | 19 +++++++++++++------ 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 01a899222..1084ef624 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -755,7 +755,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() world_position WorldCenter = {}; canonical_position CameraTargetP = {}; - StandardCamera(Graphics->Camera, 200000.0f, 50000.0f); + StandardCamera(Graphics->Camera, 250000.0f, 20000.0f); AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); @@ -780,6 +780,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* CameraGhost->P.WorldP = V3i(330, -87, 2); */ /* CameraGhost->P.WorldP = V3i(33, -87, 2); */ /* CameraGhost->P.WorldP = V3i(5, -73, 2); */ + /* CameraGhost->P.WorldP = V3i(1000, 1000, 100); */ CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); SpawnEntity(CameraGhost); diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 4cce8aee9..e7172351d 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 4cce8aee972739137c572a73f610b445bee675a0 +Subproject commit e7172351dba876a7f633407ea84111073b988b88 diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 309eb5657..9d6d147c0 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2890:0 +// src/engine/world_chunk.cpp:2893:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 238d80daa..2dba1a255 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:1933:0 +// src/engine/world_chunk.cpp:1936:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 164e7f97c..451746cb7 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:1936:0 +// src/engine/world_chunk.cpp:1939:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 6e556648f..1ff82b27e 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -872,8 +872,16 @@ MarkBoundaryVoxels_NoExteriorFaces( u64 *Occupancy, u64 LeftColumn = xOccupancyBorder[zBlock]; u64 RightColumn = xOccupancyBorder[zBlock+1]; - u64 LeftBit = (LeftColumn >> yBlock) & 1; - u64 RightBit = (RightColumn >> yBlock) & 1; + /* u64 LeftBit = ((LeftColumn >> yBlock) & 1) << 63; */ + /* u64 RightBit = (RightColumn >> yBlock) & 1; */ + + // NOTE(Jesse): These look backwards, but they're not. In register ordering, + // the directions are reversed; the highest bit is the right-most voxel in + // 3D space. + // + // @register_ordering_looks_backwards + u64 RightBit = 1llu << 63; + u64 LeftBit = 1; u64 Bits = Occupancy[OccupancyIndex]; u64 yBits = Occupancy[OccupancyIndex+1]; @@ -884,10 +892,9 @@ MarkBoundaryVoxels_NoExteriorFaces( u64 *Occupancy, /* u64 RightFaces = ( RightBit | (Bits>>1) ) & ~Bits; */ /* u64 LeftFaces = ( LeftBit | (Bits<<1) ) & ~Bits; */ - // NOTE(Jesse): When viewing these in the debugger they look backwards - // because it displays the values in register order. - u64 RightFaces = ( RightBit | Bits ) & ~(Bits>>1); - u64 LeftFaces = ( LeftBit | Bits ) & ~(Bits<<1); + // @register_ordering_looks_backwards + u64 RightFaces = ( Bits ) & ~(RightBit | (Bits>>1)); + u64 LeftFaces = ( Bits ) & ~(LeftBit | (Bits<<1)); u64 FrontFaces = Bits & (~yBits); u64 BackFaces = Bits & (~nyBits); From 8528d79f5957291633429c99cb1f283de4ad940f Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 2 Oct 2024 15:22:09 -0700 Subject: [PATCH 053/421] Binary meshing working with result of 64^3 voxels --- examples/terrain_gen/game.cpp | 21 ++- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/terrain.cpp | 172 ++++++++++++------ src/engine/world_chunk.cpp | 12 +- src/engine/world_chunk.h | 2 +- 7 files changed, 139 insertions(+), 74 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 1084ef624..cd49ab77b 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -479,11 +479,12 @@ BONSAI_API_WORKER_THREAD_CALLBACK() case TerrainGenType_FBM2D: { - // FBM params - v3 Period = V3(18000); - s32 Amplititude = 10000; - s32 StartingZDepth = 5000; - u32 Octaves = 6; + + /* // FBM params */ + /* v3 Period = V3(18000); */ + /* s32 Amplititude = 10000; */ + /* s32 StartingZDepth = 5000; */ + /* u32 Octaves = 6; */ /* v3 Period = V3(500); */ /* s32 Amplititude = 500; */ @@ -497,11 +498,11 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* /1* u32 Octaves = 1; *1/ */ /* u32 Octaves = 6; */ - /* v3 Period = V3(2500); */ - /* s32 Amplititude = 1500; */ - /* s32 StartingZDepth = -400; */ - /* u32 Octaves = 1; */ - /* /1* u32 Octaves = 4; *1/ */ + v3 Period = V3(2500); + s32 Amplititude = 1500; + s32 StartingZDepth = 1600; + u32 Octaves = 1; + /* u32 Octaves = 4; */ /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 9d6d147c0..39e0d0b9a 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2893:0 +// src/engine/world_chunk.cpp:2897:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 2dba1a255..939470b0f 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:1936:0 +// src/engine/world_chunk.cpp:1940:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 451746cb7..385bfd267 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:1939:0 +// src/engine/world_chunk.cpp:1943:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index e8f830b92..73d927357 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -30,6 +30,8 @@ Terrain_Flat( world_chunk *Chunk, } +global_variable random_series TEST_ENTROPY = {653765435432}; + link_internal u32 Terrain_FBM2D( world_chunk *Chunk, v3i NoiseBasis, @@ -83,21 +85,23 @@ Terrain_FBM2D( world_chunk *Chunk, s32 NoiseUpsampleFactor = 1; + v3i Basis = Chunk->WorldP; + /* v3i NoiseDim = RoundUp(Chunk->Dim/2, V3i(16)); */ - v3i NoiseDim = RoundUp(Chunk->Dim/NoiseUpsampleFactor, V3i(16)); + /* v3i NoiseDim = RoundUp((Chunk->Dim+2)/NoiseUpsampleFactor, V3i(16, 1, 1)); */ + v3i NoiseDim = RoundUp((Chunk->Dim+2)/NoiseUpsampleFactor, V3i(16)); /* v3i NoiseDim = Chunk->Dim; */ // NOTE(Jesse): This must hold true for using any Noise_16x func - Assert(NoiseDim % V3i(16) == V3i(0)); + Assert(NoiseDim.x % 16 == 0); - // NOTE(Jesse): Must be true to use _mm256_store_ps, which we do in the 16x version of perlin /* v3i NoiseDim = Chunk->Dim + 2; */ - - v3i Basis = Chunk->WorldP; + s32 NoiseValuesCount = Volume(NoiseDim); + r32 *NoiseValues = Allocate(r32, TempArena, NoiseValuesCount); + // NOTE(Jesse): Must be true to use _mm256_store_ps, which we do in the 16x version of perlin + Assert(u64(NoiseValues) % 32 == 0); { - r32 *NoiseValues = Allocate(r32, TempArena, Volume(NoiseDim)); - Assert(u64(NoiseValues) % 32 == 0); /* v3i NormalDim = Chunk->Dim; */ /* v3 *Normals = Allocate( v3, TempArena, Volume(NormalDim)); */ @@ -114,15 +118,15 @@ Terrain_FBM2D( world_chunk *Chunk, perlin_params xParams[16]; f32 xCoords[16]; -#define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ - f32(basis_chunk_point.channel*WorldChunkDim.channel) \ - + f32(offset)*Chunk->DimInChunks.channel \ - + SrcToDest.channel \ +#define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ + f32(basis_chunk_point.channel*WorldChunkDim.channel) \ + + f32(offset)*Chunk->DimInChunks.channel \ + + SrcToDest.channel \ - for ( s32 z = 0; z < NoiseDim.z; ++ z) + // Start at -1 for the coordinates because we're initializing a border around the chunk + for ( s32 z = -1; z < NoiseDim.z-1; ++ z) { f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, z*NoiseUpsampleFactor, Chunk->DimInChunks); - f32 WorldZBiased = zCoord - zMin; v3 InteriorPeriod = Period; RangeIterator_t(u32, OctaveIndex, Octaves) @@ -131,7 +135,7 @@ Terrain_FBM2D( world_chunk *Chunk, InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - for ( s32 y = 0; y < NoiseDim.y; ++ y) + for ( s32 y = -1; y < NoiseDim.y-1; ++ y) { f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, y*NoiseUpsampleFactor, Chunk->DimInChunks); @@ -142,39 +146,36 @@ Terrain_FBM2D( world_chunk *Chunk, InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - for ( s32 x = 0; x < NoiseDim.x; x += 16 ) + for ( s32 x = -1; x < NoiseDim.x-1; x += 16 ) { - s32 NoiseIndex = GetIndex(x,y,z, NoiseDim); + // +1 because we started at -1 for coordinates on the border + s32 NoiseIndex = GetIndex(x+1,y+1,z+1, NoiseDim); r32 InteriorAmp = r32(Amplitude); - u32 ParamsIndex = 0; InteriorPeriod = Period; for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { RangeIterator(ValueIndex, 16) { + Assert(ValueIndex < 16); xCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(x, Basis, (x+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)) / InteriorPeriod.x; } - auto Index = 0; auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); auto _x1 = F32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); - xParams[ParamsIndex++] = ComputePerlinParameters(_x0, PrimeX); - xParams[ParamsIndex++] = ComputePerlinParameters(_x1, PrimeX); + u32 xParamsIndex = (OctaveIndex*2); + Assert(xParamsIndex < 15); + xParams[xParamsIndex] = ComputePerlinParameters(_x0, PrimeX); + xParams[xParamsIndex+1] = ComputePerlinParameters(_x1, PrimeX); InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - u64 CycleCountStart = GetCycleCount(); for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { + Assert(NoiseIndex < NoiseValuesCount); + Assert(u64(NoiseValues+NoiseIndex) % 32 == 0); PerlinNoise_16x_avx2_x(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); } - u64 CycleCountEnd = GetCycleCount(); - u64 CyclesElapsed = CycleCountEnd-CycleCountStart; - - engine_debug *ED = GetEngineDebug(); - ED->ChunkGenCyclesElapsed += CyclesElapsed; - ED->CellsGenerated += u64(16*Octaves); } } } @@ -189,7 +190,7 @@ Terrain_FBM2D( world_chunk *Chunk, { v3i ChunkP = V3i(xChunk, yChunk, zChunk); /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ - v3i NoiseP = V3i(xChunk, yChunk, zChunk)/NoiseUpsampleFactor; + v3i NoiseP = V3i(xChunk+1, yChunk+1, zChunk+1)/NoiseUpsampleFactor; s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); @@ -230,13 +231,51 @@ Terrain_FBM2D( world_chunk *Chunk, } } } + + for ( s32 z = 1; z < NoiseDim.z; ++ z) + { + f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, z, Chunk->DimInChunks); + f32 WorldZBiased = zCoord - zMin; + for ( s32 y = 1; y < 65; ++ y) + { + Assert(NoiseDim.y >= 65); + + { + v3i NoiseP = V3i(0, y, z)/NoiseUpsampleFactor; + s32 BorderIndex = GetIndex(NoiseP, NoiseDim); + + r32 ThisNoiseV = NoiseValues[BorderIndex]; + + u64 NoiseChoice = ThisNoiseV > WorldZBiased; + /* u64 NoiseChoice = 1ull; */ + /* u64 NoiseChoice = RandomU32(&TEST_ENTROPY) & 1; */ + Chunk->xOccupancyBorder[(z-1)*2] |= NoiseChoice << y; + } + + { + v3i NoiseP = V3i(65, y, z)/NoiseUpsampleFactor; + s32 BorderIndex = GetIndex(NoiseP, NoiseDim); + + r32 ThisNoiseV = NoiseValues[BorderIndex]; + + u64 NoiseChoice = ThisNoiseV > WorldZBiased; + /* u64 NoiseChoice = 1ull; */ + /* u64 NoiseChoice = RandomU32(&TEST_ENTROPY) & 1; */ + Chunk->xOccupancyBorder[((z-1)*2)+1] |= NoiseChoice << y; + } + + } + } } +#if 0 { // Have to multiply by 64 because xOccupancyBorder_ElementCount is the number of // u64 elements, and we need a value per bit v3i BorderValuesDim = V3i(2, xOccupancyBorder_Dim.y, xOccupancyBorder_Dim.z); + /* Assert(BorderValuesDim.y == NoiseDim.y); */ + /* Assert(BorderValuesDim.z == NoiseDim.z); */ const s32 BorderValueCount = xOccupancyBorder_ElementCount*64; f32 *BorderValues = Allocate(f32, GetTranArena(), BorderValueCount); // TODO(Jesse): Make this dynamic @@ -246,10 +285,9 @@ Terrain_FBM2D( world_chunk *Chunk, perlin_params xParams[8]; f32 yCoords[16]; - for ( s32 z = 0; z < NoiseDim.z; ++ z) + for ( s32 z = 0; z < BorderValuesDim.z; ++ z) { f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, z*NoiseUpsampleFactor, Chunk->DimInChunks); - f32 WorldZBiased = zCoord - zMin; v3 InteriorPeriod = Period; RangeIterator_t(u32, OctaveIndex, Octaves) @@ -258,16 +296,13 @@ Terrain_FBM2D( world_chunk *Chunk, InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - for ( s32 y = 0; y < NoiseDim.y; y += 16) + for ( s32 y = 0; y < BorderValuesDim.y; y += 16) { f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, y*NoiseUpsampleFactor, Chunk->DimInChunks); - s32 BorderIndex = GetIndex(0, y, z, V3i(1, 64, 66)); - Assert(BorderIndex < BorderValueCount); - RangeIterator(ValueIndex, 16) { - yCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(y, Basis, (y+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)) / InteriorPeriod.y; + yCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(y, Basis, (y+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)); } auto _y0 = F32_8X( yCoords[0], yCoords[1], yCoords[2], yCoords[3], yCoords[4], yCoords[5], yCoords[6], yCoords[7] ); auto _y1 = F32_8X( yCoords[8], yCoords[9], yCoords[10], yCoords[11], yCoords[12], yCoords[13], yCoords[14], yCoords[15] ); @@ -275,8 +310,8 @@ Terrain_FBM2D( world_chunk *Chunk, InteriorPeriod = Period; RangeIterator_t(u32, OctaveIndex, Octaves) { - yParams[0+OctaveIndex*2] = ComputePerlinParameters(_y0/F32_8X(InteriorPeriod.y), PrimeY); - yParams[1+OctaveIndex*2] = ComputePerlinParameters(_y1/F32_8X(InteriorPeriod.y), PrimeY); + yParams[0+(OctaveIndex*2)] = ComputePerlinParameters(_y0/F32_8X(InteriorPeriod.y), PrimeY); + yParams[1+(OctaveIndex*2)] = ComputePerlinParameters(_y1/F32_8X(InteriorPeriod.y), PrimeY); InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } @@ -291,18 +326,35 @@ Terrain_FBM2D( world_chunk *Chunk, InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - u64 CycleCountStart = GetCycleCount(); for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { + s32 BorderIndex = GetIndex(y, z, BorderValuesDim.yz); + Assert(BorderIndex < BorderValueCount); + PerlinNoise_16x_avx2_y(xParams+OctaveIndex, yParams+(OctaveIndex*2), zParams+OctaveIndex, BorderValues+BorderIndex, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); } - u64 CycleCountEnd = GetCycleCount(); - u64 CyclesElapsed = CycleCountEnd-CycleCountStart; + } + + { + r32 InteriorAmp = r32(Amplitude); + InteriorPeriod = Period; + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + s32 x = 64; + auto xCoord0 = F32_8X(__COMPUTE_NOISE_INPUT(x, Basis, x*NoiseUpsampleFactor, Chunk->DimInChunks)); + xParams[OctaveIndex] = ComputePerlinParameters(xCoord0, PrimeX); + InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + } - engine_debug *ED = GetEngineDebug(); - ED->ChunkGenCyclesElapsed += CyclesElapsed; - ED->CellsGenerated += u64(16*Octaves); + for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + { + s32 BorderIndex = GetIndex(y, z, BorderValuesDim.yz)*2; + Assert(BorderIndex < BorderValueCount); + + PerlinNoise_16x_avx2_y(xParams+OctaveIndex, yParams+(OctaveIndex*2), zParams+OctaveIndex, BorderValues+BorderIndex, InteriorAmp); + InteriorAmp = Max(1.f, InteriorAmp/2.f); + } } } } @@ -313,24 +365,36 @@ Terrain_FBM2D( world_chunk *Chunk, f32 WorldZBiased = zCoord - zMin; for ( s32 yChunk = 0; yChunk < BorderValuesDim.y; ++ yChunk) { - // NOTE(Jesse): This is used to compute the index into buffers - // The actual world positions are -1 and 64 but we're going to use 0 and 1 here - s32 x = 0; - v3i ChunkP = V3i(x, yChunk, zChunk); - v3i NoiseP = V3i(x, yChunk, zChunk)/NoiseUpsampleFactor; - s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); - s32 BorderIndex = GetIndex(NoiseP, BorderValuesDim); + { + v3i NoiseP = V3i(0, yChunk, zChunk)/NoiseUpsampleFactor; + s32 BorderIndex = GetIndex(NoiseP.yz, BorderValuesDim.yz); - r32 ThisNoiseV = BorderValues[BorderIndex]; + r32 ThisNoiseV = BorderValues[BorderIndex]; - u64 NoiseChoice = ThisNoiseV > WorldZBiased; - Chunk->xOccupancyBorder[zChunk] |= NoiseChoice< WorldZBiased; + /* u64 NoiseChoice = 1ull; */ + /* u64 NoiseChoice = RandomU32(&TEST_ENTROPY) & 1; */ + Chunk->xOccupancyBorder[zChunk] |= NoiseChoice< WorldZBiased; + /* u64 NoiseChoice = 1ull; */ + /* u64 NoiseChoice = RandomU32(&TEST_ENTROPY) & 1; */ + Chunk->xOccupancyBorder[zChunk] |= NoiseChoice<Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); } } } +#endif diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 1ff82b27e..1a5239eee 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -869,19 +869,19 @@ MarkBoundaryVoxels_NoExteriorFaces( u64 *Occupancy, /* u64 LeftColumn = 0; */ /* u64 RightColumn = 0; */ - u64 LeftColumn = xOccupancyBorder[zBlock]; - u64 RightColumn = xOccupancyBorder[zBlock+1]; + u64 LeftColumn = xOccupancyBorder[ zBlock*2 ]; + u64 RightColumn = xOccupancyBorder[(zBlock*2)+1]; - /* u64 LeftBit = ((LeftColumn >> yBlock) & 1) << 63; */ - /* u64 RightBit = (RightColumn >> yBlock) & 1; */ + u64 LeftBit = ((LeftColumn >> yBlock) & 1); + u64 RightBit = ((RightColumn >> yBlock) & 1) << 63; // NOTE(Jesse): These look backwards, but they're not. In register ordering, // the directions are reversed; the highest bit is the right-most voxel in // 3D space. // // @register_ordering_looks_backwards - u64 RightBit = 1llu << 63; - u64 LeftBit = 1; + /* u64 RightBit = 1llu << 63; */ + /* u64 LeftBit = 1; */ u64 Bits = Occupancy[OccupancyIndex]; u64 yBits = Occupancy[OccupancyIndex+1]; diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 582bf0f85..da6721051 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -166,7 +166,7 @@ struct boundary_voxel }; // 2 sides (1 bit per side), 66 z slices, each bit corresponds to a y index -#define xOccupancyBorder_Dim V3i(1, 2, 66) +#define xOccupancyBorder_Dim V3i(1, 64, 66) #define xOccupancyBorder_ElementCount Volume(xOccupancyBorder_Dim) struct chunk_data From aaa3e9b485e1fb07dd4bd37e0358a102d993f9ce Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 4 Oct 2024 17:30:07 -0700 Subject: [PATCH 054/421] Fucking fuck --- examples/terrain_gen/game.cpp | 13 +- examples/terrain_gen/game_constants.h | 4 +- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 43 ++++-- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 43 ++++-- src/engine/terrain.cpp | 128 ++++++++++-------- src/engine/terrain.h | 1 - src/engine/world_chunk.cpp | 112 +++++++++------ src/engine/world_chunk.h | 4 +- 9 files changed, 214 insertions(+), 136 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index cd49ab77b..ae69825e1 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -498,12 +498,19 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* /1* u32 Octaves = 1; *1/ */ /* u32 Octaves = 6; */ - v3 Period = V3(2500); - s32 Amplititude = 1500; - s32 StartingZDepth = 1600; + /* v3 Period = V3(2500); */ + /* s32 Amplititude = 1500; */ + /* s32 StartingZDepth = 1600; */ + /* u32 Octaves = 1; */ + /* /1* u32 Octaves = 4; *1/ */ + + v3 Period = V3(50); + s32 Amplititude = 60; + s32 StartingZDepth = 60; u32 Octaves = 1; /* u32 Octaves = 4; */ + /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ chunk_init_flags InitFlags = ChunkInitFlag_Noop; v3 Color = RGB_GRASS_GREEN; diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 5bea3de83..e16c2a591 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -11,14 +11,14 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ // 26km -g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km +/* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ -/* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ +g_VisibleRegion = Chunk_Dimension(8, 8, 8); /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ /* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 39e0d0b9a..36b1a7e9d 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2897:0 +// src/engine/world_chunk.cpp:2923:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 939470b0f..f5eaab695 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,7 +1,8 @@ -// src/engine/world_chunk.cpp:1940:0 +// src/engine/world_chunk.cpp:1966:0 link_internal void -BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, +BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, + u64 *FaceMasks, v3i SrcChunkDim, v3i SrcChunkMin, @@ -25,13 +26,11 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, v3 VertexData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; - FillArray(VertexMaterial(PackHSVColor(HSV_GRASS_GREEN), 0.f, 0.f), Materials, VERTS_PER_FACE); - s32 Result = 0; - for ( s32 zBlock = 0; zBlock < SrcChunkDim.z; ++zBlock ) + for ( s32 zBlock = 1; zBlock < SrcChunkDim.z; ++zBlock ) { s32 z = zBlock; - for ( s32 yBlock = 0; yBlock < SrcChunkDim.y; ++yBlock ) + for ( s32 yBlock = 1; yBlock < SrcChunkDim.y; ++yBlock ) { s32 y = yBlock; s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); @@ -45,11 +44,16 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, v3 Dim = V3(1.f, 1.f, 1.f); + + u64 BaseVoxelOffset = u64(GetIndex(0, yBlock, zBlock, SrcChunkDim)); while (LeftFaces) { u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + LeftFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_LeftFaceNormalData, Materials); } @@ -57,7 +61,10 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + RightFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_RightFaceNormalData, Materials); } @@ -65,7 +72,10 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&FrontFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + FrontFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_FrontFaceNormalData, Materials); } @@ -73,7 +83,10 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&BackFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + BackFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_BackFaceNormalData, Materials); } @@ -81,7 +94,10 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&TopFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + TopFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_TopFaceNormalData, Materials); } @@ -89,7 +105,10 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&BotFaces); u32 xOffset = GetIndexOfSingleSetBit(This); - BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + BottomFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_BottomFaceNormalData, Materials); } diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 385bfd267..06279ab24 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,7 +1,8 @@ -// src/engine/world_chunk.cpp:1943:0 +// src/engine/world_chunk.cpp:1969:0 link_internal void -BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, +BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, + u64 *FaceMasks, v3i SrcChunkDim, v3i SrcChunkMin, @@ -25,13 +26,11 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, v3_u8 VertexData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; - FillArray(VertexMaterial(PackHSVColor(HSV_GRASS_GREEN), 0.f, 0.f), Materials, VERTS_PER_FACE); - s32 Result = 0; - for ( s32 zBlock = 0; zBlock < SrcChunkDim.z; ++zBlock ) + for ( s32 zBlock = 1; zBlock < SrcChunkDim.z; ++zBlock ) { s32 z = zBlock; - for ( s32 yBlock = 0; yBlock < SrcChunkDim.y; ++yBlock ) + for ( s32 yBlock = 1; yBlock < SrcChunkDim.y; ++yBlock ) { s32 y = yBlock; s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); @@ -45,11 +44,16 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, v3 Dim = V3(1.f, 1.f, 1.f); + + u64 BaseVoxelOffset = u64(GetIndex(0, yBlock, zBlock, SrcChunkDim)); while (LeftFaces) { u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + LeftFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_LeftFaceNormalData, Materials); } @@ -57,7 +61,10 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + RightFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_RightFaceNormalData, Materials); } @@ -65,7 +72,10 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&FrontFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + FrontFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_FrontFaceNormalData, Materials); } @@ -73,7 +83,10 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&BackFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + BackFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_BackFaceNormalData, Materials); } @@ -81,7 +94,10 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&TopFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + TopFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_TopFaceNormalData, Materials); } @@ -89,7 +105,10 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( u64 *FaceMasks, { u64 This = UnsetLeastSignificantSetBit(&BotFaces); u32 xOffset = GetIndexOfSingleSetBit(This); - BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + BottomFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_BottomFaceNormalData, Materials); } diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 73d927357..9985e88be 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -30,7 +30,7 @@ Terrain_Flat( world_chunk *Chunk, } -global_variable random_series TEST_ENTROPY = {653765435432}; +global_variable random_series DEBUG_ENTROPY = {653765435432}; link_internal u32 Terrain_FBM2D( world_chunk *Chunk, @@ -89,7 +89,7 @@ Terrain_FBM2D( world_chunk *Chunk, /* v3i NoiseDim = RoundUp(Chunk->Dim/2, V3i(16)); */ /* v3i NoiseDim = RoundUp((Chunk->Dim+2)/NoiseUpsampleFactor, V3i(16, 1, 1)); */ - v3i NoiseDim = RoundUp((Chunk->Dim+2)/NoiseUpsampleFactor, V3i(16)); + v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0))/NoiseUpsampleFactor, V3i(16)); /* v3i NoiseDim = Chunk->Dim; */ // NOTE(Jesse): This must hold true for using any Noise_16x func Assert(NoiseDim.x % 16 == 0); @@ -123,10 +123,10 @@ Terrain_FBM2D( world_chunk *Chunk, + f32(offset)*Chunk->DimInChunks.channel \ + SrcToDest.channel \ - // Start at -1 for the coordinates because we're initializing a border around the chunk - for ( s32 z = -1; z < NoiseDim.z-1; ++ z) + for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, z*NoiseUpsampleFactor, Chunk->DimInChunks); + // NOTE(Jesse): Sub one because the noise is dilated one + f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, (zNoise-1)*NoiseUpsampleFactor, Chunk->DimInChunks); v3 InteriorPeriod = Period; RangeIterator_t(u32, OctaveIndex, Octaves) @@ -135,9 +135,10 @@ Terrain_FBM2D( world_chunk *Chunk, InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - for ( s32 y = -1; y < NoiseDim.y-1; ++ y) + for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) { - f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, y*NoiseUpsampleFactor, Chunk->DimInChunks); + // NOTE(Jesse): Sub one because the noise is dilated one + f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, (yNoise-1)*NoiseUpsampleFactor, Chunk->DimInChunks); InteriorPeriod = Period; RangeIterator_t(u32, OctaveIndex, Octaves) @@ -146,10 +147,9 @@ Terrain_FBM2D( world_chunk *Chunk, InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); } - for ( s32 x = -1; x < NoiseDim.x-1; x += 16 ) + for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 16 ) { - // +1 because we started at -1 for coordinates on the border - s32 NoiseIndex = GetIndex(x+1,y+1,z+1, NoiseDim); + s32 NoiseIndex = GetIndex(xNoise, yNoise, zNoise, NoiseDim); r32 InteriorAmp = r32(Amplitude); InteriorPeriod = Period; @@ -158,7 +158,8 @@ Terrain_FBM2D( world_chunk *Chunk, RangeIterator(ValueIndex, 16) { Assert(ValueIndex < 16); - xCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(x, Basis, (x+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)) / InteriorPeriod.x; + // NOTE(Jesse): Sub one because the noise is dilated one + xCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(x, Basis, (xNoise-1+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)) / InteriorPeriod.x; } auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); auto _x1 = F32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); @@ -182,7 +183,7 @@ Terrain_FBM2D( world_chunk *Chunk, for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, zChunk, Chunk->DimInChunks); + f32 zCoord = 75.f; f32 WorldZBiased = zCoord - zMin; for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) { @@ -190,80 +191,87 @@ Terrain_FBM2D( world_chunk *Chunk, { v3i ChunkP = V3i(xChunk, yChunk, zChunk); /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ - v3i NoiseP = V3i(xChunk+1, yChunk+1, zChunk+1)/NoiseUpsampleFactor; + /* v3i NoiseP = V3i(xChunk+1, yChunk+1, zChunk+1)/NoiseUpsampleFactor; */ + v3i NoiseP = V3i(xChunk+1, yChunk, zChunk)/NoiseUpsampleFactor; s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); -#if 0 - f32 zNoiseV[2]; - f32 yNoiseV[2]; - f32 xNoiseV[2]; - xNoiseV[0] = yNoiseV[0] = zNoiseV[0] = xNoiseV[1] = yNoiseV[1] = zNoiseV[1] = NoiseValues[NoiseIndex]; - - s32 xNoiseIndex = TryGetIndex(NoiseP.x+1, NoiseP.y, NoiseP.z, NoiseDim); - s32 yNoiseIndex = TryGetIndex(NoiseP.x, NoiseP.y+1, NoiseP.z, NoiseDim); - s32 zNoiseIndex = TryGetIndex(NoiseP.x, NoiseP.y, NoiseP.z+1, NoiseDim); - - if (xNoiseIndex > -1) - { - xNoiseV[1] = NoiseValues[xNoiseIndex]; - } - - if (yNoiseIndex > -1) - { - yNoiseV[1] = NoiseValues[yNoiseIndex]; - } - - if (zNoiseIndex > -1) - { - zNoiseV[1] = NoiseValues[zNoiseIndex]; - } - - r32 ThisNoiseV = (NoiseValues[NoiseIndex] + (Lerp(0.5f, xNoiseV[0], xNoiseV[1]) + Lerp(0.5f, yNoiseV[0], yNoiseV[1]) + Lerp(0.5f, zNoiseV[0], zNoiseV[1])) / 3.f)/2.f; -#else r32 ThisNoiseV = NoiseValues[NoiseIndex]; -#endif s32 NoiseChoice = ThisNoiseV > WorldZBiased; ChunkSum += u32(NoiseChoice); SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); + Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ + if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } + /* if (xChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_YELLOW)*u16(NoiseChoice); } */ + /* if (xChunk == Chunk->Dim.x-1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ + if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_GREEN)*u16(NoiseChoice); } + if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } } } } - for ( s32 z = 1; z < NoiseDim.z; ++ z) + Assert(NoiseDim.x >= 66); + Assert(NoiseDim.y >= 66); + Assert(NoiseDim.z >= 66); + + Assert(Chunk->Dim.x >= 64); + Assert(Chunk->Dim.y >= 66); + Assert(Chunk->Dim.z >= 66); + for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, z, Chunk->DimInChunks); + f32 zCoord = 75.f; f32 WorldZBiased = zCoord - zMin; - for ( s32 y = 1; y < 65; ++ y) + for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) { - Assert(NoiseDim.y >= 65); { - v3i NoiseP = V3i(0, y, z)/NoiseUpsampleFactor; - s32 BorderIndex = GetIndex(NoiseP, NoiseDim); + v3i BorderP = V3i(0, yNoise, zNoise)/NoiseUpsampleFactor; + s32 BorderIndex = GetIndex(BorderP, NoiseDim); r32 ThisNoiseV = NoiseValues[BorderIndex]; u64 NoiseChoice = ThisNoiseV > WorldZBiased; - /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&TEST_ENTROPY) & 1; */ - Chunk->xOccupancyBorder[(z-1)*2] |= NoiseChoice << y; - } - { - v3i NoiseP = V3i(65, y, z)/NoiseUpsampleFactor; - s32 BorderIndex = GetIndex(NoiseP, NoiseDim); + s32 NextXChunkIndex = GetIndex(BorderP, Chunk->Dim); + s64 NextChoice = GetOccupancyBit(Chunk, NextXChunkIndex); - r32 ThisNoiseV = NoiseValues[BorderIndex]; + /* s32 NextXChunkIndex = GetIndex(BorderP+V3(1,0,0), Chunk->Dim); */ + if (NoiseChoice) + { + Chunk->Voxels[NextXChunkIndex].Color = PackHSVColor(HSV_PINK); + } + + /* if (NextChoice) */ + /* { */ + /* Chunk->Voxels[NextXChunkIndex].Color = PackHSVColor(HSV_YELLOW); */ + /* } */ + +/* if (NoiseChoice && NextChoice) */ +/* { */ +/* Chunk->Voxels[NextXChunkIndex].Color = PackHSVColor(HSV_WHITE); */ +/* /1* Chunk->Voxels[ThisChunkIndex].Color = PackHSVColor(HSV_WHITE); *1/ */ +/* } */ - u64 NoiseChoice = ThisNoiseV > WorldZBiased; /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&TEST_ENTROPY) & 1; */ - Chunk->xOccupancyBorder[((z-1)*2)+1] |= NoiseChoice << y; + /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ + Chunk->xOccupancyBorder[(zNoise-1)*2] |= NoiseChoice << (yNoise-1); } + /* { */ + /* v3i BorderP = V3i(65, y, z)/NoiseUpsampleFactor; */ + /* s32 BorderIndex = GetIndex(BorderP, NoiseDim); */ + + /* r32 ThisNoiseV = NoiseValues[BorderIndex]; */ + + /* u64 NoiseChoice = ThisNoiseV > WorldZBiased; */ + /* /1* u64 NoiseChoice = 1ull; *1/ */ + /* /1* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; *1/ */ + /* Chunk->xOccupancyBorder[((z-1)*2)+1] |= NoiseChoice << (y-1); */ + /* } */ + } } } @@ -374,7 +382,7 @@ Terrain_FBM2D( world_chunk *Chunk, u64 NoiseChoice = ThisNoiseV > WorldZBiased; /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&TEST_ENTROPY) & 1; */ + /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ Chunk->xOccupancyBorder[zChunk] |= NoiseChoice< WorldZBiased; /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&TEST_ENTROPY) & 1; */ + /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ Chunk->xOccupancyBorder[zChunk] |= NoiseChoice<DimInChunks.channel_name/2.f) + ((f32(offset)+channel_name)*chunk->DimInChunks.channel_name) + (chunk->WorldP.channel_name*WorldChunkDim.channel_name) diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 1a5239eee..c0f176c2f 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -76,11 +76,11 @@ AllocateWorldChunk(world_chunk *Result, v3i WorldP, v3i Dim, v3i DimInChunks, me s32 VoxCount = Volume(Dim); if (VoxCount) { - s32 OccupancyCount = (VoxCount+63) / 64; // Add seven so we round up when we divide if there's an extra one (or several) - Result->Occupancy = AllocateAlignedProtection(u64, Storage , OccupancyCount, CACHE_LINE_SIZE, false); - Result->xOccupancyBorder = AllocateAlignedProtection(u64, Storage , xOccupancyBorder_ElementCount, CACHE_LINE_SIZE, false); - Result->FaceMasks = AllocateAlignedProtection(u64, Storage , 6*OccupancyCount, CACHE_LINE_SIZE, false); - Result->Voxels = AllocateAlignedProtection(voxel, Storage , VoxCount, CACHE_LINE_SIZE, false); + s32 OccupancyCount = (VoxCount+63) / 64; // Add seven so we round up when we divide if there's an extra one (or several) + Result->Occupancy = AllocateAlignedProtection(u64, Storage, OccupancyCount, CACHE_LINE_SIZE, false); + Result->xOccupancyBorder = AllocateAlignedProtection(u64, Storage, xOccupancyBorder_ElementCount, CACHE_LINE_SIZE, false); + Result->FaceMasks = AllocateAlignedProtection(u64, Storage, 6*OccupancyCount, CACHE_LINE_SIZE, false); + Result->Voxels = AllocateAlignedProtection(voxel, Storage, VoxCount, CACHE_LINE_SIZE, false); } Result->WorldP = WorldP; @@ -861,28 +861,29 @@ MarkBoundaryVoxels_NoExteriorFaces( u64 *Occupancy, Assert(SrcChunkDim == V3i(64, 66, 66)); s32 Result = 0; - for ( s32 zBlock = 1; zBlock < SrcChunkDim.z-1; ++zBlock ) + for ( s32 z = 1; z < SrcChunkDim.z-1; ++z ) { - for ( s32 yBlock = 1; yBlock < SrcChunkDim.y-1; ++yBlock ) + for ( s32 y = 1; y < SrcChunkDim.y-1; ++y ) { - s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); + s32 OccupancyIndex = GetIndex(y, z, SrcChunkDim.yz); - /* u64 LeftColumn = 0; */ - /* u64 RightColumn = 0; */ - u64 LeftColumn = xOccupancyBorder[ zBlock*2 ]; - u64 RightColumn = xOccupancyBorder[(zBlock*2)+1]; - - u64 LeftBit = ((LeftColumn >> yBlock) & 1); - u64 RightBit = ((RightColumn >> yBlock) & 1) << 63; + u64 RightYRow = xOccupancyBorder[((z-1)*2)+1]; + u64 LeftYRow = xOccupancyBorder[ (z-1)*2 ]; // NOTE(Jesse): These look backwards, but they're not. In register ordering, // the directions are reversed; the highest bit is the right-most voxel in // 3D space. // // @register_ordering_looks_backwards - /* u64 RightBit = 1llu << 63; */ + /* u64 RightBit = ((RightYRow >> (y-1)) & 1) << 63; */ + u64 LeftBit = ((LeftYRow >> (y-1)) & 1); + + u64 RightBit = 1llu << 63; /* u64 LeftBit = 1; */ + /* u64 RightBit = 0; */ + /* u64 LeftBit = 0; */ + u64 Bits = Occupancy[OccupancyIndex]; u64 yBits = Occupancy[OccupancyIndex+1]; u64 nyBits = Occupancy[OccupancyIndex-1]; @@ -1249,6 +1250,12 @@ DoZStepping(voxel *Voxels, v3i SrcChunkDim, v3i SrcP, voxel_flag Face, u16 Color } #endif +link_inline u16 +GetVoxelColor(s32 Index, voxel *Voxels) +{ + return Voxels[Index].Color; +} + #if 0 link_internal void BuildWorldChunkMesh_DebugVoxels( voxel *Voxels, @@ -1348,13 +1355,14 @@ poof( func world_chunk_mesh_functions(buffer_t, vert_t) { link_internal void - BuildWorldChunkMeshFromMarkedVoxels_Naieve_(vert_t.name)( u64 *FaceMasks, - v3i SrcChunkDim, + BuildWorldChunkMeshFromMarkedVoxels_Naieve_(vert_t.name)( voxel *Voxels, + u64 *FaceMasks, + v3i SrcChunkDim, - v3i SrcChunkMin, - v3i SrcChunkMax, + v3i SrcChunkMin, + v3i SrcChunkMax, - // TODO(Jesse)(immediate, poof): @poof_parens_bug + // TODO(Jesse)(immediate, poof): @poof_parens_bug (buffer_t.name) *Dest, (buffer_t.name) *Unused, @@ -1372,13 +1380,11 @@ poof( vert_t.name VertexData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; - FillArray(VertexMaterial(PackHSVColor(HSV_GRASS_GREEN), 0.f, 0.f), Materials, VERTS_PER_FACE); - s32 Result = 0; - for ( s32 zBlock = 0; zBlock < SrcChunkDim.z; ++zBlock ) + for ( s32 zBlock = 1; zBlock < SrcChunkDim.z; ++zBlock ) { s32 z = zBlock; - for ( s32 yBlock = 0; yBlock < SrcChunkDim.y; ++yBlock ) + for ( s32 yBlock = 1; yBlock < SrcChunkDim.y; ++yBlock ) { s32 y = yBlock; s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); @@ -1392,11 +1398,16 @@ poof( v3 Dim = V3(1.f, 1.f, 1.f); + + u64 BaseVoxelOffset = u64(GetIndex(0, yBlock, zBlock, SrcChunkDim)); while (LeftFaces) { u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - LeftFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + LeftFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_LeftFaceNormalData, Materials); } @@ -1404,7 +1415,10 @@ poof( { u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - RightFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + RightFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_RightFaceNormalData, Materials); } @@ -1412,7 +1426,10 @@ poof( { u64 This = UnsetLeastSignificantSetBit(&FrontFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - FrontFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + FrontFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_FrontFaceNormalData, Materials); } @@ -1420,7 +1437,10 @@ poof( { u64 This = UnsetLeastSignificantSetBit(&BackFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - BackFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + BackFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_BackFaceNormalData, Materials); } @@ -1428,7 +1448,10 @@ poof( { u64 This = UnsetLeastSignificantSetBit(&TopFaces); u64 xOffset = GetIndexOfSingleSetBit(This); - TopFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + TopFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_TopFaceNormalData, Materials); } @@ -1436,7 +1459,10 @@ poof( { u64 This = UnsetLeastSignificantSetBit(&BotFaces); u32 xOffset = GetIndexOfSingleSetBit(This); - BottomFaceVertexData( VertexOffset+V3(s32(xOffset), y, z), Dim, VertexData); + v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + BottomFaceVertexData( VertexOffset+P, Dim, VertexData); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_BottomFaceNormalData, Materials); } @@ -3379,13 +3405,13 @@ QueueChunkForMeshRebuild(work_queue *Queue, world_chunk *Chunk, chunk_init_flags } link_internal void -BuildWorldChunkMeshFromMarkedVoxels_Naieve( u64 *FaceMasks, v3i SrcChunkDim, v3i SrcChunkMin, v3i SrcChunkMax, untextured_3d_geometry_buffer *DestGeometry, untextured_3d_geometry_buffer *DestTransparentGeometry, v3 VertexOffset = {}) +BuildWorldChunkMeshFromMarkedVoxels_Naieve( voxel *Voxels, u64 *FaceMasks, v3i SrcChunkDim, v3i SrcChunkMin, v3i SrcChunkMax, untextured_3d_geometry_buffer *DestGeometry, untextured_3d_geometry_buffer *DestTransparentGeometry, v3 VertexOffset = {}) { switch(DestGeometry->Type) { InvalidCase(DataType_Undefinded); - case DataType_v3: BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3(FaceMasks, SrcChunkDim, SrcChunkMin, SrcChunkMax, DestGeometry, DestTransparentGeometry, VertexOffset); break; - case DataType_v3_u8: BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8(FaceMasks, SrcChunkDim, SrcChunkMin, SrcChunkMax, DestGeometry, DestTransparentGeometry, V3U8(VertexOffset)); break; + case DataType_v3: BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3(Voxels, FaceMasks, SrcChunkDim, SrcChunkMin, SrcChunkMax, DestGeometry, DestTransparentGeometry, VertexOffset); break; + case DataType_v3_u8: BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8(Voxels, FaceMasks, SrcChunkDim, SrcChunkMin, SrcChunkMax, DestGeometry, DestTransparentGeometry, V3U8(VertexOffset)); break; } } @@ -3427,20 +3453,14 @@ link_internal void RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOffset, v3i MaxOffset, world_chunk_mesh_bitfield MeshBit, geo_u3d *TempMesh, memory_arena *TempMem, v3 VertexOffset = {}) { engine_resources *Engine = GetEngineResources(); + Assert( IsSet(Chunk->Flags, Chunk_VoxelsInitialized) ); + Assert( MeshBit == MeshBit_Lod0 ); Assert(Chunk->DEBUG_OwnedByThread == 0); Chunk->DEBUG_OwnedByThread = ThreadLocal_ThreadIndex; - Assert( IsSet(Chunk->Flags, Chunk_VoxelsInitialized) ); - if (MeshBit == MeshBit_Lod0) - { - BuildWorldChunkMeshFromMarkedVoxels_Naieve( Chunk->FaceMasks, Chunk->Dim, MinOffset, MaxOffset, TempMesh, 0); - } - else - { - BuildMipMesh( Chunk->Voxels, Chunk->Dim, {}, Chunk->Dim, MeshBit, TempMesh, TempMem ); - } + BuildWorldChunkMeshFromMarkedVoxels_Naieve( Chunk->Voxels, Chunk->FaceMasks, Chunk->Dim, MinOffset, MaxOffset, TempMesh, 0); if (TempMesh->At) { @@ -3494,6 +3514,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, /* v3i SynChunkDim = RoundToMultiple(SynChunkDimMin, V3i(MIN_TERRAIN_NOISE_WIDTH)); */ /* v3i SynChunkDim = SynChunkDimMin + V3i(0, 2, 4); */ v3i SynChunkDim = SynChunkDimMin + V3i(0, 2, 2); + /* v3i SynChunkDim = SynChunkDimMin; */ v3i SynChunkP = DestChunk->WorldP; world_chunk *SyntheticChunk = AllocateWorldChunk(SynChunkP, SynChunkDim, DestChunk->DimInChunks, Thread->TempMemory); @@ -3585,6 +3606,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, RebuildWorldChunkMesh(Thread, SyntheticChunk, {}, {}, MeshBit_Lod0, TempMesh, Thread->TempMemory); TempMesh->At = 0; +#if 0 if (Flags & ChunkInitFlag_GenLODs) { RebuildWorldChunkMesh(Thread, SyntheticChunk, Global_ChunkApronMinDim, Global_ChunkApronMinDim+DestChunk->Dim, MeshBit_Lod1, TempMesh, Thread->TempMemory); @@ -3599,6 +3621,10 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, RebuildWorldChunkMesh(Thread, SyntheticChunk, Global_ChunkApronMinDim, Global_ChunkApronMinDim+DestChunk->Dim, MeshBit_Lod4, TempMesh, Thread->TempMemory); TempMesh->At = 0; } +#else + Assert( (Flags & ChunkInitFlag_GenLODs) == 0); +#endif + Assert( DestChunk->FilledCount == SyntheticChunk->FilledCount); } diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index da6721051..373db0e93 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -165,8 +165,8 @@ struct boundary_voxel } }; -// 2 sides (1 bit per side), 66 z slices, each bit corresponds to a y index -#define xOccupancyBorder_Dim V3i(1, 64, 66) +// 2 planar slices (1 bit per slice), each bit corresponds to a y index (64 y indices), 66 z slices +#define xOccupancyBorder_Dim V3i(2, 1, 66) #define xOccupancyBorder_ElementCount Volume(xOccupancyBorder_Dim) struct chunk_data From 65bc80c491c3d6f0e35f9f87c385141b1ee24ab8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 5 Oct 2024 10:19:37 -0700 Subject: [PATCH 055/421] Fix maximal edge --- src/engine/terrain.cpp | 179 +++---------------------------------- src/engine/world_chunk.cpp | 4 +- 2 files changed, 15 insertions(+), 168 deletions(-) diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 9985e88be..02c8b12e7 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -125,8 +125,7 @@ Terrain_FBM2D( world_chunk *Chunk, for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) { - // NOTE(Jesse): Sub one because the noise is dilated one - f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, (zNoise-1)*NoiseUpsampleFactor, Chunk->DimInChunks); + f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, (zNoise)*NoiseUpsampleFactor, Chunk->DimInChunks); v3 InteriorPeriod = Period; RangeIterator_t(u32, OctaveIndex, Octaves) @@ -137,7 +136,6 @@ Terrain_FBM2D( world_chunk *Chunk, for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) { - // NOTE(Jesse): Sub one because the noise is dilated one f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, (yNoise-1)*NoiseUpsampleFactor, Chunk->DimInChunks); InteriorPeriod = Period; @@ -158,7 +156,7 @@ Terrain_FBM2D( world_chunk *Chunk, RangeIterator(ValueIndex, 16) { Assert(ValueIndex < 16); - // NOTE(Jesse): Sub one because the noise is dilated one + // NOTE(Jesse): Sub one because the noise is dilated one on the x axis xCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(x, Basis, (xNoise-1+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)) / InteriorPeriod.x; } auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); @@ -183,7 +181,8 @@ Terrain_FBM2D( world_chunk *Chunk, for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { - f32 zCoord = 75.f; + f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, (zChunk)*NoiseUpsampleFactor, Chunk->DimInChunks); + /* f32 zCoord = 75.f; */ f32 WorldZBiased = zCoord - zMin; for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) { @@ -217,12 +216,13 @@ Terrain_FBM2D( world_chunk *Chunk, Assert(NoiseDim.y >= 66); Assert(NoiseDim.z >= 66); - Assert(Chunk->Dim.x >= 64); - Assert(Chunk->Dim.y >= 66); - Assert(Chunk->Dim.z >= 66); + Assert(Chunk->Dim.x == 64); + Assert(Chunk->Dim.y == 66); + Assert(Chunk->Dim.z == 66); for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) { - f32 zCoord = 75.f; + /* f32 zCoord = 75.f; */ + f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, (zNoise)*NoiseUpsampleFactor, Chunk->DimInChunks); f32 WorldZBiased = zCoord - zMin; for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) { @@ -234,179 +234,26 @@ Terrain_FBM2D( world_chunk *Chunk, r32 ThisNoiseV = NoiseValues[BorderIndex]; u64 NoiseChoice = ThisNoiseV > WorldZBiased; - - s32 NextXChunkIndex = GetIndex(BorderP, Chunk->Dim); - s64 NextChoice = GetOccupancyBit(Chunk, NextXChunkIndex); - - /* s32 NextXChunkIndex = GetIndex(BorderP+V3(1,0,0), Chunk->Dim); */ - if (NoiseChoice) - { - Chunk->Voxels[NextXChunkIndex].Color = PackHSVColor(HSV_PINK); - } - - /* if (NextChoice) */ - /* { */ - /* Chunk->Voxels[NextXChunkIndex].Color = PackHSVColor(HSV_YELLOW); */ - /* } */ - -/* if (NoiseChoice && NextChoice) */ -/* { */ -/* Chunk->Voxels[NextXChunkIndex].Color = PackHSVColor(HSV_WHITE); */ -/* /1* Chunk->Voxels[ThisChunkIndex].Color = PackHSVColor(HSV_WHITE); *1/ */ -/* } */ - /* u64 NoiseChoice = 1ull; */ /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ Chunk->xOccupancyBorder[(zNoise-1)*2] |= NoiseChoice << (yNoise-1); } - /* { */ - /* v3i BorderP = V3i(65, y, z)/NoiseUpsampleFactor; */ - /* s32 BorderIndex = GetIndex(BorderP, NoiseDim); */ - - /* r32 ThisNoiseV = NoiseValues[BorderIndex]; */ - - /* u64 NoiseChoice = ThisNoiseV > WorldZBiased; */ - /* /1* u64 NoiseChoice = 1ull; *1/ */ - /* /1* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; *1/ */ - /* Chunk->xOccupancyBorder[((z-1)*2)+1] |= NoiseChoice << (y-1); */ - /* } */ - - } - } - } - -#if 0 - { - // Have to multiply by 64 because xOccupancyBorder_ElementCount is the number of - // u64 elements, and we need a value per bit - - v3i BorderValuesDim = V3i(2, xOccupancyBorder_Dim.y, xOccupancyBorder_Dim.z); - /* Assert(BorderValuesDim.y == NoiseDim.y); */ - /* Assert(BorderValuesDim.z == NoiseDim.z); */ - const s32 BorderValueCount = xOccupancyBorder_ElementCount*64; - f32 *BorderValues = Allocate(f32, GetTranArena(), BorderValueCount); - // TODO(Jesse): Make this dynamic - Assert(Octaves < 8); - perlin_params zParams[8]; - perlin_params yParams[16]; - perlin_params xParams[8]; - f32 yCoords[16]; - - for ( s32 z = 0; z < BorderValuesDim.z; ++ z) - { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, z*NoiseUpsampleFactor, Chunk->DimInChunks); - - v3 InteriorPeriod = Period; - RangeIterator_t(u32, OctaveIndex, Octaves) - { - zParams[OctaveIndex] = ComputePerlinParameters(F32_8X(zCoord/InteriorPeriod.z), PrimeZ); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); - } - - for ( s32 y = 0; y < BorderValuesDim.y; y += 16) - { - f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, y*NoiseUpsampleFactor, Chunk->DimInChunks); - - RangeIterator(ValueIndex, 16) - { - yCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(y, Basis, (y+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)); - } - auto _y0 = F32_8X( yCoords[0], yCoords[1], yCoords[2], yCoords[3], yCoords[4], yCoords[5], yCoords[6], yCoords[7] ); - auto _y1 = F32_8X( yCoords[8], yCoords[9], yCoords[10], yCoords[11], yCoords[12], yCoords[13], yCoords[14], yCoords[15] ); - - InteriorPeriod = Period; - RangeIterator_t(u32, OctaveIndex, Octaves) - { - yParams[0+(OctaveIndex*2)] = ComputePerlinParameters(_y0/F32_8X(InteriorPeriod.y), PrimeY); - yParams[1+(OctaveIndex*2)] = ComputePerlinParameters(_y1/F32_8X(InteriorPeriod.y), PrimeY); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); - } - - { - r32 InteriorAmp = r32(Amplitude); - InteriorPeriod = Period; - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) - { - s32 x = -1; - auto xCoord0 = F32_8X(__COMPUTE_NOISE_INPUT(x, Basis, x*NoiseUpsampleFactor, Chunk->DimInChunks)); - xParams[OctaveIndex] = ComputePerlinParameters(xCoord0, PrimeX); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); - } - - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) - { - s32 BorderIndex = GetIndex(y, z, BorderValuesDim.yz); - Assert(BorderIndex < BorderValueCount); - - PerlinNoise_16x_avx2_y(xParams+OctaveIndex, yParams+(OctaveIndex*2), zParams+OctaveIndex, BorderValues+BorderIndex, InteriorAmp); - InteriorAmp = Max(1.f, InteriorAmp/2.f); - } - } - - { - r32 InteriorAmp = r32(Amplitude); - InteriorPeriod = Period; - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) - { - s32 x = 64; - auto xCoord0 = F32_8X(__COMPUTE_NOISE_INPUT(x, Basis, x*NoiseUpsampleFactor, Chunk->DimInChunks)); - xParams[OctaveIndex] = ComputePerlinParameters(xCoord0, PrimeX); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); - } - - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) - { - s32 BorderIndex = GetIndex(y, z, BorderValuesDim.yz)*2; - Assert(BorderIndex < BorderValueCount); - - PerlinNoise_16x_avx2_y(xParams+OctaveIndex, yParams+(OctaveIndex*2), zParams+OctaveIndex, BorderValues+BorderIndex, InteriorAmp); - InteriorAmp = Max(1.f, InteriorAmp/2.f); - } - } - } - } - - for ( s32 zChunk = 0; zChunk < BorderValuesDim.z; ++ zChunk) - { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, zChunk, Chunk->DimInChunks); - f32 WorldZBiased = zCoord - zMin; - for ( s32 yChunk = 0; yChunk < BorderValuesDim.y; ++ yChunk) - { - - { - v3i NoiseP = V3i(0, yChunk, zChunk)/NoiseUpsampleFactor; - s32 BorderIndex = GetIndex(NoiseP.yz, BorderValuesDim.yz); - - r32 ThisNoiseV = BorderValues[BorderIndex]; - - u64 NoiseChoice = ThisNoiseV > WorldZBiased; - /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ - Chunk->xOccupancyBorder[zChunk] |= NoiseChoice< WorldZBiased; /* u64 NoiseChoice = 1ull; */ /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ - Chunk->xOccupancyBorder[zChunk] |= NoiseChoice<xOccupancyBorder[((zNoise-1)*2)+1] |= NoiseChoice << (yNoise-1); } } } } -#endif - - - - return ChunkSum; } diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index c0f176c2f..4ace147da 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -875,10 +875,10 @@ MarkBoundaryVoxels_NoExteriorFaces( u64 *Occupancy, // 3D space. // // @register_ordering_looks_backwards - /* u64 RightBit = ((RightYRow >> (y-1)) & 1) << 63; */ + u64 RightBit = ((RightYRow >> (y-1)) & 1) << 63; u64 LeftBit = ((LeftYRow >> (y-1)) & 1); - u64 RightBit = 1llu << 63; + /* u64 RightBit = 1llu << 63; */ /* u64 LeftBit = 1; */ /* u64 RightBit = 0; */ From 1e1eaa0ac45cc13d10f279d8e356df1a9c77e632 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 5 Oct 2024 10:21:00 -0700 Subject: [PATCH 056/421] Update stdlib --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index e7172351d..2b707cd02 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit e7172351dba876a7f633407ea84111073b988b88 +Subproject commit 2b707cd025a8f395915b753d6695001f9f4f0aca From a11c8cd06b869cb82fadf4d416bb3b3767218496 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 5 Oct 2024 17:49:43 -0700 Subject: [PATCH 057/421] Fix floating point issue when computing perlin noise --- examples/terrain_gen/game.cpp | 4 ++- external/bonsai_stdlib | 2 +- jesse.make.sh | 4 +-- src/engine/terrain.cpp | 48 +++++++++++++++++++++++------------ src/engine/world.h | 2 +- src/engine/world_chunk.cpp | 2 +- src/tests/perlin_perf.cpp | 3 +++ 7 files changed, 43 insertions(+), 22 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index ae69825e1..0547df85f 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -760,7 +760,8 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() Global_AssetPrefixPath = CSz("examples/terrain_gen/assets"); - world_position WorldCenter = {}; + /* world_position WorldCenter = V3i(s32_MAX-1000); */ + world_position WorldCenter = V3i(100, 100, 0); canonical_position CameraTargetP = {}; StandardCamera(Graphics->Camera, 250000.0f, 20000.0f); @@ -789,6 +790,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* CameraGhost->P.WorldP = V3i(33, -87, 2); */ /* CameraGhost->P.WorldP = V3i(5, -73, 2); */ /* CameraGhost->P.WorldP = V3i(1000, 1000, 100); */ + /* CameraGhost->P.WorldP = WorldCenter; */ CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); SpawnEntity(CameraGhost); diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 2b707cd02..3c28f0950 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 2b707cd025a8f395915b753d6695001f9f4f0aca +Subproject commit 3c28f095059a6be993680c4a9bed53d06c06fbde diff --git a/jesse.make.sh b/jesse.make.sh index 60fb9ef2e..790ce1d41 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,8 +11,8 @@ OPT="-O2" ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ - BuildTests \ - BuildExecutables \ + # BuildTests \ + # BuildExecutables \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 02c8b12e7..5fae4cccd 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -116,33 +116,46 @@ Terrain_FBM2D( world_chunk *Chunk, perlin_params zParams[8]; perlin_params yParams[8]; perlin_params xParams[16]; - f32 xCoords[16]; + u32 xCoords[16]; #define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ f32(basis_chunk_point.channel*WorldChunkDim.channel) \ + f32(offset)*Chunk->DimInChunks.channel \ + SrcToDest.channel \ + + u32_8x xChunkDim8 = U32_8X(u32(WorldChunkDim.x)); + u32_8x yChunkDim8 = U32_8X(u32(WorldChunkDim.y)); + u32_8x zChunkDim8 = U32_8X(u32(WorldChunkDim.z)); + + u32_8x xChunkResolution = U32_8X(u32(Chunk->DimInChunks.x)); + u32_8x yChunkResolution = U32_8X(u32(Chunk->DimInChunks.y)); + u32_8x zChunkResolution = U32_8X(u32(Chunk->DimInChunks.z)); + for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, (zNoise)*NoiseUpsampleFactor, Chunk->DimInChunks); + /* f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, (zNoise)*NoiseUpsampleFactor, Chunk->DimInChunks); */ - v3 InteriorPeriod = Period; + v3i InteriorPeriod = V3i(Period); + u32_8x zOffset = U32_8X(u32(zNoise)); RangeIterator_t(u32, OctaveIndex, Octaves) { - zParams[OctaveIndex] = ComputePerlinParameters(F32_8X(zCoord/InteriorPeriod.z), PrimeZ); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + zParams[OctaveIndex] = ComputePerlinParameters(U32_8X(Basis.z), zOffset, zChunkDim8, zChunkResolution, U32_8X(InteriorPeriod.z), PrimeZ); + /* zParams[OctaveIndex] = ComputePerlinParameters(Chunk, z, InteriorPeriod.z, PrimeZ); */ + InteriorPeriod = Max(V3i(1), InteriorPeriod/2); } for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) { - f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, (yNoise-1)*NoiseUpsampleFactor, Chunk->DimInChunks); + /* f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, (yNoise-1)*NoiseUpsampleFactor, Chunk->DimInChunks); */ + u32_8x yOffset = U32_8X(u32(yNoise)); - InteriorPeriod = Period; + InteriorPeriod = V3i(Period); RangeIterator_t(u32, OctaveIndex, Octaves) { - yParams[OctaveIndex] = ComputePerlinParameters(F32_8X(yCoord/InteriorPeriod.y), PrimeY); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + yParams[OctaveIndex] = ComputePerlinParameters(U32_8X(Basis.y), yOffset, yChunkDim8, yChunkResolution, U32_8X(InteriorPeriod.y), PrimeY); + /* yParams[OctaveIndex] = ComputePerlinParameters(F32_8X(yCoord/InteriorPeriod.y), PrimeY); */ + InteriorPeriod = Max(V3i(1), InteriorPeriod/2); } for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 16 ) @@ -150,22 +163,25 @@ Terrain_FBM2D( world_chunk *Chunk, s32 NoiseIndex = GetIndex(xNoise, yNoise, zNoise, NoiseDim); r32 InteriorAmp = r32(Amplitude); - InteriorPeriod = Period; + InteriorPeriod = V3i(Period); for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { RangeIterator(ValueIndex, 16) { Assert(ValueIndex < 16); // NOTE(Jesse): Sub one because the noise is dilated one on the x axis - xCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(x, Basis, (xNoise-1+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)) / InteriorPeriod.x; + xCoords[ValueIndex] = u32(xNoise-1+ValueIndex); + /* xCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(x, Basis, (xNoise-1+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)) / InteriorPeriod.x; */ } - auto _x0 = F32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); - auto _x1 = F32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); + auto _x0 = U32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); + auto _x1 = U32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); u32 xParamsIndex = (OctaveIndex*2); Assert(xParamsIndex < 15); - xParams[xParamsIndex] = ComputePerlinParameters(_x0, PrimeX); - xParams[xParamsIndex+1] = ComputePerlinParameters(_x1, PrimeX); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); + xParams[OctaveIndex] = ComputePerlinParameters(U32_8X(Basis.x), _x0, xChunkDim8, xChunkResolution, U32_8X(u32(InteriorPeriod.x)), PrimeX); + xParams[OctaveIndex+1] = ComputePerlinParameters(U32_8X(Basis.x), _x1, xChunkDim8, xChunkResolution, U32_8X(u32(InteriorPeriod.x)), PrimeX); + /* xParams[xParamsIndex] = ComputePerlinParameters(_x0, PrimeX); */ + /* xParams[xParamsIndex+1] = ComputePerlinParameters(_x1, PrimeX); */ + InteriorPeriod = Max(V3i(1), InteriorPeriod/2); } for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) diff --git a/src/engine/world.h b/src/engine/world.h index e264294d6..f8271706b 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -34,7 +34,7 @@ poof(freelist_allocator(octree_node)) struct world { - v3i Center; + v3i Center; // the world chunk position of the center of the visible region v3i VisibleRegion; // The number of chunks in xyz we're going to update and render /* u32 HashSlotsUsed; */ diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 4ace147da..6394dd2e4 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3522,7 +3522,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, // Map to absolute space. Very bad, no good, do not try this at home. // - v3i NoiseBasis = NoiseBasisOffset + (DestChunk->WorldP*GetWorldChunkDim()); + v3i NoiseBasis = GetWorld()->Center + NoiseBasisOffset + (DestChunk->WorldP*GetWorldChunkDim()); u32 SyntheticChunkSum = NoiseCallback( SyntheticChunk, NoiseBasis, diff --git a/src/tests/perlin_perf.cpp b/src/tests/perlin_perf.cpp index 4d9ccb00a..3c7f10ff2 100644 --- a/src/tests/perlin_perf.cpp +++ b/src/tests/perlin_perf.cpp @@ -66,6 +66,8 @@ main(s32 ArgCount, const char** Args) perlin_params yParams; perlin_params xParams[2]; + NotImplemented; +#if 0 u64 CyclesElapsed = 0; u64 CellsGenerated = 0; RangeIterator(Index, 4096*32) @@ -109,6 +111,7 @@ main(s32 ArgCount, const char** Args) printf("CyclesPerCell (%.2f)\n", CyclesPerCell); } } +#endif /* RangeIterator(Index, 4096) */ From 2d55b11e89a80943bad20dc84e061bb29360695e Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 5 Oct 2024 18:21:19 -0700 Subject: [PATCH 058/421] Confirm FP errors fixed by testing with a massive global offset --- jesse.make.sh | 4 ++-- src/engine/terrain.cpp | 37 +++++++++++++++---------------------- src/engine/world_chunk.cpp | 6 +----- 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/jesse.make.sh b/jesse.make.sh index 790ce1d41..60fb9ef2e 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,8 +11,8 @@ OPT="-O2" ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ - # BuildTests \ - # BuildExecutables \ + BuildTests \ + BuildExecutables \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 5fae4cccd..4a778c0b3 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -85,8 +85,6 @@ Terrain_FBM2D( world_chunk *Chunk, s32 NoiseUpsampleFactor = 1; - v3i Basis = Chunk->WorldP; - /* v3i NoiseDim = RoundUp(Chunk->Dim/2, V3i(16)); */ /* v3i NoiseDim = RoundUp((Chunk->Dim+2)/NoiseUpsampleFactor, V3i(16, 1, 1)); */ v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0))/NoiseUpsampleFactor, V3i(16)); @@ -118,12 +116,6 @@ Terrain_FBM2D( world_chunk *Chunk, perlin_params xParams[16]; u32 xCoords[16]; -#define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ - f32(basis_chunk_point.channel*WorldChunkDim.channel) \ - + f32(offset)*Chunk->DimInChunks.channel \ - + SrcToDest.channel \ - - u32_8x xChunkDim8 = U32_8X(u32(WorldChunkDim.x)); u32_8x yChunkDim8 = U32_8X(u32(WorldChunkDim.y)); u32_8x zChunkDim8 = U32_8X(u32(WorldChunkDim.z)); @@ -132,29 +124,27 @@ Terrain_FBM2D( world_chunk *Chunk, u32_8x yChunkResolution = U32_8X(u32(Chunk->DimInChunks.y)); u32_8x zChunkResolution = U32_8X(u32(Chunk->DimInChunks.z)); + /* u32 Offset = 200'000'000; */ + /* v3i WorldBasis = V3i(Offset, Offset, 0) + NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); */ + v3i WorldBasis = NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) { - /* f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, (zNoise)*NoiseUpsampleFactor, Chunk->DimInChunks); */ - v3i InteriorPeriod = V3i(Period); u32_8x zOffset = U32_8X(u32(zNoise)); RangeIterator_t(u32, OctaveIndex, Octaves) { - zParams[OctaveIndex] = ComputePerlinParameters(U32_8X(Basis.z), zOffset, zChunkDim8, zChunkResolution, U32_8X(InteriorPeriod.z), PrimeZ); - /* zParams[OctaveIndex] = ComputePerlinParameters(Chunk, z, InteriorPeriod.z, PrimeZ); */ + zParams[OctaveIndex] = ComputePerlinParameters(U32_8X(WorldBasis.z), zOffset, zChunkResolution, U32_8X(InteriorPeriod.z), PrimeZ); InteriorPeriod = Max(V3i(1), InteriorPeriod/2); } for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) { - /* f32 yCoord = __COMPUTE_NOISE_INPUT(y, Basis, (yNoise-1)*NoiseUpsampleFactor, Chunk->DimInChunks); */ u32_8x yOffset = U32_8X(u32(yNoise)); InteriorPeriod = V3i(Period); RangeIterator_t(u32, OctaveIndex, Octaves) { - yParams[OctaveIndex] = ComputePerlinParameters(U32_8X(Basis.y), yOffset, yChunkDim8, yChunkResolution, U32_8X(InteriorPeriod.y), PrimeY); - /* yParams[OctaveIndex] = ComputePerlinParameters(F32_8X(yCoord/InteriorPeriod.y), PrimeY); */ + yParams[OctaveIndex] = ComputePerlinParameters(U32_8X(WorldBasis.y), yOffset, yChunkResolution, U32_8X(InteriorPeriod.y), PrimeY); InteriorPeriod = Max(V3i(1), InteriorPeriod/2); } @@ -171,16 +161,13 @@ Terrain_FBM2D( world_chunk *Chunk, Assert(ValueIndex < 16); // NOTE(Jesse): Sub one because the noise is dilated one on the x axis xCoords[ValueIndex] = u32(xNoise-1+ValueIndex); - /* xCoords[ValueIndex] = (__COMPUTE_NOISE_INPUT(x, Basis, (xNoise-1+ValueIndex)*NoiseUpsampleFactor, Chunk->DimInChunks)) / InteriorPeriod.x; */ } auto _x0 = U32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); auto _x1 = U32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); u32 xParamsIndex = (OctaveIndex*2); Assert(xParamsIndex < 15); - xParams[OctaveIndex] = ComputePerlinParameters(U32_8X(Basis.x), _x0, xChunkDim8, xChunkResolution, U32_8X(u32(InteriorPeriod.x)), PrimeX); - xParams[OctaveIndex+1] = ComputePerlinParameters(U32_8X(Basis.x), _x1, xChunkDim8, xChunkResolution, U32_8X(u32(InteriorPeriod.x)), PrimeX); - /* xParams[xParamsIndex] = ComputePerlinParameters(_x0, PrimeX); */ - /* xParams[xParamsIndex+1] = ComputePerlinParameters(_x1, PrimeX); */ + xParams[OctaveIndex] = ComputePerlinParameters(U32_8X(WorldBasis.x), _x0, xChunkResolution, U32_8X(u32(InteriorPeriod.x)), PrimeX); + xParams[OctaveIndex+1] = ComputePerlinParameters(U32_8X(WorldBasis.x), _x1, xChunkResolution, U32_8X(u32(InteriorPeriod.x)), PrimeX); InteriorPeriod = Max(V3i(1), InteriorPeriod/2); } @@ -195,9 +182,15 @@ Terrain_FBM2D( world_chunk *Chunk, } } + +#define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ + f32(basis_chunk_point.channel) \ + + f32(offset)*Chunk->DimInChunks.channel \ + + SrcToDest.channel \ + for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, (zChunk)*NoiseUpsampleFactor, Chunk->DimInChunks); + f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zChunk)*NoiseUpsampleFactor, Chunk->DimInChunks); /* f32 zCoord = 75.f; */ f32 WorldZBiased = zCoord - zMin; for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) @@ -238,7 +231,7 @@ Terrain_FBM2D( world_chunk *Chunk, for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) { /* f32 zCoord = 75.f; */ - f32 zCoord = __COMPUTE_NOISE_INPUT(z, Basis, (zNoise)*NoiseUpsampleFactor, Chunk->DimInChunks); + f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zNoise)*NoiseUpsampleFactor, Chunk->DimInChunks); f32 WorldZBiased = zCoord - zMin; for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) { diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 6394dd2e4..4746f03b4 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3520,12 +3520,8 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, world_chunk *SyntheticChunk = AllocateWorldChunk(SynChunkP, SynChunkDim, DestChunk->DimInChunks, Thread->TempMemory); - // Map to absolute space. Very bad, no good, do not try this at home. - // - v3i NoiseBasis = GetWorld()->Center + NoiseBasisOffset + (DestChunk->WorldP*GetWorldChunkDim()); - u32 SyntheticChunkSum = NoiseCallback( SyntheticChunk, - NoiseBasis, + NoiseBasisOffset, NoiseParams, UserData ); From 231d4949ded10cba0c36ef23eb9ff763d1845576 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 5 Oct 2024 19:03:32 -0700 Subject: [PATCH 059/421] Fix a bug w/ more than 1 octave --- examples/terrain_gen/game.cpp | 16 ++++++++-------- examples/terrain_gen/game_constants.h | 4 ++-- external/bonsai_stdlib | 2 +- src/engine/terrain.cpp | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 0547df85f..ff63813db 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -481,10 +481,10 @@ BONSAI_API_WORKER_THREAD_CALLBACK() { /* // FBM params */ - /* v3 Period = V3(18000); */ - /* s32 Amplititude = 10000; */ - /* s32 StartingZDepth = 5000; */ - /* u32 Octaves = 6; */ + v3 Period = V3(100000); + s32 Amplititude = 20000; + s32 StartingZDepth = 5000; + u32 Octaves = 7; /* v3 Period = V3(500); */ /* s32 Amplititude = 500; */ @@ -504,10 +504,10 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* u32 Octaves = 1; */ /* /1* u32 Octaves = 4; *1/ */ - v3 Period = V3(50); - s32 Amplititude = 60; - s32 StartingZDepth = 60; - u32 Octaves = 1; +/* v3 Period = V3(50); */ +/* s32 Amplititude = 60; */ +/* s32 StartingZDepth = 60; */ +/* u32 Octaves = 4; */ /* u32 Octaves = 4; */ diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index e16c2a591..5bea3de83 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -11,14 +11,14 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ // 26km -/* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ +g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ -g_VisibleRegion = Chunk_Dimension(8, 8, 8); +/* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ /* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 3c28f0950..119fb6fa1 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 3c28f095059a6be993680c4a9bed53d06c06fbde +Subproject commit 119fb6fa1737121372637a94a933841819f42568 diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 4a778c0b3..93e8b4653 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -166,8 +166,8 @@ Terrain_FBM2D( world_chunk *Chunk, auto _x1 = U32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); u32 xParamsIndex = (OctaveIndex*2); Assert(xParamsIndex < 15); - xParams[OctaveIndex] = ComputePerlinParameters(U32_8X(WorldBasis.x), _x0, xChunkResolution, U32_8X(u32(InteriorPeriod.x)), PrimeX); - xParams[OctaveIndex+1] = ComputePerlinParameters(U32_8X(WorldBasis.x), _x1, xChunkResolution, U32_8X(u32(InteriorPeriod.x)), PrimeX); + xParams[(OctaveIndex*2)] = ComputePerlinParameters(U32_8X(WorldBasis.x), _x0, xChunkResolution, U32_8X(u32(InteriorPeriod.x)), PrimeX); + xParams[(OctaveIndex*2)+1] = ComputePerlinParameters(U32_8X(WorldBasis.x), _x1, xChunkResolution, U32_8X(u32(InteriorPeriod.x)), PrimeX); InteriorPeriod = Max(V3i(1), InteriorPeriod/2); } From cd9a2a7b7fcf07eb122ec3f35da8b4a12be79216 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 6 Oct 2024 17:43:11 -0700 Subject: [PATCH 060/421] Implement Agner Fogs fast unsigned integer AVX divide --- external/bonsai_stdlib | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + src/engine/terrain.cpp | 32 ++++++++++++++++++++---------- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 119fb6fa1..4046ecdb9 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 119fb6fa1737121372637a94a933841819f42568 +Subproject commit 4046ecdb91886b0e8d33cb3a58b83b856fce8e71 diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 1ff1da8af..53ddddf5d 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -645,6 +645,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index d431884d8..b68141172 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -635,6 +635,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 8af862c88..f02ac0390 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -635,6 +635,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 93e8b4653..af3e1f727 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -32,6 +32,10 @@ Terrain_Flat( world_chunk *Chunk, global_variable random_series DEBUG_ENTROPY = {653765435432}; +// 27.0m cycles | f32 ComputePerlinParameters +// +// 30.0m cycles | u32 ComputePerlinParameters +// 28.7m cycles | u32 ComputePerlinParameters link_internal u32 Terrain_FBM2D( world_chunk *Chunk, v3i NoiseBasis, @@ -108,6 +112,11 @@ Terrain_FBM2D( world_chunk *Chunk, Chunk->NormalValues = Normals; #endif + // TODO(Jesse): Make this dynamic + Assert(Octaves < 8); + avx_divisor zPeriods[8]; + avx_divisor yPeriods[8]; + avx_divisor xPeriods[8]; // TODO(Jesse): Make this dynamic Assert(Octaves < 8); @@ -124,28 +133,33 @@ Terrain_FBM2D( world_chunk *Chunk, u32_8x yChunkResolution = U32_8X(u32(Chunk->DimInChunks.y)); u32_8x zChunkResolution = U32_8X(u32(Chunk->DimInChunks.z)); + v3i InteriorPeriod = V3i(Period); + RangeIterator_t(u32, OctaveIndex, Octaves) + { + zPeriods[OctaveIndex] = AvxDivisor(u32(InteriorPeriod.z)); + yPeriods[OctaveIndex] = AvxDivisor(u32(InteriorPeriod.y)); + xPeriods[OctaveIndex] = AvxDivisor(u32(InteriorPeriod.x)); + InteriorPeriod = Max(V3i(1), InteriorPeriod/2); + } + /* u32 Offset = 200'000'000; */ /* v3i WorldBasis = V3i(Offset, Offset, 0) + NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); */ v3i WorldBasis = NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) { - v3i InteriorPeriod = V3i(Period); u32_8x zOffset = U32_8X(u32(zNoise)); RangeIterator_t(u32, OctaveIndex, Octaves) { - zParams[OctaveIndex] = ComputePerlinParameters(U32_8X(WorldBasis.z), zOffset, zChunkResolution, U32_8X(InteriorPeriod.z), PrimeZ); - InteriorPeriod = Max(V3i(1), InteriorPeriod/2); + zParams[OctaveIndex] = ComputePerlinParameters(U32_8X(WorldBasis.z), zOffset, zChunkResolution, zPeriods[OctaveIndex], PrimeZ); } for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) { u32_8x yOffset = U32_8X(u32(yNoise)); - InteriorPeriod = V3i(Period); RangeIterator_t(u32, OctaveIndex, Octaves) { - yParams[OctaveIndex] = ComputePerlinParameters(U32_8X(WorldBasis.y), yOffset, yChunkResolution, U32_8X(InteriorPeriod.y), PrimeY); - InteriorPeriod = Max(V3i(1), InteriorPeriod/2); + yParams[OctaveIndex] = ComputePerlinParameters(U32_8X(WorldBasis.y), yOffset, yChunkResolution, yPeriods[OctaveIndex], PrimeY); } for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 16 ) @@ -153,7 +167,6 @@ Terrain_FBM2D( world_chunk *Chunk, s32 NoiseIndex = GetIndex(xNoise, yNoise, zNoise, NoiseDim); r32 InteriorAmp = r32(Amplitude); - InteriorPeriod = V3i(Period); for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { RangeIterator(ValueIndex, 16) @@ -166,9 +179,8 @@ Terrain_FBM2D( world_chunk *Chunk, auto _x1 = U32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); u32 xParamsIndex = (OctaveIndex*2); Assert(xParamsIndex < 15); - xParams[(OctaveIndex*2)] = ComputePerlinParameters(U32_8X(WorldBasis.x), _x0, xChunkResolution, U32_8X(u32(InteriorPeriod.x)), PrimeX); - xParams[(OctaveIndex*2)+1] = ComputePerlinParameters(U32_8X(WorldBasis.x), _x1, xChunkResolution, U32_8X(u32(InteriorPeriod.x)), PrimeX); - InteriorPeriod = Max(V3i(1), InteriorPeriod/2); + xParams[(OctaveIndex*2)] = ComputePerlinParameters(U32_8X(WorldBasis.x), _x0, xChunkResolution, xPeriods[OctaveIndex], PrimeX); + xParams[(OctaveIndex*2)+1] = ComputePerlinParameters(U32_8X(WorldBasis.x), _x1, xChunkResolution, xPeriods[OctaveIndex], PrimeX); } for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) From cfece089189672b53d45510c327edfe4a4eef445 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 6 Oct 2024 20:14:22 -0700 Subject: [PATCH 061/421] Add ComputePerlinParameters_scalar --- examples/terrain_gen/game.cpp | 19 +++++----- external/bonsai_stdlib | 2 +- generated/gen_constructor_perlin_params.h | 21 +++++++++++ src/engine/terrain.cpp | 44 ++++++++++++----------- 4 files changed, 54 insertions(+), 32 deletions(-) create mode 100644 generated/gen_constructor_perlin_params.h diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index ff63813db..079355113 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -481,22 +481,21 @@ BONSAI_API_WORKER_THREAD_CALLBACK() { /* // FBM params */ - v3 Period = V3(100000); - s32 Amplititude = 20000; - s32 StartingZDepth = 5000; - u32 Octaves = 7; + + /* v3 Period = V3(100000); */ + /* s32 Amplititude = 20000; */ + /* s32 StartingZDepth = 5000; */ + /* u32 Octaves = 7; */ /* v3 Period = V3(500); */ /* s32 Amplititude = 500; */ /* s32 StartingZDepth = 500; */ /* u32 Octaves = 1; */ - /* v3 Period = V3(1000); */ - /* s32 Amplititude = 800; */ - /* s32 StartingZDepth = 1000; */ - /* /1* s32 StartingZDepth = 0; *1/ */ - /* /1* u32 Octaves = 1; *1/ */ - /* u32 Octaves = 6; */ + v3 Period = V3(1000); + s32 Amplititude = 800; + s32 StartingZDepth = 1000; + u32 Octaves = 7; /* v3 Period = V3(2500); */ /* s32 Amplititude = 1500; */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 4046ecdb9..6af7955aa 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 4046ecdb91886b0e8d33cb3a58b83b856fce8e71 +Subproject commit 6af7955aadaaef0987c8b1571a96f0da0b1aa556 diff --git a/generated/gen_constructor_perlin_params.h b/generated/gen_constructor_perlin_params.h new file mode 100644 index 000000000..2dff3a02d --- /dev/null +++ b/generated/gen_constructor_perlin_params.h @@ -0,0 +1,21 @@ +// external/bonsai_stdlib/src/perlin.h:12:0 + +link_internal perlin_params +PerlinParams( u32_8x P0 , u32_8x P1 , f32_8x Fract0 , f32_8x Fract1 , f32_8x Fade ) +{ + perlin_params Reuslt = { + .P0 = P0 +, + .P1 = P1 +, + .Fract0 = Fract0 +, + .Fract1 = Fract1 +, + .Fade = Fade + }; + + + return Reuslt; +} + diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index af3e1f727..515b9d07b 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -36,6 +36,7 @@ global_variable random_series DEBUG_ENTROPY = {653765435432}; // // 30.0m cycles | u32 ComputePerlinParameters // 28.7m cycles | u32 ComputePerlinParameters +// 27.8m cycles | u32 ComputePerlinParameters link_internal u32 Terrain_FBM2D( world_chunk *Chunk, v3i NoiseBasis, @@ -54,8 +55,8 @@ Terrain_FBM2D( world_chunk *Chunk, Period = Max(Period, V3(1.f)); auto PrimeX = U32_8X(501125321); - auto PrimeY = U32_8X(1136930381); - auto PrimeZ = U32_8X(1720413743); + auto PrimeY = 1136930381u; + auto PrimeZ = 1720413743u; u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); @@ -114,8 +115,8 @@ Terrain_FBM2D( world_chunk *Chunk, // TODO(Jesse): Make this dynamic Assert(Octaves < 8); - avx_divisor zPeriods[8]; - avx_divisor yPeriods[8]; + u32 zPeriods[8]; + u32 yPeriods[8]; avx_divisor xPeriods[8]; // TODO(Jesse): Make this dynamic @@ -130,14 +131,14 @@ Terrain_FBM2D( world_chunk *Chunk, u32_8x zChunkDim8 = U32_8X(u32(WorldChunkDim.z)); u32_8x xChunkResolution = U32_8X(u32(Chunk->DimInChunks.x)); - u32_8x yChunkResolution = U32_8X(u32(Chunk->DimInChunks.y)); - u32_8x zChunkResolution = U32_8X(u32(Chunk->DimInChunks.z)); + u32 yChunkResolution = u32(Chunk->DimInChunks.y); + u32 zChunkResolution = u32(Chunk->DimInChunks.z); v3i InteriorPeriod = V3i(Period); RangeIterator_t(u32, OctaveIndex, Octaves) { - zPeriods[OctaveIndex] = AvxDivisor(u32(InteriorPeriod.z)); - yPeriods[OctaveIndex] = AvxDivisor(u32(InteriorPeriod.y)); + zPeriods[OctaveIndex] = u32(InteriorPeriod.z); + yPeriods[OctaveIndex] = u32(InteriorPeriod.y); xPeriods[OctaveIndex] = AvxDivisor(u32(InteriorPeriod.x)); InteriorPeriod = Max(V3i(1), InteriorPeriod/2); } @@ -147,46 +148,47 @@ Terrain_FBM2D( world_chunk *Chunk, v3i WorldBasis = NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) { - u32_8x zOffset = U32_8X(u32(zNoise)); + u32 zOffset = u32(zNoise); RangeIterator_t(u32, OctaveIndex, Octaves) { - zParams[OctaveIndex] = ComputePerlinParameters(U32_8X(WorldBasis.z), zOffset, zChunkResolution, zPeriods[OctaveIndex], PrimeZ); + zParams[OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.z), zOffset, zChunkResolution, zPeriods[OctaveIndex], PrimeZ); } for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) { - u32_8x yOffset = U32_8X(u32(yNoise)); + u32 yOffset = u32(yNoise); RangeIterator_t(u32, OctaveIndex, Octaves) { - yParams[OctaveIndex] = ComputePerlinParameters(U32_8X(WorldBasis.y), yOffset, yChunkResolution, yPeriods[OctaveIndex], PrimeY); + yParams[OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.y), yOffset, yChunkResolution, yPeriods[OctaveIndex], PrimeY); } for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 16 ) { s32 NoiseIndex = GetIndex(xNoise, yNoise, zNoise, NoiseDim); - r32 InteriorAmp = r32(Amplitude); for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { RangeIterator(ValueIndex, 16) { - Assert(ValueIndex < 16); + /* Assert(ValueIndex < 16); */ // NOTE(Jesse): Sub one because the noise is dilated one on the x axis xCoords[ValueIndex] = u32(xNoise-1+ValueIndex); } - auto _x0 = U32_8X( xCoords[0], xCoords[1], xCoords[2], xCoords[3], xCoords[4], xCoords[5], xCoords[6], xCoords[7] ); - auto _x1 = U32_8X( xCoords[8], xCoords[9], xCoords[10], xCoords[11], xCoords[12], xCoords[13], xCoords[14], xCoords[15] ); + auto _x0 = U32_8X(xCoords+0); + auto _x1 = U32_8X(xCoords+8); + u32 xParamsIndex = (OctaveIndex*2); - Assert(xParamsIndex < 15); - xParams[(OctaveIndex*2)] = ComputePerlinParameters(U32_8X(WorldBasis.x), _x0, xChunkResolution, xPeriods[OctaveIndex], PrimeX); - xParams[(OctaveIndex*2)+1] = ComputePerlinParameters(U32_8X(WorldBasis.x), _x1, xChunkResolution, xPeriods[OctaveIndex], PrimeX); + /* Assert(xParamsIndex < 15); */ + xParams[(OctaveIndex*2)] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x0, xChunkResolution, xPeriods[OctaveIndex], PrimeX); + xParams[(OctaveIndex*2)+1] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x1, xChunkResolution, xPeriods[OctaveIndex], PrimeX); } + r32 InteriorAmp = r32(Amplitude); for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { - Assert(NoiseIndex < NoiseValuesCount); - Assert(u64(NoiseValues+NoiseIndex) % 32 == 0); + /* Assert(NoiseIndex < NoiseValuesCount); */ + /* Assert(u64(NoiseValues+NoiseIndex) % 32 == 0); */ PerlinNoise_16x_avx2_x(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); } From 77c0d717ba5d707223f146878ad585d20b975cb0 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 7 Oct 2024 17:33:07 -0700 Subject: [PATCH 062/421] 16m cycles to do a full chunk 7 octaves --- external/bonsai_stdlib | 2 +- src/engine/terrain.cpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 6af7955aa..457781891 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 6af7955aadaaef0987c8b1571a96f0da0b1aa556 +Subproject commit 457781891d259681ecff3df913a50b788fb4dbaf diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 515b9d07b..4b05d4951 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -189,7 +189,9 @@ Terrain_FBM2D( world_chunk *Chunk, { /* Assert(NoiseIndex < NoiseValuesCount); */ /* Assert(u64(NoiseValues+NoiseIndex) % 32 == 0); */ - PerlinNoise_16x_avx2_x(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); + /* PerlinNoise_16x_avx2_x(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); */ + PerlinNoise_8x_avx2(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); + PerlinNoise_8x_avx2(xParams+(OctaveIndex*2)+1, yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex+8, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); } } From 54f5ee92341c92d599a9b1e411bb78d544d8f834 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 7 Oct 2024 17:40:41 -0700 Subject: [PATCH 063/421] 12m cycles --- src/engine/terrain.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 4b05d4951..9934f0ea5 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -90,12 +90,12 @@ Terrain_FBM2D( world_chunk *Chunk, s32 NoiseUpsampleFactor = 1; - /* v3i NoiseDim = RoundUp(Chunk->Dim/2, V3i(16)); */ - /* v3i NoiseDim = RoundUp((Chunk->Dim+2)/NoiseUpsampleFactor, V3i(16, 1, 1)); */ - v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0))/NoiseUpsampleFactor, V3i(16)); + /* v3i NoiseDim = RoundUp(Chunk->Dim/2, V3i(8)); */ + /* v3i NoiseDim = RoundUp((Chunk->Dim+2)/NoiseUpsampleFactor, V3i(8, 1, 1)); */ + v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0))/NoiseUpsampleFactor, V3i(8)); /* v3i NoiseDim = Chunk->Dim; */ // NOTE(Jesse): This must hold true for using any Noise_16x func - Assert(NoiseDim.x % 16 == 0); + Assert(NoiseDim.x % 8 == 0); /* v3i NoiseDim = Chunk->Dim + 2; */ @@ -123,8 +123,8 @@ Terrain_FBM2D( world_chunk *Chunk, Assert(Octaves < 8); perlin_params zParams[8]; perlin_params yParams[8]; - perlin_params xParams[16]; - u32 xCoords[16]; + perlin_params xParams[8]; + u32 xCoords[8]; u32_8x xChunkDim8 = U32_8X(u32(WorldChunkDim.x)); u32_8x yChunkDim8 = U32_8X(u32(WorldChunkDim.y)); @@ -163,25 +163,25 @@ Terrain_FBM2D( world_chunk *Chunk, yParams[OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.y), yOffset, yChunkResolution, yPeriods[OctaveIndex], PrimeY); } - for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 16 ) + for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) { s32 NoiseIndex = GetIndex(xNoise, yNoise, zNoise, NoiseDim); for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { - RangeIterator(ValueIndex, 16) + RangeIterator(ValueIndex, 8) { - /* Assert(ValueIndex < 16); */ + /* Assert(ValueIndex < 8); */ // NOTE(Jesse): Sub one because the noise is dilated one on the x axis xCoords[ValueIndex] = u32(xNoise-1+ValueIndex); } auto _x0 = U32_8X(xCoords+0); - auto _x1 = U32_8X(xCoords+8); + /* auto _x1 = U32_8X(xCoords+8); */ u32 xParamsIndex = (OctaveIndex*2); /* Assert(xParamsIndex < 15); */ - xParams[(OctaveIndex*2)] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x0, xChunkResolution, xPeriods[OctaveIndex], PrimeX); - xParams[(OctaveIndex*2)+1] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x1, xChunkResolution, xPeriods[OctaveIndex], PrimeX); + xParams[OctaveIndex] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x0, xChunkResolution, xPeriods[OctaveIndex], PrimeX); + /* xParams[(OctaveIndex*2)+1] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x1, xChunkResolution, xPeriods[OctaveIndex], PrimeX); */ } r32 InteriorAmp = r32(Amplitude); @@ -190,8 +190,8 @@ Terrain_FBM2D( world_chunk *Chunk, /* Assert(NoiseIndex < NoiseValuesCount); */ /* Assert(u64(NoiseValues+NoiseIndex) % 32 == 0); */ /* PerlinNoise_16x_avx2_x(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); */ - PerlinNoise_8x_avx2(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); - PerlinNoise_8x_avx2(xParams+(OctaveIndex*2)+1, yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex+8, InteriorAmp); + PerlinNoise_8x_avx2(xParams+OctaveIndex, yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); + /* PerlinNoise_8x_avx2(xParams+(OctaveIndex*2)+1, yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex+8, InteriorAmp); */ InteriorAmp = Max(1.f, InteriorAmp/2.f); } } From 8302802e204ff8c514c2fecf3a33088b4d9b9730 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 7 Oct 2024 17:54:49 -0700 Subject: [PATCH 064/421] Cleanup dead comments --- src/engine/terrain.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 9934f0ea5..f59c452b3 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -171,27 +171,17 @@ Terrain_FBM2D( world_chunk *Chunk, { RangeIterator(ValueIndex, 8) { - /* Assert(ValueIndex < 8); */ - // NOTE(Jesse): Sub one because the noise is dilated one on the x axis xCoords[ValueIndex] = u32(xNoise-1+ValueIndex); } auto _x0 = U32_8X(xCoords+0); - /* auto _x1 = U32_8X(xCoords+8); */ - u32 xParamsIndex = (OctaveIndex*2); - /* Assert(xParamsIndex < 15); */ xParams[OctaveIndex] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x0, xChunkResolution, xPeriods[OctaveIndex], PrimeX); - /* xParams[(OctaveIndex*2)+1] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x1, xChunkResolution, xPeriods[OctaveIndex], PrimeX); */ } r32 InteriorAmp = r32(Amplitude); for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) { - /* Assert(NoiseIndex < NoiseValuesCount); */ - /* Assert(u64(NoiseValues+NoiseIndex) % 32 == 0); */ - /* PerlinNoise_16x_avx2_x(xParams+(OctaveIndex*2), yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); */ PerlinNoise_8x_avx2(xParams+OctaveIndex, yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); - /* PerlinNoise_8x_avx2(xParams+(OctaveIndex*2)+1, yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex+8, InteriorAmp); */ InteriorAmp = Max(1.f, InteriorAmp/2.f); } } From 19a06f023253c129773e896c72cf9cbd7568cbfb Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 7 Oct 2024 20:46:59 -0700 Subject: [PATCH 065/421] Setup to pull ComputePerlinParameters out of the hot loop --- src/engine/terrain.cpp | 84 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index f59c452b3..c79a63c2c 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -61,7 +61,7 @@ Terrain_FBM2D( world_chunk *Chunk, u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); - u32 Octaves = *(u32*)OctaveCount; + s32 Octaves = *(s32*)OctaveCount; #if 0 s32 MinZ = Chunk->WorldP.z*WorldChunkDim.z; @@ -135,7 +135,7 @@ Terrain_FBM2D( world_chunk *Chunk, u32 zChunkResolution = u32(Chunk->DimInChunks.z); v3i InteriorPeriod = V3i(Period); - RangeIterator_t(u32, OctaveIndex, Octaves) + RangeIterator(OctaveIndex, Octaves) { zPeriods[OctaveIndex] = u32(InteriorPeriod.z); yPeriods[OctaveIndex] = u32(InteriorPeriod.y); @@ -146,10 +146,81 @@ Terrain_FBM2D( world_chunk *Chunk, /* u32 Offset = 200'000'000; */ /* v3i WorldBasis = V3i(Offset, Offset, 0) + NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); */ v3i WorldBasis = NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); + + perlin_params *_xParams = Allocate(perlin_params, TempArena, NoiseDim.x*Octaves); + perlin_params *_yParams = Allocate(perlin_params, TempArena, NoiseDim.y*Octaves); + perlin_params *_zParams = Allocate(perlin_params, TempArena, NoiseDim.z*Octaves); + + u64 StartingCycles = __rdtsc(); + + { + TIMED_NAMED_BLOCK(precalculate_parameters); + + for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) + { + RangeIterator(OctaveIndex, Octaves) + { + _zParams[(zNoise*OctaveIndex)+OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.z), u32(zNoise), zChunkResolution, zPeriods[OctaveIndex], PrimeZ); + } + } + + for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) + { + RangeIterator(OctaveIndex, Octaves) + { + _yParams[(yNoise*OctaveIndex)+OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.y), u32(yNoise), yChunkResolution, yPeriods[OctaveIndex], PrimeY); + } + } + + u32 *_xCoords = Allocate(u32, TempArena, NoiseDim.x*Octaves); + for ( s32 xNoise = 0; xNoise < NoiseDim.x; ++ xNoise ) + { + _xCoords[xNoise] = u32(xNoise-1); + } + + for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) + { + RangeIterator(OctaveIndex, Octaves) + { + auto _x0 = U32_8X(_xCoords+xNoise); + _xParams[(xNoise*OctaveIndex)+OctaveIndex] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x0, xChunkResolution, xPeriods[OctaveIndex], PrimeX); + } + } + } + + +#if 0 + { + TIMED_NAMED_BLOCK(octaves); + /* s32 ResultOffset = 0; */ + for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) + { + for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) + { + for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) + { + s32 ResultOffset = GetIndex(xNoise, yNoise, zNoise, NoiseDim); + r32 InteriorAmp = r32(Amplitude); + RangeIterator(OctaveIndex, Octaves) + { + auto zParam = zParams+(zNoise*OctaveIndex) + OctaveIndex; + auto yParam = yParams+(yNoise*OctaveIndex) + OctaveIndex; + auto xParam = xParams+(xNoise*OctaveIndex) + OctaveIndex; + PerlinNoise_8x_avx2(xParam, yParam, zParam, NoiseValues+ResultOffset, InteriorAmp); + InteriorAmp = Max(1.f, InteriorAmp/2.f); + } + + /* ResultOffset += 8; */ + } + } + } + } +#endif + for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) { u32 zOffset = u32(zNoise); - RangeIterator_t(u32, OctaveIndex, Octaves) + RangeIterator(OctaveIndex, Octaves) { zParams[OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.z), zOffset, zChunkResolution, zPeriods[OctaveIndex], PrimeZ); } @@ -158,7 +229,7 @@ Terrain_FBM2D( world_chunk *Chunk, { u32 yOffset = u32(yNoise); - RangeIterator_t(u32, OctaveIndex, Octaves) + RangeIterator(OctaveIndex, Octaves) { yParams[OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.y), yOffset, yChunkResolution, yPeriods[OctaveIndex], PrimeY); } @@ -167,19 +238,18 @@ Terrain_FBM2D( world_chunk *Chunk, { s32 NoiseIndex = GetIndex(xNoise, yNoise, zNoise, NoiseDim); - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + RangeIterator(OctaveIndex, Octaves) { RangeIterator(ValueIndex, 8) { xCoords[ValueIndex] = u32(xNoise-1+ValueIndex); } auto _x0 = U32_8X(xCoords+0); - u32 xParamsIndex = (OctaveIndex*2); xParams[OctaveIndex] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x0, xChunkResolution, xPeriods[OctaveIndex], PrimeX); } r32 InteriorAmp = r32(Amplitude); - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) + RangeIterator(OctaveIndex, Octaves) { PerlinNoise_8x_avx2(xParams+OctaveIndex, yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); From 8ed60afa96f6349595a4a0740e51b8962816d14a Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 7 Oct 2024 21:35:15 -0700 Subject: [PATCH 066/421] Finish pulling perlin_parameters pre-calculations out of hot loop --- examples/terrain_gen/game.cpp | 3 +- external/bonsai_stdlib | 2 +- src/engine/terrain.cpp | 68 +++++++---------------------------- 3 files changed, 15 insertions(+), 58 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 079355113..f8a125b77 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -495,7 +495,8 @@ BONSAI_API_WORKER_THREAD_CALLBACK() v3 Period = V3(1000); s32 Amplititude = 800; s32 StartingZDepth = 1000; - u32 Octaves = 7; + /* u32 Octaves = 7; */ + u32 Octaves = 1; /* v3 Period = V3(2500); */ /* s32 Amplititude = 1500; */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 457781891..770baa72a 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 457781891d259681ecff3df913a50b788fb4dbaf +Subproject commit 770baa72a8243ed6c48cc20464d44158feb43d0b diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index c79a63c2c..da1179fe0 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -160,7 +160,8 @@ Terrain_FBM2D( world_chunk *Chunk, { RangeIterator(OctaveIndex, Octaves) { - _zParams[(zNoise*OctaveIndex)+OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.z), u32(zNoise), zChunkResolution, zPeriods[OctaveIndex], PrimeZ); + /* zParams[OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.z), zOffset, zChunkResolution, zPeriods[OctaveIndex], PrimeZ); */ + _zParams[zNoise] = ComputePerlinParameters_scalar(u32(WorldBasis.z), u32(zNoise), zChunkResolution, zPeriods[OctaveIndex], PrimeZ); } } @@ -168,7 +169,7 @@ Terrain_FBM2D( world_chunk *Chunk, { RangeIterator(OctaveIndex, Octaves) { - _yParams[(yNoise*OctaveIndex)+OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.y), u32(yNoise), yChunkResolution, yPeriods[OctaveIndex], PrimeY); + _yParams[yNoise] = ComputePerlinParameters_scalar(u32(WorldBasis.y), u32(yNoise), yChunkResolution, yPeriods[OctaveIndex], PrimeY); } } @@ -183,81 +184,36 @@ Terrain_FBM2D( world_chunk *Chunk, RangeIterator(OctaveIndex, Octaves) { auto _x0 = U32_8X(_xCoords+xNoise); - _xParams[(xNoise*OctaveIndex)+OctaveIndex] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x0, xChunkResolution, xPeriods[OctaveIndex], PrimeX); + _xParams[xNoise] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x0, xChunkResolution, xPeriods[OctaveIndex], PrimeX); } } } - -#if 0 - { - TIMED_NAMED_BLOCK(octaves); - /* s32 ResultOffset = 0; */ - for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) - { - for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) - { - for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) - { - s32 ResultOffset = GetIndex(xNoise, yNoise, zNoise, NoiseDim); - r32 InteriorAmp = r32(Amplitude); - RangeIterator(OctaveIndex, Octaves) - { - auto zParam = zParams+(zNoise*OctaveIndex) + OctaveIndex; - auto yParam = yParams+(yNoise*OctaveIndex) + OctaveIndex; - auto xParam = xParams+(xNoise*OctaveIndex) + OctaveIndex; - PerlinNoise_8x_avx2(xParam, yParam, zParam, NoiseValues+ResultOffset, InteriorAmp); - InteriorAmp = Max(1.f, InteriorAmp/2.f); - } - - /* ResultOffset += 8; */ - } - } - } - } -#endif - for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) { - u32 zOffset = u32(zNoise); - RangeIterator(OctaveIndex, Octaves) - { - zParams[OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.z), zOffset, zChunkResolution, zPeriods[OctaveIndex], PrimeZ); - } - for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) { - u32 yOffset = u32(yNoise); - - RangeIterator(OctaveIndex, Octaves) - { - yParams[OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.y), yOffset, yChunkResolution, yPeriods[OctaveIndex], PrimeY); - } - for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) { s32 NoiseIndex = GetIndex(xNoise, yNoise, zNoise, NoiseDim); - RangeIterator(OctaveIndex, Octaves) - { - RangeIterator(ValueIndex, 8) - { - xCoords[ValueIndex] = u32(xNoise-1+ValueIndex); - } - auto _x0 = U32_8X(xCoords+0); - xParams[OctaveIndex] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x0, xChunkResolution, xPeriods[OctaveIndex], PrimeX); - } - r32 InteriorAmp = r32(Amplitude); RangeIterator(OctaveIndex, Octaves) { - PerlinNoise_8x_avx2(xParams+OctaveIndex, yParams+OctaveIndex, zParams+OctaveIndex, NoiseValues+NoiseIndex, InteriorAmp); + auto zParam = _zParams+zNoise; + auto yParam = _yParams+yNoise; + auto xParam = _xParams+xNoise; + PerlinNoise_8x_avx2(xParam, yParam, zParam, NoiseValues+NoiseIndex, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); } } } } + u64 EndingCycles = __rdtsc(); + u64 ElapsedCycles = EndingCycles - StartingCycles; + GetEngineDebug()->ChunkGenCyclesElapsed += ElapsedCycles; + GetEngineDebug()->CellsGenerated += Volume(NoiseDim)*Octaves; #define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ f32(basis_chunk_point.channel) \ From 748dc7ae96f84a058d19d0b01eee221efa8cf2ff Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 7 Oct 2024 21:56:25 -0700 Subject: [PATCH 067/421] Fix octaves --- src/engine/terrain.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index da1179fe0..002cc8073 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -160,8 +160,7 @@ Terrain_FBM2D( world_chunk *Chunk, { RangeIterator(OctaveIndex, Octaves) { - /* zParams[OctaveIndex] = ComputePerlinParameters_scalar(u32(WorldBasis.z), zOffset, zChunkResolution, zPeriods[OctaveIndex], PrimeZ); */ - _zParams[zNoise] = ComputePerlinParameters_scalar(u32(WorldBasis.z), u32(zNoise), zChunkResolution, zPeriods[OctaveIndex], PrimeZ); + _zParams[zNoise+(zNoise*OctaveIndex)] = ComputePerlinParameters_scalar(u32(WorldBasis.z), u32(zNoise), zChunkResolution, zPeriods[OctaveIndex], PrimeZ); } } @@ -169,7 +168,7 @@ Terrain_FBM2D( world_chunk *Chunk, { RangeIterator(OctaveIndex, Octaves) { - _yParams[yNoise] = ComputePerlinParameters_scalar(u32(WorldBasis.y), u32(yNoise), yChunkResolution, yPeriods[OctaveIndex], PrimeY); + _yParams[yNoise+(yNoise*OctaveIndex)] = ComputePerlinParameters_scalar(u32(WorldBasis.y), u32(yNoise), yChunkResolution, yPeriods[OctaveIndex], PrimeY); } } @@ -181,10 +180,10 @@ Terrain_FBM2D( world_chunk *Chunk, for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) { + auto _x = U32_8X(_xCoords+xNoise); RangeIterator(OctaveIndex, Octaves) { - auto _x0 = U32_8X(_xCoords+xNoise); - _xParams[xNoise] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x0, xChunkResolution, xPeriods[OctaveIndex], PrimeX); + _xParams[xNoise+(xNoise*OctaveIndex)] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x, xChunkResolution, xPeriods[OctaveIndex], PrimeX); } } } @@ -200,9 +199,9 @@ Terrain_FBM2D( world_chunk *Chunk, r32 InteriorAmp = r32(Amplitude); RangeIterator(OctaveIndex, Octaves) { - auto zParam = _zParams+zNoise; - auto yParam = _yParams+yNoise; - auto xParam = _xParams+xNoise; + auto zParam = _zParams+zNoise+(zNoise*OctaveIndex); + auto yParam = _yParams+yNoise+(yNoise*OctaveIndex); + auto xParam = _xParams+xNoise+(xNoise*OctaveIndex); PerlinNoise_8x_avx2(xParam, yParam, zParam, NoiseValues+NoiseIndex, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); } From 77207d93ab5819715ec7092311f42ed83b196ee3 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 8 Oct 2024 08:47:34 -0700 Subject: [PATCH 068/421] Fix octaves indexing for-realz --- examples/terrain_gen/game.cpp | 5 +-- src/engine/terrain.cpp | 63 +++++++++++++++-------------------- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index f8a125b77..a48998397 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -495,8 +495,9 @@ BONSAI_API_WORKER_THREAD_CALLBACK() v3 Period = V3(1000); s32 Amplititude = 800; s32 StartingZDepth = 1000; - /* u32 Octaves = 7; */ - u32 Octaves = 1; + u32 Octaves = 7; + /* u32 Octaves = 2; */ + /* u32 Octaves = 1; */ /* v3 Period = V3(2500); */ /* s32 Amplititude = 1500; */ diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 002cc8073..056537a3c 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -113,26 +113,23 @@ Terrain_FBM2D( world_chunk *Chunk, Chunk->NormalValues = Normals; #endif - // TODO(Jesse): Make this dynamic - Assert(Octaves < 8); - u32 zPeriods[8]; - u32 yPeriods[8]; - avx_divisor xPeriods[8]; - - // TODO(Jesse): Make this dynamic - Assert(Octaves < 8); - perlin_params zParams[8]; - perlin_params yParams[8]; - perlin_params xParams[8]; - u32 xCoords[8]; - - u32_8x xChunkDim8 = U32_8X(u32(WorldChunkDim.x)); - u32_8x yChunkDim8 = U32_8X(u32(WorldChunkDim.y)); - u32_8x zChunkDim8 = U32_8X(u32(WorldChunkDim.z)); - u32_8x xChunkResolution = U32_8X(u32(Chunk->DimInChunks.x)); - u32 yChunkResolution = u32(Chunk->DimInChunks.y); - u32 zChunkResolution = u32(Chunk->DimInChunks.z); + u32 yChunkResolution = u32(Chunk->DimInChunks.y); + u32 zChunkResolution = u32(Chunk->DimInChunks.z); + + u32 *zPeriods = Allocate(u32, TempArena, Octaves); + u32 *yPeriods = Allocate(u32, TempArena, Octaves); + avx_divisor *xPeriods = Allocate(avx_divisor, TempArena, Octaves); + + perlin_params *xParams = AllocateAligned(perlin_params, TempArena, NoiseDim.x*Octaves*2, 32); + perlin_params *yParams = AllocateAligned(perlin_params, TempArena, NoiseDim.y*Octaves*2, 32); + perlin_params *zParams = AllocateAligned(perlin_params, TempArena, NoiseDim.z*Octaves*2, 32); + + /* u32 Offset = 200'000'000; */ + /* v3i WorldBasis = V3i(Offset, Offset, 0) + NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); */ + v3i WorldBasis = NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); + + v3i InteriorPeriod = V3i(Period); RangeIterator(OctaveIndex, Octaves) @@ -143,16 +140,7 @@ Terrain_FBM2D( world_chunk *Chunk, InteriorPeriod = Max(V3i(1), InteriorPeriod/2); } - /* u32 Offset = 200'000'000; */ - /* v3i WorldBasis = V3i(Offset, Offset, 0) + NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); */ - v3i WorldBasis = NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); - - perlin_params *_xParams = Allocate(perlin_params, TempArena, NoiseDim.x*Octaves); - perlin_params *_yParams = Allocate(perlin_params, TempArena, NoiseDim.y*Octaves); - perlin_params *_zParams = Allocate(perlin_params, TempArena, NoiseDim.z*Octaves); - u64 StartingCycles = __rdtsc(); - { TIMED_NAMED_BLOCK(precalculate_parameters); @@ -160,7 +148,8 @@ Terrain_FBM2D( world_chunk *Chunk, { RangeIterator(OctaveIndex, Octaves) { - _zParams[zNoise+(zNoise*OctaveIndex)] = ComputePerlinParameters_scalar(u32(WorldBasis.z), u32(zNoise), zChunkResolution, zPeriods[OctaveIndex], PrimeZ); + s32 i = OctaveIndex+(zNoise*Octaves); + zParams[i] = ComputePerlinParameters_scalar(u32(WorldBasis.z), u32(zNoise), zChunkResolution, zPeriods[OctaveIndex], PrimeZ); } } @@ -168,11 +157,12 @@ Terrain_FBM2D( world_chunk *Chunk, { RangeIterator(OctaveIndex, Octaves) { - _yParams[yNoise+(yNoise*OctaveIndex)] = ComputePerlinParameters_scalar(u32(WorldBasis.y), u32(yNoise), yChunkResolution, yPeriods[OctaveIndex], PrimeY); + s32 i = OctaveIndex+(yNoise*Octaves); + yParams[i] = ComputePerlinParameters_scalar(u32(WorldBasis.y), u32(yNoise), yChunkResolution, yPeriods[OctaveIndex], PrimeY); } } - u32 *_xCoords = Allocate(u32, TempArena, NoiseDim.x*Octaves); + u32 *_xCoords = AllocateAligned(u32, TempArena, NoiseDim.x, 32); for ( s32 xNoise = 0; xNoise < NoiseDim.x; ++ xNoise ) { _xCoords[xNoise] = u32(xNoise-1); @@ -183,7 +173,8 @@ Terrain_FBM2D( world_chunk *Chunk, auto _x = U32_8X(_xCoords+xNoise); RangeIterator(OctaveIndex, Octaves) { - _xParams[xNoise+(xNoise*OctaveIndex)] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x, xChunkResolution, xPeriods[OctaveIndex], PrimeX); + s32 i = OctaveIndex+(xNoise*Octaves); + xParams[i] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x, xChunkResolution, xPeriods[OctaveIndex], PrimeX); } } } @@ -199,9 +190,9 @@ Terrain_FBM2D( world_chunk *Chunk, r32 InteriorAmp = r32(Amplitude); RangeIterator(OctaveIndex, Octaves) { - auto zParam = _zParams+zNoise+(zNoise*OctaveIndex); - auto yParam = _yParams+yNoise+(yNoise*OctaveIndex); - auto xParam = _xParams+xNoise+(xNoise*OctaveIndex); + auto zParam = zParams+OctaveIndex+(zNoise*Octaves); + auto yParam = yParams+OctaveIndex+(yNoise*Octaves); + auto xParam = xParams+OctaveIndex+(xNoise*Octaves); PerlinNoise_8x_avx2(xParam, yParam, zParam, NoiseValues+NoiseIndex, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); } @@ -212,7 +203,7 @@ Terrain_FBM2D( world_chunk *Chunk, u64 EndingCycles = __rdtsc(); u64 ElapsedCycles = EndingCycles - StartingCycles; GetEngineDebug()->ChunkGenCyclesElapsed += ElapsedCycles; - GetEngineDebug()->CellsGenerated += Volume(NoiseDim)*Octaves; + GetEngineDebug()->CellsGenerated += u64(Volume(NoiseDim))*u64(Octaves); #define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ f32(basis_chunk_point.channel) \ From a0c1ec9a7942e9f094caee321b6e8568fe07587d Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 8 Oct 2024 10:26:20 -0700 Subject: [PATCH 069/421] Fix bug in EventsCurrentlyInQueue --- examples/terrain_gen/game.cpp | 18 +-- examples/terrain_gen/game_constants.h | 7 +- generated/are_equal_debug_profile_scope.h | 2 +- .../asyncify_render_function_c_DrawLod.h | 2 +- ...yncify_render_function_c_RenderToTexture.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 2 +- .../generate_cursor_debug_profile_scope.h | 2 +- generated/vertex_data_functions_v3.h | 4 +- generated/vertex_data_functions_v3_u8.h | 4 +- jesse.make.sh | 2 +- src/engine/render.cpp | 30 +--- src/engine/render.h | 2 + src/engine/terrain.cpp | 144 +++++++++--------- src/engine/voxel_face.h | 2 - src/engine/work_queue.h | 14 +- src/engine/world.cpp | 3 + 16 files changed, 112 insertions(+), 128 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index a48998397..8d01d1fe0 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -482,22 +482,22 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* // FBM params */ - /* v3 Period = V3(100000); */ - /* s32 Amplititude = 20000; */ - /* s32 StartingZDepth = 5000; */ - /* u32 Octaves = 7; */ + v3 Period = V3(100000); + s32 Amplititude = 20000; + s32 StartingZDepth = 20000; + u32 Octaves = 7; /* v3 Period = V3(500); */ /* s32 Amplititude = 500; */ /* s32 StartingZDepth = 500; */ /* u32 Octaves = 1; */ - v3 Period = V3(1000); - s32 Amplititude = 800; - s32 StartingZDepth = 1000; - u32 Octaves = 7; + /* v3 Period = V3(1000); */ + /* s32 Amplititude = 800; */ + /* s32 StartingZDepth = 1000; */ + /* /1* u32 Octaves = 12; *1/ */ /* u32 Octaves = 2; */ - /* u32 Octaves = 1; */ + /* /1* u32 Octaves = 1; *1/ */ /* v3 Period = V3(2500); */ /* s32 Amplititude = 1500; */ diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 5bea3de83..53276298c 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -9,10 +9,11 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); #else global_variable chunk_dimension -/* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); */ +/* g_VisibleRegion = Chunk_Dimension(8192*8, 8192*8, 8192*8); // 416km */ +/* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ // 26km -g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km -/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ +/* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ +g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ diff --git a/generated/are_equal_debug_profile_scope.h b/generated/are_equal_debug_profile_scope.h index cf4e1985e..92628aad0 100644 --- a/generated/are_equal_debug_profile_scope.h +++ b/generated/are_equal_debug_profile_scope.h @@ -1,4 +1,4 @@ -// external/bonsai_debug/src/api.h:115:0 +// external/bonsai_debug/src/api.h:104:0 link_internal b32 AreEqual(debug_profile_scope *Thing1, debug_profile_scope *Thing2) diff --git a/generated/asyncify_render_function_c_DrawLod.h b/generated/asyncify_render_function_c_DrawLod.h index 96636f74f..2405df5f7 100644 --- a/generated/asyncify_render_function_c_DrawLod.h +++ b/generated/asyncify_render_function_c_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:309:0 +// src/engine/work_queue.h:311:0 link_internal void DrawLod_Async(work_queue *Queue,engine_resources *Engine ,shader *Shader ,lod_element_buffer *Meshes ,r32 DistanceSquared ,v3 Basis ,Quaternion Rotation ,v3 Scale ) diff --git a/generated/asyncify_render_function_c_RenderToTexture.h b/generated/asyncify_render_function_c_RenderToTexture.h index c18508ab6..47e478b3b 100644 --- a/generated/asyncify_render_function_c_RenderToTexture.h +++ b/generated/asyncify_render_function_c_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:306:0 +// src/engine/work_queue.h:308:0 link_internal void RenderToTexture_Async(work_queue *Queue,engine_resources *Engine ,asset_thumbnail *Thumb ,lod_element_buffer *Meshes ,v3 Offset ,camera *Camera ) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 53ddddf5d..fb48a99c8 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:282:0 +// src/engine/work_queue.h:284:0 diff --git a/generated/generate_cursor_debug_profile_scope.h b/generated/generate_cursor_debug_profile_scope.h index 102fd71f4..f3179f26b 100644 --- a/generated/generate_cursor_debug_profile_scope.h +++ b/generated/generate_cursor_debug_profile_scope.h @@ -1,4 +1,4 @@ -// external/bonsai_debug/src/api.h:118:0 +// external/bonsai_debug/src/api.h:107:0 struct debug_profile_scope_cursor { diff --git a/generated/vertex_data_functions_v3.h b/generated/vertex_data_functions_v3.h index 0672cb020..18e384977 100644 --- a/generated/vertex_data_functions_v3.h +++ b/generated/vertex_data_functions_v3.h @@ -1,4 +1,4 @@ -// src/engine/voxel_face.h:215:0 +// src/engine/voxel_face.h:213:0 inline void RightFaceVertexData( v3 MinP, v3 Diameter, v3 *Result) @@ -19,8 +19,6 @@ RightFaceVertexData( v3 MinP, v3 Diameter, v3 *Result) v3 Temp[] = { P2, P1, P0, P2, P3, P1 }; MemCopy((u8*)Temp, (u8*)Result, sizeof(Temp)); - - return; } inline void diff --git a/generated/vertex_data_functions_v3_u8.h b/generated/vertex_data_functions_v3_u8.h index 898cb365c..ed2dd68f8 100644 --- a/generated/vertex_data_functions_v3_u8.h +++ b/generated/vertex_data_functions_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/voxel_face.h:218:0 +// src/engine/voxel_face.h:216:0 inline void RightFaceVertexData( v3_u8 MinP, v3 Diameter, v3_u8 *Result) @@ -19,8 +19,6 @@ RightFaceVertexData( v3_u8 MinP, v3 Diameter, v3_u8 *Result) v3_u8 Temp[] = { P2, P1, P0, P2, P3, P1 }; MemCopy((u8*)Temp, (u8*)Result, sizeof(Temp)); - - return; } inline void diff --git a/jesse.make.sh b/jesse.make.sh index 60fb9ef2e..27e9a114d 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,8 +11,8 @@ OPT="-O2" ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ - BuildTests \ BuildExecutables \ + # BuildTests \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ diff --git a/src/engine/render.cpp b/src/engine/render.cpp index fb911e584..be9e009a1 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1143,34 +1143,10 @@ DrawLod(engine_resources *Engine, shader *Shader, lod_element_buffer *Meshes, r3 AssertNoGlErrors; auto MeshBit = MeshBit_None; - if (DistanceSquared > Square(400*32)) - { - if (HasGpuMesh(Meshes, MeshBit_Lod4)) { MeshBit = MeshBit_Lod4; } - } - else if (DistanceSquared > Square(250*32)) - { - if (HasGpuMesh(Meshes, MeshBit_Lod3)) { MeshBit = MeshBit_Lod3; } - } - else if (DistanceSquared > Square(150*32)) + if (HasGpuMesh(Meshes, MeshBit_Lod0)) { - if (HasGpuMesh(Meshes, MeshBit_Lod2)) { MeshBit = MeshBit_Lod2; } - } - else if (DistanceSquared > Square(70*32)) - { - if (HasGpuMesh(Meshes, MeshBit_Lod1)) { MeshBit = MeshBit_Lod1; } - } - else - { - if (HasGpuMesh(Meshes, MeshBit_Lod0)) { MeshBit = MeshBit_Lod0; } - } - - if (MeshBit != MeshBit_None) - { - m4 LocalTransform = GetTransformMatrix(Basis, Scale, Rotation); - AssertNoGlErrors; - + m4 LocalTransform = GetTransformMatrix(Basis*GLOBAL_RENDER_SCALE_FACTOR, Scale*GLOBAL_RENDER_SCALE_FACTOR, Rotation); m4 NormalMatrix = Transpose(Inverse(LocalTransform)); - AssertNoGlErrors; // @janky_model_matrix_bs Ensure(TryBindUniform(Shader, "ModelMatrix", &LocalTransform)); @@ -1178,7 +1154,7 @@ DrawLod(engine_resources *Engine, shader *Shader, lod_element_buffer *Meshes, r3 TryBindUniform(Shader, "NormalMatrix", &NormalMatrix); // NOTE(Jesse): Not all shaders that use this path draw normals (namely, DepthRTT) AssertNoGlErrors; - auto Handles = &Meshes->GpuBufferHandles[ToIndex(MeshBit)]; + auto Handles = &Meshes->GpuBufferHandles[ToIndex(MeshBit_Lod0)]; SetupVertexAttribsFor_u3d_geo_element_buffer(Handles); DrawGpuBufferImmediate(Handles); diff --git a/src/engine/render.h b/src/engine/render.h index 013f1d7b6..5edd0cb6a 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -1,6 +1,8 @@ struct world_chunk; +#define GLOBAL_RENDER_SCALE_FACTOR (1.00f) + // NOTE(Jesse): Must match defines in header.glsl #define VERTEX_POSITION_LAYOUT_LOCATION 0 #define VERTEX_NORMAL_LAYOUT_LOCATION 1 diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 056537a3c..2a7ad85a0 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -179,22 +179,25 @@ Terrain_FBM2D( world_chunk *Chunk, } } - for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) { - for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) + TIMED_NAMED_BLOCK(octaves); + for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) { - for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) + for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) { - s32 NoiseIndex = GetIndex(xNoise, yNoise, zNoise, NoiseDim); - - r32 InteriorAmp = r32(Amplitude); - RangeIterator(OctaveIndex, Octaves) + for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) { - auto zParam = zParams+OctaveIndex+(zNoise*Octaves); - auto yParam = yParams+OctaveIndex+(yNoise*Octaves); - auto xParam = xParams+OctaveIndex+(xNoise*Octaves); - PerlinNoise_8x_avx2(xParam, yParam, zParam, NoiseValues+NoiseIndex, InteriorAmp); - InteriorAmp = Max(1.f, InteriorAmp/2.f); + s32 NoiseIndex = GetIndex(xNoise, yNoise, zNoise, NoiseDim); + + r32 InteriorAmp = r32(Amplitude); + RangeIterator(OctaveIndex, Octaves) + { + auto zParam = zParams+OctaveIndex+(zNoise*Octaves); + auto yParam = yParams+OctaveIndex+(yNoise*Octaves); + auto xParam = xParams+OctaveIndex+(xNoise*Octaves); + PerlinNoise_8x_avx2(xParam, yParam, zParam, NoiseValues+NoiseIndex, InteriorAmp); + InteriorAmp = Max(1.f, InteriorAmp/2.f); + } } } } @@ -210,78 +213,81 @@ Terrain_FBM2D( world_chunk *Chunk, + f32(offset)*Chunk->DimInChunks.channel \ + SrcToDest.channel \ - for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zChunk)*NoiseUpsampleFactor, Chunk->DimInChunks); - /* f32 zCoord = 75.f; */ - f32 WorldZBiased = zCoord - zMin; - for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) + TIMED_NAMED_BLOCK(finalize); + for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { - for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) + f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zChunk)*NoiseUpsampleFactor, Chunk->DimInChunks); + /* f32 zCoord = 75.f; */ + f32 WorldZBiased = zCoord - zMin; + for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) { - v3i ChunkP = V3i(xChunk, yChunk, zChunk); - /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ - /* v3i NoiseP = V3i(xChunk+1, yChunk+1, zChunk+1)/NoiseUpsampleFactor; */ - v3i NoiseP = V3i(xChunk+1, yChunk, zChunk)/NoiseUpsampleFactor; - - s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); - s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); - - r32 ThisNoiseV = NoiseValues[NoiseIndex]; - s32 NoiseChoice = ThisNoiseV > WorldZBiased; - ChunkSum += u32(NoiseChoice); - SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); - - Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); - /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ - if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } - /* if (xChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_YELLOW)*u16(NoiseChoice); } */ - /* if (xChunk == Chunk->Dim.x-1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ - if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_GREEN)*u16(NoiseChoice); } - if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } + for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) + { + v3i ChunkP = V3i(xChunk, yChunk, zChunk); + /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ + /* v3i NoiseP = V3i(xChunk+1, yChunk+1, zChunk+1)/NoiseUpsampleFactor; */ + v3i NoiseP = V3i(xChunk+1, yChunk, zChunk)/NoiseUpsampleFactor; + + s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); + s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); + + r32 ThisNoiseV = NoiseValues[NoiseIndex]; + s32 NoiseChoice = ThisNoiseV > WorldZBiased; + ChunkSum += u32(NoiseChoice); + SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); + + Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ + if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } + /* if (xChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_YELLOW)*u16(NoiseChoice); } */ + /* if (xChunk == Chunk->Dim.x-1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ + if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_GREEN)*u16(NoiseChoice); } + if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } + } } } - } - Assert(NoiseDim.x >= 66); - Assert(NoiseDim.y >= 66); - Assert(NoiseDim.z >= 66); + Assert(NoiseDim.x >= 66); + Assert(NoiseDim.y >= 66); + Assert(NoiseDim.z >= 66); - Assert(Chunk->Dim.x == 64); - Assert(Chunk->Dim.y == 66); - Assert(Chunk->Dim.z == 66); - for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) - { - /* f32 zCoord = 75.f; */ - f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zNoise)*NoiseUpsampleFactor, Chunk->DimInChunks); - f32 WorldZBiased = zCoord - zMin; - for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) + Assert(Chunk->Dim.x == 64); + Assert(Chunk->Dim.y == 66); + Assert(Chunk->Dim.z == 66); + for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) { - + /* f32 zCoord = 75.f; */ + f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zNoise)*NoiseUpsampleFactor, Chunk->DimInChunks); + f32 WorldZBiased = zCoord - zMin; + for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) { - v3i BorderP = V3i(0, yNoise, zNoise)/NoiseUpsampleFactor; - s32 BorderIndex = GetIndex(BorderP, NoiseDim); - r32 ThisNoiseV = NoiseValues[BorderIndex]; + { + v3i BorderP = V3i(0, yNoise, zNoise)/NoiseUpsampleFactor; + s32 BorderIndex = GetIndex(BorderP, NoiseDim); - u64 NoiseChoice = ThisNoiseV > WorldZBiased; - /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ - Chunk->xOccupancyBorder[(zNoise-1)*2] |= NoiseChoice << (yNoise-1); - } + r32 ThisNoiseV = NoiseValues[BorderIndex]; - { - v3i BorderP = V3i(65, yNoise, zNoise)/NoiseUpsampleFactor; - s32 BorderIndex = GetIndex(BorderP, NoiseDim); + u64 NoiseChoice = ThisNoiseV > WorldZBiased; + /* u64 NoiseChoice = 1ull; */ + /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ + Chunk->xOccupancyBorder[(zNoise-1)*2] |= NoiseChoice << (yNoise-1); + } - r32 ThisNoiseV = NoiseValues[BorderIndex]; + { + v3i BorderP = V3i(65, yNoise, zNoise)/NoiseUpsampleFactor; + s32 BorderIndex = GetIndex(BorderP, NoiseDim); - u64 NoiseChoice = ThisNoiseV > WorldZBiased; - /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ - Chunk->xOccupancyBorder[((zNoise-1)*2)+1] |= NoiseChoice << (yNoise-1); - } + r32 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = ThisNoiseV > WorldZBiased; + /* u64 NoiseChoice = 1ull; */ + /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ + Chunk->xOccupancyBorder[((zNoise-1)*2)+1] |= NoiseChoice << (yNoise-1); + } + + } } } } diff --git a/src/engine/voxel_face.h b/src/engine/voxel_face.h index 99d0eee1a..daaad89ae 100644 --- a/src/engine/voxel_face.h +++ b/src/engine/voxel_face.h @@ -90,8 +90,6 @@ poof( vector_t.name Temp[] = { P2, P1, P0, P2, P3, P1 }; MemCopy((u8*)Temp, (u8*)Result, sizeof(Temp)); - - return; } inline void diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index 110c4c7fb..b0001e4a1 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -256,22 +256,24 @@ poof(d_union_constructors(work_queue_entry)) -link_internal u32 +link_internal s32 EventsCurrentlyInQueue(work_queue *Queue) { u32 Enqueue = Queue->EnqueueIndex; u32 Dequeue = Queue->DequeueIndex; - u32 Result = 0; - if (Enqueue < Dequeue) + s32 Result = 0; + if (Dequeue < Enqueue) { - Result = Dequeue - Enqueue; + Result = s32(Enqueue - Dequeue); } - else if (Dequeue < Enqueue) + + if (Enqueue < Dequeue) { - Result = (WORK_QUEUE_SIZE - Dequeue) + Enqueue; + Result = s32((WORK_QUEUE_SIZE - Dequeue) + Enqueue); } + Assert(Result >= 0); return Result; } diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 8ddcc20df..1947dfd57 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -845,6 +845,9 @@ MaintainWorldOctree(engine_resources *Engine) s32 MaxToQueueThisFrame = Max(0, MAX_OCTREE_NODES_QUEUED_PER_FRAME - LowPriorityQueueCount); Assert(MaxToQueueThisFrame <= MAX_OCTREE_NODES_QUEUED_PER_FRAME); + DEBUG_VALUE_u32(u32(LowPriorityQueueCount)); + DEBUG_VALUE_u32(u32(MaxToQueueThisFrame)); + s32 NumQueuedThisFrame = 0; if (MaxToQueueThisFrame) { From abba6026d860c22e047114ec4317a3507a1cf0ef Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 8 Oct 2024 10:27:20 -0700 Subject: [PATCH 070/421] Update deps --- external/bonsai_debug | 2 +- external/bonsai_stdlib | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/external/bonsai_debug b/external/bonsai_debug index 5a27ffc78..ce4d42e5b 160000 --- a/external/bonsai_debug +++ b/external/bonsai_debug @@ -1 +1 @@ -Subproject commit 5a27ffc7874e330d1e8e6b120331bee43fa560c6 +Subproject commit ce4d42e5b9503e07464ac4e8c6ed3d41eaf4a7aa diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 770baa72a..08fac591b 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 770baa72a8243ed6c48cc20464d44158feb43d0b +Subproject commit 08fac591b8a0ea39238e70ac37efffcc8215fa57 From a56e1c3c9a7ba8fa379a0726aba21f2120569d16 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 8 Oct 2024 11:35:39 -0700 Subject: [PATCH 071/421] Fix GetRenderP going through global space (derp) --- src/engine/render.h | 2 +- src/engine/render_position.h | 14 ++++---------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/engine/render.h b/src/engine/render.h index 5edd0cb6a..1968400a6 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -1,7 +1,7 @@ struct world_chunk; -#define GLOBAL_RENDER_SCALE_FACTOR (1.00f) +#define GLOBAL_RENDER_SCALE_FACTOR (0.1f) // NOTE(Jesse): Must match defines in header.glsl #define VERTEX_POSITION_LAYOUT_LOCATION 0 diff --git a/src/engine/render_position.h b/src/engine/render_position.h index 3063c89bf..04643935a 100644 --- a/src/engine/render_position.h +++ b/src/engine/render_position.h @@ -1,8 +1,3 @@ -// -// TODO(Jesse)(high-priority, getrenderp): This is complete garbage and needs to be removed asap. -// -#if 1 - link_internal cp ComputeTarget(camera *Camera) { @@ -11,16 +6,16 @@ ComputeTarget(camera *Camera) } inline v3 -GetRenderP(canonical_position P, camera *Camera, world_position WorldChunkDim) +GetRenderP(cp P, camera *Camera, world_position WorldChunkDim) { cp ViewingTarget = ComputeTarget(Camera); - v3 CameraOffset = ViewingTarget.Offset + (ViewingTarget.WorldP * WorldChunkDim); - v3 Result = P.Offset + (P.WorldP * WorldChunkDim) - CameraOffset; + cp TargetRelative = P-ViewingTarget; + v3 Result = TargetRelative.Offset + (V3(TargetRelative.WorldP) * WorldChunkDim); return Result; } inline v3 -GetRenderP( chunk_dimension WorldChunkDim, canonical_position P, camera *Camera) +GetRenderP( chunk_dimension WorldChunkDim, cp P, camera *Camera) { v3 Result = GetRenderP(P, Camera, WorldChunkDim); return Result; @@ -84,7 +79,6 @@ GetRenderSpaceAABB(chunk_dimension WorldChunkDim, entity *Entity, camera *Camera aabb Result = RectCenterRad(Center, Radius); return Result; } -#endif inline m4 LookAt(v3 P, v3 Target, v3 Up) From bfb0d7212bc7c44520dc8ef8e3e3946f40a4507a Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 8 Oct 2024 11:36:21 -0700 Subject: [PATCH 072/421] Add GLOBAL_RENDER_SCALE_FACTOR --- examples/terrain_gen/game_constants.h | 6 ++-- src/engine/debug_draw.cpp | 40 +++++++++++++-------------- src/engine/entity.cpp | 2 +- src/engine/render.h | 2 +- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 53276298c..818001bd0 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -9,11 +9,11 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); #else global_variable chunk_dimension -/* g_VisibleRegion = Chunk_Dimension(8192*8, 8192*8, 8192*8); // 416km */ +g_VisibleRegion = Chunk_Dimension(8192*8, 8192*8, 8192*8); // 416km /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km */ -/* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); */ // 26km +/* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ -g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km +/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ diff --git a/src/engine/debug_draw.cpp b/src/engine/debug_draw.cpp index 45c7a6ec9..2f5f9b8a8 100644 --- a/src/engine/debug_draw.cpp +++ b/src/engine/debug_draw.cpp @@ -141,14 +141,14 @@ DEBUG_DrawAABB(untextured_3d_geometry_buffer *Mesh, v3 MinP, v3 MaxP, v3 RGBColo /* v3 MaxP = HalfDim; */ // Compute verticies - v3 TopRL = V3(MinP.x, MaxP.y, MinP.z); - v3 TopRR = V3(MaxP.x, MaxP.y, MinP.z); - v3 TopFL = V3(MinP.x, MaxP.y, MaxP.z); - v3 TopFR = V3(MaxP.x, MaxP.y, MaxP.z); - v3 BotRL = V3(MinP.x, MinP.y, MinP.z); - v3 BotRR = V3(MaxP.x, MinP.y, MinP.z); - v3 BotFL = V3(MinP.x, MinP.y, MaxP.z); - v3 BotFR = V3(MaxP.x, MinP.y, MaxP.z); + v3 TopRL = V3(MinP.x, MaxP.y, MinP.z) * GLOBAL_RENDER_SCALE_FACTOR; + v3 TopRR = V3(MaxP.x, MaxP.y, MinP.z) * GLOBAL_RENDER_SCALE_FACTOR; + v3 TopFL = V3(MinP.x, MaxP.y, MaxP.z) * GLOBAL_RENDER_SCALE_FACTOR; + v3 TopFR = V3(MaxP.x, MaxP.y, MaxP.z) * GLOBAL_RENDER_SCALE_FACTOR; + v3 BotRL = V3(MinP.x, MinP.y, MinP.z) * GLOBAL_RENDER_SCALE_FACTOR; + v3 BotRR = V3(MaxP.x, MinP.y, MinP.z) * GLOBAL_RENDER_SCALE_FACTOR; + v3 BotFL = V3(MinP.x, MinP.y, MaxP.z) * GLOBAL_RENDER_SCALE_FACTOR; + v3 BotFR = V3(MaxP.x, MinP.y, MaxP.z) * GLOBAL_RENDER_SCALE_FACTOR; /* // Apply rotation to verts */ /* TopRL = ((Rotation * Quaternion(TopRL, 1)) * Conjugate(Rotation)).xyz; */ @@ -185,24 +185,24 @@ DEBUG_DrawAABB(untextured_3d_geometry_buffer *Mesh, v3 MinP, v3 MaxP, v3 RGBColo // Top #define LINES_PER_AABB (12) #define VERTS_PER_AABB (VERTS_PER_VOXEL*LINES_PER_AABB) - DEBUG_DrawLine_Aligned(Mesh, TopRL, TopRR, RGBColor, Thickness); - DEBUG_DrawLine_Aligned(Mesh, TopFL, TopFR, RGBColor, Thickness); - DEBUG_DrawLine_Aligned(Mesh, TopFL, TopRL, RGBColor, Thickness); - DEBUG_DrawLine_Aligned(Mesh, TopFR, TopRR, RGBColor, Thickness); + DEBUG_DrawLine_Aligned(Mesh, TopRL, TopRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine_Aligned(Mesh, TopFL, TopFR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine_Aligned(Mesh, TopFL, TopRL, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine_Aligned(Mesh, TopFR, TopRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); // Right - DEBUG_DrawLine_Aligned(Mesh, TopFR, BotFR, RGBColor, Thickness); - DEBUG_DrawLine_Aligned(Mesh, TopRR, BotRR, RGBColor, Thickness); + DEBUG_DrawLine_Aligned(Mesh, TopFR, BotFR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine_Aligned(Mesh, TopRR, BotRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); // Left - DEBUG_DrawLine_Aligned(Mesh, TopFL, BotFL, RGBColor, Thickness); - DEBUG_DrawLine_Aligned(Mesh, TopRL, BotRL, RGBColor, Thickness); + DEBUG_DrawLine_Aligned(Mesh, TopFL, BotFL, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine_Aligned(Mesh, TopRL, BotRL, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); // Bottom - DEBUG_DrawLine_Aligned(Mesh, BotRL, BotRR, RGBColor, Thickness); - DEBUG_DrawLine_Aligned(Mesh, BotFL, BotFR, RGBColor, Thickness); - DEBUG_DrawLine_Aligned(Mesh, BotFL, BotRL, RGBColor, Thickness); - DEBUG_DrawLine_Aligned(Mesh, BotFR, BotRR, RGBColor, Thickness); + DEBUG_DrawLine_Aligned(Mesh, BotRL, BotRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine_Aligned(Mesh, BotFL, BotFR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine_Aligned(Mesh, BotFL, BotRL, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine_Aligned(Mesh, BotFR, BotRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); } link_internal void diff --git a/src/engine/entity.cpp b/src/engine/entity.cpp index 2748a3c5b..8c1aff3fd 100644 --- a/src/engine/entity.cpp +++ b/src/engine/entity.cpp @@ -1509,7 +1509,7 @@ SimulateEntity(engine_resources *Resources, entity *Entity, r32 dt, v3i VisibleR if (Input->Q.Pressed) { Offset.z -= 1.f; } Offset = Normalize(Offset); - Entity->P.Offset += Offset * Plat->dt * CameraSpeed; + Entity->P.Offset += Offset * Plat->dt * (CameraSpeed*(1.f/GLOBAL_RENDER_SCALE_FACTOR)); } } diff --git a/src/engine/render.h b/src/engine/render.h index 1968400a6..fbfc3f14d 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -1,7 +1,7 @@ struct world_chunk; -#define GLOBAL_RENDER_SCALE_FACTOR (0.1f) +#define GLOBAL_RENDER_SCALE_FACTOR (0.01f) // NOTE(Jesse): Must match defines in header.glsl #define VERTEX_POSITION_LAYOUT_LOCATION 0 From 91e178e70d437d76c3f6a8d0b9de4b3f91db6722 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 8 Oct 2024 13:05:46 -0700 Subject: [PATCH 073/421] Tune camera & rendering params a bit --- examples/terrain_gen/game.cpp | 10 +++-- examples/terrain_gen/game_constants.h | 1 + src/engine/render.h | 56 +++++++++++++++++++++++---- 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 8d01d1fe0..0a01857c2 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -482,9 +482,11 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* // FBM params */ - v3 Period = V3(100000); - s32 Amplititude = 20000; - s32 StartingZDepth = 20000; + // 2km features + v3 Period = V3(200'000); + // 600m high + s32 Amplititude = 60'000; + s32 StartingZDepth = 60000; u32 Octaves = 7; /* v3 Period = V3(500); */ @@ -765,7 +767,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() world_position WorldCenter = V3i(100, 100, 0); canonical_position CameraTargetP = {}; - StandardCamera(Graphics->Camera, 250000.0f, 20000.0f); + StandardCamera(Graphics->Camera, 150000.0f, 20000.0f); AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 818001bd0..f5d514c83 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -9,6 +9,7 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); #else global_variable chunk_dimension +/* g_VisibleRegion = Chunk_Dimension(8192*32, 8192*32, 8192*32); // 1677km */ g_VisibleRegion = Chunk_Dimension(8192*8, 8192*8, 8192*8); // 416km /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ diff --git a/src/engine/render.h b/src/engine/render.h index fbfc3f14d..414896fcb 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -1,7 +1,7 @@ struct world_chunk; -#define GLOBAL_RENDER_SCALE_FACTOR (0.01f) +#define GLOBAL_RENDER_SCALE_FACTOR (0.010f) // NOTE(Jesse): Must match defines in header.glsl #define VERTEX_POSITION_LAYOUT_LOCATION 0 @@ -88,7 +88,40 @@ Orthographic( r32 X, r32 Y, r32 Zmin, r32 Zmax) } inline m4 -Perspective(radians FOV, v2 WindowDim, r32 NearClip, r32 FarClip) +Perspective_infinite(radians FOV, v2 WindowDim, r32 NearClip, r32 FarClip) +{ + +#if 0 +// https://chaosinmotion.com/2010/09/06/goodbye-far-clipping-plane/ +// +// Projection +// +// a 0 0 0 +// 0 b 0 0 +// 0 0 0 d +// 0 0 e 0 +// +#endif + + r32 FocalLength = Tan(FOV/2.f); + r32 Aspect = WindowDim.x/WindowDim.y; + + r32 a = FOV/Aspect; + r32 b = FOV; + r32 d = -NearClip; + r32 e = -1.f; + + m4 Result = { + V4(a, 0, 0, 0), + V4(0, b, 0, 0), + V4(0, 0, 0, d), + V4(0, 0, e, 0), + }; + + return Result; +} +inline m4 +Perspective_clipped(radians FOV, v2 WindowDim, r32 NearClip, r32 FarClip) { #if 0 @@ -147,11 +180,20 @@ Rads(degrees Degrees) inline m4 ProjectionMatrix(camera *Camera, v2 ScreenDim) { - m4 Result = Perspective( Rads(Camera->Frust.FOV), - ScreenDim, - Camera->Frust.nearClip, - Camera->Frust.farClip); - + /* m4 Result = Perspective_infinite( Camera->Frust.FOV, */ + /* ScreenDim, */ + /* Camera->Frust.nearClip, */ + /* Camera->Frust.farClip); */ + + /* m4 Result = Perspective_infinite( Rads(Camera->Frust.FOV), */ + /* ScreenDim, */ + /* Camera->Frust.nearClip, */ + /* Camera->Frust.farClip); */ + + m4 Result = Perspective_clipped( Rads(Camera->Frust.FOV), + ScreenDim, + Camera->Frust.nearClip, + Camera->Frust.farClip); return Result; } From 303bc777f03af9ae5af2f64aa9a7003e98ead1da Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 9 Oct 2024 08:36:49 -0700 Subject: [PATCH 074/421] Find & fix a memory leak (not freeing most octree nodes) --- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- generated/freelist_allocator_octree_node.h | 5 + .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- generated/maybe_standing_spot.h | 2 +- jesse.make.sh | 4 +- src/engine/world.cpp | 118 ++++++++++-------- src/engine/world_chunk.h | 5 + 11 files changed, 87 insertions(+), 59 deletions(-) diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index f19693e1d..5c388db6c 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:453:0 +// src/engine/world_chunk.h:458:0 struct world_chunk_ptr_block { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 260144c30..61ab9bda7 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:494:0 +// src/engine/world_chunk.h:499:0 struct standing_spot_block { diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 708235c0a..4bc32ba9a 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:521:0 +// src/engine/world_chunk.h:526:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index d6d8a3a53..0c52bd2b6 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:450:0 +// src/engine/world_chunk.h:455:0 struct world_chunk_ptr_buffer { diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index aa66fd237..f10448d6f 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -6,6 +6,9 @@ struct octree_node_freelist memory_arena *Memory; }; +debug_global u32 ReusedNode; +debug_global u32 AllocatedNode; + link_internal octree_node * GetOrAllocate(octree_node_freelist *Freelist) { @@ -13,10 +16,12 @@ GetOrAllocate(octree_node_freelist *Freelist) if (Result) { + ++ReusedNode; Freelist->First = Result->Next; } else { + ++AllocatedNode; Result = Allocate( octree_node, Freelist->Memory, 1 ); } diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index df6e5ff9f..a883b5c93 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:527:0 +// src/engine/world_chunk.h:532:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index a7d9819e8..6e8dd4750 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:524:0 +// src/engine/world_chunk.h:529:0 struct standing_spot_stream_chunk { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 8b2090786..fa94213db 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:491:0 +// src/engine/world_chunk.h:496:0 struct maybe_standing_spot { diff --git a/jesse.make.sh b/jesse.make.sh index 27e9a114d..f9938ffad 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -2,8 +2,8 @@ OPT="-O2" -./make.sh RunPoof -[ $? -ne 0 ] && exit 1 +# ./make.sh RunPoof +# [ $? -ne 0 ] && exit 1 # ./make.sh $OPT BuildAll diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 1947dfd57..6558cb58e 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -1,3 +1,9 @@ + +debug_global u32 DeferrFreedNodes; +debug_global u32 FreedNodes; + +debug_global u32 TotalWorldChunksAllocated; + link_internal world * AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) { @@ -456,13 +462,10 @@ OctreeBranchShouldCollapse(engine_resources *Engine, octree_node *Node) b32 Result = False; if (Node->Chunk.Flags & Chunk_Queued) return Result; - if (entity *Ghost = GetEntity(EntityTable, GameCamera->GhostId)) + v3i Res = ComputeNodeDesiredResolution(Engine, Node); + if (Res > Node->Chunk.DimInChunks) { - v3i Res = ComputeNodeDesiredResolution(Engine, Node); - if (Res > Node->Chunk.DimInChunks) - { - Result = True; - } + Result = True; } return Result; } @@ -474,15 +477,12 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) Assert(Node->Type == OctreeNodeType_Leaf); b32 Result = False; - if (entity *Ghost = GetEntity(EntityTable, GameCamera->GhostId)) + if (Node->Chunk.DimInChunks > V3i(1)) { - if (Node->Chunk.DimInChunks > V3i(1)) + v3i Res = ComputeNodeDesiredResolution(Engine, Node); + if (Res < Node->Chunk.DimInChunks) { - v3i Res = ComputeNodeDesiredResolution(Engine, Node); - if (Res < Node->Chunk.DimInChunks) - { - Result = True; - } + Result = True; } } return Result; @@ -540,30 +540,6 @@ CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) case OctreeNodeType_Leaf: { - if (Node->Chunk.Flags & Chunk_Queued) - { - if ((Node->Chunk.Flags&Chunk_Deallocate) == 0) - { - { - octree_node *TestNode = Engine->World->OctreeNodeDeferFreelist.First; - while (TestNode) { Assert(TestNode != Node); TestNode = TestNode->Next; } - } - Node->Chunk.Flags = chunk_flag(Node->Chunk.Flags|Chunk_Deallocate); - Free(&Engine->World->OctreeNodeDeferFreelist, Node); - } - } - else - { - if (Node->Chunk.Flags == Chunk_VoxelsInitialized) - { - DeallocateAndClearWorldChunk(Engine, &Node->Chunk); - Free(&Engine->World->OctreeNodeFreelist, Node); - } - else - { - Assert(Node->Chunk.Flags == Chunk_Uninitialized); - } - } } break; case OctreeNodeType_Branch: @@ -572,8 +548,37 @@ CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) } break; } + + if (Node->Chunk.Flags & Chunk_Queued) + { + if ( (Node->Chunk.Flags & Chunk_Deallocate) == 0) + { + { + octree_node *TestNode = Engine->World->OctreeNodeDeferFreelist.First; + while (TestNode) { Assert(TestNode != Node); TestNode = TestNode->Next; } + } + // NOTE(Jesse): This is a bug waiting to happen. Pretty sure this could + // accidentally persist the Chunk_Queued flag after the worker thread had + // un-set it and therefore jam up the DeferFreelist (forever waiting on + // a "Queued" chunk that's not actually queued). + Node->Chunk.Flags = chunk_flag(Node->Chunk.Flags|Chunk_Deallocate); + Free(&Engine->World->OctreeNodeDeferFreelist, Node); + ++DeferrFreedNodes; + } + } + else + { + if (Node->Chunk.Flags == Chunk_VoxelsInitialized) + { + DeallocateAndClearWorldChunk(Engine, &Node->Chunk); + } + Free(&Engine->World->OctreeNodeFreelist, Node); + ++FreedNodes; + } + } +#if 1 link_internal u32 MergeOctreeChildren(engine_resources *Engine, octree_node *Node) { @@ -597,6 +602,7 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) u32 Result = 1; return Result; } +#endif @@ -632,18 +638,20 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue { if (OctreeBranchShouldCollapse(Engine, NodeToSplit)) { + octree_node *Tmp = NodeToSplit; + /* CheckedDeallocateChildNode(Engine, &Tmp); */ MergeOctreeChildren(Engine, NodeToSplit); } else { - s32 ChildrenReadyToDraw = SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[0], NodeToSplit, Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[1], NodeToSplit, Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[2], NodeToSplit, Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[3], NodeToSplit, Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[4], NodeToSplit, Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[5], NodeToSplit, Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[6], NodeToSplit, Memory); - ChildrenReadyToDraw += SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[7], NodeToSplit, Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[0], NodeToSplit, Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[1], NodeToSplit, Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[2], NodeToSplit, Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[3], NodeToSplit, Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[4], NodeToSplit, Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[5], NodeToSplit, Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[6], NodeToSplit, Memory); + SplitOctreeNode_Recursive(Engine, Queue, NodeToSplit->Children[7], NodeToSplit, Memory); } } break; @@ -805,6 +813,7 @@ MaintainWorldOctree(engine_resources *Engine) Assert(Node->Chunk.Flags & Chunk_VoxelsInitialized); DeallocateAndClearWorldChunk(Engine, &Node->Chunk); Free(&World->OctreeNodeFreelist, Node); + ++FreedNodes;; } Node = Next; @@ -814,10 +823,6 @@ MaintainWorldOctree(engine_resources *Engine) #endif - - octree_node_ptr_stack Stack = OctreeNodePtrStack(1024, &World->OctreeMemory); - Push(&Stack, &World->Root); - world_chunk_ptr_paged_list *MainDrawList = &Graphics->MainDrawList; world_chunk_ptr_paged_list *ShadowMapDrawList = &Graphics->ShadowMapDrawList; @@ -848,6 +853,13 @@ MaintainWorldOctree(engine_resources *Engine) DEBUG_VALUE_u32(u32(LowPriorityQueueCount)); DEBUG_VALUE_u32(u32(MaxToQueueThisFrame)); + DEBUG_VALUE_u32(TotalWorldChunksAllocated); + DEBUG_VALUE_u32(FreedNodes); + DEBUG_VALUE_u32(DeferrFreedNodes); + + DEBUG_VALUE_u32(ReusedNode); + DEBUG_VALUE_u32(AllocatedNode); + s32 NumQueuedThisFrame = 0; if (MaxToQueueThisFrame) { @@ -865,10 +877,16 @@ MaintainWorldOctree(engine_resources *Engine) world_chunk *Chunk = &Node->Chunk; Assert((Chunk->Flags & Chunk_Queued) == 0); { - if (Node->Chunk.Flags == Chunk_Uninitialized) + if (IsAllocated(&Node->Chunk) == False) { + /* Info("Chunk allocated."); */ + ++TotalWorldChunksAllocated; AllocateWorldChunk(Chunk, Chunk->WorldP, World->ChunkDim, Chunk->DimInChunks, World->ChunkMemory); } + else + { + /* Info("Chunk already allocated."); */ + } QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); ++Stats.NewQueues; } diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 373db0e93..08a7cb397 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -382,6 +382,11 @@ CAssert(sizeof(voxel_position_cursor) == 24); /* CAssert(sizeof(world_chunk) % CACHE_LINE_SIZE == 0); */ +b32 IsAllocated(world_chunk *Chunk) +{ + b32 Result = Volume(Chunk->Dim) > 0; + return Result; +} From 4ebf04b4faa5297f010138048593ec19e992a02f Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 9 Oct 2024 10:19:20 -0700 Subject: [PATCH 075/421] Change world_chunk member of octree_node to a pointer --- jesse.make.sh | 2 +- src/engine/camera.cpp | 9 ++ src/engine/resources.cpp | 4 +- src/engine/world.cpp | 275 +++++++++++++++++++++++---------------- src/engine/world.h | 15 ++- 5 files changed, 190 insertions(+), 115 deletions(-) diff --git a/jesse.make.sh b/jesse.make.sh index f9938ffad..179989d1f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -OPT="-O2" +# OPT="-O2" # ./make.sh RunPoof # [ $? -ne 0 ] && exit 1 diff --git a/src/engine/camera.cpp b/src/engine/camera.cpp index d3a8dcb35..7d9fa1253 100644 --- a/src/engine/camera.cpp +++ b/src/engine/camera.cpp @@ -216,6 +216,15 @@ IsInFrustum(world *World, camera *Camera, canonical_position P) return Result; } +link_internal bool +IsInFrustum( world *World, camera *Camera, octree_node *Chunk ) +{ + v3 ChunkMid = (Chunk->Resolution*World->ChunkDim)/2.f; + cp P1 = Canonical_Position(ChunkMid, Chunk->WorldP ); + bool Result = IsInFrustum(World, Camera, P1); + return Result; +} + link_internal bool IsInFrustum( world *World, camera *Camera, world_chunk *Chunk ) { diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 564415217..a749e67fa 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -46,8 +46,8 @@ RenderOctree(engine_resources *Engine, shader *Shader) if (Node->Type == OctreeNodeType_Leaf) { - SyncGpuBuffersImmediate(Engine, &Node->Chunk.Meshes); - DrawLod(Engine, Shader, &Node->Chunk.Meshes, 0, {}, Quaternion(), V3(1)); + SyncGpuBuffersImmediate(Engine, &Node->Chunk->Meshes); + DrawLod(Engine, Shader, &Node->Chunk->Meshes, 0, {}, Quaternion(), V3(1)); } if (Node->Children[0]) { Push(&Stack, Node->Children[0]); } diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 6558cb58e..39681b399 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -29,8 +29,8 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) Assert(WorldChunkDim.y == WorldChunkDim.z); - World->Root.Type = OctreeNodeType_Leaf; - AllocateWorldChunk(&World->Root.Chunk, {}, WorldChunkDim, VisibleRegion, World->ChunkMemory); + InitOctreeNode(World, &World->Root, {}, VisibleRegion); + World->Root.Chunk = AllocateWorldChunk( {}, WorldChunkDim, VisibleRegion, World->ChunkMemory); /* AllocateWorldChunk(&World->Root.Chunk, {}, WorldChunkDim, VisibleRegion, World->ChunkMemory); */ /* SplitOctreeNode(World, &Plat->LowPriority, EntityTable, Camera, &World->Root, &World->OctreeMemory); */ @@ -212,8 +212,8 @@ GatherVoxelsOverlappingArea(engine_resources *Engine, rect3cp Rect, memory_arena link_internal rect3cp GetBoundingBox(world *World, octree_node *Node) { - cp Min = Canonical_Position(V3(0), Node->Chunk.WorldP); - cp Max = Canonicalize(World, Canonical_Position(V3(0), Node->Chunk.WorldP+Node->Chunk.DimInChunks)); + cp Min = Canonical_Position(V3(0), Node->WorldP); + cp Max = Canonicalize(World, Canonical_Position(V3(0), Node->WorldP+Node->Resolution)); rect3cp Rect = RectMinMax(Min, Max); return Rect; @@ -230,8 +230,8 @@ GetSimSpaceAABB(world *World, octree_node *Node) link_internal cp GetCenter(world *World, octree_node *Node) { - cp Min = Canonical_Position(V3(0), Node->Chunk.WorldP); - cp Max = Canonicalize(World, Canonical_Position(V3(0), Node->Chunk.WorldP+Node->Chunk.DimInChunks)); + cp Min = Canonical_Position(V3(0), Node->WorldP); + cp Max = Canonicalize(World, Canonical_Position(V3(0), Node->WorldP+Node->Resolution)); cp Rad = (Max-Min)/2; @@ -255,12 +255,12 @@ ContainsCameraGhost(world *World, entity **EntityTable, octree_node *Node, camer /* link_internal b32 */ /* OctreeNodeNeedsToSplit(world *World, octree_node *Node, camera *Camera) */ /* { */ -/* Assert(Node->Chunk.Dim == World->ChunkDim); */ +/* Assert(Node->Chunk->Dim == World->ChunkDim); */ /* Assert(Node->Type); */ /* Assert(Node->DimInChunks >= V3i(1)); */ /* b32 Result = Node->DimInChunks > V3i(1); */ -/* Result &= (Node->Chunk.Flags & Chunk_Queued) == 0; */ +/* Result &= (Node->Chunk->Flags & Chunk_Queued) == 0; */ /* Result &= ContainsCamera(World, Node, Camera); */ /* return Result; */ @@ -269,7 +269,7 @@ ContainsCameraGhost(world *World, entity **EntityTable, octree_node *Node, camer /* link_internal b32 */ /* OctreeChildrenNeedToMerge(world *World, octree_node *Node, camera *Camera) */ /* { */ -/* Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); */ +/* Assert(Node->Chunk->Dim % World->ChunkDim == V3i(0)); */ /* b32 Result = Node->Type == OctreeNodeType_Transit; */ /* Result &= ContainsCamera(World, Node, Camera) == False; */ @@ -281,9 +281,10 @@ link_internal void InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks) { Node->Type = OctreeNodeType_Leaf; - world_chunk *Chunk = &Node->Chunk; - Chunk->WorldP = WorldP; - Chunk->DimInChunks = DimInChunks; + Node->WorldP = WorldP; + Node->Resolution = DimInChunks; + + Assert(DimInChunks > V3i(0)); } link_internal octree_node * @@ -307,8 +308,8 @@ GetParentNodeFor(world *World, octree_node *QueryNode) Assert (Contains(CurrentBox, NodeMidpoint)); } { - v3i CurrentToQuery = NodeMidpoint.WorldP - Current->Chunk.WorldP; - v3i Cell = CurrentToQuery / (Current->Chunk.DimInChunks/2); + v3i CurrentToQuery = NodeMidpoint.WorldP - Current->Chunk->WorldP; + v3i Cell = CurrentToQuery / (Current->Chunk->DimInChunks/2); Assert(Cell < V3i(2)); s32 Index = GetIndex(Cell, V3i(2)); Assert(Index < 8); @@ -359,16 +360,20 @@ GetParentNodeFor(world *World, octree_node *QueryNode) link_internal s32 CountsAsDrawable(octree_node *Node) { - world_chunk *Chunk = &Node->Chunk; + s32 Result = False; - // NOTE(Jesse): Queued nodes don't necessarily mean they can't be drawn, but - // I'm going to say this is true to avoid data races for now - b32 NotQueued = (Chunk->Flags&Chunk_Queued) == 0; - b32 IsInitialized = (Chunk->Flags&Chunk_VoxelsInitialized); - b32 ChunkIsFullOrEmpty = (Chunk->FilledCount == 0) || Chunk->FilledCount == s32(Volume(Chunk)); + if (world_chunk *Chunk = Node->Chunk) + { + // NOTE(Jesse): Queued nodes don't necessarily mean they can't be drawn, but + // I'm going to say this is true to avoid data races for now + b32 NotQueued = (Chunk->Flags&Chunk_Queued) == 0; + b32 IsInitialized = (Chunk->Flags&Chunk_VoxelsInitialized); + b32 ChunkIsFullOrEmpty = (Chunk->FilledCount == 0) || Chunk->FilledCount == s32(Volume(Chunk)); + + /* s32 Result = ( NotQueued && (ChunkIsFullOrEmpty || HasGpuMesh(&Chunk->Meshes)) ); */ + Result = ( NotQueued && IsInitialized && (ChunkIsFullOrEmpty || HasGpuMesh(&Chunk->Meshes)) ); + } - /* s32 Result = ( NotQueued && (ChunkIsFullOrEmpty || HasGpuMesh(&Chunk->Meshes)) ); */ - s32 Result = ( NotQueued && IsInitialized && (ChunkIsFullOrEmpty || HasGpuMesh(&Chunk->Meshes)) ); return Result; } @@ -378,23 +383,25 @@ DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats UNPACK_ENGINE_RESOURCES(Engine); s32 Result = 0; - world_chunk *Chunk = &Node->Chunk; - - f32 AABBLineDim = Max(1.f, Node->Chunk.DimInChunks.x/12.f); + f32 AABBLineDim = Max(1.f, Node->Resolution.x/12.f); + world_chunk *Chunk = Node->Chunk; switch(Node->Type) { InvalidCase(OctreeNodeType_Undefined); case OctreeNodeType_Branch: { - if (EngineDebug->DrawBranchNodes) + if (Chunk) { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); - } + if (EngineDebug->DrawBranchNodes) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); + } - if (HasGpuMesh(&Node->Chunk.Meshes) && EngineDebug->DrawBranchNodesWithMeshes) - { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); + if (HasGpuMesh(&Node->Chunk->Meshes) && EngineDebug->DrawBranchNodesWithMeshes) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); + } } DEBUG_OctreeTraversal(Engine, Node->Children[0], Stats); @@ -411,9 +418,9 @@ DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats case OctreeNodeType_Leaf: { - if (EngineDebug->DrawLeafNodes) + if (Chunk && EngineDebug->DrawLeafNodes) { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Node->Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); } ++Stats->TotalLeaves; @@ -421,11 +428,11 @@ DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats } - if (Node->Chunk.Flags & Chunk_Queued) + if (Chunk && (Chunk->Flags & Chunk_Queued) ) { if (EngineDebug->DrawQueuedNodes) { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_RED, AABBLineDim*2.f); + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Node->Chunk, World->ChunkDim, RGB_RED, AABBLineDim*2.f); } ++Stats->TotalQueued; } @@ -460,10 +467,16 @@ OctreeBranchShouldCollapse(engine_resources *Engine, octree_node *Node) Assert(Node->Type == OctreeNodeType_Branch); b32 Result = False; - if (Node->Chunk.Flags & Chunk_Queued) return Result; + + if (world_chunk *Chunk = Node->Chunk) + { + Assert(Node->Resolution == Chunk->DimInChunks); + Assert(Node->WorldP == Chunk->WorldP); + if (Chunk->Flags & Chunk_Queued) return Result; + } v3i Res = ComputeNodeDesiredResolution(Engine, Node); - if (Res > Node->Chunk.DimInChunks) + if (Res > Node->Resolution) { Result = True; } @@ -476,11 +489,17 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) UNPACK_ENGINE_RESOURCES(Engine); Assert(Node->Type == OctreeNodeType_Leaf); + if (world_chunk *Chunk = Node->Chunk) + { + Assert(Node->Resolution == Chunk->DimInChunks); + Assert(Node->WorldP == Chunk->WorldP); + } + b32 Result = False; - if (Node->Chunk.DimInChunks > V3i(1)) + if (Node->Resolution > V3i(1)) { v3i Res = ComputeNodeDesiredResolution(Engine, Node); - if (Res < Node->Chunk.DimInChunks) + if (Res < Node->Resolution) { Result = True; } @@ -502,21 +521,24 @@ struct octree_node_priority_queue link_internal void PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_priority_queue *Queue, octree_node *Node, octree_node *Parent) { - Assert(Node->Chunk.Flags == Chunk_Uninitialized); + if (Node->Chunk) + { + Assert(Node->Chunk->Flags == Chunk_Uninitialized); + } s32 IdealListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, - Node->Chunk.DimInChunks.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); + Node->Resolution.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); IdealListIndex = (MAX_OCTREE_NODE_BUCKETS-1)-IdealListIndex; // Penalize nodes not in the frustum - if (IsInFrustum(World, GameCamera, &Node->Chunk) == False) + if (IsInFrustum(World, GameCamera, Node) == False) { IdealListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, IdealListIndex+5); } // Prefer chunks who have a higher chance of having geometry - if (Parent && HasGpuMesh(&Parent->Chunk.Meshes)) + if (Parent && Parent->Chunk && HasGpuMesh(&Parent->Chunk->Meshes)) { IdealListIndex = Max(0, IdealListIndex-3); } @@ -549,29 +571,40 @@ CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) } - if (Node->Chunk.Flags & Chunk_Queued) + + if (world_chunk *Chunk = Node->Chunk) { - if ( (Node->Chunk.Flags & Chunk_Deallocate) == 0) + if (Chunk->Flags & Chunk_Queued) { + if ( (Chunk->Flags & Chunk_Deallocate) == 0) { - octree_node *TestNode = Engine->World->OctreeNodeDeferFreelist.First; - while (TestNode) { Assert(TestNode != Node); TestNode = TestNode->Next; } + { // debug + octree_node *TestNode = Engine->World->OctreeNodeDeferFreelist.First; + while (TestNode) { Assert(TestNode != Node); TestNode = TestNode->Next; } + } + + // NOTE(Jesse): This is a bug waiting to happen. Pretty sure this could + // accidentally persist the Chunk_Queued flag after the worker thread had + // un-set it and therefore jam up the DeferFreelist (forever waiting on + // a "Queued" chunk that's not actually queued). + Chunk->Flags = chunk_flag(Chunk->Flags|Chunk_Deallocate); + Free(&Engine->World->OctreeNodeDeferFreelist, Node); + ++DeferrFreedNodes; } - // NOTE(Jesse): This is a bug waiting to happen. Pretty sure this could - // accidentally persist the Chunk_Queued flag after the worker thread had - // un-set it and therefore jam up the DeferFreelist (forever waiting on - // a "Queued" chunk that's not actually queued). - Node->Chunk.Flags = chunk_flag(Node->Chunk.Flags|Chunk_Deallocate); - Free(&Engine->World->OctreeNodeDeferFreelist, Node); - ++DeferrFreedNodes; + } + else + { + Assert(Chunk->Flags & Chunk_VoxelsInitialized); + FreeWorldChunk(Engine, Chunk); + + Node->Chunk = 0; + + Free(&Engine->World->OctreeNodeFreelist, Node); + ++FreedNodes; } } else { - if (Node->Chunk.Flags == Chunk_VoxelsInitialized) - { - DeallocateAndClearWorldChunk(Engine, &Node->Chunk); - } Free(&Engine->World->OctreeNodeFreelist, Node); ++FreedNodes; } @@ -584,7 +617,7 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) { UNPACK_ENGINE_RESOURCES(Engine); - Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); + if (Node->Chunk) { Assert(Node->Chunk->Dim % World->ChunkDim == V3i(0)); } Assert(Node->Type == OctreeNodeType_Branch); Node->Type = OctreeNodeType_Leaf; @@ -597,7 +630,7 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) CheckedDeallocateChildNode(Engine, Node->Children+6); CheckedDeallocateChildNode(Engine, Node->Children+7); - /* QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); */ + /* QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); */ u32 Result = 1; return Result; @@ -612,15 +645,39 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue UNPACK_ENGINE_RESOURCES(Engine); s32 Result = False; - SyncGpuBuffersAsync(Engine, &NodeToSplit->Chunk.Meshes); + world_chunk *Chunk = NodeToSplit->Chunk; - Assert(NodeToSplit->Chunk.Dim % World->ChunkDim == V3i(0)); b32 PushedToPriorityQueue = False; + if (Chunk) + { + SyncGpuBuffersAsync(Engine, &Chunk->Meshes); + + Assert(Chunk->Dim % World->ChunkDim == V3i(0)); + + if (Chunk) + { + if (Chunk->Flags & Chunk_VoxelsInitialized) + { + if (HasGpuMesh(&Chunk->Meshes) == False) + { + /* NodeToSplit->HadNoVisibleSurface = True; */ + /* NodeToSplit->Chunk = 0; */ + /* FreeWorldChunk(Engine, Chunk); */ + } + } + } - // Queue node to be initialized - if ( (NodeToSplit->Chunk.Flags & Chunk_Queued) == 0 && - (NodeToSplit->Chunk.Flags & Chunk_VoxelsInitialized) == 0 ) + // Queue node to be initialized + if ( Chunk && + (Chunk->Flags & Chunk_Queued) == 0 && + (Chunk->Flags & Chunk_VoxelsInitialized) == 0 ) + { + PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit, Parent); + PushedToPriorityQueue = True; + } + } + else { PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit, Parent); PushedToPriorityQueue = True; @@ -661,7 +718,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue { NodeToSplit->Type = OctreeNodeType_Branch; - v3i ChildDimInChunks = NodeToSplit->Chunk.DimInChunks / 2; + v3i ChildDimInChunks = NodeToSplit->Resolution / 2; Assert(ChildDimInChunks >= V3i(1)); RangeIterator(Index, s32(ArrayCount(NodeToSplit->Children))) @@ -676,7 +733,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue octree_node *Child = GetOrAllocate(&World->OctreeNodeFreelist); NodeToSplit->Children[Index] = Child; - InitOctreeNode(World, Child, NodeToSplit->Chunk.WorldP + RelWorldP, ChildDimInChunks); + InitOctreeNode(World, Child, NodeToSplit->WorldP + RelWorldP, ChildDimInChunks); } } else @@ -710,17 +767,18 @@ AllChildrenCanDraw(octree_node *Node) return Result; } -link_internal s32 +link_internal void DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_ptr_paged_list *MainDrawList, world_chunk_ptr_paged_list *ShadowMapDrawList) { UNPACK_ENGINE_RESOURCES(Engine); - s32 Result = 0; - - world_chunk *Chunk = &Node->Chunk; + world_chunk *Chunk = Node->Chunk; - Assert(Node->Chunk.Dim % World->ChunkDim == V3i(0)); + if (Chunk) + { + Assert(Node->Chunk->Dim % World->ChunkDim == V3i(0)); + } - f32 AABBLineDim = Max(1.f, Node->Chunk.DimInChunks.x/12.f); + f32 AABBLineDim = Max(1.f, Node->Resolution.x/12.f); Assert (Node); { switch(Node->Type) @@ -729,14 +787,14 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt case OctreeNodeType_Branch: { - if (EngineDebug->DrawBranchNodes) + if (Chunk && EngineDebug->DrawBranchNodes) { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); } - if (HasGpuMesh(&Node->Chunk.Meshes) && EngineDebug->DrawBranchNodesWithMeshes) + if (Chunk && HasGpuMesh(&Chunk->Meshes) && EngineDebug->DrawBranchNodesWithMeshes) { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); } if (AllChildrenCanDraw(Node)) @@ -749,38 +807,36 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt DrawOctreeRecursive(Engine, Node->Children[5], MainDrawList, ShadowMapDrawList); DrawOctreeRecursive(Engine, Node->Children[6], MainDrawList, ShadowMapDrawList); DrawOctreeRecursive(Engine, Node->Children[7], MainDrawList, ShadowMapDrawList); - - Result = True; } else { // Draw ourselves; the mesh composed of the children has a hole. - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); - Result = True; + if (Chunk) + { + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); + } } } break; case OctreeNodeType_Leaf: { - if (EngineDebug->DrawLeafNodes) + if (Chunk && EngineDebug->DrawLeafNodes) { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, &Node->Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + if (HasGpuMesh(&Chunk->Meshes)) + { + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); + /* Assert(Chunk->FilledCount); */ + } } - if (HasGpuMesh(&Node->Chunk.Meshes)) - { - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); - /* Assert(Chunk->FilledCount); */ - } } break; } } - - return Result; } @@ -804,15 +860,19 @@ MaintainWorldOctree(engine_resources *Engine) octree_node *Node = World->OctreeNodeDeferFreelist.First; octree_node *Next = Node->Next; - if (Node->Chunk.Flags & Chunk_Queued) + if (Node->Chunk->Flags & Chunk_Queued) { break; } else { - Assert(Node->Chunk.Flags & Chunk_VoxelsInitialized); - DeallocateAndClearWorldChunk(Engine, &Node->Chunk); + Assert(Node->Chunk->Flags & Chunk_VoxelsInitialized); + + FreeWorldChunk(Engine, Node->Chunk); Free(&World->OctreeNodeFreelist, Node); + + Node->Chunk = 0; + ++FreedNodes;; } @@ -872,26 +932,23 @@ MaintainWorldOctree(engine_resources *Engine) if (NodeP) { octree_node *Node = *NodeP; - /* Assert(Node->Type == OctreeNodeType_Leaf); */ - - world_chunk *Chunk = &Node->Chunk; - Assert((Chunk->Flags & Chunk_Queued) == 0); + /* if (Node->HadNoVisibleSurface == False) */ { - if (IsAllocated(&Node->Chunk) == False) + if (Node->Chunk) { - /* Info("Chunk allocated."); */ - ++TotalWorldChunksAllocated; - AllocateWorldChunk(Chunk, Chunk->WorldP, World->ChunkDim, Chunk->DimInChunks, World->ChunkMemory); + Assert(IsAllocated(Node->Chunk)); } else { - /* Info("Chunk already allocated."); */ + Node->Chunk = AllocateWorldChunk(Node->WorldP, World->ChunkDim, Node->Resolution, World->ChunkMemory); + ++TotalWorldChunksAllocated; } - QueueChunkForInit(&Plat->LowPriority, &Node->Chunk, MeshBit_Lod0); + + QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); ++Stats.NewQueues; - } - if (++NumQueuedThisFrame == MaxToQueueThisFrame) goto done_queueing_nodes; + if (++NumQueuedThisFrame == MaxToQueueThisFrame) goto done_queueing_nodes; + } } else { @@ -921,8 +978,8 @@ GetWorldChunkFromOctree(world *World, v3i WorldP) rect3cp Box = GetBoundingBox(World, Current); if (Contains(Box, Canonical_Position(V3(0), WorldP))) { - v3i CurrentToQuery = WorldP - Current->Chunk.WorldP; - v3i Cell = CurrentToQuery / Current->Chunk.DimInChunks; + v3i CurrentToQuery = WorldP - Current->Chunk->WorldP; + v3i Cell = CurrentToQuery / Current->Chunk->DimInChunks; Assert(Cell < V3i(2)); s32 Index = GetIndex(Cell, V3i(2)); Assert(Index < 8); diff --git a/src/engine/world.h b/src/engine/world.h index f8271706b..0f2a9e3be 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -10,10 +10,16 @@ enum octree_node_type struct octree_node { octree_node_type Type; - /* s32 AllChildrenCanDraw; */ - // TODO(Jesse): Maybe make this a pointer ..? - world_chunk Chunk; + // TODO(Jesse): Pack into something else + b32 HadNoVisibleSurface; + + v3i WorldP; + v3i Resolution; // in world-chunk space. Resolution of V3i(2) means the chunk occupies 2x2x2 in world-space + + // NOTE(Jesse): This is a pointer such that we can cull chunks that are + // empty, or completely full. + world_chunk *Chunk; // NOTE(Jesse): Took the union out because the UI doesn't know how to deal.. /* union { */ @@ -205,3 +211,6 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node); link_internal u32 MergeOctreeChildren(engine_resources *Engine, octree_node *Node); + +link_internal void +InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks); From 46a02f3d21cbf26032f33fb846ca00e134d9d64f Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 11 Oct 2024 15:10:18 -0700 Subject: [PATCH 076/421] Fix a couple bugs, draw normals --- examples/terrain_gen/game.cpp | 46 ++-- generated/are_equal_octree_node.h | 2 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- generated/d_union_ui_render_command.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 47 ++++ ..._editor_ui_for_compound_type_octree_node.h | 45 +++- ..._editor_ui_for_compound_type_world_chunk.h | 13 ++ generated/freelist_allocator_octree_node.h | 7 +- generated/generate_cursor_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- generated/maybe_standing_spot.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- jesse.make.sh | 6 +- src/engine/bonsai.h | 1 + src/engine/camera.cpp | 1 + src/engine/debug.h | 7 +- src/engine/editor.cpp | 1 + src/engine/terrain.cpp | 46 ++-- src/engine/terrain.h | 34 +-- src/engine/world.cpp | 205 ++++++++++-------- src/engine/world_chunk.cpp | 113 ++++++++-- src/engine/world_chunk.h | 3 + 29 files changed, 424 insertions(+), 179 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 0a01857c2..6f60f97d7 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -479,38 +479,36 @@ BONSAI_API_WORKER_THREAD_CALLBACK() case TerrainGenType_FBM2D: { - /* // FBM params */ - // 2km features - v3 Period = V3(200'000); - // 600m high - s32 Amplititude = 60'000; + // 5km features + v3 Period = V3(500'000); + s32 Amplititude = 80'000; s32 StartingZDepth = 60000; - u32 Octaves = 7; - - /* v3 Period = V3(500); */ - /* s32 Amplititude = 500; */ - /* s32 StartingZDepth = 500; */ - /* u32 Octaves = 1; */ + u32 Octaves = 9; - /* v3 Period = V3(1000); */ - /* s32 Amplititude = 800; */ - /* s32 StartingZDepth = 1000; */ - /* /1* u32 Octaves = 12; *1/ */ - /* u32 Octaves = 2; */ - /* /1* u32 Octaves = 1; *1/ */ + // 2km features + /* v3 Period = V3(200'000); */ + /* // 600m high */ + /* s32 Amplititude = 60'000; */ + /* s32 StartingZDepth = 60000; */ + /* u32 Octaves = 7; */ - /* v3 Period = V3(2500); */ + /* v3 Period = V3(5000); */ /* s32 Amplititude = 1500; */ /* s32 StartingZDepth = 1600; */ - /* u32 Octaves = 1; */ - /* /1* u32 Octaves = 4; *1/ */ + /* u32 Octaves = 8; */ -/* v3 Period = V3(50); */ -/* s32 Amplititude = 60; */ -/* s32 StartingZDepth = 60; */ +/* v3 Period = V3(2500); */ +/* s32 Amplititude = 1500; */ +/* s32 StartingZDepth = 1600; */ +/* /1* u32 Octaves = 1; *1/ */ /* u32 Octaves = 4; */ + + /* v3 Period = V3(50); */ + /* s32 Amplititude = 60; */ + /* s32 StartingZDepth = 6000; */ + /* u32 Octaves = 1; */ /* u32 Octaves = 4; */ @@ -749,8 +747,6 @@ BONSAI_API_WORKER_THREAD_CALLBACK() } - FinalizeChunkInitialization(Chunk); - UnSetFlag(&Chunk->Flags, Chunk_Queued); } break; } diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index 99fb4124d..472e504a8 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:27:0 +// src/engine/world.h:33:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index 5c388db6c..de3bc77ea 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:458:0 +// src/engine/world_chunk.h:461:0 struct world_chunk_ptr_block { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 61ab9bda7..025a9fdb2 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:499:0 +// src/engine/world_chunk.h:502:0 struct standing_spot_block { diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 4bc32ba9a..f836b71b8 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:526:0 +// src/engine/world_chunk.h:529:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index 0c52bd2b6..3c6ef878c 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:455:0 +// src/engine/world_chunk.h:458:0 struct world_chunk_ptr_buffer { diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 144039931..be2af7d56 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:810:0 +// external/bonsai_stdlib/src/ui/ui.h:811:0 enum ui_render_command_type { diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 3cb7a6b3a..b352ce6a5 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -226,6 +226,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*,&Element->DrawNodesWithChunks), + CSz("DrawNodesWithChunks"), + Params + ); + + + + + + + PushNewRow(Ui); DoEditorUi(Ui, @@ -376,6 +392,37 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam CSz("SelectedEntity"), Params ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*,&Element->OctreeDrawDepth), + CSz("OctreeDrawDepth"), + Params + ); + + + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node*, Element->SelectedNode), + CSz("SelectedNode"), + Params + ); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 3d7093f51..54f8280d7 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -41,10 +41,53 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + DoEditorUi(Ui, + Window, + Cast(b8*,&Element->HadNoVisibleSurface), + CSz("HadNoVisibleSurface"), + &DefaultUiRenderParams_Checkbox + ); + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*,&Element->WorldP), + CSz("WorldP"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*,&Element->Resolution), + CSz("Resolution"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_chunk*,&Element->Chunk), + Cast(world_chunk*, Element->Chunk), CSz("Chunk"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 19008502f..590d844db 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -164,6 +164,19 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + DoEditorUi(Ui, + Window, + Cast(b8*,&Element->HasMesh), + CSz("HasMesh"), + &DefaultUiRenderParams_Checkbox + ); + + + + + + PushNewRow(Ui); + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index f10448d6f..1c6fe9b0a 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:32:0 +// src/engine/world.h:38:0 struct octree_node_freelist { @@ -6,9 +6,6 @@ struct octree_node_freelist memory_arena *Memory; }; -debug_global u32 ReusedNode; -debug_global u32 AllocatedNode; - link_internal octree_node * GetOrAllocate(octree_node_freelist *Freelist) { @@ -16,12 +13,10 @@ GetOrAllocate(octree_node_freelist *Freelist) if (Result) { - ++ReusedNode; Freelist->First = Result->Next; } else { - ++AllocatedNode; Result = Allocate( octree_node, Freelist->Memory, 1 ); } diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index b48b2a94d..20122c627 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.cpp:492:0 +// src/engine/world.cpp:510:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index eb6ac880f..e93458852 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:29:0 +// src/engine/world.h:35:0 struct octree_node_ptr_stack { diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index a883b5c93..3081b64f9 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:532:0 +// src/engine/world_chunk.h:535:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 36b1a7e9d..52cf394f7 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2923:0 +// src/engine/world_chunk.cpp:2975:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index 6e8dd4750..c97072484 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:529:0 +// src/engine/world_chunk.h:532:0 struct standing_spot_stream_chunk { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index fa94213db..37662c7a8 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:496:0 +// src/engine/world_chunk.h:499:0 struct maybe_standing_spot { diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index f5eaab695..e44bdbe21 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:1966:0 +// src/engine/world_chunk.cpp:2018:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 06279ab24..e56f77fff 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:1969:0 +// src/engine/world_chunk.cpp:2021:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/jesse.make.sh b/jesse.make.sh index 179989d1f..27e9a114d 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash -# OPT="-O2" +OPT="-O2" -# ./make.sh RunPoof -# [ $? -ne 0 ] && exit 1 +./make.sh RunPoof +[ $? -ne 0 ] && exit 1 # ./make.sh $OPT BuildAll diff --git a/src/engine/bonsai.h b/src/engine/bonsai.h index 86ac56922..e59cee460 100644 --- a/src/engine/bonsai.h +++ b/src/engine/bonsai.h @@ -256,6 +256,7 @@ ClearWorldChunk( world_chunk *Chunk ) /* Chunk->PointsToLeaveRemaining = {}; */ /* Chunk->TriCount = {}; */ /* Chunk->EdgeBoundaryVoxelCount = {}; */ + Chunk->HasMesh = {}; Chunk->StandingSpots.At = Chunk->StandingSpots.Start; Chunk->Entities = {}; Chunk->Next = {}; diff --git a/src/engine/camera.cpp b/src/engine/camera.cpp index 7d9fa1253..d65f37fc0 100644 --- a/src/engine/camera.cpp +++ b/src/engine/camera.cpp @@ -4,6 +4,7 @@ UpdateCameraP(world *World, cp TargetViewP, camera *Camera) { TIMED_FUNCTION(); if (Camera->DistanceFromTarget < 0.1f) { Camera->DistanceFromTarget = 0.1f; } + if (Camera->TargetDistanceFromTarget < 0.1f) { Camera->TargetDistanceFromTarget = 0.1f; } r32 Px = Sin(Camera->Yaw); r32 Py = Cos(Camera->Yaw); diff --git a/src/engine/debug.h b/src/engine/debug.h index 459e17313..1f4dfc12d 100644 --- a/src/engine/debug.h +++ b/src/engine/debug.h @@ -61,7 +61,8 @@ struct engine_debug b8 DrawBranchNodesWithMeshes; b8 DrawBranchNodes; b8 DrawLeafNodes; - b8 DrawQueuedNodes = 1; + b8 DrawNodesWithChunks = 1; + b8 DrawQueuedNodes; r64 ChunkGenTimeElapsedMS; u64 CellsGenerated; @@ -77,6 +78,10 @@ struct engine_debug entity_id SelectedEntity; + u32 OctreeDrawDepth = 0xFFFFFFFF; + + octree_node *SelectedNode; + // World Edit debug // /* untextured_3d_geometry_buffer WorldEditDebugMesh; */ diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index c3e833eac..7b73938ed 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -744,6 +744,7 @@ DoSelectedVoxelDebugWindow(engine_resources *Engine, cp VoxelCP) world_chunk *ThisChunk = GetWorldChunkFromHashtable(World, VoxelCP.WorldP); PushTableStart(Ui); + PushNewRow(Ui); PushColumn(Ui, CSz("Contributed")); PushColumn(Ui, CSz(" ")); diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 2a7ad85a0..bd6ff752b 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -98,9 +98,10 @@ Terrain_FBM2D( world_chunk *Chunk, Assert(NoiseDim.x % 8 == 0); - /* v3i NoiseDim = Chunk->Dim + 2; */ - s32 NoiseValuesCount = Volume(NoiseDim); - r32 *NoiseValues = Allocate(r32, TempArena, NoiseValuesCount); + /* v3i NoiseDim = Chunk->Dim + 2; */ + s32 NoiseValuesCount = Volume(NoiseDim); + r32 *NoiseValues = Allocate(r32, TempArena, NoiseValuesCount); + v3 *Normals = Allocate(v3, TempArena, NoiseValuesCount-2); // NOTE(Jesse): Must be true to use _mm256_store_ps, which we do in the 16x version of perlin Assert(u64(NoiseValues) % 32 == 0); @@ -119,7 +120,7 @@ Terrain_FBM2D( world_chunk *Chunk, u32 *zPeriods = Allocate(u32, TempArena, Octaves); u32 *yPeriods = Allocate(u32, TempArena, Octaves); - avx_divisor *xPeriods = Allocate(avx_divisor, TempArena, Octaves); + avx_divisor *xPeriods = AllocateAligned(avx_divisor, TempArena, Octaves, 32); perlin_params *xParams = AllocateAligned(perlin_params, TempArena, NoiseDim.x*Octaves*2, 32); perlin_params *yParams = AllocateAligned(perlin_params, TempArena, NoiseDim.y*Octaves*2, 32); @@ -179,6 +180,22 @@ Terrain_FBM2D( world_chunk *Chunk, } } + f32 OctaveAmplitudeMax = {}; + +#define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ + f32(basis_chunk_point.channel) \ + + f32(offset)*Chunk->DimInChunks.channel \ + + SrcToDest.channel \ + + { + r32 InteriorAmp = r32(Amplitude); + RangeIterator(OctaveIndex, Octaves) + { + OctaveAmplitudeMax += InteriorAmp; + InteriorAmp = Max(1.f, InteriorAmp/2.f); + } + } + { TIMED_NAMED_BLOCK(octaves); for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) @@ -208,12 +225,11 @@ Terrain_FBM2D( world_chunk *Chunk, GetEngineDebug()->ChunkGenCyclesElapsed += ElapsedCycles; GetEngineDebug()->CellsGenerated += u64(Volume(NoiseDim))*u64(Octaves); -#define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ - f32(basis_chunk_point.channel) \ - + f32(offset)*Chunk->DimInChunks.channel \ - + SrcToDest.channel \ + + ComputeNormalsForChunkFromNoiseValues( NoiseValues, NoiseDim, Normals, NoiseDim-2); { +#if 1 TIMED_NAMED_BLOCK(finalize); for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { @@ -231,22 +247,26 @@ Terrain_FBM2D( world_chunk *Chunk, s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); + s32 NormalIndex = GetIndex(NoiseP, NoiseDim-2); + /* r32 ThisNoiseV = MapNoiseValueToFinal(NoiseValues[NoiseIndex]/OctaveAmplitudeMax)*OctaveAmplitudeMax; */ r32 ThisNoiseV = NoiseValues[NoiseIndex]; s32 NoiseChoice = ThisNoiseV > WorldZBiased; ChunkSum += u32(NoiseChoice); SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); - Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + /* Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); */ + Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ - if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } + /* if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } */ /* if (xChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_YELLOW)*u16(NoiseChoice); } */ /* if (xChunk == Chunk->Dim.x-1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ - if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_GREEN)*u16(NoiseChoice); } - if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } + /* if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_GREEN)*u16(NoiseChoice); } */ + /* if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } */ } } } +#endif Assert(NoiseDim.x >= 66); Assert(NoiseDim.y >= 66); @@ -945,7 +965,7 @@ ComputeNormalsForChunkFromNoiseValues_Opt(v3i Dim, r32 ChunkWorldZ, r32 *NoiseVa #endif link_internal void -ComputeNormalsForChunkFromNoiseValues( r32 ChunkWorldZ, r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim) +ComputeNormalsForChunkFromNoiseValues( r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim) { TIMED_FUNCTION(); diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 9b63beb3b..5f6891a89 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -186,6 +186,7 @@ MapNoiseValueToFinal(f32 Value) /* Assert(Value >= 0.f); */ // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about + /* v2 Points[] = */ /* { */ /* {{1.0f, 1.0f }}, */ @@ -207,26 +208,27 @@ MapNoiseValueToFinal(f32 Value) /* }; */ // Pretty nice -/* v2 Points[] = */ -/* { */ -/* {{1.0f, 1.0f }}, */ -/* {{0.7f, 0.7f }}, */ -/* {{0.65f, 0.43f }}, */ -/* {{0.6f, 0.4f }}, */ -/* {{0.5f, 0.1f }}, */ -/* {{0.0f, 0.0f }}, */ -/* }; */ - // Pillar-y v2 Points[] = { - {{1.0f, 0.5f }}, - {{0.6f, 0.3f }}, - {{0.1f, 0.2f }}, - {{0.05f, 0.45f }}, - {{0.0f , 0.5f }}, + {{1.0f, 1.0f }}, + {{0.7f, 0.7f }}, + {{0.65f, 0.43f }}, + {{0.6f, 0.4f }}, + {{0.5f, 0.1f }}, + {{0.0f, 0.0f }}, }; + // Pillar-y + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 0.5f }}, */ + /* {{0.6f, 0.3f }}, */ + /* {{0.1f, 0.2f }}, */ + /* {{0.05f, 0.45f }}, */ + /* {{0.0f , 0.5f }}, */ + /* }; */ + /* v2 Points[] = */ /* { */ /* {{1.0f, 0.0f }}, */ @@ -279,7 +281,7 @@ MapNoiseValueToFinal(f32 Value) link_internal void -ComputeNormalsForChunkFromNoiseValues( r32 ChunkWorldZ, r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim); +ComputeNormalsForChunkFromNoiseValues( r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim); link_internal u32 diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 39681b399..00e6866c1 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -2,8 +2,6 @@ debug_global u32 DeferrFreedNodes; debug_global u32 FreedNodes; -debug_global u32 TotalWorldChunksAllocated; - link_internal world * AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) { @@ -357,21 +355,22 @@ GetParentNodeFor(world *World, octree_node *QueryNode) return Result; } -link_internal s32 -CountsAsDrawable(octree_node *Node) +link_internal b32 +CountsAsDrawableOrUnmeshed(octree_node *Node) { - s32 Result = False; + b32 Result = True; // Default to true if there's nothing to draw (no chunk) if (world_chunk *Chunk = Node->Chunk) { // NOTE(Jesse): Queued nodes don't necessarily mean they can't be drawn, but // I'm going to say this is true to avoid data races for now b32 NotQueued = (Chunk->Flags&Chunk_Queued) == 0; - b32 IsInitialized = (Chunk->Flags&Chunk_VoxelsInitialized); - b32 ChunkIsFullOrEmpty = (Chunk->FilledCount == 0) || Chunk->FilledCount == s32(Volume(Chunk)); - /* s32 Result = ( NotQueued && (ChunkIsFullOrEmpty || HasGpuMesh(&Chunk->Meshes)) ); */ - Result = ( NotQueued && IsInitialized && (ChunkIsFullOrEmpty || HasGpuMesh(&Chunk->Meshes)) ); + Result = ( NotQueued && Chunk->HasMesh && HasGpuMesh(&Chunk->Meshes) ); + } + else + { + Result = Node->HadNoVisibleSurface; } return Result; @@ -438,7 +437,7 @@ DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats } } -#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (3) +#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (4) link_internal v3i ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) @@ -511,11 +510,12 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) poof(generate_cursor(octree_node_ptr)) #include -#define MAX_OCTREE_NODE_BUCKETS (512) -#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (256) +#define OCTREE_PRIORITY_QUEUE_LIST_COUNT (512) +#define OCTREE_PRIORITY_QUEUE_LIST_LENGTH (128) +#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (16) struct octree_node_priority_queue { - octree_node_ptr_cursor Lists[MAX_OCTREE_NODE_BUCKETS]; + octree_node_ptr_cursor Lists[OCTREE_PRIORITY_QUEUE_LIST_COUNT]; }; link_internal void @@ -526,15 +526,15 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio Assert(Node->Chunk->Flags == Chunk_Uninitialized); } - s32 IdealListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, + s32 IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, Node->Resolution.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); - IdealListIndex = (MAX_OCTREE_NODE_BUCKETS-1)-IdealListIndex; + IdealListIndex = (OCTREE_PRIORITY_QUEUE_LIST_COUNT-1)-IdealListIndex; // Penalize nodes not in the frustum if (IsInFrustum(World, GameCamera, Node) == False) { - IdealListIndex = Min(MAX_OCTREE_NODE_BUCKETS-1, IdealListIndex+5); + IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, IdealListIndex+5); } // Prefer chunks who have a higher chance of having geometry @@ -543,6 +543,7 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio IdealListIndex = Max(0, IdealListIndex-3); } + Assert(IdealListIndex >= 0 && IdealListIndex < OCTREE_PRIORITY_QUEUE_LIST_COUNT); if (Remaining(&Queue->Lists[IdealListIndex])) { Push(&Queue->Lists[IdealListIndex], Node); @@ -595,16 +596,17 @@ CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) else { Assert(Chunk->Flags & Chunk_VoxelsInitialized); + Assert( (Chunk->Flags & Chunk_Queued) == False); FreeWorldChunk(Engine, Chunk); - Node->Chunk = 0; - + Clear(Node); Free(&Engine->World->OctreeNodeFreelist, Node); ++FreedNodes; } } else { + Clear(Node); Free(&Engine->World->OctreeNodeFreelist, Node); ++FreedNodes; } @@ -639,52 +641,55 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) -link_internal s32 +link_internal void SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue *Queue, octree_node *NodeToSplit, octree_node *Parent, memory_arena *Memory) { UNPACK_ENGINE_RESOURCES(Engine); - s32 Result = False; world_chunk *Chunk = NodeToSplit->Chunk; - b32 PushedToPriorityQueue = False; if (Chunk) { SyncGpuBuffersAsync(Engine, &Chunk->Meshes); Assert(Chunk->Dim % World->ChunkDim == V3i(0)); - if (Chunk) + if (Chunk->Flags & Chunk_VoxelsInitialized) { - if (Chunk->Flags & Chunk_VoxelsInitialized) + if (Chunk->HasMesh == False) { - if (HasGpuMesh(&Chunk->Meshes) == False) - { - /* NodeToSplit->HadNoVisibleSurface = True; */ - /* NodeToSplit->Chunk = 0; */ - /* FreeWorldChunk(Engine, Chunk); */ - } + Assert( (Chunk->Flags & Chunk_Queued) == False); + /* if (Chunk->WorldP == V3i(0,0,0)) { RuntimeBreak(); } */ + Assert(Chunk->FilledCount == 0 || Chunk->FilledCount == Volume(Chunk->Dim)); + Assert(HasGpuMesh(&Chunk->Meshes) == 0); + NodeToSplit->HadNoVisibleSurface = True; + NodeToSplit->Chunk = 0; + FreeWorldChunk(Engine, Chunk); + } + else + { + /* Assert(Chunk->FilledCount > 0 && Chunk->FilledCount < Volume(Chunk->Dim)); */ } } - // Queue node to be initialized - if ( Chunk && - (Chunk->Flags & Chunk_Queued) == 0 && + if ( (Chunk->Flags & Chunk_Queued) == 0 && (Chunk->Flags & Chunk_VoxelsInitialized) == 0 ) { PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit, Parent); - PushedToPriorityQueue = True; } } else { - PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit, Parent); - PushedToPriorityQueue = True; + if (NodeToSplit->HadNoVisibleSurface) + { + } + else + { + PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit, Parent); + } } - /* NodeToSplit->AllChildrenCanDraw = False; */ - Assert (NodeToSplit); { switch(NodeToSplit->Type) @@ -736,39 +741,30 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue InitOctreeNode(World, Child, NodeToSplit->WorldP + RelWorldP, ChildDimInChunks); } } - else - { - if (PushedToPriorityQueue == False) - { - Result = CountsAsDrawable(NodeToSplit); - } - } } break; } } - - return Result; } -link_internal s32 -AllChildrenCanDraw(octree_node *Node) +link_internal b32 +ChildrenCanDrawOrHadNoMesh(octree_node *Node) { - s32 Result = CountsAsDrawable(Node->Children[0]); - Result &= CountsAsDrawable(Node->Children[1]); - Result &= CountsAsDrawable(Node->Children[2]); - Result &= CountsAsDrawable(Node->Children[3]); - Result &= CountsAsDrawable(Node->Children[4]); - Result &= CountsAsDrawable(Node->Children[5]); - Result &= CountsAsDrawable(Node->Children[6]); - Result &= CountsAsDrawable(Node->Children[7]); + b32 Result = CountsAsDrawableOrUnmeshed(Node->Children[0]); + Result &= CountsAsDrawableOrUnmeshed(Node->Children[1]); + Result &= CountsAsDrawableOrUnmeshed(Node->Children[2]); + Result &= CountsAsDrawableOrUnmeshed(Node->Children[3]); + Result &= CountsAsDrawableOrUnmeshed(Node->Children[4]); + Result &= CountsAsDrawableOrUnmeshed(Node->Children[5]); + Result &= CountsAsDrawableOrUnmeshed(Node->Children[6]); + Result &= CountsAsDrawableOrUnmeshed(Node->Children[7]); return Result; } link_internal void -DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_ptr_paged_list *MainDrawList, world_chunk_ptr_paged_list *ShadowMapDrawList) +DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_ptr_paged_list *MainDrawList, world_chunk_ptr_paged_list *ShadowMapDrawList, u32 Depth = 0) { UNPACK_ENGINE_RESOURCES(Engine); world_chunk *Chunk = Node->Chunk; @@ -797,38 +793,67 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); } - if (AllChildrenCanDraw(Node)) + if (ChildrenCanDrawOrHadNoMesh(Node)) { - DrawOctreeRecursive(Engine, Node->Children[0], MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[1], MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[2], MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[3], MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[4], MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[5], MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[6], MainDrawList, ShadowMapDrawList); - DrawOctreeRecursive(Engine, Node->Children[7], MainDrawList, ShadowMapDrawList); + DrawOctreeRecursive(Engine, Node->Children[0], MainDrawList, ShadowMapDrawList, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[1], MainDrawList, ShadowMapDrawList, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[2], MainDrawList, ShadowMapDrawList, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[3], MainDrawList, ShadowMapDrawList, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[4], MainDrawList, ShadowMapDrawList, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[5], MainDrawList, ShadowMapDrawList, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[6], MainDrawList, ShadowMapDrawList, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[7], MainDrawList, ShadowMapDrawList, Depth+1); } else { - // Draw ourselves; the mesh composed of the children has a hole. - if (Chunk) + + if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) { - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); + // Draw ourselves; the mesh composed of the children has a hole. + if (Chunk) + { + if (ContainsCameraGhost(World, EntityTable, Node, GameCamera)) + { + EngineDebug->SelectedNode = Node; + } + + if (EngineDebug->DrawNodesWithChunks) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + } + + if (HasGpuMesh(&Chunk->Meshes)) + { + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); + } + } } } } break; case OctreeNodeType_Leaf: { - if (Chunk && EngineDebug->DrawLeafNodes) + if (Chunk) { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); - if (HasGpuMesh(&Chunk->Meshes)) + if (EngineDebug->DrawLeafNodes) { - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); - /* Assert(Chunk->FilledCount); */ + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + } + + if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) + { + if (EngineDebug->DrawNodesWithChunks) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + } + + if (HasGpuMesh(&Chunk->Meshes)) + { + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); + /* Assert(Chunk->FilledCount); */ + } } } @@ -867,11 +892,12 @@ MaintainWorldOctree(engine_resources *Engine) else { Assert(Node->Chunk->Flags & Chunk_VoxelsInitialized); + Assert( (Node->Chunk->Flags & Chunk_Queued) == False); FreeWorldChunk(Engine, Node->Chunk); - Free(&World->OctreeNodeFreelist, Node); - Node->Chunk = 0; + Clear(Node); + Free(&World->OctreeNodeFreelist, Node); ++FreedNodes;; } @@ -896,9 +922,9 @@ MaintainWorldOctree(engine_resources *Engine) } octree_node_priority_queue Queue = {}; - RangeIterator(ListIndex, MAX_OCTREE_NODE_BUCKETS) + RangeIterator(ListIndex, OCTREE_PRIORITY_QUEUE_LIST_COUNT) { - Queue.Lists[ListIndex] = OctreeNodePtrCursor(MAX_OCTREE_NODES_QUEUED_PER_FRAME, GetTranArena()); + Queue.Lists[ListIndex] = OctreeNodePtrCursor(OCTREE_PRIORITY_QUEUE_LIST_LENGTH, GetTranArena()); } SplitOctreeNode_Recursive(Engine, &Queue, &World->Root, 0, &World->OctreeMemory); @@ -917,22 +943,26 @@ MaintainWorldOctree(engine_resources *Engine) DEBUG_VALUE_u32(FreedNodes); DEBUG_VALUE_u32(DeferrFreedNodes); - DEBUG_VALUE_u32(ReusedNode); - DEBUG_VALUE_u32(AllocatedNode); + /* DEBUG_VALUE_u32(ReusedNode); */ + /* DEBUG_VALUE_u32(AllocatedNode); */ s32 NumQueuedThisFrame = 0; if (MaxToQueueThisFrame) { - RangeIterator(ListIndex, MAX_OCTREE_NODE_BUCKETS) + RangeIterator(ListIndex, OCTREE_PRIORITY_QUEUE_LIST_COUNT) { octree_node_ptr_cursor List = Queue.Lists[ListIndex]; - RangeIterator(BucketIndex, MAX_OCTREE_NODES_QUEUED_PER_FRAME) + RangeIterator(BucketIndex, OCTREE_PRIORITY_QUEUE_LIST_LENGTH) { octree_node **NodeP = GetPtr(&List, umm(BucketIndex)); if (NodeP) { octree_node *Node = *NodeP; - /* if (Node->HadNoVisibleSurface == False) */ + if (Node->HadNoVisibleSurface) + { + Assert(Node->Chunk == 0); + } + else { if (Node->Chunk) { @@ -940,8 +970,9 @@ MaintainWorldOctree(engine_resources *Engine) } else { - Node->Chunk = AllocateWorldChunk(Node->WorldP, World->ChunkDim, Node->Resolution, World->ChunkMemory); - ++TotalWorldChunksAllocated; + Node->Chunk = GetFreeWorldChunk(World); + WorldChunk(Node->Chunk, Node->WorldP, GetWorldChunkDim(), Node->Resolution); + /* Node->Chunk = AllocateWorldChunk(Node->WorldP, World->ChunkDim, Node->Resolution, World->ChunkMemory); */ } QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 4746f03b4..e9f1cc13c 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -53,9 +53,23 @@ FinalizeChunkInitialization(world_chunk *Chunk) { FullBarrier; + u32 Flags = Chunk->Flags ; + if ( (Flags & Chunk_Freelist) != 0) + { + Info("%d", Flags); + RuntimeBreak(); + } + + if ( (Flags & Chunk_Queued) == 0) + { + Info("%d", Flags); + RuntimeBreak(); + } + /* UnSetFlag(Chunk, Chunk_Garbage); */ UnSetFlag(&Chunk->Flags, Chunk_Queued); SetFlag(&Chunk->Flags, Chunk_VoxelsInitialized); + } inline b32 @@ -68,6 +82,14 @@ ChunkIsGarbage(world_chunk* Chunk) return Garbage; } +link_internal void +WorldChunk(world_chunk *Chunk, v3i WorldP, v3i Dim, v3i DimInChunks) +{ + Chunk->WorldP = WorldP; + Chunk->Dim = Dim; + Chunk->DimInChunks = DimInChunks; +} + link_internal void AllocateWorldChunk(world_chunk *Result, v3i WorldP, v3i Dim, v3i DimInChunks, memory_arena *Storage) { @@ -83,9 +105,7 @@ AllocateWorldChunk(world_chunk *Result, v3i WorldP, v3i Dim, v3i DimInChunks, me Result->Voxels = AllocateAlignedProtection(voxel, Storage, VoxCount, CACHE_LINE_SIZE, false); } - Result->WorldP = WorldP; - Result->Dim = Dim; - Result->DimInChunks = DimInChunks; + WorldChunk(Result, WorldP, Dim, DimInChunks); /* Result->DimX = SafeTruncateU8(Dim.x); */ /* Result->DimY = SafeTruncateU8(Dim.y); */ /* Result->DimZ = SafeTruncateU8(Dim.z); */ @@ -235,6 +255,7 @@ AllocateAndInsertChunk(world *World, world_position P) return Result; } +debug_global u32 TotalWorldChunksAllocated; link_internal world_chunk * GetFreeWorldChunk(world *World) { @@ -248,6 +269,8 @@ GetFreeWorldChunk(world *World) World->FreeChunkCount -= 1; Result = (world_chunk*)Next; + u32 Flags = Result->Flags; + if (Flags != Chunk_Freelist) { Info("%d", Flags); RuntimeBreak(); } Assert(Result->Flags == Chunk_Freelist); Result->Flags = {}; ReleaseFutex(&World->ChunkFreelistFutex); @@ -257,6 +280,7 @@ GetFreeWorldChunk(world *World) /* Info("Allocated World Chunk"); */ Result = AllocateWorldChunk({}, World->ChunkDim, {}, World->ChunkMemory); Assert(Result->Flags == Chunk_Uninitialized); + ++TotalWorldChunksAllocated; } Assert(Result->Meshes.MeshMask == 0); @@ -327,6 +351,26 @@ FreeWorldChunk(engine_resources *Engine, world_chunk *Chunk) TIMED_FUNCTION(); UNPACK_ENGINE_RESOURCES(Engine); + u32 Flags = Chunk->Flags; + + if ( (Flags & Chunk_Queued) != 0) + { + Info("%d", Flags); + RuntimeBreak(); + } + + if ( (Flags & Chunk_Freelist) != 0) + { + Info("%d", Flags); + RuntimeBreak(); + } + + if ( (Flags & (Chunk_Deallocate|Chunk_VoxelsInitialized)) == 0) + { + Info("%d", Flags); + RuntimeBreak(); + } + Assert(Chunk->Next == 0); Assert(Chunk->Flags & Chunk_Deallocate|Chunk_VoxelsInitialized); @@ -346,7 +390,15 @@ FreeWorldChunk(engine_resources *Engine, world_chunk *Chunk) world_chunk *Next = World->ChunkFreelistSentinal.Next; Chunk->Flags = Chunk_Freelist; - if (Next) { Assert(Next->Flags == Chunk_Freelist); } + if (Next) + { + u32 nFlags = Next->Flags; + if (nFlags != Chunk_Freelist) + { + Info("%d", nFlags); + RuntimeBreak(); + } + } World->ChunkFreelistSentinal.Next = Chunk; World->ChunkFreelistSentinal.Next->Next = Next; @@ -3497,6 +3549,19 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, HISTOGRAM_FUNCTION(); /* TIMED_FUNCTION(); */ + + u32 ChunkFlags = DestChunk->Flags; + if ( (ChunkFlags & Chunk_Queued) == 0) + { + Info("%d", ChunkFlags); + RuntimeBreak(); + } + if ( (ChunkFlags & Chunk_Freelist) != 0) + { + Info("%d", ChunkFlags); + RuntimeBreak(); + } + engine_resources *EngineResources = GetEngineResources(); // @runtime_assert_chunk_aprons_are_valid @@ -3518,15 +3583,17 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, v3i SynChunkP = DestChunk->WorldP; world_chunk *SyntheticChunk = AllocateWorldChunk(SynChunkP, SynChunkDim, DestChunk->DimInChunks, Thread->TempMemory); + SyntheticChunk->Flags = Chunk_Queued; - u32 SyntheticChunkSum = NoiseCallback( SyntheticChunk, - NoiseBasisOffset, - NoiseParams, - UserData ); + SyntheticChunk->FilledCount = s32(NoiseCallback( SyntheticChunk, + NoiseBasisOffset, + NoiseParams, + UserData )); + // If the chunk didn't have any voxels filled, we're done - if (SyntheticChunkSum) + if (SyntheticChunk->FilledCount) { Assert(SyntheticChunk->Dim == SynChunkDim); @@ -3564,7 +3631,22 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, /* CopyChunkOffset(SyntheticChunk, SynChunkDim, DestChunk, DestChunk->Dim, Global_ChunkApronMinDim); */ - DestChunk->FilledCount = SyntheticChunk->FilledCount; + + /* DestChunk->FilledCount = SyntheticChunk->FilledCount; */ + + + Assert(DestChunk->FilledCount == 0); + Assert(DestChunk->Dim.x == 64); + Assert(DestChunk->Dim.y == 64); + Assert(DestChunk->Dim.z == 64); + RangeIterator(z, 64) + RangeIterator(y, 64) + { + u64 Occ = DestChunk->Occupancy[y + z*64]; + DestChunk->FilledCount += CountBitsSet_Kernighan(Occ); + } + + Assert(DestChunk->FilledCount <= s32(Volume(DestChunk->Dim))); // NOTE(Jesse): You can use this for debug, but it doesn't work if you change it to NoExteriorFaces /* MarkBoundaryVoxels_MakeExteriorFaces(DestChunk->Voxels, DestChunk->Dim, {}, DestChunk->Dim); */ @@ -3583,7 +3665,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, } #if 0 - if (SyntheticChunkSum && (Flags & ChunkInitFlag_GenSmoothLODs) ) + if (SyntheticChunk->FilledCount && (Flags & ChunkInitFlag_GenSmoothLODs) ) { untextured_3d_geometry_buffer *TempMesh = AllocateTempWorldChunkMesh(Thread->TempMemory); ComputeLodMesh( Thread, DestChunk, DestChunk->Dim, SyntheticChunk, SynChunkDim, TempMesh, True); @@ -3621,7 +3703,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, Assert( (Flags & ChunkInitFlag_GenLODs) == 0); #endif - Assert( DestChunk->FilledCount == SyntheticChunk->FilledCount); + /* Assert( DestChunk->FilledCount == SyntheticChunk->FilledCount); */ } #define FINALIZE_MESH_FOR_CHUNK(Src, Dest, Bit) \ @@ -3629,6 +3711,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, auto *SrcMesh = (Src)->Meshes.E[ToIndex(Bit)]; \ if (SrcMesh) { \ if (SrcMesh->At) { \ + DestChunk->HasMesh = True; \ AtomicReplaceMesh(&(Dest)->Meshes, Bit, SrcMesh, SrcMesh->Timestamp); \ } else { \ DeallocateMesh(EngineResources, SrcMesh); \ @@ -3641,9 +3724,13 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod2 ); FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod3 ); FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod4 ); - #undef FINALIZE_MESH_FOR_CHUNK + Assert( (DestChunk->Flags & Chunk_VoxelsInitialized) == 0); + Assert( DestChunk->FilledCount <= s32(Volume(SyntheticChunk))); + + /* if (DestChunk->WorldP == V3i(0)) { RuntimeBreak(); } */ + FinalizeChunkInitialization(DestChunk); } diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 08a7cb397..0de805305 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -334,6 +334,9 @@ struct world_chunk poof(@version(1)) // smaller, which is probably pretty worth. lod_element_buffer Meshes; poof(@no_serialize) + // TODO(Jesse): Pack this into something else.. or ideally remove it entirely. + b32 HasMesh; poof(@no_serialize) + /* threadsafe_geometry_buffer TransparentMeshes; */ /* gpu_mapped_element_buffer GpuBuffers[MeshIndex_Count]; */ From 61bd67ae54f9412343a63475c1b654e3d6caba6b Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 12 Oct 2024 09:22:42 -0700 Subject: [PATCH 077/421] AVX voxel normal calculations; get rid of VOXEL_DEBUG_COLOR --- examples/terrain_gen/game.cpp | 2 +- generated/d_union_ui_render_command.h | 2 +- generated/scalar_math_fuctions_451039071.h | 2 +- readme.md | 3 - src/engine/editor.cpp | 11 -- src/engine/terrain.cpp | 182 +++++++++++++++------ src/engine/terrain.h | 3 + src/engine/work_queue.h | 4 - src/engine/world.cpp | 5 - src/engine/world_chunk.cpp | 26 --- src/engine/world_chunk.h | 14 -- src/engine/world_update.cpp | 14 -- 12 files changed, 140 insertions(+), 128 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 6f60f97d7..c010b2ae8 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -484,7 +484,7 @@ BONSAI_API_WORKER_THREAD_CALLBACK() // 5km features v3 Period = V3(500'000); s32 Amplititude = 80'000; - s32 StartingZDepth = 60000; + s32 StartingZDepth = 20000; u32 Octaves = 9; // 2km features diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index be2af7d56..144039931 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:811:0 +// external/bonsai_stdlib/src/ui/ui.h:810:0 enum ui_render_command_type { diff --git a/generated/scalar_math_fuctions_451039071.h b/generated/scalar_math_fuctions_451039071.h index e595d7de3..ac324e680 100644 --- a/generated/scalar_math_fuctions_451039071.h +++ b/generated/scalar_math_fuctions_451039071.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/maff.h:367:0 +// external/bonsai_stdlib/src/maff.h:372:0 inline r32 Clamp( r32 Min, r32 Value, r32 Max ) diff --git a/readme.md b/readme.md index d599da07e..33f947d60 100644 --- a/readme.md +++ b/readme.md @@ -152,9 +152,6 @@ See the docs on the [build process](docs/01_build_process.md). https://www.intel.com/content/dam/develop/external/us/en/documents/spir-vtointe-ispcgpu-compute-on-the-cpu.pdf https://ispc.github.io/ -[ ] Look into using slang dual CPU/GPU world-gen? - https://github.com/shader-slang/slang - ------------------------------------------------------------------------------- ## Profiler diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 7b73938ed..4c9b6a47d 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -705,18 +705,7 @@ DoSelectedVoxelDebugWindow(engine_resources *Engine, cp VoxelCP) UNPACK_ENGINE_RESOURCES(Engine); voxel *V = TryGetVoxelPointer(World, VoxelCP); - - v3 SimP = Floor(GetSimSpaceP(World, VoxelCP)); -#if VOXEL_DEBUG_COLOR - if (V) - { - DEBUG_DrawSimSpaceVectorAt(Engine, SimP, Normalize(V->DebugColor)* 40.f, GREEN, 0.25f); - DEBUG_DrawSimSpaceVectorAt(Engine, SimP, Normalize(V->DebugColor)*-40.f, YELLOW, 0.25f); - DEBUG_HighlightVoxel(Engine, SimP, YELLOW, DEFAULT_LINE_THICKNESS*2.f); - } -#endif - { local_persist window_layout Window = WindowLayout("Voxel Debug Window", V2(150.f, 150.f)); diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index bd6ff752b..8f8c5b6bf 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -82,38 +82,36 @@ Terrain_FBM2D( world_chunk *Chunk, return ChunkSum; #endif -#if VOXEL_DEBUG_COLOR - memory_arena *TempArena = GetThreadLocalState(ThreadLocal_ThreadIndex)->PermMemory; -#else memory_arena *TempArena = GetTranArena(); -#endif s32 NoiseUpsampleFactor = 1; /* v3i NoiseDim = RoundUp(Chunk->Dim/2, V3i(8)); */ /* v3i NoiseDim = RoundUp((Chunk->Dim+2)/NoiseUpsampleFactor, V3i(8, 1, 1)); */ - v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0))/NoiseUpsampleFactor, V3i(8)); + v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0))/NoiseUpsampleFactor, V3i(8, 1, 1)); + v3i NormalsDim = RoundUp((Chunk->Dim-V3i(2,2,2))/NoiseUpsampleFactor, V3i(8, 1, 1)); + + Assert(Chunk->Dim == V3i(64)); + Assert(NormalsDim == V3i(64)); + /* v3i NoiseDim = Chunk->Dim; */ // NOTE(Jesse): This must hold true for using any Noise_16x func Assert(NoiseDim.x % 8 == 0); /* v3i NoiseDim = Chunk->Dim + 2; */ - s32 NoiseValuesCount = Volume(NoiseDim); - r32 *NoiseValues = Allocate(r32, TempArena, NoiseValuesCount); - v3 *Normals = Allocate(v3, TempArena, NoiseValuesCount-2); + s32 NoiseValuesCount = Volume(NoiseDim); + s32 NormalValuesCount = Volume(NormalsDim); + // + // NOTE(Jesse): Have to add 1 to compute the normals because on the last + // iteration we go +1 in the x direction. This is super garbage/sketchy and + // I hate it, but I don't have a better solution for now. + r32 *NoiseValues = Allocate(r32, TempArena, NoiseValuesCount+1); + v3 *Normals = Allocate( v3, TempArena, NormalValuesCount ); // NOTE(Jesse): Must be true to use _mm256_store_ps, which we do in the 16x version of perlin Assert(u64(NoiseValues) % 32 == 0); { - /* v3i NormalDim = Chunk->Dim; */ - /* v3 *Normals = Allocate( v3, TempArena, Volume(NormalDim)); */ - -#if VOXEL_DEBUG_COLOR - Chunk->NoiseValues = NoiseValues; - Chunk->NormalValues = Normals; -#endif - u32_8x xChunkResolution = U32_8X(u32(Chunk->DimInChunks.x)); u32 yChunkResolution = u32(Chunk->DimInChunks.y); u32 zChunkResolution = u32(Chunk->DimInChunks.z); @@ -226,7 +224,8 @@ Terrain_FBM2D( world_chunk *Chunk, GetEngineDebug()->CellsGenerated += u64(Volume(NoiseDim))*u64(Octaves); - ComputeNormalsForChunkFromNoiseValues( NoiseValues, NoiseDim, Normals, NoiseDim-2); + ComputeNormalsForChunkFromNoiseValues_avx( NoiseValues, NoiseDim, Normals, NormalsDim); + /* ComputeNormalsForChunkFromNoiseValues( NoiseValues, NoiseDim, Normals, NormalsDim); */ { #if 1 @@ -247,7 +246,6 @@ Terrain_FBM2D( world_chunk *Chunk, s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); - s32 NormalIndex = GetIndex(NoiseP, NoiseDim-2); /* r32 ThisNoiseV = MapNoiseValueToFinal(NoiseValues[NoiseIndex]/OctaveAmplitudeMax)*OctaveAmplitudeMax; */ r32 ThisNoiseV = NoiseValues[NoiseIndex]; @@ -255,8 +253,12 @@ Terrain_FBM2D( world_chunk *Chunk, ChunkSum += u32(NoiseChoice); SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); + s32 NormalIndex = TryGetIndex(ChunkP, NormalsDim); + if (NormalIndex > -1) + { + Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); + } /* Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); */ - Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ /* if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } */ /* if (xChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_YELLOW)*u16(NoiseChoice); } */ @@ -971,7 +973,7 @@ ComputeNormalsForChunkFromNoiseValues( r32 *NoiseValues, v3i NoiseDim, v3 *Norma // NOTE(Jesse): For this function to work the noise has to be one voxel larger // than the normal data - Assert(NoiseDim == NormalsDim+2); + Assert(NoiseDim >= NormalsDim+2); #if 1 for ( s32 z = 0; z < NormalsDim.z; ++ z) @@ -1049,6 +1051,118 @@ ComputeNormalsForChunkFromNoiseValues( r32 *NoiseValues, v3i NoiseDim, v3 *Norma #endif } +link_internal void +ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim) +{ + TIMED_FUNCTION(); + + // NOTE(Jesse): The Normal values are undefined on the edges + // + // NOTE(Jesse): For this function to work the buffers have to be the same size + // and bounded by a multiple of 8, cause AVX. + // + Assert(NormalsDim.x % 8 == 0); + /* Assert(NoiseDim.x % 8 == 0); */ + + Assert(NormalsDim <= NoiseDim-V3i(2,2,2)); + + +#if 1 + for ( s32 z = 0; z < NormalsDim.z; ++ z) + { + for ( s32 y = 0; y < NormalsDim.y; ++ y) + { + for ( s32 x = 0; x < NormalsDim.x; x += 8) + { + s32 BaseIndex = GetIndex(V3i(x,y,z), NoiseDim); + f32_8x CurrentNoiseValue = F32_8X(NoiseValues+BaseIndex); + + v3_8x Normal = {}; + for ( s32 dz = -1; dz < 2; ++ dz) + { + for ( s32 dy = -1; dy < 2; ++ dy) + { + for ( s32 dx = -1; dx < 2; ++ dx) + { + if (dz == 0 && dy == 0 && dx == 0) continue; // Skip the middle-most voxel + + s32 dIndex = GetIndex(V3i(x+dx,y+dy,z+dz)+1, NoiseDim); + { + f32_8x OffsetNoiseValue = F32_8X_unaligned(NoiseValues + dIndex); + f32_8x Diff = OffsetNoiseValue - F32_8X(dz) - Truncate(CurrentNoiseValue); + + u32_8x AddMask = Diff > 0.f; + + v3_8x AddVal = Select(AddMask, V3_8X(dx,dy,dz)*Diff.Sse, V3_8X(0.f)); + + Normal.avx.x = Normal.avx.x + AddVal.avx.x; + Normal.avx.y = Normal.avx.y + AddVal.avx.y; + Normal.avx.z = Normal.avx.z + AddVal.avx.z; + + /* if ( Diff > 0.f ) */ + /* { */ + /* // TODO(Jesse): Recompute with a small random variance to the weight if this is 0? */ + /* Normal += V3_8X(dx,dy,dz)*Diff; */ + /* } */ + } + } + } + } + + s32 NormalIndex = GetIndex(V3i(x,y,z), NormalsDim); + /* v3_8x Result = Normalize(Normal) * F32_8X(-1.f).Sse; */ + v3_8x Result = V3_8X(x, y, z); + + f32 *Basis = Cast(f32*, Normals+NormalIndex); + + _mm256_storeu_ps( Basis+ 0, Result.avx.x.Sse); + _mm256_storeu_ps( Basis+ 8, Result.avx.y.Sse); + _mm256_storeu_ps( Basis+16, Result.avx.z.Sse); + + /* f32_8x A, B, C; */ + /* A = {{ }}; */ + } + } + } +#else + for ( s32 z = 1; z < NoiseDim.z-1; ++ z) + { + for ( s32 y = 1; y < NoiseDim.y-1; ++ y) + { + for ( s32 x = 1; x < NoiseDim.x-1; ++ x) + { + s32 NormalIndex = GetIndex(V3i(x,y,z)-1, NormalsDim); + s32 NoiseIndex = GetIndex(V3i(x,y,z), NoiseDim); + r32 CurrentNoiseValue = NoiseValues[NoiseIndex]; + + v3 Normal = {}; + for ( s32 dz = -1; dz < 2; ++ dz) + { + for ( s32 dy = -1; dy < 2; ++ dy) + { + for ( s32 dx = -1; dx < 2; ++ dx) + { + if (dz == 0 && dy == 0 && dx == 0) continue; // Skip the middle-most voxel + + s32 dPIndex = GetIndex(V3i(x+dx,y+dy,z+dz), NoiseDim); + { + r32 Diff = NoiseValues[dPIndex]-dz - Truncate(CurrentNoiseValue); + if ( Diff > 0.f ) + { + // TODO(Jesse): Recompute with a small random variance to the weight if this is 0? + Normal += V3(dx,dy,dz)*Diff; + } + } + } + } + } + Normals[NormalIndex] = Normalize(Normal) * -1.f; + } + } + } +#endif +} + link_internal u32 HoodooTerrain( world_chunk *Chunk, @@ -1991,20 +2105,11 @@ GrassyTerracedTerrain4( world_chunk *Chunk, /* b32 *NoiseHit = Allocate(b32, GetTranArena(), Volume(NoiseDim)); */ /* b32 *NormalsHit = Allocate(b32, GetTranArena(), Volume(NormalDim)); */ -#if VOXEL_DEBUG_COLOR memory_arena *TempArena = GetThreadLocalState(ThreadLocal_ThreadIndex)->PermMemory; -#else - memory_arena *TempArena = GetTranArena(); -#endif r32 *NoiseValues = Allocate(r32, TempArena, Volume(NoiseDim)); v3 *Normals = Allocate( v3, TempArena, Volume(NormalDim)); -#if VOXEL_DEBUG_COLOR - Chunk->NoiseValues = NoiseValues; - Chunk->NormalValues = Normals; -#endif - // NOTE(Jesse): Perlin_8x needs a multiple of 8 here. Assert(Dim.x % 8 == 0); @@ -2276,25 +2381,6 @@ GrassyTerracedTerrain4( world_chunk *Chunk, ComputeNormalsForChunkFromFilledFlag(Chunk, WorldChunkDim, Normals); #endif -#if VOXEL_DEBUG_COLOR -#if 0 - for ( s32 z = 0; z < Chunk->Dim.z; ++ z) - { - for ( s32 y = 0; y < Chunk->Dim.y; ++ y) - { - for ( s32 x = 0; x < Chunk->Dim.x; ++ x) - { - /* s32 Index = GetIndex(V3i(x,y,z), NormalDim); */ - s32 NormalIndex = GetIndex(V3i(x,y,z), NormalDim); - s32 NoiseIndex = GetIndex(V3i(x,y,z)+1, NoiseDim); - Chunk->Voxels[NormalIndex].DebugColor = Normals[NormalIndex]; - Chunk->Voxels[NormalIndex].DebugNoiseValue = NoiseValues[NoiseIndex]; - } - } - } -#endif -#endif - return ChunkSum; } #endif diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 5f6891a89..973386931 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -283,6 +283,9 @@ MapNoiseValueToFinal(f32 Value) link_internal void ComputeNormalsForChunkFromNoiseValues( r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim); +link_internal void +ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim); + link_internal u32 Terrain_WhiteNoise( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index b0001e4a1..f6e0ed66c 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -110,11 +110,7 @@ CAssert( (sizeof(work_queue_entry__align_to_cache_line_helper)+8) % CACHE_LINE_S -#if VOXEL_DEBUG_COLOR -global_variable voxel Global_UnsetVoxel = { 0xff, 0xff, 0xffff, {}, {}}; -#else global_variable voxel Global_UnsetVoxel = { 0xff, 0xffff }; -#endif diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 00e6866c1..988eaf091 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -124,12 +124,7 @@ GatherVoxelsOverlappingArea(world *World, rect3i SimSpaceAABB, world_chunk_ptr_b u32 TotalVoxels = (u32)TotalVoxels_signed; - // TODO(Jesse): Put this behind a debug/internal flag ? -#if VOXEL_DEBUG_COLOR - voxel UnsetVoxel = { 0xff, 0xff, 0xffff, {}, {} }; -#else voxel UnsetVoxel = { 0xff, 0xffff }; -#endif for (u32 VoxelIndex = 0; VoxelIndex < TotalVoxels; ++VoxelIndex) { Voxels[VoxelIndex] = UnsetVoxel; } v3i SimSpaceQueryMinP = SimSpaceAABB.Min; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index e9f1cc13c..343adc827 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -1959,11 +1959,7 @@ poof( /* // TODO(Jesse): This copy could be avoided in multiple ways, and should be. */ /* /1* FillColorArray(Voxel->Color, FaceColors, ColorPallette, VERTS_PER_FACE); *1/ */ -/* /1* #if VOXEL_DEBUG_COLOR *1/ */ - /* /1* v3 Color = Abs(Voxel->DebugColor); *1/ */ -/* /1* #else *1/ */ /* /1* v3 Color = GetColorData(Voxel->Color); *1/ */ -/* /1* #endif *1/ */ /* f32 Trans = (f32)Voxel->Transparency / 255.f; */ /* FillArray(VertexMaterial(Voxel->Color, Trans, 0.f), Materials, VERTS_PER_FACE); */ @@ -3597,28 +3593,6 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, { Assert(SyntheticChunk->Dim == SynChunkDim); -#if 1 && VOXEL_DEBUG_COLOR - DestChunk->NoiseValues = SyntheticChunk->NoiseValues; - DestChunk->NormalValues = SyntheticChunk->NormalValues; - if (DestChunk->NoiseValues) - { - for ( s32 z = 0; z < SyntheticChunk->Dim.z; ++ z) - { - for ( s32 y = 0; y < SyntheticChunk->Dim.y; ++ y) - { - for ( s32 x = 0; x < SyntheticChunk->Dim.x; ++ x) - { - s32 NormalIndex = GetIndex(V3i(x,y,z), SyntheticChunk->Dim); - s32 NoiseIndex = GetIndex(V3i(x,y,z)+1, SyntheticChunk->Dim+2); - SyntheticChunk->Voxels[NormalIndex].DebugColor = SyntheticChunk->NormalValues[NormalIndex]; - SyntheticChunk->Voxels[NormalIndex].DebugNoiseValue = SyntheticChunk->NoiseValues[NoiseIndex]; - } - } - } - } -#endif - - /* MakeExteriorFaces = True; */ if (MakeExteriorFaces) { diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 0de805305..9e5a51b5e 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -110,8 +110,6 @@ CAssert(Voxel_MarkBit < u8_MAX); /* global_variable u8 VoxelFaceMask = Voxel_LeftFace | Voxel_RightFace | Voxel_TopFace | Voxel_BottomFace | Voxel_FrontFace | Voxel_BackFace; */ -#define VOXEL_DEBUG_COLOR (0) - // TODO(Jesse): Surely we can compress this.. but do we care? struct voxel { @@ -364,13 +362,7 @@ struct world_chunk poof(@version(1)) // TODO(Jesse): Probably take this out? s32 DEBUG_OwnedByThread; poof(@no_serialize) -#if VOXEL_DEBUG_COLOR - f32 *NoiseValues; poof(@no_serialize @array_length(Volume(Element->Dim))) - v3 *NormalValues; poof(@no_serialize @array_length(Volume(Element->Dim))) - u8 _Pad1[8]; poof(@no_serialize) -#else u8 _Pad1[20]; poof(@no_serialize) -#endif }; // TODO(Jesse, id: 87, tags: speed, cache_friendly): Re-enable this // @world-chunk-cache-line-size @@ -437,13 +429,7 @@ struct world_chunk_0 // TODO(Jesse): Probably take this out? s32 DEBUG_OwnedByThread; poof(@no_serialize) -#if VOXEL_DEBUG_COLOR - f32 *NoiseValues; poof(@no_serialize @array_length(Volume(Element->Dim))) - v3 *NormalValues; poof(@no_serialize @array_length(Volume(Element->Dim))) - u8 _Pad1[16]; poof(@no_serialize) -#else u8 _Pad1[28]; poof(@no_serialize) -#endif }; diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 643b0d825..60dfbd8f1 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -907,11 +907,7 @@ ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_re if (Mode == WorldEdit_Mode_Attach || Mode == WorldEdit_Mode_Paint) { -#if VOXEL_DEBUG_COLOR - _NewVoxelValue = { NewTransparency, NewColor, {}, {}}; -#else _NewVoxelValue = { NewTransparency, NewColor}; -#endif } switch (Shape.Type) @@ -1194,13 +1190,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ /* Assert( (V->Flags & Voxel_MarkBit) == 0); */ StartedFilled += GetOccupancyBit(Chunk, s32(Index)); -#if VOXEL_DEBUG_COLOR - V->Flags = CopiedChunk.Voxels[Index].Flags; - V->Color = CopiedChunk.Voxels[Index].Color; - V->Transparency = CopiedChunk.Voxels[Index].Transparency; -#else *V = CopiedChunk.Voxels[Index]; -#endif EndedFilled += GetOccupancyBit(&CopiedChunk, s32(Index)); NotImplemented; /* Assert( (V->Flags & Voxel_MarkBit) == 0); */ @@ -1228,11 +1218,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ chunk_data CD = { Chunk_VoxelsInitialized, UpdateDim, CopiedChunk.Voxels, 0 }; vox_data Vox = {&CD}; -#if VOXEL_DEBUG_COLOR - BuildWorldChunkMeshFromMarkedVoxels_Naieve( CopiedChunk.Voxels, UpdateDim, {}, UpdateDim, DebugMesh ); -#else BuildWorldChunkMeshFromMarkedVoxels_Greedy( &Vox, DebugMesh, 0, GetTranArena()); -#endif /* aabb QueryAABB = AABBMinMax( {}, V3i(7.f + Radius*2.f) ); */ From 3f702338564ddfa2f2748dcb7da19779c9a4de31 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 12 Oct 2024 11:00:40 -0700 Subject: [PATCH 078/421] Fix some banding artifacts --- examples/terrain_gen/game.cpp | 16 +++++++------- examples/terrain_gen/game_constants.h | 4 ++-- .../asyncify_render_function_c_DrawLod.h | 2 +- ...yncify_render_function_c_RenderToTexture.h | 2 +- .../asyncify_render_function_h_DrawLod.h | 2 +- ...yncify_render_function_h_RenderToTexture.h | 2 +- generated/block_array_entity_ptr_688856411.h | 2 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- .../d_union_constructors_work_queue_entry.h | 2 +- generated/d_union_work_queue_entry.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 2 +- generated/for_datatypes_fkubhsYl.h | 2 +- generated/for_datatypes_kv3WBTai.h | 2 +- generated/gen_constructor_voxel_lighting.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- ...e_string_table_world_chunk_mesh_bitfield.h | 2 +- ...rate_string_table_world_chunk_mesh_index.h | 2 +- generated/maybe_chunk_data.h | 2 +- generated/maybe_standing_spot.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 6 +----- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 6 +----- src/engine/terrain.cpp | 21 +++++++++++-------- 28 files changed, 47 insertions(+), 52 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index c010b2ae8..7f05fcd9e 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -482,10 +482,10 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* // FBM params */ // 5km features - v3 Period = V3(500'000); - s32 Amplititude = 80'000; - s32 StartingZDepth = 20000; - u32 Octaves = 9; + /* v3 Period = V3(500'000); */ + /* s32 Amplititude = 80'000; */ + /* s32 StartingZDepth = 20000; */ + /* u32 Octaves = 9; */ // 2km features /* v3 Period = V3(200'000); */ @@ -494,10 +494,10 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* s32 StartingZDepth = 60000; */ /* u32 Octaves = 7; */ - /* v3 Period = V3(5000); */ - /* s32 Amplititude = 1500; */ - /* s32 StartingZDepth = 1600; */ - /* u32 Octaves = 8; */ + v3 Period = V3(5000); + s32 Amplititude = 1500; + s32 StartingZDepth = 1600; + u32 Octaves = 9; /* v3 Period = V3(2500); */ /* s32 Amplititude = 1500; */ diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index f5d514c83..2f08a69ee 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -10,13 +10,13 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192*32, 8192*32, 8192*32); // 1677km */ -g_VisibleRegion = Chunk_Dimension(8192*8, 8192*8, 8192*8); // 416km +/* g_VisibleRegion = Chunk_Dimension(8192*8, 8192*8, 8192*8); // 416km */ /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ -/* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ +g_VisibleRegion = Chunk_Dimension(128, 128, 128); /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ diff --git a/generated/asyncify_render_function_c_DrawLod.h b/generated/asyncify_render_function_c_DrawLod.h index 2405df5f7..445694e05 100644 --- a/generated/asyncify_render_function_c_DrawLod.h +++ b/generated/asyncify_render_function_c_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:311:0 +// src/engine/work_queue.h:307:0 link_internal void DrawLod_Async(work_queue *Queue,engine_resources *Engine ,shader *Shader ,lod_element_buffer *Meshes ,r32 DistanceSquared ,v3 Basis ,Quaternion Rotation ,v3 Scale ) diff --git a/generated/asyncify_render_function_c_RenderToTexture.h b/generated/asyncify_render_function_c_RenderToTexture.h index 47e478b3b..e73c1d2e3 100644 --- a/generated/asyncify_render_function_c_RenderToTexture.h +++ b/generated/asyncify_render_function_c_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:308:0 +// src/engine/work_queue.h:304:0 link_internal void RenderToTexture_Async(work_queue *Queue,engine_resources *Engine ,asset_thumbnail *Thumb ,lod_element_buffer *Meshes ,v3 Offset ,camera *Camera ) diff --git a/generated/asyncify_render_function_h_DrawLod.h b/generated/asyncify_render_function_h_DrawLod.h index 4c327865a..d59708f94 100644 --- a/generated/asyncify_render_function_h_DrawLod.h +++ b/generated/asyncify_render_function_h_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:167:0 +// src/engine/work_queue.h:163:0 struct draw_lod_async_params poof(@async_function_params) { diff --git a/generated/asyncify_render_function_h_RenderToTexture.h b/generated/asyncify_render_function_h_RenderToTexture.h index 5b710917b..ee3d841eb 100644 --- a/generated/asyncify_render_function_h_RenderToTexture.h +++ b/generated/asyncify_render_function_h_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:164:0 +// src/engine/work_queue.h:160:0 struct render_to_texture_async_params poof(@async_function_params) { diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h index 750e0a7ce..424fc69e6 100644 --- a/generated/block_array_entity_ptr_688856411.h +++ b/generated/block_array_entity_ptr_688856411.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:310:0 +// src/engine/world_chunk.h:308:0 struct entity_ptr_block { diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index de3bc77ea..e65c24d8c 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:461:0 +// src/engine/world_chunk.h:447:0 struct world_chunk_ptr_block { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 025a9fdb2..1675a6132 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:502:0 +// src/engine/world_chunk.h:488:0 struct standing_spot_block { diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index f836b71b8..3d3a3d909 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:529:0 +// src/engine/world_chunk.h:515:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index 3c6ef878c..5685b6110 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:458:0 +// src/engine/world_chunk.h:444:0 struct world_chunk_ptr_buffer { diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 8fde7cbe3..5e06ba21d 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:252:0 +// src/engine/work_queue.h:248:0 link_internal work_queue_entry diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index 396d0bed8..fd4a4d725 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:224:0 +// src/engine/work_queue.h:220:0 enum work_queue_entry_type { diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index fb48a99c8..4f6b1ef7c 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:284:0 +// src/engine/work_queue.h:280:0 diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index b68141172..73d6a8848 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:207:0 +// src/engine/work_queue.h:203:0 diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index f02ac0390..87dd6303e 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:188:0 +// src/engine/work_queue.h:184:0 diff --git a/generated/gen_constructor_voxel_lighting.h b/generated/gen_constructor_voxel_lighting.h index 54c5e7f76..71e233bbc 100644 --- a/generated/gen_constructor_voxel_lighting.h +++ b/generated/gen_constructor_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:127:0 +// src/engine/world_chunk.h:125:0 link_internal voxel_lighting VoxelLighting( u8 Emission ) diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index 20122c627..ba83caae3 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.cpp:510:0 +// src/engine/world.cpp:505:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 3081b64f9..8b2318f3b 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:535:0 +// src/engine/world_chunk.h:521:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 52cf394f7..158d74897 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2975:0 +// src/engine/world_chunk.cpp:2971:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index c97072484..3f5ee3641 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:532:0 +// src/engine/world_chunk.h:518:0 struct standing_spot_stream_chunk { diff --git a/generated/generate_string_table_world_chunk_mesh_bitfield.h b/generated/generate_string_table_world_chunk_mesh_bitfield.h index b06913d4d..63946e99e 100644 --- a/generated/generate_string_table_world_chunk_mesh_bitfield.h +++ b/generated/generate_string_table_world_chunk_mesh_bitfield.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:219:0 +// src/engine/world_chunk.h:217:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_bitfield Type) diff --git a/generated/generate_string_table_world_chunk_mesh_index.h b/generated/generate_string_table_world_chunk_mesh_index.h index b2be1b712..25c8d6260 100644 --- a/generated/generate_string_table_world_chunk_mesh_index.h +++ b/generated/generate_string_table_world_chunk_mesh_index.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:222:0 +// src/engine/world_chunk.h:220:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_index Type) diff --git a/generated/maybe_chunk_data.h b/generated/maybe_chunk_data.h index 11ae27c43..61fe27efe 100644 --- a/generated/maybe_chunk_data.h +++ b/generated/maybe_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:183:0 +// src/engine/world_chunk.h:181:0 struct maybe_chunk_data { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 37662c7a8..0b1dcc6f8 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:499:0 +// src/engine/world_chunk.h:485:0 struct maybe_standing_spot { diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index e44bdbe21..4ec45f4aa 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2018:0 +// src/engine/world_chunk.cpp:2014:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, @@ -553,11 +553,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, /* // TODO(Jesse): This copy could be avoided in multiple ways, and should be. */ /* /1* FillColorArray(Voxel->Color, FaceColors, ColorPallette, VERTS_PER_FACE); *1/ */ -/* /1* #if VOXEL_DEBUG_COLOR *1/ */ - /* /1* v3 Color = Abs(Voxel->DebugColor); *1/ */ -/* /1* #else *1/ */ /* /1* v3 Color = GetColorData(Voxel->Color); *1/ */ -/* /1* #endif *1/ */ /* f32 Trans = (f32)Voxel->Transparency / 255.f; */ /* FillArray(VertexMaterial(Voxel->Color, Trans, 0.f), Materials, VERTS_PER_FACE); */ diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index e56f77fff..aaefa09a4 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2021:0 +// src/engine/world_chunk.cpp:2017:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, @@ -553,11 +553,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, /* // TODO(Jesse): This copy could be avoided in multiple ways, and should be. */ /* /1* FillColorArray(Voxel->Color, FaceColors, ColorPallette, VERTS_PER_FACE); *1/ */ -/* /1* #if VOXEL_DEBUG_COLOR *1/ */ - /* /1* v3 Color = Abs(Voxel->DebugColor); *1/ */ -/* /1* #else *1/ */ /* /1* v3 Color = GetColorData(Voxel->Color); *1/ */ -/* /1* #endif *1/ */ /* f32 Trans = (f32)Voxel->Transparency / 255.f; */ /* FillArray(VertexMaterial(Voxel->Color, Trans, 0.f), Materials, VERTS_PER_FACE); */ diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 8f8c5b6bf..cb5d147c8 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -89,9 +89,9 @@ Terrain_FBM2D( world_chunk *Chunk, /* v3i NoiseDim = RoundUp(Chunk->Dim/2, V3i(8)); */ /* v3i NoiseDim = RoundUp((Chunk->Dim+2)/NoiseUpsampleFactor, V3i(8, 1, 1)); */ v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0))/NoiseUpsampleFactor, V3i(8, 1, 1)); - v3i NormalsDim = RoundUp((Chunk->Dim-V3i(2,2,2))/NoiseUpsampleFactor, V3i(8, 1, 1)); + v3i NormalsDim = RoundUp((Chunk->Dim-V3i(0,2,2))/NoiseUpsampleFactor, V3i(8, 1, 1)); - Assert(Chunk->Dim == V3i(64)); + Assert(Chunk->Dim == V3i(64, 66, 66)); Assert(NormalsDim == V3i(64)); /* v3i NoiseDim = Chunk->Dim; */ @@ -253,7 +253,7 @@ Terrain_FBM2D( world_chunk *Chunk, ChunkSum += u32(NoiseChoice); SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); - s32 NormalIndex = TryGetIndex(ChunkP, NormalsDim); + s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); if (NormalIndex > -1) { Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); @@ -1008,7 +1008,9 @@ ComputeNormalsForChunkFromNoiseValues( r32 *NoiseValues, v3i NoiseDim, v3 *Norma } s32 NormalIndex = GetIndex(V3i(x,y,z), NormalsDim); - Normals[NormalIndex] = Normalize(Normal) * -1.f; + v3 Result = V3(x/64.f, y/64.f, z/64.f); + /* v3 Result = Normalize(Normal) * -1.f; */ + Normals[NormalIndex] = Result; } } } @@ -1064,6 +1066,7 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N Assert(NormalsDim.x % 8 == 0); /* Assert(NoiseDim.x % 8 == 0); */ + Assert(NormalsDim == V3i(64)); Assert(NormalsDim <= NoiseDim-V3i(2,2,2)); @@ -1074,8 +1077,8 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N { for ( s32 x = 0; x < NormalsDim.x; x += 8) { - s32 BaseIndex = GetIndex(V3i(x,y,z), NoiseDim); - f32_8x CurrentNoiseValue = F32_8X(NoiseValues+BaseIndex); + s32 NoiseBaseIndex = GetIndex(V3i(x,y,z), NoiseDim); + f32_8x CurrentNoiseValue = F32_8X(NoiseValues+NoiseBaseIndex); v3_8x Normal = {}; for ( s32 dz = -1; dz < 2; ++ dz) @@ -1086,9 +1089,9 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N { if (dz == 0 && dy == 0 && dx == 0) continue; // Skip the middle-most voxel - s32 dIndex = GetIndex(V3i(x+dx,y+dy,z+dz)+1, NoiseDim); + s32 dNoiseIndex = GetIndex(V3i(x+dx,y+dy,z+dz)+1, NoiseDim); { - f32_8x OffsetNoiseValue = F32_8X_unaligned(NoiseValues + dIndex); + f32_8x OffsetNoiseValue = F32_8X_unaligned(NoiseValues + dNoiseIndex); f32_8x Diff = OffsetNoiseValue - F32_8X(dz) - Truncate(CurrentNoiseValue); u32_8x AddMask = Diff > 0.f; @@ -1111,7 +1114,7 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N s32 NormalIndex = GetIndex(V3i(x,y,z), NormalsDim); /* v3_8x Result = Normalize(Normal) * F32_8X(-1.f).Sse; */ - v3_8x Result = V3_8X(x, y, z); + v3_8x Result = V3_8X(x/64.f, y/64.f, z/64.f); f32 *Basis = Cast(f32*, Normals+NormalIndex); From c957e74b50a9b1ab393e5fa9c456a54308b63ce5 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 12 Oct 2024 11:00:58 -0700 Subject: [PATCH 079/421] Add new generated wide vector operations --- generated/gen_vector_operators_v3_8x.h | 289 ++++++++++++++++++ ..._wide_vector_operator_688856397_31875099.h | 38 +++ ...wide_vector_operator_688856398_962878887.h | 38 +++ ...wide_vector_operator_688856400_677608083.h | 38 +++ ...wide_vector_operator_688856402_974542050.h | 38 +++ 5 files changed, 441 insertions(+) create mode 100644 generated/gen_vector_operators_v3_8x.h create mode 100644 generated/gen_wide_vector_operator_688856397_31875099.h create mode 100644 generated/gen_wide_vector_operator_688856398_962878887.h create mode 100644 generated/gen_wide_vector_operator_688856400_677608083.h create mode 100644 generated/gen_wide_vector_operator_688856402_974542050.h diff --git a/generated/gen_vector_operators_v3_8x.h b/generated/gen_vector_operators_v3_8x.h new file mode 100644 index 000000000..9ceea97f1 --- /dev/null +++ b/generated/gen_vector_operators_v3_8x.h @@ -0,0 +1,289 @@ +// external/bonsai_stdlib/src/avx2_v3.h:30:0 + +link_internal void +DeepCopy(v3_8x *Src, v3_8x *Dest) +{ + *Dest = *Src; +} + +#if 0 +inline b32 +operator==( v3_8x P1, v3_8x P2 ) +{ + b32 Result = ( P1.Raw[0] == P2.Raw[0] && P1.Raw[1] == P2.Raw[1] && P1.Raw[2] == P2.Raw[2] ); + return Result; +} + + +// NOTE(Jesse): This is for contaiers that call AreEqual() +link_internal b32 +AreEqual(v3_8x V1, v3_8x V2) +{ + b32 Result = V1 == V2; + return Result; +} + +// NOTE(Jesse): Can't gen != because the condition welding it together +// is not &&, it's || +// +/* gen_vector_comparator(Type, {!=}) */ +inline b32 +operator!=( v3_8x P1, v3_8x P2 ) +{ + b32 Result = !(P1 == P2); + return Result; +} + +inline b32 +operator<( v3_8x P1, v3_8x P2 ) +{ + b32 Result = ( P1.Raw[0] < P2.Raw[0] && P1.Raw[1] < P2.Raw[1] && P1.Raw[2] < P2.Raw[2] ); + return Result; +} + + +inline b32 +operator<=( v3_8x P1, v3_8x P2 ) +{ + b32 Result = ( P1.Raw[0] <= P2.Raw[0] && P1.Raw[1] <= P2.Raw[1] && P1.Raw[2] <= P2.Raw[2] ); + return Result; +} + + +inline b32 +operator>( v3_8x P1, v3_8x P2 ) +{ + b32 Result = ( P1.Raw[0] > P2.Raw[0] && P1.Raw[1] > P2.Raw[1] && P1.Raw[2] > P2.Raw[2] ); + return Result; +} + + +inline b32 +operator>=( v3_8x P1, v3_8x P2 ) +{ + b32 Result = ( P1.Raw[0] >= P2.Raw[0] && P1.Raw[1] >= P2.Raw[1] && P1.Raw[2] >= P2.Raw[2] ); + return Result; +} + +#endif + +inline v3_8x +operator+( v3_8x P1, v3_8x P2 ) +{ + v3_8x Result = {{ + { P1.Raw[0] + P2.Raw[0]}, + { P1.Raw[1] + P2.Raw[1]}, + { P1.Raw[2] + P2.Raw[2]}, + }}; + return Result; +} + +inline v3_8x +operator+( v3_8x P1, __m256 Scalar ) +{ + v3_8x Result = {{ + { P1.Raw[0] + Scalar}, + { P1.Raw[1] + Scalar}, + { P1.Raw[2] + Scalar}, + }}; + return Result; +} + +inline v3_8x +operator+( __m256 Scalar, v3_8x P1 ) +{ + v3_8x Result = {{ + { Scalar + P1.Raw[0]}, + { Scalar + P1.Raw[1]}, + { Scalar + P1.Raw[2]}, + }}; + return Result; +} + + + +inline v3_8x +operator-( v3_8x P1, v3_8x P2 ) +{ + v3_8x Result = {{ + { P1.Raw[0] - P2.Raw[0]}, + { P1.Raw[1] - P2.Raw[1]}, + { P1.Raw[2] - P2.Raw[2]}, + }}; + return Result; +} + +inline v3_8x +operator-( v3_8x P1, __m256 Scalar ) +{ + v3_8x Result = {{ + { P1.Raw[0] - Scalar}, + { P1.Raw[1] - Scalar}, + { P1.Raw[2] - Scalar}, + }}; + return Result; +} + +inline v3_8x +operator-( __m256 Scalar, v3_8x P1 ) +{ + v3_8x Result = {{ + { Scalar - P1.Raw[0]}, + { Scalar - P1.Raw[1]}, + { Scalar - P1.Raw[2]}, + }}; + return Result; +} + + + +inline v3_8x +operator*( v3_8x P1, v3_8x P2 ) +{ + v3_8x Result = {{ + { P1.Raw[0] * P2.Raw[0]}, + { P1.Raw[1] * P2.Raw[1]}, + { P1.Raw[2] * P2.Raw[2]}, + }}; + return Result; +} + +inline v3_8x +operator*( v3_8x P1, __m256 Scalar ) +{ + v3_8x Result = {{ + { P1.Raw[0] * Scalar}, + { P1.Raw[1] * Scalar}, + { P1.Raw[2] * Scalar}, + }}; + return Result; +} + +inline v3_8x +operator*( __m256 Scalar, v3_8x P1 ) +{ + v3_8x Result = {{ + { Scalar * P1.Raw[0]}, + { Scalar * P1.Raw[1]}, + { Scalar * P1.Raw[2]}, + }}; + return Result; +} + + + +inline v3_8x +operator/( v3_8x P1, v3_8x P2 ) +{ + v3_8x Result = {{ + { P1.Raw[0] / P2.Raw[0]}, + { P1.Raw[1] / P2.Raw[1]}, + { P1.Raw[2] / P2.Raw[2]}, + }}; + return Result; +} + +inline v3_8x +operator/( v3_8x P1, __m256 Scalar ) +{ + v3_8x Result = {{ + { P1.Raw[0] / Scalar}, + { P1.Raw[1] / Scalar}, + { P1.Raw[2] / Scalar}, + }}; + return Result; +} + +inline v3_8x +operator/( __m256 Scalar, v3_8x P1 ) +{ + v3_8x Result = {{ + { Scalar / P1.Raw[0]}, + { Scalar / P1.Raw[1]}, + { Scalar / P1.Raw[2]}, + }}; + return Result; +} + + + +#if 0 +inline v3_8x & +operator+=( v3_8x &P1, v3_8x P2 ) +{ + P1.Raw[0] += P2.Raw[0]; + P1.Raw[1] += P2.Raw[1]; + P1.Raw[2] += P2.Raw[2]; + return P1; +} + +inline v3_8x & +operator+=( v3_8x &P1, __m256 Scalar ) +{ + P1.Raw[0] += Scalar; + P1.Raw[1] += Scalar; + P1.Raw[2] += Scalar; + return P1; +} + + +inline v3_8x & +operator-=( v3_8x &P1, v3_8x P2 ) +{ + P1.Raw[0] -= P2.Raw[0]; + P1.Raw[1] -= P2.Raw[1]; + P1.Raw[2] -= P2.Raw[2]; + return P1; +} + +inline v3_8x & +operator-=( v3_8x &P1, __m256 Scalar ) +{ + P1.Raw[0] -= Scalar; + P1.Raw[1] -= Scalar; + P1.Raw[2] -= Scalar; + return P1; +} + + +inline v3_8x & +operator*=( v3_8x &P1, v3_8x P2 ) +{ + P1.Raw[0] *= P2.Raw[0]; + P1.Raw[1] *= P2.Raw[1]; + P1.Raw[2] *= P2.Raw[2]; + return P1; +} + +inline v3_8x & +operator*=( v3_8x &P1, __m256 Scalar ) +{ + P1.Raw[0] *= Scalar; + P1.Raw[1] *= Scalar; + P1.Raw[2] *= Scalar; + return P1; +} + + +inline v3_8x & +operator/=( v3_8x &P1, v3_8x P2 ) +{ + P1.Raw[0] /= P2.Raw[0]; + P1.Raw[1] /= P2.Raw[1]; + P1.Raw[2] /= P2.Raw[2]; + return P1; +} + +inline v3_8x & +operator/=( v3_8x &P1, __m256 Scalar ) +{ + P1.Raw[0] /= Scalar; + P1.Raw[1] /= Scalar; + P1.Raw[2] /= Scalar; + return P1; +} + + +#endif + + diff --git a/generated/gen_wide_vector_operator_688856397_31875099.h b/generated/gen_wide_vector_operator_688856397_31875099.h new file mode 100644 index 000000000..93ad4bea7 --- /dev/null +++ b/generated/gen_wide_vector_operator_688856397_31875099.h @@ -0,0 +1,38 @@ +// external/bonsai_stdlib/src/simd_avx2.h:194:0 + +link_inline f32_8x +operator*(f32_8x A, f32_8x B) +{ + f32_8x Result = {{ _mm256_mul_ps(A.Sse, B.Sse) }}; + return Result; +} + +link_inline f32_8x +operator*(f32_8x A, f32 B) +{ + f32_8x Result = {{ _mm256_mul_ps(A.Sse, F32_8X(B).Sse) }}; + return Result; +} + +link_inline f32_8x +operator*(f32 A, f32_8x B) +{ + f32_8x Result = {{ _mm256_mul_ps(F32_8X(A).Sse, B.Sse) }}; + return Result; +} + +link_inline f32_8x +operator*(f32_8x A, __m256 B) +{ + f32_8x Result = {{ _mm256_mul_ps(A.Sse, B) }}; + return Result; +} + +link_inline f32_8x +operator*(__m256 A, f32_8x B) +{ + f32_8x Result = {{ _mm256_mul_ps(A, B.Sse) }}; + return Result; +} + + diff --git a/generated/gen_wide_vector_operator_688856398_962878887.h b/generated/gen_wide_vector_operator_688856398_962878887.h new file mode 100644 index 000000000..b6e318331 --- /dev/null +++ b/generated/gen_wide_vector_operator_688856398_962878887.h @@ -0,0 +1,38 @@ +// external/bonsai_stdlib/src/simd_avx2.h:188:0 + +link_inline f32_8x +operator+(f32_8x A, f32_8x B) +{ + f32_8x Result = {{ _mm256_add_ps(A.Sse, B.Sse) }}; + return Result; +} + +link_inline f32_8x +operator+(f32_8x A, f32 B) +{ + f32_8x Result = {{ _mm256_add_ps(A.Sse, F32_8X(B).Sse) }}; + return Result; +} + +link_inline f32_8x +operator+(f32 A, f32_8x B) +{ + f32_8x Result = {{ _mm256_add_ps(F32_8X(A).Sse, B.Sse) }}; + return Result; +} + +link_inline f32_8x +operator+(f32_8x A, __m256 B) +{ + f32_8x Result = {{ _mm256_add_ps(A.Sse, B) }}; + return Result; +} + +link_inline f32_8x +operator+(__m256 A, f32_8x B) +{ + f32_8x Result = {{ _mm256_add_ps(A, B.Sse) }}; + return Result; +} + + diff --git a/generated/gen_wide_vector_operator_688856400_677608083.h b/generated/gen_wide_vector_operator_688856400_677608083.h new file mode 100644 index 000000000..e75e7d50e --- /dev/null +++ b/generated/gen_wide_vector_operator_688856400_677608083.h @@ -0,0 +1,38 @@ +// external/bonsai_stdlib/src/simd_avx2.h:191:0 + +link_inline f32_8x +operator-(f32_8x A, f32_8x B) +{ + f32_8x Result = {{ _mm256_sub_ps(A.Sse, B.Sse) }}; + return Result; +} + +link_inline f32_8x +operator-(f32_8x A, f32 B) +{ + f32_8x Result = {{ _mm256_sub_ps(A.Sse, F32_8X(B).Sse) }}; + return Result; +} + +link_inline f32_8x +operator-(f32 A, f32_8x B) +{ + f32_8x Result = {{ _mm256_sub_ps(F32_8X(A).Sse, B.Sse) }}; + return Result; +} + +link_inline f32_8x +operator-(f32_8x A, __m256 B) +{ + f32_8x Result = {{ _mm256_sub_ps(A.Sse, B) }}; + return Result; +} + +link_inline f32_8x +operator-(__m256 A, f32_8x B) +{ + f32_8x Result = {{ _mm256_sub_ps(A, B.Sse) }}; + return Result; +} + + diff --git a/generated/gen_wide_vector_operator_688856402_974542050.h b/generated/gen_wide_vector_operator_688856402_974542050.h new file mode 100644 index 000000000..ff1ad0ff9 --- /dev/null +++ b/generated/gen_wide_vector_operator_688856402_974542050.h @@ -0,0 +1,38 @@ +// external/bonsai_stdlib/src/simd_avx2.h:197:0 + +link_inline f32_8x +operator/(f32_8x A, f32_8x B) +{ + f32_8x Result = {{ _mm256_div_ps(A.Sse, B.Sse) }}; + return Result; +} + +link_inline f32_8x +operator/(f32_8x A, f32 B) +{ + f32_8x Result = {{ _mm256_div_ps(A.Sse, F32_8X(B).Sse) }}; + return Result; +} + +link_inline f32_8x +operator/(f32 A, f32_8x B) +{ + f32_8x Result = {{ _mm256_div_ps(F32_8X(A).Sse, B.Sse) }}; + return Result; +} + +link_inline f32_8x +operator/(f32_8x A, __m256 B) +{ + f32_8x Result = {{ _mm256_div_ps(A.Sse, B) }}; + return Result; +} + +link_inline f32_8x +operator/(__m256 A, f32_8x B) +{ + f32_8x Result = {{ _mm256_div_ps(A, B.Sse) }}; + return Result; +} + + From 3f53afc66f7e0ef3e4c26857b808fb706090db9f Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 12 Oct 2024 11:02:08 -0700 Subject: [PATCH 080/421] Update stdlib --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 08fac591b..c7756cbe9 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 08fac591b8a0ea39238e70ac37efffcc8215fa57 +Subproject commit c7756cbe9779649c1e14ceee376d344313485551 From fe42b0b648ac421d3c656439ec445579607d627d Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 12 Oct 2024 11:03:19 -0700 Subject: [PATCH 081/421] Add some new .vox assets --- models/boxes/treasure_0.vox | Bin 0 -> 26339 bytes models/boxes/treasure_1.vox | Bin 0 -> 25411 bytes models/grass_block.vox | Bin 0 -> 23814 bytes models/grass_block_16.vox | Bin 0 -> 33162 bytes models/red_power_barrell.vox | Bin 0 -> 48587 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 models/boxes/treasure_0.vox create mode 100644 models/boxes/treasure_1.vox create mode 100644 models/grass_block.vox create mode 100644 models/grass_block_16.vox create mode 100644 models/red_power_barrell.vox diff --git a/models/boxes/treasure_0.vox b/models/boxes/treasure_0.vox new file mode 100644 index 0000000000000000000000000000000000000000..ee4748ac19ecb97cb17e4b3bceeeb8a13e30f429 GIT binary patch literal 26339 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 literal 0 HcmV?d00001 diff --git a/models/grass_block.vox b/models/grass_block.vox new file mode 100644 index 0000000000000000000000000000000000000000..56af7deda791c9a5f1581af2aa2017c1b5526a4b GIT binary patch literal 23814 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 literal 0 HcmV?d00001 diff --git a/models/grass_block_16.vox b/models/grass_block_16.vox new file mode 100644 index 0000000000000000000000000000000000000000..517fe2b41d2afe8a9bc4b0dff83700eb93433c76 GIT binary patch literal 33162 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 KHg~Vv?f(M#i|1+p literal 0 HcmV?d00001 diff --git a/models/red_power_barrell.vox b/models/red_power_barrell.vox new file mode 100644 index 0000000000000000000000000000000000000000..5908ecb9ff42ab8bde736483873574c4b4c2ecf4 GIT binary patch literal 48587 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 MIIi=LZ`;@Z2b_M Date: Sat, 12 Oct 2024 11:31:29 -0700 Subject: [PATCH 082/421] SIMD normal computation working --- examples/terrain_gen/game.cpp | 15 ++++----- src/engine/terrain.cpp | 59 +++++++++++++++++++++++++++++------ 2 files changed, 57 insertions(+), 17 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 7f05fcd9e..db401f7a5 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -494,16 +494,17 @@ BONSAI_API_WORKER_THREAD_CALLBACK() /* s32 StartingZDepth = 60000; */ /* u32 Octaves = 7; */ - v3 Period = V3(5000); + /* v3 Period = V3(5000); */ + /* s32 Amplititude = 1500; */ + /* s32 StartingZDepth = 1600; */ + /* u32 Octaves = 9; */ + + v3 Period = V3(2500); s32 Amplititude = 1500; s32 StartingZDepth = 1600; u32 Octaves = 9; - -/* v3 Period = V3(2500); */ -/* s32 Amplititude = 1500; */ -/* s32 StartingZDepth = 1600; */ -/* /1* u32 Octaves = 1; *1/ */ -/* u32 Octaves = 4; */ + /* u32 Octaves = 4; */ + /* u32 Octaves = 1; */ /* v3 Period = V3(50); */ /* s32 Amplititude = 60; */ diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index cb5d147c8..a92b59be8 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -229,7 +229,7 @@ Terrain_FBM2D( world_chunk *Chunk, { #if 1 - TIMED_NAMED_BLOCK(finalize); + TIMED_NAMED_BLOCK(Finalize); for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zChunk)*NoiseUpsampleFactor, Chunk->DimInChunks); @@ -1053,6 +1053,21 @@ ComputeNormalsForChunkFromNoiseValues( r32 *NoiseValues, v3i NoiseDim, v3 *Norma #endif } +link_internal void +Swizzle_V38X_ForStorage(v3_8x In, v3 *Result) +{ + /* v3_8x Result = {}; */ + + Result[0] = V3(In.E.x[0], In.E.y[0], In.E.z[0]); + Result[1] = V3(In.E.x[1], In.E.y[1], In.E.z[1]); + Result[2] = V3(In.E.x[2], In.E.y[2], In.E.z[2]); + Result[3] = V3(In.E.x[3], In.E.y[3], In.E.z[3]); + Result[4] = V3(In.E.x[4], In.E.y[4], In.E.z[4]); + Result[5] = V3(In.E.x[5], In.E.y[5], In.E.z[5]); + Result[6] = V3(In.E.x[6], In.E.y[6], In.E.z[6]); + Result[7] = V3(In.E.x[7], In.E.y[7], In.E.z[7]); +} + link_internal void ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim) { @@ -1067,7 +1082,19 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N /* Assert(NoiseDim.x % 8 == 0); */ Assert(NormalsDim == V3i(64)); - Assert(NormalsDim <= NoiseDim-V3i(2,2,2)); + + Assert(NoiseDim >= NormalsDim+V3i(2,2,2)); + for ( s32 z = 0; z < NormalsDim.z; ++ z) + { + for ( s32 y = 0; y < NormalsDim.y; ++ y) + { + for ( s32 x = 0; x < NormalsDim.x; x += 1) + { + s32 NormalIndex = GetIndex(V3i(x,y,z), NormalsDim); + Normals[NormalIndex] = V3(1,0,1); + } + } + } #if 1 @@ -1113,14 +1140,26 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N } s32 NormalIndex = GetIndex(V3i(x,y,z), NormalsDim); - /* v3_8x Result = Normalize(Normal) * F32_8X(-1.f).Sse; */ - v3_8x Result = V3_8X(x/64.f, y/64.f, z/64.f); - - f32 *Basis = Cast(f32*, Normals+NormalIndex); - - _mm256_storeu_ps( Basis+ 0, Result.avx.x.Sse); - _mm256_storeu_ps( Basis+ 8, Result.avx.y.Sse); - _mm256_storeu_ps( Basis+16, Result.avx.z.Sse); + v3_8x Result = Normalize(Normal) * F32_8X(-1.f).Sse; + /* v3_8x Result = V3_8X(x/64.f, y/64.f, z/64.f); */ + + v3 Swizzled[8]; + Swizzle_V38X_ForStorage(Result, Swizzled); + + Normals[NormalIndex+0] = Swizzled[0]; + Normals[NormalIndex+1] = Swizzled[1]; + Normals[NormalIndex+2] = Swizzled[2]; + Normals[NormalIndex+3] = Swizzled[3]; + Normals[NormalIndex+4] = Swizzled[4]; + Normals[NormalIndex+5] = Swizzled[5]; + Normals[NormalIndex+6] = Swizzled[6]; + Normals[NormalIndex+7] = Swizzled[7]; + + + /* f32 *Basis = Cast(f32*, Normals+NormalIndex); */ + /* _mm256_storeu_ps( Basis+ 0, Result.avx.x.Sse); */ + /* _mm256_storeu_ps( Basis+ 8, Result.avx.y.Sse); */ + /* _mm256_storeu_ps( Basis+16, Result.avx.z.Sse); */ /* f32_8x A, B, C; */ /* A = {{ }}; */ From a18f3a0cee7a9ee70e1fe7684b7890890a336a9d Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 12 Oct 2024 11:52:41 -0700 Subject: [PATCH 083/421] Twiddle storage instructions --- src/engine/terrain.cpp | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index a92b59be8..8dcb2aac5 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -37,6 +37,7 @@ global_variable random_series DEBUG_ENTROPY = {653765435432}; // 30.0m cycles | u32 ComputePerlinParameters // 28.7m cycles | u32 ComputePerlinParameters // 27.8m cycles | u32 ComputePerlinParameters +// link_internal u32 Terrain_FBM2D( world_chunk *Chunk, v3i NoiseBasis, @@ -1084,6 +1085,8 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N Assert(NormalsDim == V3i(64)); Assert(NoiseDim >= NormalsDim+V3i(2,2,2)); + +#if 0 for ( s32 z = 0; z < NormalsDim.z; ++ z) { for ( s32 y = 0; y < NormalsDim.y; ++ y) @@ -1095,6 +1098,7 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N } } } +#endif #if 1 @@ -1143,23 +1147,27 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N v3_8x Result = Normalize(Normal) * F32_8X(-1.f).Sse; /* v3_8x Result = V3_8X(x/64.f, y/64.f, z/64.f); */ - v3 Swizzled[8]; - Swizzle_V38X_ForStorage(Result, Swizzled); - - Normals[NormalIndex+0] = Swizzled[0]; - Normals[NormalIndex+1] = Swizzled[1]; - Normals[NormalIndex+2] = Swizzled[2]; - Normals[NormalIndex+3] = Swizzled[3]; - Normals[NormalIndex+4] = Swizzled[4]; - Normals[NormalIndex+5] = Swizzled[5]; - Normals[NormalIndex+6] = Swizzled[6]; - Normals[NormalIndex+7] = Swizzled[7]; - - - /* f32 *Basis = Cast(f32*, Normals+NormalIndex); */ - /* _mm256_storeu_ps( Basis+ 0, Result.avx.x.Sse); */ - /* _mm256_storeu_ps( Basis+ 8, Result.avx.y.Sse); */ - /* _mm256_storeu_ps( Basis+16, Result.avx.z.Sse); */ + f32 Swizzled[8*3]; + Swizzle_V38X_ForStorage(Result, (v3*)Swizzled); + CAssert(sizeof(v3)*8 == 8*3*4); + + /* Normals[NormalIndex+0] = Swizzled[0]; */ + /* Normals[NormalIndex+1] = Swizzled[1]; */ + /* Normals[NormalIndex+2] = Swizzled[2]; */ + /* Normals[NormalIndex+3] = Swizzled[3]; */ + /* Normals[NormalIndex+4] = Swizzled[4]; */ + /* Normals[NormalIndex+5] = Swizzled[5]; */ + /* Normals[NormalIndex+6] = Swizzled[6]; */ + /* Normals[NormalIndex+7] = Swizzled[7]; */ + + + f32 *Basis = Cast(f32*, Normals+NormalIndex); + __m256 A = _mm256_load_ps(Swizzled); + __m256 B = _mm256_load_ps(Swizzled+8); + __m256 C = _mm256_load_ps(Swizzled+16); + _mm256_storeu_ps( Basis+ 0, A); + _mm256_storeu_ps( Basis+ 8, B); + _mm256_storeu_ps( Basis+16, C); /* f32_8x A, B, C; */ /* A = {{ }}; */ From 8cc686682ff0c558ade7a28adfdd1a7242faa107 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 12 Oct 2024 16:53:57 -0700 Subject: [PATCH 084/421] Finish optimizing the normal calculations.. for now .. --- make.sh | 1 + src/engine/terrain.cpp | 134 +++++++++++++++++++++++++++++-------- src/engine/world_chunk.cpp | 26 ++++--- 3 files changed, 123 insertions(+), 38 deletions(-) diff --git a/make.sh b/make.sh index c92b0de9d..1ccf7632d 100755 --- a/make.sh +++ b/make.sh @@ -40,6 +40,7 @@ BIN_TEST="$BIN/tests" BIN_GAME_LIBS="$BIN/game_libs" BONSAI_INTERNAL='-D BONSAI_INTERNAL=1' +# BONSAI_INTERNAL='' # $EXAMPLES/tile_gen diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 8dcb2aac5..2137e66c9 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -36,7 +36,7 @@ global_variable random_series DEBUG_ENTROPY = {653765435432}; // // 30.0m cycles | u32 ComputePerlinParameters // 28.7m cycles | u32 ComputePerlinParameters -// 27.8m cycles | u32 ComputePerlinParameters +// 27.6m cycles | u32 ComputePerlinParameters // link_internal u32 Terrain_FBM2D( world_chunk *Chunk, @@ -44,7 +44,7 @@ Terrain_FBM2D( world_chunk *Chunk, void *NoiseParams, void *OctaveCount ) { - TIMED_FUNCTION(); + /* TIMED_FUNCTION(); */ /* HISTOGRAM_FUNCTION(); */ UNPACK_NOISE_PARAMS(NoiseParams); @@ -230,7 +230,7 @@ Terrain_FBM2D( world_chunk *Chunk, { #if 1 - TIMED_NAMED_BLOCK(Finalize); + TIMED_NAMED_BLOCK(NoiseFinalize); for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zChunk)*NoiseUpsampleFactor, Chunk->DimInChunks); @@ -278,6 +278,7 @@ Terrain_FBM2D( world_chunk *Chunk, Assert(Chunk->Dim.x == 64); Assert(Chunk->Dim.y == 66); Assert(Chunk->Dim.z == 66); + for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) { /* f32 zCoord = 75.f; */ @@ -1054,11 +1055,86 @@ ComputeNormalsForChunkFromNoiseValues( r32 *NoiseValues, v3i NoiseDim, v3 *Norma #endif } +typedef __m256 f256; +typedef __m256i i256; + +#define set8i _mm256_setr_epi32 + +inline f256 permute8f(const f256 a, const i256 choice) { + return _mm256_permutevar8x32_ps(a, choice); +} + +template +inline f256 select8f(const f256 tr, const f256 fr) + { return _mm256_blend_ps(fr, tr, (c7 << 7) | (c6 << 6) | (c5 << 5) | (c4 << 4) | (c3 << 3) | (c2 << 2) | (c1 << 1) | c0); } + +void vec3_soa_to_aos(f256& A, f256& B, f256& C, + const f256 x, const f256 y, const f256 z) +{ + // indices so we can permute into something sane. + const i256 PX = set8i(0, 3, 6, 1, 4, 7, 2, 5); + const i256 PY = set8i(5, 0, 3, 6, 1, 4, 7, 2); + const i256 PZ = set8i(2, 5, 0, 3, 6, 1, 4, 7); + + // re-arrange so we can select correct elements. + const f256 X = permute8f(x, PX); // 0.0f 3.0f 6.0f 1.0f 4.0f 7.0f 2.0f 5.0f + const f256 Y = permute8f(y, PY); // 5.1f 0.1f 3.1f 6.1f 1.1f 4.1f 7.1f 2.1f + const f256 Z = permute8f(z, PZ); // 2.2f 5.2f 0.2f 3.2f 6.2f 1.2f 4.2f 7.2f + + // perform our two stage selection + const f256 A0 = select8f<1, 0, 0, 1, 0, 0, 1, 0>(X, Y); // 0.0f 0.1f whatever 1.0f 1.1f whatever 2.0f 2.1f + const f256 B0 = select8f<1, 0, 0, 1, 0, 0, 1, 0>(Z, X); // 2.2f 3.0f whatever 3.2f 4.0f whatever 4.2f 5.0f + const f256 C0 = select8f<1, 0, 0, 1, 0, 0, 1, 0>(Y, Z); // 5.1f 5.2f whatever 6.1f 6.2f whatever 7.1f 7.2f + A = select8f<0, 0, 1, 0, 0, 1, 0, 0>(Z, A0); // 0.0f 0.1f 0.2f 1.0f 1.1f 1.2f 2.0f 2.1f + B = select8f<0, 0, 1, 0, 0, 1, 0, 0>(Y, B0); // 2.2f 3.0f 3.1f 3.2f 4.0f 4.1f 4.2f 5.0f + C = select8f<0, 0, 1, 0, 0, 1, 0, 0>(X, C0); // 5.1f 5.2f 6.0f 6.1f 6.2f 7.0f 7.1f 7.2f +} + +// for completeness.... +inline void vec3_aos_to_soa( + const f256 A, const f256 B, const f256 C, + f256& x, f256& y, f256& z) +{ + const f256 X0 = select8f<1, 0, 0, 1, 0, 0, 1, 0>(A, B); + const f256 Y0 = select8f<1, 0, 0, 1, 0, 0, 1, 0>(C, A); + const f256 Z0 = select8f<1, 0, 0, 1, 0, 0, 1, 0>(B, C); + + const f256 X = select8f<0, 0, 1, 0, 0, 1, 0, 0>(C, X0); + const f256 Y = select8f<0, 0, 1, 0, 0, 1, 0, 0>(B, Y0); + const f256 Z = select8f<0, 0, 1, 0, 0, 1, 0, 0>(A, Z0); + + const i256 PX = set8i(0, 3, 6, 1, 4, 7, 2, 5); + const i256 PY = set8i(1, 4, 7, 2, 5, 0, 3, 6); + const i256 PZ = set8i(2, 5, 0, 3, 6, 1, 4, 7); + + // rearrange and output + x = permute8f(X, PX); + y = permute8f(Y, PY); + z = permute8f(Z, PZ); +} + +/* __m256 x = _mm256_set_ps(7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 0.0f); */ +/* __m256 y = _mm256_set_ps(7.1f, 6.1f, 5.1f, 4.1f, 3.1f, 2.1f, 1.1f, 0.1f); */ +/* __m256 z = _mm256_set_ps(7.2f, 6.2f, 5.2f, 4.2f, 3.2f, 2.2f, 1.2f, 0.2f); */ + +/* vec3_soa_to_aos(x, y, z, x, y, z); */ + + +/* std::vector result; */ +/* result.resize(24); */ +/* _mm256_storeu_ps(result.data(), x); */ +/* _mm256_storeu_ps(result.data() + 8, y); */ +/* _mm256_storeu_ps(result.data() + 16, z); */ + link_internal void -Swizzle_V38X_ForStorage(v3_8x In, v3 *Result) +Interleave( f32_8x X, f32_8x Y, f32_8x Z) { - /* v3_8x Result = {}; */ + vec3_soa_to_aos(X.Sse, Y.Sse, Z.Sse, X.Sse, Y.Sse, Z.Sse); +} +link_internal void +Interleave(v3_8x In, v3 *Result) +{ Result[0] = V3(In.E.x[0], In.E.y[0], In.E.z[0]); Result[1] = V3(In.E.x[1], In.E.y[1], In.E.z[1]); Result[2] = V3(In.E.x[2], In.E.y[2], In.E.z[2]); @@ -1069,10 +1145,15 @@ Swizzle_V38X_ForStorage(v3_8x In, v3 *Result) Result[7] = V3(In.E.x[7], In.E.y[7], In.E.z[7]); } +// 3.55M +// 2.53M +// 2.51M +// link_internal void ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim) { - TIMED_FUNCTION(); + HISTOGRAM_FUNCTION(); + /* TIMED_FUNCTION(); */ // NOTE(Jesse): The Normal values are undefined on the edges // @@ -1112,10 +1193,13 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N f32_8x CurrentNoiseValue = F32_8X(NoiseValues+NoiseBaseIndex); v3_8x Normal = {}; +#pragma unroll(3) for ( s32 dz = -1; dz < 2; ++ dz) { +#pragma unroll(3) for ( s32 dy = -1; dy < 2; ++ dy) { +#pragma unroll(3) for ( s32 dx = -1; dx < 2; ++ dx) { if (dz == 0 && dy == 0 && dx == 0) continue; // Skip the middle-most voxel @@ -1143,34 +1227,28 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N } } - s32 NormalIndex = GetIndex(V3i(x,y,z), NormalsDim); v3_8x Result = Normalize(Normal) * F32_8X(-1.f).Sse; /* v3_8x Result = V3_8X(x/64.f, y/64.f, z/64.f); */ - f32 Swizzled[8*3]; - Swizzle_V38X_ForStorage(Result, (v3*)Swizzled); - CAssert(sizeof(v3)*8 == 8*3*4); - /* Normals[NormalIndex+0] = Swizzled[0]; */ - /* Normals[NormalIndex+1] = Swizzled[1]; */ - /* Normals[NormalIndex+2] = Swizzled[2]; */ - /* Normals[NormalIndex+3] = Swizzled[3]; */ - /* Normals[NormalIndex+4] = Swizzled[4]; */ - /* Normals[NormalIndex+5] = Swizzled[5]; */ - /* Normals[NormalIndex+6] = Swizzled[6]; */ - /* Normals[NormalIndex+7] = Swizzled[7]; */ + s32 NormalIndex = GetIndex(V3i(x,y,z), NormalsDim); + f32 *Basis = Cast(f32*, Normals+NormalIndex); + // TODO(Jesse): The second interleave (from SO) is wrong, but 500k cycles faster.. +#if 1 + f32 Swizzled[8*3]; + Interleave(Result, (v3*)Swizzled); - f32 *Basis = Cast(f32*, Normals+NormalIndex); - __m256 A = _mm256_load_ps(Swizzled); - __m256 B = _mm256_load_ps(Swizzled+8); - __m256 C = _mm256_load_ps(Swizzled+16); - _mm256_storeu_ps( Basis+ 0, A); - _mm256_storeu_ps( Basis+ 8, B); - _mm256_storeu_ps( Basis+16, C); - - /* f32_8x A, B, C; */ - /* A = {{ }}; */ + __m256 *A = (__m256*)Swizzled; + _mm256_storeu_ps( Basis+ 0, A[0]); + _mm256_storeu_ps( Basis+ 8, A[1]); + _mm256_storeu_ps( Basis+16, A[2]); +#else + Interleave(Result.avx.x, Result.avx.y, Result.avx.z); + _mm256_storeu_ps( Basis+ 0, Result.avx.x.Sse); + _mm256_storeu_ps( Basis+ 8, Result.avx.y.Sse); + _mm256_storeu_ps( Basis+16, Result.avx.z.Sse); +#endif } } } diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 343adc827..18474e92c 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3500,6 +3500,8 @@ BuildMipMesh( voxel *Voxels, v3i VoxDim, v3i InnerMin, v3i InnerMax, world_ch link_internal void RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOffset, v3i MaxOffset, world_chunk_mesh_bitfield MeshBit, geo_u3d *TempMesh, memory_arena *TempMem, v3 VertexOffset = {}) { + TIMED_FUNCTION(); + engine_resources *Engine = GetEngineResources(); Assert( IsSet(Chunk->Flags, Chunk_VoxelsInitialized) ); Assert( MeshBit == MeshBit_Lod0 ); @@ -3542,7 +3544,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, b32 MakeExteriorFaces = False, v3i NoiseBasisOffset = {} ) { - HISTOGRAM_FUNCTION(); + /* HISTOGRAM_FUNCTION(); */ /* TIMED_FUNCTION(); */ @@ -3633,6 +3635,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, if (Flags & ChunkInitFlag_ComputeStandingSpots) { + NotImplemented; ComputeStandingSpots( SynChunkDim, SyntheticChunk, {{1,1,0}}, {{0,0,1}}, Global_StandingSpotDim, DestChunk->Dim, 0, &DestChunk->StandingSpots, Thread->TempMemory); @@ -3693,19 +3696,22 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, } \ } - FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod0 ); - FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod1 ); - FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod2 ); - FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod3 ); - FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod4 ); + { + TIMED_NAMED_BLOCK(Chunk_Finalize); + FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod0 ); + FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod1 ); + FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod2 ); + FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod3 ); + FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod4 ); #undef FINALIZE_MESH_FOR_CHUNK - Assert( (DestChunk->Flags & Chunk_VoxelsInitialized) == 0); - Assert( DestChunk->FilledCount <= s32(Volume(SyntheticChunk))); + Assert( (DestChunk->Flags & Chunk_VoxelsInitialized) == 0); + Assert( DestChunk->FilledCount <= s32(Volume(SyntheticChunk))); - /* if (DestChunk->WorldP == V3i(0)) { RuntimeBreak(); } */ + /* if (DestChunk->WorldP == V3i(0)) { RuntimeBreak(); } */ - FinalizeChunkInitialization(DestChunk); + FinalizeChunkInitialization(DestChunk); + } } // TODO(Jesse): Remove this thnk From 4d1b429eb17d3d6cfaa3f9aa71400c205e9995b7 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 13 Oct 2024 09:13:03 -0700 Subject: [PATCH 085/421] Compute full mask and set instead of setting each bit --- jesse.make.sh | 2 +- src/engine/terrain.cpp | 41 +++++++++++++++++++++++++---------------- src/engine/voxel.cpp | 4 ++-- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/jesse.make.sh b/jesse.make.sh index 27e9a114d..931f25e36 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#! /usr/bin/env bash OPT="-O2" diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 2137e66c9..b2d0cbba7 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -37,6 +37,8 @@ global_variable random_series DEBUG_ENTROPY = {653765435432}; // 30.0m cycles | u32 ComputePerlinParameters // 28.7m cycles | u32 ComputePerlinParameters // 27.6m cycles | u32 ComputePerlinParameters +// 24.3m cycles | u32 ComputePerlinParameters +// 19.3m cycles | u32 ComputePerlinParameters // link_internal u32 Terrain_FBM2D( world_chunk *Chunk, @@ -45,7 +47,7 @@ Terrain_FBM2D( world_chunk *Chunk, void *OctaveCount ) { /* TIMED_FUNCTION(); */ - /* HISTOGRAM_FUNCTION(); */ + HISTOGRAM_FUNCTION(); UNPACK_NOISE_PARAMS(NoiseParams); @@ -107,8 +109,8 @@ Terrain_FBM2D( world_chunk *Chunk, // NOTE(Jesse): Have to add 1 to compute the normals because on the last // iteration we go +1 in the x direction. This is super garbage/sketchy and // I hate it, but I don't have a better solution for now. - r32 *NoiseValues = Allocate(r32, TempArena, NoiseValuesCount+1); - v3 *Normals = Allocate( v3, TempArena, NormalValuesCount ); + r32 *NoiseValues = AllocateAligned(r32, TempArena, NoiseValuesCount+1, 32); + v3 *Normals = AllocateAligned( v3, TempArena, NormalValuesCount , 32); // NOTE(Jesse): Must be true to use _mm256_store_ps, which we do in the 16x version of perlin Assert(u64(NoiseValues) % 32 == 0); @@ -238,6 +240,7 @@ Terrain_FBM2D( world_chunk *Chunk, f32 WorldZBiased = zCoord - zMin; for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) { + u64 Mask = 0; for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) { v3i ChunkP = V3i(xChunk, yChunk, zChunk); @@ -250,16 +253,18 @@ Terrain_FBM2D( world_chunk *Chunk, /* r32 ThisNoiseV = MapNoiseValueToFinal(NoiseValues[NoiseIndex]/OctaveAmplitudeMax)*OctaveAmplitudeMax; */ r32 ThisNoiseV = NoiseValues[NoiseIndex]; - s32 NoiseChoice = ThisNoiseV > WorldZBiased; + u64 NoiseChoice = u64(ThisNoiseV > WorldZBiased); ChunkSum += u32(NoiseChoice); - SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); - s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); - if (NormalIndex > -1) - { - Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); - } - /* Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); */ + Mask |= (NoiseChoice << xChunk); + /* SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); */ + + /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ + /* if (NormalIndex > -1) */ + /* { */ + /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ + /* } */ + Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ /* if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } */ /* if (xChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_YELLOW)*u16(NoiseChoice); } */ @@ -267,6 +272,8 @@ Terrain_FBM2D( world_chunk *Chunk, /* if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_GREEN)*u16(NoiseChoice); } */ /* if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } */ } + + SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); } } #endif @@ -1152,8 +1159,8 @@ Interleave(v3_8x In, v3 *Result) link_internal void ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim) { - HISTOGRAM_FUNCTION(); - /* TIMED_FUNCTION(); */ + /* HISTOGRAM_FUNCTION(); */ + TIMED_FUNCTION(); // NOTE(Jesse): The Normal values are undefined on the edges // @@ -1196,6 +1203,7 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N #pragma unroll(3) for ( s32 dz = -1; dz < 2; ++ dz) { + auto _dz = F32_8X(dz); #pragma unroll(3) for ( s32 dy = -1; dy < 2; ++ dy) { @@ -1207,7 +1215,7 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N s32 dNoiseIndex = GetIndex(V3i(x+dx,y+dy,z+dz)+1, NoiseDim); { f32_8x OffsetNoiseValue = F32_8X_unaligned(NoiseValues + dNoiseIndex); - f32_8x Diff = OffsetNoiseValue - F32_8X(dz) - Truncate(CurrentNoiseValue); + f32_8x Diff = OffsetNoiseValue - _dz - Truncate(CurrentNoiseValue); u32_8x AddMask = Diff > 0.f; @@ -1234,9 +1242,10 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N s32 NormalIndex = GetIndex(V3i(x,y,z), NormalsDim); f32 *Basis = Cast(f32*, Normals+NormalIndex); - // TODO(Jesse): The second interleave (from SO) is wrong, but 500k cycles faster.. + // TODO(Jesse): The second interleave (from SO) is wrong, but it makes + // the function 25% faster ... #if 1 - f32 Swizzled[8*3]; + alignas(32) f32 Swizzled[8*3]; Interleave(Result, (v3*)Swizzled); __m256 *A = (__m256*)Swizzled; diff --git a/src/engine/voxel.cpp b/src/engine/voxel.cpp index 4278e7527..192457964 100644 --- a/src/engine/voxel.cpp +++ b/src/engine/voxel.cpp @@ -22,6 +22,6 @@ SetOccupancyBit(world_chunk *Chunk, s32 Index, s32 BitValue) link_internal void SetOccupancyMask(world_chunk *Chunk, s32 Index, u64 MaskValue) { - s32 MaskIndex = Index/64; - Chunk->Occupancy[MaskIndex] = MaskValue; + /* s32 MaskIndex = Index/64; */ + Chunk->Occupancy[Index] = MaskValue; } From 18b9a73f0425819a37babb23e90e5ba9334b0359 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 13 Oct 2024 10:16:01 -0700 Subject: [PATCH 086/421] WIP Upsampling noise values --- src/engine/terrain.cpp | 51 ++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index b2d0cbba7..95de33913 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -89,28 +89,21 @@ Terrain_FBM2D( world_chunk *Chunk, s32 NoiseUpsampleFactor = 1; - /* v3i NoiseDim = RoundUp(Chunk->Dim/2, V3i(8)); */ - /* v3i NoiseDim = RoundUp((Chunk->Dim+2)/NoiseUpsampleFactor, V3i(8, 1, 1)); */ - v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0))/NoiseUpsampleFactor, V3i(8, 1, 1)); - v3i NormalsDim = RoundUp((Chunk->Dim-V3i(0,2,2))/NoiseUpsampleFactor, V3i(8, 1, 1)); + v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0)), V3i(8, 1, 1)); + v3i NormalsDim = RoundUp((Chunk->Dim-V3i(0,2,2)), V3i(8, 1, 1)); Assert(Chunk->Dim == V3i(64, 66, 66)); Assert(NormalsDim == V3i(64)); - /* v3i NoiseDim = Chunk->Dim; */ - // NOTE(Jesse): This must hold true for using any Noise_16x func + // NOTE(Jesse): This must hold true for using any Noise_8x func Assert(NoiseDim.x % 8 == 0); - - /* v3i NoiseDim = Chunk->Dim + 2; */ s32 NoiseValuesCount = Volume(NoiseDim); s32 NormalValuesCount = Volume(NormalsDim); + // - // NOTE(Jesse): Have to add 1 to compute the normals because on the last - // iteration we go +1 in the x direction. This is super garbage/sketchy and - // I hate it, but I don't have a better solution for now. - r32 *NoiseValues = AllocateAligned(r32, TempArena, NoiseValuesCount+1, 32); - v3 *Normals = AllocateAligned( v3, TempArena, NormalValuesCount , 32); + r32 *NoiseValues = AllocateAligned(r32, TempArena, NoiseValuesCount, 32); + v3 *Normals = AllocateAligned( v3, TempArena, NormalValuesCount, 32); // NOTE(Jesse): Must be true to use _mm256_store_ps, which we do in the 16x version of perlin Assert(u64(NoiseValues) % 32 == 0); @@ -167,7 +160,8 @@ Terrain_FBM2D( world_chunk *Chunk, u32 *_xCoords = AllocateAligned(u32, TempArena, NoiseDim.x, 32); for ( s32 xNoise = 0; xNoise < NoiseDim.x; ++ xNoise ) { - _xCoords[xNoise] = u32(xNoise-1); + _xCoords[xNoise] = u32(xNoise*NoiseUpsampleFactor) - 1; + /* _xCoords[xNoise] = u32(xNoise) - 1; */ } for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) @@ -203,19 +197,32 @@ Terrain_FBM2D( world_chunk *Chunk, { for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) { - for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) + for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8*NoiseUpsampleFactor ) { s32 NoiseIndex = GetIndex(xNoise, yNoise, zNoise, NoiseDim); + const s32 SampleCount = 8; + f32 Samples[SampleCount] = {}; + r32 InteriorAmp = r32(Amplitude); RangeIterator(OctaveIndex, Octaves) { auto zParam = zParams+OctaveIndex+(zNoise*Octaves); auto yParam = yParams+OctaveIndex+(yNoise*Octaves); auto xParam = xParams+OctaveIndex+(xNoise*Octaves); - PerlinNoise_8x_avx2(xParam, yParam, zParam, NoiseValues+NoiseIndex, InteriorAmp); + + /* PerlinNoise_8x_avx2(xParam, yParam, zParam, NoiseValues+NoiseIndex, InteriorAmp); */ + PerlinNoise_8x_avx2(xParam, yParam, zParam, Samples, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); } + + RangeIterator(SampleIndex, SampleCount) + { + NoiseValues[NoiseIndex+SampleIndex] += Samples[SampleIndex]; + /* NoiseValues[NoiseIndex+(SampleIndex*NoiseUpsampleFactor)+0] += Samples[SampleIndex]; */ + /* NoiseValues[NoiseIndex+(SampleIndex*NoiseUpsampleFactor)+1] += Samples[SampleIndex]; */ + } + } } } @@ -224,7 +231,7 @@ Terrain_FBM2D( world_chunk *Chunk, u64 EndingCycles = __rdtsc(); u64 ElapsedCycles = EndingCycles - StartingCycles; GetEngineDebug()->ChunkGenCyclesElapsed += ElapsedCycles; - GetEngineDebug()->CellsGenerated += u64(Volume(NoiseDim))*u64(Octaves); + GetEngineDebug()->CellsGenerated += u64(Volume(NoiseDim))*u64(Octaves)*u64(NoiseUpsampleFactor); ComputeNormalsForChunkFromNoiseValues_avx( NoiseValues, NoiseDim, Normals, NormalsDim); @@ -235,7 +242,7 @@ Terrain_FBM2D( world_chunk *Chunk, TIMED_NAMED_BLOCK(NoiseFinalize); for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zChunk)*NoiseUpsampleFactor, Chunk->DimInChunks); + f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zChunk, Chunk->DimInChunks); /* f32 zCoord = 75.f; */ f32 WorldZBiased = zCoord - zMin; for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) @@ -246,7 +253,7 @@ Terrain_FBM2D( world_chunk *Chunk, v3i ChunkP = V3i(xChunk, yChunk, zChunk); /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ /* v3i NoiseP = V3i(xChunk+1, yChunk+1, zChunk+1)/NoiseUpsampleFactor; */ - v3i NoiseP = V3i(xChunk+1, yChunk, zChunk)/NoiseUpsampleFactor; + v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); @@ -289,13 +296,13 @@ Terrain_FBM2D( world_chunk *Chunk, for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) { /* f32 zCoord = 75.f; */ - f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zNoise)*NoiseUpsampleFactor, Chunk->DimInChunks); + f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zNoise, Chunk->DimInChunks); f32 WorldZBiased = zCoord - zMin; for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) { { - v3i BorderP = V3i(0, yNoise, zNoise)/NoiseUpsampleFactor; + v3i BorderP = V3i(0, yNoise, zNoise); s32 BorderIndex = GetIndex(BorderP, NoiseDim); r32 ThisNoiseV = NoiseValues[BorderIndex]; @@ -307,7 +314,7 @@ Terrain_FBM2D( world_chunk *Chunk, } { - v3i BorderP = V3i(65, yNoise, zNoise)/NoiseUpsampleFactor; + v3i BorderP = V3i(65, yNoise, zNoise); s32 BorderIndex = GetIndex(BorderP, NoiseDim); r32 ThisNoiseV = NoiseValues[BorderIndex]; From 370da1d16336bdd42c27007aa4915914213167a1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 14 Oct 2024 14:57:04 -0700 Subject: [PATCH 087/421] Upsampling 2x working with blending --- examples/terrain_gen/game.cpp | 2 +- src/engine/terrain.cpp | 54 ++++++++++++++++++++++++----------- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index db401f7a5..ca0ad237f 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -764,7 +764,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() world_position WorldCenter = V3i(100, 100, 0); canonical_position CameraTargetP = {}; - StandardCamera(Graphics->Camera, 150000.0f, 20000.0f); + StandardCamera(Graphics->Camera, 150000.0f, 5000.0f); AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 95de33913..700228e02 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -87,10 +87,14 @@ Terrain_FBM2D( world_chunk *Chunk, memory_arena *TempArena = GetTranArena(); - s32 NoiseUpsampleFactor = 1; + s32 NoiseUpsampleFactor = 2; + /* s32 NoiseUpsampleFactor = 4; */ - v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0)), V3i(8, 1, 1)); - v3i NormalsDim = RoundUp((Chunk->Dim-V3i(0,2,2)), V3i(8, 1, 1)); + v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0)), V3i(8*NoiseUpsampleFactor, 1, 1)); + v3i NormalsDim = RoundUp((Chunk->Dim-V3i(0,2,2)), V3i(8*NoiseUpsampleFactor, 1, 1)); + + /* v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0)), V3i(8, 1, 1)); */ + /* v3i NormalsDim = RoundUp((Chunk->Dim-V3i(0,2,2)), V3i(8, 1, 1)); */ Assert(Chunk->Dim == V3i(64, 66, 66)); Assert(NormalsDim == V3i(64)); @@ -157,16 +161,27 @@ Terrain_FBM2D( world_chunk *Chunk, } } - u32 *_xCoords = AllocateAligned(u32, TempArena, NoiseDim.x, 32); - for ( s32 xNoise = 0; xNoise < NoiseDim.x; ++ xNoise ) + s32 _xCoordsCount = NoiseDim.x*NoiseUpsampleFactor; + u32 *_xCoords = AllocateAligned(u32, TempArena, _xCoordsCount, 32); + for ( s32 xNoise = 0; xNoise < _xCoordsCount; ++ xNoise ) { - _xCoords[xNoise] = u32(xNoise*NoiseUpsampleFactor) - 1; - /* _xCoords[xNoise] = u32(xNoise) - 1; */ + /* _xCoords[xNoise] = u32(xNoise); */ + _xCoords[xNoise] = u32(xNoise) - 1; } for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) { - auto _x = U32_8X(_xCoords+xNoise); + /* auto _x = U32_8X(_xCoords+xNoise); */ + auto _x = U32_8X( + _xCoords[xNoise+(0*NoiseUpsampleFactor)], + _xCoords[xNoise+(1*NoiseUpsampleFactor)], + _xCoords[xNoise+(2*NoiseUpsampleFactor)], + _xCoords[xNoise+(3*NoiseUpsampleFactor)], + _xCoords[xNoise+(4*NoiseUpsampleFactor)], + _xCoords[xNoise+(5*NoiseUpsampleFactor)], + _xCoords[xNoise+(6*NoiseUpsampleFactor)], + _xCoords[xNoise+(7*NoiseUpsampleFactor)] ); + RangeIterator(OctaveIndex, Octaves) { s32 i = OctaveIndex+(xNoise*Octaves); @@ -202,7 +217,7 @@ Terrain_FBM2D( world_chunk *Chunk, s32 NoiseIndex = GetIndex(xNoise, yNoise, zNoise, NoiseDim); const s32 SampleCount = 8; - f32 Samples[SampleCount] = {}; + alignas(32) f32_8x Samples = {}; r32 InteriorAmp = r32(Amplitude); RangeIterator(OctaveIndex, Octaves) @@ -212,15 +227,22 @@ Terrain_FBM2D( world_chunk *Chunk, auto xParam = xParams+OctaveIndex+(xNoise*Octaves); /* PerlinNoise_8x_avx2(xParam, yParam, zParam, NoiseValues+NoiseIndex, InteriorAmp); */ - PerlinNoise_8x_avx2(xParam, yParam, zParam, Samples, InteriorAmp); + PerlinNoise_8x_avx2(xParam, yParam, zParam, Samples.E, InteriorAmp); InteriorAmp = Max(1.f, InteriorAmp/2.f); } + f32_8x OffsetSamples = StaticShuffle_avx(Samples, 1, 2, 3, 4, 5, 6, 7, 7); + f32_8x BlendedSamples = Lerp8x(F32_8X(0.5f), Samples, OffsetSamples); + RangeIterator(SampleIndex, SampleCount) { - NoiseValues[NoiseIndex+SampleIndex] += Samples[SampleIndex]; - /* NoiseValues[NoiseIndex+(SampleIndex*NoiseUpsampleFactor)+0] += Samples[SampleIndex]; */ - /* NoiseValues[NoiseIndex+(SampleIndex*NoiseUpsampleFactor)+1] += Samples[SampleIndex]; */ + /* RangeIterator(UpsampleIndex, NoiseUpsampleFactor) */ + { + s32 UpsampleIndex = 0; + NoiseValues[NoiseIndex+(SampleIndex*NoiseUpsampleFactor)+UpsampleIndex] += Samples.E[SampleIndex]; + UpsampleIndex = 1; + NoiseValues[NoiseIndex+(SampleIndex*NoiseUpsampleFactor)+UpsampleIndex] += BlendedSamples.E[SampleIndex]; + } } } @@ -273,11 +295,11 @@ Terrain_FBM2D( world_chunk *Chunk, /* } */ Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ - /* if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } */ /* if (xChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_YELLOW)*u16(NoiseChoice); } */ /* if (xChunk == Chunk->Dim.x-1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ - /* if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_GREEN)*u16(NoiseChoice); } */ - /* if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } */ + if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } + if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_GREEN)*u16(NoiseChoice); } + if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } } SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); From c1df8645332efaf9622880441981df77d4da348a Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 16 Oct 2024 17:38:59 -0700 Subject: [PATCH 088/421] Add gradient noise shader --- generated/anonymous_input_Lwen2qoF.h | 2 +- generated/are_equal_ui_toggle.h | 2 +- generated/are_equal_window_layout.h | 2 +- generated/block_array_h_texture_688856411.h | 2 +- generated/block_array_h_texture_688856411_0.h | 2 +- generated/d_union_ui_render_command.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 15 +++ ...r_ui_for_compound_type_render_buffers_2d.h | 16 --- generated/for_datatypes_0XxWqGSZ.h | 2 + generated/for_datatypes_fkubhsYl.h | 2 + generated/for_datatypes_kv3WBTai.h | 2 + generated/gen_shader_uniform_push_v3i.h | 33 +++++ generated/hashtable_struct_ui_toggle.h | 2 +- generated/hashtable_struct_window_layout.h | 2 +- generated/maybe_ui_toggle.h | 2 +- generated/maybe_ui_toggle_ptr.h | 2 +- generated/maybe_window_layout.h | 2 +- generated/maybe_window_layout_ptr.h | 2 +- .../shader_magic_gradient_noise_shader.h | 37 +++++ shaders/noise/gradient.fragmentshader | 126 ++++++++++++++++++ src/engine/graphics.h | 28 ++++ src/engine/render/render_init.cpp | 20 +++ src/engine/resources.cpp | 13 +- 23 files changed, 286 insertions(+), 32 deletions(-) create mode 100644 generated/gen_shader_uniform_push_v3i.h create mode 100644 generated/shader_magic_gradient_noise_shader.h create mode 100644 shaders/noise/gradient.fragmentshader diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 05d6cd6a1..3732ef8c8 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3291:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3290:0 if (Input->Dot.Clicked) { diff --git a/generated/are_equal_ui_toggle.h b/generated/are_equal_ui_toggle.h index 8bc906cdc..426daf6b7 100644 --- a/generated/are_equal_ui_toggle.h +++ b/generated/are_equal_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:144:0 +// external/bonsai_stdlib/src/ui/ui.h:143:0 link_internal b32 AreEqual(ui_toggle *Thing1, ui_toggle *Thing2) diff --git a/generated/are_equal_window_layout.h b/generated/are_equal_window_layout.h index 5c8aad984..2c3536031 100644 --- a/generated/are_equal_window_layout.h +++ b/generated/are_equal_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:124:0 +// external/bonsai_stdlib/src/ui/ui.h:123:0 link_internal b32 AreEqual(window_layout *Thing1, window_layout *Thing2) diff --git a/generated/block_array_h_texture_688856411.h b/generated/block_array_h_texture_688856411.h index a9bc114cf..901975af3 100644 --- a/generated/block_array_h_texture_688856411.h +++ b/generated/block_array_h_texture_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/texture.h:45:0 +// external/bonsai_stdlib/src/texture.h:46:0 struct texture_ptr_block { diff --git a/generated/block_array_h_texture_688856411_0.h b/generated/block_array_h_texture_688856411_0.h index 00a07de11..8677ffc50 100644 --- a/generated/block_array_h_texture_688856411_0.h +++ b/generated/block_array_h_texture_688856411_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/texture.h:42:0 +// external/bonsai_stdlib/src/texture.h:43:0 struct texture_block { diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 144039931..c20347c79 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:810:0 +// external/bonsai_stdlib/src/ui/ui.h:809:0 enum ui_render_command_type { diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 8c3eea0d6..7f9b7e9f3 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -354,6 +354,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(gpu_noise_render_group*,&Element->GpuNoise), + CSz("GpuNoise"), + Params + ); + + + + + + + + if (ToggleButton(Ui, CSz("v GpuBuffers[2]"), CSz("> GpuBuffers[2]"), UiId(Window, "toggle graphics gpu_mapped_element_buffer GpuBuffers", Element->GpuBuffers), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 962ae54a4..544dc8778 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -56,22 +56,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->SolidUIUVBuffer), - CSz("SolidUIUVBuffer"), - Params - ); - - - - - - - PushNewRow(Ui); DoEditorUi(Ui, diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 4f6b1ef7c..bf8864d78 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -186,6 +186,8 @@ + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 73d6a8848..9e7765c06 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -186,6 +186,8 @@ + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 87dd6303e..f46310693 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -186,6 +186,8 @@ + + diff --git a/generated/gen_shader_uniform_push_v3i.h b/generated/gen_shader_uniform_push_v3i.h new file mode 100644 index 000000000..7a6750873 --- /dev/null +++ b/generated/gen_shader_uniform_push_v3i.h @@ -0,0 +1,33 @@ +// external/bonsai_stdlib/src/shader.cpp:187:0 + +shader_uniform * +PushShaderUniform( memory_arena *Mem, const char *Name, v3i *Value) +{ + shader_uniform *Uniform = PushShaderUniform(Mem, Name); + Uniform->Type = ShaderUniform_V3i; + Uniform->V3i = Value; + return Uniform; +} + +shader_uniform * +GetUniform(memory_arena *Mem, shader *Shader, v3i *Value, const char *Name) +{ + shader_uniform *Uniform = PushShaderUniform(Mem, Name, Value); + Uniform->ID = GetShaderUniform(Shader, Name); + return Uniform; +} + +shader_uniform +ShaderUniform(shader *Shader, v3i *Value, const char *Name) +{ + shader_uniform Uniform = {}; + + Uniform.Type = ShaderUniform_V3i; + Uniform.V3i = Value; + Uniform.Name = Name; + + Uniform.ID = GetShaderUniform(Shader, Name); + + return Uniform; +} + diff --git a/generated/hashtable_struct_ui_toggle.h b/generated/hashtable_struct_ui_toggle.h index a079e3282..0d8b5e577 100644 --- a/generated/hashtable_struct_ui_toggle.h +++ b/generated/hashtable_struct_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:218:0 +// external/bonsai_stdlib/src/ui/ui.h:217:0 struct ui_toggle_linked_list_node { diff --git a/generated/hashtable_struct_window_layout.h b/generated/hashtable_struct_window_layout.h index 9bf794ec8..6c52fd54f 100644 --- a/generated/hashtable_struct_window_layout.h +++ b/generated/hashtable_struct_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:133:0 +// external/bonsai_stdlib/src/ui/ui.h:132:0 struct window_layout_linked_list_node { diff --git a/generated/maybe_ui_toggle.h b/generated/maybe_ui_toggle.h index 086f3424e..ff5dd8c17 100644 --- a/generated/maybe_ui_toggle.h +++ b/generated/maybe_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:212:0 +// external/bonsai_stdlib/src/ui/ui.h:211:0 struct maybe_ui_toggle { diff --git a/generated/maybe_ui_toggle_ptr.h b/generated/maybe_ui_toggle_ptr.h index bb96cf33f..b0f462dd8 100644 --- a/generated/maybe_ui_toggle_ptr.h +++ b/generated/maybe_ui_toggle_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:215:0 +// external/bonsai_stdlib/src/ui/ui.h:214:0 struct maybe_ui_toggle_ptr { diff --git a/generated/maybe_window_layout.h b/generated/maybe_window_layout.h index 8ad8dc96c..9b29b69e2 100644 --- a/generated/maybe_window_layout.h +++ b/generated/maybe_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:127:0 +// external/bonsai_stdlib/src/ui/ui.h:126:0 struct maybe_window_layout { diff --git a/generated/maybe_window_layout_ptr.h b/generated/maybe_window_layout_ptr.h index 56ce02a37..47d9625ab 100644 --- a/generated/maybe_window_layout_ptr.h +++ b/generated/maybe_window_layout_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:130:0 +// external/bonsai_stdlib/src/ui/ui.h:129:0 struct maybe_window_layout_ptr { diff --git a/generated/shader_magic_gradient_noise_shader.h b/generated/shader_magic_gradient_noise_shader.h new file mode 100644 index 000000000..07e6eb51b --- /dev/null +++ b/generated/shader_magic_gradient_noise_shader.h @@ -0,0 +1,37 @@ +// src/engine/graphics.h:14:0 + +link_internal void +InitializeGradientNoiseShader( gradient_noise_shader *Struct , v3 ChunkSize ) +{ + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/noise/gradient.fragmentshader")); + + u32 UniformIndex = 0; + + + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->ChunkSize, "ChunkSize"); + ++UniformIndex; + + if (UniformIndex != 1 ) + { + Error("Shader (gradient_noise_shader) had an incorrect number of uniform slots!"); + } + + +} + +link_internal void +UseShader( gradient_noise_shader *Struct ) +{ + GL.UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + if (UniformIndex != 1 ) + { + Error("Shader (gradient_noise_shader) had an incorrect number of uniform slots!"); + } +} + diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader new file mode 100644 index 000000000..9d8cf11f6 --- /dev/null +++ b/shaders/noise/gradient.fragmentshader @@ -0,0 +1,126 @@ +in vec2 UV; +out float Output; + +// https://www.shadertoy.com/view/4dffRH +// +// +// +// The MIT License +// Copyright © 2017 Inigo Quilez +// 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. +// https://www.youtube.com/c/InigoQuilez +// https://iquilezles.org/ + +// Computes the analytic derivatives of a 3D Gradient Noise. This can be used for example to compute normals to a +// 3d rocks based on Gradient Noise without approximating the gradient by having to take central differences. +// +// More info here: https://iquilezles.org/articles/gradientnoise + +// All noise functions here: +// +// https://www.shadertoy.com/playlist/fXlXzf&from=0&num=12 + + +// 0: integer hash +// 1: float hash (aliasing based) +#define METHOD 0 + +// 0: cubic +// 1: quintic +#define INTERPOLANT 1 + + +#if METHOD==0 +vec3 hash( ivec3 p ) // this hash is not production ready, please +{ // replace this by something better + ivec3 n = ivec3( p.x*127 + p.y*311 + p.z*74, + p.x*269 + p.y*183 + p.z*246, + p.x*113 + p.y*271 + p.z*124); + + // 1D hash by Hugo Elias + n = (n << 13) ^ n; + n = n * (n * n * 15731 + 789221) + 1376312589; + return -1.0+2.0*vec3( n & ivec3(0x0fffffff))/float(0x0fffffff); +} + +#else +vec3 hash( vec3 p ) // this hash is not production ready, please +{ // replace this by something better + p = vec3( dot(p,vec3(127.1,311.7, 74.7)), + dot(p,vec3(269.5,183.3,246.1)), + dot(p,vec3(113.5,271.9,124.6))); + + return -1.0 + 2.0*fract(sin(p)*43758.5453123); +} +#endif + + +// return value noise (in x) and its derivatives (in yzw) +// +vec4 gradient_noise_derivs( in vec3 x ) +{ + // grid + #if METHOD==0 + ivec3 i = ivec3(floor(x)); + #else + vec3 i = floor(x); + #endif + vec3 f = fract(x); + + #if INTERPOLANT==1 + // quintic interpolant + vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); + vec3 du = 30.0*f*f*(f*(f-2.0)+1.0); + #else + // cubic interpolant + vec3 u = f*f*(3.0-2.0*f); + vec3 du = 6.0*f*(1.0-f); + #endif + + // gradients + #if METHOD==0 + vec3 ga = hash( i+ivec3(0,0,0) ); + vec3 gb = hash( i+ivec3(1,0,0) ); + vec3 gc = hash( i+ivec3(0,1,0) ); + vec3 gd = hash( i+ivec3(1,1,0) ); + vec3 ge = hash( i+ivec3(0,0,1) ); + vec3 gf = hash( i+ivec3(1,0,1) ); + vec3 gg = hash( i+ivec3(0,1,1) ); + vec3 gh = hash( i+ivec3(1,1,1) ); + #else + vec3 ga = hash( i+vec3(0.0,0.0,0.0) ); + vec3 gb = hash( i+vec3(1.0,0.0,0.0) ); + vec3 gc = hash( i+vec3(0.0,1.0,0.0) ); + vec3 gd = hash( i+vec3(1.0,1.0,0.0) ); + vec3 ge = hash( i+vec3(0.0,0.0,1.0) ); + vec3 gf = hash( i+vec3(1.0,0.0,1.0) ); + vec3 gg = hash( i+vec3(0.0,1.0,1.0) ); + vec3 gh = hash( i+vec3(1.0,1.0,1.0) ); + #endif + + // projections + float va = dot( ga, f-vec3(0.0,0.0,0.0) ); + float vb = dot( gb, f-vec3(1.0,0.0,0.0) ); + float vc = dot( gc, f-vec3(0.0,1.0,0.0) ); + float vd = dot( gd, f-vec3(1.0,1.0,0.0) ); + float ve = dot( ge, f-vec3(0.0,0.0,1.0) ); + float vf = dot( gf, f-vec3(1.0,0.0,1.0) ); + float vg = dot( gg, f-vec3(0.0,1.0,1.0) ); + float vh = dot( gh, f-vec3(1.0,1.0,1.0) ); + + // interpolations + return vec4( va + u.x*(vb-va) + u.y*(vc-va) + u.z*(ve-va) + u.x*u.y*(va-vb-vc+vd) + u.y*u.z*(va-vc-ve+vg) + u.z*u.x*(va-vb-ve+vf) + (-va+vb+vc-vd+ve-vf-vg+vh)*u.x*u.y*u.z, // value + ga + u.x*(gb-ga) + u.y*(gc-ga) + u.z*(ge-ga) + u.x*u.y*(ga-gb-gc+gd) + u.y*u.z*(ga-gc-ge+gg) + u.z*u.x*(ga-gb-ge+gf) + (-ga+gb+gc-gd+ge-gf-gg+gh)*u.x*u.y*u.z + // derivatives + du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); +} + +void main() +{ + v3 xyz = v3(UV, 1.f); + + for (s32 Octave = 0; Octave < 10; ++Octave) + { + Output += gradient_noise_derivs(xyz * 150.f/Octave).x; + } + /* Output = (UV.x + UV.y) / 2.f; */ +} diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 846dc1345..a8cc8b74d 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -1,3 +1,28 @@ + + +struct gradient_noise_shader +poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") + @frag_source_file("shaders/noise/gradient.fragmentshader") ) +{ + shader Program; + shader_uniform Uniforms[1]; + texture ChunkData; + + v3 ChunkSize; poof(@uniform) +}; + +poof(shader_magic(gradient_noise_shader)) +#include + +struct gpu_noise_render_group +{ + framebuffer FBO; + u32 GlTimerObject; + + gradient_noise_shader GradientShader; + +}; + struct composite_render_group { shader Shader; @@ -24,6 +49,8 @@ struct transparency_render_group struct shadow_render_group; + + struct graphics { b32 Initialized; @@ -77,6 +104,7 @@ struct graphics lighting_render_group Lighting; gaussian_render_group Gaussian; composite_render_group CompositeGroup; + gpu_noise_render_group GpuNoise; gpu_mapped_element_buffer GpuBuffers[2]; u32 GpuBufferWriteIndex; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index e4fa3d342..54ca4563b 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -757,6 +757,26 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr ); } + + { + v2i ChunkDim = V2i(64, 64*64); + + InitializeGradientNoiseShader(&Result->GpuNoise.GradientShader, V3(64)); + + Result->GpuNoise.FBO = GenFramebuffer(); + + GL.GenQueries(1, &Result->GpuNoise.GlTimerObject); + Assert(Result->GpuNoise.GlTimerObject); + + GL.BindFramebuffer(GL_FRAMEBUFFER, Result->GpuNoise.FBO.ID); + + texture ChunkDataTexture = MakeTexture_SingleChannel(ChunkDim, CSz("PerlinNoiseTexture"), False); + FramebufferTexture(&Result->GpuNoise.FBO, &ChunkDataTexture); + SetDrawBuffers(&Result->GpuNoise.FBO); + + Ensure(CheckAndClearFramebuffer()); + } + GL.Enable(GL_CULL_FACE); GL.CullFace(GL_BACK); diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index a749e67fa..ca32f5d33 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -245,7 +245,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) Graphics->ColorPaletteTexture = MakeTexture_RGB( V2i(ColorCount, 1), Graphics->ColorPalette.Start, CSz("ColorPalette")); } - + // // Editor preview /* DrawStuffToGBufferTextures(Engine, GetApplicationResolution(&Engine->Settings)); */ { @@ -293,13 +293,18 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) if (Graphics->Settings.UseLightingBloom) { RunBloomRenderPass(Graphics); } /* if (Graphics->Settings.UseLightingBloom) { GaussianBlurTexture(&Graphics->Gaussian, &Graphics->Lighting.BloomTex, &Graphics->Lighting.BloomFBO); } */ - - - CompositeGameTexturesAndDisplay(Plat, Graphics); UiFrameEnd(&Engine->Ui); + { + GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->GpuNoise.FBO.ID); + SetViewport(V2i(64, 4096)); + UseShader( &Graphics->GpuNoise.GradientShader ); + RenderQuad(); + } + + BonsaiSwapBuffers(&Engine->Stdlib.Os); From d7af02784dcc856149e349f8f478fff665de59ee Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 16 Oct 2024 18:16:15 -0700 Subject: [PATCH 089/421] Random FAFing --- shaders/noise/gradient.fragmentshader | 48 +++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader index 9d8cf11f6..f56913a9b 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/noise/gradient.fragmentshader @@ -7,7 +7,21 @@ out float Output; // // The MIT License // Copyright © 2017 Inigo Quilez -// 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. +// 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. +// // https://www.youtube.com/c/InigoQuilez // https://iquilezles.org/ @@ -114,13 +128,41 @@ vec4 gradient_noise_derivs( in vec3 x ) du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); } +// Doesn't support integer hashing +#if METHOD == 1 +float gradient_noise( in vec3 p ) +{ + vec3 i = floor( p ); + vec3 f = fract( p ); + + #if INTERPOLANT==1 + // quintic interpolant + vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); + #else + // cubic interpolant + vec3 u = f*f*(3.0-2.0*f); + #endif + + return mix( mix( mix( dot( hash( i + vec3(0.0,0.0,0.0) ), f - vec3(0.0,0.0,0.0) ), + dot( hash( i + vec3(1.0,0.0,0.0) ), f - vec3(1.0,0.0,0.0) ), u.x), + mix( dot( hash( i + vec3(0.0,1.0,0.0) ), f - vec3(0.0,1.0,0.0) ), + dot( hash( i + vec3(1.0,1.0,0.0) ), f - vec3(1.0,1.0,0.0) ), u.x), u.y), + mix( mix( dot( hash( i + vec3(0.0,0.0,1.0) ), f - vec3(0.0,0.0,1.0) ), + dot( hash( i + vec3(1.0,0.0,1.0) ), f - vec3(1.0,0.0,1.0) ), u.x), + mix( dot( hash( i + vec3(0.0,1.0,1.0) ), f - vec3(0.0,1.0,1.0) ), + dot( hash( i + vec3(1.0,1.0,1.0) ), f - vec3(1.0,1.0,1.0) ), u.x), u.y), u.z ); +} +#endif + void main() { v3 xyz = v3(UV, 1.f); - for (s32 Octave = 0; Octave < 10; ++Octave) + /* for (s32 Octave = 0; Octave < 1; ++Octave) */ { - Output += gradient_noise_derivs(xyz * 150.f/Octave).x; + /* Output += gradient_noise_derivs(xyz / Octave).x; */ + Output += gradient_noise_derivs(xyz*5).x; + /* Output += gradient_noise(xyz * 150.f/Octave); */ } /* Output = (UV.x + UV.y) / 2.f; */ } From 76ce9f05487e9ec9ab1fe3599dcc6d5533c106ab Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 17 Oct 2024 11:41:12 -0700 Subject: [PATCH 090/421] Move LibIsNew into stdlib and rename to FileIsNew --- external/bonsai_stdlib | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- generated/are_equal_ui_toggle.h | 2 +- generated/are_equal_window_layout.h | 2 +- generated/d_union_ui_render_command.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 15 +++++++++ ...r_ui_for_compound_type_render_buffers_2d.h | 16 ++++++++++ .../do_editor_ui_for_compound_type_shader.h | 32 +++++++++++++++++++ generated/for_datatypes_0XxWqGSZ.h | 9 ++++++ generated/for_datatypes_fkubhsYl.h | 9 ++++++ generated/for_datatypes_kv3WBTai.h | 9 ++++++ generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- generated/hashtable_struct_ui_toggle.h | 2 +- generated/hashtable_struct_window_layout.h | 2 +- generated/maybe_ui_toggle.h | 2 +- generated/maybe_ui_toggle_ptr.h | 2 +- generated/maybe_window_layout.h | 2 +- generated/maybe_window_layout_ptr.h | 2 +- .../shader_magic_bloom_downsample_shader.h | 2 ++ .../shader_magic_bloom_upsample_shader.h | 2 ++ .../shader_magic_gradient_noise_shader.h | 2 ++ generated/shader_magic_shadow_map_shader.h | 2 ++ jesse.make.sh | 2 +- shaders/noise/gradient.fragmentshader | 14 +++++--- src/engine/resources.cpp | 2 ++ src/game_loader.cpp | 28 ++-------------- 32 files changed, 132 insertions(+), 48 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index c7756cbe9..6252ab7ee 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit c7756cbe9779649c1e14ceee376d344313485551 +Subproject commit 6252ab7ee94edb4f2521c2883db4b35b1850c71e diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 3732ef8c8..05d6cd6a1 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3290:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3291:0 if (Input->Dot.Clicked) { diff --git a/generated/are_equal_ui_toggle.h b/generated/are_equal_ui_toggle.h index 426daf6b7..8bc906cdc 100644 --- a/generated/are_equal_ui_toggle.h +++ b/generated/are_equal_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:143:0 +// external/bonsai_stdlib/src/ui/ui.h:144:0 link_internal b32 AreEqual(ui_toggle *Thing1, ui_toggle *Thing2) diff --git a/generated/are_equal_window_layout.h b/generated/are_equal_window_layout.h index 2c3536031..5c8aad984 100644 --- a/generated/are_equal_window_layout.h +++ b/generated/are_equal_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:123:0 +// external/bonsai_stdlib/src/ui/ui.h:124:0 link_internal b32 AreEqual(window_layout *Thing1, window_layout *Thing2) diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index c20347c79..144039931 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:809:0 +// external/bonsai_stdlib/src/ui/ui.h:810:0 enum ui_render_command_type { diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index a15af38d6..a554b60d4 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -86,6 +86,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader_ptr_block_array*,&Element->AllShaders), + CSz("AllShaders"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 544dc8778..c51dc1f16 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -40,6 +40,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*,&Element->SolidUIUVBuffer), + CSz("SolidUIUVBuffer"), + Params + ); + + + + + + + PushNewRow(Ui); DoEditorUi(Ui, diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 06a17d439..7e3a22198 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -87,6 +87,38 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s64*,&Element->VertexTimeModifiedWhenLoaded), + CSz("VertexTimeModifiedWhenLoaded"), + Params + ); + + + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s64*,&Element->FragmentTimeModifiedWhenLoaded), + CSz("FragmentTimeModifiedWhenLoaded"), + Params + ); + + + + + + + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index bf8864d78..86381de71 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -187,6 +187,9 @@ + + + @@ -643,6 +646,12 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 9e7765c06..95fcc86b0 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -187,6 +187,9 @@ + + + @@ -633,6 +636,12 @@ render_to_texture_async_params render_to_texture_async_params; + + + + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index f46310693..5aea3506d 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -187,6 +187,9 @@ + + + @@ -633,6 +636,12 @@ type_render_to_texture_async_params, + + + + + + diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 9ee3e70f9..4e6b2c4c9 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:178:0 +// external/bonsai_stdlib/src/shader.cpp:237:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, m4 *Value) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 49142ad60..f4a363ad1 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:193:0 +// external/bonsai_stdlib/src/shader.cpp:252:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, r32 *Value) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index 280319422..70e162b89 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:190:0 +// external/bonsai_stdlib/src/shader.cpp:249:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, s32 *Value) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index 2cdcd0253..364323c28 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:175:0 +// external/bonsai_stdlib/src/shader.cpp:234:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, texture *Value) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 0afeef8fe..ff94b25cb 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:187:0 +// external/bonsai_stdlib/src/shader.cpp:246:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, u32 *Value) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index 3b5fad0ae..a28760762 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:181:0 +// external/bonsai_stdlib/src/shader.cpp:240:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, v2 *Value) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index b175ad62a..e28636ec6 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:184:0 +// external/bonsai_stdlib/src/shader.cpp:243:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, v3 *Value) diff --git a/generated/hashtable_struct_ui_toggle.h b/generated/hashtable_struct_ui_toggle.h index 0d8b5e577..a079e3282 100644 --- a/generated/hashtable_struct_ui_toggle.h +++ b/generated/hashtable_struct_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:217:0 +// external/bonsai_stdlib/src/ui/ui.h:218:0 struct ui_toggle_linked_list_node { diff --git a/generated/hashtable_struct_window_layout.h b/generated/hashtable_struct_window_layout.h index 6c52fd54f..9bf794ec8 100644 --- a/generated/hashtable_struct_window_layout.h +++ b/generated/hashtable_struct_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:132:0 +// external/bonsai_stdlib/src/ui/ui.h:133:0 struct window_layout_linked_list_node { diff --git a/generated/maybe_ui_toggle.h b/generated/maybe_ui_toggle.h index ff5dd8c17..086f3424e 100644 --- a/generated/maybe_ui_toggle.h +++ b/generated/maybe_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:211:0 +// external/bonsai_stdlib/src/ui/ui.h:212:0 struct maybe_ui_toggle { diff --git a/generated/maybe_ui_toggle_ptr.h b/generated/maybe_ui_toggle_ptr.h index b0f462dd8..bb96cf33f 100644 --- a/generated/maybe_ui_toggle_ptr.h +++ b/generated/maybe_ui_toggle_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:214:0 +// external/bonsai_stdlib/src/ui/ui.h:215:0 struct maybe_ui_toggle_ptr { diff --git a/generated/maybe_window_layout.h b/generated/maybe_window_layout.h index 9b29b69e2..8ad8dc96c 100644 --- a/generated/maybe_window_layout.h +++ b/generated/maybe_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:126:0 +// external/bonsai_stdlib/src/ui/ui.h:127:0 struct maybe_window_layout { diff --git a/generated/maybe_window_layout_ptr.h b/generated/maybe_window_layout_ptr.h index 47d9625ab..56ce02a37 100644 --- a/generated/maybe_window_layout_ptr.h +++ b/generated/maybe_window_layout_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:129:0 +// external/bonsai_stdlib/src/ui/ui.h:130:0 struct maybe_window_layout_ptr { diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index 619bb0a26..67dc5d47c 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -18,6 +18,8 @@ InitializeBloomDownsampleShader( bloom_downsample_shader *Struct , v2*SrcResolu } + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } link_internal void diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index e50d96165..701fc8a2c 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -18,6 +18,8 @@ InitializeBloomUpsampleShader( bloom_upsample_shader *Struct , f32*FilterRadius } + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } link_internal void diff --git a/generated/shader_magic_gradient_noise_shader.h b/generated/shader_magic_gradient_noise_shader.h index 07e6eb51b..9d3d22565 100644 --- a/generated/shader_magic_gradient_noise_shader.h +++ b/generated/shader_magic_gradient_noise_shader.h @@ -17,6 +17,8 @@ InitializeGradientNoiseShader( gradient_noise_shader *Struct , v3 ChunkSize ) } + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } link_internal void diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index 1de332f42..e12e85a42 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -31,6 +31,8 @@ InitializeShadowMapShader( shadow_map_shader *Struct , m4 MVP , m4 ModelMatr } + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } link_internal void diff --git a/jesse.make.sh b/jesse.make.sh index 931f25e36..dddb34e4c 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader index f56913a9b..e59549618 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/noise/gradient.fragmentshader @@ -37,7 +37,7 @@ out float Output; // 0: integer hash // 1: float hash (aliasing based) -#define METHOD 0 +#define METHOD 1 // 0: cubic // 1: quintic @@ -156,13 +156,19 @@ float gradient_noise( in vec3 p ) void main() { - v3 xyz = v3(UV, 1.f); + v2 _UV = UV*64.f; + + f32 x = _UV.x; + f32 y = f32(s32(_UV.y) % 64); + f32 z = _UV.y / 64; + + v3 xyz = v3(x,y,z) * 25; /* for (s32 Octave = 0; Octave < 1; ++Octave) */ { /* Output += gradient_noise_derivs(xyz / Octave).x; */ - Output += gradient_noise_derivs(xyz*5).x; - /* Output += gradient_noise(xyz * 150.f/Octave); */ + Output += gradient_noise_derivs(xyz).x; + /* Output += gradient_noise(xyz); */ } /* Output = (UV.x + UV.y) / 2.f; */ } diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index ca32f5d33..00fd5669b 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -308,6 +308,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BonsaiSwapBuffers(&Engine->Stdlib.Os); + HotReloadShaders(GetStdlib()); + /* GpuMap = GetNextGpuMap(Graphics); */ diff --git a/src/game_loader.cpp b/src/game_loader.cpp index 023e512e5..bd91b8da3 100644 --- a/src/game_loader.cpp +++ b/src/game_loader.cpp @@ -13,30 +13,8 @@ global_variable s64 LastGameLibTime; global_variable s64 LastDebugLibTime; -#include - /* #include */ -typedef struct stat bonsai_stat; - -link_internal b32 -LibIsNew(const char *LibPath, s64 *LastLibTime) -{ - b32 Result = False; - bonsai_stat StatStruct; - - if (stat(LibPath, &StatStruct) == 0) - { - if (StatStruct.st_mtime > *LastLibTime) - { - *LastLibTime = StatStruct.st_mtime; - Result = True; - } - } - - return Result; -} - #if 0 void @@ -155,8 +133,8 @@ main( s32 ArgCount, const char ** Args ) application_api *GameApi = &EngineResources->GameApi; engine_api EngineApi = {}; { - LibIsNew(GameLibName, &LastGameLibTime); // Hack to initialize the lib timer statics - LibIsNew(DEFAULT_DEBUG_LIB, &LastDebugLibTime); + FileIsNew(GameLibName, &LastGameLibTime); // Hack to initialize the lib timer statics + FileIsNew(DEFAULT_DEBUG_LIB, &LastDebugLibTime); GameLib = OpenLibrary(GameLibName); if (!GameLib) { Error("Loading GameLib :( "); return 1; } @@ -287,7 +265,7 @@ main( s32 ArgCount, const char ** Args ) DEBUG_FRAME_BEGIN(&EngineResources->Ui, Plat->dt, EngineResources->Hotkeys.Debug_ToggleMenu, EngineResources->Hotkeys.Debug_ToggleProfiling); #if !EMCC - if ( LibIsNew(GameLibName, &LastGameLibTime) ) + if ( FileIsNew(GameLibName, &LastGameLibTime) ) { Info("Reloading Game Lib"); From ed64acad62104f5075bacab9d3a3c1654e672dab Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 17 Oct 2024 11:41:56 -0700 Subject: [PATCH 091/421] Add shader_block_array --- generated/block_array_c_shader_688853971.h | 77 ++++++++ .../block_array_c_shader_ptr_688853971.h | 77 ++++++++ generated/block_array_h_shader_688853971_0.h | 164 ++++++++++++++++++ .../block_array_h_shader_ptr_688853971_0.h | 164 ++++++++++++++++++ 4 files changed, 482 insertions(+) create mode 100644 generated/block_array_c_shader_688853971.h create mode 100644 generated/block_array_c_shader_ptr_688853971.h create mode 100644 generated/block_array_h_shader_688853971_0.h create mode 100644 generated/block_array_h_shader_ptr_688853971_0.h diff --git a/generated/block_array_c_shader_688853971.h b/generated/block_array_c_shader_688853971.h new file mode 100644 index 000000000..4decec26c --- /dev/null +++ b/generated/block_array_c_shader_688853971.h @@ -0,0 +1,77 @@ +// external/bonsai_stdlib/src/shader.cpp:2:0 + + +link_internal shader_block* +Allocate_shader_block(memory_arena *Memory) +{ + shader_block *Result = Allocate(shader_block, Memory, 1); + Result->Elements = Allocate(shader, Memory, 64); + return Result; +} + +link_internal cs +CS(shader_block_array_index Index) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal void +RemoveUnordered(shader_block_array *Array, shader_block_array_index Index) +{ + shader_block_array_index LastI = LastIndex(Array); + + shader *Element = GetPtr(Array, Index); + shader *LastElement = GetPtr(Array, LastI); + + *Element = *LastElement; + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // Walk the chain till we get to the second-last one + shader_block *Current = Array->First; + shader_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } +} + +link_internal shader * +Push(shader_block_array *Array, shader *Element) +{ + if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + + if (Array->First == 0) { Array->First = Allocate_shader_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 64) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + shader_block *Next = Allocate_shader_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + shader *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h new file mode 100644 index 000000000..95a477cb1 --- /dev/null +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -0,0 +1,77 @@ +// external/bonsai_stdlib/src/shader.cpp:2:0 + + +link_internal shader_ptr_block* +Allocate_shader_ptr_block(memory_arena *Memory) +{ + shader_ptr_block *Result = Allocate(shader_ptr_block, Memory, 1); + Result->Elements = Allocate(shader_ptr, Memory, 64); + return Result; +} + +link_internal cs +CS(shader_ptr_block_array_index Index) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal void +RemoveUnordered(shader_ptr_block_array *Array, shader_ptr_block_array_index Index) +{ + shader_ptr_block_array_index LastI = LastIndex(Array); + + shader_ptr *Element = GetPtr(Array, Index); + shader_ptr *LastElement = GetPtr(Array, LastI); + + *Element = *LastElement; + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // Walk the chain till we get to the second-last one + shader_ptr_block *Current = Array->First; + shader_ptr_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } +} + +link_internal shader_ptr * +Push(shader_ptr_block_array *Array, shader_ptr *Element) +{ + if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + + if (Array->First == 0) { Array->First = Allocate_shader_ptr_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 64) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + shader_ptr_block *Next = Allocate_shader_ptr_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + shader_ptr *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + diff --git a/generated/block_array_h_shader_688853971_0.h b/generated/block_array_h_shader_688853971_0.h new file mode 100644 index 000000000..3e00b22ee --- /dev/null +++ b/generated/block_array_h_shader_688853971_0.h @@ -0,0 +1,164 @@ +// external/bonsai_stdlib/src/shader.h:129:0 + +struct shader_block +{ + u32 Index; + u32 At; + shader *Elements; + shader_block *Next; +}; + +struct shader_block_array_index +{ + shader_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct shader_block_array +{ + shader_block *First; + shader_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +typedef shader_block_array shader_paged_list; + +link_internal shader_block_array_index +operator++(shader_block_array_index &I0) +{ + if (I0.Block) + { + if (I0.ElementIndex == 64-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<(shader_block_array_index I0, shader_block_array_index I1) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex(shader_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*64); + return Result; +} + +link_internal shader_block_array_index +ZerothIndex(shader_block_array *Arr) +{ + shader_block_array_index Result = {}; + Result.Block = Arr->First; + /* Assert(Result.Block->Index == 0); */ + return Result; +} + +link_internal umm +TotalElements(shader_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 64) + Arr->Current->At; + } + return Result; +} + +link_internal shader_block_array_index +LastIndex(shader_block_array *Arr) +{ + shader_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal shader_block_array_index +AtElements(shader_block_array *Arr) +{ + shader_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal shader * +GetPtr(shader_block_array *Arr, shader_block_array_index Index) +{ + shader *Result = {}; + if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + return Result; +} + +link_internal shader * +GetPtr(shader_block *Block, umm Index) +{ + shader *Result = 0; + if (Index < Block->At) { Result = Block->Elements + Index; } + return Result; +} + +link_internal shader * +GetPtr(shader_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 64; + umm ElementIndex = Index % 64; + + umm AtBlock = 0; + shader_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + shader *Result = Block->Elements+ElementIndex; + return Result; +} + +link_internal shader * +TryGetPtr(shader_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 64; + umm ElementIndex = Index % 64; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + shader *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(shader_block *Block) +{ + return Block->At; +} + diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h new file mode 100644 index 000000000..561163664 --- /dev/null +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -0,0 +1,164 @@ +// external/bonsai_stdlib/src/shader.h:131:0 + +struct shader_ptr_block +{ + u32 Index; + u32 At; + shader_ptr *Elements; + shader_ptr_block *Next; +}; + +struct shader_ptr_block_array_index +{ + shader_ptr_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct shader_ptr_block_array +{ + shader_ptr_block *First; + shader_ptr_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +typedef shader_ptr_block_array shader_ptr_paged_list; + +link_internal shader_ptr_block_array_index +operator++(shader_ptr_block_array_index &I0) +{ + if (I0.Block) + { + if (I0.ElementIndex == 64-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<(shader_ptr_block_array_index I0, shader_ptr_block_array_index I1) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex(shader_ptr_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*64); + return Result; +} + +link_internal shader_ptr_block_array_index +ZerothIndex(shader_ptr_block_array *Arr) +{ + shader_ptr_block_array_index Result = {}; + Result.Block = Arr->First; + /* Assert(Result.Block->Index == 0); */ + return Result; +} + +link_internal umm +TotalElements(shader_ptr_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 64) + Arr->Current->At; + } + return Result; +} + +link_internal shader_ptr_block_array_index +LastIndex(shader_ptr_block_array *Arr) +{ + shader_ptr_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal shader_ptr_block_array_index +AtElements(shader_ptr_block_array *Arr) +{ + shader_ptr_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal shader_ptr * +GetPtr(shader_ptr_block_array *Arr, shader_ptr_block_array_index Index) +{ + shader_ptr *Result = {}; + if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + return Result; +} + +link_internal shader_ptr * +GetPtr(shader_ptr_block *Block, umm Index) +{ + shader_ptr *Result = 0; + if (Index < Block->At) { Result = Block->Elements + Index; } + return Result; +} + +link_internal shader_ptr * +GetPtr(shader_ptr_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 64; + umm ElementIndex = Index % 64; + + umm AtBlock = 0; + shader_ptr_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + shader_ptr *Result = Block->Elements+ElementIndex; + return Result; +} + +link_internal shader_ptr * +TryGetPtr(shader_ptr_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 64; + umm ElementIndex = Index % 64; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + shader_ptr *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(shader_ptr_block *Block) +{ + return Block->At; +} + From a126cff6d2e7c5dce06e3381ba227e7f3958bc19 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 17 Oct 2024 20:47:32 -0700 Subject: [PATCH 092/421] Pull code out into FinalizeOccupancyMasksFromNoiseValues --- .../asyncify_render_function_c_DrawLod.h | 2 +- ...yncify_render_function_c_RenderToTexture.h | 2 +- .../asyncify_render_function_h_DrawLod.h | 2 +- ...yncify_render_function_h_RenderToTexture.h | 2 +- ..._work_queue_entry__bonsai_render_command.h | 28 ++- generated/d_union_bonsai_render_command.h | 4 +- .../d_union_constructors_work_queue_entry.h | 15 +- generated/d_union_work_queue_entry.h | 4 +- ...on_pattern_199741702_161749140_632272777.h | 2 +- ..._iteration_pattern_275071431_101859599_0.h | 2 +- ..._iteration_pattern_275071431_785723886_0.h | 2 +- ..._iteration_pattern_846291950_267608728_0.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 4 +- generated/for_datatypes_fkubhsYl.h | 4 +- generated/for_datatypes_kv3WBTai.h | 4 +- ..._work_queue_entry__bonsai_render_command.h | 11 + .../rectalinear_iteration_pattern_398799212.h | 2 +- .../rectalinear_iteration_pattern_416827956.h | 2 +- .../rectalinear_iteration_pattern_428632106.h | 2 +- .../rectalinear_iteration_pattern_530902269.h | 2 +- .../rectalinear_iteration_pattern_583358156.h | 2 +- .../rectalinear_iteration_pattern_631222419.h | 2 +- .../rectalinear_iteration_pattern_643608995.h | 2 +- .../rectalinear_iteration_pattern_812652930.h | 2 +- .../rectalinear_iteration_pattern_920026661.h | 2 +- .../rectalinear_iteration_pattern_992879728.h | 2 +- .../rectalinear_iteration_pattern_99934950.h | 2 +- src/engine/api.cpp | 4 + src/engine/graphics.h | 2 +- src/engine/render_command.h | 8 + src/engine/resources.cpp | 26 ++- src/engine/terrain.cpp | 207 +++++++++--------- src/engine/work_queue.h | 10 +- src/engine/world_chunk.cpp | 54 +---- src/engine/world_update.cpp | 1 + 35 files changed, 242 insertions(+), 182 deletions(-) diff --git a/generated/asyncify_render_function_c_DrawLod.h b/generated/asyncify_render_function_c_DrawLod.h index 445694e05..daded2139 100644 --- a/generated/asyncify_render_function_c_DrawLod.h +++ b/generated/asyncify_render_function_c_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:307:0 +// src/engine/work_queue.h:313:0 link_internal void DrawLod_Async(work_queue *Queue,engine_resources *Engine ,shader *Shader ,lod_element_buffer *Meshes ,r32 DistanceSquared ,v3 Basis ,Quaternion Rotation ,v3 Scale ) diff --git a/generated/asyncify_render_function_c_RenderToTexture.h b/generated/asyncify_render_function_c_RenderToTexture.h index e73c1d2e3..94a456239 100644 --- a/generated/asyncify_render_function_c_RenderToTexture.h +++ b/generated/asyncify_render_function_c_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:304:0 +// src/engine/work_queue.h:310:0 link_internal void RenderToTexture_Async(work_queue *Queue,engine_resources *Engine ,asset_thumbnail *Thumb ,lod_element_buffer *Meshes ,v3 Offset ,camera *Camera ) diff --git a/generated/asyncify_render_function_h_DrawLod.h b/generated/asyncify_render_function_h_DrawLod.h index d59708f94..463a8f0df 100644 --- a/generated/asyncify_render_function_h_DrawLod.h +++ b/generated/asyncify_render_function_h_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:163:0 +// src/engine/work_queue.h:168:0 struct draw_lod_async_params poof(@async_function_params) { diff --git a/generated/asyncify_render_function_h_RenderToTexture.h b/generated/asyncify_render_function_h_RenderToTexture.h index ee3d841eb..0f6d74e15 100644 --- a/generated/asyncify_render_function_h_RenderToTexture.h +++ b/generated/asyncify_render_function_h_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:160:0 +// src/engine/work_queue.h:165:0 struct render_to_texture_async_params poof(@async_function_params) { diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index d54737733..fed61f822 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:160:0 +// src/engine/render_command.h:168:0 link_internal work_queue_entry__bonsai_render_command @@ -166,6 +166,19 @@ WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_draw_all_entities A ) + }; + return Result; +} + +link_internal work_queue_entry__bonsai_render_command +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_initialize_noise_buffer A ) +{ + work_queue_entry__bonsai_render_command Result = { + .Type = type_bonsai_render_command_initialize_noise_buffer, + .bonsai_render_command_initialize_noise_buffer = A, + + + }; return Result; } @@ -387,6 +400,19 @@ BonsaiRenderCommandDrawAllEntities( shader* Shader ) return Reuslt; } +link_internal bonsai_render_command_initialize_noise_buffer +BonsaiRenderCommandInitializeNoiseBuffer( v3 ChunkSize , f32* NoiseData ) +{ + bonsai_render_command_initialize_noise_buffer Reuslt = { + .ChunkSize = ChunkSize +, + .NoiseData = NoiseData + }; + + + return Reuslt; +} + link_internal bonsai_render_command_gl_timer_init BonsaiRenderCommandGlTimerInit( u32* GlTimerObject ) { diff --git a/generated/d_union_bonsai_render_command.h b/generated/d_union_bonsai_render_command.h index ffc4cd0f5..a75795f68 100644 --- a/generated/d_union_bonsai_render_command.h +++ b/generated/d_union_bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:128:0 +// src/engine/render_command.h:134:0 enum work_queue_entry__bonsai_render_command_type { @@ -16,6 +16,7 @@ enum work_queue_entry__bonsai_render_command_type type_bonsai_render_command_set_shader_uniform, type_bonsai_render_command_draw_world_chunk_draw_list, type_bonsai_render_command_draw_all_entities, + type_bonsai_render_command_initialize_noise_buffer, type_bonsai_render_command_gl_timer_init, type_bonsai_render_command_gl_timer_start, type_bonsai_render_command_gl_timer_end, @@ -41,6 +42,7 @@ struct work_queue_entry__bonsai_render_command struct bonsai_render_command_set_shader_uniform bonsai_render_command_set_shader_uniform; struct bonsai_render_command_draw_world_chunk_draw_list bonsai_render_command_draw_world_chunk_draw_list; struct bonsai_render_command_draw_all_entities bonsai_render_command_draw_all_entities; + struct bonsai_render_command_initialize_noise_buffer bonsai_render_command_initialize_noise_buffer; struct bonsai_render_command_gl_timer_init bonsai_render_command_gl_timer_init; struct bonsai_render_command_gl_timer_start bonsai_render_command_gl_timer_start; struct bonsai_render_command_gl_timer_end bonsai_render_command_gl_timer_end; diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 5e06ba21d..450fddad1 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:248:0 +// src/engine/work_queue.h:254:0 link_internal work_queue_entry @@ -10,6 +10,19 @@ WorkQueueEntry( work_queue_entry_init_world_chunk A ) + }; + return Result; +} + +link_internal work_queue_entry +WorkQueueEntry( work_queue_entry_build_chunk_mesh A ) +{ + work_queue_entry Result = { + .Type = type_work_queue_entry_build_chunk_mesh, + .work_queue_entry_build_chunk_mesh = A, + + + }; return Result; } diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index fd4a4d725..72cf26fc2 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,9 +1,10 @@ -// src/engine/work_queue.h:220:0 +// src/engine/work_queue.h:225:0 enum work_queue_entry_type { type_work_queue_entry_noop, type_work_queue_entry_init_world_chunk, + type_work_queue_entry_build_chunk_mesh, type_work_queue_entry_copy_buffer_set, type_work_queue_entry_copy_buffer_ref, type_work_queue_entry_init_asset, @@ -22,6 +23,7 @@ struct work_queue_entry union { struct work_queue_entry_init_world_chunk work_queue_entry_init_world_chunk; + struct work_queue_entry_build_chunk_mesh work_queue_entry_build_chunk_mesh; struct work_queue_entry_copy_buffer_set work_queue_entry_copy_buffer_set; struct work_queue_entry_copy_buffer_ref work_queue_entry_copy_buffer_ref; struct work_queue_entry_init_asset work_queue_entry_init_asset; diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index bcc631d30..8234c8119 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:568:0 +// src/engine/world_update.cpp:569:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h index 4b8b46bf3..3eb64b4b3 100644 --- a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:823:0 +// src/engine/world_update.cpp:824:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h index fb6005d28..e74b8f3da 100644 --- a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:805:0 +// src/engine/world_update.cpp:806:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h index d87d3e768..0701502ea 100644 --- a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h +++ b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:678:0 +// src/engine/world_update.cpp:679:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 86381de71..a65aba3b6 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,4 +1,5 @@ -// src/engine/work_queue.h:280:0 +// src/engine/work_queue.h:286:0 + @@ -657,6 +658,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 95fcc86b0..34b6a8877 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -1,4 +1,5 @@ -// src/engine/work_queue.h:203:0 +// src/engine/work_queue.h:208:0 + @@ -647,6 +648,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 5aea3506d..c81f28f5c 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -1,4 +1,5 @@ -// src/engine/work_queue.h:184:0 +// src/engine/work_queue.h:189:0 + @@ -647,6 +648,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index ed3dd9e8a..0cdfb2200 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -144,6 +144,17 @@ PushBonsaiRenderCommandDrawAllEntities( PushWorkQueueEntry(RenderQueue, &Work); } link_internal void +PushBonsaiRenderCommandInitializeNoiseBuffer( + work_queue *RenderQueue + , v3 ChunkSize , f32* NoiseData +) +{ + work_queue_entry Work = WorkQueueEntry( + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandInitializeNoiseBuffer( ChunkSize , NoiseData ))); + + PushWorkQueueEntry(RenderQueue, &Work); +} +link_internal void PushBonsaiRenderCommandGlTimerInit( work_queue *RenderQueue , u32* GlTimerObject diff --git a/generated/rectalinear_iteration_pattern_398799212.h b/generated/rectalinear_iteration_pattern_398799212.h index 76568b889..4e787c70c 100644 --- a/generated/rectalinear_iteration_pattern_398799212.h +++ b/generated/rectalinear_iteration_pattern_398799212.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:526:0 +// src/engine/world_update.cpp:527:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_416827956.h b/generated/rectalinear_iteration_pattern_416827956.h index 1cfc68d51..3f40d1ea8 100644 --- a/generated/rectalinear_iteration_pattern_416827956.h +++ b/generated/rectalinear_iteration_pattern_416827956.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:709:0 +// src/engine/world_update.cpp:710:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_428632106.h b/generated/rectalinear_iteration_pattern_428632106.h index b29383cf5..fc5c21bfe 100644 --- a/generated/rectalinear_iteration_pattern_428632106.h +++ b/generated/rectalinear_iteration_pattern_428632106.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:868:0 +// src/engine/world_update.cpp:869:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_530902269.h b/generated/rectalinear_iteration_pattern_530902269.h index e6ac6755b..39c2477d9 100644 --- a/generated/rectalinear_iteration_pattern_530902269.h +++ b/generated/rectalinear_iteration_pattern_530902269.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:652:0 +// src/engine/world_update.cpp:653:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_583358156.h b/generated/rectalinear_iteration_pattern_583358156.h index ba6ed39d2..10f0b5612 100644 --- a/generated/rectalinear_iteration_pattern_583358156.h +++ b/generated/rectalinear_iteration_pattern_583358156.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:841:0 +// src/engine/world_update.cpp:842:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_631222419.h b/generated/rectalinear_iteration_pattern_631222419.h index 4d74e2cba..ff8f61f56 100644 --- a/generated/rectalinear_iteration_pattern_631222419.h +++ b/generated/rectalinear_iteration_pattern_631222419.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:751:0 +// src/engine/world_update.cpp:752:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_643608995.h b/generated/rectalinear_iteration_pattern_643608995.h index d88dde3fd..808787cf9 100644 --- a/generated/rectalinear_iteration_pattern_643608995.h +++ b/generated/rectalinear_iteration_pattern_643608995.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:631:0 +// src/engine/world_update.cpp:632:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index 4ea2eee28..2f157b39d 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:603:0 +// src/engine/world_update.cpp:604:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_920026661.h b/generated/rectalinear_iteration_pattern_920026661.h index 87929f999..eefd973ad 100644 --- a/generated/rectalinear_iteration_pattern_920026661.h +++ b/generated/rectalinear_iteration_pattern_920026661.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:547:0 +// src/engine/world_update.cpp:548:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_992879728.h b/generated/rectalinear_iteration_pattern_992879728.h index 817d5dc80..7a6d705f3 100644 --- a/generated/rectalinear_iteration_pattern_992879728.h +++ b/generated/rectalinear_iteration_pattern_992879728.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:773:0 +// src/engine/world_update.cpp:774:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_99934950.h b/generated/rectalinear_iteration_pattern_99934950.h index e95f8a12e..41bb0d93e 100644 --- a/generated/rectalinear_iteration_pattern_99934950.h +++ b/generated/rectalinear_iteration_pattern_99934950.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:717:0 +// src/engine/world_update.cpp:718:0 DimIterator(x, y, z, UpdateDim) { diff --git a/src/engine/api.cpp b/src/engine/api.cpp index b44b65b5e..93482dd4c 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -554,6 +554,10 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ SimulateParticleSystem(Job); } break; + case type_work_queue_entry_build_chunk_mesh: + { + } break; + case type_work_queue_entry_rebuild_mesh: { work_queue_entry_rebuild_mesh *Job = SafeAccess(work_queue_entry_rebuild_mesh, Entry); diff --git a/src/engine/graphics.h b/src/engine/graphics.h index a8cc8b74d..fc1f1425f 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -8,7 +8,7 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader shader_uniform Uniforms[1]; texture ChunkData; - v3 ChunkSize; poof(@uniform) + v3 ChunkSize; poof(@uniform) }; poof(shader_magic(gradient_noise_shader)) diff --git a/src/engine/render_command.h b/src/engine/render_command.h index df3c4913d..cc0fc2f52 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -103,6 +103,12 @@ struct bonsai_render_command_do_stuff u32 Ignored = 0; }; +struct bonsai_render_command_initialize_noise_buffer +{ + v3 ChunkSize; // TODO(Jesse): Make this v3i + f32 *NoiseData; +}; + struct bonsai_render_command_gl_timer_init { u32 *GlTimerObject; @@ -149,6 +155,8 @@ poof( bonsai_render_command_draw_world_chunk_draw_list bonsai_render_command_draw_all_entities + bonsai_render_command_initialize_noise_buffer + bonsai_render_command_gl_timer_init bonsai_render_command_gl_timer_start bonsai_render_command_gl_timer_end diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 00fd5669b..3c5be2253 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -90,6 +90,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case type_work_queue_entry_init_asset: case type_work_queue_entry_update_world_region: case type_work_queue_entry_rebuild_mesh: + case type_work_queue_entry_build_chunk_mesh: case type_work_queue_entry_sim_particle_system: case type_work_queue_entry__align_to_cache_line_helper: { @@ -221,6 +222,24 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; + { tmatch(bonsai_render_command_initialize_noise_buffer, RC, Command) + + auto *Shader = &Graphics->GpuNoise.GradientShader; + Assert(Command->ChunkSize == Shader->ChunkSize); + + GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->GpuNoise.FBO.ID); + + v2i ViewportSize = V2i(s32(Command->ChunkSize.x), s32(Command->ChunkSize.y*Command->ChunkSize.z)); + SetViewport(ViewportSize); + UseShader(Shader); + RenderQuad(); + + GL.GetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_FLOAT, Command->NoiseData); + + auto E = WorkQueueEntry(WorkQueueEntryBuildChunkMesh(Command->ChunkSize, Command->NoiseData)); + PushWorkQueueEntry(&Plat->LowPriority, &E); + } break; + { tmatch(bonsai_render_command_do_stuff, RC, Command) @@ -297,13 +316,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) UiFrameEnd(&Engine->Ui); - { - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->GpuNoise.FBO.ID); - SetViewport(V2i(64, 4096)); - UseShader( &Graphics->GpuNoise.GradientShader ); - RenderQuad(); - } - BonsaiSwapBuffers(&Engine->Stdlib.Os); diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 700228e02..2c8e8eb0e 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -1,3 +1,105 @@ +#define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ + f32(basis_chunk_point.channel) \ + + f32(offset)*Chunk->DimInChunks.channel \ + + SrcToDest.channel \ + +link_internal u32 +FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, f32 *NoiseValues, v3i SrcToDest, s64 zMin, u16 PackedHSVColorValue) +{ + TIMED_FUNCTION(); + + u32 Result = 0; + + for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) + { + f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zChunk, Chunk->DimInChunks); + /* f32 zCoord = 75.f; */ + f32 WorldZBiased = zCoord - zMin; + for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) + { + u64 Mask = 0; + for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) + { + v3i ChunkP = V3i(xChunk, yChunk, zChunk); + /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ + /* v3i NoiseP = V3i(xChunk+1, yChunk+1, zChunk+1)/NoiseUpsampleFactor; */ + v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); + + s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); + s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); + + /* r32 ThisNoiseV = MapNoiseValueToFinal(NoiseValues[NoiseIndex]/OctaveAmplitudeMax)*OctaveAmplitudeMax; */ + r32 ThisNoiseV = NoiseValues[NoiseIndex]; + u64 NoiseChoice = u64(ThisNoiseV > WorldZBiased); + Result += u32(NoiseChoice); + + Mask |= (NoiseChoice << xChunk); + /* SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); */ + + /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ + /* if (NormalIndex > -1) */ + /* { */ + /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ + /* } */ + Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ + /* if (xChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_YELLOW)*u16(NoiseChoice); } */ + /* if (xChunk == Chunk->Dim.x-1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ + if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } + if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_GREEN)*u16(NoiseChoice); } + if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } + } + + SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); + } + } + + Assert(NoiseDim.x >= 66); + Assert(NoiseDim.y >= 66); + Assert(NoiseDim.z >= 66); + + Assert(Chunk->Dim.x == 64); + Assert(Chunk->Dim.y == 66); + Assert(Chunk->Dim.z == 66); + + for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) + { + /* f32 zCoord = 75.f; */ + f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zNoise, Chunk->DimInChunks); + f32 WorldZBiased = zCoord - zMin; + for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) + { + + { + v3i BorderP = V3i(0, yNoise, zNoise); + s32 BorderIndex = GetIndex(BorderP, NoiseDim); + + r32 ThisNoiseV = NoiseValues[BorderIndex]; + + u64 NoiseChoice = ThisNoiseV > WorldZBiased; + /* u64 NoiseChoice = 1ull; */ + /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ + Chunk->xOccupancyBorder[(zNoise-1)*2] |= NoiseChoice << (yNoise-1); + } + + { + v3i BorderP = V3i(65, yNoise, zNoise); + s32 BorderIndex = GetIndex(BorderP, NoiseDim); + + r32 ThisNoiseV = NoiseValues[BorderIndex]; + + u64 NoiseChoice = ThisNoiseV > WorldZBiased; + /* u64 NoiseChoice = 1ull; */ + /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ + Chunk->xOccupancyBorder[((zNoise-1)*2)+1] |= NoiseChoice << (yNoise-1); + } + + } + } + + return Result; +} + link_internal u32 Terrain_Flat( world_chunk *Chunk, v3i NoiseBasis, @@ -51,7 +153,6 @@ Terrain_FBM2D( world_chunk *Chunk, UNPACK_NOISE_PARAMS(NoiseParams); - u32 ChunkSum = 0; random_series GenColorEntropy = {12653763234231}; @@ -111,6 +212,10 @@ Terrain_FBM2D( world_chunk *Chunk, // NOTE(Jesse): Must be true to use _mm256_store_ps, which we do in the 16x version of perlin Assert(u64(NoiseValues) % 32 == 0); + /* u32 Offset = 200'000'000; */ + /* v3i WorldBasis = V3i(Offset, Offset, 0) + NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); */ + v3i WorldBasis = NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); + { u32_8x xChunkResolution = U32_8X(u32(Chunk->DimInChunks.x)); u32 yChunkResolution = u32(Chunk->DimInChunks.y); @@ -124,9 +229,6 @@ Terrain_FBM2D( world_chunk *Chunk, perlin_params *yParams = AllocateAligned(perlin_params, TempArena, NoiseDim.y*Octaves*2, 32); perlin_params *zParams = AllocateAligned(perlin_params, TempArena, NoiseDim.z*Octaves*2, 32); - /* u32 Offset = 200'000'000; */ - /* v3i WorldBasis = V3i(Offset, Offset, 0) + NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); */ - v3i WorldBasis = NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); @@ -192,11 +294,6 @@ Terrain_FBM2D( world_chunk *Chunk, f32 OctaveAmplitudeMax = {}; -#define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ - f32(basis_chunk_point.channel) \ - + f32(offset)*Chunk->DimInChunks.channel \ - + SrcToDest.channel \ - { r32 InteriorAmp = r32(Amplitude); RangeIterator(OctaveIndex, Octaves) @@ -259,99 +356,9 @@ Terrain_FBM2D( world_chunk *Chunk, ComputeNormalsForChunkFromNoiseValues_avx( NoiseValues, NoiseDim, Normals, NormalsDim); /* ComputeNormalsForChunkFromNoiseValues( NoiseValues, NoiseDim, Normals, NormalsDim); */ - { -#if 1 - TIMED_NAMED_BLOCK(NoiseFinalize); - for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) - { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zChunk, Chunk->DimInChunks); - /* f32 zCoord = 75.f; */ - f32 WorldZBiased = zCoord - zMin; - for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) - { - u64 Mask = 0; - for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) - { - v3i ChunkP = V3i(xChunk, yChunk, zChunk); - /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ - /* v3i NoiseP = V3i(xChunk+1, yChunk+1, zChunk+1)/NoiseUpsampleFactor; */ - v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); - - s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); - s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); - - /* r32 ThisNoiseV = MapNoiseValueToFinal(NoiseValues[NoiseIndex]/OctaveAmplitudeMax)*OctaveAmplitudeMax; */ - r32 ThisNoiseV = NoiseValues[NoiseIndex]; - u64 NoiseChoice = u64(ThisNoiseV > WorldZBiased); - ChunkSum += u32(NoiseChoice); - - Mask |= (NoiseChoice << xChunk); - /* SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); */ - - /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ - /* if (NormalIndex > -1) */ - /* { */ - /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ - /* } */ - Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); - /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ - /* if (xChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_YELLOW)*u16(NoiseChoice); } */ - /* if (xChunk == Chunk->Dim.x-1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ - if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } - if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_GREEN)*u16(NoiseChoice); } - if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } - } - - SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); - } - } -#endif - - Assert(NoiseDim.x >= 66); - Assert(NoiseDim.y >= 66); - Assert(NoiseDim.z >= 66); - - Assert(Chunk->Dim.x == 64); - Assert(Chunk->Dim.y == 66); - Assert(Chunk->Dim.z == 66); - - for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) - { - /* f32 zCoord = 75.f; */ - f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zNoise, Chunk->DimInChunks); - f32 WorldZBiased = zCoord - zMin; - for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) - { - - { - v3i BorderP = V3i(0, yNoise, zNoise); - s32 BorderIndex = GetIndex(BorderP, NoiseDim); - - r32 ThisNoiseV = NoiseValues[BorderIndex]; - - u64 NoiseChoice = ThisNoiseV > WorldZBiased; - /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ - Chunk->xOccupancyBorder[(zNoise-1)*2] |= NoiseChoice << (yNoise-1); - } - - { - v3i BorderP = V3i(65, yNoise, zNoise); - s32 BorderIndex = GetIndex(BorderP, NoiseDim); - - r32 ThisNoiseV = NoiseValues[BorderIndex]; - - u64 NoiseChoice = ThisNoiseV > WorldZBiased; - /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ - Chunk->xOccupancyBorder[((zNoise-1)*2)+1] |= NoiseChoice << (yNoise-1); - } - - } - } - } } + u32 ChunkSum = FinalizeOccupancyMasksFromNoiseValues(Chunk, WorldBasis, NoiseDim, NoiseValues, SrcToDest, zMin, PackedHSVColorValue); return ChunkSum; } diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index f6e0ed66c..a398b08be 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -55,12 +55,17 @@ struct work_queue_entry_copy_buffer_set }; struct world_chunk; -struct work_queue_entry_init_world_chunk -{ +struct work_queue_entry_init_world_chunk { world_chunk *Chunk; /* world_chunk_mesh_bitfield MeshBit; */ }; +struct work_queue_entry_build_chunk_mesh +{ + v3 Dim; + f32 *NoiseData; +}; + struct work_queue_entry_rebuild_mesh { world_chunk *Chunk; @@ -220,6 +225,7 @@ poof( d_union work_queue_entry { work_queue_entry_init_world_chunk + work_queue_entry_build_chunk_mesh /* work_queue_entry_copy_buffer */ work_queue_entry_copy_buffer_set work_queue_entry_copy_buffer_ref diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 18474e92c..a8f2da423 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3589,7 +3589,6 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, NoiseParams, UserData )); - // If the chunk didn't have any voxels filled, we're done if (SyntheticChunk->FilledCount) { @@ -3605,12 +3604,6 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, MarkBoundaryVoxels_NoExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->xOccupancyBorder, SyntheticChunk->FaceMasks, SyntheticChunk->Voxels, SynChunkDim, {}, SynChunkDim); } - /* CopyChunkOffset(SyntheticChunk, SynChunkDim, DestChunk, DestChunk->Dim, Global_ChunkApronMinDim); */ - - - /* DestChunk->FilledCount = SyntheticChunk->FilledCount; */ - - Assert(DestChunk->FilledCount == 0); Assert(DestChunk->Dim.x == 64); Assert(DestChunk->Dim.y == 64); @@ -3624,11 +3617,6 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, Assert(DestChunk->FilledCount <= s32(Volume(DestChunk->Dim))); - // NOTE(Jesse): You can use this for debug, but it doesn't work if you change it to NoExteriorFaces - /* MarkBoundaryVoxels_MakeExteriorFaces(DestChunk->Voxels, DestChunk->Dim, {}, DestChunk->Dim); */ - - /* FullBarrier; */ - // NOTE(Jesse): The DestChunk is finalized at the end of the routine /* SetFlag(DestChunk, Chunk_VoxelsInitialized); */ FinalizeChunkInitialization(SyntheticChunk); @@ -3641,46 +3629,12 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, Thread->TempMemory); } -#if 0 - if (SyntheticChunk->FilledCount && (Flags & ChunkInitFlag_GenSmoothLODs) ) - { - untextured_3d_geometry_buffer *TempMesh = AllocateTempWorldChunkMesh(Thread->TempMemory); - ComputeLodMesh( Thread, DestChunk, DestChunk->Dim, SyntheticChunk, SynChunkDim, TempMesh, True); - - if (TempMesh->At) - { - LodMesh = GetPermMeshForChunk(&EngineResources->MeshFreelist, TempMesh, Thread->PermMemory); - DeepCopy(TempMesh, LodMesh); - } - } -#endif - geo_u3d *TempMesh = AllocateTempMesh(Thread->TempMemory, DataType_v3_u8); - /* RebuildWorldChunkMesh(Thread, SyntheticChunk, Global_ChunkApronMinDim, Global_ChunkApronMinDim+DestChunk->Dim, MeshBit_Lod0, TempMesh, Thread->TempMemory); */ RebuildWorldChunkMesh(Thread, SyntheticChunk, {}, {}, MeshBit_Lod0, TempMesh, Thread->TempMemory); TempMesh->At = 0; -#if 0 - if (Flags & ChunkInitFlag_GenLODs) - { - RebuildWorldChunkMesh(Thread, SyntheticChunk, Global_ChunkApronMinDim, Global_ChunkApronMinDim+DestChunk->Dim, MeshBit_Lod1, TempMesh, Thread->TempMemory); - TempMesh->At = 0; - - RebuildWorldChunkMesh(Thread, SyntheticChunk, Global_ChunkApronMinDim, Global_ChunkApronMinDim+DestChunk->Dim, MeshBit_Lod2, TempMesh, Thread->TempMemory); - TempMesh->At = 0; - - RebuildWorldChunkMesh(Thread, SyntheticChunk, Global_ChunkApronMinDim, Global_ChunkApronMinDim+DestChunk->Dim, MeshBit_Lod3, TempMesh, Thread->TempMemory); - TempMesh->At = 0; - - RebuildWorldChunkMesh(Thread, SyntheticChunk, Global_ChunkApronMinDim, Global_ChunkApronMinDim+DestChunk->Dim, MeshBit_Lod4, TempMesh, Thread->TempMemory); - TempMesh->At = 0; - } -#else Assert( (Flags & ChunkInitFlag_GenLODs) == 0); -#endif - - /* Assert( DestChunk->FilledCount == SyntheticChunk->FilledCount); */ } #define FINALIZE_MESH_FOR_CHUNK(Src, Dest, Bit) \ @@ -3748,6 +3702,14 @@ WorkQueueEntryRebuildMesh(world_chunk *Chunk, chunk_init_flags Flags) return Result; } +link_internal work_queue_entry_build_chunk_mesh +WorkQueueEntryBuildChunkMesh(v3 Dim, f32 *NoiseData) +{ + work_queue_entry_build_chunk_mesh Result = { Dim, NoiseData }; + return Result; +} + + link_internal work_queue_entry_update_world_region WorkQueueEntryUpdateWorldRegion(world_edit_mode Mode, world_edit_mode_modifier Modifier, diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 60dfbd8f1..f75afa95f 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -32,6 +32,7 @@ WorldUpdateThread_Main(void *ThreadStartupParams) case type_work_queue_entry_copy_buffer_ref: case type_work_queue_entry_init_asset: case type_work_queue_entry_rebuild_mesh: + case type_work_queue_entry_build_chunk_mesh: case type_work_queue_entry_sim_particle_system: case type_work_queue_entry__align_to_cache_line_helper: case type_work_queue_entry_async_function_call: From a5044a4bec0fc5cade144b067df608ce66350812 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 20 Oct 2024 10:14:23 -0700 Subject: [PATCH 093/421] COMPILER BUG && start GPU noise --- external/bonsai_stdlib | 2 +- ..._work_queue_entry__bonsai_render_command.h | 50 +++-- generated/d_union_bonsai_render_command.h | 6 +- ..._work_queue_entry__bonsai_render_command.h | 22 +- .../shader_magic_gradient_noise_shader.h | 4 +- shaders/noise/gradient.fragmentshader | 17 +- src/engine/asset_loaders.cpp | 4 - src/engine/engine.cpp | 11 +- src/engine/graphics.h | 4 +- src/engine/render/render_init.cpp | 11 +- src/engine/render_command.h | 11 +- src/engine/resources.cpp | 199 +++++++++++++++++- src/engine/terrain.cpp | 10 +- src/engine/terrain.h | 3 + src/engine/world.cpp | 5 +- src/engine/world_chunk.cpp | 9 +- 16 files changed, 287 insertions(+), 81 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 6252ab7ee..d0ff0562a 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 6252ab7ee94edb4f2521c2883db4b35b1850c71e +Subproject commit d0ff0562a8be704e8859936c5cee326d3e25cbbc diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index fed61f822..e069ca5de 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -1,6 +1,19 @@ // src/engine/render_command.h:168:0 +link_internal work_queue_entry__bonsai_render_command +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_initialize_noise_buffer A ) +{ + work_queue_entry__bonsai_render_command Result = { + .Type = type_bonsai_render_command_initialize_noise_buffer, + .bonsai_render_command_initialize_noise_buffer = A, + + + + }; + return Result; +} + link_internal work_queue_entry__bonsai_render_command WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_clear_all_framebuffers A ) { @@ -166,19 +179,6 @@ WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_draw_all_entities A ) - }; - return Result; -} - -link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_initialize_noise_buffer A ) -{ - work_queue_entry__bonsai_render_command Result = { - .Type = type_bonsai_render_command_initialize_noise_buffer, - .bonsai_render_command_initialize_noise_buffer = A, - - - }; return Result; } @@ -236,6 +236,17 @@ WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_gl_timer_read_value_and } +link_internal bonsai_render_command_initialize_noise_buffer +BonsaiRenderCommandInitializeNoiseBuffer( world_chunk* Chunk ) +{ + bonsai_render_command_initialize_noise_buffer Reuslt = { + .Chunk = Chunk + }; + + + return Reuslt; +} + link_internal bonsai_render_command_clear_all_framebuffers BonsaiRenderCommandClearAllFramebuffers( u32 Ignored ) { @@ -400,19 +411,6 @@ BonsaiRenderCommandDrawAllEntities( shader* Shader ) return Reuslt; } -link_internal bonsai_render_command_initialize_noise_buffer -BonsaiRenderCommandInitializeNoiseBuffer( v3 ChunkSize , f32* NoiseData ) -{ - bonsai_render_command_initialize_noise_buffer Reuslt = { - .ChunkSize = ChunkSize -, - .NoiseData = NoiseData - }; - - - return Reuslt; -} - link_internal bonsai_render_command_gl_timer_init BonsaiRenderCommandGlTimerInit( u32* GlTimerObject ) { diff --git a/generated/d_union_bonsai_render_command.h b/generated/d_union_bonsai_render_command.h index a75795f68..6540065c7 100644 --- a/generated/d_union_bonsai_render_command.h +++ b/generated/d_union_bonsai_render_command.h @@ -1,8 +1,9 @@ -// src/engine/render_command.h:134:0 +// src/engine/render_command.h:133:0 enum work_queue_entry__bonsai_render_command_type { type_work_queue_entry__bonsai_render_command_noop, + type_bonsai_render_command_initialize_noise_buffer, type_bonsai_render_command_clear_all_framebuffers, type_bonsai_render_command_allocate_texture, type_bonsai_render_command_deallocate_texture, @@ -16,7 +17,6 @@ enum work_queue_entry__bonsai_render_command_type type_bonsai_render_command_set_shader_uniform, type_bonsai_render_command_draw_world_chunk_draw_list, type_bonsai_render_command_draw_all_entities, - type_bonsai_render_command_initialize_noise_buffer, type_bonsai_render_command_gl_timer_init, type_bonsai_render_command_gl_timer_start, type_bonsai_render_command_gl_timer_end, @@ -29,6 +29,7 @@ struct work_queue_entry__bonsai_render_command union { + struct bonsai_render_command_initialize_noise_buffer bonsai_render_command_initialize_noise_buffer; struct bonsai_render_command_clear_all_framebuffers bonsai_render_command_clear_all_framebuffers; struct bonsai_render_command_allocate_texture bonsai_render_command_allocate_texture; struct bonsai_render_command_deallocate_texture bonsai_render_command_deallocate_texture; @@ -42,7 +43,6 @@ struct work_queue_entry__bonsai_render_command struct bonsai_render_command_set_shader_uniform bonsai_render_command_set_shader_uniform; struct bonsai_render_command_draw_world_chunk_draw_list bonsai_render_command_draw_world_chunk_draw_list; struct bonsai_render_command_draw_all_entities bonsai_render_command_draw_all_entities; - struct bonsai_render_command_initialize_noise_buffer bonsai_render_command_initialize_noise_buffer; struct bonsai_render_command_gl_timer_init bonsai_render_command_gl_timer_init; struct bonsai_render_command_gl_timer_start bonsai_render_command_gl_timer_start; struct bonsai_render_command_gl_timer_end bonsai_render_command_gl_timer_end; diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index 0cdfb2200..8339b140a 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -1,5 +1,16 @@ // src/engine/render_command.cpp:27:0 +link_internal void +PushBonsaiRenderCommandInitializeNoiseBuffer( + work_queue *RenderQueue + , world_chunk* Chunk +) +{ + work_queue_entry Work = WorkQueueEntry( + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandInitializeNoiseBuffer( Chunk ))); + + PushWorkQueueEntry(RenderQueue, &Work); +} link_internal void PushBonsaiRenderCommandClearAllFramebuffers( work_queue *RenderQueue @@ -144,17 +155,6 @@ PushBonsaiRenderCommandDrawAllEntities( PushWorkQueueEntry(RenderQueue, &Work); } link_internal void -PushBonsaiRenderCommandInitializeNoiseBuffer( - work_queue *RenderQueue - , v3 ChunkSize , f32* NoiseData -) -{ - work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandInitializeNoiseBuffer( ChunkSize , NoiseData ))); - - PushWorkQueueEntry(RenderQueue, &Work); -} -link_internal void PushBonsaiRenderCommandGlTimerInit( work_queue *RenderQueue , u32* GlTimerObject diff --git a/generated/shader_magic_gradient_noise_shader.h b/generated/shader_magic_gradient_noise_shader.h index 9d3d22565..c5d966b9f 100644 --- a/generated/shader_magic_gradient_noise_shader.h +++ b/generated/shader_magic_gradient_noise_shader.h @@ -1,14 +1,14 @@ // src/engine/graphics.h:14:0 link_internal void -InitializeGradientNoiseShader( gradient_noise_shader *Struct , v3 ChunkSize ) +InitializeGradientNoiseShader( gradient_noise_shader *Struct , v3 ChunkDim ) { Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/noise/gradient.fragmentshader")); u32 UniformIndex = 0; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->ChunkSize, "ChunkSize"); + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->ChunkDim, "ChunkDim"); ++UniformIndex; if (UniformIndex != 1 ) diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader index e59549618..09d35e494 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/noise/gradient.fragmentshader @@ -154,6 +154,18 @@ float gradient_noise( in vec3 p ) } #endif +float structured_noise( in vec3 p ) +{ + if (p.x < 32.f && p.y < 32.f && p.z < 32.f) + { + return 1.f; + } + else + { + return -1.f; + } +} + void main() { v2 _UV = UV*64.f; @@ -162,13 +174,14 @@ void main() f32 y = f32(s32(_UV.y) % 64); f32 z = _UV.y / 64; - v3 xyz = v3(x,y,z) * 25; + v3 xyz = v3(x,y,z)*2; /* for (s32 Octave = 0; Octave < 1; ++Octave) */ { /* Output += gradient_noise_derivs(xyz / Octave).x; */ - Output += gradient_noise_derivs(xyz).x; + /* Output += gradient_noise_derivs(xyz).x; */ /* Output += gradient_noise(xyz); */ + Output += structured_noise(xyz); } /* Output = (UV.x + UV.y) / 2.f; */ } diff --git a/src/engine/asset_loaders.cpp b/src/engine/asset_loaders.cpp index b45c6336c..e69de29bb 100644 --- a/src/engine/asset_loaders.cpp +++ b/src/engine/asset_loaders.cpp @@ -1,4 +0,0 @@ -#include -#include -#include - diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index cf9e2b164..5b95168c6 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -14,11 +14,14 @@ #include #include #include -#include #include + +#include #include -#include -#include + +#include +#include +#include #include #include @@ -30,6 +33,8 @@ #include #include +#include + #include // NOTE(Jesse): generated code for ser/des #include // NOTE(Jesse): Functions acting as basis for ser/des #include diff --git a/src/engine/graphics.h b/src/engine/graphics.h index fc1f1425f..000faaedc 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -6,9 +6,9 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader { shader Program; shader_uniform Uniforms[1]; - texture ChunkData; + texture ChunkTexture; - v3 ChunkSize; poof(@uniform) + v3 ChunkDim; poof(@uniform) }; poof(shader_magic(gradient_noise_shader)) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 54ca4563b..28569a199 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -759,9 +759,11 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr { - v2i ChunkDim = V2i(64, 64*64); - InitializeGradientNoiseShader(&Result->GpuNoise.GradientShader, V3(64)); + gradient_noise_shader *GradientShader = &Result->GpuNoise.GradientShader; + v3 ChunkDim = V3(66, 66, 66); + GradientShader->ChunkDim = ChunkDim; + InitializeGradientNoiseShader(&Result->GpuNoise.GradientShader, ChunkDim); Result->GpuNoise.FBO = GenFramebuffer(); @@ -770,8 +772,9 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr GL.BindFramebuffer(GL_FRAMEBUFFER, Result->GpuNoise.FBO.ID); - texture ChunkDataTexture = MakeTexture_SingleChannel(ChunkDim, CSz("PerlinNoiseTexture"), False); - FramebufferTexture(&Result->GpuNoise.FBO, &ChunkDataTexture); + v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); + GradientShader->ChunkTexture = MakeTexture_SingleChannel(TextureDim, CSz("PerlinNoiseTexture"), False); + FramebufferTexture(&Result->GpuNoise.FBO, &GradientShader->ChunkTexture); SetDrawBuffers(&Result->GpuNoise.FBO); Ensure(CheckAndClearFramebuffer()); diff --git a/src/engine/render_command.h b/src/engine/render_command.h index cc0fc2f52..932785151 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -105,8 +105,7 @@ struct bonsai_render_command_do_stuff struct bonsai_render_command_initialize_noise_buffer { - v3 ChunkSize; // TODO(Jesse): Make this v3i - f32 *NoiseData; + world_chunk *Chunk; }; struct bonsai_render_command_gl_timer_init @@ -133,6 +132,9 @@ struct bonsai_render_command_gl_timer_read_value_and_histogram poof( d_union work_queue_entry__bonsai_render_command { + bonsai_render_command_initialize_noise_buffer + + bonsai_render_command_clear_all_framebuffers bonsai_render_command_allocate_texture @@ -155,8 +157,6 @@ poof( bonsai_render_command_draw_world_chunk_draw_list bonsai_render_command_draw_all_entities - bonsai_render_command_initialize_noise_buffer - bonsai_render_command_gl_timer_init bonsai_render_command_gl_timer_start bonsai_render_command_gl_timer_end @@ -193,3 +193,6 @@ PushDoStuffCommand(work_queue *RenderQueue); link_internal void PushBonsaiRenderCommandAllocateTexture(work_queue *, texture *, void *); + +link_internal void +PushBonsaiRenderCommandInitializeNoiseBuffer( work_queue *RenderQueue , world_chunk* Chunk ); diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 3c5be2253..7c2a50aea 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -222,22 +222,201 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; - { tmatch(bonsai_render_command_initialize_noise_buffer, RC, Command) + { tmatch(bonsai_render_command_initialize_noise_buffer, RC, _Command) + /* Command = 0; */ + TIMED_NAMED_BLOCK(bonsai_render_command_initialize_noise_buffer); + bonsai_render_command_initialize_noise_buffer C = RC->bonsai_render_command_initialize_noise_buffer; + + + world_chunk **Chunk2 = &C.Chunk; + world_chunk *Chunk1 = C.Chunk; + world_chunk *Chunk = Chunk1; + + Info("(%llu) (%llu)", u64(Chunk), u64(Chunk1)); + Assert(s64(Chunk) == s64(Chunk1)); + + /* world_chunk *Chunk = C.Chunk; */ auto *Shader = &Graphics->GpuNoise.GradientShader; - Assert(Command->ChunkSize == Shader->ChunkSize); - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->GpuNoise.FBO.ID); + v3i Apron = V3i(2, 2, 2); + v3 NoiseDim = V3(Shader->ChunkDim); + Assert(V3(Chunk1->Dim+Apron) == NoiseDim); + + v2i ViewportSize = V2i(s32(Chunk1->Dim.x), s32(Chunk1->Dim.y*Chunk1->Dim.z)); + + { + TIMED_NAMED_BLOCK(Draw); + GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->GpuNoise.FBO.ID); + + SetViewport(ViewportSize); + UseShader(Shader); + RenderQuad(); + AssertNoGlErrors; + } - v2i ViewportSize = V2i(s32(Command->ChunkSize.x), s32(Command->ChunkSize.y*Command->ChunkSize.z)); - SetViewport(ViewportSize); - UseShader(Shader); - RenderQuad(); - GL.GetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_FLOAT, Command->NoiseData); + s32 NoiseElementCount = s32(Volume(NoiseDim)); + r32 *NoiseValues; +#if 1 + s32 NoiseByteCount = NoiseElementCount*s32(sizeof(f32)); + { + TIMED_NAMED_BLOCK(GenPboAndInitTransfer); + u32 PBO; + GL.GenBuffers(1, &PBO); + AssertNoGlErrors; + GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); + GL.BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); + AssertNoGlErrors; + GL.ReadPixels(0, 0, ViewportSize.x, ViewportSize.y, GL_RED, GL_FLOAT, 0); + AssertNoGlErrors; + } - auto E = WorkQueueEntry(WorkQueueEntryBuildChunkMesh(Command->ChunkSize, Command->NoiseData)); - PushWorkQueueEntry(&Plat->LowPriority, &E); + { + TIMED_NAMED_BLOCK(Fence); + gl_fence Fence = GL.FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + + b32 Done = False; + while (!Done) + { + u32 SyncStatus = GL.ClientWaitSync(Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); + switch(SyncStatus) + { + case GL_ALREADY_SIGNALED: + case GL_CONDITION_SATISFIED: + { + Done = True; + } break; + + case GL_TIMEOUT_EXPIRED: + { + SyncStatus = GL.ClientWaitSync(Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); + } break; + + case GL_WAIT_FAILED: + { + SoftError("Error waiting on gl sync object"); + Done = True; + } break; + } + } + AssertNoGlErrors; + } + + /* SleepMs(1); */ + + { + HISTOGRAM_FUNCTION(); + TIMED_NAMED_BLOCK(MapBuffer); + NoiseValues = Cast(f32*, GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); + AssertNoGlErrors; + } +#else + NoiseValues = AllocateAligned(r32, GetTranArena(), NoiseElementCount, 32); + { + TIMED_NAMED_BLOCK(BindTexture); + GL.BindTexture(GL_TEXTURE_2D, Shader->ChunkTexture.ID); + } + { + HISTOGRAM_FUNCTION(); + TIMED_NAMED_BLOCK(GetTexImage); + GL.GetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_FLOAT, NoiseValues); + } +#endif + Assert(NoiseValues); + + /* auto E = WorkQueueEntry(WorkQueueEntryBuildChunkMesh(C->ChunkSize, C->NoiseValues)); */ + /* PushWorkQueueEntry(&Plat->LowPriority, &E); */ + + world_chunk *DestChunk = Chunk1; + world_chunk *SynChunk = AllocateWorldChunk({}, Chunk1->Dim + V3i(0, 2, 2), V3i(1), GetTranArena()); + SynChunk->Flags = Chunk_Queued; + v3i WorldBasis = {}; + v3i SynChunkDim = SynChunk->Dim; + v3i SrcToDest = {}; + s64 zMin = 0; + u16 PackedHSVColorValue = PackHSVColor(HSV_GREEN); + b32 MakeExteriorFaces = False; + + u32 ChunkSum = FinalizeOccupancyMasksFromNoiseValues(SynChunk, WorldBasis, V3i(NoiseDim), NoiseValues, SrcToDest, zMin, PackedHSVColorValue); + + if (ChunkSum) + { + if (MakeExteriorFaces) + { + MarkBoundaryVoxels_MakeExteriorFaces(SynChunk->Occupancy, SynChunk->Voxels, SynChunkDim, Global_ChunkApronMinDim, SynChunkDim-Global_ChunkApronMaxDim); + } + else + { + MarkBoundaryVoxels_NoExteriorFaces(SynChunk->Occupancy, SynChunk->xOccupancyBorder, SynChunk->FaceMasks, SynChunk->Voxels, SynChunkDim, {}, SynChunkDim); + } + + Assert(DestChunk->FilledCount == 0); + Assert(DestChunk->Dim.x == 64); + Assert(DestChunk->Dim.y == 64); + Assert(DestChunk->Dim.z == 64); + RangeIterator(z, 64) + RangeIterator(y, 64) + { + u64 Occ = DestChunk->Occupancy[y + z*64]; + DestChunk->FilledCount += CountBitsSet_Kernighan(Occ); + } + + Assert(DestChunk->FilledCount <= s32(Volume(DestChunk->Dim))); + + // NOTE(Jesse): The DestChunk is finalized at the end of the routine + /* SetFlag(DestChunk, Chunk_VoxelsInitialized); */ + FinalizeChunkInitialization(SynChunk); + +#if 0 + if (Flags & ChunkInitFlag_ComputeStandingSpots) + { + NotImplemented; + ComputeStandingSpots( SynChunkDim, SynChunk, {{1,1,0}}, {{0,0,1}}, Global_StandingSpotDim, + DestChunk->Dim, 0, &DestChunk->StandingSpots, + Thread->TempMemory); + } +#endif + + auto *Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); + geo_u3d *TempMesh = AllocateTempMesh(Thread->TempMemory, DataType_v3_u8); + + RebuildWorldChunkMesh(Thread, SynChunk, {}, {}, MeshBit_Lod0, TempMesh, Thread->TempMemory); + TempMesh->At = 0; + + /* Assert( (Flags & ChunkInitFlag_GenLODs) == 0); */ + +#define FINALIZE_MESH_FOR_CHUNK(Src, Dest, Bit) \ + { \ + auto *SrcMesh = (Src)->Meshes.E[ToIndex(Bit)]; \ + if (SrcMesh) { \ + if (SrcMesh->At) { \ + DestChunk->HasMesh = True; \ + AtomicReplaceMesh(&(Dest)->Meshes, Bit, SrcMesh, SrcMesh->Timestamp); \ + } else { \ + DeallocateMesh(EngineResources, SrcMesh); \ + } \ + } \ + } + + { + auto *EngineResources = GetEngineResources(); + TIMED_NAMED_BLOCK(Chunk_Finalize); + FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod0 ); + /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod1 ); */ + /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod2 ); */ + /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod3 ); */ + /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod4 ); */ +#undef FINALIZE_MESH_FOR_CHUNK + + Assert( (DestChunk->Flags & Chunk_VoxelsInitialized) == 0); + Assert( DestChunk->FilledCount <= s32(Volume(SynChunk))); + + /* if (DestChunk->WorldP == V3i(0)) { RuntimeBreak(); } */ + + FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*,DestChunk))); + } + } } break; diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 2c8e8eb0e..27291f662 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -12,9 +12,10 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zChunk, Chunk->DimInChunks); + f32 zCoord = 0.f; //__COMPUTE_NOISE_INPUT(z, WorldBasis, zChunk, Chunk->DimInChunks); /* f32 zCoord = 75.f; */ - f32 WorldZBiased = zCoord - zMin; + /* f32 WorldZBiased = zCoord - zMin; */ + f32 WorldZBiased = 0.f; for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) { u64 Mask = 0; @@ -65,8 +66,9 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) { /* f32 zCoord = 75.f; */ - f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zNoise, Chunk->DimInChunks); - f32 WorldZBiased = zCoord - zMin; + /* f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zNoise, Chunk->DimInChunks); */ + /* f32 WorldZBiased = zCoord - zMin; */ + f32 WorldZBiased = 0.f; for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) { diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 973386931..e8509ede7 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -302,3 +302,6 @@ Terrain_Voronoi3D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void link_internal u32 Terrain_Voronoi2D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); + +link_internal u32 +FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, f32 *NoiseValues, v3i SrcToDest, s64 zMin, u16 PackedHSVColorValue); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 988eaf091..a7a11bd76 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -507,7 +507,7 @@ poof(generate_cursor(octree_node_ptr)) #define OCTREE_PRIORITY_QUEUE_LIST_COUNT (512) #define OCTREE_PRIORITY_QUEUE_LIST_LENGTH (128) -#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (16) +#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (1) struct octree_node_priority_queue { octree_node_ptr_cursor Lists[OCTREE_PRIORITY_QUEUE_LIST_COUNT]; @@ -970,7 +970,8 @@ MaintainWorldOctree(engine_resources *Engine) /* Node->Chunk = AllocateWorldChunk(Node->WorldP, World->ChunkDim, Node->Resolution, World->ChunkMemory); */ } - QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); + /* QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); */ + QueueChunkForInit(&Plat->RenderQ, Node->Chunk, MeshBit_Lod0); ++Stats.NewQueues; if (++NumQueuedThisFrame == MaxToQueueThisFrame) goto done_queueing_nodes; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index a8f2da423..47d74306c 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3409,6 +3409,7 @@ QueueChunkForInit(work_queue *Queue, world_chunk *Chunk, world_chunk_mesh_bitfie /* DebugLine("Queuing Chunk (%p)(%d, %d, %d)", Chunk, Chunk->WorldP.x, Chunk->WorldP.y, Chunk->WorldP.z); */ +#if 0 work_queue_entry Entry = {}; { Entry.Type = type_work_queue_entry_init_world_chunk; @@ -3417,11 +3418,13 @@ QueueChunkForInit(work_queue *Queue, world_chunk *Chunk, world_chunk_mesh_bitfie /* Job->MeshBit = MeshBit; */ } - Assert( NotSet(Chunk->Flags, Chunk_Queued) ); - SetFlag(&Chunk->Flags, Chunk_Queued); PushWorkQueueEntry(Queue, &Entry); +#else + PushBonsaiRenderCommandInitializeNoiseBuffer(Queue, Chunk); +#endif - return; + Assert( NotSet(Chunk->Flags, Chunk_Queued) ); + SetFlag(&Chunk->Flags, Chunk_Queued); } inline void From 7324d8f986ea0d0e1a403b9dd2503ee95c2766a8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 20 Oct 2024 19:35:29 -0700 Subject: [PATCH 094/421] Pull chunk mesh gen code out of render thread --- .../asyncify_render_function_c_DrawLod.h | 2 +- ...yncify_render_function_c_RenderToTexture.h | 2 +- .../asyncify_render_function_h_DrawLod.h | 2 +- ...yncify_render_function_h_RenderToTexture.h | 2 +- generated/block_array_bitmap_688853862.h | 29 +- .../block_array_c_asset_thumbnail_688856411.h | 29 +- .../block_array_c_shader_ptr_688853971.h | 29 +- generated/block_array_c_texture_688856411.h | 29 +- generated/block_array_c_u32_688856411.h | 29 +- generated/block_array_c_u8_cursor_688856411.h | 29 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 255 ++++++++++++++++++ generated/block_array_entity_688856407.h | 29 +- generated/block_array_entity_ptr_688856411.h | 29 +- ...lock_array_file_traversal_node_688853862.h | 29 +- ...lock_array_gpu_readback_buffer_688853862.h | 255 ++++++++++++++++++ generated/block_array_member_info_688856411.h | 29 +- generated/block_array_model_688856411.h | 29 +- .../block_array_standing_spot_688853862.h | 29 +- generated/block_array_texture_ptr_688856411.h | 29 +- generated/block_array_vox_data_688856411.h | 29 +- ...lock_array_voxel_stack_element_688853862.h | 29 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 255 ++++++++++++++++++ .../block_array_world_chunk_ptr_688853862.h | 29 +- ..._work_queue_entry__bonsai_render_command.h | 26 +- generated/d_union_bonsai_render_command.h | 4 +- .../d_union_constructors_work_queue_entry.h | 2 +- generated/d_union_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 31 +++ generated/for_datatypes_0XxWqGSZ.h | 21 +- generated/for_datatypes_fkubhsYl.h | 21 +- generated/for_datatypes_kv3WBTai.h | 21 +- .../gen_constructor_gpu_readback_buffer.h | 15 ++ ..._work_queue_entry__bonsai_render_command.h | 11 + jesse.bonsai.rdbg | Bin 14214 -> 15953 bytes jesse.make.sh | 4 +- jesse.tests.rdbg | Bin 7446 -> 7576 bytes make.sh | 2 +- shaders/noise/gradient.fragmentshader | 6 +- src/engine/api.cpp | 107 ++++++++ src/engine/debug.h | 2 +- src/engine/gpu_mapped_buffer.cpp | 2 +- src/engine/graphics.h | 19 ++ src/engine/render/render_init.cpp | 4 +- src/engine/render_command.h | 13 + src/engine/resources.cpp | 217 +++++---------- src/engine/work_queue.h | 7 +- src/engine/world.cpp | 9 +- src/engine/world_chunk.cpp | 4 +- src/tests/containers/block_array.cpp | 17 +- 49 files changed, 1515 insertions(+), 289 deletions(-) create mode 100644 generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h create mode 100644 generated/block_array_gpu_readback_buffer_688853862.h create mode 100644 generated/block_array_work_queue_entry_build_chunk_mesh_688853862.h create mode 100644 generated/gen_constructor_gpu_readback_buffer.h diff --git a/generated/asyncify_render_function_c_DrawLod.h b/generated/asyncify_render_function_c_DrawLod.h index daded2139..1772a5bfb 100644 --- a/generated/asyncify_render_function_c_DrawLod.h +++ b/generated/asyncify_render_function_c_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:313:0 +// src/engine/work_queue.h:318:0 link_internal void DrawLod_Async(work_queue *Queue,engine_resources *Engine ,shader *Shader ,lod_element_buffer *Meshes ,r32 DistanceSquared ,v3 Basis ,Quaternion Rotation ,v3 Scale ) diff --git a/generated/asyncify_render_function_c_RenderToTexture.h b/generated/asyncify_render_function_c_RenderToTexture.h index 94a456239..3269d9e29 100644 --- a/generated/asyncify_render_function_c_RenderToTexture.h +++ b/generated/asyncify_render_function_c_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:310:0 +// src/engine/work_queue.h:315:0 link_internal void RenderToTexture_Async(work_queue *Queue,engine_resources *Engine ,asset_thumbnail *Thumb ,lod_element_buffer *Meshes ,v3 Offset ,camera *Camera ) diff --git a/generated/asyncify_render_function_h_DrawLod.h b/generated/asyncify_render_function_h_DrawLod.h index 463a8f0df..f072122ba 100644 --- a/generated/asyncify_render_function_h_DrawLod.h +++ b/generated/asyncify_render_function_h_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:168:0 +// src/engine/work_queue.h:172:0 struct draw_lod_async_params poof(@async_function_params) { diff --git a/generated/asyncify_render_function_h_RenderToTexture.h b/generated/asyncify_render_function_h_RenderToTexture.h index 0f6d74e15..1823c8614 100644 --- a/generated/asyncify_render_function_h_RenderToTexture.h +++ b/generated/asyncify_render_function_h_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:165:0 +// src/engine/work_queue.h:169:0 struct render_to_texture_async_params poof(@async_function_params) { diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index b931be9e8..12a1fcfa0 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -192,17 +192,32 @@ RemoveUnordered(bitmap_block_array *Array, bitmap_block_array_index Index) if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - bitmap_block *Current = Array->First; - bitmap_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + bitmap_block *Current = Array->First; + bitmap_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 335b72e02..814094ad9 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -30,17 +30,32 @@ RemoveUnordered(asset_thumbnail_block_array *Array, asset_thumbnail_block_array_ if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - asset_thumbnail_block *Current = Array->First; - asset_thumbnail_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + asset_thumbnail_block *Current = Array->First; + asset_thumbnail_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index 95a477cb1..09728b13a 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -30,17 +30,32 @@ RemoveUnordered(shader_ptr_block_array *Array, shader_ptr_block_array_index Inde if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - shader_ptr_block *Current = Array->First; - shader_ptr_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + shader_ptr_block *Current = Array->First; + shader_ptr_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index 20b384414..8e28e33a1 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -30,17 +30,32 @@ RemoveUnordered(texture_block_array *Array, texture_block_array_index Index) if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - texture_block *Current = Array->First; - texture_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + texture_block *Current = Array->First; + texture_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index 5d3d64539..bd0053460 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -30,17 +30,32 @@ RemoveUnordered(u32_block_array *Array, u32_block_array_index Index) if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - u32_block *Current = Array->First; - u32_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + u32_block *Current = Array->First; + u32_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index 532bc11a6..db4ae7291 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -30,17 +30,32 @@ RemoveUnordered(u8_cursor_block_array *Array, u8_cursor_block_array_index Index) if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - u8_cursor_block *Current = Array->First; - u8_cursor_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + u8_cursor_block *Current = Array->First; + u8_cursor_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h new file mode 100644 index 000000000..fcf3a7fce --- /dev/null +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -0,0 +1,255 @@ +// src/engine/graphics.h:66:0 + +struct dummy_work_queue_entry_build_chunk_mesh_block +{ + u32 Index; + u32 At; + dummy_work_queue_entry_build_chunk_mesh *Elements; + dummy_work_queue_entry_build_chunk_mesh_block *Next; +}; + +struct dummy_work_queue_entry_build_chunk_mesh_block_array_index +{ + dummy_work_queue_entry_build_chunk_mesh_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct dummy_work_queue_entry_build_chunk_mesh_block_array +{ + dummy_work_queue_entry_build_chunk_mesh_block *First; + dummy_work_queue_entry_build_chunk_mesh_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +typedef dummy_work_queue_entry_build_chunk_mesh_block_array dummy_work_queue_entry_build_chunk_mesh_paged_list; + +link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index +operator++(dummy_work_queue_entry_build_chunk_mesh_block_array_index &I0) +{ + if (I0.Block) + { + if (I0.ElementIndex == 8-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<(dummy_work_queue_entry_build_chunk_mesh_block_array_index I0, dummy_work_queue_entry_build_chunk_mesh_block_array_index I1) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex(dummy_work_queue_entry_build_chunk_mesh_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*8); + return Result; +} + +link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index +ZerothIndex(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +{ + dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {}; + Result.Block = Arr->First; + /* Assert(Result.Block->Index == 0); */ + return Result; +} + +link_internal umm +TotalElements(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 8) + Arr->Current->At; + } + return Result; +} + +link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index +LastIndex(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +{ + dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index +AtElements(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +{ + dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal dummy_work_queue_entry_build_chunk_mesh * +GetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) +{ + dummy_work_queue_entry_build_chunk_mesh *Result = {}; + if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + return Result; +} + +link_internal dummy_work_queue_entry_build_chunk_mesh * +GetPtr(dummy_work_queue_entry_build_chunk_mesh_block *Block, umm Index) +{ + dummy_work_queue_entry_build_chunk_mesh *Result = 0; + if (Index < Block->At) { Result = Block->Elements + Index; } + return Result; +} + +link_internal dummy_work_queue_entry_build_chunk_mesh * +GetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + umm AtBlock = 0; + dummy_work_queue_entry_build_chunk_mesh_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + dummy_work_queue_entry_build_chunk_mesh *Result = Block->Elements+ElementIndex; + return Result; +} + +link_internal dummy_work_queue_entry_build_chunk_mesh * +TryGetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + dummy_work_queue_entry_build_chunk_mesh *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(dummy_work_queue_entry_build_chunk_mesh_block *Block) +{ + return Block->At; +} + + +link_internal dummy_work_queue_entry_build_chunk_mesh_block* +Allocate_dummy_work_queue_entry_build_chunk_mesh_block(memory_arena *Memory) +{ + dummy_work_queue_entry_build_chunk_mesh_block *Result = Allocate(dummy_work_queue_entry_build_chunk_mesh_block, Memory, 1); + Result->Elements = Allocate(dummy_work_queue_entry_build_chunk_mesh, Memory, 8); + return Result; +} + +link_internal cs +CS(dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal void +RemoveUnordered(dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) +{ + dummy_work_queue_entry_build_chunk_mesh_block_array_index LastI = LastIndex(Array); + + dummy_work_queue_entry_build_chunk_mesh *Element = GetPtr(Array, Index); + dummy_work_queue_entry_build_chunk_mesh *LastElement = GetPtr(Array, LastI); + + *Element = *LastElement; + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + dummy_work_queue_entry_build_chunk_mesh_block *Current = Array->First; + dummy_work_queue_entry_build_chunk_mesh_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal dummy_work_queue_entry_build_chunk_mesh * +Push(dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Element) +{ + if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + + if (Array->First == 0) { Array->First = Allocate_dummy_work_queue_entry_build_chunk_mesh_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 8) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + dummy_work_queue_entry_build_chunk_mesh_block *Next = Allocate_dummy_work_queue_entry_build_chunk_mesh_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + dummy_work_queue_entry_build_chunk_mesh *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + + diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index d81d4e12e..f70449469 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -192,17 +192,32 @@ RemoveUnordered(entity_block_array *Array, entity_block_array_index Index) if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - entity_block *Current = Array->First; - entity_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + entity_block *Current = Array->First; + entity_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h index 424fc69e6..6c833292a 100644 --- a/generated/block_array_entity_ptr_688856411.h +++ b/generated/block_array_entity_ptr_688856411.h @@ -192,17 +192,32 @@ RemoveUnordered(entity_ptr_block_array *Array, entity_ptr_block_array_index Inde if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - entity_ptr_block *Current = Array->First; - entity_ptr_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + entity_ptr_block *Current = Array->First; + entity_ptr_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index d1276ec3d..86e54a9a1 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -192,17 +192,32 @@ RemoveUnordered(file_traversal_node_block_array *Array, file_traversal_node_bloc if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - file_traversal_node_block *Current = Array->First; - file_traversal_node_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + file_traversal_node_block *Current = Array->First; + file_traversal_node_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h new file mode 100644 index 000000000..f87097ab1 --- /dev/null +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -0,0 +1,255 @@ +// src/engine/graphics.h:55:0 + +struct gpu_readback_buffer_block +{ + u32 Index; + u32 At; + gpu_readback_buffer *Elements; + gpu_readback_buffer_block *Next; +}; + +struct gpu_readback_buffer_block_array_index +{ + gpu_readback_buffer_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct gpu_readback_buffer_block_array +{ + gpu_readback_buffer_block *First; + gpu_readback_buffer_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +typedef gpu_readback_buffer_block_array gpu_readback_buffer_paged_list; + +link_internal gpu_readback_buffer_block_array_index +operator++(gpu_readback_buffer_block_array_index &I0) +{ + if (I0.Block) + { + if (I0.ElementIndex == 8-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<(gpu_readback_buffer_block_array_index I0, gpu_readback_buffer_block_array_index I1) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex(gpu_readback_buffer_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*8); + return Result; +} + +link_internal gpu_readback_buffer_block_array_index +ZerothIndex(gpu_readback_buffer_block_array *Arr) +{ + gpu_readback_buffer_block_array_index Result = {}; + Result.Block = Arr->First; + /* Assert(Result.Block->Index == 0); */ + return Result; +} + +link_internal umm +TotalElements(gpu_readback_buffer_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 8) + Arr->Current->At; + } + return Result; +} + +link_internal gpu_readback_buffer_block_array_index +LastIndex(gpu_readback_buffer_block_array *Arr) +{ + gpu_readback_buffer_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal gpu_readback_buffer_block_array_index +AtElements(gpu_readback_buffer_block_array *Arr) +{ + gpu_readback_buffer_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal gpu_readback_buffer * +GetPtr(gpu_readback_buffer_block_array *Arr, gpu_readback_buffer_block_array_index Index) +{ + gpu_readback_buffer *Result = {}; + if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + return Result; +} + +link_internal gpu_readback_buffer * +GetPtr(gpu_readback_buffer_block *Block, umm Index) +{ + gpu_readback_buffer *Result = 0; + if (Index < Block->At) { Result = Block->Elements + Index; } + return Result; +} + +link_internal gpu_readback_buffer * +GetPtr(gpu_readback_buffer_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + umm AtBlock = 0; + gpu_readback_buffer_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + gpu_readback_buffer *Result = Block->Elements+ElementIndex; + return Result; +} + +link_internal gpu_readback_buffer * +TryGetPtr(gpu_readback_buffer_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + gpu_readback_buffer *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(gpu_readback_buffer_block *Block) +{ + return Block->At; +} + + +link_internal gpu_readback_buffer_block* +Allocate_gpu_readback_buffer_block(memory_arena *Memory) +{ + gpu_readback_buffer_block *Result = Allocate(gpu_readback_buffer_block, Memory, 1); + Result->Elements = Allocate(gpu_readback_buffer, Memory, 8); + return Result; +} + +link_internal cs +CS(gpu_readback_buffer_block_array_index Index) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal void +RemoveUnordered(gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) +{ + gpu_readback_buffer_block_array_index LastI = LastIndex(Array); + + gpu_readback_buffer *Element = GetPtr(Array, Index); + gpu_readback_buffer *LastElement = GetPtr(Array, LastI); + + *Element = *LastElement; + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + gpu_readback_buffer_block *Current = Array->First; + gpu_readback_buffer_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal gpu_readback_buffer * +Push(gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element) +{ + if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + + if (Array->First == 0) { Array->First = Allocate_gpu_readback_buffer_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 8) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + gpu_readback_buffer_block *Next = Allocate_gpu_readback_buffer_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + gpu_readback_buffer *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + + diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index e22315a09..97b7677e7 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -192,17 +192,32 @@ RemoveUnordered(member_info_block_array *Array, member_info_block_array_index In if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - member_info_block *Current = Array->First; - member_info_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + member_info_block *Current = Array->First; + member_info_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index dda3b7ebc..57de31cdf 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -192,17 +192,32 @@ RemoveUnordered(model_block_array *Array, model_block_array_index Index) if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - model_block *Current = Array->First; - model_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + model_block *Current = Array->First; + model_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 1675a6132..8a8a035ee 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -192,17 +192,32 @@ RemoveUnordered(standing_spot_block_array *Array, standing_spot_block_array_inde if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - standing_spot_block *Current = Array->First; - standing_spot_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + standing_spot_block *Current = Array->First; + standing_spot_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index c086eeca2..179ea20a2 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -30,17 +30,32 @@ RemoveUnordered(texture_ptr_block_array *Array, texture_ptr_block_array_index In if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - texture_ptr_block *Current = Array->First; - texture_ptr_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + texture_ptr_block *Current = Array->First; + texture_ptr_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index b4237c924..38ccadb32 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -192,17 +192,32 @@ RemoveUnordered(vox_data_block_array *Array, vox_data_block_array_index Index) if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - vox_data_block *Current = Array->First; - vox_data_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + vox_data_block *Current = Array->First; + vox_data_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index d3294351a..afc17acf1 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -192,17 +192,32 @@ RemoveUnordered(voxel_stack_element_block_array *Array, voxel_stack_element_bloc if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - voxel_stack_element_block *Current = Array->First; - voxel_stack_element_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + voxel_stack_element_block *Current = Array->First; + voxel_stack_element_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/block_array_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_work_queue_entry_build_chunk_mesh_688853862.h new file mode 100644 index 000000000..23629aca9 --- /dev/null +++ b/generated/block_array_work_queue_entry_build_chunk_mesh_688853862.h @@ -0,0 +1,255 @@ +// src/engine/work_queue.h:73:0 + +struct work_queue_entry_build_chunk_mesh_block +{ + u32 Index; + u32 At; + work_queue_entry_build_chunk_mesh *Elements; + work_queue_entry_build_chunk_mesh_block *Next; +}; + +struct work_queue_entry_build_chunk_mesh_block_array_index +{ + work_queue_entry_build_chunk_mesh_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct work_queue_entry_build_chunk_mesh_block_array +{ + work_queue_entry_build_chunk_mesh_block *First; + work_queue_entry_build_chunk_mesh_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +typedef work_queue_entry_build_chunk_mesh_block_array work_queue_entry_build_chunk_mesh_paged_list; + +link_internal work_queue_entry_build_chunk_mesh_block_array_index +operator++(work_queue_entry_build_chunk_mesh_block_array_index &I0) +{ + if (I0.Block) + { + if (I0.ElementIndex == 8-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<(work_queue_entry_build_chunk_mesh_block_array_index I0, work_queue_entry_build_chunk_mesh_block_array_index I1) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex(work_queue_entry_build_chunk_mesh_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*8); + return Result; +} + +link_internal work_queue_entry_build_chunk_mesh_block_array_index +ZerothIndex(work_queue_entry_build_chunk_mesh_block_array *Arr) +{ + work_queue_entry_build_chunk_mesh_block_array_index Result = {}; + Result.Block = Arr->First; + /* Assert(Result.Block->Index == 0); */ + return Result; +} + +link_internal umm +TotalElements(work_queue_entry_build_chunk_mesh_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 8) + Arr->Current->At; + } + return Result; +} + +link_internal work_queue_entry_build_chunk_mesh_block_array_index +LastIndex(work_queue_entry_build_chunk_mesh_block_array *Arr) +{ + work_queue_entry_build_chunk_mesh_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal work_queue_entry_build_chunk_mesh_block_array_index +AtElements(work_queue_entry_build_chunk_mesh_block_array *Arr) +{ + work_queue_entry_build_chunk_mesh_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal work_queue_entry_build_chunk_mesh * +GetPtr(work_queue_entry_build_chunk_mesh_block_array *Arr, work_queue_entry_build_chunk_mesh_block_array_index Index) +{ + work_queue_entry_build_chunk_mesh *Result = {}; + if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + return Result; +} + +link_internal work_queue_entry_build_chunk_mesh * +GetPtr(work_queue_entry_build_chunk_mesh_block *Block, umm Index) +{ + work_queue_entry_build_chunk_mesh *Result = 0; + if (Index < Block->At) { Result = Block->Elements + Index; } + return Result; +} + +link_internal work_queue_entry_build_chunk_mesh * +GetPtr(work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + umm AtBlock = 0; + work_queue_entry_build_chunk_mesh_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + work_queue_entry_build_chunk_mesh *Result = Block->Elements+ElementIndex; + return Result; +} + +link_internal work_queue_entry_build_chunk_mesh * +TryGetPtr(work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + work_queue_entry_build_chunk_mesh *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(work_queue_entry_build_chunk_mesh_block *Block) +{ + return Block->At; +} + + +link_internal work_queue_entry_build_chunk_mesh_block* +Allocate_work_queue_entry_build_chunk_mesh_block(memory_arena *Memory) +{ + work_queue_entry_build_chunk_mesh_block *Result = Allocate(work_queue_entry_build_chunk_mesh_block, Memory, 1); + Result->Elements = Allocate(work_queue_entry_build_chunk_mesh, Memory, 8); + return Result; +} + +link_internal cs +CS(work_queue_entry_build_chunk_mesh_block_array_index Index) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal void +RemoveUnordered(work_queue_entry_build_chunk_mesh_block_array *Array, work_queue_entry_build_chunk_mesh_block_array_index Index) +{ + work_queue_entry_build_chunk_mesh_block_array_index LastI = LastIndex(Array); + + work_queue_entry_build_chunk_mesh *Element = GetPtr(Array, Index); + work_queue_entry_build_chunk_mesh *LastElement = GetPtr(Array, LastI); + + *Element = *LastElement; + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + work_queue_entry_build_chunk_mesh_block *Current = Array->First; + work_queue_entry_build_chunk_mesh_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal work_queue_entry_build_chunk_mesh * +Push(work_queue_entry_build_chunk_mesh_block_array *Array, work_queue_entry_build_chunk_mesh *Element) +{ + if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + + if (Array->First == 0) { Array->First = Allocate_work_queue_entry_build_chunk_mesh_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 8) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + work_queue_entry_build_chunk_mesh_block *Next = Allocate_work_queue_entry_build_chunk_mesh_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + work_queue_entry_build_chunk_mesh *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + + diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index 8a88bb4bd..b4bba8f08 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -30,17 +30,32 @@ RemoveUnordered(world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_ if (Array->Current->At == 0) { - // Walk the chain till we get to the second-last one - world_chunk_ptr_block *Current = Array->First; - world_chunk_ptr_block *LastB = LastI.Block; + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); - while (Current->Next && Current->Next != LastB) + if (Count == 0) { - Current = Current->Next; + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); } + else + { + // Walk the chain till we get to the second-last one + world_chunk_ptr_block *Current = Array->First; + world_chunk_ptr_block *LastB = LastI.Block; - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } } } diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index e069ca5de..fd2b5518f 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:168:0 +// src/engine/render_command.h:181:0 link_internal work_queue_entry__bonsai_render_command @@ -114,6 +114,19 @@ WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_do_stuff A ) + }; + return Result; +} + +link_internal work_queue_entry__bonsai_render_command +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_unmap_and_deallocate_buffer A ) +{ + work_queue_entry__bonsai_render_command Result = { + .Type = type_bonsai_render_command_unmap_and_deallocate_buffer, + .bonsai_render_command_unmap_and_deallocate_buffer = A, + + + }; return Result; } @@ -350,6 +363,17 @@ BonsaiRenderCommandDoStuff( u32 Ignored ) return Reuslt; } +link_internal bonsai_render_command_unmap_and_deallocate_buffer +BonsaiRenderCommandUnmapAndDeallocateBuffer( gpu_readback_buffer PBOBuf ) +{ + bonsai_render_command_unmap_and_deallocate_buffer Reuslt = { + .PBOBuf = PBOBuf + }; + + + return Reuslt; +} + link_internal bonsai_render_command_setup_shader BonsaiRenderCommandSetupShader( bonsai_render_command_shader_id ShaderId ) { diff --git a/generated/d_union_bonsai_render_command.h b/generated/d_union_bonsai_render_command.h index 6540065c7..5beb49f5b 100644 --- a/generated/d_union_bonsai_render_command.h +++ b/generated/d_union_bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:133:0 +// src/engine/render_command.h:144:0 enum work_queue_entry__bonsai_render_command_type { @@ -12,6 +12,7 @@ enum work_queue_entry__bonsai_render_command_type type_bonsai_render_command_deallocate_buffers, type_bonsai_render_command_deallocate_world_chunk, type_bonsai_render_command_do_stuff, + type_bonsai_render_command_unmap_and_deallocate_buffer, type_bonsai_render_command_setup_shader, type_bonsai_render_command_teardown_shader, type_bonsai_render_command_set_shader_uniform, @@ -38,6 +39,7 @@ struct work_queue_entry__bonsai_render_command struct bonsai_render_command_deallocate_buffers bonsai_render_command_deallocate_buffers; struct bonsai_render_command_deallocate_world_chunk bonsai_render_command_deallocate_world_chunk; struct bonsai_render_command_do_stuff bonsai_render_command_do_stuff; + struct bonsai_render_command_unmap_and_deallocate_buffer bonsai_render_command_unmap_and_deallocate_buffer; struct bonsai_render_command_setup_shader bonsai_render_command_setup_shader; struct bonsai_render_command_teardown_shader bonsai_render_command_teardown_shader; struct bonsai_render_command_set_shader_uniform bonsai_render_command_set_shader_uniform; diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 450fddad1..d3b729340 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:254:0 +// src/engine/work_queue.h:259:0 link_internal work_queue_entry diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index 72cf26fc2..73f5477d0 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:225:0 +// src/engine/work_queue.h:229:0 enum work_queue_entry_type { diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 7f9b7e9f3..c5f112725 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -369,6 +369,37 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*,&Element->ChunksCurrentlyQueued), + CSz("ChunksCurrentlyQueued"), + Params + ); + + + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(dummy_work_queue_entry_build_chunk_mesh_block_array*,&Element->NoiseReadbackJobs), + CSz("NoiseReadbackJobs"), + Params + ); + + + + + + + + if (ToggleButton(Ui, CSz("v GpuBuffers[2]"), CSz("> GpuBuffers[2]"), UiId(Window, "toggle graphics gpu_mapped_element_buffer GpuBuffers", Element->GpuBuffers), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index a65aba3b6..2b9793a37 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,4 +1,7 @@ -// src/engine/work_queue.h:286:0 +// src/engine/work_queue.h:291:0 + + + @@ -644,6 +647,22 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + + + + + + + + + + + + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 34b6a8877..1c2df749d 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -1,4 +1,7 @@ -// src/engine/work_queue.h:208:0 +// src/engine/work_queue.h:212:0 + + + @@ -634,6 +637,22 @@ render_to_texture_async_params render_to_texture_async_params; + + + + + + + + + + + + + + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index c81f28f5c..1767ca6c6 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -1,4 +1,7 @@ -// src/engine/work_queue.h:189:0 +// src/engine/work_queue.h:193:0 + + + @@ -634,6 +637,22 @@ type_render_to_texture_async_params, + + + + + + + + + + + + + + + + diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h new file mode 100644 index 000000000..caa536d43 --- /dev/null +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -0,0 +1,15 @@ +// src/engine/graphics.h:52:0 + +link_internal gpu_readback_buffer +GpuReadbackBuffer( u32 PBO , GLsync Fence ) +{ + gpu_readback_buffer Reuslt = { + .PBO = PBO +, + .Fence = Fence + }; + + + return Reuslt; +} + diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index 8339b140a..5b61138e9 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -100,6 +100,17 @@ PushBonsaiRenderCommandDoStuff( PushWorkQueueEntry(RenderQueue, &Work); } link_internal void +PushBonsaiRenderCommandUnmapAndDeallocateBuffer( + work_queue *RenderQueue + , gpu_readback_buffer PBOBuf +) +{ + work_queue_entry Work = WorkQueueEntry( + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandUnmapAndDeallocateBuffer( PBOBuf ))); + + PushWorkQueueEntry(RenderQueue, &Work); +} +link_internal void PushBonsaiRenderCommandSetupShader( work_queue *RenderQueue , bonsai_render_command_shader_id ShaderId diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index bdec546442ce6cabce532ff1e5e56fdb6d0a318a..5d8fdfe76a7ea9cdba62a31ee069129c3269a607 100644 GIT binary patch delta 1325 zcmZq6zgRQDgY^^x1B3qLg|eC(%jOs|hEHC|EH3Hh8t-0|SdfvKTpS-zl%JKFT%zlh zT3nnu`68dpw_ZlOa%Q8bS+zMVp^JB#$-hv2|OuLQA?3Akg#9a%7BSCzi4ux zthOOaw4@g$revn(mBi=eXBH#khZUF|K!6d5i3ln&cu;w8f%OrqQ53GRgBzi7vZACB z??VV5Y!WzUPX4FH$$O3&q0AVRU+arfi}Op1l2eO8fgcTYFb_}#NL7H7Kgdi!kjKIj zb4pW-1yH#`< zaY?O!a&+y0HbUjufbu{dP%A=ZY6ZxYrawpjf^d)rcL`gPwV1K&|NX3!15IQYIW`xX ztYL(d0ou6pS5jskqzp){NCle5pi3b3CCoJWKo)~AFfbVzcqRv$X-`ft17>>@4ndIn Y7@+{fMv^rXVdR*++iW#hC&-QB0If!)X8-^I delta 346 zcmcau)0RKMgLMZ31B3qLg|eC(%jOvJumgD@zzD>X6(x;$zJs|?0Y-VP$#=#0d0Utv zq99dvlM_WOCkya#@FFWkh_Zte0Rf0IoE)gGC7xPTl$e>Pmt0Wr9xQ`hjuTy95<;IA zP!8k-4j^{UD9y_bF3lAHvYqmaQc{b;5_3vZi**c*EV$ufo_Q&$6(G+Ad2pAcq^-D{ z`{VXS5O#K!{{h47lP}t+Fak*{sm+tDCNWN)W1}Jf(gX<=u!ER^YP7+Ej1T~F14vL0 NsIkj-_2dOM3ILS(PA>oe diff --git a/jesse.make.sh b/jesse.make.sh index dddb34e4c..35f0a7673 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 @@ -12,7 +12,7 @@ ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ BuildExecutables \ - # BuildTests \ + BuildTests \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ diff --git a/jesse.tests.rdbg b/jesse.tests.rdbg index 48cbb2bb6f8a5927a7f898d8d92d8f53be55bf46..0b4fa9f0507d4fa6e2c031c3d2320a1b1ac6d198 100644 GIT binary patch delta 1227 zcmZuxO>Em_80L!;|HX0QG-)Ebk#^N!O^3%?`j??LO~=sKD)qvFAE~&BTU$6kvz=-c z66&r9iDi#KAb}8?c0~j3j0w)%5tj;(dSW{uBqR>-er~*6u=FYK`}zHQp67Kwu6=Up z_91HwZassoaTV{CPvf=n0xp*gwl=tR4u6%N#&6n7VlY2vI@j>fSVq4z&NkzOW5K}L zQi)x_AYV;(y{?b9v(u=Hr$w>@)4|2@m)Rn{oyqN4ZF}3^-L;!xU^aU_JS;BaZmK4= z?Z7deB_4!c(O?UawN%WqOOf?=p-8b+ykAITyRd>*wn7~ylpyqNt8F@~G?$4jF|F)V z?XGV+=Xu_+?$wi7b$l>3$>w1d&SO$ju&&Qya!f`;ui{Z&Mqa3rFTu*5;l-1?u4m(` z49AkgV?)JKzJ%|MRn~~RX+7U;pbDUp`HF$>3>xgzIbi)HY$gQ!BVYFoIbUT6N zZU&tfp37#&anVP|@USii{seZ{kN6DPyFEV3n^GTV_%sG;H9e1@l ze#ljDR5Y~Upc6WF;1aOqVc-P*Ot0X_{4^eyB*p1>-r*Ry?lY;Dz0=0lq0c>UzIJ~Q|g2xk`$jQN^Glr_pQFmn_T2gG~W)o zeZR@cu1EPKIF4kMy-MCP267SoOa<386_@1#HNC)BBDLq4PBf)z1%Vy%dapc5|5P$? zMX1Vl%Z>I1xAUZ4!G_3UW9Xq(c}mi7dh&xM{KC1WYTrs;C5AKO$(v z?+Z+2FH+**I6F98%_N>Wc^Lh~{|}je|L1aEpb&vxr0A^Es0ZA*+G*K0xv|mhcS2t5 t{&&{9{BZl*pUVYG!=s7mH23*oOu*EsSwoI&7Cqb+aO2dM8jpyd{{T~oaEbr` delta 1141 zcmYjROK1~O6!py{GxM5hK26#*T5IuxZP1|~qj78_wxSmM5mAIvkk~wZgOiUl6VY9= zaj6X#L_wD>6-C^;av_4?QeEiYg`hiydf%I*I55n;_sxCxymQXXqZ1G9%@(ntJv0vY zh6mxma1p*|Ps7XX6!_UWauio4QgzoYSITa^Tw$KI(P+#8NgY@3R9(15_rY5|3qOWT zXbrirsYYmnd9G8l_!LYj6K23XuZ$_SO^O0+4fYYM8|ez47kj}MJ*M#Uo%T4iGJA|_ zy~13JFLiUuYJn5nwfII@D3LW0?9CL2L}E0Z^`>L-Sy3G`Bk(MpCbME+-D4Yp#cdpy zhXYtWC#OA#Csf1(Q%PG3xW~#B7#&z55?_o}oS-g`DN!2ToWrfud6-o4(X#Ke0RATD z$#LkAF(?@Z{77b?nOwmgPm}Q69`ox>Z-e<3KPiSrB}n)w3EKrP6I4Q+jUbRkiE3XW z4VU9KtPk|V#rQI+(jiA+DNbSUfDJSrhbG;FZ13t}wvz6AWH3;)sdjUr8SULH*lr^8h`L=MaO zlT`0UTZT@ids==lC|N*$3UJ>@A^wo@ouOD-=nPb^gcgbuX{P>$=Tx1*xh=RCBo?)D z192^h5MCrTF!fZAOM2aLShXKw+l&0s5;7?T8Kg)jT|ppwUmrmSSX(ggR}hiLNqRgBrY7V^B=ndX@Ry z;?wfo71hLVQG7lbHAznO=6_O#i5v<~6$8yVLzcx-E0cnpl7&sO+LJS_`7_hPis%v; z%jG()Lg!Da^RCc&lPc}NOT#;Y_Zj3PiqFMbh21e^5XhKdd_lZ%$zx0`oMpk4y60A2 jySa=?bZC#@zhJ~58oU~rz$gx%N0QrF26DT7(Z1s!wqHmE diff --git a/make.sh b/make.sh index 1ccf7632d..c5ee62871 100755 --- a/make.sh +++ b/make.sh @@ -363,8 +363,8 @@ function RunPoof # $TESTS/rng.cpp # $TESTS/file.cpp # $TESTS/sort.cpp - # $TESTS/containers/block_array.cpp TESTS_TO_BUILD=" + $TESTS/containers/block_array.cpp $TESTS/perlin_perf.cpp " diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader index 09d35e494..9bbda4687 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/noise/gradient.fragmentshader @@ -168,11 +168,11 @@ float structured_noise( in vec3 p ) void main() { - v2 _UV = UV*64.f; + v2 _UV = UV*66.f; f32 x = _UV.x; - f32 y = f32(s32(_UV.y) % 64); - f32 z = _UV.y / 64; + f32 y = f32(s32(_UV.y) % 66); + f32 z = _UV.y / 66; v3 xyz = v3(x,y,z)*2; diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 93482dd4c..8fc3a5d6e 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -556,6 +556,113 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ case type_work_queue_entry_build_chunk_mesh: { + work_queue_entry_build_chunk_mesh *Job = SafeAccess(work_queue_entry_build_chunk_mesh, Entry); +#if 1 + auto Chunk1 = Job->Chunk; + auto NoiseValues = Job->NoiseData; + v3i NoiseDim = Job->NoiseDim; + Assert(NoiseValues); + + /* auto E = WorkQueueEntry(WorkQueueEntryBuildChunkMesh(C->ChunkSize, C->NoiseValues)); */ + /* PushWorkQueueEntry(&Plat->LowPriority, &E); */ + + world_chunk *DestChunk = Chunk1; + world_chunk *SynChunk = AllocateWorldChunk({}, Chunk1->Dim + V3i(0, 2, 2), V3i(1), GetTranArena()); + SynChunk->Flags = Chunk_Queued; + v3i WorldBasis = {}; + v3i SynChunkDim = SynChunk->Dim; + v3i SrcToDest = {}; + s64 zMin = 0; + u16 PackedHSVColorValue = PackHSVColor(HSV_GREEN); + b32 MakeExteriorFaces = False; + + u32 ChunkSum = FinalizeOccupancyMasksFromNoiseValues(SynChunk, WorldBasis, NoiseDim, NoiseValues, SrcToDest, zMin, PackedHSVColorValue); + + if (ChunkSum) + { + if (MakeExteriorFaces) + { + MarkBoundaryVoxels_MakeExteriorFaces(SynChunk->Occupancy, SynChunk->Voxels, SynChunkDim, Global_ChunkApronMinDim, SynChunkDim-Global_ChunkApronMaxDim); + } + else + { + MarkBoundaryVoxels_NoExteriorFaces(SynChunk->Occupancy, SynChunk->xOccupancyBorder, SynChunk->FaceMasks, SynChunk->Voxels, SynChunkDim, {}, SynChunkDim); + } + + Assert(DestChunk->FilledCount == 0); + Assert(DestChunk->Dim.x == 64); + Assert(DestChunk->Dim.y == 64); + Assert(DestChunk->Dim.z == 64); + RangeIterator(z, 64) + RangeIterator(y, 64) + { + u64 Occ = DestChunk->Occupancy[y + z*64]; + DestChunk->FilledCount += CountBitsSet_Kernighan(Occ); + } + + Assert(DestChunk->FilledCount <= s32(Volume(DestChunk->Dim))); + + // NOTE(Jesse): The DestChunk is finalized at the end of the routine + /* SetFlag(DestChunk, Chunk_VoxelsInitialized); */ + FinalizeChunkInitialization(SynChunk); + +#if 0 + if (Flags & ChunkInitFlag_ComputeStandingSpots) + { + NotImplemented; + ComputeStandingSpots( SynChunkDim, SynChunk, {{1,1,0}}, {{0,0,1}}, Global_StandingSpotDim, + DestChunk->Dim, 0, &DestChunk->StandingSpots, + Thread->TempMemory); + } +#endif + + /* auto *Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); */ + geo_u3d *TempMesh = AllocateTempMesh(Thread->TempMemory, DataType_v3_u8); + + RebuildWorldChunkMesh(Thread, SynChunk, {}, {}, MeshBit_Lod0, TempMesh, Thread->TempMemory); + TempMesh->At = 0; + + /* Assert( (Flags & ChunkInitFlag_GenLODs) == 0); */ + +#define FINALIZE_MESH_FOR_CHUNK(Src, Dest, Bit) \ + { \ + auto *SrcMesh = (Src)->Meshes.E[ToIndex(Bit)]; \ + if (SrcMesh) { \ + if (SrcMesh->At) { \ + DestChunk->HasMesh = True; \ + AtomicReplaceMesh(&(Dest)->Meshes, Bit, SrcMesh, SrcMesh->Timestamp); \ + } else { \ + DeallocateMesh(EngineResources, SrcMesh); \ + } \ + } \ + } + + { + /* auto *EngineResources = GetEngineResources(); */ + TIMED_NAMED_BLOCK(Chunk_Finalize); + FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod0 ); + /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod1 ); */ + /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod2 ); */ + /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod3 ); */ + /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod4 ); */ +#undef FINALIZE_MESH_FOR_CHUNK + + Assert( (DestChunk->Flags & Chunk_VoxelsInitialized) == 0); + Assert( DestChunk->FilledCount <= s32(Volume(SynChunk))); + + /* if (DestChunk->WorldP == V3i(0)) { RuntimeBreak(); } */ + + FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*,DestChunk))); + } + } +#endif + + auto Graphics = &EngineResources->Graphics; + Assert(Graphics->ChunksCurrentlyQueued > 0); + Graphics->ChunksCurrentlyQueued -= 1; + + auto NextJob = WorkQueueEntry(WorkQueueEntryBonsaiRenderCommand(BonsaiRenderCommandUnmapAndDeallocateBuffer(Job->PBOBuf))); + PushWorkQueueEntry(&EngineResources->Stdlib.Plat.RenderQ, &NextJob); } break; case type_work_queue_entry_rebuild_mesh: diff --git a/src/engine/debug.h b/src/engine/debug.h index 1f4dfc12d..ab6598e6a 100644 --- a/src/engine/debug.h +++ b/src/engine/debug.h @@ -61,7 +61,7 @@ struct engine_debug b8 DrawBranchNodesWithMeshes; b8 DrawBranchNodes; b8 DrawLeafNodes; - b8 DrawNodesWithChunks = 1; + b8 DrawNodesWithChunks; b8 DrawQueuedNodes; r64 ChunkGenTimeElapsedMS; diff --git a/src/engine/gpu_mapped_buffer.cpp b/src/engine/gpu_mapped_buffer.cpp index 29597c9a5..a6803406e 100644 --- a/src/engine/gpu_mapped_buffer.cpp +++ b/src/engine/gpu_mapped_buffer.cpp @@ -224,7 +224,7 @@ MapGpuBuffer_untextured_3d_geometry_buffer(gpu_element_buffer_handles *Handles) if (!Buffer.Normals) { Error("Allocating gpu_mapped_element_buffer::Normals"); } if (!Buffer.Mat) { Error("Allocating gpu_mapped_element_buffer::Mat"); } -GL.BindBuffer(GL_ARRAY_BUFFER, 0); + GL.BindBuffer(GL_ARRAY_BUFFER, 0); return {*Handles, Buffer}; } diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 000faaedc..3fb61860f 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -49,7 +49,22 @@ struct transparency_render_group struct shadow_render_group; +poof(gen_constructor(gpu_readback_buffer)) +#include +poof(block_array(gpu_readback_buffer, {32})) +#include + + +struct dummy_work_queue_entry_build_chunk_mesh +{ + gpu_readback_buffer PBOBuf; + v3i NoiseDim; + world_chunk *Chunk; +}; + +poof(block_array(dummy_work_queue_entry_build_chunk_mesh, {32})) +#include struct graphics { @@ -106,6 +121,10 @@ struct graphics composite_render_group CompositeGroup; gpu_noise_render_group GpuNoise; + s32 ChunksCurrentlyQueued; + /* gpu_readback_buffer_block_array NoiseReadbackJobs; */ + dummy_work_queue_entry_build_chunk_mesh_block_array NoiseReadbackJobs; + gpu_mapped_element_buffer GpuBuffers[2]; u32 GpuBufferWriteIndex; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 28569a199..74a31ee2d 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -620,8 +620,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Result->Camera = &Result->GameCamera; - AllocateGpuElementBuffer(Result->GpuBuffers + 0, DataType_v3, (u32)Megabytes(1)); - AllocateGpuElementBuffer(Result->GpuBuffers + 1, DataType_v3, (u32)Megabytes(1)); + AllocateGpuElementBuffer(Result->GpuBuffers + 0, DataType_v3, (u32)Kilobytes(1)); + AllocateGpuElementBuffer(Result->GpuBuffers + 1, DataType_v3, (u32)Kilobytes(1)); g_buffer_render_group *gBuffer = CreateGbuffer(GraphicsMemory); if (!InitGbufferRenderGroup(Result->Settings.iApplicationResolution, gBuffer)) diff --git a/src/engine/render_command.h b/src/engine/render_command.h index 932785151..baa3fa140 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -1,3 +1,9 @@ +struct gpu_readback_buffer +{ + u32 PBO; + GLsync Fence; +}; + // // Renderer commands @@ -128,6 +134,11 @@ struct bonsai_render_command_gl_timer_read_value_and_histogram u32 GlTimerObject; }; +struct bonsai_render_command_unmap_and_deallocate_buffer +{ + gpu_readback_buffer PBOBuf; +}; + poof( d_union work_queue_entry__bonsai_render_command @@ -150,6 +161,8 @@ poof( bonsai_render_command_do_stuff + bonsai_render_command_unmap_and_deallocate_buffer + bonsai_render_command_setup_shader bonsai_render_command_teardown_shader bonsai_render_command_set_shader_uniform diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 7c2a50aea..6f2b71990 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -99,6 +99,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { tmatch(work_queue_entry_async_function_call, Job, RPC) + TIMED_NAMED_BLOCK(work_queue_entry_async_function_call); DispatchAsyncFunctionCall(RPC); } break; @@ -107,6 +108,17 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { InvalidCase(type_work_queue_entry__bonsai_render_command_noop); + { tmatch(bonsai_render_command_unmap_and_deallocate_buffer, RC, Command) + + gpu_readback_buffer PBOBuf = Command->PBOBuf; + GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOBuf.PBO); + AssertNoGlErrors; + GL.UnmapBuffer(GL_PIXEL_PACK_BUFFER); + AssertNoGlErrors; + GL.DeleteBuffers(1, &PBOBuf.PBO); + AssertNoGlErrors; + } break; + { tmatch(bonsai_render_command_allocate_texture, RC, Command) texture *Texture = Command->Texture; @@ -138,6 +150,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; { tmatch(bonsai_render_command_reallocate_buffers, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_reallocate_buffers); auto *Handles = Command->Handles; auto *Mesh = Command->Mesh; @@ -147,6 +160,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { tmatch(bonsai_render_command_deallocate_buffers, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_deallocate_buffers); if (*Command->Buffers) { GL.DeleteBuffers(Command->Count, Command->Buffers); } RangeIterator(Index, Command->Count) { Command->Buffers[Index] = 0; } } break; @@ -160,6 +174,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { tmatch(bonsai_render_command_clear_all_framebuffers, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_clear_all_framebuffers); ClearFramebuffers(Graphics, &Engine->RTTGroup); } break; @@ -167,6 +182,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { tmatch(bonsai_render_command_setup_shader, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_setup_shader); switch (Command->ShaderId) { InvalidCase(BonsaiRenderCommand_ShaderId_noop); @@ -184,6 +200,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; { tmatch(bonsai_render_command_teardown_shader, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_teardown_shader); switch (Command->ShaderId) { InvalidCase(BonsaiRenderCommand_ShaderId_noop); @@ -201,6 +218,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; { tmatch(bonsai_render_command_set_shader_uniform, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_set_shader_uniform); shader *Shader = Command->Shader; shader_uniform *Uniform = &Command->Uniform; if (Uniform->ID >= 0) @@ -214,29 +232,28 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; { tmatch(bonsai_render_command_draw_world_chunk_draw_list, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_draw_world_chunk_draw_list); RenderDrawList(Engine, Command->DrawList, Command->Shader); } break; { tmatch(bonsai_render_command_draw_all_entities, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_draw_all_entities); DrawEntities(Command->Shader, EntityTable, &GpuMap->Buffer, 0, Graphics, World, Plat->dt); } break; { tmatch(bonsai_render_command_initialize_noise_buffer, RC, _Command) - /* Command = 0; */ TIMED_NAMED_BLOCK(bonsai_render_command_initialize_noise_buffer); + /* Command = 0; */ bonsai_render_command_initialize_noise_buffer C = RC->bonsai_render_command_initialize_noise_buffer; - world_chunk **Chunk2 = &C.Chunk; world_chunk *Chunk1 = C.Chunk; world_chunk *Chunk = Chunk1; - Info("(%llu) (%llu)", u64(Chunk), u64(Chunk1)); Assert(s64(Chunk) == s64(Chunk1)); - /* world_chunk *Chunk = C.Chunk; */ auto *Shader = &Graphics->GpuNoise.GradientShader; v3i Apron = V3i(2, 2, 2); @@ -258,8 +275,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) s32 NoiseElementCount = s32(Volume(NoiseDim)); r32 *NoiseValues; -#if 1 s32 NoiseByteCount = NoiseElementCount*s32(sizeof(f32)); + { TIMED_NAMED_BLOCK(GenPboAndInitTransfer); u32 PBO; @@ -270,157 +287,19 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; GL.ReadPixels(0, 0, ViewportSize.x, ViewportSize.y, GL_RED, GL_FLOAT, 0); AssertNoGlErrors; - } + GL.BindBuffer(GL_PIXEL_PACK_BUFFER, 0); - { - TIMED_NAMED_BLOCK(Fence); gl_fence Fence = GL.FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - b32 Done = False; - while (!Done) - { - u32 SyncStatus = GL.ClientWaitSync(Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); - switch(SyncStatus) - { - case GL_ALREADY_SIGNALED: - case GL_CONDITION_SATISFIED: - { - Done = True; - } break; - - case GL_TIMEOUT_EXPIRED: - { - SyncStatus = GL.ClientWaitSync(Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); - } break; - - case GL_WAIT_FAILED: - { - SoftError("Error waiting on gl sync object"); - Done = True; - } break; - } - } - AssertNoGlErrors; - } - - /* SleepMs(1); */ - - { - HISTOGRAM_FUNCTION(); - TIMED_NAMED_BLOCK(MapBuffer); - NoiseValues = Cast(f32*, GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); - AssertNoGlErrors; - } -#else - NoiseValues = AllocateAligned(r32, GetTranArena(), NoiseElementCount, 32); - { - TIMED_NAMED_BLOCK(BindTexture); - GL.BindTexture(GL_TEXTURE_2D, Shader->ChunkTexture.ID); - } - { - HISTOGRAM_FUNCTION(); - TIMED_NAMED_BLOCK(GetTexImage); - GL.GetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_FLOAT, NoiseValues); + dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, V3i(NoiseDim), Chunk}; + Push(&Graphics->NoiseReadbackJobs, &Readback); } -#endif - Assert(NoiseValues); - - /* auto E = WorkQueueEntry(WorkQueueEntryBuildChunkMesh(C->ChunkSize, C->NoiseValues)); */ - /* PushWorkQueueEntry(&Plat->LowPriority, &E); */ - - world_chunk *DestChunk = Chunk1; - world_chunk *SynChunk = AllocateWorldChunk({}, Chunk1->Dim + V3i(0, 2, 2), V3i(1), GetTranArena()); - SynChunk->Flags = Chunk_Queued; - v3i WorldBasis = {}; - v3i SynChunkDim = SynChunk->Dim; - v3i SrcToDest = {}; - s64 zMin = 0; - u16 PackedHSVColorValue = PackHSVColor(HSV_GREEN); - b32 MakeExteriorFaces = False; - - u32 ChunkSum = FinalizeOccupancyMasksFromNoiseValues(SynChunk, WorldBasis, V3i(NoiseDim), NoiseValues, SrcToDest, zMin, PackedHSVColorValue); - - if (ChunkSum) - { - if (MakeExteriorFaces) - { - MarkBoundaryVoxels_MakeExteriorFaces(SynChunk->Occupancy, SynChunk->Voxels, SynChunkDim, Global_ChunkApronMinDim, SynChunkDim-Global_ChunkApronMaxDim); - } - else - { - MarkBoundaryVoxels_NoExteriorFaces(SynChunk->Occupancy, SynChunk->xOccupancyBorder, SynChunk->FaceMasks, SynChunk->Voxels, SynChunkDim, {}, SynChunkDim); - } - - Assert(DestChunk->FilledCount == 0); - Assert(DestChunk->Dim.x == 64); - Assert(DestChunk->Dim.y == 64); - Assert(DestChunk->Dim.z == 64); - RangeIterator(z, 64) - RangeIterator(y, 64) - { - u64 Occ = DestChunk->Occupancy[y + z*64]; - DestChunk->FilledCount += CountBitsSet_Kernighan(Occ); - } - - Assert(DestChunk->FilledCount <= s32(Volume(DestChunk->Dim))); - - // NOTE(Jesse): The DestChunk is finalized at the end of the routine - /* SetFlag(DestChunk, Chunk_VoxelsInitialized); */ - FinalizeChunkInitialization(SynChunk); - -#if 0 - if (Flags & ChunkInitFlag_ComputeStandingSpots) - { - NotImplemented; - ComputeStandingSpots( SynChunkDim, SynChunk, {{1,1,0}}, {{0,0,1}}, Global_StandingSpotDim, - DestChunk->Dim, 0, &DestChunk->StandingSpots, - Thread->TempMemory); - } -#endif - auto *Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); - geo_u3d *TempMesh = AllocateTempMesh(Thread->TempMemory, DataType_v3_u8); - - RebuildWorldChunkMesh(Thread, SynChunk, {}, {}, MeshBit_Lod0, TempMesh, Thread->TempMemory); - TempMesh->At = 0; - - /* Assert( (Flags & ChunkInitFlag_GenLODs) == 0); */ - -#define FINALIZE_MESH_FOR_CHUNK(Src, Dest, Bit) \ - { \ - auto *SrcMesh = (Src)->Meshes.E[ToIndex(Bit)]; \ - if (SrcMesh) { \ - if (SrcMesh->At) { \ - DestChunk->HasMesh = True; \ - AtomicReplaceMesh(&(Dest)->Meshes, Bit, SrcMesh, SrcMesh->Timestamp); \ - } else { \ - DeallocateMesh(EngineResources, SrcMesh); \ - } \ - } \ - } - - { - auto *EngineResources = GetEngineResources(); - TIMED_NAMED_BLOCK(Chunk_Finalize); - FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod0 ); - /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod1 ); */ - /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod2 ); */ - /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod3 ); */ - /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod4 ); */ -#undef FINALIZE_MESH_FOR_CHUNK - - Assert( (DestChunk->Flags & Chunk_VoxelsInitialized) == 0); - Assert( DestChunk->FilledCount <= s32(Volume(SynChunk))); - - /* if (DestChunk->WorldP == V3i(0)) { RuntimeBreak(); } */ - - FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*,DestChunk))); - } - } } break; { tmatch(bonsai_render_command_do_stuff, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_do_stuff); // // Render begin @@ -514,24 +393,29 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; { tmatch(bonsai_render_command_gl_timer_init, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_init); AssertNoGlErrors; GL.GenQueries(1, Command->GlTimerObject); AssertNoGlErrors; } break; { tmatch(bonsai_render_command_gl_timer_start, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_start); AssertNoGlErrors; GL.BeginQuery(GL_TIME_ELAPSED, Command->GlTimerObject); AssertNoGlErrors; } break; { tmatch(bonsai_render_command_gl_timer_end, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_end); AssertNoGlErrors; GL.EndQuery(GL_TIME_ELAPSED); AssertNoGlErrors; } break; { tmatch(bonsai_render_command_gl_timer_read_value_and_histogram, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_read_value_and_histogram); +#if 0 AssertNoGlErrors; u64 TimerNs = 0; @@ -547,6 +431,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) /* Info("GL reported time of (%.2f)ms", f64(TimerNs)/1000000.0); */ /* GetDebugState()->PushHistogramDataPoint(TimerNs); */ AssertNoGlErrors; +#endif } break; } @@ -556,6 +441,44 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) RewindArena(GetTranArena()); } + { + TIMED_NAMED_BLOCK(CheckReadbackJobs); + IterateOver(&Graphics->NoiseReadbackJobs, PBOJob, JobIndex) + { + u32 SyncStatus = GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); + AssertNoGlErrors; + switch(SyncStatus) + { + case GL_ALREADY_SIGNALED: + case GL_CONDITION_SATISFIED: + { + TIMED_NAMED_BLOCK(MapBuffer); + AssertNoGlErrors; + GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOJob->PBOBuf.PBO); + AssertNoGlErrors; + f32 *NoiseValues = Cast(f32*, GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); + AssertNoGlErrors; + + auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryBuildChunkMesh(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->Chunk)); + PushWorkQueueEntry(&Plat->LowPriority, &BuildMeshJob); + + RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); + + } break; + + case GL_TIMEOUT_EXPIRED: + { + } break; + + case GL_WAIT_FAILED: + { + Graphics->ChunksCurrentlyQueued -= 1; + SoftError("Error waiting on gl sync object"); + } break; + } + } + } + SleepMs(1); if (FutexIsSignaled(ThreadParams->WorkerThreadsExitFutex)) break; diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index a398b08be..d86b2437f 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -62,8 +62,12 @@ struct work_queue_entry_init_world_chunk { struct work_queue_entry_build_chunk_mesh { - v3 Dim; + gpu_readback_buffer PBOBuf; + f32 *NoiseData; + v3i NoiseDim; + + world_chunk *Chunk; }; struct work_queue_entry_rebuild_mesh @@ -234,6 +238,7 @@ poof( work_queue_entry_rebuild_mesh work_queue_entry_sim_particle_system + // NOTE(Jesse): This is kind of a hack to put render commands onto the work // queue so I don't have to invent a whole generic system for having queues // with seperate work entry types. I should probably do this sometime in diff --git a/src/engine/world.cpp b/src/engine/world.cpp index a7a11bd76..dc47a4de8 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -507,7 +507,7 @@ poof(generate_cursor(octree_node_ptr)) #define OCTREE_PRIORITY_QUEUE_LIST_COUNT (512) #define OCTREE_PRIORITY_QUEUE_LIST_LENGTH (128) -#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (1) +#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (256) struct octree_node_priority_queue { octree_node_ptr_cursor Lists[OCTREE_PRIORITY_QUEUE_LIST_COUNT]; @@ -926,12 +926,12 @@ MaintainWorldOctree(engine_resources *Engine) octree_stats Stats = {}; - s32 LowPriorityQueueCount = s32(EventsCurrentlyInQueue(&Plat->LowPriority)); + s32 ChunksCurrentlyQueued = Graphics->ChunksCurrentlyQueued; - s32 MaxToQueueThisFrame = Max(0, MAX_OCTREE_NODES_QUEUED_PER_FRAME - LowPriorityQueueCount); + s32 MaxToQueueThisFrame = Max(0, MAX_OCTREE_NODES_QUEUED_PER_FRAME - ChunksCurrentlyQueued); Assert(MaxToQueueThisFrame <= MAX_OCTREE_NODES_QUEUED_PER_FRAME); - DEBUG_VALUE_u32(u32(LowPriorityQueueCount)); + DEBUG_VALUE_u32(u32(ChunksCurrentlyQueued)); DEBUG_VALUE_u32(u32(MaxToQueueThisFrame)); DEBUG_VALUE_u32(TotalWorldChunksAllocated); @@ -973,6 +973,7 @@ MaintainWorldOctree(engine_resources *Engine) /* QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); */ QueueChunkForInit(&Plat->RenderQ, Node->Chunk, MeshBit_Lod0); ++Stats.NewQueues; + ++Graphics->ChunksCurrentlyQueued; if (++NumQueuedThisFrame == MaxToQueueThisFrame) goto done_queueing_nodes; } diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 47d74306c..e87f5396d 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3706,9 +3706,9 @@ WorkQueueEntryRebuildMesh(world_chunk *Chunk, chunk_init_flags Flags) } link_internal work_queue_entry_build_chunk_mesh -WorkQueueEntryBuildChunkMesh(v3 Dim, f32 *NoiseData) +WorkQueueEntryBuildChunkMesh(gpu_readback_buffer PBOBuf, f32 *NoiseData, v3i NoiseDim, world_chunk *Chunk) { - work_queue_entry_build_chunk_mesh Result = { Dim, NoiseData }; + work_queue_entry_build_chunk_mesh Result = { PBOBuf, NoiseData, NoiseDim, Chunk }; return Result; } diff --git a/src/tests/containers/block_array.cpp b/src/tests/containers/block_array.cpp index 21314d2de..6fb6c4bf4 100644 --- a/src/tests/containers/block_array.cpp +++ b/src/tests/containers/block_array.cpp @@ -217,7 +217,7 @@ PrintThreeBlocksRemoveFromMiddle() { I.ElementIndex = 7; RemoveUnordered(&Array, I); - /* TestThat( Array.Current->At == 6 ); */ + TestThat( Array.Current->At == 5 ); Print(&Array); Info("--"); } @@ -246,11 +246,22 @@ PrintThreeBlocksRemoveFromMiddle() Info("--"); } +} +link_internal void +RemoveAllBlocks() +{ + auto Array = MakeOrderedBlockArray(32); + RangeIterator(Index, 32) + { + RemoveUnordered(&Array, ZerothIndex(&Array)); - + auto AtE = AtElements(&Array); + s32 Count = s32(GetIndex(&AtE)); + Assert( Count == 31 - Index ); + } } @@ -267,6 +278,8 @@ main(s32 ArgCount, const char** Args) PrintThreeBlocksRemoveFromMiddle(); + RemoveAllBlocks(); + TestSuiteEnd(); exit(TestsFailed); } From 5f98ae750239941e12de41cbd429c47572309550 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 21 Oct 2024 08:16:22 -0700 Subject: [PATCH 095/421] Correctly generating perlin noise on GPU --- shaders/noise/gradient.fragmentshader | 30 ++++++++++++++++++++++----- src/engine/resources.cpp | 4 +++- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader index 9bbda4687..a26c09265 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/noise/gradient.fragmentshader @@ -1,3 +1,5 @@ +/* uniform v3i WorldspaceBasis; */ + in vec2 UV; out float Output; @@ -156,7 +158,8 @@ float gradient_noise( in vec3 p ) float structured_noise( in vec3 p ) { - if (p.x < 32.f && p.y < 32.f && p.z < 32.f) +#if 1 + if (p.x < 33.f && p.y < 33.f && p.z < 33.f) { return 1.f; } @@ -164,24 +167,41 @@ float structured_noise( in vec3 p ) { return -1.f; } +#else + if (p.x > 2.1f && p.x < 3.1f) + { + if (p.y < 3.1f) + { + return 1.f; + } + else + { + return -1.f; + } + } + else + { + return -1.f; + } +#endif } void main() { - v2 _UV = UV*66.f; + v2 _UV = UV*V2(66.f, 66.f*66.f); f32 x = _UV.x; f32 y = f32(s32(_UV.y) % 66); f32 z = _UV.y / 66; - v3 xyz = v3(x,y,z)*2; + v3 xyz = v3(x,y,z)/16; /* for (s32 Octave = 0; Octave < 1; ++Octave) */ { /* Output += gradient_noise_derivs(xyz / Octave).x; */ - /* Output += gradient_noise_derivs(xyz).x; */ + Output += gradient_noise_derivs(xyz).x; /* Output += gradient_noise(xyz); */ - Output += structured_noise(xyz); + /* Output += structured_noise(xyz); */ } /* Output = (UV.x + UV.y) / 2.f; */ } diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 6f2b71990..eb58d2b70 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -260,7 +260,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) v3 NoiseDim = V3(Shader->ChunkDim); Assert(V3(Chunk1->Dim+Apron) == NoiseDim); - v2i ViewportSize = V2i(s32(Chunk1->Dim.x), s32(Chunk1->Dim.y*Chunk1->Dim.z)); + v2i ViewportSize = V2i(s32(NoiseDim.x), s32(NoiseDim.y*NoiseDim.z)); { TIMED_NAMED_BLOCK(Draw); @@ -272,6 +272,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; } + Assert(Chunk1->Dim == V3i(64)); + Assert(NoiseDim == V3(66)); s32 NoiseElementCount = s32(Volume(NoiseDim)); r32 *NoiseValues; From 2c1883ffb99d93dad380f9699b6314e1e3aca326 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 21 Oct 2024 08:22:09 -0700 Subject: [PATCH 096/421] Update stdlib --- external/bonsai_stdlib | 2 +- shaders/noise/gradient.fragmentshader | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index d0ff0562a..bc94ccff3 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit d0ff0562a8be704e8859936c5cee326d3e25cbbc +Subproject commit bc94ccff380fa7f15f2d935e56a3ace3a3979e53 diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader index a26c09265..4a196d8cb 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/noise/gradient.fragmentshader @@ -1,4 +1,4 @@ -/* uniform v3i WorldspaceBasis; */ +uniform v3 WorldspaceBasis; in vec2 UV; out float Output; From 726874dede54d3aa01d1a3ca1c9e9ba1f5523d02 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 21 Oct 2024 11:47:36 -0700 Subject: [PATCH 097/421] Correctly generating 3D perlin on GPU --- examples/terrain_gen/game_constants.h | 4 ++-- external/bonsai_stdlib | 2 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../block_array_h_shader_ptr_688853971_0.h | 2 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- .../shader_magic_bloom_downsample_shader.h | 1 - .../shader_magic_bloom_upsample_shader.h | 1 - .../shader_magic_gradient_noise_shader.h | 24 +++++++++++++++---- generated/shader_magic_shadow_map_shader.h | 6 ++--- shaders/noise/gradient.fragmentshader | 5 ++-- src/engine/graphics.h | 4 +++- src/engine/render/render_init.cpp | 3 +-- src/engine/resources.cpp | 2 ++ 14 files changed, 37 insertions(+), 23 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 2f08a69ee..d66f248dd 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -16,11 +16,11 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ -g_VisibleRegion = Chunk_Dimension(128, 128, 128); +/* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ -/* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ +g_VisibleRegion = Chunk_Dimension(8, 8, 8); /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ /* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index bc94ccff3..124fb28cf 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit bc94ccff380fa7f15f2d935e56a3ace3a3979e53 +Subproject commit 124fb28cfdee39c8eec44bb833178a051b0337b2 diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index fcf3a7fce..b58d7bda8 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:66:0 +// src/engine/graphics.h:68:0 struct dummy_work_queue_entry_build_chunk_mesh_block { diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index f87097ab1..7cd940007 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:55:0 +// src/engine/graphics.h:57:0 struct gpu_readback_buffer_block { diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 561163664..0211e1482 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:131:0 +// external/bonsai_stdlib/src/shader.h:128:0 struct shader_ptr_block { diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index caa536d43..8a988b6f5 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:52:0 +// src/engine/graphics.h:54:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index 67dc5d47c..aa61c38af 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -8,7 +8,6 @@ InitializeBloomDownsampleShader( bloom_downsample_shader *Struct , v2*SrcResolu u32 UniformIndex = 0; Struct->SrcResolution = SrcResolution; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->SrcResolution, "SrcResolution"); ++UniformIndex; diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index 701fc8a2c..d31035222 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -8,7 +8,6 @@ InitializeBloomUpsampleShader( bloom_upsample_shader *Struct , f32*FilterRadius u32 UniformIndex = 0; Struct->FilterRadius = FilterRadius; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->FilterRadius, "FilterRadius"); ++UniformIndex; diff --git a/generated/shader_magic_gradient_noise_shader.h b/generated/shader_magic_gradient_noise_shader.h index c5d966b9f..15454a9f4 100644 --- a/generated/shader_magic_gradient_noise_shader.h +++ b/generated/shader_magic_gradient_noise_shader.h @@ -1,17 +1,25 @@ -// src/engine/graphics.h:14:0 +// src/engine/graphics.h:16:0 link_internal void -InitializeGradientNoiseShader( gradient_noise_shader *Struct , v3 ChunkDim ) +InitializeGradientNoiseShader( gradient_noise_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) { Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/noise/gradient.fragmentshader")); u32 UniformIndex = 0; - + Struct->ChunkDim = ChunkDim; Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->ChunkDim, "ChunkDim"); ++UniformIndex; - if (UniformIndex != 1 ) + Struct->WorldspaceBasis = WorldspaceBasis; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->WorldspaceBasis, "WorldspaceBasis"); + ++UniformIndex; + + Struct->ChunkResolution = ChunkResolution; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->ChunkResolution, "ChunkResolution"); + ++UniformIndex; + + if (UniformIndex != 3 ) { Error("Shader (gradient_noise_shader) had an incorrect number of uniform slots!"); } @@ -31,7 +39,13 @@ UseShader( gradient_noise_shader *Struct ) BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - if (UniformIndex != 1 ) + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + if (UniformIndex != 3 ) { Error("Shader (gradient_noise_shader) had an incorrect number of uniform slots!"); } diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index e12e85a42..a00d4ec3c 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -7,21 +7,19 @@ InitializeShadowMapShader( shadow_map_shader *Struct , m4 MVP , m4 ModelMatr u32 UniformIndex = 0; - + Struct->MVP = MVP; Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->MVP, "MVP"); ++UniformIndex; - + Struct->ModelMatrix = ModelMatrix; Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->ModelMatrix, "ModelMatrix"); ++UniformIndex; Struct->MinClipP_worldspace = MinClipP_worldspace; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->MinClipP_worldspace, "MinClipP_worldspace"); ++UniformIndex; Struct->MaxClipP_worldspace = MaxClipP_worldspace; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->MaxClipP_worldspace, "MaxClipP_worldspace"); ++UniformIndex; diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader index 4a196d8cb..7e9c52a77 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/noise/gradient.fragmentshader @@ -1,4 +1,5 @@ uniform v3 WorldspaceBasis; +uniform v3 ChunkResolution; in vec2 UV; out float Output; @@ -192,9 +193,9 @@ void main() f32 x = _UV.x; f32 y = f32(s32(_UV.y) % 66); - f32 z = _UV.y / 66; + f32 z = (_UV.y / 66) - 10.f; - v3 xyz = v3(x,y,z)/16; + v3 xyz = (WorldspaceBasis+ (v3(x,y,z)*ChunkResolution) ) / 50.f; /* for (s32 Octave = 0; Octave < 1; ++Octave) */ { diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 3fb61860f..0afada6ba 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -5,10 +5,12 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader @frag_source_file("shaders/noise/gradient.fragmentshader") ) { shader Program; - shader_uniform Uniforms[1]; + shader_uniform Uniforms[3]; texture ChunkTexture; v3 ChunkDim; poof(@uniform) + v3 WorldspaceBasis; poof(@uniform) + v3 ChunkResolution; poof(@uniform) }; poof(shader_magic(gradient_noise_shader)) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 74a31ee2d..1db282ff4 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -762,8 +762,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr gradient_noise_shader *GradientShader = &Result->GpuNoise.GradientShader; v3 ChunkDim = V3(66, 66, 66); - GradientShader->ChunkDim = ChunkDim; - InitializeGradientNoiseShader(&Result->GpuNoise.GradientShader, ChunkDim); + InitializeGradientNoiseShader(&Result->GpuNoise.GradientShader, ChunkDim, {}, {}); Result->GpuNoise.FBO = GenFramebuffer(); diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index eb58d2b70..f609fa139 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -260,6 +260,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) v3 NoiseDim = V3(Shader->ChunkDim); Assert(V3(Chunk1->Dim+Apron) == NoiseDim); + Shader->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); + Shader->ChunkResolution = V3(Chunk->DimInChunks); v2i ViewportSize = V2i(s32(NoiseDim.x), s32(NoiseDim.y*NoiseDim.z)); { From 4497026f3cef5d2d2529ceeba882c93e2e841187 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 21 Oct 2024 17:11:21 -0700 Subject: [PATCH 098/421] Shader noise pretty much all working; still off-by-one holes on edges sometimes --- examples/terrain_gen/game.cpp | 4 +- examples/terrain_gen/game_constants.h | 4 +- .../block_array_h_shader_ptr_688853971_0.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 13 ++++ generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- shaders/noise/gradient.fragmentshader | 64 +++++++------------ src/engine/api.cpp | 8 ++- src/engine/render/render_init.cpp | 4 +- src/engine/resources.cpp | 27 +++++++- src/engine/terrain.cpp | 6 +- src/engine/world.cpp | 33 ++++++++++ src/engine/world_chunk.cpp | 4 ++ 19 files changed, 123 insertions(+), 62 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index ca0ad237f..227d43923 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -764,7 +764,9 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() world_position WorldCenter = V3i(100, 100, 0); canonical_position CameraTargetP = {}; - StandardCamera(Graphics->Camera, 150000.0f, 5000.0f); + f32 DistanceFromTarget = Length(g_VisibleRegion); + f32 FarClip = 150000.f; + StandardCamera(Graphics->Camera, FarClip, DistanceFromTarget); AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index d66f248dd..23f964b1e 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -11,7 +11,7 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192*32, 8192*32, 8192*32); // 1677km */ /* g_VisibleRegion = Chunk_Dimension(8192*8, 8192*8, 8192*8); // 416km */ -/* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km */ +g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ @@ -20,7 +20,7 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ -g_VisibleRegion = Chunk_Dimension(8, 8, 8); +/* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ /* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 0211e1482..4b7a53145 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:128:0 +// external/bonsai_stdlib/src/shader.h:130:0 struct shader_ptr_block { diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 7e3a22198..140a00ac1 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -119,6 +119,19 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + Cast(b8*,&Element->HotReloaded), + CSz("HotReloaded"), + &DefaultUiRenderParams_Checkbox + ); + + + + + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 4e6b2c4c9..931624858 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:237:0 +// external/bonsai_stdlib/src/shader.cpp:240:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, m4 *Value) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index f4a363ad1..b93b85fad 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:252:0 +// external/bonsai_stdlib/src/shader.cpp:255:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, r32 *Value) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index 70e162b89..192923243 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:249:0 +// external/bonsai_stdlib/src/shader.cpp:252:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, s32 *Value) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index 364323c28..e22541981 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:234:0 +// external/bonsai_stdlib/src/shader.cpp:237:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, texture *Value) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index ff94b25cb..e90dfa6a6 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:246:0 +// external/bonsai_stdlib/src/shader.cpp:249:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, u32 *Value) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index a28760762..c4d8681ab 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:240:0 +// external/bonsai_stdlib/src/shader.cpp:243:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, v2 *Value) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index e28636ec6..f25c38770 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:243:0 +// external/bonsai_stdlib/src/shader.cpp:246:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, v3 *Value) diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index ba83caae3..d5969afcc 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.cpp:505:0 +// src/engine/world.cpp:538:0 struct octree_node_ptr_cursor { diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader index 7e9c52a77..8da9618c3 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/noise/gradient.fragmentshader @@ -157,52 +157,34 @@ float gradient_noise( in vec3 p ) } #endif -float structured_noise( in vec3 p ) -{ -#if 1 - if (p.x < 33.f && p.y < 33.f && p.z < 33.f) - { - return 1.f; - } - else - { - return -1.f; - } -#else - if (p.x > 2.1f && p.x < 3.1f) - { - if (p.y < 3.1f) - { - return 1.f; - } - else - { - return -1.f; - } - } - else - { - return -1.f; - } -#endif -} - void main() { - v2 _UV = UV*V2(66.f, 66.f*66.f); + f32 P = 5000.f; + v3 Period = V3(P,P,P); + float Amplitude = 1000.f; + f32 StartingZDepth = 10000.f; + s32 Octaves = 15; - f32 x = _UV.x; - f32 y = f32(s32(_UV.y) % 66); - f32 z = (_UV.y / 66) - 10.f; + f32 x = gl_FragCoord.x; + f32 y = f32(s32(gl_FragCoord.y) % 66); + f32 z = (gl_FragCoord.y / 66); - v3 xyz = (WorldspaceBasis+ (v3(x,y,z)*ChunkResolution) ) / 50.f; + v3 Offset = V3(-1, -1, -1); - /* for (s32 Octave = 0; Octave < 1; ++Octave) */ + v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + + Output = StartingZDepth; + + // + // -- user code -- + // + + for (s32 Octave = 1; Octave <= Octaves; ++Octave) { - /* Output += gradient_noise_derivs(xyz / Octave).x; */ - Output += gradient_noise_derivs(xyz).x; - /* Output += gradient_noise(xyz); */ - /* Output += structured_noise(xyz); */ + /* Basis.x = round(Basis.x); */ + v3 xyz = Basis / (Period/Octave); + Output = Output + (gradient_noise_derivs(xyz).x * (Amplitude/Octave)); } - /* Output = (UV.x + UV.y) / 2.f; */ + + Output = Output - Basis.z; } diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 8fc3a5d6e..266b99fd6 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -87,6 +87,11 @@ Bonsai_FrameBegin(engine_resources *Resources) // Resources->FrameIndex += 1; + if (Resources->Graphics.GpuNoise.GradientShader.Program.HotReloaded) + { + HardResetWorld(Resources); + } + MaintainWorldOctree(Resources); /* Resources->World->ChunkHash = CurrentWorldHashtable(Resources); */ @@ -652,11 +657,12 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ /* if (DestChunk->WorldP == V3i(0)) { RuntimeBreak(); } */ - FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*,DestChunk))); } } #endif + FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*,DestChunk))); + auto Graphics = &EngineResources->Graphics; Assert(Graphics->ChunksCurrentlyQueued > 0); Graphics->ChunksCurrentlyQueued -= 1; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 1db282ff4..045733139 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -620,8 +620,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Result->Camera = &Result->GameCamera; - AllocateGpuElementBuffer(Result->GpuBuffers + 0, DataType_v3, (u32)Kilobytes(1)); - AllocateGpuElementBuffer(Result->GpuBuffers + 1, DataType_v3, (u32)Kilobytes(1)); + AllocateGpuElementBuffer(Result->GpuBuffers + 0, DataType_v3, (u32)Megabytes(1)); + AllocateGpuElementBuffer(Result->GpuBuffers + 1, DataType_v3, (u32)Megabytes(1)); g_buffer_render_group *gBuffer = CreateGbuffer(GraphicsMemory); if (!InitGbufferRenderGroup(Result->Settings.iApplicationResolution, gBuffer)) diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index f609fa139..5441419b9 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -674,6 +674,28 @@ SoftResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag HardResetAssets(Engine); } + + +link_internal void +HardResetWorld(engine_resources *Engine) +{ + world *World = Engine->World; + + MergeOctreeChildren(Engine, &World->Root); + + if (World->Root.Chunk) + { + FreeWorldChunk(Engine, World->Root.Chunk); + } + World->Root = {}; + + InitOctreeNode(World, &World->Root, {}, World->VisibleRegion); + World->Root.Chunk = AllocateWorldChunk( {}, World->ChunkDim, World->VisibleRegion, World->ChunkMemory); + + /* VaporizeArena(World->ChunkMemory); */ + /* World->ChunkMemory = AllocateArena(); */ +} + link_internal void HardResetEngine(engine_resources *Engine) { @@ -688,11 +710,10 @@ HardResetEngine(engine_resources *Engine) VaporizeArena(Engine->GameMemory); Engine->GameMemory = AllocateArena(); - VaporizeArena(Engine->World->ChunkMemory); - Engine->World->ChunkMemory = AllocateArena(); - HardResetEditor(&Engine->Editor); + HardResetWorld(Engine); + // TODO(Jesse)(leak): This leaks the texture handles; make a HardResetEngineDebug() VaporizeArena(Engine->EngineDebug.Memory); Engine->EngineDebug = {}; diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 27291f662..d0c007ede 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -12,7 +12,7 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { - f32 zCoord = 0.f; //__COMPUTE_NOISE_INPUT(z, WorldBasis, zChunk, Chunk->DimInChunks); + f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zChunk, Chunk->DimInChunks); /* f32 zCoord = 75.f; */ /* f32 WorldZBiased = zCoord - zMin; */ f32 WorldZBiased = 0.f; @@ -47,7 +47,7 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No /* if (xChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_YELLOW)*u16(NoiseChoice); } */ /* if (xChunk == Chunk->Dim.x-1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } - if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_GREEN)*u16(NoiseChoice); } + if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } } @@ -66,7 +66,7 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) { /* f32 zCoord = 75.f; */ - /* f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zNoise, Chunk->DimInChunks); */ + f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zNoise, Chunk->DimInChunks); /* f32 WorldZBiased = zCoord - zMin; */ f32 WorldZBiased = 0.f; for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) diff --git a/src/engine/world.cpp b/src/engine/world.cpp index dc47a4de8..f77d1f470 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -371,6 +371,39 @@ CountsAsDrawableOrUnmeshed(octree_node *Node) return Result; } + +typedef void (*octree_traversal_callback)(octree_node *); + +link_internal void +RecursiveOctreeTraversal( engine_resources *Engine, octree_node *Node, octree_traversal_callback Callback) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + Callback(Node); + + switch(Node->Type) + { + InvalidCase(OctreeNodeType_Undefined); + + case OctreeNodeType_Branch: + { + RecursiveOctreeTraversal(Engine, Node->Children[0], Callback); + RecursiveOctreeTraversal(Engine, Node->Children[1], Callback); + RecursiveOctreeTraversal(Engine, Node->Children[2], Callback); + RecursiveOctreeTraversal(Engine, Node->Children[3], Callback); + RecursiveOctreeTraversal(Engine, Node->Children[4], Callback); + RecursiveOctreeTraversal(Engine, Node->Children[5], Callback); + RecursiveOctreeTraversal(Engine, Node->Children[6], Callback); + RecursiveOctreeTraversal(Engine, Node->Children[7], Callback); + } break; + + case OctreeNodeType_Leaf: + { + } break; + + } +} + link_internal void DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats *Stats) { diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index e87f5396d..23e1942ce 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3669,6 +3669,10 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, FinalizeChunkInitialization(DestChunk); } + + auto Graphics = &EngineResources->Graphics; + Assert(Graphics->ChunksCurrentlyQueued > 0); + Graphics->ChunksCurrentlyQueued -= 1; } // TODO(Jesse): Remove this thnk From 47bbb37be69dad357f2a6d836a01ee542985bf5a Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 22 Oct 2024 12:29:44 -0700 Subject: [PATCH 099/421] Setup to side-by-side compare cpu and gpu noise implementations --- examples/terrain_gen/game.cpp | 2 +- examples/terrain_gen/game_constants.h | 6 +- external/bonsai_stdlib | 2 +- ..._work_queue_entry__bonsai_render_command.h | 2 +- generated/d_union_bonsai_render_command.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- shaders/noise/gradient.fragmentshader | 139 ++++++++++++++++-- src/engine/api.cpp | 12 +- src/engine/graphics.h | 2 +- src/engine/render_command.h | 3 +- src/engine/resources.cpp | 2 +- src/engine/terrain.cpp | 11 ++ src/engine/world.cpp | 12 +- src/engine/world_chunk.cpp | 11 +- src/engine/world_chunk.h | 7 + 15 files changed, 183 insertions(+), 32 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 227d43923..d5356b809 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -764,7 +764,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() world_position WorldCenter = V3i(100, 100, 0); canonical_position CameraTargetP = {}; - f32 DistanceFromTarget = Length(g_VisibleRegion); + f32 DistanceFromTarget = Length(g_VisibleRegion/2.f); f32 FarClip = 150000.f; StandardCamera(Graphics->Camera, FarClip, DistanceFromTarget); diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 23f964b1e..0d4222dd7 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -11,11 +11,13 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192*32, 8192*32, 8192*32); // 1677km */ /* g_VisibleRegion = Chunk_Dimension(8192*8, 8192*8, 8192*8); // 416km */ -g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km +/* g_VisibleRegion = Chunk_Dimension(8192*4, 8192*4, 8192*4); // 208km */ +/* g_VisibleRegion = Chunk_Dimension(8192*2, 8192*2, 8192*2); // 104km */ +/* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ -/* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ +g_VisibleRegion = Chunk_Dimension(256, 256, 256); /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 124fb28cf..dd660f0a9 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 124fb28cfdee39c8eec44bb833178a051b0337b2 +Subproject commit dd660f0a9c5184e730ad502e826dac2db028d772 diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index fd2b5518f..3a6664656 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:181:0 +// src/engine/render_command.h:182:0 link_internal work_queue_entry__bonsai_render_command diff --git a/generated/d_union_bonsai_render_command.h b/generated/d_union_bonsai_render_command.h index 5beb49f5b..f813c2f28 100644 --- a/generated/d_union_bonsai_render_command.h +++ b/generated/d_union_bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:144:0 +// src/engine/render_command.h:145:0 enum work_queue_entry__bonsai_render_command_type { diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index c5f112725..31843f622 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -372,7 +372,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->ChunksCurrentlyQueued), + Cast(u32*,&Element->ChunksCurrentlyQueued), CSz("ChunksCurrentlyQueued"), Params ); diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader index 8da9618c3..c484eabf4 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/noise/gradient.fragmentshader @@ -2,7 +2,7 @@ uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; in vec2 UV; -out float Output; +out f32 Output; // https://www.shadertoy.com/view/4dffRH // @@ -71,6 +71,43 @@ vec3 hash( vec3 p ) // this hash is not production ready, please } #endif +float hashf( float f ) +{ + return -1.0 + 2.0*fract(sin(f)*43758.5453123); +} + +#if 1 +vec4 value_noise_derivs( in vec3 x ) +{ + vec3 p = floor(x); + vec3 w = fract(x); + vec3 u = w*w*(3.0-2.0*w); + vec3 du = 6.0*w*(1.0-w); + + float n = p.x + p.y*157.0 + 113.0*p.z; + + float a = hashf(n+ 0.0); + float b = hashf(n+ 1.0); + float c = hashf(n+157.0); + float d = hashf(n+158.0); + float e = hashf(n+113.0); + float f = hashf(n+114.0); + float g = hashf(n+270.0); + float h = hashf(n+271.0); + + float k0 = a; + float k1 = b - a; + float k2 = c - a; + float k3 = e - a; + float k4 = a - b - c + d; + float k5 = a - c - e + g; + float k6 = a - b - e + f; + float k7 = - a + b + c - d + e - f - g + h; + + return vec4( k0 + k1*u.x + k2*u.y + k3*u.z + k4*u.x*u.y + k5*u.y*u.z + k6*u.z*u.x + k7*u.x*u.y*u.z, + du * (vec3(k1,k2,k3) + u.yzx*vec3(k4,k5,k6) + u.zxy*vec3(k6,k4,k5) + k7*u.yzx*u.zxy )); +} +#endif // return value noise (in x) and its derivatives (in yzw) // @@ -157,34 +194,118 @@ float gradient_noise( in vec3 p ) } #endif +vec3 vhash(vec3 UV, vec3 offset) +{ + mat3 m = mat3(127.1,311.7, 74.7,269.5,183.3,246.1,113.5,271.9,124.6); + UV = fract(sin(UV* m) * 46839.32); + return vec3(sin(UV.z * +offset.x) * 0.5 + 0.5, cos(UV.x* offset.y) * 0.5 + 0.5,tan(UV.y * offset.z) * 0.5 + 0.5); +} + +vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) +{ + vec3 g = floor(p * CellDensity); + vec3 f = fract(p * CellDensity); + float res = 8.0; + float md=8.0; + vec3 mr; + vec4 Out; + for( int z=-1; z<=1; z++ ) + for( int y=-1; y<=1; y++ ) + for( int x=-1; x<=1; x++ ) + { + vec3 lattice = vec3(x,y,z); + vec3 offset=vhash(lattice + g ,AngleOffset); + vec3 r = lattice +offset -f; + float d = dot( r, r ); + if (d < res) + { + res=d; + mr=r; + } + } + + res = 8.0; + for( int z=-1; z<=1; z++ ) + for( int y=-1; y<=1; y++ ) + for( int x=-1; x<=1; x++ ) + { + vec3 lattice = vec3(x,y,z); + vec3 offset=vhash(lattice + g ,AngleOffset); + vec3 r = lattice +offset -f; + float d = dot( r, r ); + if( d < res ) + { + res = d; + Out.x = d; + Out.y= offset.x; + } + if( dot(mr-r,mr-r)>0.00001) + { + md = min( md, dot( 0.5*(mr+r), normalize(r-mr) ) ); + } + } + Out.z = mix(1.0, 0.0, smoothstep( 0.0, 0.1, md )); + Out.w = 1.0-smoothstep( 0.0, 0.1, res); + return Out; +} void main() { - f32 P = 5000.f; + f32 P = 30000.f; v3 Period = V3(P,P,P); - float Amplitude = 1000.f; - f32 StartingZDepth = 10000.f; - s32 Octaves = 15; + float Amplitude = 30000.f; + f32 StartingZDepth = 50000.f; + s32 Octaves = 1; f32 x = gl_FragCoord.x; f32 y = f32(s32(gl_FragCoord.y) % 66); f32 z = (gl_FragCoord.y / 66); - v3 Offset = V3(-1, -1, -1); + /* v3 Offset = V3(-1, -1, -1); */ + v3 Offset = V3(0,0,0); v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); - Output = StartingZDepth; + f32 NoiseValue = StartingZDepth; + v3 Color = V3(1,0,1); // // -- user code -- // + v3 deriv = v3(0.f); +#if 1 for (s32 Octave = 1; Octave <= Octaves; ++Octave) { /* Basis.x = round(Basis.x); */ v3 xyz = Basis / (Period/Octave); - Output = Output + (gradient_noise_derivs(xyz).x * (Amplitude/Octave)); + + /* f32 warp = gradient_noise(xyz*2)*0.2f; */ + f32 warp = 0.f; + + v4 gn = value_noise_derivs(xyz+warp); + /* v4 gn = gradient_noise_derivs(xyz+warp); */ + + deriv += gn.xyz; + + NoiseValue = NoiseValue + (gn.x * (Amplitude/Octave)); } +#endif + + deriv = normalize(deriv); + + f32 cosDeriv = dot(deriv, V3(0,0,1)); + /* f32 cosDeriv = 1.f; */ + + v4 vn = voronoi_noise(Basis/(Period/4.f), vec3(3.f), vec3(3.f)); + NoiseValue = NoiseValue + (cosDeriv * vn.y * (Amplitude/2.f)); + + + // + // -- end user code -- + // + + NoiseValue = NoiseValue - Basis.z; + NoiseValue = clamp(NoiseValue, -1, 1); - Output = Output - Basis.z; + Output = NoiseValue; } diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 266b99fd6..416550bd1 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -665,14 +665,19 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ auto Graphics = &EngineResources->Graphics; Assert(Graphics->ChunksCurrentlyQueued > 0); - Graphics->ChunksCurrentlyQueued -= 1; + AtomicDecrement(&Graphics->ChunksCurrentlyQueued); - auto NextJob = WorkQueueEntry(WorkQueueEntryBonsaiRenderCommand(BonsaiRenderCommandUnmapAndDeallocateBuffer(Job->PBOBuf))); - PushWorkQueueEntry(&EngineResources->Stdlib.Plat.RenderQ, &NextJob); + if (Job->PBOBuf.PBO != INVALID_PBO_HANDLE) + { + auto DeallocPBOs = WorkQueueEntry(WorkQueueEntryBonsaiRenderCommand(BonsaiRenderCommandUnmapAndDeallocateBuffer(Job->PBOBuf))); + PushWorkQueueEntry(&EngineResources->Stdlib.Plat.RenderQ, &DeallocPBOs); + } } break; case type_work_queue_entry_rebuild_mesh: { + NotImplemented; +#if 0 work_queue_entry_rebuild_mesh *Job = SafeAccess(work_queue_entry_rebuild_mesh, Entry); world_chunk *Chunk = Job->Chunk; @@ -710,6 +715,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ /* UnsetBitfield(chunk_flag, Chunk->Flags, Chunk_Queued); */ Chunk->Flags = chunk_flag(Chunk->Flags & ~Chunk_Queued); /* Chunk->Flags = chunk_flag(Chunk->Flags & ~Chunk_MeshUploadedToGpu); */ +#endif } break; case type_work_queue_entry_init_world_chunk: diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 0afada6ba..0c8940787 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -123,7 +123,7 @@ struct graphics composite_render_group CompositeGroup; gpu_noise_render_group GpuNoise; - s32 ChunksCurrentlyQueued; + volatile u32 ChunksCurrentlyQueued; /* gpu_readback_buffer_block_array NoiseReadbackJobs; */ dummy_work_queue_entry_build_chunk_mesh_block_array NoiseReadbackJobs; diff --git a/src/engine/render_command.h b/src/engine/render_command.h index baa3fa140..9ed95ed2a 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -1,6 +1,7 @@ +#define INVALID_PBO_HANDLE (0xFFFFFFFF) struct gpu_readback_buffer { - u32 PBO; + u32 PBO = INVALID_PBO_HANDLE; GLsync Fence; }; diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 5441419b9..c860a733d 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -476,7 +476,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case GL_WAIT_FAILED: { - Graphics->ChunksCurrentlyQueued -= 1; + AtomicDecrement(&Graphics->ChunksCurrentlyQueued); SoftError("Error waiting on gl sync object"); } break; } diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index d0c007ede..9f133f9cc 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -360,7 +360,18 @@ Terrain_FBM2D( world_chunk *Chunk, } +#if 1 u32 ChunkSum = FinalizeOccupancyMasksFromNoiseValues(Chunk, WorldBasis, NoiseDim, NoiseValues, SrcToDest, zMin, PackedHSVColorValue); +#else + + if (ChunkSum) + { + auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryBuildChunkMesh({INVALID_PBO_HANDLE,0}, NoiseValues, NoiseDim, Chunk)); + thread_local_state *Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); + HandleJob(&BuildMeshJob, Thread, &GetEngineResources()->GameApi); + } + u32 ChunkSum = Chunk->FilledCount; +#endif return ChunkSum; } diff --git a/src/engine/world.cpp b/src/engine/world.cpp index f77d1f470..49432afb6 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -959,9 +959,9 @@ MaintainWorldOctree(engine_resources *Engine) octree_stats Stats = {}; - s32 ChunksCurrentlyQueued = Graphics->ChunksCurrentlyQueued; + u32 ChunksCurrentlyQueued = Graphics->ChunksCurrentlyQueued; - s32 MaxToQueueThisFrame = Max(0, MAX_OCTREE_NODES_QUEUED_PER_FRAME - ChunksCurrentlyQueued); + u32 MaxToQueueThisFrame = Max(0u, MAX_OCTREE_NODES_QUEUED_PER_FRAME - ChunksCurrentlyQueued); Assert(MaxToQueueThisFrame <= MAX_OCTREE_NODES_QUEUED_PER_FRAME); DEBUG_VALUE_u32(u32(ChunksCurrentlyQueued)); @@ -974,7 +974,7 @@ MaintainWorldOctree(engine_resources *Engine) /* DEBUG_VALUE_u32(ReusedNode); */ /* DEBUG_VALUE_u32(AllocatedNode); */ - s32 NumQueuedThisFrame = 0; + u32 NumQueuedThisFrame = 0; if (MaxToQueueThisFrame) { RangeIterator(ListIndex, OCTREE_PRIORITY_QUEUE_LIST_COUNT) @@ -1003,10 +1003,10 @@ MaintainWorldOctree(engine_resources *Engine) /* Node->Chunk = AllocateWorldChunk(Node->WorldP, World->ChunkDim, Node->Resolution, World->ChunkMemory); */ } - /* QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); */ - QueueChunkForInit(&Plat->RenderQ, Node->Chunk, MeshBit_Lod0); + QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); + /* QueueChunkForInit(&Plat->RenderQ, Node->Chunk, MeshBit_Lod0); */ ++Stats.NewQueues; - ++Graphics->ChunksCurrentlyQueued; + AtomicIncrement(&Graphics->ChunksCurrentlyQueued); if (++NumQueuedThisFrame == MaxToQueueThisFrame) goto done_queueing_nodes; } diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 23e1942ce..a75102673 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3409,7 +3409,7 @@ QueueChunkForInit(work_queue *Queue, world_chunk *Chunk, world_chunk_mesh_bitfie /* DebugLine("Queuing Chunk (%p)(%d, %d, %d)", Chunk, Chunk->WorldP.x, Chunk->WorldP.y, Chunk->WorldP.z); */ -#if 0 +#if 1 work_queue_entry Entry = {}; { Entry.Type = type_work_queue_entry_init_world_chunk; @@ -3592,6 +3592,8 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, NoiseParams, UserData )); +#if 0 +#else // If the chunk didn't have any voxels filled, we're done if (SyntheticChunk->FilledCount) { @@ -3638,7 +3640,6 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, TempMesh->At = 0; Assert( (Flags & ChunkInitFlag_GenLODs) == 0); - } #define FINALIZE_MESH_FOR_CHUNK(Src, Dest, Bit) \ { \ @@ -3666,13 +3667,15 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, Assert( DestChunk->FilledCount <= s32(Volume(SyntheticChunk))); /* if (DestChunk->WorldP == V3i(0)) { RuntimeBreak(); } */ + } - FinalizeChunkInitialization(DestChunk); } + FinalizeChunkInitialization(DestChunk); auto Graphics = &EngineResources->Graphics; Assert(Graphics->ChunksCurrentlyQueued > 0); - Graphics->ChunksCurrentlyQueued -= 1; + AtomicDecrement(&Graphics->ChunksCurrentlyQueued); +#endif } // TODO(Jesse): Remove this thnk diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 9e5a51b5e..694646bca 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -662,3 +662,10 @@ FinalizeChunkInitialization(world_chunk *Chunk); link_internal untextured_3d_geometry_buffer* AllocateTempMesh(memory_arena* TempMemory, data_type Type); + + +struct work_queue_entry_build_chunk_mesh; +struct gpu_readback_buffer; + +link_internal work_queue_entry_build_chunk_mesh +WorkQueueEntryBuildChunkMesh(gpu_readback_buffer PBOBuf, f32 *NoiseData, v3i NoiseDim, world_chunk *Chunk); From 8280d1a7cfa578314f81ab4c98a4e9e55f0f64f5 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 22 Oct 2024 16:10:27 -0700 Subject: [PATCH 100/421] WIP --- src/engine/terrain.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 9f133f9cc..8e297c096 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -14,8 +14,8 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No { f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zChunk, Chunk->DimInChunks); /* f32 zCoord = 75.f; */ - /* f32 WorldZBiased = zCoord - zMin; */ - f32 WorldZBiased = 0.f; + f32 WorldZBiased = zCoord - zMin; + /* f32 WorldZBiased = 0.f; */ for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) { u64 Mask = 0; @@ -67,8 +67,8 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No { /* f32 zCoord = 75.f; */ f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zNoise, Chunk->DimInChunks); - /* f32 WorldZBiased = zCoord - zMin; */ - f32 WorldZBiased = 0.f; + f32 WorldZBiased = zCoord - zMin; + /* f32 WorldZBiased = 0.f; */ for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) { @@ -190,7 +190,7 @@ Terrain_FBM2D( world_chunk *Chunk, memory_arena *TempArena = GetTranArena(); - s32 NoiseUpsampleFactor = 2; + s32 NoiseUpsampleFactor = 1; /* s32 NoiseUpsampleFactor = 4; */ v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0)), V3i(8*NoiseUpsampleFactor, 1, 1)); From e3b79f174d928e7837d6ae759d8a82687877d410 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 22 Oct 2024 17:27:13 -0700 Subject: [PATCH 101/421] Fix holes in both CPU and GPU noise gen --- examples/terrain_gen/game_constants.h | 4 +- shaders/noise/gradient.fragmentshader | 30 +-- src/engine/terrain.cpp | 348 ++++++++++++++++++++------ src/engine/world.cpp | 4 +- src/engine/world_chunk.cpp | 2 +- 5 files changed, 291 insertions(+), 97 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 0d4222dd7..d542edd02 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -17,9 +17,9 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ -g_VisibleRegion = Chunk_Dimension(256, 256, 256); +/* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ -/* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ +g_VisibleRegion = Chunk_Dimension(64, 64, 64); /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader index c484eabf4..c5644e546 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/noise/gradient.fragmentshader @@ -250,18 +250,20 @@ vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) } void main() { - f32 P = 30000.f; + f32 P = 1000.f; v3 Period = V3(P,P,P); - float Amplitude = 30000.f; - f32 StartingZDepth = 50000.f; - s32 Octaves = 1; + float Amplitude = 1000.f; + f32 StartingZDepth = 500.f; + /* f32 StartingZDepth = 0.f; */ + s32 Octaves = 8; - f32 x = gl_FragCoord.x; - f32 y = f32(s32(gl_FragCoord.y) % 66); - f32 z = (gl_FragCoord.y / 66); + f32 x = floor(gl_FragCoord.x); + /* f32 y = f32(s32(gl_FragCoord.y) % 66); */ + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); /* v3 Offset = V3(-1, -1, -1); */ - v3 Offset = V3(0,0,0); + v3 Offset = V3(0,-1,0); v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); @@ -282,8 +284,8 @@ void main() /* f32 warp = gradient_noise(xyz*2)*0.2f; */ f32 warp = 0.f; - v4 gn = value_noise_derivs(xyz+warp); - /* v4 gn = gradient_noise_derivs(xyz+warp); */ + /* v4 gn = value_noise_derivs(xyz+warp); */ + v4 gn = gradient_noise_derivs(xyz+warp); deriv += gn.xyz; @@ -291,13 +293,13 @@ void main() } #endif - deriv = normalize(deriv); + /* deriv = normalize(deriv); */ - f32 cosDeriv = dot(deriv, V3(0,0,1)); + /* f32 cosDeriv = dot(deriv, V3(0,0,1)); */ /* f32 cosDeriv = 1.f; */ - v4 vn = voronoi_noise(Basis/(Period/4.f), vec3(3.f), vec3(3.f)); - NoiseValue = NoiseValue + (cosDeriv * vn.y * (Amplitude/2.f)); + /* v4 vn = voronoi_noise(Basis/(Period/4.f), vec3(3.f), vec3(3.f)); */ + /* NoiseValue = NoiseValue + (cosDeriv * vn.y * (Amplitude/2.f)); */ // diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 8e297c096..be65d9f70 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -7,99 +7,100 @@ link_internal u32 FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, f32 *NoiseValues, v3i SrcToDest, s64 zMin, u16 PackedHSVColorValue) { TIMED_FUNCTION(); - - u32 Result = 0; - - for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) - { - f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zChunk, Chunk->DimInChunks); - /* f32 zCoord = 75.f; */ - f32 WorldZBiased = zCoord - zMin; - /* f32 WorldZBiased = 0.f; */ - for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) + u32 ChunkSum = 0; { - u64 Mask = 0; - for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) +#if 1 + TIMED_NAMED_BLOCK(NoiseFinalize); + for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { - v3i ChunkP = V3i(xChunk, yChunk, zChunk); - /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ - /* v3i NoiseP = V3i(xChunk+1, yChunk+1, zChunk+1)/NoiseUpsampleFactor; */ - v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); - - s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); - s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); - - /* r32 ThisNoiseV = MapNoiseValueToFinal(NoiseValues[NoiseIndex]/OctaveAmplitudeMax)*OctaveAmplitudeMax; */ - r32 ThisNoiseV = NoiseValues[NoiseIndex]; - u64 NoiseChoice = u64(ThisNoiseV > WorldZBiased); - Result += u32(NoiseChoice); - - Mask |= (NoiseChoice << xChunk); - /* SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); */ + /* f32 zCoord = 75.f; */ + /* f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zChunk), Chunk->DimInChunks); */ + /* f32 WorldZBiased = zCoord - zMin; */ + f32 WorldZBiased = 0.f; + for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) + { + u64 Mask = 0; + for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) + { + v3i ChunkP = V3i(xChunk, yChunk, zChunk); + /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ + /* v3i NoiseP = V3i(xChunk+1, yChunk+1, zChunk+1); */ + v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); + + s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); + s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); + + /* r32 ThisNoiseV = MapNoiseValueToFinal(NoiseValues[NoiseIndex]/OctaveAmplitudeMax)*OctaveAmplitudeMax; */ + r32 ThisNoiseV = NoiseValues[NoiseIndex]; + u64 NoiseChoice = u64(ThisNoiseV > WorldZBiased); + ChunkSum += u32(NoiseChoice); + + Mask |= (NoiseChoice << xChunk); + /* SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); */ + + /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ + /* if (NormalIndex > -1) */ + /* { */ + /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ + /* } */ + + Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ + if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } + if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } + if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } + } - /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ - /* if (NormalIndex > -1) */ - /* { */ - /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ - /* } */ - Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); - /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ - /* if (xChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_YELLOW)*u16(NoiseChoice); } */ - /* if (xChunk == Chunk->Dim.x-1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ - if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } - if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } - if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } + SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); + } } +#endif - SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); - } - } + Assert(NoiseDim.x >= 66); + Assert(NoiseDim.y >= 66); + Assert(NoiseDim.z >= 66); - Assert(NoiseDim.x >= 66); - Assert(NoiseDim.y >= 66); - Assert(NoiseDim.z >= 66); + Assert(Chunk->Dim.x == 64); + Assert(Chunk->Dim.y == 66); + Assert(Chunk->Dim.z == 66); - Assert(Chunk->Dim.x == 64); - Assert(Chunk->Dim.y == 66); - Assert(Chunk->Dim.z == 66); + for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) + { + /* f32 zCoord = 75.f; */ + /* f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zNoise), Chunk->DimInChunks); */ + /* f32 WorldZBiased = zCoord - zMin; */ + f32 WorldZBiased = 0.f; + for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) + { - for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) - { - /* f32 zCoord = 75.f; */ - f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, zNoise, Chunk->DimInChunks); - f32 WorldZBiased = zCoord - zMin; - /* f32 WorldZBiased = 0.f; */ - for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) - { + { + v3i BorderP = V3i(0, yNoise, zNoise); + s32 BorderIndex = GetIndex(BorderP, NoiseDim); - { - v3i BorderP = V3i(0, yNoise, zNoise); - s32 BorderIndex = GetIndex(BorderP, NoiseDim); + r32 ThisNoiseV = NoiseValues[BorderIndex]; - r32 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = ThisNoiseV > WorldZBiased; + /* u64 NoiseChoice = 1ull; */ + /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ + Chunk->xOccupancyBorder[(zNoise-1)*2] |= NoiseChoice << (yNoise-1); + } - u64 NoiseChoice = ThisNoiseV > WorldZBiased; - /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ - Chunk->xOccupancyBorder[(zNoise-1)*2] |= NoiseChoice << (yNoise-1); - } + { + v3i BorderP = V3i(65, yNoise, zNoise); + s32 BorderIndex = GetIndex(BorderP, NoiseDim); - { - v3i BorderP = V3i(65, yNoise, zNoise); - s32 BorderIndex = GetIndex(BorderP, NoiseDim); + r32 ThisNoiseV = NoiseValues[BorderIndex]; - r32 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = ThisNoiseV > WorldZBiased; + /* u64 NoiseChoice = 1ull; */ + /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ + Chunk->xOccupancyBorder[((zNoise-1)*2)+1] |= NoiseChoice << (yNoise-1); + } - u64 NoiseChoice = ThisNoiseV > WorldZBiased; - /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ - Chunk->xOccupancyBorder[((zNoise-1)*2)+1] |= NoiseChoice << (yNoise-1); + } } - } - } - - return Result; + return ChunkSum; } link_internal u32 @@ -144,8 +145,10 @@ global_variable random_series DEBUG_ENTROPY = {653765435432}; // 24.3m cycles | u32 ComputePerlinParameters // 19.3m cycles | u32 ComputePerlinParameters // +#if 0 +// NOTE(Jesse): I broke the non-upsampling path when I added upsampling.. link_internal u32 -Terrain_FBM2D( world_chunk *Chunk, +Terrain_FBM2D_upsample_broken( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *OctaveCount ) @@ -374,6 +377,195 @@ Terrain_FBM2D( world_chunk *Chunk, #endif return ChunkSum; } +#endif + +link_internal u32 +Terrain_FBM2D( world_chunk *Chunk, + v3i NoiseBasis, + void *NoiseParams, + void *OctaveCount ) +{ + /* TIMED_FUNCTION(); */ + HISTOGRAM_FUNCTION(); + + UNPACK_NOISE_PARAMS(NoiseParams); + + u32 ChunkSum = 0; + + random_series GenColorEntropy = {12653763234231}; + + Period = Max(Period, V3(1.f)); + + auto PrimeX = U32_8X(501125321); + auto PrimeY = 1136930381u; + auto PrimeZ = 1720413743u; + + u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); + + + s32 Octaves = *(s32*)OctaveCount; + +#if 0 + s32 MinZ = Chunk->WorldP.z*WorldChunkDim.z; + s32 MaxZ = MinZ+WorldChunkDim.z ; + + if (MaxZ < -Amplitude) + { + s32 MaxIndex = Volume(Dim); + for ( s32 VoxIndex = 0; VoxIndex < MaxIndex; ++VoxIndex) + { + Chunk->Voxels[VoxIndex].Flags = Voxel_Filled; + Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(RGBColor); + } + return (u32)MaxIndex; + } + + if (MinZ > Amplitude) + return ChunkSum; +#endif + + memory_arena *TempArena = GetTranArena(); + + s32 NoiseUpsampleFactor = 1; + + /* v3i NoiseDim = RoundUp(Chunk->Dim/2, V3i(8)); */ + /* v3i NoiseDim = RoundUp((Chunk->Dim+2)/NoiseUpsampleFactor, V3i(8, 1, 1)); */ + v3i NoiseDim = RoundUp((Chunk->Dim+V3i(2,0,0))/NoiseUpsampleFactor, V3i(8, 1, 1)); + v3i NormalsDim = RoundUp((Chunk->Dim-V3i(0,2,2))/NoiseUpsampleFactor, V3i(8, 1, 1)); + + Assert(Chunk->Dim == V3i(64, 66, 66)); + Assert(NormalsDim == V3i(64)); + + /* v3i NoiseDim = Chunk->Dim; */ + // NOTE(Jesse): This must hold true for using any Noise_16x func + Assert(NoiseDim.x % 8 == 0); + + + /* v3i NoiseDim = Chunk->Dim + 2; */ + s32 NoiseValuesCount = Volume(NoiseDim); + s32 NormalValuesCount = Volume(NormalsDim); + // + // NOTE(Jesse): Have to add 1 to compute the normals because on the last + // iteration we go +1 in the x direction. This is super garbage/sketchy and + // I hate it, but I don't have a better solution for now. + r32 *NoiseValues = AllocateAligned(r32, TempArena, NoiseValuesCount+1, 32); + v3 *Normals = AllocateAligned( v3, TempArena, NormalValuesCount , 32); + // NOTE(Jesse): Must be true to use _mm256_store_ps, which we do in the 16x version of perlin + Assert(u64(NoiseValues) % 32 == 0); + + v3i WorldBasis = NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); + { + u32_8x xChunkResolution = U32_8X(u32(Chunk->DimInChunks.x)); + u32 yChunkResolution = u32(Chunk->DimInChunks.y); + u32 zChunkResolution = u32(Chunk->DimInChunks.z); + + u32 *zPeriods = Allocate(u32, TempArena, Octaves); + u32 *yPeriods = Allocate(u32, TempArena, Octaves); + avx_divisor *xPeriods = AllocateAligned(avx_divisor, TempArena, Octaves, 32); + + perlin_params *xParams = AllocateAligned(perlin_params, TempArena, NoiseDim.x*Octaves*2, 32); + perlin_params *yParams = AllocateAligned(perlin_params, TempArena, NoiseDim.y*Octaves*2, 32); + perlin_params *zParams = AllocateAligned(perlin_params, TempArena, NoiseDim.z*Octaves*2, 32); + + /* u32 Offset = 200'000'000; */ + /* v3i WorldBasis = V3i(Offset, Offset, 0) + NoiseBasis + (Chunk->WorldP*GetWorldChunkDim()); */ + + + + v3i InteriorPeriod = V3i(Period); + RangeIterator(OctaveIndex, Octaves) + { + zPeriods[OctaveIndex] = u32(InteriorPeriod.z); + yPeriods[OctaveIndex] = u32(InteriorPeriod.y); + xPeriods[OctaveIndex] = AvxDivisor(u32(InteriorPeriod.x)); + InteriorPeriod = Max(V3i(1), InteriorPeriod/2); + } + + u64 StartingCycles = __rdtsc(); + { + TIMED_NAMED_BLOCK(precalculate_parameters); + + for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) + { + RangeIterator(OctaveIndex, Octaves) + { + s32 i = OctaveIndex+(zNoise*Octaves); + zParams[i] = ComputePerlinParameters_scalar(u32(WorldBasis.z), u32(zNoise), zChunkResolution, zPeriods[OctaveIndex], PrimeZ); + } + } + + for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) + { + RangeIterator(OctaveIndex, Octaves) + { + s32 i = OctaveIndex+(yNoise*Octaves); + yParams[i] = ComputePerlinParameters_scalar(u32(WorldBasis.y), u32(yNoise), yChunkResolution, yPeriods[OctaveIndex], PrimeY); + } + } + + u32 *_xCoords = AllocateAligned(u32, TempArena, NoiseDim.x, 32); + for ( s32 xNoise = 0; xNoise < NoiseDim.x; ++ xNoise ) + { + _xCoords[xNoise] = u32(xNoise-1); + } + + for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) + { + auto _x = U32_8X(_xCoords+xNoise); + RangeIterator(OctaveIndex, Octaves) + { + s32 i = OctaveIndex+(xNoise*Octaves); + xParams[i] = ComputePerlinParameters_vector(U32_8X(WorldBasis.x), _x, xChunkResolution, xPeriods[OctaveIndex], PrimeX); + } + } + } + + f32 OctaveAmplitudeMax = {}; + + { + r32 InteriorAmp = r32(Amplitude); + RangeIterator(OctaveIndex, Octaves) + { + OctaveAmplitudeMax += InteriorAmp; + InteriorAmp = Max(1.f, InteriorAmp/2.f); + } + } + + { + TIMED_NAMED_BLOCK(octaves); + for ( s32 zNoise = 0; zNoise < NoiseDim.z; ++ zNoise) + { + for ( s32 yNoise = 0; yNoise < NoiseDim.y; ++ yNoise) + { + for ( s32 xNoise = 0; xNoise < NoiseDim.x; xNoise += 8 ) + { + s32 NoiseIndex = GetIndex(xNoise, yNoise, zNoise, NoiseDim); + + r32 InteriorAmp = r32(Amplitude); + RangeIterator(OctaveIndex, Octaves) + { + auto zParam = zParams+OctaveIndex+(zNoise*Octaves); + auto yParam = yParams+OctaveIndex+(yNoise*Octaves); + auto xParam = xParams+OctaveIndex+(xNoise*Octaves); + PerlinNoise_8x_avx2(xParam, yParam, zParam, NoiseValues+NoiseIndex, InteriorAmp); + InteriorAmp = Max(1.f, InteriorAmp/2.f); + } + } + } + } + } + + u64 EndingCycles = __rdtsc(); + u64 ElapsedCycles = EndingCycles - StartingCycles; + GetEngineDebug()->ChunkGenCyclesElapsed += ElapsedCycles; + GetEngineDebug()->CellsGenerated += u64(Volume(NoiseDim))*u64(Octaves); + } + + ComputeNormalsForChunkFromNoiseValues_avx( NoiseValues, NoiseDim, Normals, NormalsDim); + ChunkSum = FinalizeOccupancyMasksFromNoiseValues(Chunk, WorldBasis, NoiseDim, NoiseValues, SrcToDest, zMin, PackedHSVColorValue); + + return ChunkSum; +} link_internal u32 Terrain_Perlin2D( world_chunk *Chunk, diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 49432afb6..c7c6968af 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -1003,8 +1003,8 @@ MaintainWorldOctree(engine_resources *Engine) /* Node->Chunk = AllocateWorldChunk(Node->WorldP, World->ChunkDim, Node->Resolution, World->ChunkMemory); */ } - QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); - /* QueueChunkForInit(&Plat->RenderQ, Node->Chunk, MeshBit_Lod0); */ + /* QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); */ + QueueChunkForInit(&Plat->RenderQ, Node->Chunk, MeshBit_Lod0); ++Stats.NewQueues; AtomicIncrement(&Graphics->ChunksCurrentlyQueued); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index a75102673..b4ae32a41 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3409,7 +3409,7 @@ QueueChunkForInit(work_queue *Queue, world_chunk *Chunk, world_chunk_mesh_bitfie /* DebugLine("Queuing Chunk (%p)(%d, %d, %d)", Chunk, Chunk->WorldP.x, Chunk->WorldP.y, Chunk->WorldP.z); */ -#if 1 +#if 0 work_queue_entry Entry = {}; { Entry.Type = type_work_queue_entry_init_world_chunk; From 3f358ee4e7b2a2019609bc8c53f7662651ef75a2 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 22 Oct 2024 20:54:20 -0700 Subject: [PATCH 102/421] WIP returning color values from shader --- generated/block_array_h_texture_688856411.h | 2 +- generated/block_array_h_texture_688856411_0.h | 2 +- ..._and_value_tables_texture_storage_format.h | 3 + jesse.make.sh | 2 +- shaders/noise/gradient.fragmentshader | 83 ++++++++++++++++++- src/engine/api.cpp | 2 +- src/engine/render/render_init.cpp | 12 ++- src/engine/resources.cpp | 6 +- src/engine/terrain.cpp | 18 +++- src/engine/terrain.h | 2 +- src/engine/work_queue.h | 2 +- src/engine/world_chunk.cpp | 2 +- 12 files changed, 117 insertions(+), 19 deletions(-) diff --git a/generated/block_array_h_texture_688856411.h b/generated/block_array_h_texture_688856411.h index 901975af3..82048fa11 100644 --- a/generated/block_array_h_texture_688856411.h +++ b/generated/block_array_h_texture_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/texture.h:46:0 +// external/bonsai_stdlib/src/texture.h:47:0 struct texture_ptr_block { diff --git a/generated/block_array_h_texture_688856411_0.h b/generated/block_array_h_texture_688856411_0.h index 8677ffc50..d74015a23 100644 --- a/generated/block_array_h_texture_688856411_0.h +++ b/generated/block_array_h_texture_688856411_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/texture.h:43:0 +// external/bonsai_stdlib/src/texture.h:44:0 struct texture_block { diff --git a/generated/string_and_value_tables_texture_storage_format.h b/generated/string_and_value_tables_texture_storage_format.h index fd9624526..1a78ea9a4 100644 --- a/generated/string_and_value_tables_texture_storage_format.h +++ b/generated/string_and_value_tables_texture_storage_format.h @@ -7,6 +7,7 @@ ToStringPrefixless(texture_storage_format Type) switch (Type) { case TextureStorageFormat_Undefined: { Result = CSz("Undefined"); } break; + case TextureStorageFormat_R16I: { Result = CSz("R16I"); } break; case TextureStorageFormat_R16F: { Result = CSz("R16F"); } break; case TextureStorageFormat_R32F: { Result = CSz("R32F"); } break; case TextureStorageFormat_RG16F: { Result = CSz("RG16F"); } break; @@ -31,6 +32,7 @@ ToString(texture_storage_format Type) switch (Type) { case TextureStorageFormat_Undefined: { Result = CSz("TextureStorageFormat_Undefined"); } break; + case TextureStorageFormat_R16I: { Result = CSz("TextureStorageFormat_R16I"); } break; case TextureStorageFormat_R16F: { Result = CSz("TextureStorageFormat_R16F"); } break; case TextureStorageFormat_R32F: { Result = CSz("TextureStorageFormat_R32F"); } break; case TextureStorageFormat_RG16F: { Result = CSz("TextureStorageFormat_RG16F"); } break; @@ -54,6 +56,7 @@ TextureStorageFormat(counted_string S) texture_storage_format Result = {}; if (StringsMatch(S, CSz("TextureStorageFormat_Undefined"))) { return TextureStorageFormat_Undefined; } + if (StringsMatch(S, CSz("TextureStorageFormat_R16I"))) { return TextureStorageFormat_R16I; } if (StringsMatch(S, CSz("TextureStorageFormat_R16F"))) { return TextureStorageFormat_R16F; } if (StringsMatch(S, CSz("TextureStorageFormat_R32F"))) { return TextureStorageFormat_R32F; } if (StringsMatch(S, CSz("TextureStorageFormat_RG16F"))) { return TextureStorageFormat_RG16F; } diff --git a/jesse.make.sh b/jesse.make.sh index 35f0a7673..2379d4209 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader index c5644e546..af109fbb8 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/noise/gradient.fragmentshader @@ -2,7 +2,74 @@ uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; in vec2 UV; -out f32 Output; +out int Output; +/* layout (location = 0) out float Output; */ + + +int PackHSVColor(v3 Color) +{ + int FiveBits = (1 << 6) - 1; + int H = int(Color.r * f32(FiveBits)); + int S = int(Color.g * r32(FiveBits)); + int V = int(Color.b * r32(FiveBits)); + int Result = int((H << 10) | (S << 5) | V); + return Result; +} + +v3 RGBtoHSV(v3 Color) +{ + f32 r = Color.r; + f32 g = Color.g; + f32 b = Color.b; + + f32 h, s, v; // h:0-360.0, s:0.0-1.0, v:0.0-1.0 + + f32 maxv = max(r, max(g, b)); + f32 minv = min(r, min(g, b)); + + v = maxv; + + if (maxv == 0.0f) + { + s = 0; + h = 0; + } + else if (maxv - minv == 0.0f) + { + s = 0; + h = 0; + } + else { + s = (maxv - minv) / maxv; + + if (maxv == r) { + h = 60 * ((g - b) / (maxv - minv)) + 0; + } + else if (maxv == g) { + h = 60 * ((b - r) / (maxv - minv)) + 120; + } + else { + h = 60 * ((r - g) / (maxv - minv)) + 240; + } + } + + if (h < 0) h += 360.0f; + + h = (h / 360.f); + + v3 result = V3(h,s,v); + return result; +} + +int RGBtoPackedHSV(v3 Color) +{ + v3 HSV = RGBtoHSV(Color); + int Packed = PackHSVColor(HSV); + /* int Packed= 0; */ + return Packed; +} + + // https://www.shadertoy.com/view/4dffRH // @@ -253,8 +320,8 @@ void main() f32 P = 1000.f; v3 Period = V3(P,P,P); float Amplitude = 1000.f; - f32 StartingZDepth = 500.f; - /* f32 StartingZDepth = 0.f; */ + /* f32 StartingZDepth = 5000.f; */ + f32 StartingZDepth = 0.f; s32 Octaves = 8; f32 x = floor(gl_FragCoord.x); @@ -309,5 +376,13 @@ void main() NoiseValue = NoiseValue - Basis.z; NoiseValue = clamp(NoiseValue, -1, 1); - Output = NoiseValue; + bool Solid = NoiseValue > 0.f; + int SolidBit = Solid ? 1 : 0; + + int PackedColor = RGBtoPackedHSV(Color); + + /* Output = (SolidBit << 15 | PackedColor); */ + /* Output = (SolidBit << 14); */ + /* Output = SolidBit; */ + Output = 0; } diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 416550bd1..395158e69 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -564,7 +564,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ work_queue_entry_build_chunk_mesh *Job = SafeAccess(work_queue_entry_build_chunk_mesh, Entry); #if 1 auto Chunk1 = Job->Chunk; - auto NoiseValues = Job->NoiseData; + u16 *NoiseValues = Job->NoiseData; v3i NoiseDim = Job->NoiseDim; Assert(NoiseValues); diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 045733139..7fe1b3d69 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -772,7 +772,17 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr GL.BindFramebuffer(GL_FRAMEBUFFER, Result->GpuNoise.FBO.ID); v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); - GradientShader->ChunkTexture = MakeTexture_SingleChannel(TextureDim, CSz("PerlinNoiseTexture"), False); + /* GradientShader->ChunkTexture = MakeTexture_SingleChannel(TextureDim, CSz("PerlinNoiseTexture"), False); */ + + u32 Channels = 1; + u32 Slices = 1; + { + GradientShader->ChunkTexture = GenTexture(TextureDim, CSz("PerlinNoiseTexture"), TextureStorageFormat_R16I, Channels, Slices, False); + GL.TexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, TextureDim.x, TextureDim.y, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); + AssertNoGlErrors; + GL.BindTexture(GL_TEXTURE_2D, 0); + } + FramebufferTexture(&Result->GpuNoise.FBO, &GradientShader->ChunkTexture); SetDrawBuffers(&Result->GpuNoise.FBO); diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index c860a733d..caa03b26a 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -279,7 +279,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) s32 NoiseElementCount = s32(Volume(NoiseDim)); r32 *NoiseValues; - s32 NoiseByteCount = NoiseElementCount*s32(sizeof(f32)); + s32 NoiseByteCount = NoiseElementCount*s32(sizeof(u16)); { TIMED_NAMED_BLOCK(GenPboAndInitTransfer); @@ -289,7 +289,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); GL.BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); AssertNoGlErrors; - GL.ReadPixels(0, 0, ViewportSize.x, ViewportSize.y, GL_RED, GL_FLOAT, 0); + GL.ReadPixels(0, 0, ViewportSize.x, ViewportSize.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); AssertNoGlErrors; GL.BindBuffer(GL_PIXEL_PACK_BUFFER, 0); @@ -460,7 +460,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOJob->PBOBuf.PBO); AssertNoGlErrors; - f32 *NoiseValues = Cast(f32*, GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); + u16 *NoiseValues = Cast(u16*, GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); AssertNoGlErrors; auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryBuildChunkMesh(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->Chunk)); diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index be65d9f70..40baf109d 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -4,7 +4,7 @@ + SrcToDest.channel \ link_internal u32 -FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, f32 *NoiseValues, v3i SrcToDest, s64 zMin, u16 PackedHSVColorValue) +FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, u16 *NoiseValues, v3i SrcToDest, s64 zMin, u16 PackedHSVColorValue) { TIMED_FUNCTION(); u32 ChunkSum = 0; @@ -31,8 +31,14 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); /* r32 ThisNoiseV = MapNoiseValueToFinal(NoiseValues[NoiseIndex]/OctaveAmplitudeMax)*OctaveAmplitudeMax; */ - r32 ThisNoiseV = NoiseValues[NoiseIndex]; - u64 NoiseChoice = u64(ThisNoiseV > WorldZBiased); + u16 ThisNoiseV = NoiseValues[NoiseIndex]; + Assert(ThisNoiseV == (1 << 15) || ThisNoiseV == 0); + + u64 NoiseChoice = (ThisNoiseV >> 14) & 1; + u16 NoiseColor = PackedHSVColorValue; + + /* u64 NoiseChoice = (ThisNoiseV >> 15) & 1; */ + /* u16 NoiseColor = ThisNoiseV & ((1 << 15) -1); */ ChunkSum += u32(NoiseChoice); Mask |= (NoiseChoice << xChunk); @@ -44,7 +50,7 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ /* } */ - Chunk->Voxels[ChunkIndex].Color = PackedHSVColorValue*u16(NoiseChoice); + Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } @@ -385,6 +391,7 @@ Terrain_FBM2D( world_chunk *Chunk, void *NoiseParams, void *OctaveCount ) { +#if 0 /* TIMED_FUNCTION(); */ HISTOGRAM_FUNCTION(); @@ -565,6 +572,9 @@ Terrain_FBM2D( world_chunk *Chunk, ChunkSum = FinalizeOccupancyMasksFromNoiseValues(Chunk, WorldBasis, NoiseDim, NoiseValues, SrcToDest, zMin, PackedHSVColorValue); return ChunkSum; +#else + return 0; +#endif } link_internal u32 diff --git a/src/engine/terrain.h b/src/engine/terrain.h index e8509ede7..ca279b149 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -304,4 +304,4 @@ link_internal u32 Terrain_Voronoi2D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); link_internal u32 -FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, f32 *NoiseValues, v3i SrcToDest, s64 zMin, u16 PackedHSVColorValue); +FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, u16 *NoiseValues, v3i SrcToDest, s64 zMin, u16 PackedHSVColorValue); diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index d86b2437f..5489b149f 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -64,7 +64,7 @@ struct work_queue_entry_build_chunk_mesh { gpu_readback_buffer PBOBuf; - f32 *NoiseData; + u16 *NoiseData; v3i NoiseDim; world_chunk *Chunk; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index b4ae32a41..5918ac117 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3713,7 +3713,7 @@ WorkQueueEntryRebuildMesh(world_chunk *Chunk, chunk_init_flags Flags) } link_internal work_queue_entry_build_chunk_mesh -WorkQueueEntryBuildChunkMesh(gpu_readback_buffer PBOBuf, f32 *NoiseData, v3i NoiseDim, world_chunk *Chunk) +WorkQueueEntryBuildChunkMesh(gpu_readback_buffer PBOBuf, u16 *NoiseData, v3i NoiseDim, world_chunk *Chunk) { work_queue_entry_build_chunk_mesh Result = { PBOBuf, NoiseData, NoiseDim, Chunk }; return Result; From 794396e38e29b15cfb6c9c63c5da7066d5960a62 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 23 Oct 2024 10:34:35 -0700 Subject: [PATCH 103/421] Generating color from shader --- external/bonsai_stdlib | 2 +- jesse.make.sh | 2 +- shaders/noise/gradient.fragmentshader | 42 ++++++++++++++------------- src/engine/terrain.cpp | 12 ++++---- 4 files changed, 30 insertions(+), 28 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index dd660f0a9..f3802060e 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit dd660f0a9c5184e730ad502e826dac2db028d772 +Subproject commit f3802060e90c4eb59c5535386e3cbed35b233f73 diff --git a/jesse.make.sh b/jesse.make.sh index 2379d4209..35f0a7673 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/noise/gradient.fragmentshader b/shaders/noise/gradient.fragmentshader index af109fbb8..8523fa022 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/noise/gradient.fragmentshader @@ -2,17 +2,18 @@ uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; in vec2 UV; -out int Output; +out uint Output; /* layout (location = 0) out float Output; */ -int PackHSVColor(v3 Color) +uint PackHSVColor(v3 Color) { - int FiveBits = (1 << 6) - 1; - int H = int(Color.r * f32(FiveBits)); - int S = int(Color.g * r32(FiveBits)); - int V = int(Color.b * r32(FiveBits)); - int Result = int((H << 10) | (S << 5) | V); + uint FiveBits = (1u << 6) - 1u; + uint FifteenBits = (1u << 15) - 1u; + uint H = uint(Color.r * f32(FiveBits)); + uint S = uint(Color.g * r32(FiveBits)); + uint V = uint(Color.b * r32(FiveBits)); + uint Result = uint((H << 10) | (S << 5) | V) & FifteenBits; return Result; } @@ -61,10 +62,10 @@ v3 RGBtoHSV(v3 Color) return result; } -int RGBtoPackedHSV(v3 Color) +uint RGBtoPackedHSV(v3 Color) { v3 HSV = RGBtoHSV(Color); - int Packed = PackHSVColor(HSV); + uint Packed = PackHSVColor(HSV); /* int Packed= 0; */ return Packed; } @@ -320,8 +321,7 @@ void main() f32 P = 1000.f; v3 Period = V3(P,P,P); float Amplitude = 1000.f; - /* f32 StartingZDepth = 5000.f; */ - f32 StartingZDepth = 0.f; + f32 StartingZDepth = 1000.f; /* f32 StartingZDepth = 0.f; */ s32 Octaves = 8; f32 x = floor(gl_FragCoord.x); @@ -335,7 +335,7 @@ void main() v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); f32 NoiseValue = StartingZDepth; - v3 Color = V3(1,0,1); + v3 Color = V3(1,1,1); // // -- user code -- @@ -351,8 +351,8 @@ void main() /* f32 warp = gradient_noise(xyz*2)*0.2f; */ f32 warp = 0.f; - /* v4 gn = value_noise_derivs(xyz+warp); */ - v4 gn = gradient_noise_derivs(xyz+warp); + v4 gn = value_noise_derivs(xyz+warp); + /* v4 gn = gradient_noise_derivs(xyz+warp); */ deriv += gn.xyz; @@ -360,7 +360,8 @@ void main() } #endif - /* deriv = normalize(deriv); */ + deriv = normalize(deriv); + Color = deriv; /* f32 cosDeriv = dot(deriv, V3(0,0,1)); */ /* f32 cosDeriv = 1.f; */ @@ -377,12 +378,13 @@ void main() NoiseValue = clamp(NoiseValue, -1, 1); bool Solid = NoiseValue > 0.f; - int SolidBit = Solid ? 1 : 0; + uint SolidBit = Solid ? 1u : 0u; - int PackedColor = RGBtoPackedHSV(Color); + uint PackedColor = RGBtoPackedHSV(Color); - /* Output = (SolidBit << 15 | PackedColor); */ - /* Output = (SolidBit << 14); */ + Output = (SolidBit << 15) | PackedColor; + /* Output = (SolidBit << 15) | 1u; */ + /* Output = (SolidBit << 15); */ /* Output = SolidBit; */ - Output = 0; + /* Output = 0u; */ } diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 40baf109d..b3c2382e0 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -32,15 +32,15 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No /* r32 ThisNoiseV = MapNoiseValueToFinal(NoiseValues[NoiseIndex]/OctaveAmplitudeMax)*OctaveAmplitudeMax; */ u16 ThisNoiseV = NoiseValues[NoiseIndex]; - Assert(ThisNoiseV == (1 << 15) || ThisNoiseV == 0); + /* Assert(ThisNoiseV == (1 << 15) || ThisNoiseV == 0); */ - u64 NoiseChoice = (ThisNoiseV >> 14) & 1; - u16 NoiseColor = PackedHSVColorValue; - - /* u64 NoiseChoice = (ThisNoiseV >> 15) & 1; */ - /* u16 NoiseColor = ThisNoiseV & ((1 << 15) -1); */ + u64 NoiseChoice = (ThisNoiseV >> 15); + Assert(NoiseChoice == 1 || NoiseChoice == 0); ChunkSum += u32(NoiseChoice); + + u16 NoiseColor = ThisNoiseV & ((1 << 15) -1); + Mask |= (NoiseChoice << xChunk); /* SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); */ From e961268f964f0c24d8d8e5c70f98615718a27001 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 23 Oct 2024 11:02:51 -0700 Subject: [PATCH 104/421] Minor cleanup --- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 2 +- generated/for_datatypes_fkubhsYl.h | 2 +- generated/for_datatypes_kv3WBTai.h | 2 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- ...shader.h => shader_magic_terrain_shader.h} | 10 +++--- .../default.fragmentshader} | 36 ++++++++++--------- src/engine/api.cpp | 4 +-- src/engine/graphics.h | 11 +++--- src/engine/render/render_init.cpp | 10 +++--- src/engine/resources.cpp | 20 ++++++++--- src/engine/world.h | 3 ++ 13 files changed, 61 insertions(+), 45 deletions(-) rename generated/{shader_magic_gradient_noise_shader.h => shader_magic_terrain_shader.h} (72%) rename shaders/{noise/gradient.fragmentshader => terrain/default.fragmentshader} (97%) diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index b58d7bda8..f6c3523b7 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:68:0 +// src/engine/graphics.h:67:0 struct dummy_work_queue_entry_build_chunk_mesh_block { diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 7cd940007..a8e1d5a99 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:57:0 +// src/engine/graphics.h:56:0 struct gpu_readback_buffer_block { diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 2b9793a37..7907dea06 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -195,7 +195,6 @@ - struct render_to_texture_async_params; @@ -678,6 +677,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 1c2df749d..dbb2c6d4c 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -195,7 +195,6 @@ - render_to_texture_async_params render_to_texture_async_params; @@ -668,6 +667,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 1767ca6c6..dbd632e9b 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -195,7 +195,6 @@ - type_render_to_texture_async_params, @@ -668,6 +667,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index 8a988b6f5..86fd9768b 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:54:0 +// src/engine/graphics.h:53:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/shader_magic_gradient_noise_shader.h b/generated/shader_magic_terrain_shader.h similarity index 72% rename from generated/shader_magic_gradient_noise_shader.h rename to generated/shader_magic_terrain_shader.h index 15454a9f4..7e5dee124 100644 --- a/generated/shader_magic_gradient_noise_shader.h +++ b/generated/shader_magic_terrain_shader.h @@ -1,9 +1,9 @@ // src/engine/graphics.h:16:0 link_internal void -InitializeGradientNoiseShader( gradient_noise_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) +InitializeTerrainShader( terrain_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) { - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/noise/gradient.fragmentshader")); + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/default.fragmentshader")); u32 UniformIndex = 0; @@ -21,7 +21,7 @@ InitializeGradientNoiseShader( gradient_noise_shader *Struct , v3 ChunkDim , if (UniformIndex != 3 ) { - Error("Shader (gradient_noise_shader) had an incorrect number of uniform slots!"); + Error("Shader (terrain_shader) had an incorrect number of uniform slots!"); } @@ -30,7 +30,7 @@ InitializeGradientNoiseShader( gradient_noise_shader *Struct , v3 ChunkDim , } link_internal void -UseShader( gradient_noise_shader *Struct ) +UseShader( terrain_shader *Struct ) { GL.UseProgram(Struct->Program.ID); @@ -47,7 +47,7 @@ UseShader( gradient_noise_shader *Struct ) if (UniformIndex != 3 ) { - Error("Shader (gradient_noise_shader) had an incorrect number of uniform slots!"); + Error("Shader (terrain_shader) had an incorrect number of uniform slots!"); } } diff --git a/shaders/noise/gradient.fragmentshader b/shaders/terrain/default.fragmentshader similarity index 97% rename from shaders/noise/gradient.fragmentshader rename to shaders/terrain/default.fragmentshader index 8523fa022..4a42a22b6 100644 --- a/shaders/noise/gradient.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -318,41 +318,43 @@ vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) } void main() { - f32 P = 1000.f; - v3 Period = V3(P,P,P); - float Amplitude = 1000.f; - f32 StartingZDepth = 1000.f; /* f32 StartingZDepth = 0.f; */ - s32 Octaves = 8; - f32 x = floor(gl_FragCoord.x); - /* f32 y = f32(s32(gl_FragCoord.y) % 66); */ f32 z = floor(gl_FragCoord.y / 66); + /* f32 y = f32(s32(gl_FragCoord.y) % 66); */ f32 y = floor(gl_FragCoord.y - (z*66)); - /* v3 Offset = V3(-1, -1, -1); */ - v3 Offset = V3(0,-1,0); + v3 Offset = V3(-1, -1, -1); + /* v3 Offset = v3(1,1,1); */ v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); - f32 NoiseValue = StartingZDepth; - v3 Color = V3(1,1,1); - // // -- user code -- // + f32 Per = 1000.f; + v3 Period = V3(Per, Per, Per); + float Amplitude = 1000.f; + f32 StartingZDepth = 1000.f; /* f32 StartingZDepth = 0.f; */ + s32 Octaves = 1; + + + f32 NoiseValue = StartingZDepth; + v3 Color = V3(1,1,1); + v3 deriv = v3(0.f); + f32 warp = gradient_noise(Basis*2)*5.2f; + #if 1 for (s32 Octave = 1; Octave <= Octaves; ++Octave) { /* Basis.x = round(Basis.x); */ v3 xyz = Basis / (Period/Octave); - /* f32 warp = gradient_noise(xyz*2)*0.2f; */ - f32 warp = 0.f; + /* f32 warp = 0.f; */ - v4 gn = value_noise_derivs(xyz+warp); - /* v4 gn = gradient_noise_derivs(xyz+warp); */ + /* v4 gn = value_noise_derivs(xyz+warp); */ + v4 gn = gradient_noise_derivs(xyz+warp); deriv += gn.xyz; @@ -361,7 +363,7 @@ void main() #endif deriv = normalize(deriv); - Color = deriv; + Color = abs(deriv); /* f32 cosDeriv = dot(deriv, V3(0,0,1)); */ /* f32 cosDeriv = 1.f; */ diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 395158e69..a3b5b2238 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -87,9 +87,9 @@ Bonsai_FrameBegin(engine_resources *Resources) // Resources->FrameIndex += 1; - if (Resources->Graphics.GpuNoise.GradientShader.Program.HotReloaded) + if (Resources->Graphics.GpuNoise.TerrainShader.Program.HotReloaded) { - HardResetWorld(Resources); + SoftResetWorld(Resources); } MaintainWorldOctree(Resources); diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 0c8940787..70c10eded 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -1,8 +1,8 @@ -struct gradient_noise_shader +struct terrain_shader poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") - @frag_source_file("shaders/noise/gradient.fragmentshader") ) + @frag_source_file("shaders/terrain/default.fragmentshader") ) { shader Program; shader_uniform Uniforms[3]; @@ -13,16 +13,15 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader v3 ChunkResolution; poof(@uniform) }; -poof(shader_magic(gradient_noise_shader)) -#include +poof(shader_magic(terrain_shader)) +#include struct gpu_noise_render_group { framebuffer FBO; u32 GlTimerObject; - gradient_noise_shader GradientShader; - + terrain_shader TerrainShader; }; struct composite_render_group diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 7fe1b3d69..2985e7fc2 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -760,9 +760,9 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr { - gradient_noise_shader *GradientShader = &Result->GpuNoise.GradientShader; + terrain_shader *TerrainShader = &Result->GpuNoise.TerrainShader; v3 ChunkDim = V3(66, 66, 66); - InitializeGradientNoiseShader(&Result->GpuNoise.GradientShader, ChunkDim, {}, {}); + InitializeTerrainShader(&Result->GpuNoise.TerrainShader, ChunkDim, {}, {}); Result->GpuNoise.FBO = GenFramebuffer(); @@ -772,18 +772,18 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr GL.BindFramebuffer(GL_FRAMEBUFFER, Result->GpuNoise.FBO.ID); v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); - /* GradientShader->ChunkTexture = MakeTexture_SingleChannel(TextureDim, CSz("PerlinNoiseTexture"), False); */ + /* TerrainShader->ChunkTexture = MakeTexture_SingleChannel(TextureDim, CSz("PerlinNoiseTexture"), False); */ u32 Channels = 1; u32 Slices = 1; { - GradientShader->ChunkTexture = GenTexture(TextureDim, CSz("PerlinNoiseTexture"), TextureStorageFormat_R16I, Channels, Slices, False); + TerrainShader->ChunkTexture = GenTexture(TextureDim, CSz("PerlinNoiseTexture"), TextureStorageFormat_R16I, Channels, Slices, False); GL.TexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, TextureDim.x, TextureDim.y, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); AssertNoGlErrors; GL.BindTexture(GL_TEXTURE_2D, 0); } - FramebufferTexture(&Result->GpuNoise.FBO, &GradientShader->ChunkTexture); + FramebufferTexture(&Result->GpuNoise.FBO, &TerrainShader->ChunkTexture); SetDrawBuffers(&Result->GpuNoise.FBO); Ensure(CheckAndClearFramebuffer()); diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index caa03b26a..0c8fae4b5 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -254,7 +254,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) Assert(s64(Chunk) == s64(Chunk1)); - auto *Shader = &Graphics->GpuNoise.GradientShader; + auto *Shader = &Graphics->GpuNoise.TerrainShader; v3i Apron = V3i(2, 2, 2); v3 NoiseDim = V3(Shader->ChunkDim); @@ -677,7 +677,7 @@ SoftResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag link_internal void -HardResetWorld(engine_resources *Engine) +SoftResetWorld(engine_resources *Engine) { world *World = Engine->World; @@ -691,9 +691,21 @@ HardResetWorld(engine_resources *Engine) InitOctreeNode(World, &World->Root, {}, World->VisibleRegion); World->Root.Chunk = AllocateWorldChunk( {}, World->ChunkDim, World->VisibleRegion, World->ChunkMemory); +} + +link_internal void +HardResetWorld(engine_resources *Engine) +{ + world *World = Engine->World; + VaporizeArena(World->ChunkMemory); + VaporizeArena(&World->OctreeMemory); + + v3i Center = World->Center; + v3i ChunkDim = World->ChunkDim; + v3i VisibleRegion = World->VisibleRegion; + Clear(World); - /* VaporizeArena(World->ChunkMemory); */ - /* World->ChunkMemory = AllocateArena(); */ + AllocateWorld(World, Center, ChunkDim, VisibleRegion); } link_internal void diff --git a/src/engine/world.h b/src/engine/world.h index 0f2a9e3be..cb539f237 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -214,3 +214,6 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node); link_internal void InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks); + +link_internal world * +AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion); From 0f36f2c8e3db0a5d531aa27010b817d1ae266c87 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 23 Oct 2024 11:19:15 -0700 Subject: [PATCH 105/421] Cleanup in terrain/default.fragmentshader --- shaders/terrain/default.fragmentshader | 80 +++++++++++--------------- 1 file changed, 34 insertions(+), 46 deletions(-) diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index 4a42a22b6..701ceba3e 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -304,8 +304,8 @@ vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) if( d < res ) { res = d; - Out.x = d; - Out.y= offset.x; + Out.x= offset.x; + Out.y = d; } if( dot(mr-r,mr-r)>0.00001) { @@ -316,77 +316,65 @@ vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) Out.w = 1.0-smoothstep( 0.0, 0.1, res); return Out; } + void main() { f32 x = floor(gl_FragCoord.x); f32 z = floor(gl_FragCoord.y / 66); - /* f32 y = f32(s32(gl_FragCoord.y) % 66); */ f32 y = floor(gl_FragCoord.y - (z*66)); v3 Offset = V3(-1, -1, -1); - /* v3 Offset = v3(1,1,1); */ - v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + // // -- user code -- // - f32 Per = 1000.f; - v3 Period = V3(Per, Per, Per); - float Amplitude = 1000.f; - f32 StartingZDepth = 1000.f; /* f32 StartingZDepth = 0.f; */ - s32 Octaves = 1; + { + v3 Period = V3(100.f); + float Amplitude = 200.f; + f32 StartingZDepth = 1000.f; + s32 Octaves = 1; + NoiseValue = StartingZDepth; - f32 NoiseValue = StartingZDepth; - v3 Color = V3(1,1,1); + v3 deriv = v3(0.f); + /* f32 warp = gradient_noise(Basis*2)*5.2f; */ + f32 warp = 0.f; - v3 deriv = v3(0.f); - f32 warp = gradient_noise(Basis*2)*5.2f; + for (s32 Octave = 1; Octave <= Octaves; ++Octave) + { + v3 xyz = Basis / (Period/Octave); -#if 1 - for (s32 Octave = 1; Octave <= Octaves; ++Octave) - { - /* Basis.x = round(Basis.x); */ - v3 xyz = Basis / (Period/Octave); + v4 gn = value_noise_derivs(xyz+warp); + /* v4 gn = gradient_noise_derivs(xyz+warp); */ + /* v4 gn = voronoi_noise(xyz+warp, V3(1.f), V3(1.f)); */ + /* v4 gn = V4(0); */ - /* f32 warp = 0.f; */ + // NOTE(Jesse): yzw is not derivitives for voronoi_noise + deriv += gn.yzw; - /* v4 gn = value_noise_derivs(xyz+warp); */ - v4 gn = gradient_noise_derivs(xyz+warp); + NoiseValue = NoiseValue + (gn.x * (Amplitude/Octave)); + } - deriv += gn.xyz; + deriv = normalize(deriv); + ColorValue = abs(deriv); - NoiseValue = NoiseValue + (gn.x * (Amplitude/Octave)); + // Bias noise value to lower values as we get higher in z. + // This creates a "plane" of terrain + NoiseValue = NoiseValue - Basis.z; } -#endif - - deriv = normalize(deriv); - Color = abs(deriv); - - /* f32 cosDeriv = dot(deriv, V3(0,0,1)); */ - /* f32 cosDeriv = 1.f; */ - - /* v4 vn = voronoi_noise(Basis/(Period/4.f), vec3(3.f), vec3(3.f)); */ - /* NoiseValue = NoiseValue + (cosDeriv * vn.y * (Amplitude/2.f)); */ - // // -- end user code -- // - NoiseValue = NoiseValue - Basis.z; - NoiseValue = clamp(NoiseValue, -1, 1); - - bool Solid = NoiseValue > 0.f; - uint SolidBit = Solid ? 1u : 0u; - - uint PackedColor = RGBtoPackedHSV(Color); + uint SolidBit = NoiseValue > 0.f ? 1u : 0u; + uint PackedColor = RGBtoPackedHSV(ColorValue); Output = (SolidBit << 15) | PackedColor; - /* Output = (SolidBit << 15) | 1u; */ - /* Output = (SolidBit << 15); */ - /* Output = SolidBit; */ - /* Output = 0u; */ } From 9627c7dc65e42e6b1a9b762ce11096bc0dee0009 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 23 Oct 2024 11:20:40 -0700 Subject: [PATCH 106/421] Turn off DrawMinorGrid by default --- src/engine/render/render_init.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 2985e7fc2..3940eba42 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -579,7 +579,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Result->Settings.UseLightingBloom = True; /* Result->Settings.DrawMajorGrid = True; */ - Result->Settings.DrawMinorGrid = True; + /* Result->Settings.DrawMinorGrid = True; */ Result->Settings.MajorGridDim = 8.f; Result->Exposure = 1.5f; From bcd455d93720ad3238c911d1785be5541250bd11 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 23 Oct 2024 11:41:56 -0700 Subject: [PATCH 107/421] Center camera on visible region at startup --- examples/terrain_gen/game.cpp | 2 ++ src/engine/camera.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index d5356b809..99e61b09e 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -793,6 +793,8 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* CameraGhost->P.WorldP = V3i(5, -73, 2); */ /* CameraGhost->P.WorldP = V3i(1000, 1000, 100); */ /* CameraGhost->P.WorldP = WorldCenter; */ + /* CameraGhost->P.WorldP = WorldCenter + g_VisibleRegion/2; */ + CameraGhost->P.WorldP = g_VisibleRegion/2; CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); SpawnEntity(CameraGhost); diff --git a/src/engine/camera.cpp b/src/engine/camera.cpp index d65f37fc0..0ad96aa21 100644 --- a/src/engine/camera.cpp +++ b/src/engine/camera.cpp @@ -186,7 +186,7 @@ StandardCamera(camera* Camera, f32 FarClip, f32 DistanceFromTarget, f32 Blend) Camera->Right = WORLD_X; Camera->TargetPitch = PI32 - (PI32*0.25f); - Camera->TargetYaw = -PI32*0.15f; + Camera->TargetYaw = PI32*0.125f; Camera->TargetDistanceFromTarget = DistanceFromTarget; From 5f1f49e450a1f064dc43376b687ad18b4c45d8f9 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 23 Oct 2024 12:01:21 -0700 Subject: [PATCH 108/421] Fixed holes on chunk borders --- src/engine/terrain.cpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index b3c2382e0..85ea83499 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -32,8 +32,6 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No /* r32 ThisNoiseV = MapNoiseValueToFinal(NoiseValues[NoiseIndex]/OctaveAmplitudeMax)*OctaveAmplitudeMax; */ u16 ThisNoiseV = NoiseValues[NoiseIndex]; - /* Assert(ThisNoiseV == (1 << 15) || ThisNoiseV == 0); */ - u64 NoiseChoice = (ThisNoiseV >> 15); Assert(NoiseChoice == 1 || NoiseChoice == 0); ChunkSum += u32(NoiseChoice); @@ -83,11 +81,9 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No v3i BorderP = V3i(0, yNoise, zNoise); s32 BorderIndex = GetIndex(BorderP, NoiseDim); - r32 ThisNoiseV = NoiseValues[BorderIndex]; - - u64 NoiseChoice = ThisNoiseV > WorldZBiased; - /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ + u16 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = (ThisNoiseV >> 15); + Assert(NoiseChoice == 1 || NoiseChoice == 0); Chunk->xOccupancyBorder[(zNoise-1)*2] |= NoiseChoice << (yNoise-1); } @@ -95,11 +91,9 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No v3i BorderP = V3i(65, yNoise, zNoise); s32 BorderIndex = GetIndex(BorderP, NoiseDim); - r32 ThisNoiseV = NoiseValues[BorderIndex]; - - u64 NoiseChoice = ThisNoiseV > WorldZBiased; - /* u64 NoiseChoice = 1ull; */ - /* u64 NoiseChoice = RandomU32(&DEBUG_ENTROPY) & 1; */ + u16 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = (ThisNoiseV >> 15); + Assert(NoiseChoice == 1 || NoiseChoice == 0); Chunk->xOccupancyBorder[((zNoise-1)*2)+1] |= NoiseChoice << (yNoise-1); } From 68153f6f1bcb228828e69a509638dd77c1885494 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 06:14:17 -0700 Subject: [PATCH 109/421] Eliminate CPU buffer copies when building chunk meshes --- .../asyncify_render_function_c_DrawLod.h | 4 +- ...yncify_render_function_c_RenderToTexture.h | 4 +- .../asyncify_render_function_h_DrawLod.h | 4 +- ...yncify_render_function_h_RenderToTexture.h | 4 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- generated/block_array_model_688856411.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/block_array_vox_data_688856411.h | 2 +- generated/buffer_model.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- ..._work_queue_entry__bonsai_render_command.h | 58 +++++- generated/d_union_bonsai_render_command.h | 8 +- .../d_union_constructors_work_queue_entry.h | 15 +- generated/d_union_work_queue_entry.h | 4 +- .../do_editor_ui_for_compound_type_model.h | 15 ++ ..._editor_ui_for_compound_type_world_chunk.h | 4 +- ...on_pattern_199741702_161749140_632272777.h | 2 +- ..._iteration_pattern_275071431_101859599_0.h | 2 +- ..._iteration_pattern_275071431_785723886_0.h | 2 +- ..._iteration_pattern_846291950_267608728_0.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 5 +- generated/for_datatypes_fkubhsYl.h | 5 +- generated/for_datatypes_kv3WBTai.h | 5 +- .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- ...ent_buffer_untextured_3d_geometry_buffer.h | 2 +- generated/maybe_model_buffer.h | 2 +- generated/maybe_standing_spot.h | 2 +- ..._work_queue_entry__bonsai_render_command.h | 22 +++ .../rectalinear_iteration_pattern_398799212.h | 2 +- .../rectalinear_iteration_pattern_416827956.h | 2 +- .../rectalinear_iteration_pattern_428632106.h | 2 +- .../rectalinear_iteration_pattern_530902269.h | 2 +- .../rectalinear_iteration_pattern_583358156.h | 2 +- .../rectalinear_iteration_pattern_631222419.h | 2 +- .../rectalinear_iteration_pattern_643608995.h | 2 +- .../rectalinear_iteration_pattern_812652930.h | 2 +- .../rectalinear_iteration_pattern_920026661.h | 2 +- .../rectalinear_iteration_pattern_992879728.h | 2 +- .../rectalinear_iteration_pattern_99934950.h | 2 +- .../take_release_sync_lod_element_buffer.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 8 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 8 +- jesse.bonsai.rdbg | Bin 15953 -> 15230 bytes jesse.make.sh | 2 +- shaders/terrain/default.fragmentshader | 3 +- src/engine/api.cpp | 186 ++++++------------ src/engine/asset.cpp | 4 +- src/engine/bonsai.h | 3 +- src/engine/debug.cpp | 28 +-- src/engine/editor.cpp | 25 ++- src/engine/entity.cpp | 4 +- src/engine/mesh.cpp | 29 ++- src/engine/mesh.h | 2 +- src/engine/model.h | 3 + src/engine/render.cpp | 62 +++++- src/engine/render_command.h | 24 ++- src/engine/resources.cpp | 39 ++-- src/engine/terrain.cpp | 136 ++++++------- src/engine/terrain.h | 2 +- src/engine/voxel_synthesis.cpp | 2 +- src/engine/work_queue.h | 19 +- src/engine/world.cpp | 18 +- src/engine/world_chunk.cpp | 156 +++++++++++---- src/engine/world_chunk.h | 10 +- src/engine/world_update.cpp | 3 +- 68 files changed, 617 insertions(+), 374 deletions(-) diff --git a/generated/asyncify_render_function_c_DrawLod.h b/generated/asyncify_render_function_c_DrawLod.h index 1772a5bfb..ddef67315 100644 --- a/generated/asyncify_render_function_c_DrawLod.h +++ b/generated/asyncify_render_function_c_DrawLod.h @@ -1,7 +1,7 @@ -// src/engine/work_queue.h:318:0 +// src/engine/work_queue.h:327:0 link_internal void -DrawLod_Async(work_queue *Queue,engine_resources *Engine ,shader *Shader ,lod_element_buffer *Meshes ,r32 DistanceSquared ,v3 Basis ,Quaternion Rotation ,v3 Scale ) +DrawLod_Async(work_queue *Queue,engine_resources *Engine ,shader *Shader ,gpu_mapped_element_buffer *Meshes ,r32 DistanceSquared ,v3 Basis ,Quaternion Rotation ,v3 Scale ) { draw_lod_async_params Params = { diff --git a/generated/asyncify_render_function_c_RenderToTexture.h b/generated/asyncify_render_function_c_RenderToTexture.h index 3269d9e29..3ec43a5aa 100644 --- a/generated/asyncify_render_function_c_RenderToTexture.h +++ b/generated/asyncify_render_function_c_RenderToTexture.h @@ -1,7 +1,7 @@ -// src/engine/work_queue.h:315:0 +// src/engine/work_queue.h:324:0 link_internal void -RenderToTexture_Async(work_queue *Queue,engine_resources *Engine ,asset_thumbnail *Thumb ,lod_element_buffer *Meshes ,v3 Offset ,camera *Camera ) +RenderToTexture_Async(work_queue *Queue,engine_resources *Engine ,asset_thumbnail *Thumb ,gpu_mapped_element_buffer *Meshes ,v3 Offset ,camera *Camera ) { render_to_texture_async_params Params = { diff --git a/generated/asyncify_render_function_h_DrawLod.h b/generated/asyncify_render_function_h_DrawLod.h index f072122ba..f17b43d52 100644 --- a/generated/asyncify_render_function_h_DrawLod.h +++ b/generated/asyncify_render_function_h_DrawLod.h @@ -1,10 +1,10 @@ -// src/engine/work_queue.h:172:0 +// src/engine/work_queue.h:180:0 struct draw_lod_async_params poof(@async_function_params) { engine_resources *Engine; shader *Shader; -lod_element_buffer *Meshes; +gpu_mapped_element_buffer *Meshes; r32 DistanceSquared; v3 Basis; Quaternion Rotation; diff --git a/generated/asyncify_render_function_h_RenderToTexture.h b/generated/asyncify_render_function_h_RenderToTexture.h index 1823c8614..8c40b92bc 100644 --- a/generated/asyncify_render_function_h_RenderToTexture.h +++ b/generated/asyncify_render_function_h_RenderToTexture.h @@ -1,10 +1,10 @@ -// src/engine/work_queue.h:169:0 +// src/engine/work_queue.h:174:0 struct render_to_texture_async_params poof(@async_function_params) { engine_resources *Engine; asset_thumbnail *Thumb; -lod_element_buffer *Meshes; +gpu_mapped_element_buffer *Meshes; v3 Offset; camera *Camera; }; diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index e65c24d8c..74d43129a 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:447:0 +// src/engine/world_chunk.h:451:0 struct world_chunk_ptr_block { diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 57de31cdf..901c69953 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -1,4 +1,4 @@ -// src/engine/model.h:91:0 +// src/engine/model.h:94:0 struct model_block { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 8a8a035ee..5bad149ce 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:488:0 +// src/engine/world_chunk.h:492:0 struct standing_spot_block { diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index 38ccadb32..222154740 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -1,4 +1,4 @@ -// src/engine/model.h:85:0 +// src/engine/model.h:88:0 struct vox_data_block { diff --git a/generated/buffer_model.h b/generated/buffer_model.h index bbd53b057..677f26dee 100644 --- a/generated/buffer_model.h +++ b/generated/buffer_model.h @@ -1,4 +1,4 @@ -// src/engine/model.h:88:0 +// src/engine/model.h:91:0 struct model_buffer { diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 3d3a3d909..4c4febb16 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:515:0 +// src/engine/world_chunk.h:519:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index 5685b6110..606ea199b 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:444:0 +// src/engine/world_chunk.h:448:0 struct world_chunk_ptr_buffer { diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index 3a6664656..3d1f1b12a 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:182:0 +// src/engine/render_command.h:204:0 link_internal work_queue_entry__bonsai_render_command @@ -114,6 +114,32 @@ WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_do_stuff A ) + }; + return Result; +} + +link_internal work_queue_entry__bonsai_render_command +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_allocate_and_map_gpu_element_buffer A ) +{ + work_queue_entry__bonsai_render_command Result = { + .Type = type_bonsai_render_command_allocate_and_map_gpu_element_buffer, + .bonsai_render_command_allocate_and_map_gpu_element_buffer = A, + + + + }; + return Result; +} + +link_internal work_queue_entry__bonsai_render_command +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_unmap_gpu_element_buffer A ) +{ + work_queue_entry__bonsai_render_command Result = { + .Type = type_bonsai_render_command_unmap_gpu_element_buffer, + .bonsai_render_command_unmap_gpu_element_buffer = A, + + + }; return Result; } @@ -363,6 +389,36 @@ BonsaiRenderCommandDoStuff( u32 Ignored ) return Reuslt; } +link_internal bonsai_render_command_allocate_and_map_gpu_element_buffer +BonsaiRenderCommandAllocateAndMapGpuElementBuffer( data_type Type , u32 ElementCount , gpu_mapped_element_buffer* Dest , world_chunk* SynChunk , world_chunk* DestChunk ) +{ + bonsai_render_command_allocate_and_map_gpu_element_buffer Reuslt = { + .Type = Type +, + .ElementCount = ElementCount +, + .Dest = Dest +, + .SynChunk = SynChunk +, + .DestChunk = DestChunk + }; + + + return Reuslt; +} + +link_internal bonsai_render_command_unmap_gpu_element_buffer +BonsaiRenderCommandUnmapGpuElementBuffer( gpu_mapped_element_buffer* Buf ) +{ + bonsai_render_command_unmap_gpu_element_buffer Reuslt = { + .Buf = Buf + }; + + + return Reuslt; +} + link_internal bonsai_render_command_unmap_and_deallocate_buffer BonsaiRenderCommandUnmapAndDeallocateBuffer( gpu_readback_buffer PBOBuf ) { diff --git a/generated/d_union_bonsai_render_command.h b/generated/d_union_bonsai_render_command.h index f813c2f28..33c2c4a8d 100644 --- a/generated/d_union_bonsai_render_command.h +++ b/generated/d_union_bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:145:0 +// src/engine/render_command.h:156:0 enum work_queue_entry__bonsai_render_command_type { @@ -12,7 +12,8 @@ enum work_queue_entry__bonsai_render_command_type type_bonsai_render_command_deallocate_buffers, type_bonsai_render_command_deallocate_world_chunk, type_bonsai_render_command_do_stuff, - type_bonsai_render_command_unmap_and_deallocate_buffer, + type_bonsai_render_command_allocate_and_map_gpu_element_buffer, + type_bonsai_render_command_unmap_gpu_element_buffer, type_bonsai_render_command_setup_shader, type_bonsai_render_command_teardown_shader, type_bonsai_render_command_set_shader_uniform, @@ -39,7 +40,8 @@ struct work_queue_entry__bonsai_render_command struct bonsai_render_command_deallocate_buffers bonsai_render_command_deallocate_buffers; struct bonsai_render_command_deallocate_world_chunk bonsai_render_command_deallocate_world_chunk; struct bonsai_render_command_do_stuff bonsai_render_command_do_stuff; - struct bonsai_render_command_unmap_and_deallocate_buffer bonsai_render_command_unmap_and_deallocate_buffer; + struct bonsai_render_command_allocate_and_map_gpu_element_buffer bonsai_render_command_allocate_and_map_gpu_element_buffer; + struct bonsai_render_command_unmap_gpu_element_buffer bonsai_render_command_unmap_gpu_element_buffer; struct bonsai_render_command_setup_shader bonsai_render_command_setup_shader; struct bonsai_render_command_teardown_shader bonsai_render_command_teardown_shader; struct bonsai_render_command_set_shader_uniform bonsai_render_command_set_shader_uniform; diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index d3b729340..6fac544a2 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:259:0 +// src/engine/work_queue.h:268:0 link_internal work_queue_entry @@ -10,6 +10,19 @@ WorkQueueEntry( work_queue_entry_init_world_chunk A ) + }; + return Result; +} + +link_internal work_queue_entry +WorkQueueEntry( work_queue_entry_finalize_noise_values A ) +{ + work_queue_entry Result = { + .Type = type_work_queue_entry_finalize_noise_values, + .work_queue_entry_finalize_noise_values = A, + + + }; return Result; } diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index 73f5477d0..504d820f0 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,9 +1,10 @@ -// src/engine/work_queue.h:229:0 +// src/engine/work_queue.h:237:0 enum work_queue_entry_type { type_work_queue_entry_noop, type_work_queue_entry_init_world_chunk, + type_work_queue_entry_finalize_noise_values, type_work_queue_entry_build_chunk_mesh, type_work_queue_entry_copy_buffer_set, type_work_queue_entry_copy_buffer_ref, @@ -23,6 +24,7 @@ struct work_queue_entry union { struct work_queue_entry_init_world_chunk work_queue_entry_init_world_chunk; + struct work_queue_entry_finalize_noise_values work_queue_entry_finalize_noise_values; struct work_queue_entry_build_chunk_mesh work_queue_entry_build_chunk_mesh; struct work_queue_entry_copy_buffer_set work_queue_entry_copy_buffer_set; struct work_queue_entry_copy_buffer_ref work_queue_entry_copy_buffer_ref; diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 25b421e5a..d1c98f0b1 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -56,6 +56,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(gpu_mapped_element_buffer*,&Element->Mesh), + CSz("Mesh"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 590d844db..893a67573 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -152,8 +152,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(lod_element_buffer*,&Element->Meshes), - CSz("Meshes"), + Cast(gpu_mapped_element_buffer*,&Element->Mesh), + CSz("Mesh"), Params ); diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index 8234c8119..65a01c503 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:569:0 +// src/engine/world_update.cpp:570:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h index 3eb64b4b3..619236a1e 100644 --- a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:824:0 +// src/engine/world_update.cpp:825:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h index e74b8f3da..af7776cee 100644 --- a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:806:0 +// src/engine/world_update.cpp:807:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h index 0701502ea..45f691ef6 100644 --- a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h +++ b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:679:0 +// src/engine/world_update.cpp:680:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 7907dea06..e91c8c216 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,4 +1,7 @@ -// src/engine/work_queue.h:291:0 +// src/engine/work_queue.h:300:0 + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index dbb2c6d4c..c5a5077bb 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -1,4 +1,7 @@ -// src/engine/work_queue.h:212:0 +// src/engine/work_queue.h:220:0 + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index dbd632e9b..cd20de1fe 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -1,4 +1,7 @@ -// src/engine/work_queue.h:193:0 +// src/engine/work_queue.h:201:0 + + + diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 8b2318f3b..01be67154 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:521:0 +// src/engine/world_chunk.h:525:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 158d74897..1eeb42ad1 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2971:0 +// src/engine/world_chunk.cpp:3046:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index 3f5ee3641..90e2b5b52 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:518:0 +// src/engine/world_chunk.h:522:0 struct standing_spot_stream_chunk { diff --git a/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h b/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h index e9302c3d2..f1da66ab1 100644 --- a/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h +++ b/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/render.cpp:1043:0 +// src/engine/render.cpp:1045:0 link_internal void diff --git a/generated/maybe_model_buffer.h b/generated/maybe_model_buffer.h index 6936193b4..9f9a91792 100644 --- a/generated/maybe_model_buffer.h +++ b/generated/maybe_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/model.h:94:0 +// src/engine/model.h:97:0 struct maybe_model_buffer { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 0b1dcc6f8..d9aa4c4df 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:485:0 +// src/engine/world_chunk.h:489:0 struct maybe_standing_spot { diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index 5b61138e9..6b4d07477 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -100,6 +100,28 @@ PushBonsaiRenderCommandDoStuff( PushWorkQueueEntry(RenderQueue, &Work); } link_internal void +PushBonsaiRenderCommandAllocateAndMapGpuElementBuffer( + work_queue *RenderQueue + , data_type Type , u32 ElementCount , gpu_mapped_element_buffer* Dest , world_chunk* SynChunk , world_chunk* DestChunk +) +{ + work_queue_entry Work = WorkQueueEntry( + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandAllocateAndMapGpuElementBuffer( Type , ElementCount , Dest , SynChunk , DestChunk ))); + + PushWorkQueueEntry(RenderQueue, &Work); +} +link_internal void +PushBonsaiRenderCommandUnmapGpuElementBuffer( + work_queue *RenderQueue + , gpu_mapped_element_buffer* Buf +) +{ + work_queue_entry Work = WorkQueueEntry( + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandUnmapGpuElementBuffer( Buf ))); + + PushWorkQueueEntry(RenderQueue, &Work); +} +link_internal void PushBonsaiRenderCommandUnmapAndDeallocateBuffer( work_queue *RenderQueue , gpu_readback_buffer PBOBuf diff --git a/generated/rectalinear_iteration_pattern_398799212.h b/generated/rectalinear_iteration_pattern_398799212.h index 4e787c70c..ed715e325 100644 --- a/generated/rectalinear_iteration_pattern_398799212.h +++ b/generated/rectalinear_iteration_pattern_398799212.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:527:0 +// src/engine/world_update.cpp:528:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_416827956.h b/generated/rectalinear_iteration_pattern_416827956.h index 3f40d1ea8..c32946362 100644 --- a/generated/rectalinear_iteration_pattern_416827956.h +++ b/generated/rectalinear_iteration_pattern_416827956.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:710:0 +// src/engine/world_update.cpp:711:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_428632106.h b/generated/rectalinear_iteration_pattern_428632106.h index fc5c21bfe..f82d59a4f 100644 --- a/generated/rectalinear_iteration_pattern_428632106.h +++ b/generated/rectalinear_iteration_pattern_428632106.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:869:0 +// src/engine/world_update.cpp:870:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_530902269.h b/generated/rectalinear_iteration_pattern_530902269.h index 39c2477d9..b1c1e1b21 100644 --- a/generated/rectalinear_iteration_pattern_530902269.h +++ b/generated/rectalinear_iteration_pattern_530902269.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:653:0 +// src/engine/world_update.cpp:654:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_583358156.h b/generated/rectalinear_iteration_pattern_583358156.h index 10f0b5612..715de6f42 100644 --- a/generated/rectalinear_iteration_pattern_583358156.h +++ b/generated/rectalinear_iteration_pattern_583358156.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:842:0 +// src/engine/world_update.cpp:843:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_631222419.h b/generated/rectalinear_iteration_pattern_631222419.h index ff8f61f56..2aa43a6ae 100644 --- a/generated/rectalinear_iteration_pattern_631222419.h +++ b/generated/rectalinear_iteration_pattern_631222419.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:752:0 +// src/engine/world_update.cpp:753:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_643608995.h b/generated/rectalinear_iteration_pattern_643608995.h index 808787cf9..838e05131 100644 --- a/generated/rectalinear_iteration_pattern_643608995.h +++ b/generated/rectalinear_iteration_pattern_643608995.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:632:0 +// src/engine/world_update.cpp:633:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index 2f157b39d..c0fe44201 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:604:0 +// src/engine/world_update.cpp:605:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_920026661.h b/generated/rectalinear_iteration_pattern_920026661.h index eefd973ad..e97e79a4e 100644 --- a/generated/rectalinear_iteration_pattern_920026661.h +++ b/generated/rectalinear_iteration_pattern_920026661.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:548:0 +// src/engine/world_update.cpp:549:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_992879728.h b/generated/rectalinear_iteration_pattern_992879728.h index 7a6d705f3..520fdd30d 100644 --- a/generated/rectalinear_iteration_pattern_992879728.h +++ b/generated/rectalinear_iteration_pattern_992879728.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:774:0 +// src/engine/world_update.cpp:775:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_99934950.h b/generated/rectalinear_iteration_pattern_99934950.h index 41bb0d93e..27229a18a 100644 --- a/generated/rectalinear_iteration_pattern_99934950.h +++ b/generated/rectalinear_iteration_pattern_99934950.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:718:0 +// src/engine/world_update.cpp:719:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/take_release_sync_lod_element_buffer.h b/generated/take_release_sync_lod_element_buffer.h index 5da0d1378..81cfbbf0b 100644 --- a/generated/take_release_sync_lod_element_buffer.h +++ b/generated/take_release_sync_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/mesh.cpp:247:0 +// src/engine/mesh.cpp:239:0 link_internal untextured_3d_geometry_buffer * TakeOwnershipSync( lod_element_buffer *Buf, world_chunk_mesh_bitfield MeshBit) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 4ec45f4aa..44fac4056 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2014:0 +// src/engine/world_chunk.cpp:2060:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, @@ -52,6 +52,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); LeftFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_LeftFaceNormalData, Materials); @@ -63,6 +64,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); RightFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_RightFaceNormalData, Materials); @@ -74,6 +76,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); FrontFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_FrontFaceNormalData, Materials); @@ -85,6 +88,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); BackFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_BackFaceNormalData, Materials); @@ -96,6 +100,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); TopFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_TopFaceNormalData, Materials); @@ -107,6 +112,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u32 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); BottomFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_BottomFaceNormalData, Materials); diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index aaefa09a4..e35e734f9 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2017:0 +// src/engine/world_chunk.cpp:2063:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, @@ -52,6 +52,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); LeftFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_LeftFaceNormalData, Materials); @@ -63,6 +64,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); RightFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_RightFaceNormalData, Materials); @@ -74,6 +76,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); FrontFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_FrontFaceNormalData, Materials); @@ -85,6 +88,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); BackFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_BackFaceNormalData, Materials); @@ -96,6 +100,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); TopFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_TopFaceNormalData, Materials); @@ -107,6 +112,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u32 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); BottomFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_BottomFaceNormalData, Materials); diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 5d8fdfe76a7ea9cdba62a31ee069129c3269a607..1faacb37f2364439e936927acb2906aae1c2af99 100644 GIT binary patch delta 2310 zcmY*bTWlLy8P4&2e7_`dE{+}NwzjhwCw3A$X|mgGE>zi8ZMSS$K*X6klZ>~%b!Ji; z1f`V<5~>hwKeXbFu6XGa6#9s?EP|Jcedt1;P$6Xz5<>gXfKQw0gc6V8;>hJt6juqxUb1R@9wXKl{qD)dVVqAjXGNI6pq< zH)@UTigN9GLDr`5{!kX@W?Z-zIDv4`jZdOeG?$o0;Te1~y~4yEPqkHV>4yQKn2R=~ z{aMJ&iFfYPgc8Y|P)0DyYUtPofKnf2$eK`MW0Dqipw9H(+B?77$3+fcd}u;oeOSHWS*GpZVnCL z>sg7FMHX8&iXTr1+B$+*pbWzZ#67s3>BdXvI#x4r%Dv<$%34tb{bV74^RJZIT4$>p z`B&2TM>L1eCnQRDk}5irp2eLBNmNPjgO!OGqRB;9LoxN*b%c}Y4yJxQ4ld%#xSy?a z^pR?-X|(EUrJ+>ymLY5J&?&7He;Vs1c^u-aj%ARE^OHr8AM;W2FHZTd(H{KHQNlxd zJ`M^-!@APkZZ#@~s@GIX%ljmIe{@m^j^_{KHzRS}@?`Nm??-E-7q@~rm)bOI<~}}1 zZ?I)SH!sN3c*t%P3y{+nj)nK9<5qE;LQHrq@tPz?^tCsRV&59>WAlQ?p5ZVnh|xjH zk18F7)QexFT&yHkw^I?Y)B-ypW}hZ|I=gQqeKt*q5jT=SoJuU>Owz;2#YZI%9t=(6 z;?P-U73(j(ev&es1V2x>t&yXl8X9gU$`pDE-C6$Ku;|7+F>h2?o7<{hG4>5pZE%V6 zVwP=68%lOWAbdFJXREwa*cuGtb|QzwpqDTo7Uso36zzd8akM0A;>%lC^>*bN3CQZT zdTm!TI}^Lot`SqC9WnG0?5qAsit4o$Ye@Ca3VX=F-(N=C<#t^rbtp9`@igxCrG>Ol z_RX+`4v#L$*l(JeYSaw;G`>cxp6sxBkaGEt-pN|I19uRQdlzu4x4;GL6wNIPXKK2t zY|EN;P_h?Gop>)2A{M86Ht_fEvxmLIo$_4&s9@*jyo8JWRxO{GB{sv6NxEvZ_VlW1 z;BH_^IO7JV6+epg&;f}{=Wbortkw?2B$A<(;aM~yinkec+q7wM$jzvi=%49X=bq;6 z;G{a?>Zld-UL?v%Bjfvkdd^IpaOi5)6qFshz#qaflC#piZSL5Z2GUdA#m) zqwe$KrFV@O;Np6klkjJ6FAVP-*?$(_k-T9`Ar*7KtyXHyofa`}SGAZK=$0`0nD?zD8#A8SY0 zx;;_h$(EZuad*>&DB8r+Bkk1cD(|MRb{Gz$$2}_i_4ls0xPx-I?mB~cR~#{076<+a zo;eeuN(-K5t7fROw%+;F0Kq&%*F%;c0xgHjLwAo^YwmJ+@x%7fVgS!dIaGWBj5x^4 z$k(3OM=VzeauZbQwQmVX>jWu>4SR}h2^zS={nJ+J+z2em3)txL`^=fW_umxbvdP?gIAPi2d{x_PUg1&nccsftKOg-rsX7&Z wrM1^IoittHdn6jHs)i{hkKbLqWW%E+53}RrrAZ7ehs8+750)P}XlK{|0H__|UH||9 delta 2463 zcmZuzOKcn074@S;a>${`k@&SFiXt6-NRgwVKBPoj*3Yr!G>$D5u?xfrGm^#{CgR8Z zs0q?GaoR-z1Fq#0q+K=jq6Jz6sgNwXDB!4Yx(R|HMp2+Z7j=;$tH7|3ZIkrAH0&*6GDO#380mAdiLgp5o!f?e$rdy4$c;)hy5q($ERMx|M5 zzFOSU%SMsX(N*&j4id9i=!{czhcR6r53rf`&WRPuU?V_jPQ`3R4L{T3SO~bGdEB@^ z)`@r3K_rxP~@VN|B%d)cBeA~Z8SEX%Q!Yv!ws(ndqwsMVllR@yobDXqRt zkW!36n~ccqKsD7=acwGX+cfZEPDM5Cq6<9Yn>P6nbSsh=n{Rvbd0M4nv%0mlZK&p& zz~CQ}7njGpghLE_S|99VJ~oSNCX4-)O!!;U_rgwG4bS0@!)Y@`wD>wH<5W7;SvM-1 zcwm)E1gu%+No1GG?`-v{B=fEr%D)Z~>KJCloa;aI`F&f9|tb zCN3C<+9&Mss8w!Qgilflx{@N^@Zj~{XKXA;aF!LLRWNQJ{#%g3l`G^)=c)tn}mCVMdyv&ukdNo`vA zD42M3?U}v7BMm3uhzFW@riPduugfKCIP?M(61PRigYE)Vum}i?~OE(G}pqx!1R=)iRG{U8w%iGe@+P#Lb>gyygkFp9alyhIlq`%j0A(3AG=| zPvUcT9k)D5{Kh@U%0lXqPuW^C_>=29;vnie-l3X?IEuO!sOJ2s80IM8=aTo3Mo&q} z!{v?X0VtBpADA}JtUA)tMs>SN%x4NiPdJx(+%)WVI}h8UuR9Jmvj&mm^il?Dn1&Hkf>K`)Hg1d^-=}TcV59)9Thy;K}EOq9TM4M z$8)=1ox^;`jF7IEnq|F)dD~@rj=6;yTdM?Rte=)A$?y{PHJO-k_u$#x+iTRaZPzZV zB~??r!dZ(Yi)DSQv{Bru>zgHde2SH7sbLhYGu5=y{|Wq$(YMyNGvjXw;#qNvqyKyM zQ~B|kMVrK9o_|_Gaf5>x6rIUY{Iuh-J~2rC_2&(du zOZoHda|fN1f4chLn%v5p|NisW{99X*n~wG4p~>jCAKI~4=>NbwbJphNDgr%5>3X0S bQm7UBaG~JF^@744OKOD>J}&GremDFdAz}er diff --git a/jesse.make.sh b/jesse.make.sh index 35f0a7673..931f25e36 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -12,7 +12,7 @@ OPT="-O2" ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ BuildExecutables \ - BuildTests \ + # BuildTests \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index 701ceba3e..afe286a6f 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -374,7 +374,8 @@ void main() // uint SolidBit = NoiseValue > 0.f ? 1u : 0u; - uint PackedColor = RGBtoPackedHSV(ColorValue); + /* uint PackedColor = max(RGBtoPackedHSV(ColorValue), 3543u); */ + uint PackedColor = 3543u; Output = (SolidBit << 15) | PackedColor; } diff --git a/src/engine/api.cpp b/src/engine/api.cpp index a3b5b2238..83dfcba23 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -533,8 +533,9 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ engine_resources *EngineResources = GetEngineResources(); world *World = EngineResources->World; - work_queue_entry_type WorkType = Entry->Type; - switch (WorkType) + auto RenderQ = &EngineResources->Stdlib.Plat.RenderQ; + + tswitch (Entry) { InvalidCase(type_work_queue_entry_noop); InvalidCase(type_work_queue_entry__align_to_cache_line_helper); @@ -547,22 +548,15 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ DispatchAsyncFunctionCall(Job); } break; - case type_work_queue_entry_init_asset: - { - work_queue_entry_init_asset *Job = SafeAccess(work_queue_entry_init_asset, Entry); + { tmatch(work_queue_entry_init_asset, Entry, Job) InitAsset(Job->Asset, Thread); } break; - case type_work_queue_entry_sim_particle_system: - { - work_queue_entry_sim_particle_system *Job = SafeAccess(work_queue_entry_sim_particle_system, Entry); + { tmatch(work_queue_entry_sim_particle_system, Entry, Job) SimulateParticleSystem(Job); } break; - case type_work_queue_entry_build_chunk_mesh: - { - work_queue_entry_build_chunk_mesh *Job = SafeAccess(work_queue_entry_build_chunk_mesh, Entry); -#if 1 + { tmatch(work_queue_entry_finalize_noise_values, Entry, Job) auto Chunk1 = Job->Chunk; u16 *NoiseValues = Job->NoiseData; v3i NoiseDim = Job->NoiseDim; @@ -572,27 +566,18 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ /* PushWorkQueueEntry(&Plat->LowPriority, &E); */ world_chunk *DestChunk = Chunk1; - world_chunk *SynChunk = AllocateWorldChunk({}, Chunk1->Dim + V3i(0, 2, 2), V3i(1), GetTranArena()); + world_chunk *SynChunk = HeapAllocateWorldChunk({}, Chunk1->Dim + V3i(0, 2, 2), V3i(1)); SynChunk->Flags = Chunk_Queued; v3i WorldBasis = {}; v3i SynChunkDim = SynChunk->Dim; v3i SrcToDest = {}; s64 zMin = 0; - u16 PackedHSVColorValue = PackHSVColor(HSV_GREEN); - b32 MakeExteriorFaces = False; - u32 ChunkSum = FinalizeOccupancyMasksFromNoiseValues(SynChunk, WorldBasis, NoiseDim, NoiseValues, SrcToDest, zMin, PackedHSVColorValue); + u32 ChunkSum = FinalizeOccupancyMasksFromNoiseValues(SynChunk, WorldBasis, NoiseDim, NoiseValues, SrcToDest, zMin); - if (ChunkSum) + if (ChunkSum && ChunkSum < u32(Volume(SynChunk->Dim))) { - if (MakeExteriorFaces) - { - MarkBoundaryVoxels_MakeExteriorFaces(SynChunk->Occupancy, SynChunk->Voxels, SynChunkDim, Global_ChunkApronMinDim, SynChunkDim-Global_ChunkApronMaxDim); - } - else - { - MarkBoundaryVoxels_NoExteriorFaces(SynChunk->Occupancy, SynChunk->xOccupancyBorder, SynChunk->FaceMasks, SynChunk->Voxels, SynChunkDim, {}, SynChunkDim); - } + MakeFaceMasks_NoExteriorFaces(SynChunk->Occupancy, SynChunk->xOccupancyBorder, SynChunk->FaceMasks, SynChunk->Voxels, SynChunkDim, {}, SynChunkDim); Assert(DestChunk->FilledCount == 0); Assert(DestChunk->Dim.x == 64); @@ -607,120 +592,76 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ Assert(DestChunk->FilledCount <= s32(Volume(DestChunk->Dim))); - // NOTE(Jesse): The DestChunk is finalized at the end of the routine - /* SetFlag(DestChunk, Chunk_VoxelsInitialized); */ FinalizeChunkInitialization(SynChunk); -#if 0 - if (Flags & ChunkInitFlag_ComputeStandingSpots) + s32 FacesRequired = CountRequiredFacesForMesh_Naieve(SynChunk->FaceMasks, SynChunk->Dim); + if (FacesRequired) { - NotImplemented; - ComputeStandingSpots( SynChunkDim, SynChunk, {{1,1,0}}, {{0,0,1}}, Global_StandingSpotDim, - DestChunk->Dim, 0, &DestChunk->StandingSpots, - Thread->TempMemory); - } -#endif - - /* auto *Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); */ - geo_u3d *TempMesh = AllocateTempMesh(Thread->TempMemory, DataType_v3_u8); - - RebuildWorldChunkMesh(Thread, SynChunk, {}, {}, MeshBit_Lod0, TempMesh, Thread->TempMemory); - TempMesh->At = 0; - - /* Assert( (Flags & ChunkInitFlag_GenLODs) == 0); */ - -#define FINALIZE_MESH_FOR_CHUNK(Src, Dest, Bit) \ - { \ - auto *SrcMesh = (Src)->Meshes.E[ToIndex(Bit)]; \ - if (SrcMesh) { \ - if (SrcMesh->At) { \ - DestChunk->HasMesh = True; \ - AtomicReplaceMesh(&(Dest)->Meshes, Bit, SrcMesh, SrcMesh->Timestamp); \ - } else { \ - DeallocateMesh(EngineResources, SrcMesh); \ - } \ - } \ + PushBonsaiRenderCommandAllocateAndMapGpuElementBuffer(RenderQ, DataType_v3_u8, u32(FacesRequired*6), &DestChunk->Mesh, SynChunk, DestChunk); } - + else { - /* auto *EngineResources = GetEngineResources(); */ - TIMED_NAMED_BLOCK(Chunk_Finalize); - FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod0 ); - /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod1 ); */ - /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod2 ); */ - /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod3 ); */ - /* FINALIZE_MESH_FOR_CHUNK(SynChunk, DestChunk, MeshBit_Lod4 ); */ -#undef FINALIZE_MESH_FOR_CHUNK - - Assert( (DestChunk->Flags & Chunk_VoxelsInitialized) == 0); - Assert( DestChunk->FilledCount <= s32(Volume(SynChunk))); - - /* if (DestChunk->WorldP == V3i(0)) { RuntimeBreak(); } */ - + Assert(HasGpuMesh(&DestChunk->Mesh) == False); + FinalizeChunkInitialization(DestChunk); + HeapFreeWorldChunk(SynChunk); } } -#endif - - FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*,DestChunk))); + else + { + Assert(HasGpuMesh(&DestChunk->Mesh) == False); + FinalizeChunkInitialization(DestChunk); + HeapFreeWorldChunk(SynChunk); + } auto Graphics = &EngineResources->Graphics; Assert(Graphics->ChunksCurrentlyQueued > 0); AtomicDecrement(&Graphics->ChunksCurrentlyQueued); + // NOTE(Jesse): The CPU initializer obviously doesn't need to deallocate + // a PBO, so it sets the PBO handle to -1 if (Job->PBOBuf.PBO != INVALID_PBO_HANDLE) { - auto DeallocPBOs = WorkQueueEntry(WorkQueueEntryBonsaiRenderCommand(BonsaiRenderCommandUnmapAndDeallocateBuffer(Job->PBOBuf))); - PushWorkQueueEntry(&EngineResources->Stdlib.Plat.RenderQ, &DeallocPBOs); + PushBonsaiRenderCommandUnmapAndDeallocateBuffer(RenderQ, Job->PBOBuf); } } break; - case type_work_queue_entry_rebuild_mesh: - { - NotImplemented; -#if 0 - work_queue_entry_rebuild_mesh *Job = SafeAccess(work_queue_entry_rebuild_mesh, Entry); - world_chunk *Chunk = Job->Chunk; + { tmatch(work_queue_entry_build_chunk_mesh, Entry, Job) - data_type Type = GetMeshDatatypeForDimension(Chunk->Dim); - auto *TempMesh = AllocateTempMesh(Thread->TempMemory, Type); - - RebuildWorldChunkMesh(Thread, Chunk, {}, Chunk->Dim, MeshBit_Lod0, TempMesh, Thread->TempMemory); - TempMesh->At = 0; - RebuildWorldChunkMesh(Thread, Chunk, {}, Chunk->Dim, MeshBit_Lod1, TempMesh, Thread->TempMemory); - TempMesh->At = 0; - RebuildWorldChunkMesh(Thread, Chunk, {}, Chunk->Dim, MeshBit_Lod2, TempMesh, Thread->TempMemory); - TempMesh->At = 0; - RebuildWorldChunkMesh(Thread, Chunk, {}, Chunk->Dim, MeshBit_Lod3, TempMesh, Thread->TempMemory); - TempMesh->At = 0; - RebuildWorldChunkMesh(Thread, Chunk, {}, Chunk->Dim, MeshBit_Lod4, TempMesh, Thread->TempMemory); - TempMesh->At = 0; - - if (Job->Flags & ChunkInitFlag_ComputeStandingSpots) - { - ComputeStandingSpots( Chunk->Dim, - Chunk->Occupancy, - Chunk->Voxels, - {}, - - {}, - Global_TileDim, - - Chunk->Dim, - 0, - &Chunk->StandingSpots, - /* memory_arena *PermMemory, */ - Thread->TempMemory ); - } + world_chunk *SynChunk = Job->SynChunk; + world_chunk *DestChunk = Job->DestChunk; + gpu_mapped_element_buffer *GpuMappedBuf = &DestChunk->Mesh; + Assert(HasGpuMesh(&DestChunk->Mesh) == True); + Assert(HasGpuMesh(GpuMappedBuf) == True); - /* UnsetBitfield(chunk_flag, Chunk->Flags, Chunk_Queued); */ - Chunk->Flags = chunk_flag(Chunk->Flags & ~Chunk_Queued); - /* Chunk->Flags = chunk_flag(Chunk->Flags & ~Chunk_MeshUploadedToGpu); */ -#endif + Assert(DestChunk->DEBUG_OwnedByThread == 0); + DestChunk->DEBUG_OwnedByThread = ThreadLocal_ThreadIndex; + + RebuildWorldChunkMesh(Thread, SynChunk, {}, {}, MeshBit_Lod0, &GpuMappedBuf->Buffer, Thread->TempMemory); + Assert(GpuMappedBuf->Buffer.At == GpuMappedBuf->Buffer.End); + Assert(HasGpuMesh(&DestChunk->Mesh) == True); + + DestChunk->HasMesh = True; + + HeapFreeWorldChunk(SynChunk); + + DestChunk->DEBUG_OwnedByThread = 0; + + PushBonsaiRenderCommandUnmapGpuElementBuffer(RenderQ, &DestChunk->Mesh); + + // TODO(Jesse)(bug, race): There's a race here; the chunk can get deallocated on the + // main thread and clear the Mesh before the Unmap job happens. Have to somehow + // wait for that job to finish to call Finalize + // + // nopush + + FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*, DestChunk))); } break; - case type_work_queue_entry_init_world_chunk: - { - work_queue_entry_init_world_chunk *Job = SafeAccess(work_queue_entry_init_world_chunk, Entry); + { tmatch(work_queue_entry_rebuild_mesh, Entry, Job) + NotImplemented; + } break; + + { tmatch(work_queue_entry_init_world_chunk, Entry, Job) world_chunk *Chunk = Job->Chunk; counted_string AssetFilename = GetAssetFilenameFor(Global_AssetPrefixPath, Chunk->WorldP, Thread->TempMemory); @@ -745,14 +686,11 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ } break; - case type_work_queue_entry_copy_buffer_ref: - { - work_queue_entry_copy_buffer_ref *CopyJob = SafeAccess(work_queue_entry_copy_buffer_ref, Entry); - DoCopyJob(CopyJob, &EngineResources->geo_u3d_MeshFreelist, Thread->PermMemory); + { tmatch(work_queue_entry_copy_buffer_ref, Entry, Job) + DoCopyJob(Job, &EngineResources->geo_u3d_MeshFreelist, Thread->PermMemory); } break; - case type_work_queue_entry_copy_buffer_set: - { + { tmatch(work_queue_entry_copy_buffer_set, Entry, Job) TIMED_BLOCK("Copy Set"); volatile work_queue_entry_copy_buffer_set *CopySet = SafeAccess(work_queue_entry_copy_buffer_set, Entry); for (u32 CopyIndex = 0; CopyIndex < CopySet->Count; ++CopyIndex) diff --git a/src/engine/asset.cpp b/src/engine/asset.cpp index 7a37cb637..e87b4b06c 100644 --- a/src/engine/asset.cpp +++ b/src/engine/asset.cpp @@ -15,7 +15,7 @@ MakeWorldChunkFileHeader_v2(world_chunk *Chunk) NotImplemented; /* if (HasMesh(&Chunk->Meshes, MeshBit_Lod0)) */ { - Result.MeshElementCount = Chunk->Meshes.E[MeshIndex_Lod0]->At; + /* Result.MeshElementCount = Chunk->Meshes.E[MeshIndex_Lod0]->At; */ } Result.VertexElementSize = (u32)sizeof(v3); @@ -69,7 +69,7 @@ MakeWorldChunkFileHeader_v1(world_chunk *Chunk) NotImplemented; /* if (HasMesh(&Chunk->Meshes, MeshBit_Lod0)) */ { - Result.MeshElementCount = Chunk->Meshes.E[MeshIndex_Lod0]->At; + /* Result.MeshElementCount = Chunk->Meshes.E[MeshIndex_Lod0]->At; */ } diff --git a/src/engine/bonsai.h b/src/engine/bonsai.h index e59cee460..8d5a3c3fe 100644 --- a/src/engine/bonsai.h +++ b/src/engine/bonsai.h @@ -263,9 +263,10 @@ ClearWorldChunk( world_chunk *Chunk ) Chunk->DEBUG_OwnedByThread = {}; - Clear(&Chunk->Meshes); + Clear(&Chunk->Mesh); Chunk->Flags = {}; + Chunk->DimInChunks = {}; } inline world_position diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index 18ef3c90d..eb161a3b5 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -393,11 +393,13 @@ AllocateAssetThumbnail(platform *Plat, asset_thumbnail_block_array *AssetThumbna } link_internal interactable_handle -RenderMeshPreviewToTextureAndInteractWithThumb(engine_resources *Engine, window_layout *Window, asset_thumbnail *Thumb, lod_element_buffer *Meshes, v3 Dim, b32 Selected) +RenderMeshPreviewToTextureAndInteractWithThumb(engine_resources *Engine, window_layout *Window, asset_thumbnail *Thumb, gpu_mapped_element_buffer *Mesh, v3 Dim, b32 Selected) { UNPACK_ENGINE_RESOURCES(Engine); - SyncGpuBuffersAsync(Engine, Meshes); + // TODO(Jesse): Do we still do this here? + NotImplemented; + /* SyncGpuBuffersAsync(Engine, Mesh); */ texture *Texture = &Thumb->Texture; camera *ThumbCamera = &Thumb->Camera; @@ -418,7 +420,7 @@ RenderMeshPreviewToTextureAndInteractWithThumb(engine_resources *Engine, window_ if (Pressed(Ui, &B)) { - RenderToTexture_Async(&Plat->RenderQ, Engine, Thumb, Meshes, {}, 0); + RenderToTexture_Async(&Plat->RenderQ, Engine, Thumb, Mesh, {}, 0); } if (EngineDebug->ResetAssetNodeView) @@ -430,14 +432,14 @@ RenderMeshPreviewToTextureAndInteractWithThumb(engine_resources *Engine, window_ f32 SmallObjectCorrectionFactor = 350.f/Length(CenterpointOffset); Thumb->Camera.DistanceFromTarget = LengthSq(CenterpointOffset)*0.50f + SmallObjectCorrectionFactor; UpdateGameCamera(World, {}, 0.f, {}, &Thumb->Camera, 0.f); - RenderToTexture_Async(&Plat->RenderQ, Engine, Thumb, Meshes, {}, 0); + RenderToTexture_Async(&Plat->RenderQ, Engine, Thumb, Mesh, {}, 0); } return B; } link_internal void -RenderMeshPreviewIntoWorld(engine_resources *Engine, lod_element_buffer *Meshes, v3 Dim, b32 Selected) +RenderMeshPreviewIntoWorld(engine_resources *Engine, gpu_mapped_element_buffer *Mesh, v3 Dim, b32 Selected) { UNPACK_ENGINE_RESOURCES(Engine); @@ -464,7 +466,7 @@ RenderMeshPreviewIntoWorld(engine_resources *Engine, lod_element_buffer *Meshes, v3 AssetHalfDim = Dim/2.f; v3 Basis = GetRenderP(Engine, EntityOrigin) + V3(0.f, 0.f, AssetHalfDim.z); - DrawLod_Async(RenderQ, GetEngineResources(), &Graphics->gBuffer->gBufferShader, Meshes, 0.f, Basis, Quaternion(), V3(1)); + DrawLod_Async(RenderQ, GetEngineResources(), &Graphics->gBuffer->gBufferShader, Mesh, 0.f, Basis, Quaternion(), V3(1)); PushBonsaiRenderCommandTeardownShader(RenderQ, BonsaiRenderCommand_ShaderId_gBuffer); } @@ -632,8 +634,8 @@ DoAssetWindow(engine_resources *Engine) if (Thumb == 0) { Thumb = AllocateAssetThumbnail(Plat, &Editor->AssetThumbnails); } b32 Selected = True; - interactable_handle B = RenderMeshPreviewToTextureAndInteractWithThumb(Engine, &AssetViewWindow, Thumb, &Chunk->Meshes, V3(Chunk->Dim), Selected); - RenderMeshPreviewIntoWorld(Engine, &Chunk->Meshes, V3(Chunk->Dim), Selected); + interactable_handle B = RenderMeshPreviewToTextureAndInteractWithThumb(Engine, &AssetViewWindow, Thumb, &Chunk->Mesh, V3(Chunk->Dim), Selected); + RenderMeshPreviewIntoWorld(Engine, &Chunk->Mesh, V3(Chunk->Dim), Selected); } break; @@ -642,20 +644,22 @@ DoAssetWindow(engine_resources *Engine) { IterateOver(&Asset->Models, Model, ModelIndex) { - SyncGpuBuffersAsync(Engine, &Model->Meshes); + // TODO(Jesse): Do we still do this here? + NotImplemented; + /* SyncGpuBuffersAsync(Engine, &Model->Mesh); */ asset_thumbnail *Thumb = TryGetPtr(&Editor->AssetThumbnails, ModelIndex); if (Thumb == 0) { Thumb = AllocateAssetThumbnail(Plat, &Editor->AssetThumbnails); } b32 Selected = ModelIndex == EngineDebug->ModelIndex; - interactable_handle B = RenderMeshPreviewToTextureAndInteractWithThumb(Engine, &AssetViewWindow, Thumb, &Model->Meshes, V3(Model->Dim), Selected); + interactable_handle B = RenderMeshPreviewToTextureAndInteractWithThumb(Engine, &AssetViewWindow, Thumb, &Model->Mesh, V3(Model->Dim), Selected); if (Pressed(Ui, &B)) { EngineDebug->ModelIndex = ModelIndex; } - RenderMeshPreviewIntoWorld(Engine, &Model->Meshes, V3(Model->Dim), Selected); + RenderMeshPreviewIntoWorld(Engine, &Model->Mesh, V3(Model->Dim), Selected); if ( (ModelIndex+1) % 4 == 0) { @@ -777,7 +781,7 @@ DoEngineDebug(engine_resources *Engine) { world_chunk *PickedChunk = EngineDebug->PickedChunk; /* MarkBoundaryVoxels_Debug(PickedChunk->Voxels, PickedChunk->Dim); */ - MarkBoundaryVoxels_NoExteriorFaces(PickedChunk->Occupancy, PickedChunk->xOccupancyBorder, PickedChunk->FaceMasks, PickedChunk->Voxels, PickedChunk->Dim, {}, PickedChunk->Dim); + MakeFaceMasks_NoExteriorFaces(PickedChunk->Occupancy, PickedChunk->xOccupancyBorder, PickedChunk->FaceMasks, PickedChunk->Voxels, PickedChunk->Dim, {}, PickedChunk->Dim); QueueChunkForMeshRebuild(&Plat->LowPriority, PickedChunk); } PushNewRow(Ui); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 4c9b6a47d..c346214a6 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1126,12 +1126,14 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br } break; } - SyncGpuBuffersAsync(Engine, &Chunk->Meshes); + // TODO(Jesse): Do we do this here still? + NotImplemented; + /* SyncGpuBuffersAsync(Engine, &Chunk->Meshes); */ } if (Preview->Thumbnail.Texture.ID) // NOTE(Jesse): Avoid spamming a warning to console { - RenderToTexture_Async(&Plat->RenderQ, Engine, &Preview->Thumbnail, &Chunk->Meshes, V3(Chunk->Dim)/-2.f, 0); + RenderToTexture_Async(&Plat->RenderQ, Engine, &Preview->Thumbnail, &Chunk->Mesh, V3(Chunk->Dim)/-2.f, 0); } return UpdateVoxels; @@ -1786,7 +1788,9 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti data_type Type = GetMeshDatatypeForDimension(SeedChunk->Dim); auto *TempMesh = AllocateTempMesh(Thread->TempMemory, Type); RebuildWorldChunkMesh(Thread, SeedChunk, {}, SeedChunk->Dim, MeshBit_Lod0, TempMesh, Thread->TempMemory); - SyncGpuBuffersAsync(Engine, &SeedChunk->Meshes); + // TODO(Jesse): Do we still do this here? + NotImplemented; + /* SyncGpuBuffersAsync(Engine, &SeedChunk->Meshes); */ CopyChunkOffset(SeedChunk, SeedChunk->Dim, Root_LayeredBrushPreview, Root_LayeredBrushPreview->Dim, {}); } @@ -1820,10 +1824,12 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti Editor->RootChunkNeedsNewMesh = False; Editor->NextSelectionRegionMin = Editor->MostRecentSelectionRegionMin; - if (SyncGpuBuffersAsync(Engine, &Root_LayeredBrushPreview->Meshes)) - { - Editor->EditorPreviewRegionMin = Editor->NextSelectionRegionMin; - } + // TODO(Jesse): Do we still do this here? + NotImplemented; + /* if (SyncGpuBuffersAsync(Engine, &Root_LayeredBrushPreview->Meshes)) */ + /* { */ + /* Editor->EditorPreviewRegionMin = Editor->NextSelectionRegionMin; */ + /* } */ } @@ -2640,6 +2646,9 @@ DoWorldEditor(engine_resources *Engine) } } +link_internal void +DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Mesh, r32 DistanceSquared, v3 Basis, Quaternion Rotation, v3 Scale ); + link_internal void DrawEditorPreview(engine_resources *Engine, shader *Shader) { @@ -2671,7 +2680,7 @@ DrawEditorPreview(engine_resources *Engine, shader *Shader) if (Chunk) { - DrawLod(Engine, Shader, &Chunk->Meshes, 0.f, Basis); + DrawLod(Engine, Shader, &Chunk->Mesh, 0.f, Basis, Quaternion(), V3(1.f)); } } diff --git a/src/engine/entity.cpp b/src/engine/entity.cpp index 8c1aff3fd..136e8e233 100644 --- a/src/engine/entity.cpp +++ b/src/engine/entity.cpp @@ -446,8 +446,8 @@ SpawnEntity(entity *Entity) /* canonical_position CP = Canonicalize(World->ChunkDim, V3(x, y, z), InitialP->WorldP); */ cp CP = Canonical_Position(V3(0), V3i(x,y,z)); /* world_chunk *Chunk = GetWorldChunkFromHashtable( World, CP.WorldP ); */ - octree_node *Node = GetWorldChunkFromOctree( World, CP.WorldP ); - if (Node == 0) + /* octree_node *Node = GetWorldChunkFromOctree( World, CP.WorldP ); */ + /* if (Node == 0) */ { //nopush //do we care? diff --git a/src/engine/mesh.cpp b/src/engine/mesh.cpp index daf885f17..b8136b838 100644 --- a/src/engine/mesh.cpp +++ b/src/engine/mesh.cpp @@ -54,17 +54,9 @@ link_internal void DeallocateMesh(untextured_3d_geometry_buffer* Mesh, mesh_freelist *MeshFreelist) { Assert(Mesh); + Assert(Mesh->End <= MeshFreelist->MeshSize); #if BONSAI_INTERNAL - if (MeshFreelist->MeshSize == 0) - { - MeshFreelist->MeshSize = Mesh->End; - } - else - { - Assert(MeshFreelist->MeshSize == Mesh->End); - } - AcquireFutex(&MeshFreelist->DebugFutex); #endif @@ -80,12 +72,6 @@ DeallocateMesh(untextured_3d_geometry_buffer* Mesh, mesh_freelist *MeshFreelist) link_internal void DeallocateMesh(void *VoidMesh, tiered_mesh_freelist* MeshFreelist) { - // NOTE(Jesse): The End offsets must be the same for the cast to - // untextured_3d_geometry_buffer to work for both buffer types. - // - // TODO(Jesse): Really don't like relying on this .. should probably find a better way. - /* CAssert(OffsetOf(End, untextured_3d_geometry_buffer) == OffsetOf(End, world_chunk_geometry_buffer)); */ - untextured_3d_geometry_buffer *Mesh = Cast(untextured_3d_geometry_buffer*, VoidMesh); mesh_freelist *Freelist = TryGetTierForSize(MeshFreelist, Mesh->End); if (Freelist) @@ -93,6 +79,12 @@ DeallocateMesh(void *VoidMesh, tiered_mesh_freelist* MeshFreelist) u32 Tier = 1+ (Mesh->End/WORLD_CHUNK_MESH_MIN_SIZE); u32 Size = Tier*WORLD_CHUNK_MESH_MIN_SIZE; + if (Freelist->MeshSize == 0) + { + Freelist->MeshSize = Size; + } + + Assert(Freelist->MeshSize >= Mesh->End); DeallocateMesh(Mesh, Freelist); } else @@ -251,3 +243,10 @@ poof(threadsafe_mesh_container(lod_element_buffer, untextured_3d_geometry_buffer /* #include */ +link_internal b32 +HasGpuMesh(gpu_mapped_element_buffer *Buf) +{ + b32 Result = (Buf->Handles.VertexHandle != 0); + return Result; +} + diff --git a/src/engine/mesh.h b/src/engine/mesh.h index e1767ce64..7d49a166b 100644 --- a/src/engine/mesh.h +++ b/src/engine/mesh.h @@ -40,7 +40,7 @@ TryGetTierForSize(tiered_mesh_freelist *TieredFreelist, u32 Size) // NOTE(Jesse): So we include the 1*minsize in the 0th bucket, 2*minsize in 1th bucket, etc if (Size % WORLD_CHUNK_MESH_MIN_SIZE == 0) { Size = Size-1; } - u32 Index = Size/WORLD_CHUNK_MESH_MIN_SIZE; + u32 Index = (Size)/WORLD_CHUNK_MESH_MIN_SIZE; if (Index < TIERED_MESH_FREELIST_MAX_ELEMENTS) { Result = TieredFreelist->Start + Index; diff --git a/src/engine/model.h b/src/engine/model.h index df939eaf9..5320fdfbc 100644 --- a/src/engine/model.h +++ b/src/engine/model.h @@ -67,8 +67,11 @@ struct model { vox_data Vox; + // TODO(Jesse): Delete lod_element_buffer Meshes; poof(@no_serialize) + gpu_mapped_element_buffer Mesh; poof(@no_serialize) + /* untextured_3d_geometry_buffer Mesh; */ untextured_3d_geometry_buffer TransparentMesh; animation Animation; diff --git a/src/engine/render.cpp b/src/engine/render.cpp index be9e009a1..c89b5cfd2 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -930,6 +930,8 @@ link_internal void DrawGpuBufferImmediate(gpu_element_buffer_handles *Handles) { AssertNoGlErrors; + Assert(Handles->Mapped == False); + Assert(Handles->ElementCount); Draw(Handles->ElementCount); @@ -1056,6 +1058,23 @@ ReallocateAndSyncGpuBuffers(gpu_element_buffer_handles *Handles, untextured_3d_g CopyToGpuBuffer(Mesh, Handles); } +#if 0 +link_internal gpu_element_buffer_handles +MapGpuElementBuffer(gpu_element_buffer_handles *Handles) +{ + NotImplemented; +} +#endif + +link_internal gpu_mapped_element_buffer +AllocateAndMapGpuBuffer(data_type Type, u32 ElementCount) +{ + gpu_mapped_element_buffer Buf = {}; + AllocateGpuElementBuffer(&Buf, Type, ElementCount); + MapGpuBuffer_untextured_3d_geometry_buffer(&Buf); + return Buf; +} + /* poof(gpu_buffer(world_chunk_lod_element_buffer, world_chunk_geometry_buffer)) */ /* #include */ @@ -1135,6 +1154,32 @@ DrawLod_world_chunk(engine_resources *Engine, shader *Shader, world_chunk_lod_el #endif +link_internal void +DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Mesh, r32 DistanceSquared, v3 Basis, Quaternion Rotation, v3 Scale ) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + AssertNoGlErrors; + if (HasGpuMesh(Mesh) && Mesh->Handles.Mapped == False) + { + m4 LocalTransform = GetTransformMatrix(Basis*GLOBAL_RENDER_SCALE_FACTOR, Scale*GLOBAL_RENDER_SCALE_FACTOR, Rotation); + m4 NormalMatrix = Transpose(Inverse(LocalTransform)); + + // @janky_model_matrix_bs + Ensure(TryBindUniform(Shader, "ModelMatrix", &LocalTransform)); + AssertNoGlErrors; + TryBindUniform(Shader, "NormalMatrix", &NormalMatrix); // NOTE(Jesse): Not all shaders that use this path draw normals (namely, DepthRTT) + AssertNoGlErrors; + + auto Handles = &Mesh->Handles; + + SetupVertexAttribsFor_u3d_geo_element_buffer(Handles); + DrawGpuBufferImmediate(Handles); + AssertNoGlErrors; + } +} + +#if 0 link_internal void DrawLod(engine_resources *Engine, shader *Shader, lod_element_buffer *Meshes, r32 DistanceSquared, v3 Basis, Quaternion Rotation, v3 Scale ) { @@ -1161,6 +1206,7 @@ DrawLod(engine_resources *Engine, shader *Shader, lod_element_buffer *Meshes, r3 AssertNoGlErrors; } } +#endif #if 0 link_internal void @@ -1185,12 +1231,12 @@ RenderToTexture_world_chunk(engine_resources *Engine, asset_thumbnail *Thumb, wo /* } */ link_internal void -RenderToTexture(engine_resources *Engine, asset_thumbnail *Thumb, lod_element_buffer *Meshes, v3 Offset, camera *Camera = 0) +RenderToTexture(engine_resources *Engine, asset_thumbnail *Thumb, gpu_mapped_element_buffer *Mesh, v3 Offset, camera *Camera = 0) { if (Camera == 0) { Camera = &Thumb->Camera; } if (SetupRenderToTextureShader(Engine, &Thumb->Texture, Camera)) { - DrawLod(Engine, &Engine->RTTGroup.Shader, Meshes, 0.f, Offset); + DrawLod(Engine, &Engine->RTTGroup.Shader, Mesh, 0.f, Offset); } else { @@ -1201,7 +1247,7 @@ RenderToTexture(engine_resources *Engine, asset_thumbnail *Thumb, lod_element_bu link_internal void RenderToTexture(engine_resources *Engine, asset_thumbnail *Thumb, model *Model, v3 Offset, camera *Camera = 0) { - RenderToTexture(Engine, Thumb, &Model->Meshes, Offset, Camera); + RenderToTexture(Engine, Thumb, &Model->Mesh, Offset, Camera); } link_internal void @@ -1281,14 +1327,16 @@ DrawEntity( shader *Shader, Entity->_CollisionVolumeRadius = Model->Dim/2.f; } - SyncGpuBuffersImmediate(GetEngineResources(), &Model->Meshes); + // TODO(Jesse): Do we still do this here? + NotImplemented; + /* SyncGpuBuffersImmediate(GetEngineResources(), &Model->Mesh); */ AssertNoGlErrors; v3 Offset = AnimationOffset + Entity->Scale*(V3(Model->Dim)/2.f); v3 Basis = GetRenderP(GetEngineResources(), Entity->P) + Offset; AssertNoGlErrors; - DrawLod(GetEngineResources(), Shader, &Model->Meshes, 0.f, Basis, FromEuler(Entity->EulerAngles), V3(Entity->Scale)); + DrawLod(GetEngineResources(), Shader, &Model->Mesh, 0.f, Basis, FromEuler(Entity->EulerAngles), V3(Entity->Scale)); } } } @@ -1497,12 +1545,12 @@ RenderDrawList(engine_resources *Engine, world_chunk_ptr_paged_list *DrawList, s world_chunk *Chunk = *ChunkPtrPtr; // In case gpu meshes got deallocated after the chunk was added to the draw list - if (HasGpuMesh(&Chunk->Meshes)) + if (HasGpuMesh(&Chunk->Mesh)) { v3 CameraP = GetSimSpaceP(World, Camera->CurrentP); v3 Basis = GetRenderP(Engine, Chunk->WorldP); - DrawLod(Engine, Shader, &Chunk->Meshes, 0.f, Basis, Quaternion(), V3(Chunk->DimInChunks)); + DrawLod(Engine, Shader, &Chunk->Mesh, 0.f, Basis, Quaternion(), V3(Chunk->DimInChunks)); AssertNoGlErrors; } } diff --git a/src/engine/render_command.h b/src/engine/render_command.h index 9ed95ed2a..12f858295 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -135,6 +135,26 @@ struct bonsai_render_command_gl_timer_read_value_and_histogram u32 GlTimerObject; }; +struct bonsai_render_command_allocate_and_map_gpu_element_buffer +{ + data_type Type; + u32 ElementCount; + + gpu_mapped_element_buffer *Dest; + + // TODO(Jesse): This is a crutch for not being able to define the next job + // remove. + // + // nopush + world_chunk *SynChunk; + world_chunk *DestChunk; +}; + +struct bonsai_render_command_unmap_gpu_element_buffer +{ + gpu_mapped_element_buffer *Buf; +}; + struct bonsai_render_command_unmap_and_deallocate_buffer { gpu_readback_buffer PBOBuf; @@ -162,6 +182,8 @@ poof( bonsai_render_command_do_stuff + bonsai_render_command_allocate_and_map_gpu_element_buffer + bonsai_render_command_unmap_gpu_element_buffer bonsai_render_command_unmap_and_deallocate_buffer bonsai_render_command_setup_shader @@ -177,7 +199,7 @@ poof( bonsai_render_command_gl_timer_read_value_and_histogram } ) -#include +#include poof(d_union_all_constructors(work_queue_entry__bonsai_render_command)) #include diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 0c8fae4b5..31eab77f3 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -8,16 +8,9 @@ DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk) Assert( (Chunk->Flags & Chunk_Queued) == 0); Assert( Chunk->Flags & (Chunk_Deallocate|Chunk_VoxelsInitialized)); - DeallocateMeshes(&Chunk->Meshes, MeshFreelist); - - /* DeallocateGpuBuffers(RenderQueue, Chunk); */ - RangeIterator(MeshIndex, MeshIndex_Count) + if (HasGpuMesh(&Chunk->Mesh)) { - auto Handles = Chunk->Meshes.GpuBufferHandles+MeshIndex; - // @vertex_handle_primal - // - /* if (Handles->VertexHandle) { GL.DeleteBuffers(3, &Handles->VertexHandle); } */ - PushDeallocateBuffersCommand(RenderQ, Handles); + PushDeallocateBuffersCommand(RenderQ, &Chunk->Mesh.Handles); } ClearWorldChunk(Chunk); @@ -46,8 +39,7 @@ RenderOctree(engine_resources *Engine, shader *Shader) if (Node->Type == OctreeNodeType_Leaf) { - SyncGpuBuffersImmediate(Engine, &Node->Chunk->Meshes); - DrawLod(Engine, Shader, &Node->Chunk->Meshes, 0, {}, Quaternion(), V3(1)); + DrawLod(Engine, Shader, &Node->Chunk->Mesh, 0, {}, Quaternion(), V3(1)); } if (Node->Children[0]) { Push(&Stack, Node->Children[0]); } @@ -69,6 +61,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.GpuBuffers[0]); MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.Transparency.GpuBuffer); + auto LowPriorityQ = &Engine->Stdlib.Plat.LowPriority; + os *Os = &Engine->Stdlib.Os; /* platform *Plat = &Engine->Stdlib.Plat; */ while ( FutexNotSignaled(ThreadParams->WorkerThreadsExitFutex) ) @@ -90,6 +84,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case type_work_queue_entry_init_asset: case type_work_queue_entry_update_world_region: case type_work_queue_entry_rebuild_mesh: + case type_work_queue_entry_finalize_noise_values: case type_work_queue_entry_build_chunk_mesh: case type_work_queue_entry_sim_particle_system: case type_work_queue_entry__align_to_cache_line_helper: @@ -108,7 +103,26 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { InvalidCase(type_work_queue_entry__bonsai_render_command_noop); + { tmatch(bonsai_render_command_allocate_and_map_gpu_element_buffer, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_allocate_and_map_gpu_element_buffer); + + Assert(HasGpuMesh(Command->Dest) == 0); + Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 0); + Command->Dest[0] = AllocateAndMapGpuBuffer(Command->Type, Command->ElementCount); + Assert(HasGpuMesh(Command->Dest) == 1); + Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 1); + + auto Next = WorkQueueEntry(WorkQueueEntryBuildWorldChunkMesh(Command->SynChunk, Command->DestChunk)); + PushWorkQueueEntry(LowPriorityQ, &Next); + } break; + + { tmatch(bonsai_render_command_unmap_gpu_element_buffer, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_unmap_gpu_element_buffer); + FlushBuffersToCard(Command->Buf); + } break; + { tmatch(bonsai_render_command_unmap_and_deallocate_buffer, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_unmap_and_deallocate_buffer); gpu_readback_buffer PBOBuf = Command->PBOBuf; GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOBuf.PBO); @@ -120,6 +134,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; { tmatch(bonsai_render_command_allocate_texture, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_allocate_texture); texture *Texture = Command->Texture; switch (Texture->Channels) @@ -463,7 +478,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) u16 *NoiseValues = Cast(u16*, GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); AssertNoGlErrors; - auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryBuildChunkMesh(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->Chunk)); + auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->Chunk)); PushWorkQueueEntry(&Plat->LowPriority, &BuildMeshJob); RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 85ea83499..d73acdda4 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -1,105 +1,87 @@ -#define __COMPUTE_NOISE_INPUT(channel, basis_chunk_point, offset, chunk_dim_in_chunks) \ - f32(basis_chunk_point.channel) \ - + f32(offset)*Chunk->DimInChunks.channel \ - + SrcToDest.channel \ - link_internal u32 -FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, u16 *NoiseValues, v3i SrcToDest, s64 zMin, u16 PackedHSVColorValue) +FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, u16 *NoiseValues, v3i SrcToDest, s64 zMin) { TIMED_FUNCTION(); u32 ChunkSum = 0; + TIMED_NAMED_BLOCK(NoiseFinalize); + for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) + { + for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) { -#if 1 - TIMED_NAMED_BLOCK(NoiseFinalize); - for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) + u64 Mask = 0; + for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) { - /* f32 zCoord = 75.f; */ - /* f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zChunk), Chunk->DimInChunks); */ - /* f32 WorldZBiased = zCoord - zMin; */ - f32 WorldZBiased = 0.f; - for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) - { - u64 Mask = 0; - for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) - { - v3i ChunkP = V3i(xChunk, yChunk, zChunk); - /* v3i NoiseP = V3i(xChunk, yChunk, zChunk); */ - /* v3i NoiseP = V3i(xChunk+1, yChunk+1, zChunk+1); */ - v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); + v3i ChunkP = V3i(xChunk, yChunk, zChunk); + v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); - s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); - s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); + s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); + s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); - /* r32 ThisNoiseV = MapNoiseValueToFinal(NoiseValues[NoiseIndex]/OctaveAmplitudeMax)*OctaveAmplitudeMax; */ - u16 ThisNoiseV = NoiseValues[NoiseIndex]; - u64 NoiseChoice = (ThisNoiseV >> 15); - Assert(NoiseChoice == 1 || NoiseChoice == 0); - ChunkSum += u32(NoiseChoice); + u16 ThisNoiseV = NoiseValues[NoiseIndex]; + u64 NoiseChoice = (ThisNoiseV >> 15); + Assert(NoiseChoice == 1 || NoiseChoice == 0); + ChunkSum += u32(NoiseChoice); - u16 NoiseColor = ThisNoiseV & ((1 << 15) -1); + u16 NoiseColor = ThisNoiseV & ((1 << 15) -1); - Mask |= (NoiseChoice << xChunk); - /* SetOccupancyBit(Chunk, ChunkIndex, NoiseChoice); */ + Assert(xChunk < 64); + Mask |= (NoiseChoice << xChunk); - /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ - /* if (NormalIndex > -1) */ - /* { */ - /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ - /* } */ + /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ + /* if (NormalIndex > -1) */ + /* { */ + /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ + /* } */ - Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); - /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ - if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } - if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } - if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } - } + { Assert(NoiseColor == 3543u); } - SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); - } + Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); + /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ + /* if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } */ + /* if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ + /* if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } */ } -#endif - Assert(NoiseDim.x >= 66); - Assert(NoiseDim.y >= 66); - Assert(NoiseDim.z >= 66); + SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); + } + } - Assert(Chunk->Dim.x == 64); - Assert(Chunk->Dim.y == 66); - Assert(Chunk->Dim.z == 66); + Assert(NoiseDim.x >= 66); + Assert(NoiseDim.y >= 66); + Assert(NoiseDim.z >= 66); - for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) - { - /* f32 zCoord = 75.f; */ - /* f32 zCoord = __COMPUTE_NOISE_INPUT(z, WorldBasis, (zNoise), Chunk->DimInChunks); */ - /* f32 WorldZBiased = zCoord - zMin; */ - f32 WorldZBiased = 0.f; - for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) - { + Assert(Chunk->Dim.x == 64); + Assert(Chunk->Dim.y == 66); + Assert(Chunk->Dim.z == 66); - { - v3i BorderP = V3i(0, yNoise, zNoise); - s32 BorderIndex = GetIndex(BorderP, NoiseDim); + for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) + { + for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) + { - u16 ThisNoiseV = NoiseValues[BorderIndex]; - u64 NoiseChoice = (ThisNoiseV >> 15); - Assert(NoiseChoice == 1 || NoiseChoice == 0); - Chunk->xOccupancyBorder[(zNoise-1)*2] |= NoiseChoice << (yNoise-1); - } + { + v3i BorderP = V3i(0, yNoise, zNoise); + s32 BorderIndex = GetIndex(BorderP, NoiseDim); - { - v3i BorderP = V3i(65, yNoise, zNoise); - s32 BorderIndex = GetIndex(BorderP, NoiseDim); + u16 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = (ThisNoiseV >> 15); + Assert(NoiseChoice == 1 || NoiseChoice == 0); + Chunk->xOccupancyBorder[(zNoise-1)*2] |= NoiseChoice << (yNoise-1); + } - u16 ThisNoiseV = NoiseValues[BorderIndex]; - u64 NoiseChoice = (ThisNoiseV >> 15); - Assert(NoiseChoice == 1 || NoiseChoice == 0); - Chunk->xOccupancyBorder[((zNoise-1)*2)+1] |= NoiseChoice << (yNoise-1); - } + { + v3i BorderP = V3i(65, yNoise, zNoise); + s32 BorderIndex = GetIndex(BorderP, NoiseDim); - } + u16 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = (ThisNoiseV >> 15); + Assert(NoiseChoice == 1 || NoiseChoice == 0); + Chunk->xOccupancyBorder[((zNoise-1)*2)+1] |= NoiseChoice << (yNoise-1); } + } + } return ChunkSum; } diff --git a/src/engine/terrain.h b/src/engine/terrain.h index ca279b149..6d47b6e93 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -304,4 +304,4 @@ link_internal u32 Terrain_Voronoi2D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); link_internal u32 -FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, u16 *NoiseValues, v3i SrcToDest, s64 zMin, u16 PackedHSVColorValue); +FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, u16 *NoiseValues, v3i SrcToDest, s64 zMin); diff --git a/src/engine/voxel_synthesis.cpp b/src/engine/voxel_synthesis.cpp index c467f5db0..29d939003 100644 --- a/src/engine/voxel_synthesis.cpp +++ b/src/engine/voxel_synthesis.cpp @@ -76,7 +76,7 @@ BakeVoxelSynthesisRules(const char* InputVox) Vox.ChunkData->Voxels[VIndex].Color = RGBtoPackedHSV(RGB_GRASS_GREEN); } - MarkBoundaryVoxels_NoExteriorFaces( Vox.ChunkData->Occupancy, Vox.ChunkData->xOccupancyBorder, Vox.ChunkData->FaceMasks, Vox.ChunkData->Voxels, Vox.ChunkData->Dim, {}, Vox.ChunkData->Dim); + MakeFaceMasks_NoExteriorFaces( Vox.ChunkData->Occupancy, Vox.ChunkData->xOccupancyBorder, Vox.ChunkData->FaceMasks, Vox.ChunkData->Voxels, Vox.ChunkData->Dim, {}, Vox.ChunkData->Dim); Assert(Vox.ChunkData->Dim.x % Global_TileDim.x == 0); Assert(Vox.ChunkData->Dim.y % Global_TileDim.y == 0); diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index 5489b149f..bcfa2abce 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -60,7 +60,7 @@ struct work_queue_entry_init_world_chunk { /* world_chunk_mesh_bitfield MeshBit; */ }; -struct work_queue_entry_build_chunk_mesh +struct work_queue_entry_finalize_noise_values { gpu_readback_buffer PBOBuf; @@ -70,12 +70,19 @@ struct work_queue_entry_build_chunk_mesh world_chunk *Chunk; }; +struct work_queue_entry_build_chunk_mesh +{ + world_chunk *SynChunk; + world_chunk *DestChunk; +}; + +#if 1 struct work_queue_entry_rebuild_mesh { world_chunk *Chunk; chunk_init_flags Flags; - /* world_chunk_mesh_bitfield MeshBit; */ }; +#endif @@ -139,8 +146,6 @@ poof( } ) -link_internal void -DrawLod(engine_resources *Engine, shader *Shader, lod_element_buffer *Meshes, r32 DistanceSquared, v3 Basis, Quaternion Rotation = Quaternion(), v3 Scale = V3(1.f)); poof( func asyncify_render_function_c(func_t) @@ -169,6 +174,9 @@ poof( poof(asyncify_render_function_h(RenderToTexture)) #include +link_internal void +DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Meshes, r32 DistanceSquared, v3 Basis, Quaternion Rotation = Quaternion(), v3 Scale = V3(1.f)); + poof(asyncify_render_function_h(DrawLod)) #include @@ -229,6 +237,7 @@ poof( d_union work_queue_entry { work_queue_entry_init_world_chunk + work_queue_entry_finalize_noise_values work_queue_entry_build_chunk_mesh /* work_queue_entry_copy_buffer */ work_queue_entry_copy_buffer_set @@ -310,7 +319,7 @@ poof( #include link_internal void -RenderToTexture(engine_resources *Engine, asset_thumbnail *Thumb, lod_element_buffer *Meshes, v3 Offset, camera *Camera); +RenderToTexture(engine_resources *Engine, asset_thumbnail *Thumb, gpu_mapped_element_buffer *Meshes, v3 Offset, camera *Camera); poof(asyncify_render_function_c(RenderToTexture)) #include diff --git a/src/engine/world.cpp b/src/engine/world.cpp index c7c6968af..2789bb734 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -361,7 +361,7 @@ CountsAsDrawableOrUnmeshed(octree_node *Node) // I'm going to say this is true to avoid data races for now b32 NotQueued = (Chunk->Flags&Chunk_Queued) == 0; - Result = ( NotQueued && Chunk->HasMesh && HasGpuMesh(&Chunk->Meshes) ); + Result = ( NotQueued && Chunk->HasMesh && HasGpuMesh(&Chunk->Mesh) ); } else { @@ -425,7 +425,7 @@ DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); } - if (HasGpuMesh(&Node->Chunk->Meshes) && EngineDebug->DrawBranchNodesWithMeshes) + if (HasGpuMesh(&Node->Chunk->Mesh) && EngineDebug->DrawBranchNodesWithMeshes) { DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); } @@ -566,7 +566,7 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio } // Prefer chunks who have a higher chance of having geometry - if (Parent && Parent->Chunk && HasGpuMesh(&Parent->Chunk->Meshes)) + if (Parent && Parent->Chunk && HasGpuMesh(&Parent->Chunk->Mesh)) { IdealListIndex = Max(0, IdealListIndex-3); } @@ -678,7 +678,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue if (Chunk) { - SyncGpuBuffersAsync(Engine, &Chunk->Meshes); + /* SyncGpuBuffersAsync(Engine, &Chunk->Meshes); */ Assert(Chunk->Dim % World->ChunkDim == V3i(0)); @@ -689,7 +689,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue Assert( (Chunk->Flags & Chunk_Queued) == False); /* if (Chunk->WorldP == V3i(0,0,0)) { RuntimeBreak(); } */ Assert(Chunk->FilledCount == 0 || Chunk->FilledCount == Volume(Chunk->Dim)); - Assert(HasGpuMesh(&Chunk->Meshes) == 0); + Assert(HasGpuMesh(&Chunk->Mesh) == 0); NodeToSplit->HadNoVisibleSurface = True; NodeToSplit->Chunk = 0; FreeWorldChunk(Engine, Chunk); @@ -816,7 +816,7 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); } - if (Chunk && HasGpuMesh(&Chunk->Meshes) && EngineDebug->DrawBranchNodesWithMeshes) + if (Chunk && HasGpuMesh(&Chunk->Mesh) && EngineDebug->DrawBranchNodesWithMeshes) { DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); } @@ -850,7 +850,7 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); } - if (HasGpuMesh(&Chunk->Meshes)) + if (HasGpuMesh(&Chunk->Mesh)) { Push(MainDrawList, &Chunk); Push(ShadowMapDrawList, &Chunk); @@ -876,7 +876,7 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); } - if (HasGpuMesh(&Chunk->Meshes)) + if (HasGpuMesh(&Chunk->Mesh)) { Push(MainDrawList, &Chunk); Push(ShadowMapDrawList, &Chunk); @@ -971,6 +971,8 @@ MaintainWorldOctree(engine_resources *Engine) DEBUG_VALUE_u32(FreedNodes); DEBUG_VALUE_u32(DeferrFreedNodes); + DEBUG_VALUE_u32(TotalChunksQueued); + /* DEBUG_VALUE_u32(ReusedNode); */ /* DEBUG_VALUE_u32(AllocatedNode); */ diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 5918ac117..e85167b70 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -28,6 +28,7 @@ ClearChunkVoxels(voxel *Voxels, chunk_dimension Dim) #endif } +#if 0 link_internal void UnSetMeshBit(world_chunk *Chunk, world_chunk_mesh_bitfield MeshBit) { @@ -36,6 +37,7 @@ UnSetMeshBit(world_chunk *Chunk, world_chunk_mesh_bitfield MeshBit) Assert(Chunk->Meshes.MeshMask & MeshBit); Chunk->Meshes.MeshMask = Chunk->Meshes.MeshMask & (~MeshBit); } +#endif #if 0 link_internal untextured_3d_geometry_buffer * @@ -90,6 +92,51 @@ WorldChunk(world_chunk *Chunk, v3i WorldP, v3i Dim, v3i DimInChunks) Chunk->DimInChunks = DimInChunks; } +link_internal world_chunk * +HeapAllocateWorldChunk( v3i WorldP, v3i Dim, v3i DimInChunks) +{ + TIMED_FUNCTION(); + world_chunk *Result = (world_chunk*)_aligned_malloc(sizeof(world_chunk), CACHE_LINE_SIZE); + memset(Result, 0, sizeof(world_chunk)); + + u32 MaxLodMeshVerts = POINT_BUFFER_SIZE*3; + + s32 VoxCount = Volume(Dim); + if (VoxCount) + { + umm OccupancyCount = (umm(VoxCount)+63u) / 64u; // Add seven so we round up when we divide if there's an extra one (or several) + Result->Occupancy = (u64*)_aligned_malloc(sizeof(u64)*OccupancyCount, CACHE_LINE_SIZE); + memset(Result->Occupancy, 0, sizeof(u64)*OccupancyCount); + + Result->xOccupancyBorder = (u64*)_aligned_malloc(sizeof(u64)*umm(xOccupancyBorder_ElementCount), CACHE_LINE_SIZE); + memset(Result->xOccupancyBorder, 0, sizeof(u64)*umm(xOccupancyBorder_ElementCount)); + + Result->FaceMasks = (u64*)_aligned_malloc(sizeof(u64)*6*OccupancyCount, CACHE_LINE_SIZE); + memset(Result->FaceMasks, 0, sizeof(u64)*6*OccupancyCount); + + Result->Voxels = (voxel*)_aligned_malloc(sizeof(voxel)*umm(VoxCount), CACHE_LINE_SIZE); + memset(Result->Voxels, 0, sizeof(voxel)*umm(VoxCount)); + } + + + WorldChunk(Result, WorldP, Dim, DimInChunks); + return Result; + /* Result->StandingSpots = V3iCursor(WORLD_CHUNK_STANDING_SPOT_COUNT); */ +} + +link_internal void +HeapFreeWorldChunk( world_chunk *Chunk ) +{ + /* HISTOGRAM_FUNCTION(); */ + TIMED_FUNCTION(); + Assert(Chunk->Dim == V3i(64, 66, 66)); + _aligned_free(Chunk->Occupancy); + _aligned_free(Chunk->xOccupancyBorder); + _aligned_free(Chunk->FaceMasks); + _aligned_free(Chunk->Voxels); + _aligned_free(Chunk); +} + link_internal void AllocateWorldChunk(world_chunk *Result, v3i WorldP, v3i Dim, v3i DimInChunks, memory_arena *Storage) { @@ -106,10 +153,6 @@ AllocateWorldChunk(world_chunk *Result, v3i WorldP, v3i Dim, v3i DimInChunks, me } WorldChunk(Result, WorldP, Dim, DimInChunks); - /* Result->DimX = SafeTruncateU8(Dim.x); */ - /* Result->DimY = SafeTruncateU8(Dim.y); */ - /* Result->DimZ = SafeTruncateU8(Dim.z); */ - Result->StandingSpots = V3iCursor(WORLD_CHUNK_STANDING_SPOT_COUNT, Storage); } @@ -283,9 +326,9 @@ GetFreeWorldChunk(world *World) ++TotalWorldChunksAllocated; } - Assert(Result->Meshes.MeshMask == 0); Result->WorldP = INVALID_WORLD_CHUNK_POSITION; + Assert(HasGpuMesh(&Result->Mesh) == False); return Result; } @@ -335,12 +378,9 @@ GetAndInsertFreeWorldChunk(world *World, world_position P) link_internal void DeallocateGpuBuffers(work_queue *RenderQueue, world_chunk *Chunk ) { - RangeIterator(MeshIndex, MeshIndex_Count) - { - PushDeallocateBuffersCommand(RenderQueue, &Chunk->Meshes.GpuBufferHandles[MeshIndex]); - Assert(Chunk->Meshes.GpuBufferHandles[MeshIndex].Mapped == False); - Assert(Chunk->Meshes.GpuBufferHandles[MeshIndex].ElementCount == 0); - } + PushDeallocateBuffersCommand(RenderQueue, &Chunk->Mesh.Handles); + Assert(Chunk->Mesh.Handles.Mapped == False); + Assert(Chunk->Mesh.Handles.ElementCount == 0); } link_internal void PushBonsaiRenderCommandDeallocateWorldChunk( work_queue *RenderQueue, world_chunk* Chunk); @@ -892,13 +932,13 @@ MarkBoundaryVoxels_MakeExteriorFaces( u64 *Occupancy, } link_internal s32 -MarkBoundaryVoxels_NoExteriorFaces( u64 *Occupancy, - u64 *xOccupancyBorder, - u64 *FaceMasks, - voxel *Voxels, - v3i SrcChunkDim, - v3i SrcChunkMin, - v3i SrcChunkMax ) +MakeFaceMasks_NoExteriorFaces( u64 *Occupancy, + u64 *xOccupancyBorder, + u64 *FaceMasks, + voxel *Voxels, + v3i SrcChunkDim, + v3i SrcChunkMin, + v3i SrcChunkMax ) { /* HISTOGRAM_FUNCTION(); */ TIMED_FUNCTION(); @@ -1458,6 +1498,7 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); LeftFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_LeftFaceNormalData, Materials); @@ -1469,6 +1510,7 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); RightFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_RightFaceNormalData, Materials); @@ -1480,6 +1522,7 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); FrontFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_FrontFaceNormalData, Materials); @@ -1491,6 +1534,7 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); BackFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_BackFaceNormalData, Materials); @@ -1502,6 +1546,7 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); TopFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_TopFaceNormalData, Materials); @@ -1513,6 +1558,7 @@ poof( u32 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + Assert(HSVColor == 3543u); BottomFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_BottomFaceNormalData, Materials); @@ -2017,6 +2063,35 @@ poof(world_chunk_mesh_functions(untextured_3d_geometry_buffer, v3)) poof(world_chunk_mesh_functions(untextured_3d_geometry_buffer, v3_u8)) #include +link_internal s32 +CountRequiredFacesForMesh_Naieve( u64 *FaceMasks, + v3i SrcChunkDim) +{ + /* HISTOGRAM_FUNCTION(); */ + TIMED_FUNCTION(); + + Assert(SrcChunkDim == V3i(64, 66, 66)); + + s32 Result = 0; + for ( s32 zBlock = 1; zBlock < SrcChunkDim.z; ++zBlock ) + { + s32 z = zBlock; + for ( s32 yBlock = 1; yBlock < SrcChunkDim.y; ++yBlock ) + { + s32 y = yBlock; + s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); + + RangeIterator(MaskIndex, 6) + { + u64 Faces = FaceMasks[(OccupancyIndex*6)+MaskIndex]; + Result += CountBitsSet_Kernighan(Faces); + } + } + } + return Result; +} + + #if 0 link_internal void BuildWorldChunkMesh_Direct( voxel *Voxels, @@ -3401,12 +3476,16 @@ InitializeWorldChunkEmpty(world_chunk *DestChunk) return; } +debug_global u32 TotalChunksQueued; + inline void QueueChunkForInit(work_queue *Queue, world_chunk *Chunk, world_chunk_mesh_bitfield MeshBit) { TIMED_FUNCTION(); Assert( NotSet(Chunk->Flags, Chunk_Queued) ); + ++TotalChunksQueued; + /* DebugLine("Queuing Chunk (%p)(%d, %d, %d)", Chunk, Chunk->WorldP.x, Chunk->WorldP.y, Chunk->WorldP.z); */ #if 0 @@ -3427,6 +3506,7 @@ QueueChunkForInit(work_queue *Queue, world_chunk *Chunk, world_chunk_mesh_bitfie SetFlag(&Chunk->Flags, Chunk_Queued); } +#if 1 inline void QueueChunkForMeshRebuild(work_queue *Queue, world_chunk *Chunk, chunk_init_flags Flags = ChunkInitFlag_Noop) { @@ -3454,6 +3534,7 @@ QueueChunkForMeshRebuild(work_queue *Queue, world_chunk *Chunk, chunk_init_flags SetFlag(&Chunk->Flags, Chunk_Queued); PushWorkQueueEntry(Queue, &Entry); } +#endif link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve( voxel *Voxels, u64 *FaceMasks, v3i SrcChunkDim, v3i SrcChunkMin, v3i SrcChunkMax, untextured_3d_geometry_buffer *DestGeometry, untextured_3d_geometry_buffer *DestTransparentGeometry, v3 VertexOffset = {}) @@ -3501,36 +3582,19 @@ BuildMipMesh( voxel *Voxels, v3i VoxDim, v3i InnerMin, v3i InnerMax, world_ch } link_internal void -RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOffset, v3i MaxOffset, world_chunk_mesh_bitfield MeshBit, geo_u3d *TempMesh, memory_arena *TempMem, v3 VertexOffset = {}) +RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOffset, v3i MaxOffset, world_chunk_mesh_bitfield MeshBit, geo_u3d *Dest, memory_arena *TempMem, v3 VertexOffset = {}) { + /* HISTOGRAM_FUNCTION(); */ TIMED_FUNCTION(); engine_resources *Engine = GetEngineResources(); Assert( IsSet(Chunk->Flags, Chunk_VoxelsInitialized) ); Assert( MeshBit == MeshBit_Lod0 ); - Assert(Chunk->DEBUG_OwnedByThread == 0); - Chunk->DEBUG_OwnedByThread = ThreadLocal_ThreadIndex; - - BuildWorldChunkMeshFromMarkedVoxels_Naieve( Chunk->Voxels, Chunk->FaceMasks, Chunk->Dim, MinOffset, MaxOffset, TempMesh, 0); - - if (TempMesh->At) - { - geo_u3d *FinalMesh = GetPermMeshForChunk(&Engine->world_chunk_MeshFreelist, TempMesh, Thread->PermMemory); - DeepCopy(TempMesh, FinalMesh); + BuildWorldChunkMeshFromMarkedVoxels_Naieve( Chunk->Voxels, Chunk->FaceMasks, Chunk->Dim, MinOffset, MaxOffset, Dest, 0); - auto *Replaced = AtomicReplaceMesh(&Chunk->Meshes, MeshBit, FinalMesh, FinalMesh->Timestamp); - if (Replaced) { DeallocateMesh(Replaced, &Engine->world_chunk_MeshFreelist); } - } - else - { - PushDeallocateBuffersCommand(&Engine->Stdlib.Plat.RenderQ, &Chunk->Meshes.GpuBufferHandles[ToIndex(MeshBit)]); - /* DeallocateGpuBuffers(&Engine->Stdlib.Plat.RenderQ, Chunk); */ - } - - Chunk->DEBUG_OwnedByThread = 0; - // NOTE(Jesse): Chunk flags modified by caller; this routine gets called multiple times per job + if (Dest->At == 0) { PushDeallocateBuffersCommand(&Engine->Stdlib.Plat.RenderQ, &Chunk->Mesh.Handles); } } @@ -3547,6 +3611,8 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, b32 MakeExteriorFaces = False, v3i NoiseBasisOffset = {} ) { + NotImplemented; +#if 0 /* HISTOGRAM_FUNCTION(); */ /* TIMED_FUNCTION(); */ @@ -3676,6 +3742,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, Assert(Graphics->ChunksCurrentlyQueued > 0); AtomicDecrement(&Graphics->ChunksCurrentlyQueued); #endif +#endif } // TODO(Jesse): Remove this thnk @@ -3713,9 +3780,16 @@ WorkQueueEntryRebuildMesh(world_chunk *Chunk, chunk_init_flags Flags) } link_internal work_queue_entry_build_chunk_mesh -WorkQueueEntryBuildChunkMesh(gpu_readback_buffer PBOBuf, u16 *NoiseData, v3i NoiseDim, world_chunk *Chunk) +WorkQueueEntryBuildWorldChunkMesh(world_chunk *SynChunk, world_chunk *DestChunk) +{ + work_queue_entry_build_chunk_mesh Result = {SynChunk, DestChunk}; + return Result; +} + +link_internal work_queue_entry_finalize_noise_values +WorkQueueEntryFinalizeNoiseValues(gpu_readback_buffer PBOBuf, u16 *NoiseData, v3i NoiseDim, world_chunk *Chunk) { - work_queue_entry_build_chunk_mesh Result = { PBOBuf, NoiseData, NoiseDim, Chunk }; + work_queue_entry_finalize_noise_values Result = { PBOBuf, NoiseData, NoiseDim, Chunk }; return Result; } diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 694646bca..67997bae4 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -330,7 +330,11 @@ struct world_chunk poof(@version(1)) // TODO(Jesse): This stores pointers that are completely ephemeral and as // such are wasted space. We could remove those to make this struct 24 bytes // smaller, which is probably pretty worth. - lod_element_buffer Meshes; poof(@no_serialize) + // + // TODO(Jesse): remove this in favor of Mesh + /* lod_element_buffer Meshes; poof(@no_serialize) */ + + gpu_mapped_element_buffer Mesh; poof(@no_serialize) // TODO(Jesse): Pack this into something else.. or ideally remove it entirely. b32 HasMesh; poof(@no_serialize) @@ -664,8 +668,8 @@ link_internal untextured_3d_geometry_buffer* AllocateTempMesh(memory_arena* TempMemory, data_type Type); -struct work_queue_entry_build_chunk_mesh; +struct work_queue_entry_finalize_noise_values; struct gpu_readback_buffer; -link_internal work_queue_entry_build_chunk_mesh +link_internal work_queue_entry_finalize_noise_values WorkQueueEntryBuildChunkMesh(gpu_readback_buffer PBOBuf, f32 *NoiseData, v3i NoiseDim, world_chunk *Chunk); diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index f75afa95f..66af6dee3 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -32,6 +32,7 @@ WorldUpdateThread_Main(void *ThreadStartupParams) case type_work_queue_entry_copy_buffer_ref: case type_work_queue_entry_init_asset: case type_work_queue_entry_rebuild_mesh: + case type_work_queue_entry_finalize_noise_values: case type_work_queue_entry_build_chunk_mesh: case type_work_queue_entry_sim_particle_system: case type_work_queue_entry__align_to_cache_line_helper: @@ -1145,7 +1146,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ // NOTE(Jesse): We can actually do the entire dim here, but it's probably // better (faster) to just do what we actually need to - MarkBoundaryVoxels_NoExteriorFaces( CopiedChunk.Occupancy, CopiedChunk.xOccupancyBorder, CopiedChunk.FaceMasks, CopiedChunk.Voxels, UpdateDim, {{1,1,1}}, UpdateDim-1); + MakeFaceMasks_NoExteriorFaces( CopiedChunk.Occupancy, CopiedChunk.xOccupancyBorder, CopiedChunk.FaceMasks, CopiedChunk.Voxels, UpdateDim, {{1,1,1}}, UpdateDim-1); /* MarkBoundaryVoxels_NoExteriorFaces( CopiedChunk.Voxels, UpdateDim, {}, UpdateDim); */ /* MarkBoundaryVoxels_MakeExteriorFaces( CopiedChunk.Voxels, UpdateDim, {{1,1,1}}, UpdateDim-1); */ /* MarkBoundaryVoxels_MakeExteriorFaces( CopiedChunk.Voxels, UpdateDim, {}, UpdateDim); */ From 6b28ff9baa23ce6c1d62866b2e013f7656209d24 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 07:18:28 -0700 Subject: [PATCH 110/421] Remove heap allocating synthetic chunks; use freelist instead --- generated/for_datatypes_0XxWqGSZ.h | 3 + generated/for_datatypes_fkubhsYl.h | 3 + generated/for_datatypes_kv3WBTai.h | 3 + generated/gen_map_value_to_range_r32.h | 2 +- generated/gen_map_value_to_range_s32.h | 2 +- generated/gen_map_value_to_range_u32.h | 2 +- generated/gen_random_between_r32.h | 2 +- generated/gen_random_between_s32.h | 2 +- generated/gen_random_between_u32.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/api.cpp | 53 ++++++++- src/engine/terrain.cpp | 106 ++++++++++-------- src/engine/world.h | 3 + src/engine/world_chunk.cpp | 2 + 16 files changed, 132 insertions(+), 59 deletions(-) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index e91c8c216..bb9bfd83e 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -198,6 +198,7 @@ + struct render_to_texture_async_params; @@ -702,3 +703,5 @@ WorkQueueEntryAsyncFunction( draw_lod_async_params *Params ) + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index c5a5077bb..f92848ec5 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -198,6 +198,7 @@ + render_to_texture_async_params render_to_texture_async_params; @@ -683,3 +684,5 @@ draw_lod_async_params draw_lod_async_params; + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index cd20de1fe..a1344cd44 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -198,6 +198,7 @@ + type_render_to_texture_async_params, @@ -683,3 +684,5 @@ type_draw_lod_async_params, + + diff --git a/generated/gen_map_value_to_range_r32.h b/generated/gen_map_value_to_range_r32.h index 3ad870836..e0c0ecf02 100644 --- a/generated/gen_map_value_to_range_r32.h +++ b/generated/gen_map_value_to_range_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/random.h:203:0 +// external/bonsai_stdlib/src/random.h:206:0 link_internal r32 MapValueToRange( r32 LowestPossibleValue, r32 Value, r32 HighestPossibleValue) diff --git a/generated/gen_map_value_to_range_s32.h b/generated/gen_map_value_to_range_s32.h index 4f1f0a57a..1b38bd827 100644 --- a/generated/gen_map_value_to_range_s32.h +++ b/generated/gen_map_value_to_range_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/random.h:209:0 +// external/bonsai_stdlib/src/random.h:212:0 link_internal s32 MapValueToRange( s32 LowestPossibleValue, r32 Value, s32 HighestPossibleValue) diff --git a/generated/gen_map_value_to_range_u32.h b/generated/gen_map_value_to_range_u32.h index 58d1a8629..9a1f82bd9 100644 --- a/generated/gen_map_value_to_range_u32.h +++ b/generated/gen_map_value_to_range_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/random.h:206:0 +// external/bonsai_stdlib/src/random.h:209:0 link_internal u32 MapValueToRange( u32 LowestPossibleValue, r32 Value, u32 HighestPossibleValue) diff --git a/generated/gen_random_between_r32.h b/generated/gen_random_between_r32.h index 19fe39b41..398846e6f 100644 --- a/generated/gen_random_between_r32.h +++ b/generated/gen_random_between_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/random.h:229:0 +// external/bonsai_stdlib/src/random.h:232:0 link_internal r32 RandomBetween( r32 LowestPossibleValue, random_series *Entropy, r32 HighestPossibleValue) diff --git a/generated/gen_random_between_s32.h b/generated/gen_random_between_s32.h index 07badf979..66e282100 100644 --- a/generated/gen_random_between_s32.h +++ b/generated/gen_random_between_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/random.h:235:0 +// external/bonsai_stdlib/src/random.h:238:0 link_internal s32 RandomBetween( s32 LowestPossibleValue, random_series *Entropy, s32 HighestPossibleValue) diff --git a/generated/gen_random_between_u32.h b/generated/gen_random_between_u32.h index 899933b0b..64826212a 100644 --- a/generated/gen_random_between_u32.h +++ b/generated/gen_random_between_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/random.h:232:0 +// external/bonsai_stdlib/src/random.h:235:0 link_internal u32 RandomBetween( u32 LowestPossibleValue, random_series *Entropy, u32 HighestPossibleValue) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 1eeb42ad1..26b9472b4 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3046:0 +// src/engine/world_chunk.cpp:3048:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 44fac4056..d78721cce 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2060:0 +// src/engine/world_chunk.cpp:2062:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index e35e734f9..f73a9536c 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2063:0 +// src/engine/world_chunk.cpp:2065:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 83dfcba23..33903ed25 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -527,6 +527,36 @@ Bonsai_Render(engine_resources *Engine) return Result; } +struct bonsai_thread_user_data +{ + u64 Magic0 = 0x69; + + world_chunk_freelist SynChunkFreelist; + + u64 Magic1 = 0x420; +}; + +link_internal void +FreeWorldChunk(world_chunk_freelist *Freelist, world_chunk *Chunk) +{ + Free(Freelist, Chunk); +} + +link_internal world_chunk * +GetOrAllocate(world_chunk_freelist *Freelist, v3i WorldP, v3i Dim, v3i DimInChunks, memory_arena *Memory) +{ + Freelist->Memory = Memory; + world_chunk *Result = GetOrAllocate(Freelist); + + + if (Result->Voxels == 0) + { + AllocateWorldChunk(Result, WorldP, Dim, DimInChunks, Memory); + } + + return Result; +} + link_weak void WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_PARAMS) { @@ -535,6 +565,17 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ auto RenderQ = &EngineResources->Stdlib.Plat.RenderQ; + if (Thread->UserData == 0) + { + Thread->UserData = Allocate(bonsai_thread_user_data, Thread->PermMemory, 1); + bonsai_thread_user_data *UserData = Cast(bonsai_thread_user_data*, Thread->UserData); + *UserData = {}; + } + + bonsai_thread_user_data *UserData = Cast(bonsai_thread_user_data*, Thread->UserData); + Assert(UserData->Magic0 == 0x69); + Assert(UserData->Magic1 == 0x420); + tswitch (Entry) { InvalidCase(type_work_queue_entry_noop); @@ -566,7 +607,11 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ /* PushWorkQueueEntry(&Plat->LowPriority, &E); */ world_chunk *DestChunk = Chunk1; - world_chunk *SynChunk = HeapAllocateWorldChunk({}, Chunk1->Dim + V3i(0, 2, 2), V3i(1)); + /* world_chunk *SynChunk = HeapAllocateWorldChunk({}, Chunk1->Dim + V3i(0, 2, 2), V3i(1)); */ + /* world_chunk *SynChunk = AllocateWorldChunk({}, Chunk1->Dim + V3i(0, 2, 2), V3i(1), GetThreadLocalState(ThreadLocal_ThreadIndex)->PermMemory); */ + world_chunk *SynChunk = GetOrAllocate(&UserData->SynChunkFreelist, {}, Chunk1->Dim + V3i(0, 2, 2), Chunk1->DimInChunks, Thread->PermMemory); + Assert(SynChunk->Dim == V3i(64, 66, 66)); + /* WorldChunk(SynChunk, {}, Chunk1->Dim + V3i(0, 2, 2), Chunk1->DimInChunks); */ SynChunk->Flags = Chunk_Queued; v3i WorldBasis = {}; v3i SynChunkDim = SynChunk->Dim; @@ -603,14 +648,14 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ { Assert(HasGpuMesh(&DestChunk->Mesh) == False); FinalizeChunkInitialization(DestChunk); - HeapFreeWorldChunk(SynChunk); + FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); } } else { Assert(HasGpuMesh(&DestChunk->Mesh) == False); FinalizeChunkInitialization(DestChunk); - HeapFreeWorldChunk(SynChunk); + FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); } auto Graphics = &EngineResources->Graphics; @@ -642,7 +687,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ DestChunk->HasMesh = True; - HeapFreeWorldChunk(SynChunk); + FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); DestChunk->DEBUG_OwnedByThread = 0; diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index d73acdda4..1fb7e3cf8 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -4,46 +4,50 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No TIMED_FUNCTION(); u32 ChunkSum = 0; TIMED_NAMED_BLOCK(NoiseFinalize); - for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) + { - for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) + TIMED_NAMED_BLOCK(NoiseFinalize0); + for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) { - u64 Mask = 0; - for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) + for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) { - v3i ChunkP = V3i(xChunk, yChunk, zChunk); - v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); + u64 Mask = 0; + for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) + { + v3i ChunkP = V3i(xChunk, yChunk, zChunk); + v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); - s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); - s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); + s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); + s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); - u16 ThisNoiseV = NoiseValues[NoiseIndex]; - u64 NoiseChoice = (ThisNoiseV >> 15); - Assert(NoiseChoice == 1 || NoiseChoice == 0); - ChunkSum += u32(NoiseChoice); + u16 ThisNoiseV = NoiseValues[NoiseIndex]; + u64 NoiseChoice = (ThisNoiseV >> 15); + Assert(NoiseChoice == 1 || NoiseChoice == 0); + ChunkSum += u32(NoiseChoice); - u16 NoiseColor = ThisNoiseV & ((1 << 15) -1); + u16 NoiseColor = ThisNoiseV & ((1 << 15) -1); - Assert(xChunk < 64); - Mask |= (NoiseChoice << xChunk); + Assert(xChunk < 64); + Mask |= (NoiseChoice << xChunk); - /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ - /* if (NormalIndex > -1) */ - /* { */ - /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ - /* } */ + /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ + /* if (NormalIndex > -1) */ + /* { */ + /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ + /* } */ - { Assert(NoiseColor == 3543u); } + { Assert(NoiseColor == 3543u); } - Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); - /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ - /* if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } */ - /* if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ - /* if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } */ - } + Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); + /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ + /* if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } */ + /* if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ + /* if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } */ + } - SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); + SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); + } } } @@ -55,31 +59,41 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No Assert(Chunk->Dim.y == 66); Assert(Chunk->Dim.z == 66); - for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) { - for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) - { + TIMED_NAMED_BLOCK(NoiseFinalize1); + for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) + { + u64 x0Bits = {}; + u64 x1Bits = {}; + for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) { - v3i BorderP = V3i(0, yNoise, zNoise); - s32 BorderIndex = GetIndex(BorderP, NoiseDim); - u16 ThisNoiseV = NoiseValues[BorderIndex]; - u64 NoiseChoice = (ThisNoiseV >> 15); - Assert(NoiseChoice == 1 || NoiseChoice == 0); - Chunk->xOccupancyBorder[(zNoise-1)*2] |= NoiseChoice << (yNoise-1); - } + { + v3i BorderP = V3i(0, yNoise, zNoise); + s32 BorderIndex = GetIndex(BorderP, NoiseDim); + + u16 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = (ThisNoiseV >> 15); + Assert(NoiseChoice == 1 || NoiseChoice == 0); + u64 Bit = NoiseChoice << (yNoise-1); + x0Bits |= Bit; + } - { - v3i BorderP = V3i(65, yNoise, zNoise); - s32 BorderIndex = GetIndex(BorderP, NoiseDim); + { + v3i BorderP = V3i(65, yNoise, zNoise); + s32 BorderIndex = GetIndex(BorderP, NoiseDim); + + u16 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = (ThisNoiseV >> 15); + Assert(NoiseChoice == 1 || NoiseChoice == 0); + u64 Bit = NoiseChoice << (yNoise-1); + x1Bits |= Bit; + } - u16 ThisNoiseV = NoiseValues[BorderIndex]; - u64 NoiseChoice = (ThisNoiseV >> 15); - Assert(NoiseChoice == 1 || NoiseChoice == 0); - Chunk->xOccupancyBorder[((zNoise-1)*2)+1] |= NoiseChoice << (yNoise-1); } - + Chunk->xOccupancyBorder[(zNoise-1)*2] = x0Bits; + Chunk->xOccupancyBorder[((zNoise-1)*2)+1] = x1Bits; } } return ChunkSum; diff --git a/src/engine/world.h b/src/engine/world.h index cb539f237..d6398b880 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -38,6 +38,9 @@ poof(generate_stack(octree_node_ptr, {})) poof(freelist_allocator(octree_node)) #include +poof(freelist_allocator(world_chunk)) +#include + struct world { v3i Center; // the world chunk position of the center of the visible region diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index e85167b70..b8dae1750 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -92,6 +92,7 @@ WorldChunk(world_chunk *Chunk, v3i WorldP, v3i Dim, v3i DimInChunks) Chunk->DimInChunks = DimInChunks; } +#if 0 link_internal world_chunk * HeapAllocateWorldChunk( v3i WorldP, v3i Dim, v3i DimInChunks) { @@ -136,6 +137,7 @@ HeapFreeWorldChunk( world_chunk *Chunk ) _aligned_free(Chunk->Voxels); _aligned_free(Chunk); } +#endif link_internal void AllocateWorldChunk(world_chunk *Result, v3i WorldP, v3i Dim, v3i DimInChunks, memory_arena *Storage) From 100a5c83bc681a0c1d4d8cb1b418b55933cbc1d5 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 07:24:36 -0700 Subject: [PATCH 111/421] Turn colors back on --- examples/terrain_gen/game_constants.h | 4 ++-- generated/generate_stream_compact_v3i.h | 2 +- ...mesh_functions_untextured_3d_geometry_buffer_v3.h | 8 +------- ...h_functions_untextured_3d_geometry_buffer_v3_u8.h | 8 +------- shaders/terrain/default.fragmentshader | 12 ++++++------ src/engine/terrain.cpp | 8 +++----- src/engine/world_chunk.cpp | 6 ------ 7 files changed, 14 insertions(+), 34 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index d542edd02..a24ba403f 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -18,8 +18,8 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ -/* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ -g_VisibleRegion = Chunk_Dimension(64, 64, 64); +g_VisibleRegion = Chunk_Dimension(128, 128, 128); +/* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 26b9472b4..49654dce7 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3048:0 +// src/engine/world_chunk.cpp:3042:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index d78721cce..bd019f49d 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2062:0 +// src/engine/world_chunk.cpp:2056:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, @@ -52,7 +52,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); LeftFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_LeftFaceNormalData, Materials); @@ -64,7 +63,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); RightFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_RightFaceNormalData, Materials); @@ -76,7 +74,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); FrontFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_FrontFaceNormalData, Materials); @@ -88,7 +85,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); BackFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_BackFaceNormalData, Materials); @@ -100,7 +96,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); TopFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_TopFaceNormalData, Materials); @@ -112,7 +107,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u32 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); BottomFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_BottomFaceNormalData, Materials); diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index f73a9536c..09847c7d4 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2065:0 +// src/engine/world_chunk.cpp:2059:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, @@ -52,7 +52,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); LeftFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_LeftFaceNormalData, Materials); @@ -64,7 +63,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); RightFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_RightFaceNormalData, Materials); @@ -76,7 +74,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); FrontFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_FrontFaceNormalData, Materials); @@ -88,7 +85,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); BackFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_BackFaceNormalData, Materials); @@ -100,7 +96,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); TopFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_TopFaceNormalData, Materials); @@ -112,7 +107,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u32 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); BottomFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, v3_u8_BottomFaceNormalData, Materials); diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index afe286a6f..431f486f6 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -334,10 +334,10 @@ void main() // -- user code -- // { - v3 Period = V3(100.f); - float Amplitude = 200.f; - f32 StartingZDepth = 1000.f; - s32 Octaves = 1; + v3 Period = V3(10000.f); + float Amplitude = 2000.f; + f32 StartingZDepth = 10000.f; + s32 Octaves = 10; NoiseValue = StartingZDepth; @@ -374,8 +374,8 @@ void main() // uint SolidBit = NoiseValue > 0.f ? 1u : 0u; - /* uint PackedColor = max(RGBtoPackedHSV(ColorValue), 3543u); */ - uint PackedColor = 3543u; + uint PackedColor = RGBtoPackedHSV(ColorValue); + /* uint PackedColor = 3543u; */ Output = (SolidBit << 15) | PackedColor; } diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 1fb7e3cf8..8d3796b1c 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -37,13 +37,11 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ /* } */ - { Assert(NoiseColor == 3543u); } - Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ - /* if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } */ - /* if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } */ - /* if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } */ + if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } + if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } + if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } } SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index b8dae1750..b7541cfb5 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -1500,7 +1500,6 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); LeftFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_LeftFaceNormalData, Materials); @@ -1512,7 +1511,6 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); RightFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_RightFaceNormalData, Materials); @@ -1524,7 +1522,6 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); FrontFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_FrontFaceNormalData, Materials); @@ -1536,7 +1533,6 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); BackFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_BackFaceNormalData, Materials); @@ -1548,7 +1544,6 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); TopFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_TopFaceNormalData, Materials); @@ -1560,7 +1555,6 @@ poof( u32 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - Assert(HSVColor == 3543u); BottomFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); BufferFaceData(Dest, VertexData, (vert_t.name)_BottomFaceNormalData, Materials); From 57e2fe28b7074da0ace6a2b08d3e58e69d54229d Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 07:27:46 -0700 Subject: [PATCH 112/421] Turn terrain & world settings back down --- examples/terrain_gen/game_constants.h | 4 ++-- shaders/terrain/default.fragmentshader | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index a24ba403f..483c868d0 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -18,9 +18,9 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ -g_VisibleRegion = Chunk_Dimension(128, 128, 128); +/* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ -/* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ +g_VisibleRegion = Chunk_Dimension(32, 32, 32); /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index 431f486f6..f8b3d58df 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -334,10 +334,10 @@ void main() // -- user code -- // { - v3 Period = V3(10000.f); - float Amplitude = 2000.f; - f32 StartingZDepth = 10000.f; - s32 Octaves = 10; + v3 Period = V3(100.f); + float Amplitude = 200.f; + f32 StartingZDepth = 400.f; + s32 Octaves = 2; NoiseValue = StartingZDepth; From f47a28aad965afcd9087cacd30b495504048326d Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 09:11:49 -0700 Subject: [PATCH 113/421] Add mandlebulb terrain --- ..._work_queue_entry__bonsai_render_command.h | 59 +++++++++++++++++++ generated/freelist_allocator_world_chunk.h | 32 ++++++++++ shaders/terrain/default.fragmentshader | 48 ++++++++++++++- src/engine/api.cpp | 4 +- 4 files changed, 138 insertions(+), 5 deletions(-) create mode 100644 generated/d_union_work_queue_entry__bonsai_render_command.h create mode 100644 generated/freelist_allocator_world_chunk.h diff --git a/generated/d_union_work_queue_entry__bonsai_render_command.h b/generated/d_union_work_queue_entry__bonsai_render_command.h new file mode 100644 index 000000000..ee277292b --- /dev/null +++ b/generated/d_union_work_queue_entry__bonsai_render_command.h @@ -0,0 +1,59 @@ +// src/engine/render_command.h:165:0 + +enum work_queue_entry__bonsai_render_command_type +{ + type_work_queue_entry__bonsai_render_command_noop, + type_bonsai_render_command_initialize_noise_buffer, + type_bonsai_render_command_clear_all_framebuffers, + type_bonsai_render_command_allocate_texture, + type_bonsai_render_command_deallocate_texture, + type_bonsai_render_command_allocate_buffers, + type_bonsai_render_command_reallocate_buffers, + type_bonsai_render_command_deallocate_buffers, + type_bonsai_render_command_deallocate_world_chunk, + type_bonsai_render_command_do_stuff, + type_bonsai_render_command_allocate_and_map_gpu_element_buffer, + type_bonsai_render_command_unmap_gpu_element_buffer, + type_bonsai_render_command_unmap_and_deallocate_buffer, + type_bonsai_render_command_setup_shader, + type_bonsai_render_command_teardown_shader, + type_bonsai_render_command_set_shader_uniform, + type_bonsai_render_command_draw_world_chunk_draw_list, + type_bonsai_render_command_draw_all_entities, + type_bonsai_render_command_gl_timer_init, + type_bonsai_render_command_gl_timer_start, + type_bonsai_render_command_gl_timer_end, + type_bonsai_render_command_gl_timer_read_value_and_histogram, +}; + +struct work_queue_entry__bonsai_render_command +{ + enum work_queue_entry__bonsai_render_command_type Type; + + union + { + struct bonsai_render_command_initialize_noise_buffer bonsai_render_command_initialize_noise_buffer; + struct bonsai_render_command_clear_all_framebuffers bonsai_render_command_clear_all_framebuffers; + struct bonsai_render_command_allocate_texture bonsai_render_command_allocate_texture; + struct bonsai_render_command_deallocate_texture bonsai_render_command_deallocate_texture; + struct bonsai_render_command_allocate_buffers bonsai_render_command_allocate_buffers; + struct bonsai_render_command_reallocate_buffers bonsai_render_command_reallocate_buffers; + struct bonsai_render_command_deallocate_buffers bonsai_render_command_deallocate_buffers; + struct bonsai_render_command_deallocate_world_chunk bonsai_render_command_deallocate_world_chunk; + struct bonsai_render_command_do_stuff bonsai_render_command_do_stuff; + struct bonsai_render_command_allocate_and_map_gpu_element_buffer bonsai_render_command_allocate_and_map_gpu_element_buffer; + struct bonsai_render_command_unmap_gpu_element_buffer bonsai_render_command_unmap_gpu_element_buffer; + struct bonsai_render_command_unmap_and_deallocate_buffer bonsai_render_command_unmap_and_deallocate_buffer; + struct bonsai_render_command_setup_shader bonsai_render_command_setup_shader; + struct bonsai_render_command_teardown_shader bonsai_render_command_teardown_shader; + struct bonsai_render_command_set_shader_uniform bonsai_render_command_set_shader_uniform; + struct bonsai_render_command_draw_world_chunk_draw_list bonsai_render_command_draw_world_chunk_draw_list; + struct bonsai_render_command_draw_all_entities bonsai_render_command_draw_all_entities; + struct bonsai_render_command_gl_timer_init bonsai_render_command_gl_timer_init; + struct bonsai_render_command_gl_timer_start bonsai_render_command_gl_timer_start; + struct bonsai_render_command_gl_timer_end bonsai_render_command_gl_timer_end; + struct bonsai_render_command_gl_timer_read_value_and_histogram bonsai_render_command_gl_timer_read_value_and_histogram; + }; +}; + + diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h new file mode 100644 index 000000000..93b658a14 --- /dev/null +++ b/generated/freelist_allocator_world_chunk.h @@ -0,0 +1,32 @@ +// src/engine/world.h:41:0 + +struct world_chunk_freelist +{ + world_chunk *First; + memory_arena *Memory; +}; + +link_internal world_chunk * +GetOrAllocate(world_chunk_freelist *Freelist) +{ + world_chunk *Result = Freelist->First; + + if (Result) + { + Freelist->First = Result->Next; + } + else + { + Result = Allocate( world_chunk, Freelist->Memory, 1 ); + } + + return Result; +} + +link_internal void +Free(world_chunk_freelist *Freelist, world_chunk *Element) +{ + Element->Next = Freelist->First; + Freelist->First = Element; +} + diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index f8b3d58df..9cc271121 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -317,6 +317,46 @@ vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) return Out; } +vec4 mandlebulb(vec3 p) +{ + p.xyz = p.xzy; + vec3 z = p; + vec3 dz=vec3(0.0); + float power = 8.0; + float r, theta, phi; + float dr = 1.0; + + float t0 = 1.0; + for(int i = 0; i < 7; ++i) { + r = length(z); + if(r > 2.0) continue; + theta = atan(z.y / z.x); + #ifdef phase_shift_on + phi = asin(z.z / r) + iTime*0.1; + #else + phi = asin(z.z / r); + #endif + + dr = pow(r, power - 1.0) * dr * power + 1.0; + + r = pow(r, power); + theta = theta * power; + phi = phi * power; + + z = r * vec3(cos(theta)*cos(phi), sin(theta)*cos(phi), sin(phi)) + p; + + t0 = min(t0, r); + } + + /* f32 Thing = 0.5 * log(r) * r / dr; */ + f32 Thing = t0; + Thing = pow(clamp(Thing, 0.0, 1.0), 0.55); + vec3 tc0 = 0.5 + 0.5 * sin(3.0 + 4.2 * Thing + vec3(0.0, 0.5, 1.0)); + + vec4 Result = vec4(t0, tc0); + return Result; +} + void main() { f32 x = floor(gl_FragCoord.x); @@ -337,9 +377,9 @@ void main() v3 Period = V3(100.f); float Amplitude = 200.f; f32 StartingZDepth = 400.f; - s32 Octaves = 2; + s32 Octaves = 1; - NoiseValue = StartingZDepth; + /* NoiseValue = StartingZDepth; */ v3 deriv = v3(0.f); @@ -350,9 +390,11 @@ void main() { v3 xyz = Basis / (Period/Octave); - v4 gn = value_noise_derivs(xyz+warp); + /* v4 gn = value_noise_derivs(xyz+warp); */ /* v4 gn = gradient_noise_derivs(xyz+warp); */ /* v4 gn = voronoi_noise(xyz+warp, V3(1.f), V3(1.f)); */ + /* v4 gn = voronoi_noisedxyz+warp, V3(1.f), V3(1.f)); */ + v4 gn = mandlebulb((xyz/8.f)-1.4f)*v4(80.f, 1, 1, 1); /* v4 gn = V4(0); */ // NOTE(Jesse): yzw is not derivitives for voronoi_noise diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 33903ed25..a3b6d2f4b 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -548,7 +548,6 @@ GetOrAllocate(world_chunk_freelist *Freelist, v3i WorldP, v3i Dim, v3i DimInChun Freelist->Memory = Memory; world_chunk *Result = GetOrAllocate(Freelist); - if (Result->Voxels == 0) { AllocateWorldChunk(Result, WorldP, Dim, DimInChunks, Memory); @@ -714,7 +713,8 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ if (ChunkIsGarbage(Chunk)) { - // NOTE(Jesse): This is an optimization; the engine marks chunks that // have moved outside of the visible region as garbage. + // NOTE(Jesse): This is an optimization; the engine marks chunks that + // // have moved outside of the visible region as garbage. Chunk->Flags = Chunk_Uninitialized; } else From 7ee81d437abd1d202ea057e7bc1f009d51fb75f1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 09:20:06 -0700 Subject: [PATCH 114/421] Hack to fix gpu_mapped_element_buffer race --- ..._work_queue_entry__bonsai_render_command.h | 6 +- ..._work_queue_entry__bonsai_render_command.h | 2 +- ..._work_queue_entry__bonsai_render_command.h | 4 +- shaders/terrain/default.fragmentshader | 82 +++++++++++++++++++ src/engine/api.cpp | 4 +- src/engine/render_command.h | 6 ++ src/engine/resources.cpp | 2 + 7 files changed, 99 insertions(+), 7 deletions(-) diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index 3d1f1b12a..950a4fcbb 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:204:0 +// src/engine/render_command.h:210:0 link_internal work_queue_entry__bonsai_render_command @@ -409,10 +409,12 @@ BonsaiRenderCommandAllocateAndMapGpuElementBuffer( data_type Type , u32 Elem } link_internal bonsai_render_command_unmap_gpu_element_buffer -BonsaiRenderCommandUnmapGpuElementBuffer( gpu_mapped_element_buffer* Buf ) +BonsaiRenderCommandUnmapGpuElementBuffer( gpu_mapped_element_buffer* Buf , world_chunk* Chunk ) { bonsai_render_command_unmap_gpu_element_buffer Reuslt = { .Buf = Buf +, + .Chunk = Chunk }; diff --git a/generated/d_union_work_queue_entry__bonsai_render_command.h b/generated/d_union_work_queue_entry__bonsai_render_command.h index ee277292b..d5733bd6b 100644 --- a/generated/d_union_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:165:0 +// src/engine/render_command.h:171:0 enum work_queue_entry__bonsai_render_command_type { diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index 6b4d07477..c70666706 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -113,11 +113,11 @@ PushBonsaiRenderCommandAllocateAndMapGpuElementBuffer( link_internal void PushBonsaiRenderCommandUnmapGpuElementBuffer( work_queue *RenderQueue - , gpu_mapped_element_buffer* Buf + , gpu_mapped_element_buffer* Buf , world_chunk* Chunk ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandUnmapGpuElementBuffer( Buf ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandUnmapGpuElementBuffer( Buf , Chunk ))); PushWorkQueueEntry(RenderQueue, &Work); } diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index 9cc271121..71e93cd5f 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -357,6 +357,88 @@ vec4 mandlebulb(vec3 p) return Result; } +#define PI 3.14159265359 +#define PI_INV 0.31830988618 + +float sdSegment( in vec2 p, in vec2 a, in vec2 b ){ + vec2 pa = p-a, ba = b-a; + float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 ); + return length( pa - ba*h ); +} + +float dot2( in vec2 v ) { return dot(v,v); } + +//trapezoid SDF from IQ +float sdTrapezoid( in vec2 p, in float r1, float r2, float he ){ + p = vec2(p.y, -p.x); + vec2 k1 = vec2(r2,he); + vec2 k2 = vec2(r2-r1,2.0*he); + p.x = abs(p.x); + vec2 ca = vec2(p.x-min(p.x,(p.y<0.0)?r1:r2), abs(p.y)-he); + vec2 cb = p - k1 + k2*clamp( dot(k1-p,k2)/dot2(k2), 0.0, 1.0 ); + float s = (cb.x<0.0 && ca.y<0.0) ? -1.0 : 1.0; + return s*sqrt( min(dot2(ca),dot2(cb)) ); +} + +float brick_size(float id, float n, float r){ + return (cos(mod(round(id)+.4, 2.)*PI)*.5+.5)*.5*r; +} + +float sdBrickCircle(vec2 p, float r, float n, float padding, float rotation){ + + float inv_n = 1./n; + rotation *= n; + + vec2 point = normalize(p); + float angle = atan(point.y, point.x); // angle from the x axis + float neighbor = 0.; + + //quantization of the normal's angle. you must normalize the angle before doing quantization + angle *= n*PI_INV; + + angle += rotation; + + angle = floor(angle); + + vec2 ids = vec2(angle); + + angle -= rotation; + + ids.y += 1.; + + neighbor = angle + 1.; + + angle *= inv_n; + angle *= PI; + neighbor *=PI*inv_n; + + //recunstructing the normals + vec2 right = vec2(cos(angle), sin(angle)); + vec2 left = vec2(cos(neighbor), sin(neighbor)); + + vec2 sizes = vec2(brick_size(ids.x, n, r), brick_size(ids.y, n, r)); + + //note : you can make the brick size not depend on the radius by removing r here + vec4 radii = vec4((1.-cos(inv_n*PI))/sin(inv_n*PI)); + radii *= r + vec4(sizes.x, -sizes.x, sizes.y, -sizes.y); + radii-=padding; + + vec3 brick0 = vec3(sizes.x, radii.x, radii.y); + vec3 brick1 = vec3(sizes.y, radii.z, radii.w); + + vec2 p_right = vec2(p.x*right.x + p.y*right.y, p.x*right.y - p.y*right.x); + p_right.x-=r; + + float d = sdTrapezoid(p_right, brick0.y, brick0.z, brick0.x); + + vec2 p_left = vec2(p.x*left.x + p.y*left.y, p.x*left.y - p.y*left.x); + p_left.x-=r; + + d = min(d, sdTrapezoid(p_left, brick1.y, brick1.z, brick1.x)); + + return d; +} + void main() { f32 x = floor(gl_FragCoord.x); diff --git a/src/engine/api.cpp b/src/engine/api.cpp index a3b6d2f4b..9c4cd783f 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -690,7 +690,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ DestChunk->DEBUG_OwnedByThread = 0; - PushBonsaiRenderCommandUnmapGpuElementBuffer(RenderQ, &DestChunk->Mesh); + PushBonsaiRenderCommandUnmapGpuElementBuffer(RenderQ, &DestChunk->Mesh, DestChunk); // TODO(Jesse)(bug, race): There's a race here; the chunk can get deallocated on the // main thread and clear the Mesh before the Unmap job happens. Have to somehow @@ -698,7 +698,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ // // nopush - FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*, DestChunk))); + /* FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*, DestChunk))); */ } break; { tmatch(work_queue_entry_rebuild_mesh, Entry, Job) diff --git a/src/engine/render_command.h b/src/engine/render_command.h index 12f858295..a0e78e73b 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -153,6 +153,12 @@ struct bonsai_render_command_allocate_and_map_gpu_element_buffer struct bonsai_render_command_unmap_gpu_element_buffer { gpu_mapped_element_buffer *Buf; + + // TODO(Jesse): This is a crutch for not being able to define the next job + // remove. + // + // nopush + world_chunk *Chunk; }; struct bonsai_render_command_unmap_and_deallocate_buffer diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 31eab77f3..36e159a83 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -119,6 +119,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { tmatch(bonsai_render_command_unmap_gpu_element_buffer, RC, Command) TIMED_NAMED_BLOCK(bonsai_render_command_unmap_gpu_element_buffer); FlushBuffersToCard(Command->Buf); + + FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*, Command->Chunk))); } break; { tmatch(bonsai_render_command_unmap_and_deallocate_buffer, RC, Command) From b18d8ab11512adde213594b4b43c0ebb3eb99b6a Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 09:21:14 -0700 Subject: [PATCH 115/421] Remove archway shader code --- shaders/terrain/default.fragmentshader | 81 -------------------------- 1 file changed, 81 deletions(-) diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index 71e93cd5f..0876813c8 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -357,87 +357,6 @@ vec4 mandlebulb(vec3 p) return Result; } -#define PI 3.14159265359 -#define PI_INV 0.31830988618 - -float sdSegment( in vec2 p, in vec2 a, in vec2 b ){ - vec2 pa = p-a, ba = b-a; - float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 ); - return length( pa - ba*h ); -} - -float dot2( in vec2 v ) { return dot(v,v); } - -//trapezoid SDF from IQ -float sdTrapezoid( in vec2 p, in float r1, float r2, float he ){ - p = vec2(p.y, -p.x); - vec2 k1 = vec2(r2,he); - vec2 k2 = vec2(r2-r1,2.0*he); - p.x = abs(p.x); - vec2 ca = vec2(p.x-min(p.x,(p.y<0.0)?r1:r2), abs(p.y)-he); - vec2 cb = p - k1 + k2*clamp( dot(k1-p,k2)/dot2(k2), 0.0, 1.0 ); - float s = (cb.x<0.0 && ca.y<0.0) ? -1.0 : 1.0; - return s*sqrt( min(dot2(ca),dot2(cb)) ); -} - -float brick_size(float id, float n, float r){ - return (cos(mod(round(id)+.4, 2.)*PI)*.5+.5)*.5*r; -} - -float sdBrickCircle(vec2 p, float r, float n, float padding, float rotation){ - - float inv_n = 1./n; - rotation *= n; - - vec2 point = normalize(p); - float angle = atan(point.y, point.x); // angle from the x axis - float neighbor = 0.; - - //quantization of the normal's angle. you must normalize the angle before doing quantization - angle *= n*PI_INV; - - angle += rotation; - - angle = floor(angle); - - vec2 ids = vec2(angle); - - angle -= rotation; - - ids.y += 1.; - - neighbor = angle + 1.; - - angle *= inv_n; - angle *= PI; - neighbor *=PI*inv_n; - - //recunstructing the normals - vec2 right = vec2(cos(angle), sin(angle)); - vec2 left = vec2(cos(neighbor), sin(neighbor)); - - vec2 sizes = vec2(brick_size(ids.x, n, r), brick_size(ids.y, n, r)); - - //note : you can make the brick size not depend on the radius by removing r here - vec4 radii = vec4((1.-cos(inv_n*PI))/sin(inv_n*PI)); - radii *= r + vec4(sizes.x, -sizes.x, sizes.y, -sizes.y); - radii-=padding; - - vec3 brick0 = vec3(sizes.x, radii.x, radii.y); - vec3 brick1 = vec3(sizes.y, radii.z, radii.w); - - vec2 p_right = vec2(p.x*right.x + p.y*right.y, p.x*right.y - p.y*right.x); - p_right.x-=r; - - float d = sdTrapezoid(p_right, brick0.y, brick0.z, brick0.x); - - vec2 p_left = vec2(p.x*left.x + p.y*left.y, p.x*left.y - p.y*left.x); - p_left.x-=r; - - d = min(d, sdTrapezoid(p_left, brick1.y, brick1.z, brick1.x)); - - return d; -} void main() { From 1916fa9134789475f347c8ccd04f3cc4fc4ddb29 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 09:25:16 -0700 Subject: [PATCH 116/421] Change back to value_noise_derivs for default terrain --- shaders/terrain/default.fragmentshader | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index 0876813c8..fbb1e7fb1 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -380,7 +380,7 @@ void main() f32 StartingZDepth = 400.f; s32 Octaves = 1; - /* NoiseValue = StartingZDepth; */ + NoiseValue = StartingZDepth; v3 deriv = v3(0.f); @@ -391,11 +391,11 @@ void main() { v3 xyz = Basis / (Period/Octave); - /* v4 gn = value_noise_derivs(xyz+warp); */ + v4 gn = value_noise_derivs(xyz+warp); /* v4 gn = gradient_noise_derivs(xyz+warp); */ /* v4 gn = voronoi_noise(xyz+warp, V3(1.f), V3(1.f)); */ /* v4 gn = voronoi_noisedxyz+warp, V3(1.f), V3(1.f)); */ - v4 gn = mandlebulb((xyz/8.f)-1.4f)*v4(80.f, 1, 1, 1); + /* v4 gn = mandlebulb((xyz/8.f)-1.4f)*v4(80.f, 1, 1, 1); */ /* v4 gn = V4(0); */ // NOTE(Jesse): yzw is not derivitives for voronoi_noise From 427e9d7c8758aa9c4aea3204f3849598073ccca8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 10:28:26 -0700 Subject: [PATCH 117/421] Change to 15-bit RGB in shader --- generated/gen_map_value_to_range_r32.h | 2 +- generated/gen_map_value_to_range_s32.h | 2 +- generated/gen_map_value_to_range_u32.h | 2 +- generated/gen_random_between_r32.h | 2 +- generated/gen_random_between_s32.h | 2 +- generated/gen_random_between_u32.h | 2 +- shaders/terrain/default.fragmentshader | 69 +++----------------------- src/engine/terrain.cpp | 11 ++++ 8 files changed, 25 insertions(+), 67 deletions(-) diff --git a/generated/gen_map_value_to_range_r32.h b/generated/gen_map_value_to_range_r32.h index e0c0ecf02..3ad870836 100644 --- a/generated/gen_map_value_to_range_r32.h +++ b/generated/gen_map_value_to_range_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/random.h:206:0 +// external/bonsai_stdlib/src/random.h:203:0 link_internal r32 MapValueToRange( r32 LowestPossibleValue, r32 Value, r32 HighestPossibleValue) diff --git a/generated/gen_map_value_to_range_s32.h b/generated/gen_map_value_to_range_s32.h index 1b38bd827..4f1f0a57a 100644 --- a/generated/gen_map_value_to_range_s32.h +++ b/generated/gen_map_value_to_range_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/random.h:212:0 +// external/bonsai_stdlib/src/random.h:209:0 link_internal s32 MapValueToRange( s32 LowestPossibleValue, r32 Value, s32 HighestPossibleValue) diff --git a/generated/gen_map_value_to_range_u32.h b/generated/gen_map_value_to_range_u32.h index 9a1f82bd9..58d1a8629 100644 --- a/generated/gen_map_value_to_range_u32.h +++ b/generated/gen_map_value_to_range_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/random.h:209:0 +// external/bonsai_stdlib/src/random.h:206:0 link_internal u32 MapValueToRange( u32 LowestPossibleValue, r32 Value, u32 HighestPossibleValue) diff --git a/generated/gen_random_between_r32.h b/generated/gen_random_between_r32.h index 398846e6f..19fe39b41 100644 --- a/generated/gen_random_between_r32.h +++ b/generated/gen_random_between_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/random.h:232:0 +// external/bonsai_stdlib/src/random.h:229:0 link_internal r32 RandomBetween( r32 LowestPossibleValue, random_series *Entropy, r32 HighestPossibleValue) diff --git a/generated/gen_random_between_s32.h b/generated/gen_random_between_s32.h index 66e282100..07badf979 100644 --- a/generated/gen_random_between_s32.h +++ b/generated/gen_random_between_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/random.h:238:0 +// external/bonsai_stdlib/src/random.h:235:0 link_internal s32 RandomBetween( s32 LowestPossibleValue, random_series *Entropy, s32 HighestPossibleValue) diff --git a/generated/gen_random_between_u32.h b/generated/gen_random_between_u32.h index 64826212a..899933b0b 100644 --- a/generated/gen_random_between_u32.h +++ b/generated/gen_random_between_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/random.h:235:0 +// external/bonsai_stdlib/src/random.h:232:0 link_internal u32 RandomBetween( u32 LowestPossibleValue, random_series *Entropy, u32 HighestPossibleValue) diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index fbb1e7fb1..3accc1ca7 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -5,70 +5,17 @@ in vec2 UV; out uint Output; /* layout (location = 0) out float Output; */ - -uint PackHSVColor(v3 Color) +uint PackRGB(v3 Color) { - uint FiveBits = (1u << 6) - 1u; - uint FifteenBits = (1u << 15) - 1u; - uint H = uint(Color.r * f32(FiveBits)); - uint S = uint(Color.g * r32(FiveBits)); - uint V = uint(Color.b * r32(FiveBits)); - uint Result = uint((H << 10) | (S << 5) | V) & FifteenBits; + uint FiveBits = (1u << 5) - 1u; + uint FifteenBits = (1u << 15) - 1u; + uint R = uint(Color.r * f32(FiveBits)) & FiveBits; + uint G = uint(Color.g * r32(FiveBits)) & FiveBits; + uint B = uint(Color.b * r32(FiveBits)) & FiveBits; + uint Result = uint((R << 10) | (G << 5) | B) & FifteenBits; return Result; } -v3 RGBtoHSV(v3 Color) -{ - f32 r = Color.r; - f32 g = Color.g; - f32 b = Color.b; - - f32 h, s, v; // h:0-360.0, s:0.0-1.0, v:0.0-1.0 - - f32 maxv = max(r, max(g, b)); - f32 minv = min(r, min(g, b)); - - v = maxv; - - if (maxv == 0.0f) - { - s = 0; - h = 0; - } - else if (maxv - minv == 0.0f) - { - s = 0; - h = 0; - } - else { - s = (maxv - minv) / maxv; - - if (maxv == r) { - h = 60 * ((g - b) / (maxv - minv)) + 0; - } - else if (maxv == g) { - h = 60 * ((b - r) / (maxv - minv)) + 120; - } - else { - h = 60 * ((r - g) / (maxv - minv)) + 240; - } - } - - if (h < 0) h += 360.0f; - - h = (h / 360.f); - - v3 result = V3(h,s,v); - return result; -} - -uint RGBtoPackedHSV(v3 Color) -{ - v3 HSV = RGBtoHSV(Color); - uint Packed = PackHSVColor(HSV); - /* int Packed= 0; */ - return Packed; -} @@ -417,7 +364,7 @@ void main() // uint SolidBit = NoiseValue > 0.f ? 1u : 0u; - uint PackedColor = RGBtoPackedHSV(ColorValue); + uint PackedColor = PackRGB(ColorValue); /* uint PackedColor = 3543u; */ Output = (SolidBit << 15) | PackedColor; diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 8d3796b1c..7991e318d 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -28,6 +28,17 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No u16 NoiseColor = ThisNoiseV & ((1 << 15) -1); + u32 FiveBits = (1<<5)-1; + u32 R = (ThisNoiseV >> 10) & FiveBits; + u32 G = (ThisNoiseV >> 5) & FiveBits; + u32 B = (ThisNoiseV >> 0) & FiveBits; + + NoiseColor = RGBtoPackedHSV(V3( + f32(R)/f32(FiveBits), + f32(G)/f32(FiveBits), + f32(B)/f32(FiveBits) + )); + Assert(xChunk < 64); Mask |= (NoiseChoice << xChunk); From 21a7829352c3c7681dbe398d129e154cad5f9f72 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 12:13:13 -0700 Subject: [PATCH 118/421] Tweak mandlebulb --- shaders/terrain/default.fragmentshader | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index 3accc1ca7..c5197851e 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -267,11 +267,12 @@ vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) vec4 mandlebulb(vec3 p) { p.xyz = p.xzy; + /* p.xyz = p.xyz; */ vec3 z = p; vec3 dz=vec3(0.0); - float power = 8.0; + float power = 6.; float r, theta, phi; - float dr = 1.0; + float dr = 1.2; float t0 = 1.0; for(int i = 0; i < 7; ++i) { @@ -331,18 +332,17 @@ void main() v3 deriv = v3(0.f); - /* f32 warp = gradient_noise(Basis*2)*5.2f; */ + /* f32 warp = gradient_noise(Basis*1.001); */ f32 warp = 0.f; for (s32 Octave = 1; Octave <= Octaves; ++Octave) { v3 xyz = Basis / (Period/Octave); - v4 gn = value_noise_derivs(xyz+warp); + /* v4 gn = value_noise_derivs(xyz+warp); */ /* v4 gn = gradient_noise_derivs(xyz+warp); */ /* v4 gn = voronoi_noise(xyz+warp, V3(1.f), V3(1.f)); */ - /* v4 gn = voronoi_noisedxyz+warp, V3(1.f), V3(1.f)); */ - /* v4 gn = mandlebulb((xyz/8.f)-1.4f)*v4(80.f, 1, 1, 1); */ + v4 gn = mandlebulb((xyz/8.f)-1.4f)*v4(100.f, 1, 3, 18); /* v4 gn = V4(0); */ // NOTE(Jesse): yzw is not derivitives for voronoi_noise From 49ccf32b415e703329fc4c671b455a7ba361ed0b Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 12:48:42 -0700 Subject: [PATCH 119/421] Add ability to load additional terrain shaders --- examples/terrain_gen/game.cpp | 32 +++++++++++---- shaders/terrain/default.fragmentshader | 57 +------------------------- src/engine/api.cpp | 4 ++ 3 files changed, 30 insertions(+), 63 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 99e61b09e..a63e06554 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -816,15 +816,33 @@ BONSAI_API_MAIN_THREAD_CALLBACK() global_variable window_layout Window = WindowLayout("Terrain Gen", WindowLayoutFlag_Align_Right); PushWindowStart(Ui, &Window); - ui_toggle_button_group TerrainGenTypeRadio = RadioButtonGroup_terrain_gen_type(Ui, &Window, CSz("Terrain Generators"), &GameState->TerrainGenType, &DefaultUiRenderParams_Generic, ToggleButtonGroupFlags_DrawVertical); + file_traversal_node_block_array Files = GetLexicographicallySortedListOfFilesInDirectory(CSz("shaders/terrain"), GetTranArena()); + + u32 I = 0; + IterateOver(&Files, FileNode, FileNodeIndex) + { + if (FileNode->Type == FileTraversalType_File) + { + if (Button(Ui, FileNode->Name, UiId(&Window, "shader file name", I++))) + { + // Force engine to reload new shader + Resources->Graphics.GpuNoise.TerrainShader.Program.FragSourceFilename = Concat(FileNode->Dir, CSz("/"), FileNode->Name, GetTranArena()); + Resources->Graphics.GpuNoise.TerrainShader.Program.FragmentTimeModifiedWhenLoaded = 0; + } + PushNewRow(Ui); + } + + } + + /* ui_toggle_button_group TerrainGenTypeRadio = RadioButtonGroup_terrain_gen_type(Ui, &Window, CSz("Terrain Generators"), &GameState->TerrainGenType, &DefaultUiRenderParams_Generic, ToggleButtonGroupFlags_DrawVertical); */ PushWindowEnd(Ui, &Window); /* Info("%S :: %d", ToString(GameState->TerrainGenType), GameState->TerrainGenType); */ - if (TerrainGenTypeRadio.AnyElementClicked) - { - SignalAndWaitForWorkers(&Plat->WorkerThreadsSuspendFutex); - SoftResetEngine(Resources, HardResetFlag_NoResetCamera); - UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); - } + /* if (TerrainGenTypeRadio.AnyElementClicked) */ + /* { */ + /* SignalAndWaitForWorkers(&Plat->WorkerThreadsSuspendFutex); */ + /* SoftResetEngine(Resources, HardResetFlag_NoResetCamera); */ + /* UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); */ + /* } */ } diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index c5197851e..e1b9ee3bb 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -5,19 +5,6 @@ in vec2 UV; out uint Output; /* layout (location = 0) out float Output; */ -uint PackRGB(v3 Color) -{ - uint FiveBits = (1u << 5) - 1u; - uint FifteenBits = (1u << 15) - 1u; - uint R = uint(Color.r * f32(FiveBits)) & FiveBits; - uint G = uint(Color.g * r32(FiveBits)) & FiveBits; - uint B = uint(Color.b * r32(FiveBits)) & FiveBits; - uint Result = uint((R << 10) | (G << 5) | B) & FifteenBits; - return Result; -} - - - // https://www.shadertoy.com/view/4dffRH // @@ -264,47 +251,6 @@ vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) return Out; } -vec4 mandlebulb(vec3 p) -{ - p.xyz = p.xzy; - /* p.xyz = p.xyz; */ - vec3 z = p; - vec3 dz=vec3(0.0); - float power = 6.; - float r, theta, phi; - float dr = 1.2; - - float t0 = 1.0; - for(int i = 0; i < 7; ++i) { - r = length(z); - if(r > 2.0) continue; - theta = atan(z.y / z.x); - #ifdef phase_shift_on - phi = asin(z.z / r) + iTime*0.1; - #else - phi = asin(z.z / r); - #endif - - dr = pow(r, power - 1.0) * dr * power + 1.0; - - r = pow(r, power); - theta = theta * power; - phi = phi * power; - - z = r * vec3(cos(theta)*cos(phi), sin(theta)*cos(phi), sin(phi)) + p; - - t0 = min(t0, r); - } - - /* f32 Thing = 0.5 * log(r) * r / dr; */ - f32 Thing = t0; - Thing = pow(clamp(Thing, 0.0, 1.0), 0.55); - vec3 tc0 = 0.5 + 0.5 * sin(3.0 + 4.2 * Thing + vec3(0.0, 0.5, 1.0)); - - vec4 Result = vec4(t0, tc0); - return Result; -} - void main() { @@ -339,10 +285,9 @@ void main() { v3 xyz = Basis / (Period/Octave); - /* v4 gn = value_noise_derivs(xyz+warp); */ + v4 gn = value_noise_derivs(xyz+warp); /* v4 gn = gradient_noise_derivs(xyz+warp); */ /* v4 gn = voronoi_noise(xyz+warp, V3(1.f), V3(1.f)); */ - v4 gn = mandlebulb((xyz/8.f)-1.4f)*v4(100.f, 1, 3, 18); /* v4 gn = V4(0); */ // NOTE(Jesse): yzw is not derivitives for voronoi_noise diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 9c4cd783f..01f8c6f83 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -89,7 +89,11 @@ Bonsai_FrameBegin(engine_resources *Resources) if (Resources->Graphics.GpuNoise.TerrainShader.Program.HotReloaded) { + auto Plat = &Resources->Stdlib.Plat; + SignalAndWaitForWorkers(&Plat->WorkerThreadsSuspendFutex); + CancelAllWorkQueueJobs(Resources); SoftResetWorld(Resources); + UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); } MaintainWorldOctree(Resources); From 7aaf40b7ea460899763a89beaf4789ef6e17ba6a Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 12:58:36 -0700 Subject: [PATCH 120/421] Add make script for dottedboxguy --- dottedboxguy.make.sh | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 dottedboxguy.make.sh diff --git a/dottedboxguy.make.sh b/dottedboxguy.make.sh new file mode 100644 index 000000000..788fbabf0 --- /dev/null +++ b/dottedboxguy.make.sh @@ -0,0 +1,7 @@ +#! /usr/bin/env bash + +OPT="-O2" + +./make.sh $OPT \ + BuildSingleExample examples/terrain_gen \ + BuildExecutables \ From e0a1aa4196a21c84e347a7661d28b1464cc6f0be Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 13:00:17 -0700 Subject: [PATCH 121/421] Push new shaders --- .../terrain/dottedboxguy_arch.fragmentshader | 131 ++++++ shaders/terrain/gradient.fragmentshader | 190 +++++++++ shaders/terrain/mandlebulb.fragmentshader | 88 ++++ shaders/terrain/voronoi.fragmentshader | 388 ++++++++++++++++++ 4 files changed, 797 insertions(+) create mode 100644 shaders/terrain/dottedboxguy_arch.fragmentshader create mode 100644 shaders/terrain/gradient.fragmentshader create mode 100644 shaders/terrain/mandlebulb.fragmentshader create mode 100644 shaders/terrain/voronoi.fragmentshader diff --git a/shaders/terrain/dottedboxguy_arch.fragmentshader b/shaders/terrain/dottedboxguy_arch.fragmentshader new file mode 100644 index 000000000..de02f2633 --- /dev/null +++ b/shaders/terrain/dottedboxguy_arch.fragmentshader @@ -0,0 +1,131 @@ +uniform v3 WorldspaceBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out uint Output; + +#define PI 3.14159265359 +#define PI_INV 0.31830988618 + +float sstep(float init_x){ + float x = clamp(init_x,-1.,1.); + x = abs(x); + return sign(init_x)*(x*(2.-x)); +} + +float dot2( in vec2 v ) { return dot(v,v); } + +//trapezoid SDF from IQ +float sdTrapezoid( in vec2 p, in float r1, float r2, float he ){ + p = vec2(p.y, -p.x); + vec2 k1 = vec2(r2,he); + vec2 k2 = vec2(r2-r1,2.0*he); + p.x = abs(p.x); + vec2 ca = vec2(p.x-min(p.x,(p.y<0.0)?r1:r2), abs(p.y)-he); + vec2 cb = p - k1 + k2*clamp( dot(k1-p,k2)/dot2(k2), 0.0, 1.0 ); + float s = (cb.x<0.0 && ca.y<0.0) ? -1.0 : 1.0; + return s*sqrt( min(dot2(ca),dot2(cb)) ); +} + +float brick_size(float id, float n, float r){ + return (cos(mod(round(id)+.4, 2.)*PI)*.5+.5)*.5*r; +} + +float sdBrickCircle(vec2 p, float r, float n, float padding, float rotation){ + + float inv_n = 1./n; + rotation *= n; + + vec2 point = normalize(p); + float angle = atan(point.y, point.x); // angle from the x axis + float neighbor = 0.; + + //quantization of the normal's angle. you must normalize the angle before doing quantization + angle *= n*PI_INV; + + angle += rotation; + + angle = floor(angle); + + vec2 ids = vec2(angle); + + angle -= rotation; + + ids.y += 1.; + + neighbor = angle + 1.; + + angle *= inv_n; + angle *= PI; + neighbor *=PI*inv_n; + + //recunstructing the normals + vec2 right = vec2(cos(angle), sin(angle)); + vec2 left = vec2(cos(neighbor), sin(neighbor)); + + vec2 sizes = vec2(brick_size(ids.x, n, r), brick_size(ids.y, n, r)); + + //note : you can make the brick size not depend on the radius by removing r here + vec4 radii = vec4((1.-cos(inv_n*PI))/sin(inv_n*PI)); + radii *= r + vec4(sizes.x, -sizes.x, sizes.y, -sizes.y); + radii-=padding; + + vec3 brick0 = vec3(sizes.x, radii.x, radii.y); + vec3 brick1 = vec3(sizes.y, radii.z, radii.w); + + vec2 p_right = vec2(p.x*right.x + p.y*right.y, p.x*right.y - p.y*right.x); + p_right.x-=r; + + float d = sdTrapezoid(p_right, brick0.y, brick0.z, brick0.x); + + vec2 p_left = vec2(p.x*left.x + p.y*left.y, p.x*left.y - p.y*left.x); + p_left.x-=r; + + d = min(d, sdTrapezoid(p_left, brick1.y, brick1.z, brick1.x)); + + return d; +} + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); + + v3 Offset = V3(-1, -1, -1); + v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + Basis *=.0001; + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + + f32 d = sdBrickCircle(vec2(x,z), 20., 10., 0., 0.); + + vec3 col = (d>0.0) ? vec3(0.9,0.6,0.3) : vec3(0.65,0.85,1.0); + col *= 1.0 - exp(-4.0*abs(d)); + col *= 0.8 + 0.2*cos(80.0*d); + col = mix( col, vec3(1.0), 1.0-smoothstep(0.0,0.03,abs(d))); + + vec2 w = vec2( d, abs(y-8.) - 4. ); + d = min(max(w.x,w.y),0.0) + length(max(w,0.0)); + + ColorValue = col; + + NoiseValue = d ; + } + + // + // -- end user code -- + // + + uint SolidBit = NoiseValue > 0.0f ? 1u : 0u; + uint PackedColor = PackRGB(ColorValue); + + Output = (SolidBit << 15) | PackedColor; +} diff --git a/shaders/terrain/gradient.fragmentshader b/shaders/terrain/gradient.fragmentshader new file mode 100644 index 000000000..b79380848 --- /dev/null +++ b/shaders/terrain/gradient.fragmentshader @@ -0,0 +1,190 @@ +uniform v3 WorldspaceBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out uint Output; +/* layout (location = 0) out float Output; */ + + +// https://www.shadertoy.com/view/4dffRH +// +// +// +// The MIT License +// Copyright © 2017 Inigo Quilez +// 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. +// +// https://www.youtube.com/c/InigoQuilez +// https://iquilezles.org/ + +// Computes the analytic derivatives of a 3D Gradient Noise. This can be used for example to compute normals to a +// 3d rocks based on Gradient Noise without approximating the gradient by having to take central differences. +// +// More info here: https://iquilezles.org/articles/gradientnoise + +// All noise functions here: +// +// https://www.shadertoy.com/playlist/fXlXzf&from=0&num=12 + + +// 0: integer hash +// 1: float hash (aliasing based) +#define METHOD 1 + +// 0: cubic +// 1: quintic +#define INTERPOLANT 1 + + +#if METHOD==0 +vec3 hash( ivec3 p ) // this hash is not production ready, please +{ // replace this by something better + ivec3 n = ivec3( p.x*127 + p.y*311 + p.z*74, + p.x*269 + p.y*183 + p.z*246, + p.x*113 + p.y*271 + p.z*124); + + // 1D hash by Hugo Elias + n = (n << 13) ^ n; + n = n * (n * n * 15731 + 789221) + 1376312589; + return -1.0+2.0*vec3( n & ivec3(0x0fffffff))/float(0x0fffffff); +} + +#else +vec3 hash( vec3 p ) // this hash is not production ready, please +{ // replace this by something better + p = vec3( dot(p,vec3(127.1,311.7, 74.7)), + dot(p,vec3(269.5,183.3,246.1)), + dot(p,vec3(113.5,271.9,124.6))); + + return -1.0 + 2.0*fract(sin(p)*43758.5453123); +} +#endif + +// return value noise (in x) and its derivatives (in yzw) +// +vec4 gradient_noise_derivs( in vec3 x ) +{ + // grid + #if METHOD==0 + ivec3 i = ivec3(floor(x)); + #else + vec3 i = floor(x); + #endif + vec3 f = fract(x); + + #if INTERPOLANT==1 + // quintic interpolant + vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); + vec3 du = 30.0*f*f*(f*(f-2.0)+1.0); + #else + // cubic interpolant + vec3 u = f*f*(3.0-2.0*f); + vec3 du = 6.0*f*(1.0-f); + #endif + + // gradients + #if METHOD==0 + vec3 ga = hash( i+ivec3(0,0,0) ); + vec3 gb = hash( i+ivec3(1,0,0) ); + vec3 gc = hash( i+ivec3(0,1,0) ); + vec3 gd = hash( i+ivec3(1,1,0) ); + vec3 ge = hash( i+ivec3(0,0,1) ); + vec3 gf = hash( i+ivec3(1,0,1) ); + vec3 gg = hash( i+ivec3(0,1,1) ); + vec3 gh = hash( i+ivec3(1,1,1) ); + #else + vec3 ga = hash( i+vec3(0.0,0.0,0.0) ); + vec3 gb = hash( i+vec3(1.0,0.0,0.0) ); + vec3 gc = hash( i+vec3(0.0,1.0,0.0) ); + vec3 gd = hash( i+vec3(1.0,1.0,0.0) ); + vec3 ge = hash( i+vec3(0.0,0.0,1.0) ); + vec3 gf = hash( i+vec3(1.0,0.0,1.0) ); + vec3 gg = hash( i+vec3(0.0,1.0,1.0) ); + vec3 gh = hash( i+vec3(1.0,1.0,1.0) ); + #endif + + // projections + float va = dot( ga, f-vec3(0.0,0.0,0.0) ); + float vb = dot( gb, f-vec3(1.0,0.0,0.0) ); + float vc = dot( gc, f-vec3(0.0,1.0,0.0) ); + float vd = dot( gd, f-vec3(1.0,1.0,0.0) ); + float ve = dot( ge, f-vec3(0.0,0.0,1.0) ); + float vf = dot( gf, f-vec3(1.0,0.0,1.0) ); + float vg = dot( gg, f-vec3(0.0,1.0,1.0) ); + float vh = dot( gh, f-vec3(1.0,1.0,1.0) ); + + // interpolations + return vec4( va + u.x*(vb-va) + u.y*(vc-va) + u.z*(ve-va) + u.x*u.y*(va-vb-vc+vd) + u.y*u.z*(va-vc-ve+vg) + u.z*u.x*(va-vb-ve+vf) + (-va+vb+vc-vd+ve-vf-vg+vh)*u.x*u.y*u.z, // value + ga + u.x*(gb-ga) + u.y*(gc-ga) + u.z*(ge-ga) + u.x*u.y*(ga-gb-gc+gd) + u.y*u.z*(ga-gc-ge+gg) + u.z*u.x*(ga-gb-ge+gf) + (-ga+gb+gc-gd+ge-gf-gg+gh)*u.x*u.y*u.z + // derivatives + du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); +} + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); + + v3 Offset = V3(-1, -1, -1); + v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + v3 Period = V3(100.f); + float Amplitude = 200.f; + f32 StartingZDepth = 400.f; + s32 Octaves = 1; + + NoiseValue = StartingZDepth; + + v3 deriv = v3(0.f); + /* f32 warp = gradient_noise(Basis*1.001); */ + f32 warp = 0.f; + + for (s32 Octave = 1; Octave <= Octaves; ++Octave) + { + v3 xyz = Basis / (Period/Octave); + + v4 gn = gradient_noise_derivs(xyz+warp); + deriv += gn.yzw; + + NoiseValue = NoiseValue + (gn.x * (Amplitude/Octave)); + } + + deriv = normalize(deriv); + ColorValue = abs(deriv); + + // Bias noise value to lower values as we get higher in z. + // This creates a "plane" of terrain + NoiseValue = NoiseValue - Basis.z; + } + + // + // -- end user code -- + // + + uint SolidBit = NoiseValue > 0.f ? 1u : 0u; + uint PackedColor = PackRGB(ColorValue); + /* uint PackedColor = 3543u; */ + + Output = (SolidBit << 15) | PackedColor; +} diff --git a/shaders/terrain/mandlebulb.fragmentshader b/shaders/terrain/mandlebulb.fragmentshader new file mode 100644 index 000000000..a166b3e76 --- /dev/null +++ b/shaders/terrain/mandlebulb.fragmentshader @@ -0,0 +1,88 @@ +uniform v3 WorldspaceBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out uint Output; + +vec4 mandlebulb(vec3 p) +{ + p.xyz = p.xzy; + vec3 z = p; + vec3 dz=vec3(0.0); + float power = 6.; + float r, theta, phi; + float dr = 1.2; + + float t0 = 1.0; + for(int i = 0; i < 7; ++i) { + r = length(z); + if(r > 2.0) continue; + theta = atan(z.y / z.x); + #ifdef phase_shift_on + phi = asin(z.z / r) + iTime*0.1; + #else + phi = asin(z.z / r); + #endif + + dr = pow(r, power - 1.0) * dr * power + 1.0; + + r = pow(r, power); + theta = theta * power; + phi = phi * power; + + z = r * vec3(cos(theta)*cos(phi), sin(theta)*cos(phi), sin(phi)) + p; + + t0 = min(t0, r); + } + + f32 Thing = t0; + Thing = pow(clamp(Thing, 0.0, 1.0), 0.55); + vec3 tc0 = 0.5 + 0.5 * sin(3.0 + 4.2 * Thing + vec3(0.0, 0.5, 1.0)); + + vec4 Result = vec4(t0, tc0); + return Result; +} + + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); + + v3 Offset = V3(-1, -1, -1); + v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + + { + v3 Period = V3(100.f); + float Amplitude = 200.f; + f32 StartingZDepth = 400.f; + s32 Octaves = 1; + + NoiseValue = StartingZDepth; + + v3 xyz = Basis / (Period); + v4 gn = mandlebulb((xyz/8.f)-1.4f)*v4(100.f, 1, 3, 18); + ColorValue += abs(normalize(gn.yzw)); + + NoiseValue = NoiseValue + (gn.x * (Amplitude)); + NoiseValue = NoiseValue - Basis.z; + } + + // + // -- end user code -- + // + + uint SolidBit = NoiseValue > 0.f ? 1u : 0u; + uint PackedColor = PackRGB(ColorValue); + + Output = (SolidBit << 15) | PackedColor; +} diff --git a/shaders/terrain/voronoi.fragmentshader b/shaders/terrain/voronoi.fragmentshader new file mode 100644 index 000000000..d465c3d36 --- /dev/null +++ b/shaders/terrain/voronoi.fragmentshader @@ -0,0 +1,388 @@ +uniform v3 WorldspaceBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out uint Output; + + + +uint RGBtoPackedHSV(v3 Color) +{ + v3 HSV = RGBtoHSV(Color); + uint Packed = PackHSVColor(HSV); + /* int Packed= 0; */ + return Packed; +} + + + +// https://www.shadertoy.com/view/4dffRH +// +// +// +// The MIT License +// Copyright 2017 Inigo Quilez +// 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. +// +// https://www.youtube.com/c/InigoQuilez +// https://iquilezles.org/ + +// Computes the analytic derivatives of a 3D Gradient Noise. This can be used for example to compute normals to a +// 3d rocks based on Gradient Noise without approximating the gradient by having to take central differences. +// +// More info here: https://iquilezles.org/articles/gradientnoise + +// All noise functions here: +// +// https://www.shadertoy.com/playlist/fXlXzf&from=0&num=12 + + +// 0: integer hash +// 1: float hash (aliasing based) +#define METHOD 1 + +// 0: cubic +// 1: quintic +#define INTERPOLANT 1 + + +#if METHOD==0 +vec3 hash( ivec3 p ) // this hash is not production ready, please +{ // replace this by something better + ivec3 n = ivec3( p.x*127 + p.y*311 + p.z*74, + p.x*269 + p.y*183 + p.z*246, + p.x*113 + p.y*271 + p.z*124); + + // 1D hash by Hugo Elias + n = (n << 13) ^ n; + n = n * (n * n * 15731 + 789221) + 1376312589; + return -1.0+2.0*vec3( n & ivec3(0x0fffffff))/float(0x0fffffff); +} + +#else +vec3 hash( vec3 p ) // this hash is not production ready, please +{ // replace this by something better + p = vec3( dot(p,vec3(127.1,311.7, 74.7)), + dot(p,vec3(269.5,183.3,246.1)), + dot(p,vec3(113.5,271.9,124.6))); + + return -1.0 + 2.0*fract(sin(p)*43758.5453123); +} +#endif + +float hashf( float f ) +{ + return -1.0 + 2.0*fract(sin(f)*43758.5453123); +} + +#if 1 +vec4 value_noise_derivs( in vec3 x ) +{ + vec3 p = floor(x); + vec3 w = fract(x); + vec3 u = w*w*(3.0-2.0*w); + vec3 du = 6.0*w*(1.0-w); + + float n = p.x + p.y*157.0 + 113.0*p.z; + + float a = hashf(n+ 0.0); + float b = hashf(n+ 1.0); + float c = hashf(n+157.0); + float d = hashf(n+158.0); + float e = hashf(n+113.0); + float f = hashf(n+114.0); + float g = hashf(n+270.0); + float h = hashf(n+271.0); + + float k0 = a; + float k1 = b - a; + float k2 = c - a; + float k3 = e - a; + float k4 = a - b - c + d; + float k5 = a - c - e + g; + float k6 = a - b - e + f; + float k7 = - a + b + c - d + e - f - g + h; + + return vec4( k0 + k1*u.x + k2*u.y + k3*u.z + k4*u.x*u.y + k5*u.y*u.z + k6*u.z*u.x + k7*u.x*u.y*u.z, + du * (vec3(k1,k2,k3) + u.yzx*vec3(k4,k5,k6) + u.zxy*vec3(k6,k4,k5) + k7*u.yzx*u.zxy )); +} +#endif + +// return value noise (in x) and its derivatives (in yzw) +// +vec4 gradient_noise_derivs( in vec3 x ) +{ + // grid + #if METHOD==0 + ivec3 i = ivec3(floor(x)); + #else + vec3 i = floor(x); + #endif + vec3 f = fract(x); + + #if INTERPOLANT==1 + // quintic interpolant + vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); + vec3 du = 30.0*f*f*(f*(f-2.0)+1.0); + #else + // cubic interpolant + vec3 u = f*f*(3.0-2.0*f); + vec3 du = 6.0*f*(1.0-f); + #endif + + // gradients + #if METHOD==0 + vec3 ga = hash( i+ivec3(0,0,0) ); + vec3 gb = hash( i+ivec3(1,0,0) ); + vec3 gc = hash( i+ivec3(0,1,0) ); + vec3 gd = hash( i+ivec3(1,1,0) ); + vec3 ge = hash( i+ivec3(0,0,1) ); + vec3 gf = hash( i+ivec3(1,0,1) ); + vec3 gg = hash( i+ivec3(0,1,1) ); + vec3 gh = hash( i+ivec3(1,1,1) ); + #else + vec3 ga = hash( i+vec3(0.0,0.0,0.0) ); + vec3 gb = hash( i+vec3(1.0,0.0,0.0) ); + vec3 gc = hash( i+vec3(0.0,1.0,0.0) ); + vec3 gd = hash( i+vec3(1.0,1.0,0.0) ); + vec3 ge = hash( i+vec3(0.0,0.0,1.0) ); + vec3 gf = hash( i+vec3(1.0,0.0,1.0) ); + vec3 gg = hash( i+vec3(0.0,1.0,1.0) ); + vec3 gh = hash( i+vec3(1.0,1.0,1.0) ); + #endif + + // projections + float va = dot( ga, f-vec3(0.0,0.0,0.0) ); + float vb = dot( gb, f-vec3(1.0,0.0,0.0) ); + float vc = dot( gc, f-vec3(0.0,1.0,0.0) ); + float vd = dot( gd, f-vec3(1.0,1.0,0.0) ); + float ve = dot( ge, f-vec3(0.0,0.0,1.0) ); + float vf = dot( gf, f-vec3(1.0,0.0,1.0) ); + float vg = dot( gg, f-vec3(0.0,1.0,1.0) ); + float vh = dot( gh, f-vec3(1.0,1.0,1.0) ); + + // interpolations + return vec4( va + u.x*(vb-va) + u.y*(vc-va) + u.z*(ve-va) + u.x*u.y*(va-vb-vc+vd) + u.y*u.z*(va-vc-ve+vg) + u.z*u.x*(va-vb-ve+vf) + (-va+vb+vc-vd+ve-vf-vg+vh)*u.x*u.y*u.z, // value + ga + u.x*(gb-ga) + u.y*(gc-ga) + u.z*(ge-ga) + u.x*u.y*(ga-gb-gc+gd) + u.y*u.z*(ga-gc-ge+gg) + u.z*u.x*(ga-gb-ge+gf) + (-ga+gb+gc-gd+ge-gf-gg+gh)*u.x*u.y*u.z + // derivatives + du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); +} + +// Doesn't support integer hashing +#if METHOD == 1 +float gradient_noise( in vec3 p ) +{ + vec3 i = floor( p ); + vec3 f = fract( p ); + + #if INTERPOLANT==1 + // quintic interpolant + vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); + #else + // cubic interpolant + vec3 u = f*f*(3.0-2.0*f); + #endif + + return mix( mix( mix( dot( hash( i + vec3(0.0,0.0,0.0) ), f - vec3(0.0,0.0,0.0) ), + dot( hash( i + vec3(1.0,0.0,0.0) ), f - vec3(1.0,0.0,0.0) ), u.x), + mix( dot( hash( i + vec3(0.0,1.0,0.0) ), f - vec3(0.0,1.0,0.0) ), + dot( hash( i + vec3(1.0,1.0,0.0) ), f - vec3(1.0,1.0,0.0) ), u.x), u.y), + mix( mix( dot( hash( i + vec3(0.0,0.0,1.0) ), f - vec3(0.0,0.0,1.0) ), + dot( hash( i + vec3(1.0,0.0,1.0) ), f - vec3(1.0,0.0,1.0) ), u.x), + mix( dot( hash( i + vec3(0.0,1.0,1.0) ), f - vec3(0.0,1.0,1.0) ), + dot( hash( i + vec3(1.0,1.0,1.0) ), f - vec3(1.0,1.0,1.0) ), u.x), u.y), u.z ); +} +#endif + +vec3 vhash(vec3 UV, vec3 offset) +{ + mat3 m = mat3(127.1,311.7, 74.7,269.5,183.3,246.1,113.5,271.9,124.6); + UV = fract(sin(UV* m) * 46839.32); + return vec3(sin(UV.z * +offset.x) * 0.5 + 0.5, cos(UV.x* offset.y) * 0.5 + 0.5,tan(UV.y * offset.z) * 0.5 + 0.5); +} + +vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) +{ + vec3 g = floor(p * CellDensity); + vec3 f = fract(p * CellDensity); + float res = 8.0; + float md=8.0; + vec3 mr; + vec4 Out; + for( int z=-1; z<=1; z++ ) + for( int y=-1; y<=1; y++ ) + for( int x=-1; x<=1; x++ ) + { + vec3 lattice = vec3(x,y,z); + vec3 offset=vhash(lattice + g ,AngleOffset); + vec3 r = lattice +offset -f; + float d = dot( r, r ); + if (d < res) + { + res=d; + mr=r; + } + } + + res = 8.0; + for( int z=-1; z<=1; z++ ) + for( int y=-1; y<=1; y++ ) + for( int x=-1; x<=1; x++ ) + { + vec3 lattice = vec3(x,y,z); + vec3 offset=vhash(lattice + g ,AngleOffset); + vec3 r = lattice +offset -f; + float d = dot( r, r ); + if( d < res ) + { + res = d; + Out.x= offset.x; + Out.y = d; + } + if( dot(mr-r,mr-r)>0.00001) + { + md = min( md, dot( 0.5*(mr+r), normalize(r-mr) ) ); + } + } + Out.z = mix(1.0, 0.0, smoothstep( 0.0, 0.1, md )); + Out.w = 1.0-smoothstep( 0.0, 0.1, res); + return Out; +} + +float sstep(float init_x){ + float x = clamp(init_x,-1.,1.); + x = abs(x); + return sign(init_x)*(x*(2.-x)); +} +#define PI 3.14159265359 +#define PI_INV 0.31830988618 + +float dot2( in vec2 v ) { return dot(v,v); } + +//trapezoid SDF from IQ +float sdTrapezoid( in vec2 p, in float r1, float r2, float he ){ + p = vec2(p.y, -p.x); + vec2 k1 = vec2(r2,he); + vec2 k2 = vec2(r2-r1,2.0*he); + p.x = abs(p.x); + vec2 ca = vec2(p.x-min(p.x,(p.y<0.0)?r1:r2), abs(p.y)-he); + vec2 cb = p - k1 + k2*clamp( dot(k1-p,k2)/dot2(k2), 0.0, 1.0 ); + float s = (cb.x<0.0 && ca.y<0.0) ? -1.0 : 1.0; + return s*sqrt( min(dot2(ca),dot2(cb)) ); +} + +float brick_size(float id, float n, float r){ + return (cos(mod(round(id)+.4, 2.)*PI)*.5+.5)*.5*r; +} + +float sdBrickCircle(vec2 p, float r, float n, float padding, float rotation){ + + float inv_n = 1./n; + rotation *= n; + + vec2 point = normalize(p); + float angle = atan(point.y, point.x); // angle from the x axis + float neighbor = 0.; + + //quantization of the normal's angle. you must normalize the angle before doing quantization + angle *= n*PI_INV; + + angle += rotation; + + angle = floor(angle); + + vec2 ids = vec2(angle); + + angle -= rotation; + + ids.y += 1.; + + neighbor = angle + 1.; + + angle *= inv_n; + angle *= PI; + neighbor *=PI*inv_n; + + //recunstructing the normals + vec2 right = vec2(cos(angle), sin(angle)); + vec2 left = vec2(cos(neighbor), sin(neighbor)); + + vec2 sizes = vec2(brick_size(ids.x, n, r), brick_size(ids.y, n, r)); + + //note : you can make the brick size not depend on the radius by removing r here + vec4 radii = vec4((1.-cos(inv_n*PI))/sin(inv_n*PI)); + radii *= r + vec4(sizes.x, -sizes.x, sizes.y, -sizes.y); + radii-=padding; + + vec3 brick0 = vec3(sizes.x, radii.x, radii.y); + vec3 brick1 = vec3(sizes.y, radii.z, radii.w); + + vec2 p_right = vec2(p.x*right.x + p.y*right.y, p.x*right.y - p.y*right.x); + p_right.x-=r; + + float d = sdTrapezoid(p_right, brick0.y, brick0.z, brick0.x); + + vec2 p_left = vec2(p.x*left.x + p.y*left.y, p.x*left.y - p.y*left.x); + p_left.x-=r; + + d = min(d, sdTrapezoid(p_left, brick1.y, brick1.z, brick1.x)); + + return d; +} + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); + + v3 Offset = V3(-1, -1, -1); + v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + Basis *=.0001; + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + + f32 d = sdBrickCircle(vec2(x,z), 20., 10., 0., 0.); + + vec3 col = (d>0.0) ? vec3(0.9,0.6,0.3) : vec3(0.65,0.85,1.0); + col *= 1.0 - exp(-4.0*abs(d)); + col *= 0.8 + 0.2*cos(80.0*d); + col = mix( col, vec3(1.0), 1.0-smoothstep(0.0,0.03,abs(d))); + + vec2 w = vec2( d, abs(y-8.) - 4. ); + d = min(max(w.x,w.y),0.0) + length(max(w,0.0)); + + ColorValue = col; + + NoiseValue = d ; + } + + // + // -- end user code -- + // + + uint SolidBit = NoiseValue > 0.0f ? 1u : 0u; + uint PackedColor = RGBtoPackedHSV(ColorValue); + /* uint PackedColor = 3543u; */ + + Output = (SolidBit << 15) | PackedColor; +} From 37a684893d5a79c478e5616ae72c3e0818472505 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 13:00:46 -0700 Subject: [PATCH 122/421] Update deps --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index f3802060e..4719c4fc7 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit f3802060e90c4eb59c5535386e3cbed35b233f73 +Subproject commit 4719c4fc704df5b01c3c5caa2b9ea89a6e459599 From c87293cc85ee0e8fe57b39726c5c098f6bbcd334 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 25 Oct 2024 13:36:04 -0700 Subject: [PATCH 123/421] Fix some terrain shader bugs --- .../terrain/dottedboxguy_arch.fragmentshader | 20 +- shaders/terrain/voronoi.fragmentshader | 314 +----------------- src/engine/world.cpp | 2 +- 3 files changed, 30 insertions(+), 306 deletions(-) diff --git a/shaders/terrain/dottedboxguy_arch.fragmentshader b/shaders/terrain/dottedboxguy_arch.fragmentshader index de02f2633..202ad7c1d 100644 --- a/shaders/terrain/dottedboxguy_arch.fragmentshader +++ b/shaders/terrain/dottedboxguy_arch.fragmentshader @@ -4,14 +4,13 @@ uniform v3 ChunkResolution; in vec2 UV; out uint Output; -#define PI 3.14159265359 -#define PI_INV 0.31830988618 - float sstep(float init_x){ float x = clamp(init_x,-1.,1.); x = abs(x); return sign(init_x)*(x*(2.-x)); } +#define PI 3.14159265359 +#define PI_INV 0.31830988618 float dot2( in vec2 v ) { return dot(v,v); } @@ -94,7 +93,7 @@ void main() v3 Offset = V3(-1, -1, -1); v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); - Basis *=.0001; + Basis *= .2; // NOTE(Jesse): Set these in the -- user code -- section v3 ColorValue = V3(0.f); @@ -104,15 +103,17 @@ void main() // -- user code -- // { + vec3 p = Basis; + float size = 200; - f32 d = sdBrickCircle(vec2(x,z), 20., 10., 0., 0.); + f32 d = sdBrickCircle(p.xz-size, size*.5, 10., 1., 0.); vec3 col = (d>0.0) ? vec3(0.9,0.6,0.3) : vec3(0.65,0.85,1.0); - col *= 1.0 - exp(-4.0*abs(d)); - col *= 0.8 + 0.2*cos(80.0*d); - col = mix( col, vec3(1.0), 1.0-smoothstep(0.0,0.03,abs(d))); + col *= 1.0 - exp(-9.0*abs(d)); + col *= 0.8 + 0.2*cos(1.0*d); + col = mix( col, vec3(1.0), 1.0-smoothstep(0.0,1.,abs(d))); - vec2 w = vec2( d, abs(y-8.) - 4. ); + vec2 w = vec2( d, abs(p.y-80.) - 40. ); d = min(max(w.x,w.y),0.0) + length(max(w,0.0)); ColorValue = col; @@ -126,6 +127,7 @@ void main() uint SolidBit = NoiseValue > 0.0f ? 1u : 0u; uint PackedColor = PackRGB(ColorValue); + /* uint PackedColor = 3543u; */ Output = (SolidBit << 15) | PackedColor; } diff --git a/shaders/terrain/voronoi.fragmentshader b/shaders/terrain/voronoi.fragmentshader index d465c3d36..d150d0873 100644 --- a/shaders/terrain/voronoi.fragmentshader +++ b/shaders/terrain/voronoi.fragmentshader @@ -4,208 +4,6 @@ uniform v3 ChunkResolution; in vec2 UV; out uint Output; - - -uint RGBtoPackedHSV(v3 Color) -{ - v3 HSV = RGBtoHSV(Color); - uint Packed = PackHSVColor(HSV); - /* int Packed= 0; */ - return Packed; -} - - - -// https://www.shadertoy.com/view/4dffRH -// -// -// -// The MIT License -// Copyright 2017 Inigo Quilez -// 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. -// -// https://www.youtube.com/c/InigoQuilez -// https://iquilezles.org/ - -// Computes the analytic derivatives of a 3D Gradient Noise. This can be used for example to compute normals to a -// 3d rocks based on Gradient Noise without approximating the gradient by having to take central differences. -// -// More info here: https://iquilezles.org/articles/gradientnoise - -// All noise functions here: -// -// https://www.shadertoy.com/playlist/fXlXzf&from=0&num=12 - - -// 0: integer hash -// 1: float hash (aliasing based) -#define METHOD 1 - -// 0: cubic -// 1: quintic -#define INTERPOLANT 1 - - -#if METHOD==0 -vec3 hash( ivec3 p ) // this hash is not production ready, please -{ // replace this by something better - ivec3 n = ivec3( p.x*127 + p.y*311 + p.z*74, - p.x*269 + p.y*183 + p.z*246, - p.x*113 + p.y*271 + p.z*124); - - // 1D hash by Hugo Elias - n = (n << 13) ^ n; - n = n * (n * n * 15731 + 789221) + 1376312589; - return -1.0+2.0*vec3( n & ivec3(0x0fffffff))/float(0x0fffffff); -} - -#else -vec3 hash( vec3 p ) // this hash is not production ready, please -{ // replace this by something better - p = vec3( dot(p,vec3(127.1,311.7, 74.7)), - dot(p,vec3(269.5,183.3,246.1)), - dot(p,vec3(113.5,271.9,124.6))); - - return -1.0 + 2.0*fract(sin(p)*43758.5453123); -} -#endif - -float hashf( float f ) -{ - return -1.0 + 2.0*fract(sin(f)*43758.5453123); -} - -#if 1 -vec4 value_noise_derivs( in vec3 x ) -{ - vec3 p = floor(x); - vec3 w = fract(x); - vec3 u = w*w*(3.0-2.0*w); - vec3 du = 6.0*w*(1.0-w); - - float n = p.x + p.y*157.0 + 113.0*p.z; - - float a = hashf(n+ 0.0); - float b = hashf(n+ 1.0); - float c = hashf(n+157.0); - float d = hashf(n+158.0); - float e = hashf(n+113.0); - float f = hashf(n+114.0); - float g = hashf(n+270.0); - float h = hashf(n+271.0); - - float k0 = a; - float k1 = b - a; - float k2 = c - a; - float k3 = e - a; - float k4 = a - b - c + d; - float k5 = a - c - e + g; - float k6 = a - b - e + f; - float k7 = - a + b + c - d + e - f - g + h; - - return vec4( k0 + k1*u.x + k2*u.y + k3*u.z + k4*u.x*u.y + k5*u.y*u.z + k6*u.z*u.x + k7*u.x*u.y*u.z, - du * (vec3(k1,k2,k3) + u.yzx*vec3(k4,k5,k6) + u.zxy*vec3(k6,k4,k5) + k7*u.yzx*u.zxy )); -} -#endif - -// return value noise (in x) and its derivatives (in yzw) -// -vec4 gradient_noise_derivs( in vec3 x ) -{ - // grid - #if METHOD==0 - ivec3 i = ivec3(floor(x)); - #else - vec3 i = floor(x); - #endif - vec3 f = fract(x); - - #if INTERPOLANT==1 - // quintic interpolant - vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); - vec3 du = 30.0*f*f*(f*(f-2.0)+1.0); - #else - // cubic interpolant - vec3 u = f*f*(3.0-2.0*f); - vec3 du = 6.0*f*(1.0-f); - #endif - - // gradients - #if METHOD==0 - vec3 ga = hash( i+ivec3(0,0,0) ); - vec3 gb = hash( i+ivec3(1,0,0) ); - vec3 gc = hash( i+ivec3(0,1,0) ); - vec3 gd = hash( i+ivec3(1,1,0) ); - vec3 ge = hash( i+ivec3(0,0,1) ); - vec3 gf = hash( i+ivec3(1,0,1) ); - vec3 gg = hash( i+ivec3(0,1,1) ); - vec3 gh = hash( i+ivec3(1,1,1) ); - #else - vec3 ga = hash( i+vec3(0.0,0.0,0.0) ); - vec3 gb = hash( i+vec3(1.0,0.0,0.0) ); - vec3 gc = hash( i+vec3(0.0,1.0,0.0) ); - vec3 gd = hash( i+vec3(1.0,1.0,0.0) ); - vec3 ge = hash( i+vec3(0.0,0.0,1.0) ); - vec3 gf = hash( i+vec3(1.0,0.0,1.0) ); - vec3 gg = hash( i+vec3(0.0,1.0,1.0) ); - vec3 gh = hash( i+vec3(1.0,1.0,1.0) ); - #endif - - // projections - float va = dot( ga, f-vec3(0.0,0.0,0.0) ); - float vb = dot( gb, f-vec3(1.0,0.0,0.0) ); - float vc = dot( gc, f-vec3(0.0,1.0,0.0) ); - float vd = dot( gd, f-vec3(1.0,1.0,0.0) ); - float ve = dot( ge, f-vec3(0.0,0.0,1.0) ); - float vf = dot( gf, f-vec3(1.0,0.0,1.0) ); - float vg = dot( gg, f-vec3(0.0,1.0,1.0) ); - float vh = dot( gh, f-vec3(1.0,1.0,1.0) ); - - // interpolations - return vec4( va + u.x*(vb-va) + u.y*(vc-va) + u.z*(ve-va) + u.x*u.y*(va-vb-vc+vd) + u.y*u.z*(va-vc-ve+vg) + u.z*u.x*(va-vb-ve+vf) + (-va+vb+vc-vd+ve-vf-vg+vh)*u.x*u.y*u.z, // value - ga + u.x*(gb-ga) + u.y*(gc-ga) + u.z*(ge-ga) + u.x*u.y*(ga-gb-gc+gd) + u.y*u.z*(ga-gc-ge+gg) + u.z*u.x*(ga-gb-ge+gf) + (-ga+gb+gc-gd+ge-gf-gg+gh)*u.x*u.y*u.z + // derivatives - du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); -} - -// Doesn't support integer hashing -#if METHOD == 1 -float gradient_noise( in vec3 p ) -{ - vec3 i = floor( p ); - vec3 f = fract( p ); - - #if INTERPOLANT==1 - // quintic interpolant - vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); - #else - // cubic interpolant - vec3 u = f*f*(3.0-2.0*f); - #endif - - return mix( mix( mix( dot( hash( i + vec3(0.0,0.0,0.0) ), f - vec3(0.0,0.0,0.0) ), - dot( hash( i + vec3(1.0,0.0,0.0) ), f - vec3(1.0,0.0,0.0) ), u.x), - mix( dot( hash( i + vec3(0.0,1.0,0.0) ), f - vec3(0.0,1.0,0.0) ), - dot( hash( i + vec3(1.0,1.0,0.0) ), f - vec3(1.0,1.0,0.0) ), u.x), u.y), - mix( mix( dot( hash( i + vec3(0.0,0.0,1.0) ), f - vec3(0.0,0.0,1.0) ), - dot( hash( i + vec3(1.0,0.0,1.0) ), f - vec3(1.0,0.0,1.0) ), u.x), - mix( dot( hash( i + vec3(0.0,1.0,1.0) ), f - vec3(0.0,1.0,1.0) ), - dot( hash( i + vec3(1.0,1.0,1.0) ), f - vec3(1.0,1.0,1.0) ), u.x), u.y), u.z ); -} -#endif - vec3 vhash(vec3 UV, vec3 offset) { mat3 m = mat3(127.1,311.7, 74.7,269.5,183.3,246.1,113.5,271.9,124.6); @@ -261,96 +59,15 @@ vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) return Out; } -float sstep(float init_x){ - float x = clamp(init_x,-1.,1.); - x = abs(x); - return sign(init_x)*(x*(2.-x)); -} -#define PI 3.14159265359 -#define PI_INV 0.31830988618 - -float dot2( in vec2 v ) { return dot(v,v); } - -//trapezoid SDF from IQ -float sdTrapezoid( in vec2 p, in float r1, float r2, float he ){ - p = vec2(p.y, -p.x); - vec2 k1 = vec2(r2,he); - vec2 k2 = vec2(r2-r1,2.0*he); - p.x = abs(p.x); - vec2 ca = vec2(p.x-min(p.x,(p.y<0.0)?r1:r2), abs(p.y)-he); - vec2 cb = p - k1 + k2*clamp( dot(k1-p,k2)/dot2(k2), 0.0, 1.0 ); - float s = (cb.x<0.0 && ca.y<0.0) ? -1.0 : 1.0; - return s*sqrt( min(dot2(ca),dot2(cb)) ); -} - -float brick_size(float id, float n, float r){ - return (cos(mod(round(id)+.4, 2.)*PI)*.5+.5)*.5*r; -} - -float sdBrickCircle(vec2 p, float r, float n, float padding, float rotation){ - - float inv_n = 1./n; - rotation *= n; - - vec2 point = normalize(p); - float angle = atan(point.y, point.x); // angle from the x axis - float neighbor = 0.; - - //quantization of the normal's angle. you must normalize the angle before doing quantization - angle *= n*PI_INV; - - angle += rotation; - - angle = floor(angle); - - vec2 ids = vec2(angle); - - angle -= rotation; - - ids.y += 1.; - - neighbor = angle + 1.; - - angle *= inv_n; - angle *= PI; - neighbor *=PI*inv_n; - - //recunstructing the normals - vec2 right = vec2(cos(angle), sin(angle)); - vec2 left = vec2(cos(neighbor), sin(neighbor)); - - vec2 sizes = vec2(brick_size(ids.x, n, r), brick_size(ids.y, n, r)); - - //note : you can make the brick size not depend on the radius by removing r here - vec4 radii = vec4((1.-cos(inv_n*PI))/sin(inv_n*PI)); - radii *= r + vec4(sizes.x, -sizes.x, sizes.y, -sizes.y); - radii-=padding; - - vec3 brick0 = vec3(sizes.x, radii.x, radii.y); - vec3 brick1 = vec3(sizes.y, radii.z, radii.w); - - vec2 p_right = vec2(p.x*right.x + p.y*right.y, p.x*right.y - p.y*right.x); - p_right.x-=r; - - float d = sdTrapezoid(p_right, brick0.y, brick0.z, brick0.x); - - vec2 p_left = vec2(p.x*left.x + p.y*left.y, p.x*left.y - p.y*left.x); - p_left.x-=r; - - d = min(d, sdTrapezoid(p_left, brick1.y, brick1.z, brick1.x)); - - return d; -} - void main() { + f32 x = floor(gl_FragCoord.x); f32 z = floor(gl_FragCoord.y / 66); f32 y = floor(gl_FragCoord.y - (z*66)); v3 Offset = V3(-1, -1, -1); v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); - Basis *=.0001; // NOTE(Jesse): Set these in the -- user code -- section v3 ColorValue = V3(0.f); @@ -360,29 +77,34 @@ void main() // -- user code -- // { + v3 Period = V3(100.f); + float Amplitude = 200.f; + f32 StartingZDepth = 400.f; + s32 Octaves = 1; - f32 d = sdBrickCircle(vec2(x,z), 20., 10., 0., 0.); + NoiseValue = StartingZDepth; - vec3 col = (d>0.0) ? vec3(0.9,0.6,0.3) : vec3(0.65,0.85,1.0); - col *= 1.0 - exp(-4.0*abs(d)); - col *= 0.8 + 0.2*cos(80.0*d); - col = mix( col, vec3(1.0), 1.0-smoothstep(0.0,0.03,abs(d))); + f32 warp = 0.f; - vec2 w = vec2( d, abs(y-8.) - 4. ); - d = min(max(w.x,w.y),0.0) + length(max(w,0.0)); + for (s32 Octave = 1; Octave <= Octaves; ++Octave) + { + v3 xyz = Basis / (Period/Octave); + v4 gn = voronoi_noise(xyz+warp, V3(1.f), V3(1.f)); + ColorValue += gn.yzw; + NoiseValue = NoiseValue + (gn.x * (Amplitude/Octave)); + } - ColorValue = col; + ColorValue = abs(normalize(ColorValue)); - NoiseValue = d ; + NoiseValue = NoiseValue - Basis.z; } // // -- end user code -- // - uint SolidBit = NoiseValue > 0.0f ? 1u : 0u; - uint PackedColor = RGBtoPackedHSV(ColorValue); - /* uint PackedColor = 3543u; */ + uint SolidBit = NoiseValue > 0.f ? 1u : 0u; + uint PackedColor = PackRGB(ColorValue); Output = (SolidBit << 15) | PackedColor; } diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 2789bb734..8e2a2a8aa 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -1025,7 +1025,7 @@ MaintainWorldOctree(engine_resources *Engine) DrawOctreeRecursive(Engine, &World->Root, MainDrawList, ShadowMapDrawList); DEBUG_OctreeTraversal(Engine, &World->Root, &Stats); - Info("TotalLeaves(%d) TotalBranches(%d) TotalQueued(%d) NewQueues(%d)", Stats.TotalLeaves, Stats.TotalBranches, Stats.TotalQueued, Stats.NewQueues); + /* Info("TotalLeaves(%d) TotalBranches(%d) TotalQueued(%d) NewQueues(%d)", Stats.TotalLeaves, Stats.TotalBranches, Stats.TotalQueued, Stats.NewQueues); */ } From 86bd133baa6447ed0a087062db22c717270456b2 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 27 Oct 2024 11:10:19 -0700 Subject: [PATCH 124/421] Random hacking around on cliffy_hills shader --- examples/terrain_gen/game_constants.h | 4 +- ...editor_ui_for_compound_type_engine_debug.h | 16 ++++++++ jesse.make.sh | 1 - shaders/terrain/default.fragmentshader | 40 ------------------- src/engine/debug.h | 2 + src/engine/terrain.cpp | 9 +++-- 6 files changed, 26 insertions(+), 46 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 483c868d0..3cde4bfd3 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -16,11 +16,11 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ -/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ +g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ -g_VisibleRegion = Chunk_Dimension(32, 32, 32); +/* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index b352ce6a5..8d23354b4 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -258,6 +258,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*,&Element->MarkChunkBorderVoxels), + CSz("MarkChunkBorderVoxels"), + Params + ); + + + + + + + PushNewRow(Ui); DoEditorUi(Ui, diff --git a/jesse.make.sh b/jesse.make.sh index 931f25e36..49caf8fac 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,7 +1,6 @@ #! /usr/bin/env bash OPT="-O2" - ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index e1b9ee3bb..6f6562b0f 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -73,46 +73,6 @@ vec3 hash( vec3 p ) // this hash is not production ready, please } #endif -float hashf( float f ) -{ - return -1.0 + 2.0*fract(sin(f)*43758.5453123); -} - -#if 1 -vec4 value_noise_derivs( in vec3 x ) -{ - vec3 p = floor(x); - vec3 w = fract(x); - vec3 u = w*w*(3.0-2.0*w); - vec3 du = 6.0*w*(1.0-w); - - float n = p.x + p.y*157.0 + 113.0*p.z; - - float a = hashf(n+ 0.0); - float b = hashf(n+ 1.0); - float c = hashf(n+157.0); - float d = hashf(n+158.0); - float e = hashf(n+113.0); - float f = hashf(n+114.0); - float g = hashf(n+270.0); - float h = hashf(n+271.0); - - float k0 = a; - float k1 = b - a; - float k2 = c - a; - float k3 = e - a; - float k4 = a - b - c + d; - float k5 = a - c - e + g; - float k6 = a - b - e + f; - float k7 = - a + b + c - d + e - f - g + h; - - return vec4( k0 + k1*u.x + k2*u.y + k3*u.z + k4*u.x*u.y + k5*u.y*u.z + k6*u.z*u.x + k7*u.x*u.y*u.z, - du * (vec3(k1,k2,k3) + u.yzx*vec3(k4,k5,k6) + u.zxy*vec3(k6,k4,k5) + k7*u.yzx*u.zxy )); -} -#endif - -// return value noise (in x) and its derivatives (in yzw) -// vec4 gradient_noise_derivs( in vec3 x ) { // grid diff --git a/src/engine/debug.h b/src/engine/debug.h index ab6598e6a..cc1ddd791 100644 --- a/src/engine/debug.h +++ b/src/engine/debug.h @@ -64,6 +64,8 @@ struct engine_debug b8 DrawNodesWithChunks; b8 DrawQueuedNodes; + b8 MarkChunkBorderVoxels; + r64 ChunkGenTimeElapsedMS; u64 CellsGenerated; r64 ChunkGenCyclesElapsed; diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 7991e318d..c713a07f0 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -50,9 +50,12 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ - if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } - if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } - if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } + if (GetEngineDebug()->MarkChunkBorderVoxels) + { + if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } + if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } + if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } + } } SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); From a2c5d02fd7db5316452d3fc51664fb8a5c5ec8b3 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 27 Oct 2024 17:36:12 -0700 Subject: [PATCH 125/421] Add cliffy_hills.fragmentshader --- shaders/terrain/cliffy_hills.fragmentshader | 647 ++++++++++++++++++++ 1 file changed, 647 insertions(+) create mode 100644 shaders/terrain/cliffy_hills.fragmentshader diff --git a/shaders/terrain/cliffy_hills.fragmentshader b/shaders/terrain/cliffy_hills.fragmentshader new file mode 100644 index 000000000..fc9410c70 --- /dev/null +++ b/shaders/terrain/cliffy_hills.fragmentshader @@ -0,0 +1,647 @@ +uniform v3 WorldspaceBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out uint Output; + +/// +// +// fractal rock code +// +/// + + + +#define PI 3.14159265 +#define SQRT2 1.4142135 +#define SQRT3 1.7320508 +#define SQRT5 2.2360679 +#define FOV 2.5 + +#define MAX_DIST 500. +#define MIN_DIST 1e-5 +#define MAX_MARCHES 512. +#define LIGHT_ANGLE 0.04 + +//how much does the terrain change in large scale +#define PERLIN_SCALE 2 + +//coefficients are fine-tuned +//you can get all kinds of weird terrain by carefully setting the coefficients, +//even forests are possible, but they may look not as realistic as the rock fractals +const int FRACTAL_ITER = 20; +const float iFracScale = 1.6467; +const float iFracAng1 = 2.7315; +const float iFracAng2 = -0.2082; +const vec3 iFracShift = vec3(-8.92, 3.66, 5.49); +const vec3 iFracCol = vec3(0.3, 0.3, -0.2); + +float s1 = sin(iFracAng1), c1 = cos(iFracAng1), s2 = sin(iFracAng2), c2 = cos(iFracAng2); + +float PBR_METALLIC = 0.0; +float PBR_ROUGHNESS = 0.7; + +vec3 BACKGROUND_COLOR = vec3(0.); +vec3 LIGHT_DIRECTION = normalize(vec3(-1.,1.,0.68)); +vec3 LIGHT_COLOR = vec3(1., 0.95, 0.8); +bool SHADOWS_ENABLED = true; + +float gamma_material = 0.1; +float gamma_sky = 0.76; +float gamma_camera = 2.2; + +float LOD; + +float hash(float p) +{ + p = fract(p * .1031); + p *= p + 33.33; + p *= p + p; + return fract(p); +} + +vec4 hash41(float p) +{ + vec4 p4 = fract(vec4(p) * vec4(.1031, .1030, .0973, .1099)); + p4 += dot(p4, p4.wzxy+33.33); + return fract((p4.xxyz+p4.yzzw)*p4.zywx); + +} + +vec4 hash42(vec2 p) +{ + vec4 p4 = fract(vec4(p.xyxy) * vec4(.1031, .1030, .0973, .1099)); + p4 += dot(p4, p4.wzxy+33.33); + return fract((p4.xxyz+p4.yzzw)*p4.zywx); + +} + + +//normally distributed random numbers +vec3 randn(float p) +{ + vec4 rand = hash41(p); + vec3 box_muller = sqrt(-2.*log(max(vec3(rand.x,rand.x,rand.z),1e-8)))*vec3(sin(2.*PI*rand.y),cos(2.*PI*rand.y),sin(2.*PI*rand.w)); + return box_muller; +} + +//uniformly inside a sphere +vec3 random_sphere(float p) +{ + return normalize(randn(p))*pow(hash(p+85.67),0.333333); +} + +vec3 cosdistr(vec3 dir, float seed) +{ + vec3 rand_dir = normalize(randn(seed*SQRT2)); + vec3 norm_dir = normalize(rand_dir - dot(dir,rand_dir)*dir); + float u = hash(seed); + return normalize(dir*sqrt(u) + norm_dir*sqrt(1.-u)); +} + + +vec4 perlin_octave(vec2 p) +{ + vec2 pi = floor(p); + vec2 pf = p - pi; + vec2 pfc = 0.5 - 0.5*cos(pf*PI); + vec2 a = vec2(0.,1.); + + vec4 a00 = hash42(pi+a.xx); + vec4 a01 = hash42(pi+a.xy); + vec4 a10 = hash42(pi+a.yx); + vec4 a11 = hash42(pi+a.yy); + + vec4 i1 = mix(a00, a01, pfc.y); + vec4 i2 = mix(a10, a11, pfc.y); + + return mix(i1, i2, pfc.x); +} + +mat2 rotat = mat2(cos(0.5), -sin(0.5), sin(0.5), cos(0.5)); + +vec4 perlin4(vec2 p) +{ + float a = 1.; + vec4 res = vec4(0.); + for(int i = 0; i < PERLIN_SCALE; i++) + { + res += a*(perlin_octave(p)-0.5); + //inverse perlin + p *= 0.6*rotat; + a *= 1.2; + } + return res; +} + +///// +/////Code from Marble Marcher Community Edition +///// + +#define COL col_scene +#define DE de_scene +//########################################## +// Space folding +//########################################## +void planeFold(inout vec4 z, vec3 n, float d) { + z.xyz -= 2.0 * min(0.0, dot(z.xyz, n) - d) * n; +} +void sierpinskiFold(inout vec4 z) { + z.xy -= min(z.x + z.y, 0.0); + z.xz -= min(z.x + z.z, 0.0); + z.yz -= min(z.y + z.z, 0.0); +} + +// Polynomial smooth minimum by iq +float smoothmin(float a, float b, float k) { + float h = clamp(0.5 + 0.5*(a-b)/k, 0.0, 1.0); + return mix(a, b, h) - k*h*(1.0-h); +} + +/*void mengerFold(inout vec4 z) { + float a = smoothmin(z.x - z.y, 0.0, 0.03); + z.x -= a; + z.y += a; + a = smoothmin(z.x - z.z, 0.0, 0.03); + z.x -= a; + z.z += a; + a = smoothmin(z.y - z.z, 0.0, 0.03); + z.y -= a; + z.z += a; +}*/ + +void mengerFold(inout vec4 z) { + float a = min(z.x - z.y, 0.0); + z.x -= a; + z.y += a; + a = min(z.x - z.z, 0.0); + z.x -= a; + z.z += a; + a = min(z.y - z.z, 0.0); + z.y -= a; + z.z += a; +} +void boxFold(inout vec4 z, vec3 r) { + z.xyz = clamp(z.xyz, -r, r) * 2.0 - z.xyz; +} +void rotX(inout vec4 z, float s, float c) { + z.yz = vec2(c*z.y + s*z.z, c*z.z - s*z.y); +} +void rotY(inout vec4 z, float s, float c) { + z.xz = vec2(c*z.x - s*z.z, c*z.z + s*z.x); +} +void rotZ(inout vec4 z, float s, float c) { + z.xy = vec2(c*z.x + s*z.y, c*z.y - s*z.x); +} +void rotX(inout vec4 z, float a) { + rotX(z, sin(a), cos(a)); +} +void rotY(inout vec4 z, float a) { + rotY(z, sin(a), cos(a)); +} +void rotZ(inout vec4 z, float a) { + rotZ(z, sin(a), cos(a)); +} + +//########################################## +// Primitive DEs +//########################################## +float de_sphere(vec4 p, float r) { + return (length(p.xyz) - r) / p.w; +} +float de_box(vec4 p, vec3 s) { + + vec3 a = abs(p.xyz) - s; + return (min(max(max(a.x, a.y), a.z), 0.0) + length(max(a, 0.0))) / p.w; +} +float de_tetrahedron(vec4 p, float r) { + float md = max(max(-p.x - p.y - p.z, p.x + p.y - p.z), + max(-p.x + p.y + p.z, p.x - p.y + p.z)); + return (md - r) / (p.w * sqrt(3.0)); +} +float de_capsule(vec4 p, float h, float r) { + p.y -= clamp(p.y, -h, h); + return (length(p.xyz) - r) / p.w; +} + +//########################################## +// Main DEs +//########################################## +float de_fractal(vec4 p) +{ + vec3 p0 = p.xyz; + p.xz = mod(p.xz + vec2(0.5*p.w), vec2(1.*p.w)) - vec2(0.5*p.w); + vec4 perlin1 = perlin4(p0.xz); + vec3 shift =iFracShift + 0.35*perlin1.xyz; + for (int i = 0; i < FRACTAL_ITER; ++i) { + + p.xyz = abs(p.xyz); + + rotZ(p, s1, c1); + mengerFold(p); + rotX(p, s2, c2); + p *= iFracScale*(1.); + p.xyz += shift; + + } + + return 0.66*de_box(p, vec3(6.0)); +} + +vec4 col_fractal(vec4 p) +{ + vec3 p0 = p.xyz; + vec3 orbit = vec3(0.0); + p.xz = mod(p.xz + vec2(0.5*p.w), vec2(1.*p.w)) - vec2(0.5*p.w); + vec4 perlin1 = perlin4(p0.xz); + vec3 shift =iFracShift + 0.35*(perlin1.xyz - 0.5); + for (int i = 0; i < FRACTAL_ITER; ++i) { + p.xyz = abs(p.xyz); + rotZ(p, s1, c1); + mengerFold(p); + rotX(p, s2, c2); + p *= iFracScale*(1.); + p.xyz += shift; + orbit = max(orbit, p.xyz*iFracCol); + } + return vec4(orbit, de_box(p, vec3(6.0))); +} + +float de_scene(vec3 pos) +{ + vec4 p = vec4(pos,1.f); + float d = de_fractal(p); + return d; +} + +vec4 col_scene(vec3 pos) +{ + vec4 p = vec4(pos,1.f); + vec4 col = col_fractal(p); + return vec4(min(col.xyz,1.), 0.0); +} + + +/// +// +// end fractal code +// +/// + + + + +// return value noise (in x) and its derivatives (in yzw) +// +vec4 gradient_noise_derivs( in vec3 x ) +{ + // grid + ivec3 i = ivec3(floor(x)); + vec3 f = fract(x); + + #if INTERPOLANT==1 + // quintic interpolant + vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); + vec3 du = 30.0*f*f*(f*(f-2.0)+1.0); + #else + // cubic interpolant + vec3 u = f*f*(3.0-2.0*f); + vec3 du = 6.0*f*(1.0-f); + #endif + + // gradients + vec3 ga = ivhash( i+ivec3(0,0,0) ); + vec3 gb = ivhash( i+ivec3(1,0,0) ); + vec3 gc = ivhash( i+ivec3(0,1,0) ); + vec3 gd = ivhash( i+ivec3(1,1,0) ); + vec3 ge = ivhash( i+ivec3(0,0,1) ); + vec3 gf = ivhash( i+ivec3(1,0,1) ); + vec3 gg = ivhash( i+ivec3(0,1,1) ); + vec3 gh = ivhash( i+ivec3(1,1,1) ); + + // projections + float va = dot( ga, f-vec3(0.0,0.0,0.0) ); + float vb = dot( gb, f-vec3(1.0,0.0,0.0) ); + float vc = dot( gc, f-vec3(0.0,1.0,0.0) ); + float vd = dot( gd, f-vec3(1.0,1.0,0.0) ); + float ve = dot( ge, f-vec3(0.0,0.0,1.0) ); + float vf = dot( gf, f-vec3(1.0,0.0,1.0) ); + float vg = dot( gg, f-vec3(0.0,1.0,1.0) ); + float vh = dot( gh, f-vec3(1.0,1.0,1.0) ); + + // interpolations + return vec4( va + u.x*(vb-va) + u.y*(vc-va) + u.z*(ve-va) + u.x*u.y*(va-vb-vc+vd) + u.y*u.z*(va-vc-ve+vg) + u.z*u.x*(va-vb-ve+vf) + (-va+vb+vc-vd+ve-vf-vg+vh)*u.x*u.y*u.z, // value + ga + u.x*(gb-ga) + u.y*(gc-ga) + u.z*(ge-ga) + u.x*u.y*(ga-gb-gc+gd) + u.y*u.z*(ga-gc-ge+gg) + u.z*u.x*(ga-gb-ge+gf) + (-ga+gb+gc-gd+ge-gf-gg+gh)*u.x*u.y*u.z + // derivatives + du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); +} + +vec3 calcNormal( in vec3 pos ) +{ + vec2 eps = vec2( 0.0001, 0.0 ); + vec3 nor = vec3( value_noise_derivs(pos+eps.xyy).x - value_noise_derivs(pos-eps.xyy).x, + value_noise_derivs(pos+eps.yxy).x - value_noise_derivs(pos-eps.yxy).x, + value_noise_derivs(pos+eps.yyx).x - value_noise_derivs(pos-eps.yyx).x ); + return normalize(nor); +} + +#define PI64 (3.1415926535897932384626433832795028841971693993) +#define PI32 (3.14159265358979) + +float +CosineInterpolate( float t, f32 y1, f32 y2 ) +{ + float t2 = (1.f-cos(t*PI32))/2.f; + float nt2 = (1.f-t2); + + f32 a = y1*nt2; + f32 b = y2*t2; + return(a+b); +} + +f32 +MapNoiseValueToFinal(f32 Value) +{ + /* Assert(Value <= 1.f); */ + /* Assert(Value >= 0.f); */ + + // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about + + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 1.0f }}, */ + /* {{0.7f, 0.85f }}, */ + /* {{0.6f, 0.5f }}, */ + /* {{0.3f, 0.4f }}, */ + /* {{0.2f, 0.1f }}, */ + /* {{0.0f, 0.0f }}, */ + /* }; */ + + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 1.0f }}, */ + /* {{0.5f, 0.7f }}, */ + /* {{0.35f, 0.43f }}, */ + /* {{0.3f, 0.4f }}, */ + /* {{0.2f, 0.1f }}, */ + /* {{0.0f, 0.0f }}, */ + /* }; */ + + const s32 PointCount = 2; + v2 Points[PointCount]; + Points[0] = v2(1.0f, 1.0f); + Points[1] = v2(0.f, 0.0f); + + // Pretty nice + +/* s32 PointCount = 6; */ +/* v2 Points[6]; */ +/* Points[0] = v2(1.0f, 1.0f); */ +/* Points[1] = v2(0.7f, 0.7f); */ +/* Points[2] = v2(0.65f, 0.43f); */ +/* Points[3] = v2(0.6f, 0.4f); */ +/* Points[4] = v2(0.5f, 0.2f); */ +/* Points[5] = v2(0.0f, 0.1f); */ + + // Pillar-y + /* v2 Points[] = */ + /* { */ + /* {{2.0f, 0.5f }}, */ + /* {{0.6f, 0.3f }}, */ + /* {{0.1f, 0.2f }}, */ + /* {{0.05f, 0.45f }}, */ + /* {{0.0f , 0.5f }}, */ + /* }; */ + +/* v2 Points[] = */ +/* { */ +/* {{1.0f, 0.0f }}, */ +/* {{0.9f, 1.0f }}, */ +/* {{0.6f, 0.3f }}, */ +/* {{0.1f, 0.1f }}, */ +/* {{0.05f, 0.45f }}, */ +/* {{0.0f , 0.5f }}, */ +/* }; */ + + + + r32 Result = Value; + for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) + { + v2 P = Points[PointIndex]; + + // This is sort of a hack to fix the degenerate case when the value is 0 or 1. + // TODO(Jesse): Make this branchless + if (Value == P.x) return P.y; + + if (Value > P.x) + { + v2 PNext = Points[PointIndex + 1]; + + r32 Range = PNext.x - P.x; + r32 t = (Value-P.x) / Range; + Result = mix(t, P.y, PNext.y); + break; + } + } + + Result = abs(max(Result, 1.0)); + return Result; +} + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); + + /* v3 Offset = V3(-1, -1, -1); */ + v3 Offset = V3(0); + v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + v3 Period = V3(800.f); + float Amplitude = 800.f; + /* f32 StartingZDepth = -800; */ + f32 StartingZDepth = 5000; + s32 Octaves = 2; + + NoiseValue = StartingZDepth; + + + v3 Deriv = v3(0.f); + f32 warp = 0.f; + + for (s32 Octave = 1; Octave <= Octaves; ++Octave) + { + v3 xyz = Basis / (Period/Octave); + + v4 gn = gradient_noise_derivs(xyz+warp); + /* gn.x = MapNoiseValueToFinal(gn.x); */ + /* v4 gn = value_noise_derivs(xyz+warp); */ + NoiseValue += gn.x*(Amplitude/Octave); + /* Deriv += calcNormal(Basis); */ + Deriv += gn.yzw; + + /* v4 gn = COL(xyz+warp)*8; */ + /* f32 fractal = DE(xyz/1.3f); */ + /* NoiseValue += fractal * Amplitude; */ + /* gn.x = fractal; */ + + /* v3 v = voronoi_noise(Basis/160); */ + /* NoiseValue += v.x*150; */ + /* NoiseValue += v.x*50; */ + /* ColorValue += v3(v.y); */ + + /* ColorValue = bad_hash(Basis); */ + + /* NoiseValue = NoiseValue + (gn.x * (Amplitude/Octave)); */ + } + + v3 Up = V3(0, 0, 1); + + /* NoiseValue = MapNoiseValueToFinal(NoiseValue); */ + + /* NoiseValue = pow(NoiseValue, 1.0); */ + /* NoiseValue = pow(NoiseValue, 1.0); */ + + Deriv = normalize(Deriv); + /* Deriv.xy = abs(Deriv.xy); */ + f32 Cliffness = clamp(dot(Deriv, Up), 0.f, 1.f); + f32 Grassness = clamp(.15f-Cliffness, 0.f, 1.f); + + ColorValue = mix(v3(.1,.8,.2), v3(.3), Cliffness); + /* ColorValue = mix(v3(.1,.8,.2), v3(.3), pow(Cliffness, .2)); */ + /* ColorValue = Cliffness > 0.15f ? V3(0.3f) : v3(.1,.8,.2); */ + + // Grassy ripples + { + v4 gWobble = gradient_noise_derivs(Basis/v3(30, 30, 80)); + NoiseValue += gWobble.x*Grassness*50; + ColorValue += V3(0.f, 1.f, 0.f)*gWobble.x*Grassness*1.5f; + } + + + f32 rng2d = white_noise(Basis.xy); + f32 rng3d = white_noise(Basis); + + f32 gravel_patch_stregth = value_noise_derivs(150+(Basis/300)).x; + gravel_patch_stregth = value_noise_derivs(150+(Basis/160)).x; + gravel_patch_stregth = value_noise_derivs(150+(Basis/80)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/40)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/20)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/8)).x; + gravel_patch_stregth = max(gravel_patch_stregth, 0.f); + + + // Rocky edges + { + f32 MinDotValue = 0.6f; + v3 v = voronoi_noise(Basis/v3(20,20,20)); + f32 Power = 100*gravel_patch_stregth*Cliffness*abs(clamp(Cliffness-MinDotValue, -MinDotValue, 0)); + NoiseValue += v.x*Power; + ColorValue = mix(ColorValue, v3(1.0), Power/5*v.x); + } + { + f32 MinDotValue = 0.4f; + v3 v = voronoi_noise(Basis/v3(10,10,10)); + f32 Power = 400*gravel_patch_stregth*Cliffness*abs(clamp(Cliffness-MinDotValue, -MinDotValue, 0)); + NoiseValue += v.x*Power; + /* NoiseValue -= ((1.f/v.x)*2)*Power; */ + ColorValue = mix(ColorValue, v3(1.0), Power/3*v.x); + } + + + + // Main cliffs + { + v3 v = voronoi_noise(Basis/v3(200,200,1800)); + NoiseValue += (v.x*200)*Cliffness; + NoiseValue += (v.y*25)*Cliffness; + ColorValue = mix(ColorValue, v3(.18), clamp(10*Cliffness*v.x,0,1)); + } + { + v3 v = voronoi_noise(Basis/v3(100,100,600)); + NoiseValue += (v.x*8)*Cliffness; + /* NoiseValue += (v.y*10)*Cliffness; */ + ColorValue = mix(ColorValue, v3(.7), Cliffness*v.x); + } + { + v3 v = voronoi_noise(Basis/v3(50,50,200)); + NoiseValue += (v.x*10)*Cliffness; + NoiseValue += (v.y*10)*pow(Cliffness,3); + ColorValue = mix(ColorValue, v3(.9), Cliffness*v.x); + } + { + ColorValue = mix(ColorValue, v3(1.f), rng3d*Cliffness*.2); + } + + + // Grass & Flowers + { + f32 n = clamp(rng2d-0.7f, 0.f, 1.f); + + f32 GrassValue = 90*n*Grassness; + + f32 tFlower = Basis.z - (GrassValue + NoiseValue); + tFlower = max(tFlower, 0); + + + f32 grass_patch_stregth = value_noise_derivs(Basis/80).x; + grass_patch_stregth += value_noise_derivs(Basis/40).x; + grass_patch_stregth += value_noise_derivs(Basis/20).x; + grass_patch_stregth += value_noise_derivs(Basis/8).x; + grass_patch_stregth = max(grass_patch_stregth-gravel_patch_stregth, 0.f); + + NoiseValue += GrassValue*grass_patch_stregth; + + f32 tColor = (grass_patch_stregth / 2.f)*Grassness; + ColorValue = mix(ColorValue, V3(.6f, .8f, .1f), tColor); + + if (rng2d > 0.99f) + { + ColorValue = mix(ColorValue, V3(.5f, .5f, .5f), tFlower); + } + if (rng2d > 0.995f) + { + ColorValue = mix(ColorValue, V3(.5f, .2f, .5f), tFlower); + } + + + /* ColorValue *= tFlower; */ + + /* ColorValue = V3(tFlower); */ + /* ColorValue = V3(GrassValue/1.f); */ + } + + { + + } + + + + /* ColorValue = V3(Grassness, Cliffness, 0.f); */ + /* ColorValue = V3(Cliffness); */ + + // Bias noise value to lower values as we get higher in z. + // This creates a "plane" of terrain + NoiseValue = NoiseValue - Basis.z; + } + + // + // -- end user code -- + // + + uint SolidBit = NoiseValue > 0.f ? 1u : 0u; + ColorValue = min(ColorValue, v3(1.f)); + uint PackedColor = PackRGB(ColorValue); + /* uint PackedColor = 3543u; */ + + Output = (SolidBit << 15) | PackedColor; +} From 26e73d7358cb798c014996d8ce24761b23f2f386 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 28 Oct 2024 14:26:27 -0700 Subject: [PATCH 126/421] Fix a couple concurrency bugs --- external/bonsai_stdlib | 2 +- generated/block_array_bitmap_688853862.h | 8 ++ ...k_queue_entry_build_chunk_mesh_688853862.h | 8 ++ generated/block_array_entity_688856407.h | 8 ++ generated/block_array_entity_ptr_688856411.h | 8 ++ ...lock_array_file_traversal_node_688853862.h | 8 ++ ...lock_array_gpu_readback_buffer_688853862.h | 8 ++ .../block_array_h_asset_thumbnail_688856411.h | 8 ++ .../block_array_h_shader_ptr_688853971_0.h | 8 ++ generated/block_array_h_texture_688856411.h | 8 ++ generated/block_array_h_texture_688856411_0.h | 8 ++ generated/block_array_h_u32_688856411.h | 8 ++ generated/block_array_h_u8_cursor_688856411.h | 8 ++ ...lock_array_h_world_chunk_ptr_688853862_0.h | 8 ++ generated/block_array_member_info_688856411.h | 8 ++ generated/block_array_model_688856411.h | 8 ++ .../block_array_standing_spot_688853862.h | 8 ++ generated/block_array_vox_data_688856411.h | 8 ++ ...lock_array_voxel_stack_element_688853862.h | 8 ++ ..._work_queue_entry__bonsai_render_command.h | 26 ++++- ..._work_queue_entry__bonsai_render_command.h | 4 +- .../do_editor_ui_for_compound_type_graphics.h | 4 +- .../do_editor_ui_for_compound_type_world.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 2 + generated/for_datatypes_fkubhsYl.h | 2 + generated/for_datatypes_kv3WBTai.h | 2 + generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- ..._work_queue_entry__bonsai_render_command.h | 11 ++ jesse.make.sh | 1 + src/engine/api.cpp | 33 +++--- src/engine/graphics.h | 9 +- src/engine/render_command.h | 8 ++ src/engine/resources.cpp | 100 ++++++++++++++---- src/engine/terrain.h | 2 +- src/engine/world.cpp | 35 +++--- src/engine/world.h | 18 +++- 43 files changed, 349 insertions(+), 72 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 4719c4fc7..8ee124ddf 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 4719c4fc704df5b01c3c5caa2b9ea89a6e459599 +Subproject commit 8ee124ddf8de8ea9c4d86b2f607f4e2101b14927 diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index 12a1fcfa0..a496e30c0 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -110,6 +110,14 @@ AtElements(bitmap_block_array *Arr) return Result; } +link_internal umm +Count(bitmap_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal bitmap * GetPtr(bitmap_block_array *Arr, bitmap_block_array_index Index) { diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index f6c3523b7..d1d5c20a2 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -110,6 +110,14 @@ AtElements(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) return Result; } +link_internal umm +Count(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal dummy_work_queue_entry_build_chunk_mesh * GetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) { diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index f70449469..b220e3afb 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -110,6 +110,14 @@ AtElements(entity_block_array *Arr) return Result; } +link_internal umm +Count(entity_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal entity * GetPtr(entity_block_array *Arr, entity_block_array_index Index) { diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h index 6c833292a..71aba0486 100644 --- a/generated/block_array_entity_ptr_688856411.h +++ b/generated/block_array_entity_ptr_688856411.h @@ -110,6 +110,14 @@ AtElements(entity_ptr_block_array *Arr) return Result; } +link_internal umm +Count(entity_ptr_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal entity_ptr * GetPtr(entity_ptr_block_array *Arr, entity_ptr_block_array_index Index) { diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index 86e54a9a1..069d4b257 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -110,6 +110,14 @@ AtElements(file_traversal_node_block_array *Arr) return Result; } +link_internal umm +Count(file_traversal_node_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal file_traversal_node * GetPtr(file_traversal_node_block_array *Arr, file_traversal_node_block_array_index Index) { diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index a8e1d5a99..fdab5184e 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -110,6 +110,14 @@ AtElements(gpu_readback_buffer_block_array *Arr) return Result; } +link_internal umm +Count(gpu_readback_buffer_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal gpu_readback_buffer * GetPtr(gpu_readback_buffer_block_array *Arr, gpu_readback_buffer_block_array_index Index) { diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 82b4a5127..cddfb4da5 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -110,6 +110,14 @@ AtElements(asset_thumbnail_block_array *Arr) return Result; } +link_internal umm +Count(asset_thumbnail_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal asset_thumbnail * GetPtr(asset_thumbnail_block_array *Arr, asset_thumbnail_block_array_index Index) { diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 4b7a53145..0b2c9fc58 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -110,6 +110,14 @@ AtElements(shader_ptr_block_array *Arr) return Result; } +link_internal umm +Count(shader_ptr_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal shader_ptr * GetPtr(shader_ptr_block_array *Arr, shader_ptr_block_array_index Index) { diff --git a/generated/block_array_h_texture_688856411.h b/generated/block_array_h_texture_688856411.h index 82048fa11..f1b0d3a1e 100644 --- a/generated/block_array_h_texture_688856411.h +++ b/generated/block_array_h_texture_688856411.h @@ -110,6 +110,14 @@ AtElements(texture_ptr_block_array *Arr) return Result; } +link_internal umm +Count(texture_ptr_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal texture_ptr * GetPtr(texture_ptr_block_array *Arr, texture_ptr_block_array_index Index) { diff --git a/generated/block_array_h_texture_688856411_0.h b/generated/block_array_h_texture_688856411_0.h index d74015a23..3d040122d 100644 --- a/generated/block_array_h_texture_688856411_0.h +++ b/generated/block_array_h_texture_688856411_0.h @@ -110,6 +110,14 @@ AtElements(texture_block_array *Arr) return Result; } +link_internal umm +Count(texture_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal texture * GetPtr(texture_block_array *Arr, texture_block_array_index Index) { diff --git a/generated/block_array_h_u32_688856411.h b/generated/block_array_h_u32_688856411.h index 5f3d078d6..dc65aaade 100644 --- a/generated/block_array_h_u32_688856411.h +++ b/generated/block_array_h_u32_688856411.h @@ -110,6 +110,14 @@ AtElements(u32_block_array *Arr) return Result; } +link_internal umm +Count(u32_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal u32 * GetPtr(u32_block_array *Arr, u32_block_array_index Index) { diff --git a/generated/block_array_h_u8_cursor_688856411.h b/generated/block_array_h_u8_cursor_688856411.h index 010baeb2f..4485d7132 100644 --- a/generated/block_array_h_u8_cursor_688856411.h +++ b/generated/block_array_h_u8_cursor_688856411.h @@ -110,6 +110,14 @@ AtElements(u8_cursor_block_array *Arr) return Result; } +link_internal umm +Count(u8_cursor_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal u8_cursor * GetPtr(u8_cursor_block_array *Arr, u8_cursor_block_array_index Index) { diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index 74d43129a..ab75cbfba 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -110,6 +110,14 @@ AtElements(world_chunk_ptr_block_array *Arr) return Result; } +link_internal umm +Count(world_chunk_ptr_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal world_chunk_ptr * GetPtr(world_chunk_ptr_block_array *Arr, world_chunk_ptr_block_array_index Index) { diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index 97b7677e7..ea24a13a0 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -110,6 +110,14 @@ AtElements(member_info_block_array *Arr) return Result; } +link_internal umm +Count(member_info_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal member_info * GetPtr(member_info_block_array *Arr, member_info_block_array_index Index) { diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 901c69953..46bf33806 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -110,6 +110,14 @@ AtElements(model_block_array *Arr) return Result; } +link_internal umm +Count(model_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal model * GetPtr(model_block_array *Arr, model_block_array_index Index) { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 5bad149ce..421e62dfe 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -110,6 +110,14 @@ AtElements(standing_spot_block_array *Arr) return Result; } +link_internal umm +Count(standing_spot_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal standing_spot * GetPtr(standing_spot_block_array *Arr, standing_spot_block_array_index Index) { diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index 222154740..aabe963b8 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -110,6 +110,14 @@ AtElements(vox_data_block_array *Arr) return Result; } +link_internal umm +Count(vox_data_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal vox_data * GetPtr(vox_data_block_array *Arr, vox_data_block_array_index Index) { diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index afc17acf1..e62779150 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -110,6 +110,14 @@ AtElements(voxel_stack_element_block_array *Arr) return Result; } +link_internal umm +Count(voxel_stack_element_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + link_internal voxel_stack_element * GetPtr(voxel_stack_element_block_array *Arr, voxel_stack_element_block_array_index Index) { diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index 950a4fcbb..17db3b278 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:210:0 +// src/engine/render_command.h:218:0 link_internal work_queue_entry__bonsai_render_command @@ -270,6 +270,19 @@ WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_gl_timer_read_value_and + }; + return Result; +} + +link_internal work_queue_entry__bonsai_render_command +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_cancel_all_noise_readback_jobs A ) +{ + work_queue_entry__bonsai_render_command Result = { + .Type = type_bonsai_render_command_cancel_all_noise_readback_jobs, + .bonsai_render_command_cancel_all_noise_readback_jobs = A, + + + }; return Result; } @@ -537,3 +550,14 @@ BonsaiRenderCommandGlTimerReadValueAndHistogram( u32 GlTimerObject ) return Reuslt; } +link_internal bonsai_render_command_cancel_all_noise_readback_jobs +BonsaiRenderCommandCancelAllNoiseReadbackJobs( ) +{ + bonsai_render_command_cancel_all_noise_readback_jobs Reuslt = { + + }; + + + return Reuslt; +} + diff --git a/generated/d_union_work_queue_entry__bonsai_render_command.h b/generated/d_union_work_queue_entry__bonsai_render_command.h index d5733bd6b..67ed96697 100644 --- a/generated/d_union_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:171:0 +// src/engine/render_command.h:177:0 enum work_queue_entry__bonsai_render_command_type { @@ -24,6 +24,7 @@ enum work_queue_entry__bonsai_render_command_type type_bonsai_render_command_gl_timer_start, type_bonsai_render_command_gl_timer_end, type_bonsai_render_command_gl_timer_read_value_and_histogram, + type_bonsai_render_command_cancel_all_noise_readback_jobs, }; struct work_queue_entry__bonsai_render_command @@ -53,6 +54,7 @@ struct work_queue_entry__bonsai_render_command struct bonsai_render_command_gl_timer_start bonsai_render_command_gl_timer_start; struct bonsai_render_command_gl_timer_end bonsai_render_command_gl_timer_end; struct bonsai_render_command_gl_timer_read_value_and_histogram bonsai_render_command_gl_timer_read_value_and_histogram; + struct bonsai_render_command_cancel_all_noise_readback_jobs bonsai_render_command_cancel_all_noise_readback_jobs; }; }; diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 31843f622..a8058ae42 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -372,8 +372,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->ChunksCurrentlyQueued), - CSz("ChunksCurrentlyQueued"), + Cast(u32*,&Element->NoiseFinalizeJobsPending), + CSz("NoiseFinalizeJobsPending"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 7af5c5475..93752ac2d 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -74,7 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*,&Element->OctreeMemory), + Cast(memory_arena*, Element->OctreeMemory), CSz("OctreeMemory"), Params ); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index bb9bfd83e..21c7566ca 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -198,6 +198,8 @@ + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index f92848ec5..870c43ff5 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -198,6 +198,8 @@ + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index a1344cd44..7785fa902 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -198,6 +198,8 @@ + + diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 931624858..d56e7c0e0 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:240:0 +// external/bonsai_stdlib/src/shader.cpp:249:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, m4 *Value) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index b93b85fad..d5e18ac23 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:255:0 +// external/bonsai_stdlib/src/shader.cpp:264:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, r32 *Value) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index 192923243..d7c4ca5b5 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:252:0 +// external/bonsai_stdlib/src/shader.cpp:261:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, s32 *Value) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index e22541981..75e4a9150 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:237:0 +// external/bonsai_stdlib/src/shader.cpp:246:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, texture *Value) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index e90dfa6a6..fde28c3bf 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:249:0 +// external/bonsai_stdlib/src/shader.cpp:258:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, u32 *Value) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index c4d8681ab..8c1c55e32 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:243:0 +// external/bonsai_stdlib/src/shader.cpp:252:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, v2 *Value) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index f25c38770..f26492a9c 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:246:0 +// external/bonsai_stdlib/src/shader.cpp:255:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, v3 *Value) diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index d5969afcc..9b1773481 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.cpp:538:0 +// src/engine/world.h:44:0 struct octree_node_ptr_cursor { diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index c70666706..5a00a4225 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -231,6 +231,17 @@ PushBonsaiRenderCommandGlTimerReadValueAndHistogram( PushWorkQueueEntry(RenderQueue, &Work); } +link_internal void +PushBonsaiRenderCommandCancelAllNoiseReadbackJobs( + work_queue *RenderQueue + +) +{ + work_queue_entry Work = WorkQueueEntry( + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandCancelAllNoiseReadbackJobs( ))); + + PushWorkQueueEntry(RenderQueue, &Work); +} diff --git a/jesse.make.sh b/jesse.make.sh index 49caf8fac..69863b0a3 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,7 @@ #! /usr/bin/env bash OPT="-O2" +# ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 01f8c6f83..bea9f3577 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -90,9 +90,17 @@ Bonsai_FrameBegin(engine_resources *Resources) if (Resources->Graphics.GpuNoise.TerrainShader.Program.HotReloaded) { auto Plat = &Resources->Stdlib.Plat; + + /* RuntimeBreak(); */ + PushBonsaiRenderCommandCancelAllNoiseReadbackJobs(&Plat->RenderQ); + SignalAndWaitForWorkers(&Plat->WorkerThreadsSuspendFutex); CancelAllWorkQueueJobs(Resources); - SoftResetWorld(Resources); + Assert(Count(&Resources->Graphics.NoiseReadbackJobs) == 0); + + Resources->Graphics.NoiseFinalizeJobsPending = 0; + + HardResetWorld(Resources); UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); } @@ -606,18 +614,13 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ v3i NoiseDim = Job->NoiseDim; Assert(NoiseValues); - /* auto E = WorkQueueEntry(WorkQueueEntryBuildChunkMesh(C->ChunkSize, C->NoiseValues)); */ - /* PushWorkQueueEntry(&Plat->LowPriority, &E); */ - world_chunk *DestChunk = Chunk1; - /* world_chunk *SynChunk = HeapAllocateWorldChunk({}, Chunk1->Dim + V3i(0, 2, 2), V3i(1)); */ - /* world_chunk *SynChunk = AllocateWorldChunk({}, Chunk1->Dim + V3i(0, 2, 2), V3i(1), GetThreadLocalState(ThreadLocal_ThreadIndex)->PermMemory); */ world_chunk *SynChunk = GetOrAllocate(&UserData->SynChunkFreelist, {}, Chunk1->Dim + V3i(0, 2, 2), Chunk1->DimInChunks, Thread->PermMemory); - Assert(SynChunk->Dim == V3i(64, 66, 66)); - /* WorldChunk(SynChunk, {}, Chunk1->Dim + V3i(0, 2, 2), Chunk1->DimInChunks); */ SynChunk->Flags = Chunk_Queued; + + Assert(SynChunk->Dim == V3i(64, 66, 66)); + v3i WorldBasis = {}; - v3i SynChunkDim = SynChunk->Dim; v3i SrcToDest = {}; s64 zMin = 0; @@ -625,7 +628,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ if (ChunkSum && ChunkSum < u32(Volume(SynChunk->Dim))) { - MakeFaceMasks_NoExteriorFaces(SynChunk->Occupancy, SynChunk->xOccupancyBorder, SynChunk->FaceMasks, SynChunk->Voxels, SynChunkDim, {}, SynChunkDim); + MakeFaceMasks_NoExteriorFaces(SynChunk->Occupancy, SynChunk->xOccupancyBorder, SynChunk->FaceMasks, SynChunk->Voxels, SynChunk->Dim, {}, SynChunk->Dim); Assert(DestChunk->FilledCount == 0); Assert(DestChunk->Dim.x == 64); @@ -662,15 +665,13 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ } auto Graphics = &EngineResources->Graphics; - Assert(Graphics->ChunksCurrentlyQueued > 0); - AtomicDecrement(&Graphics->ChunksCurrentlyQueued); // NOTE(Jesse): The CPU initializer obviously doesn't need to deallocate // a PBO, so it sets the PBO handle to -1 - if (Job->PBOBuf.PBO != INVALID_PBO_HANDLE) - { - PushBonsaiRenderCommandUnmapAndDeallocateBuffer(RenderQ, Job->PBOBuf); - } + Assert(Job->PBOBuf.PBO != INVALID_PBO_HANDLE); + PushBonsaiRenderCommandUnmapAndDeallocateBuffer(RenderQ, Job->PBOBuf); + Assert(Graphics->NoiseFinalizeJobsPending); + AtomicDecrement(&Graphics->NoiseFinalizeJobsPending); } break; { tmatch(work_queue_entry_build_chunk_mesh, Entry, Job) diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 70c10eded..34a8ac3cb 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -122,8 +122,13 @@ struct graphics composite_render_group CompositeGroup; gpu_noise_render_group GpuNoise; - volatile u32 ChunksCurrentlyQueued; - /* gpu_readback_buffer_block_array NoiseReadbackJobs; */ + // NOTE(Jesse): The array NoiseReadbackJobs stores the PBOs, but there's a 3 + // step process going on. First, the job is dispatched (copy values into PBO) + // then the job is complete (values copied, not used by app yet), then the + // NoiseFinalize is done, and the job is completed. NoiseFinalizeJobsPending + // tracks this third stage. + // + volatile u32 NoiseFinalizeJobsPending; dummy_work_queue_entry_build_chunk_mesh_block_array NoiseReadbackJobs; gpu_mapped_element_buffer GpuBuffers[2]; diff --git a/src/engine/render_command.h b/src/engine/render_command.h index a0e78e73b..23649f2ba 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -166,6 +166,12 @@ struct bonsai_render_command_unmap_and_deallocate_buffer gpu_readback_buffer PBOBuf; }; +struct bonsai_render_command_cancel_all_noise_readback_jobs +{ + // NOTE(Jesse): The thing that generates constructors and push functions + // doesn't know about enum_only .. so we have to create a dummy struct for this. +}; + poof( d_union work_queue_entry__bonsai_render_command @@ -203,6 +209,8 @@ poof( bonsai_render_command_gl_timer_start bonsai_render_command_gl_timer_end bonsai_render_command_gl_timer_read_value_and_histogram + + bonsai_render_command_cancel_all_noise_readback_jobs } ) #include diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 36e159a83..2cbd32ff7 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -29,7 +29,7 @@ RenderOctree(engine_resources *Engine, shader *Shader) b32 Continue = True; - octree_node_ptr_stack Stack = OctreeNodePtrStack(1024, &World->OctreeMemory); + octree_node_ptr_stack Stack = OctreeNodePtrStack(1024, World->OctreeMemory); Push(&Stack, &World->Root); /* RuntimeBreak(); */ @@ -103,6 +103,54 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { InvalidCase(type_work_queue_entry__bonsai_render_command_noop); + { case type_bonsai_render_command_cancel_all_noise_readback_jobs: + TIMED_NAMED_BLOCK(CancelReadbackJobs); + + IterateOver(&Graphics->NoiseReadbackJobs, PBOJob, JobIndex) + { + b32 Done = False; + while (!Done) + { + u32 SyncStatus = GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); + switch(SyncStatus) + { + case GL_ALREADY_SIGNALED: + case GL_CONDITION_SATISFIED: + { + AtomicDecrement(&Graphics->NoiseFinalizeJobsPending); + TIMED_NAMED_BLOCK(MapBuffer); + AssertNoGlErrors; + GL.DeleteBuffers(1, &PBOJob->PBOBuf.PBO); + GL.DeleteSync(PBOJob->PBOBuf.Fence); + AssertNoGlErrors; + /* RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); */ + Done = True; + } break; + + case GL_WAIT_FAILED: + { + /* RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); */ + SoftError("Error waiting on gl sync object"); + } break; + + case GL_TIMEOUT_EXPIRED: + { + SleepMs(1); + } break; + } + } + AssertNoGlErrors; + } + + // Clear the jobs + umm C = Count(&Graphics->NoiseReadbackJobs); + auto Z = ZerothIndex(&Graphics->NoiseReadbackJobs); + RangeIterator_t(umm, Index, C) { RemoveUnordered(&Graphics->NoiseReadbackJobs, Z); } + Assert(Count(&Graphics->NoiseReadbackJobs) == 0); + + /* Assert(Graphics->NoiseFinalizeJobsPending == 0); */ + } break; + { tmatch(bonsai_render_command_allocate_and_map_gpu_element_buffer, RC, Command) TIMED_NAMED_BLOCK(bonsai_render_command_allocate_and_map_gpu_element_buffer); @@ -132,6 +180,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) GL.UnmapBuffer(GL_PIXEL_PACK_BUFFER); AssertNoGlErrors; GL.DeleteBuffers(1, &PBOBuf.PBO); + GL.DeleteSync(PBOBuf.Fence); AssertNoGlErrors; } break; @@ -263,6 +312,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TIMED_NAMED_BLOCK(bonsai_render_command_initialize_noise_buffer); /* Command = 0; */ + AtomicIncrement(&Graphics->NoiseFinalizeJobsPending); + bonsai_render_command_initialize_noise_buffer C = RC->bonsai_render_command_initialize_noise_buffer; world_chunk **Chunk2 = &C.Chunk; @@ -483,8 +534,13 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->Chunk)); PushWorkQueueEntry(&Plat->LowPriority, &BuildMeshJob); + // TODO(Jesse): This actually makes the loop skip a job because we + // shorten the array, but never update the index we're looking at. + // + // It doesn't matter in this case because this runs every frame, so + // the skipped job is just a frame late. But, it would be nice if + // this was better. RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); - } break; case GL_TIMEOUT_EXPIRED: @@ -493,18 +549,17 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case GL_WAIT_FAILED: { - AtomicDecrement(&Graphics->ChunksCurrentlyQueued); SoftError("Error waiting on gl sync object"); } break; } } } - SleepMs(1); - if (FutexIsSignaled(ThreadParams->WorkerThreadsExitFutex)) break; if (FutexIsSignaled(ThreadParams->WorkerThreadsSuspendFutex)) { WaitOnFutex(ThreadParams->WorkerThreadsSuspendFutex); } + + SleepMs(1); } Info("Exiting Render Thread (%d)", ThreadParams->ThreadIndex); @@ -641,7 +696,13 @@ CancelAllWorkQueueJobs(engine_resources *Engine) CancelAllWorkQueueJobs(Plat, &Plat->HighPriority); CancelAllWorkQueueJobs(Plat, &Plat->LowPriority); + + // NOTE(Jesse): The RendeQ flushes before it suspends, and at the time of this + // writing the application depends on this behavior. Some render queue jobs + // have knowledge of who to call next (because we don't have a way of specifying + // the next next job when we submit one). This makes it difficult to CancelAllWorkQueueJobs(Plat, &Plat->RenderQ); + Assert(QueueIsEmpty(&Plat->RenderQ)); } link_internal void @@ -693,29 +754,30 @@ SoftResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag -link_internal void -SoftResetWorld(engine_resources *Engine) -{ - world *World = Engine->World; +/* link_internal void */ +/* SoftResetWorld(engine_resources *Engine) */ +/* { */ +/* world *World = Engine->World; */ - MergeOctreeChildren(Engine, &World->Root); +/* MergeOctreeChildren(Engine, &World->Root); */ - if (World->Root.Chunk) - { - FreeWorldChunk(Engine, World->Root.Chunk); - } - World->Root = {}; +/* if (World->Root.Chunk) */ +/* { */ +/* FreeWorldChunk(Engine, World->Root.Chunk); */ +/* } */ +/* World->Root = {}; */ - InitOctreeNode(World, &World->Root, {}, World->VisibleRegion); - World->Root.Chunk = AllocateWorldChunk( {}, World->ChunkDim, World->VisibleRegion, World->ChunkMemory); -} +/* InitOctreeNode(World, &World->Root, {}, World->VisibleRegion); */ +/* World->Root.Chunk = AllocateWorldChunk( {}, World->ChunkDim, World->VisibleRegion, World->ChunkMemory); */ + +/* } */ link_internal void HardResetWorld(engine_resources *Engine) { world *World = Engine->World; VaporizeArena(World->ChunkMemory); - VaporizeArena(&World->OctreeMemory); + VaporizeArena(World->OctreeMemory); v3i Center = World->Center; v3i ChunkDim = World->ChunkDim; diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 6d47b6e93..9e571c10a 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -216,7 +216,7 @@ MapNoiseValueToFinal(f32 Value) {{0.65f, 0.43f }}, {{0.6f, 0.4f }}, {{0.5f, 0.1f }}, - {{0.0f, 0.0f }}, + {{-1.0f, -1.0f }}, }; // Pillar-y diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 8e2a2a8aa..461bcabe0 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -11,6 +11,11 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) World->ChunkMemory = WorldChunkMemory; DEBUG_REGISTER_ARENA(World->ChunkMemory, 0); + memory_arena *OctreeMemory = AllocateArena(Megabytes(8)); + World->OctreeMemory = OctreeMemory; + DEBUG_REGISTER_ARENA(World->ChunkMemory, 0); + + /* World->HashSize = (u32)(Volume(VisibleRegion)*4); */ /* World->HashSize = WorldHashSize; */ /* World->ChunkHashMemory[0] = Allocate(world_chunk*, WorldChunkMemory, World->HashSize ); */ @@ -29,16 +34,19 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) InitOctreeNode(World, &World->Root, {}, VisibleRegion); World->Root.Chunk = AllocateWorldChunk( {}, WorldChunkDim, VisibleRegion, World->ChunkMemory); - /* AllocateWorldChunk(&World->Root.Chunk, {}, WorldChunkDim, VisibleRegion, World->ChunkMemory); */ + auto Engine = GetEngineResources(); - /* SplitOctreeNode(World, &Plat->LowPriority, EntityTable, Camera, &World->Root, &World->OctreeMemory); */ - - World->OctreeNodeFreelist.Memory = &World->OctreeMemory; + World->OctreeNodeFreelist.Memory = World->OctreeMemory; World->ChunkDim = WorldChunkDim; World->VisibleRegion = VisibleRegion; World->Center = Center; + // NOTE(Jesse): We can use an unallocated queue here because we're not actually + // gonna do anything with the results.. we just want to initialize the tree + octree_node_priority_queue Queue = {}; + SplitOctreeNode_Recursive(Engine, &Queue, &World->Root, 0, World->OctreeMemory); + return World; } @@ -531,21 +539,11 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) Result = True; } } + return Result; } -poof(generate_cursor(octree_node_ptr)) -#include - -#define OCTREE_PRIORITY_QUEUE_LIST_COUNT (512) -#define OCTREE_PRIORITY_QUEUE_LIST_LENGTH (128) -#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (256) -struct octree_node_priority_queue -{ - octree_node_ptr_cursor Lists[OCTREE_PRIORITY_QUEUE_LIST_COUNT]; -}; - link_internal void PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_priority_queue *Queue, octree_node *Node, octree_node *Parent) { @@ -955,11 +953,12 @@ MaintainWorldOctree(engine_resources *Engine) Queue.Lists[ListIndex] = OctreeNodePtrCursor(OCTREE_PRIORITY_QUEUE_LIST_LENGTH, GetTranArena()); } - SplitOctreeNode_Recursive(Engine, &Queue, &World->Root, 0, &World->OctreeMemory); + SplitOctreeNode_Recursive(Engine, &Queue, &World->Root, 0, World->OctreeMemory); octree_stats Stats = {}; - u32 ChunksCurrentlyQueued = Graphics->ChunksCurrentlyQueued; + /* u32 ChunksCurrentlyQueued = u32(Count(&Graphics->NoiseReadbackJobs)); */ + u32 ChunksCurrentlyQueued = u32(Graphics->NoiseFinalizeJobsPending); u32 MaxToQueueThisFrame = Max(0u, MAX_OCTREE_NODES_QUEUED_PER_FRAME - ChunksCurrentlyQueued); Assert(MaxToQueueThisFrame <= MAX_OCTREE_NODES_QUEUED_PER_FRAME); @@ -1008,8 +1007,6 @@ MaintainWorldOctree(engine_resources *Engine) /* QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); */ QueueChunkForInit(&Plat->RenderQ, Node->Chunk, MeshBit_Lod0); ++Stats.NewQueues; - AtomicIncrement(&Graphics->ChunksCurrentlyQueued); - if (++NumQueuedThisFrame == MaxToQueueThisFrame) goto done_queueing_nodes; } } diff --git a/src/engine/world.h b/src/engine/world.h index d6398b880..09d05d137 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -41,6 +41,9 @@ poof(freelist_allocator(octree_node)) poof(freelist_allocator(world_chunk)) #include +poof(generate_cursor(octree_node_ptr)) +#include + struct world { v3i Center; // the world chunk position of the center of the visible region @@ -52,7 +55,7 @@ struct world /* world_chunk **ChunkHash; poof(@array_length(Element->HashSize)) */ octree_node Root; - memory_arena OctreeMemory; + memory_arena *OctreeMemory; octree_node_freelist OctreeNodeFreelist; octree_node_freelist OctreeNodeDeferFreelist; // Chunks that were queued, to be freed later. @@ -201,6 +204,15 @@ TryGetVoxel(world *World, cp P) } +#define OCTREE_PRIORITY_QUEUE_LIST_COUNT (512) +#define OCTREE_PRIORITY_QUEUE_LIST_LENGTH (128) +#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (25) +struct octree_node_priority_queue +{ + octree_node_ptr_cursor Lists[OCTREE_PRIORITY_QUEUE_LIST_COUNT]; +}; + + link_internal world * GetWorld(); link_internal void @@ -220,3 +232,7 @@ InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks); link_internal world * AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion); + + +link_internal void +SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue *Queue, octree_node *NodeToSplit, octree_node *Parent, memory_arena *Memory); From 175dfb4371682cc1aa7cb45451a8499848c1962b Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 29 Oct 2024 08:21:04 -0700 Subject: [PATCH 127/421] Add gpu_timer to profile shader execution --- examples/terrain_gen/game_constants.h | 4 +- external/bonsai_stdlib | 2 +- generated/block_array_c_gpu_timer_688735882.h | 92 ++++++++++ ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../block_array_h_gpu_timer_688735882_0.h | 172 ++++++++++++++++++ .../do_editor_ui_for_compound_type_graphics.h | 15 ++ generated/for_datatypes_0XxWqGSZ.h | 9 + generated/for_datatypes_fkubhsYl.h | 9 + generated/for_datatypes_kv3WBTai.h | 9 + .../gen_constructor_gpu_readback_buffer.h | 2 +- shaders/terrain/cliffy_hills.fragmentshader | 11 +- src/engine/engine.cpp | 2 + src/engine/engine.h | 2 + src/engine/graphics.h | 4 +- src/engine/render/gpu_timer.c | 50 +++++ src/engine/render/gpu_timer.cpp | 3 + src/engine/render/gpu_timer.h | 51 ++++++ src/engine/render/render_init.cpp | 4 +- src/engine/resources.cpp | 22 +++ src/engine/world.cpp | 2 - 21 files changed, 452 insertions(+), 17 deletions(-) create mode 100644 generated/block_array_c_gpu_timer_688735882.h create mode 100644 generated/block_array_h_gpu_timer_688735882_0.h create mode 100644 src/engine/render/gpu_timer.c create mode 100644 src/engine/render/gpu_timer.cpp create mode 100644 src/engine/render/gpu_timer.h diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 3cde4bfd3..d542edd02 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -16,10 +16,10 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ -g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km +/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ -/* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ +g_VisibleRegion = Chunk_Dimension(64, 64, 64); /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 8ee124ddf..de3517db7 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 8ee124ddf8de8ea9c4d86b2f607f4e2101b14927 +Subproject commit de3517db73c290fb48499485b61c26e575a3730e diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h new file mode 100644 index 000000000..a54091756 --- /dev/null +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -0,0 +1,92 @@ +// src/engine/render/gpu_timer.cpp:1:0 + + +link_internal gpu_timer_block* +Allocate_gpu_timer_block(memory_arena *Memory) +{ + gpu_timer_block *Result = Allocate(gpu_timer_block, Memory, 1); + Result->Elements = Allocate(gpu_timer, Memory, 128); + return Result; +} + +link_internal cs +CS(gpu_timer_block_array_index Index) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal void +RemoveUnordered(gpu_timer_block_array *Array, gpu_timer_block_array_index Index) +{ + gpu_timer_block_array_index LastI = LastIndex(Array); + + gpu_timer *Element = GetPtr(Array, Index); + gpu_timer *LastElement = GetPtr(Array, LastI); + + *Element = *LastElement; + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + gpu_timer_block *Current = Array->First; + gpu_timer_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal gpu_timer * +Push(gpu_timer_block_array *Array, gpu_timer *Element) +{ + if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + + if (Array->First == 0) { Array->First = Allocate_gpu_timer_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 128) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + gpu_timer_block *Next = Allocate_gpu_timer_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + gpu_timer *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index d1d5c20a2..9587e0e7c 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:67:0 +// src/engine/graphics.h:65:0 struct dummy_work_queue_entry_build_chunk_mesh_block { diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index fdab5184e..c2061066a 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:56:0 +// src/engine/graphics.h:54:0 struct gpu_readback_buffer_block { diff --git a/generated/block_array_h_gpu_timer_688735882_0.h b/generated/block_array_h_gpu_timer_688735882_0.h new file mode 100644 index 000000000..c0d5d2519 --- /dev/null +++ b/generated/block_array_h_gpu_timer_688735882_0.h @@ -0,0 +1,172 @@ +// src/engine/render/gpu_timer.h:9:0 + +struct gpu_timer_block +{ + u32 Index; + u32 At; + gpu_timer *Elements; + gpu_timer_block *Next; +}; + +struct gpu_timer_block_array_index +{ + gpu_timer_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct gpu_timer_block_array +{ + gpu_timer_block *First; + gpu_timer_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +typedef gpu_timer_block_array gpu_timer_paged_list; + +link_internal gpu_timer_block_array_index +operator++(gpu_timer_block_array_index &I0) +{ + if (I0.Block) + { + if (I0.ElementIndex == 128-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<(gpu_timer_block_array_index I0, gpu_timer_block_array_index I1) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex(gpu_timer_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*128); + return Result; +} + +link_internal gpu_timer_block_array_index +ZerothIndex(gpu_timer_block_array *Arr) +{ + gpu_timer_block_array_index Result = {}; + Result.Block = Arr->First; + /* Assert(Result.Block->Index == 0); */ + return Result; +} + +link_internal umm +TotalElements(gpu_timer_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 128) + Arr->Current->At; + } + return Result; +} + +link_internal gpu_timer_block_array_index +LastIndex(gpu_timer_block_array *Arr) +{ + gpu_timer_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal gpu_timer_block_array_index +AtElements(gpu_timer_block_array *Arr) +{ + gpu_timer_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal umm +Count(gpu_timer_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + +link_internal gpu_timer * +GetPtr(gpu_timer_block_array *Arr, gpu_timer_block_array_index Index) +{ + gpu_timer *Result = {}; + if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + return Result; +} + +link_internal gpu_timer * +GetPtr(gpu_timer_block *Block, umm Index) +{ + gpu_timer *Result = 0; + if (Index < Block->At) { Result = Block->Elements + Index; } + return Result; +} + +link_internal gpu_timer * +GetPtr(gpu_timer_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 128; + umm ElementIndex = Index % 128; + + umm AtBlock = 0; + gpu_timer_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + gpu_timer *Result = Block->Elements+ElementIndex; + return Result; +} + +link_internal gpu_timer * +TryGetPtr(gpu_timer_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 128; + umm ElementIndex = Index % 128; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + gpu_timer *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(gpu_timer_block *Block) +{ + return Block->At; +} + diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index a8058ae42..7163ce9f9 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -433,6 +433,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u PushNewRow(Ui); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(gpu_timer_block_array*,&Element->GpuTimers), + CSz("GpuTimers"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 21c7566ca..d1940c870 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -196,6 +196,12 @@ + + + + + + @@ -682,6 +688,9 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 870c43ff5..961efe96e 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -196,6 +196,12 @@ + + + + + + @@ -672,6 +678,9 @@ render_to_texture_async_params render_to_texture_async_params; + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 7785fa902..c1438143d 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -196,6 +196,12 @@ + + + + + + @@ -672,6 +678,9 @@ type_render_to_texture_async_params, + + + diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index 86fd9768b..844b1a672 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:53:0 +// src/engine/graphics.h:51:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/shaders/terrain/cliffy_hills.fragmentshader b/shaders/terrain/cliffy_hills.fragmentshader index fc9410c70..e6f0a423b 100644 --- a/shaders/terrain/cliffy_hills.fragmentshader +++ b/shaders/terrain/cliffy_hills.fragmentshader @@ -466,11 +466,11 @@ void main() // -- user code -- // { - v3 Period = V3(800.f); - float Amplitude = 800.f; + v3 Period = V3(10000.f); + float Amplitude = 10000.f; /* f32 StartingZDepth = -800; */ - f32 StartingZDepth = 5000; - s32 Octaves = 2; + f32 StartingZDepth = 15000; + s32 Octaves = 6; NoiseValue = StartingZDepth; @@ -631,7 +631,8 @@ void main() // Bias noise value to lower values as we get higher in z. // This creates a "plane" of terrain - NoiseValue = NoiseValue - Basis.z; + /* NoiseValue = NoiseValue - Basis.z + sin(Basis.x/500.f)*1000.f; */ + NoiseValue = NoiseValue - Basis.z + sin(Basis.x/5000.f)*10000.f - cos(Basis.y/8000.f)*8000.f;; } // diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 5b95168c6..4a25f797e 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1,4 +1,6 @@ +#include + #include #include diff --git a/src/engine/engine.h b/src/engine/engine.h index a9ac779de..66640e223 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -4,6 +4,7 @@ #include #include + #include #include #include @@ -24,6 +25,7 @@ link_internal engine_resources *GetEngineResources(); #include #include +#include #include #include #include diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 34a8ac3cb..34e29b342 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -19,8 +19,6 @@ poof(shader_magic(terrain_shader)) struct gpu_noise_render_group { framebuffer FBO; - u32 GlTimerObject; - terrain_shader TerrainShader; }; @@ -134,5 +132,7 @@ struct graphics gpu_mapped_element_buffer GpuBuffers[2]; u32 GpuBufferWriteIndex; + gpu_timer_block_array GpuTimers; + memory_arena *Memory; }; diff --git a/src/engine/render/gpu_timer.c b/src/engine/render/gpu_timer.c new file mode 100644 index 000000000..d9d4f914b --- /dev/null +++ b/src/engine/render/gpu_timer.c @@ -0,0 +1,50 @@ +#define INVALID_GPU_TIMER_HANDLE (0xFFFFFFFF) + +struct gpu_timer +{ + u32 Handle = INVALID_GPU_TIMER_HANDLE; + u64 Ns; +}; + +poof(block_array_h(gpu_timer)) + +global_variable b32 Global_ActiveGPUTimer; + +link_internal gpu_timer +StartGpuTimer(void) +{ + Assert(Global_ActiveGPUTimer == False); + Global_ActiveGPUTimer = True; + + gpu_timer Result = {}; + GL.GenQueries(1, &Result.Handle); + Assert(Result.Handle != INVALID_GPU_TIMER_HANDLE); + + GL.BeginQuery(GL_TIME_ELAPSED, Result.Handle); + return Result; +} + +link_internal void +EndGpuTimer(gpu_timer *Timer) +{ + GL.EndQuery(GL_TIME_ELAPSED); + Assert(Global_ActiveGPUTimer == True); + Global_ActiveGPUTimer = False; +} + +link_internal s32 +QueryTimer(gpu_timer *Timer) +{ + Assert(Timer->Handle != INVALID_GPU_TIMER_HANDLE); + s32 Available = False; + GL.GetQueryObjectiv(Timer->Handle, GL_QUERY_RESULT_AVAILABLE, &Available); + + if (Available) + { + GL.GetQueryObjectui64v(Timer->Handle, GL_QUERY_RESULT, &Timer->Ns); + GL.DeleteQueries(1, &Timer->Handle); + Timer->Handle = INVALID_GPU_TIMER_HANDLE; + } + + return Available; +} diff --git a/src/engine/render/gpu_timer.cpp b/src/engine/render/gpu_timer.cpp new file mode 100644 index 000000000..57a3b730b --- /dev/null +++ b/src/engine/render/gpu_timer.cpp @@ -0,0 +1,3 @@ +poof(block_array_c(gpu_timer, {128})) +#include + diff --git a/src/engine/render/gpu_timer.h b/src/engine/render/gpu_timer.h new file mode 100644 index 000000000..1c13cdda4 --- /dev/null +++ b/src/engine/render/gpu_timer.h @@ -0,0 +1,51 @@ +#define INVALID_GPU_TIMER_HANDLE (0xFFFFFFFF) + +struct gpu_timer +{ + u32 Handle = INVALID_GPU_TIMER_HANDLE; + u64 Ns; +}; + +poof(block_array_h(gpu_timer, {128}, {})) +#include + +global_variable b32 Global_ActiveGPUTimer; + +link_internal gpu_timer +StartGpuTimer(void) +{ + Assert(Global_ActiveGPUTimer == False); + Global_ActiveGPUTimer = True; + + gpu_timer Result = {}; + GL.GenQueries(1, &Result.Handle); + Assert(Result.Handle != INVALID_GPU_TIMER_HANDLE); + + GL.BeginQuery(GL_TIME_ELAPSED, Result.Handle); + return Result; +} + +link_internal void +EndGpuTimer(gpu_timer *Timer) +{ + GL.EndQuery(GL_TIME_ELAPSED); + Assert(Global_ActiveGPUTimer == True); + Global_ActiveGPUTimer = False; +} + +link_internal s32 +QueryGpuTimer(gpu_timer *Timer) +{ + Assert(Timer->Handle != INVALID_GPU_TIMER_HANDLE); + s32 Available = False; + GL.GetQueryObjectiv(Timer->Handle, GL_QUERY_RESULT_AVAILABLE, &Available); + + if (Available) + { + GL.GetQueryObjectui64v(Timer->Handle, GL_QUERY_RESULT, &Timer->Ns); + GL.DeleteQueries(1, &Timer->Handle); + Timer->Handle = INVALID_GPU_TIMER_HANDLE; + } + + return Available; +} diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 3940eba42..1c413f6f3 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -766,8 +766,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Result->GpuNoise.FBO = GenFramebuffer(); - GL.GenQueries(1, &Result->GpuNoise.GlTimerObject); - Assert(Result->GpuNoise.GlTimerObject); + /* GL.GenQueries(1, &Result->GpuNoise.GlTimerObject); */ + /* Assert(Result->GpuNoise.GlTimerObject); */ GL.BindFramebuffer(GL_FRAMEBUFFER, Result->GpuNoise.FBO.ID); diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 2cbd32ff7..0bccfc496 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -338,7 +338,13 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) SetViewport(ViewportSize); UseShader(Shader); + + gpu_timer NoiseShaderTimer = StartGpuTimer(); RenderQuad(); + EndGpuTimer(&NoiseShaderTimer); + + Push(&Graphics->GpuTimers, &NoiseShaderTimer); + AssertNoGlErrors; } @@ -462,6 +468,22 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) Graphics->RenderGate = False; + IterateOver(&Graphics->GpuTimers, Timer, TimerIndex) + { + if (Timer->Ns == 0) + { + if (QueryGpuTimer(Timer)) + { +#if BONSAI_DEBUG_SYSTEM_API + GetDebugState()->PushHistogramDataPoint(Timer->Ns); + // NOTE(Jesse): This skips the next timer, but it'll get hit + // on the next frame, so no worries .. + RemoveUnordered(&Graphics->GpuTimers, TimerIndex); +#endif + } + } + } + } break; { tmatch(bonsai_render_command_gl_timer_init, RC, Command) diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 461bcabe0..38727da75 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -15,7 +15,6 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) World->OctreeMemory = OctreeMemory; DEBUG_REGISTER_ARENA(World->ChunkMemory, 0); - /* World->HashSize = (u32)(Volume(VisibleRegion)*4); */ /* World->HashSize = WorldHashSize; */ /* World->ChunkHashMemory[0] = Allocate(world_chunk*, WorldChunkMemory, World->HashSize ); */ @@ -24,7 +23,6 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) /* World->ChunkHash = World->ChunkHashMemory[0]; */ /* World->FreeChunks = Allocate(world_chunk*, WorldChunkMemory, FREELIST_SIZE ); */ - Assert(VisibleRegion.x == VisibleRegion.y); Assert(VisibleRegion.y == VisibleRegion.z); From c3d55910bb6fcc56d2cebc4a10a4888f734a3fc2 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 29 Oct 2024 09:39:47 -0700 Subject: [PATCH 128/421] Persist render_settings to disk --- .../anonymous_render_settings_0_wwLVyABc.h | 2 +- .../anonymous_render_settings_1_pFpWPpyN.h | 21 +++ generated/are_equal_render_settings.h | 25 +++ generated/default_marshal_level_header_3.h | 2 +- generated/deserialize_struct_level_header.h | 2 +- generated/deserialize_struct_level_header_0.h | 2 +- generated/deserialize_struct_level_header_1.h | 2 +- generated/deserialize_struct_level_header_2.h | 2 +- generated/deserialize_struct_level_header_3.h | 2 +- .../deserialize_struct_render_settings_1.h | 173 ++++++++++++++++++ .../do_editor_ui_for_compound_type_graphics.h | 15 ++ ...tor_ui_for_compound_type_render_settings.h | 45 +++++ generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + generated/serdes_struct_bonsai_type_info.h | 2 +- .../serdes_struct_bonsai_type_info_buffer.h | 2 +- generated/serdes_struct_brush_layer.h | 2 +- generated/serdes_struct_brush_settings.h | 2 +- generated/serdes_struct_brush_settings_0.h | 2 +- generated/serdes_struct_brush_settings_1.h | 2 +- generated/serdes_struct_brush_settings_2.h | 2 +- .../serdes_struct_layered_brush_editor.h | 2 +- .../serdes_struct_layered_brush_editor_0.h | 2 +- .../serdes_struct_layered_brush_editor_1.h | 2 +- .../serdes_struct_layered_brush_editor_2.h | 2 +- generated/serdes_struct_noise_layer.h | 2 +- generated/serdes_struct_noise_layer_0.h | 2 +- generated/serdes_struct_perlin_noise_params.h | 2 +- generated/serdes_struct_render_settings.h | 76 +++++++- generated/serdes_struct_shape_layer.h | 2 +- .../serdes_struct_voronoi_noise_params.h | 2 +- generated/serdes_struct_white_noise_params.h | 2 +- ...struct_world_update_op_shape_params_rect.h | 2 +- ...ruct_world_update_op_shape_params_sphere.h | 2 +- generated/serialize_struct_level_header.h | 2 +- .../serialize_struct_render_settings_0.h | 2 +- runtime_settings/graphics_settings.bin | Bin 0 -> 469 bytes src/engine/api.cpp | 14 +- src/engine/engine.cpp | 5 +- src/engine/graphics.h | 1 + src/engine/render/render_init.cpp | 78 ++++---- src/engine/render_settings.h | 42 ++++- src/engine/resources.cpp | 7 + src/engine/serdes.cpp | 15 ++ 45 files changed, 505 insertions(+), 71 deletions(-) create mode 100644 generated/anonymous_render_settings_1_pFpWPpyN.h create mode 100644 generated/are_equal_render_settings.h create mode 100644 generated/deserialize_struct_render_settings_1.h create mode 100644 runtime_settings/graphics_settings.bin diff --git a/generated/anonymous_render_settings_0_wwLVyABc.h b/generated/anonymous_render_settings_0_wwLVyABc.h index eb4d94190..e8929414d 100644 --- a/generated/anonymous_render_settings_0_wwLVyABc.h +++ b/generated/anonymous_render_settings_0_wwLVyABc.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:414:0 +// src/engine/serdes.cpp:426:0 E1->UseSsao = E0->UseSsao; E1->UseShadowMapping = E0->UseShadowMapping; diff --git a/generated/anonymous_render_settings_1_pFpWPpyN.h b/generated/anonymous_render_settings_1_pFpWPpyN.h new file mode 100644 index 000000000..9b8862596 --- /dev/null +++ b/generated/anonymous_render_settings_1_pFpWPpyN.h @@ -0,0 +1,21 @@ +// src/engine/serdes.cpp:414:0 + +E1->UseSsao = E0->UseSsao; +E1->UseShadowMapping = E0->UseShadowMapping; +E1->UseLightingBloom = E0->UseLightingBloom; +E1->BravoilMyersOIT = E0->BravoilMyersOIT; +E1->BravoilMcGuireOIT = E0->BravoilMcGuireOIT; +E1->DrawMajorGrid = E0->DrawMajorGrid; +E1->DrawMinorGrid = E0->DrawMinorGrid; +E1->MajorGridDim = E0->MajorGridDim; +E1->OffsetOfWorldCenterToGrid = E0->OffsetOfWorldCenterToGrid; +E1->Headless = E0->Headless; +E1->ToneMappingType = E0->ToneMappingType; +E1->Lighting = E0->Lighting; +E1->ApplicationResolution = E0->ApplicationResolution; +E1->ShadowMapResolution = E0->ShadowMapResolution; +E1->LuminanceMapResolution = E0->LuminanceMapResolution; +E1->iApplicationResolution = E0->iApplicationResolution; +E1->iShadowMapResolution = E0->iShadowMapResolution; +E1->iLuminanceMapResolution = E0->iLuminanceMapResolution; + diff --git a/generated/are_equal_render_settings.h b/generated/are_equal_render_settings.h new file mode 100644 index 000000000..cc8634405 --- /dev/null +++ b/generated/are_equal_render_settings.h @@ -0,0 +1,25 @@ +// src/engine/render_settings.h:94:0 + +link_internal b32 +AreEqual(render_settings *Thing1, render_settings *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( render_settings ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(render_settings Thing1, render_settings Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( render_settings ) ); + + return Result; +} + diff --git a/generated/default_marshal_level_header_3.h b/generated/default_marshal_level_header_3.h index 2415b35ef..44d39a671 100644 --- a/generated/default_marshal_level_header_3.h +++ b/generated/default_marshal_level_header_3.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:484:0 +// src/engine/serdes.cpp:499:0 Live->ChunkCount = Stored->ChunkCount; diff --git a/generated/deserialize_struct_level_header.h b/generated/deserialize_struct_level_header.h index 3d7d33c6a..69023212b 100644 --- a/generated/deserialize_struct_level_header.h +++ b/generated/deserialize_struct_level_header.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:501:0 +// src/engine/serdes.cpp:516:0 link_internal b32 Deserialize(u8_cursor *Bytes, level_header *Element, memory_arena *Memory, umm Count = 1); diff --git a/generated/deserialize_struct_level_header_0.h b/generated/deserialize_struct_level_header_0.h index c8454395d..7278ca1e7 100644 --- a/generated/deserialize_struct_level_header_0.h +++ b/generated/deserialize_struct_level_header_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:489:0 +// src/engine/serdes.cpp:504:0 link_internal b32 Deserialize(u8_cursor *Bytes, level_header_0 *Element, memory_arena *Memory, umm Count = 1); diff --git a/generated/deserialize_struct_level_header_1.h b/generated/deserialize_struct_level_header_1.h index 7184226b2..9929b018d 100644 --- a/generated/deserialize_struct_level_header_1.h +++ b/generated/deserialize_struct_level_header_1.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:492:0 +// src/engine/serdes.cpp:507:0 link_internal b32 Deserialize(u8_cursor *Bytes, level_header_1 *Element, memory_arena *Memory, umm Count = 1); diff --git a/generated/deserialize_struct_level_header_2.h b/generated/deserialize_struct_level_header_2.h index 47b7198dc..9797b2aae 100644 --- a/generated/deserialize_struct_level_header_2.h +++ b/generated/deserialize_struct_level_header_2.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:495:0 +// src/engine/serdes.cpp:510:0 link_internal b32 Deserialize(u8_cursor *Bytes, level_header_2 *Element, memory_arena *Memory, umm Count = 1); diff --git a/generated/deserialize_struct_level_header_3.h b/generated/deserialize_struct_level_header_3.h index 076c86cc1..d5175e975 100644 --- a/generated/deserialize_struct_level_header_3.h +++ b/generated/deserialize_struct_level_header_3.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:498:0 +// src/engine/serdes.cpp:513:0 link_internal b32 Deserialize(u8_cursor *Bytes, level_header_3 *Element, memory_arena *Memory, umm Count = 1); diff --git a/generated/deserialize_struct_render_settings_1.h b/generated/deserialize_struct_render_settings_1.h new file mode 100644 index 000000000..cf5da720f --- /dev/null +++ b/generated/deserialize_struct_render_settings_1.h @@ -0,0 +1,173 @@ +// src/engine/serdes.cpp:434:0 + +link_internal b32 +Deserialize(u8_cursor *Bytes, render_settings_1 *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->UseSsao, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->UseShadowMapping, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->UseLightingBloom, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->BravoilMyersOIT, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->BravoilMcGuireOIT, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->DrawMajorGrid, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->DrawMinorGrid, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->MajorGridDim, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->OffsetOfWorldCenterToGrid, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Headless, Memory); + + + + + + Element->ToneMappingType = Cast(tone_mapping_type, Read_u32(Bytes)); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Lighting, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->ApplicationResolution, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->ShadowMapResolution, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->LuminanceMapResolution, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->iApplicationResolution, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->iShadowMapResolution, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->iLuminanceMapResolution, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, render_settings_1 *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 7163ce9f9..e00709c59 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -67,6 +67,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(render_settings*,&Element->PrevSettings), + CSz("PrevSettings"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 2c9861b36..d30347e80 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -131,6 +131,35 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + Cast(b8*,&Element->DrawCameraGhost), + CSz("DrawCameraGhost"), + &DefaultUiRenderParams_Checkbox + ); + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*,&Element->CameraGhostSize), + CSz("CameraGhostSize"), + Params +,1, 100 ); + + + + + + + PushNewRow(Ui); @@ -152,6 +181,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, Element->GameCameraFOV), + CSz("GameCameraFOV"), + Params +,5, 250 ); + + + + + + + + PushNewRow(Ui); + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index d1940c870..65480aa10 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -693,6 +693,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 961efe96e..ea3d3d582 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -683,6 +683,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index c1438143d..89995aa74 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -683,6 +683,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/generated/serdes_struct_bonsai_type_info.h b/generated/serdes_struct_bonsai_type_info.h index 239c6236c..cb732d141 100644 --- a/generated/serdes_struct_bonsai_type_info.h +++ b/generated/serdes_struct_bonsai_type_info.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:434:0 +// src/engine/serdes.cpp:449:0 link_internal bonsai_type_info TypeInfo(bonsai_type_info *Ignored) diff --git a/generated/serdes_struct_bonsai_type_info_buffer.h b/generated/serdes_struct_bonsai_type_info_buffer.h index 75372b42e..319c359d7 100644 --- a/generated/serdes_struct_bonsai_type_info_buffer.h +++ b/generated/serdes_struct_bonsai_type_info_buffer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:436:0 +// src/engine/serdes.cpp:451:0 link_internal bonsai_type_info TypeInfo(bonsai_type_info_buffer *Ignored) diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index 7411c3da9..9cd50f015 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:548:0 +// src/engine/serdes.cpp:563:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index b53739938..e5c058318 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:545:0 +// src/engine/serdes.cpp:560:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) diff --git a/generated/serdes_struct_brush_settings_0.h b/generated/serdes_struct_brush_settings_0.h index 1fd30ef5d..be7d60741 100644 --- a/generated/serdes_struct_brush_settings_0.h +++ b/generated/serdes_struct_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:539:0 +// src/engine/serdes.cpp:554:0 link_internal bonsai_type_info TypeInfo(brush_settings_0 *Ignored) diff --git a/generated/serdes_struct_brush_settings_1.h b/generated/serdes_struct_brush_settings_1.h index e79f829df..33217101f 100644 --- a/generated/serdes_struct_brush_settings_1.h +++ b/generated/serdes_struct_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:541:0 +// src/engine/serdes.cpp:556:0 link_internal bonsai_type_info TypeInfo(brush_settings_1 *Ignored) diff --git a/generated/serdes_struct_brush_settings_2.h b/generated/serdes_struct_brush_settings_2.h index e8bc30dca..3f06d19c5 100644 --- a/generated/serdes_struct_brush_settings_2.h +++ b/generated/serdes_struct_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:543:0 +// src/engine/serdes.cpp:558:0 link_internal bonsai_type_info TypeInfo(brush_settings_2 *Ignored) diff --git a/generated/serdes_struct_layered_brush_editor.h b/generated/serdes_struct_layered_brush_editor.h index 57037146e..f24241fbc 100644 --- a/generated/serdes_struct_layered_brush_editor.h +++ b/generated/serdes_struct_layered_brush_editor.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:557:0 +// src/engine/serdes.cpp:572:0 link_internal bonsai_type_info TypeInfo(layered_brush_editor *Ignored) diff --git a/generated/serdes_struct_layered_brush_editor_0.h b/generated/serdes_struct_layered_brush_editor_0.h index e2f5b0115..68a0a49e3 100644 --- a/generated/serdes_struct_layered_brush_editor_0.h +++ b/generated/serdes_struct_layered_brush_editor_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:551:0 +// src/engine/serdes.cpp:566:0 link_internal bonsai_type_info TypeInfo(layered_brush_editor_0 *Ignored) diff --git a/generated/serdes_struct_layered_brush_editor_1.h b/generated/serdes_struct_layered_brush_editor_1.h index 5a6d57748..22ccdc3ee 100644 --- a/generated/serdes_struct_layered_brush_editor_1.h +++ b/generated/serdes_struct_layered_brush_editor_1.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:553:0 +// src/engine/serdes.cpp:568:0 link_internal bonsai_type_info TypeInfo(layered_brush_editor_1 *Ignored) diff --git a/generated/serdes_struct_layered_brush_editor_2.h b/generated/serdes_struct_layered_brush_editor_2.h index e2a99a9ef..a0184a0d5 100644 --- a/generated/serdes_struct_layered_brush_editor_2.h +++ b/generated/serdes_struct_layered_brush_editor_2.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:555:0 +// src/engine/serdes.cpp:570:0 link_internal bonsai_type_info TypeInfo(layered_brush_editor_2 *Ignored) diff --git a/generated/serdes_struct_noise_layer.h b/generated/serdes_struct_noise_layer.h index 5b204715c..d5ff40715 100644 --- a/generated/serdes_struct_noise_layer.h +++ b/generated/serdes_struct_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:530:0 +// src/engine/serdes.cpp:545:0 link_internal bonsai_type_info TypeInfo(noise_layer *Ignored) diff --git a/generated/serdes_struct_noise_layer_0.h b/generated/serdes_struct_noise_layer_0.h index 99d5f420d..c2ac96f28 100644 --- a/generated/serdes_struct_noise_layer_0.h +++ b/generated/serdes_struct_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:528:0 +// src/engine/serdes.cpp:543:0 link_internal bonsai_type_info TypeInfo(noise_layer_0 *Ignored) diff --git a/generated/serdes_struct_perlin_noise_params.h b/generated/serdes_struct_perlin_noise_params.h index a2e7301a1..68c5791b2 100644 --- a/generated/serdes_struct_perlin_noise_params.h +++ b/generated/serdes_struct_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:524:0 +// src/engine/serdes.cpp:539:0 link_internal bonsai_type_info TypeInfo(perlin_noise_params *Ignored) diff --git a/generated/serdes_struct_render_settings.h b/generated/serdes_struct_render_settings.h index 25107fe95..9acc3eec4 100644 --- a/generated/serdes_struct_render_settings.h +++ b/generated/serdes_struct_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:425:0 +// src/engine/serdes.cpp:440:0 link_internal bonsai_type_info TypeInfo(render_settings *Ignored) @@ -6,7 +6,7 @@ TypeInfo(render_settings *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("render_settings"); - Result.Version =1 ; + Result.Version =2 ; /* type.map(member) */ /* { */ @@ -30,7 +30,7 @@ Serialize(u8_cursor_block_array *Bytes, render_settings *BaseElement, umm Count b32 Result = True; Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber =1; + u64 VersionNumber =2; Serialize(Bytes, &VersionNumber); @@ -85,6 +85,18 @@ Serialize(u8_cursor_block_array *Bytes, render_settings *BaseElement, umm Count + Result &= Serialize(Bytes, &Element->DrawCameraGhost); + + + + + + Result &= Serialize(Bytes, &Element->CameraGhostSize); + + + + + Result &= Serialize(Bytes, &Element->OffsetOfWorldCenterToGrid); @@ -102,6 +114,11 @@ Serialize(u8_cursor_block_array *Bytes, render_settings *BaseElement, umm Count + if (Element->GameCameraFOV) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } + + + Result &= Serialize(Bytes, &Element->Lighting); @@ -140,7 +157,11 @@ Serialize(u8_cursor_block_array *Bytes, render_settings *BaseElement, umm Count Result &= Serialize(Bytes, &Element->iLuminanceMapResolution); - + if (Element->GameCameraFOV) { Result &= Serialize(Bytes, Element->GameCameraFOV); } + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -158,7 +179,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are link_internal b32 DeserializeVersioned(u8_cursor *Bytes, render_settings *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) { - Assert(TypeInfo->Version <=1); + Assert(TypeInfo->Version <=2); b32 Result = True; @@ -168,9 +189,15 @@ DeserializeVersioned(u8_cursor *Bytes, render_settings *Element, bonsai_type_inf Result &= Deserialize(Bytes, &T0, Memory); Marshal(&T0, Element); } + if (TypeInfo->Version == 1) + { + render_settings_1 T1 = {}; + Result &= Deserialize(Bytes, &T1, Memory); + Marshal(&T1, Element); + } - if (TypeInfo->Version ==1) + if (TypeInfo->Version ==2) { Result &= DeserializeCurrentVersion(Bytes, Element, Memory); } @@ -247,6 +274,22 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->DrawCameraGhost, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->CameraGhostSize, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->OffsetOfWorldCenterToGrid, Memory); @@ -268,6 +311,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are + b64 HadGameCameraFOVPointer = Read_u64(Bytes); + Assert(HadGameCameraFOVPointer < 2); // Should be 0 or 1 + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Lighting, Memory); @@ -320,7 +368,21 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->iLuminanceMapResolution, Memory); - + if (HadGameCameraFOVPointer) + { + umm Count = 1; + + + if (Element->GameCameraFOV == 0) + { + Element->GameCameraFOV = Allocate(f32, Memory, Count); + } + + Result &= Deserialize(Bytes, Element->GameCameraFOV, Memory, Count); + } + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index 40aa47c62..a0eab98b6 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:536:0 +// src/engine/serdes.cpp:551:0 link_internal bonsai_type_info TypeInfo(shape_layer *Ignored) diff --git a/generated/serdes_struct_voronoi_noise_params.h b/generated/serdes_struct_voronoi_noise_params.h index 113e0de35..d032722bf 100644 --- a/generated/serdes_struct_voronoi_noise_params.h +++ b/generated/serdes_struct_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:526:0 +// src/engine/serdes.cpp:541:0 link_internal bonsai_type_info TypeInfo(voronoi_noise_params *Ignored) diff --git a/generated/serdes_struct_white_noise_params.h b/generated/serdes_struct_white_noise_params.h index 546665ad3..d75df9092 100644 --- a/generated/serdes_struct_white_noise_params.h +++ b/generated/serdes_struct_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:522:0 +// src/engine/serdes.cpp:537:0 link_internal bonsai_type_info TypeInfo(white_noise_params *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_rect.h b/generated/serdes_struct_world_update_op_shape_params_rect.h index 456aeb124..7fd31a1d7 100644 --- a/generated/serdes_struct_world_update_op_shape_params_rect.h +++ b/generated/serdes_struct_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:532:0 +// src/engine/serdes.cpp:547:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_rect *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_sphere.h b/generated/serdes_struct_world_update_op_shape_params_sphere.h index 7c32e6096..a91375055 100644 --- a/generated/serdes_struct_world_update_op_shape_params_sphere.h +++ b/generated/serdes_struct_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:534:0 +// src/engine/serdes.cpp:549:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_sphere *Ignored) diff --git a/generated/serialize_struct_level_header.h b/generated/serialize_struct_level_header.h index 0ee6ae028..5430def6a 100644 --- a/generated/serialize_struct_level_header.h +++ b/generated/serialize_struct_level_header.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:504:0 +// src/engine/serdes.cpp:519:0 link_internal bonsai_type_info TypeInfo(level_header *Ignored) diff --git a/generated/serialize_struct_render_settings_0.h b/generated/serialize_struct_render_settings_0.h index 3883d1356..43e4893d6 100644 --- a/generated/serialize_struct_render_settings_0.h +++ b/generated/serialize_struct_render_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:422:0 +// src/engine/serdes.cpp:437:0 link_internal b32 Deserialize(u8_cursor *Bytes, render_settings_0 *Element, memory_arena *Memory, umm Count = 1); diff --git a/runtime_settings/graphics_settings.bin b/runtime_settings/graphics_settings.bin new file mode 100644 index 0000000000000000000000000000000000000000..1f37b70f9ffdc224ed422d45a6bea84c64e4ffa8 GIT binary patch literal 469 zcmZQ%fB+^a%?PChp>$4WdPYfRUV40SY6*xghA9BaulWOk{7}V3sd*`>MR27sGm(|T zw7}$G#(`)UhMESV96^NkE=9)#iC%|&nuiZNLhqhSettings, &Graphics->PrevSettings)) + { + u8_cursor_block_array Bytes = BeginSerialization(); + Serialize(&Bytes, &Graphics->Settings); + FinalizeSerialization(&Bytes, RUNTIME_SETTINGS__GRAPHICS_SETTINGS_PATH); + } + + Graphics->PrevSettings = Graphics->Settings; + return Result; } diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 4a25f797e..aef3a762c 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -25,6 +25,9 @@ #include #include +#include // NOTE(Jesse): generated code for ser/des +#include // NOTE(Jesse): Functions acting as basis for ser/des + #include #include #include @@ -37,8 +40,6 @@ #include -#include // NOTE(Jesse): generated code for ser/des -#include // NOTE(Jesse): Functions acting as basis for ser/des #include #include #include diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 34e29b342..d81f6a9a3 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -72,6 +72,7 @@ struct graphics volatile b32 RenderGate; render_settings Settings; + render_settings PrevSettings; v3 SunBasis; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 1c413f6f3..47ce24d3d 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -561,6 +561,9 @@ InitTransparencyRenderGroup(render_settings *Settings, transparency_render_group Ensure( CheckAndClearFramebuffer() ); } + +#define RUNTIME_SETTINGS__GRAPHICS_SETTINGS_PATH "runtime_settings/graphics_settings.bin" + link_internal b32 GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *GraphicsMemory) { @@ -568,52 +571,63 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Result->Memory = GraphicsMemory; - Result->Settings.ToneMappingType = ToneMappingType_Exposure; + if (FileExists(RUNTIME_SETTINGS__GRAPHICS_SETTINGS_PATH)) + { + u8_cursor Bytes = BeginDeserialization(CSz(RUNTIME_SETTINGS__GRAPHICS_SETTINGS_PATH), GetTranArena()); + Deserialize(&Bytes, &Result->Settings, GetTranArena()); + FinalizeDeserialization(&Bytes); + } + else + { + Result->Settings.ToneMappingType = ToneMappingType_Exposure; - Result->Settings.UseSsao = True; + Result->Settings.UseSsao = True; - Result->Settings.BravoilMyersOIT = True; - Result->Settings.BravoilMcGuireOIT = True; + Result->Settings.BravoilMyersOIT = True; + Result->Settings.BravoilMcGuireOIT = True; - /* Result->Settings.UseShadowMapping = True; */ - Result->Settings.UseLightingBloom = True; + /* Result->Settings.UseShadowMapping = True; */ + Result->Settings.UseLightingBloom = True; - /* Result->Settings.DrawMajorGrid = True; */ - /* Result->Settings.DrawMinorGrid = True; */ - Result->Settings.MajorGridDim = 8.f; + /* Result->Settings.DrawMajorGrid = True; */ + /* Result->Settings.DrawMinorGrid = True; */ + Result->Settings.MajorGridDim = 8.f; - Result->Exposure = 1.5f; + Result->Settings.ApplicationResolution = V2(GetApplicationResolution(EngineSettings)); + Result->Settings.ShadowMapResolution = V2(GetShadowMapResolution(EngineSettings)); + Result->Settings.LuminanceMapResolution = V2(GetLuminanceMapResolution(EngineSettings)); - Result->Settings.ApplicationResolution = V2(GetApplicationResolution(EngineSettings)); - Result->Settings.ShadowMapResolution = V2(GetShadowMapResolution(EngineSettings)); - Result->Settings.LuminanceMapResolution = V2(GetLuminanceMapResolution(EngineSettings)); + Result->Settings.iApplicationResolution = GetApplicationResolution(EngineSettings); + Result->Settings.iShadowMapResolution = GetShadowMapResolution(EngineSettings); + Result->Settings.iLuminanceMapResolution = GetLuminanceMapResolution(EngineSettings); + Result->Settings.GameCameraFOV = &Result->GameCamera.Frust.FOV; - Result->Settings.iApplicationResolution = GetApplicationResolution(EngineSettings); - Result->Settings.iShadowMapResolution = GetShadowMapResolution(EngineSettings); - Result->Settings.iLuminanceMapResolution = GetLuminanceMapResolution(EngineSettings); - Result->FogPower = 2.f; + { + lighting_settings *Lighting = &Result->Settings.Lighting; - Result->FogColor = V3(0.01f, 0.04f, 0.25f); - Result->SkyColor = V3(0.001f, 0.001f, 0.35f); + Lighting->tDay = 0.75f; - { - lighting_settings *Lighting = &Result->Settings.Lighting; + Lighting->SunP = V3(-1.f, -1.f, 0.35f); - Lighting->tDay = 0.75f; + Lighting->DawnColor = V3(0.37f, 0.11f, 0.10f); + Lighting->SunColor = V3(0.17f, 0.13f, 0.17f); + Lighting->DuskColor = V3(0.13f, 0.12f, 0.14f); + Lighting->MoonColor = V3(0.04f, 0.07f, 0.18f); - Lighting->SunP = V3(-1.f, -1.f, 0.35f); + Lighting->SunIntensity = 1.10f; + Lighting->MoonIntensity = 0.10f; + Lighting->DawnIntensity = 0.70f; + Lighting->DuskIntensity = 0.50f; + } + } - Lighting->DawnColor = V3(0.37f, 0.11f, 0.10f); - Lighting->SunColor = V3(0.17f, 0.13f, 0.17f); - Lighting->DuskColor = V3(0.13f, 0.12f, 0.14f); - Lighting->MoonColor = V3(0.04f, 0.07f, 0.18f); - Lighting->SunIntensity = 1.10f; - Lighting->MoonIntensity = 0.10f; - Lighting->DawnIntensity = 0.70f; - Lighting->DuskIntensity = 0.50f; - } + Result->Exposure = 1.5f; + Result->FogPower = 2.f; + + Result->FogColor = V3(0.01f, 0.04f, 0.25f); + Result->SkyColor = V3(0.001f, 0.001f, 0.35f); StandardCamera(&Result->GameCamera, 100000.f, 500.f); StandardCamera(&Result->DebugCamera, 100000.f, 500.f); diff --git a/src/engine/render_settings.h b/src/engine/render_settings.h index ae01f4034..8e241d069 100644 --- a/src/engine/render_settings.h +++ b/src/engine/render_settings.h @@ -54,7 +54,47 @@ struct lighting_settings_0 v3 CurrentSunColor; }; -struct render_settings poof(@version(1)) +struct render_settings poof(@version(2)) +{ + // NOTE(Jesse): These have to be 32bit because they get passed to shaders + // and the shader system is too dumb to handle 8-bit or 1-bit values + b32 UseSsao; + b32 UseShadowMapping; + b32 UseLightingBloom; + + b32 BravoilMyersOIT; + b32 BravoilMcGuireOIT; + + b32 DrawMajorGrid; + b32 DrawMinorGrid; + r32 MajorGridDim; poof(@ui_value_range(0, 32)) + + b32 DrawCameraGhost; + r32 CameraGhostSize = 1.f; poof(@ui_value_range(1, 100)) + + v3 OffsetOfWorldCenterToGrid; poof(@ui_skip) + b32 Headless; poof(@ui_skip) + + + tone_mapping_type ToneMappingType; + + f32 *GameCameraFOV; poof(@ui_value_range(5, 250)) + + lighting_settings Lighting; + + v2 ApplicationResolution; + v2 ShadowMapResolution; + v2 LuminanceMapResolution; + + v2i iApplicationResolution; + v2i iShadowMapResolution; + v2i iLuminanceMapResolution; +}; + +poof(are_equal(render_settings)) +#include + +struct render_settings_1 { // NOTE(Jesse): These have to be 32bit because they get passed to shaders // and the shader system is too dumb to handle 8-bit or 1-bit values diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 0bccfc496..5d97e3414 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -426,6 +426,12 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; + if (Graphics->Settings.DrawCameraGhost) + { + untextured_3d_geometry_buffer Mesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); + DrawVoxel(&Mesh, {}, V3(0.7f), V3(1)*(Graphics->GameCamera.DistanceFromTarget/1000.f*Graphics->Settings.CameraGhostSize)); + } + Ensure( FlushBuffersToCard(GpuMap) ); // Unmaps buffer if (GpuMap->Buffer.At) { @@ -484,6 +490,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } } + } break; { tmatch(bonsai_render_command_gl_timer_init, RC, Command) diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index 958244a4e..2f3435a73 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -408,6 +408,18 @@ poof(serdes_struct(lighting_settings)) +link_internal void +Marshal(render_settings_1 *E0, render_settings *E1) +{ + poof(func (render_settings_1 settings_t) { + settings_t.map(member) { + E1->(member.name) = E0->(member.name); + } + }) +#include +} + + link_internal void Marshal(render_settings_0 *E0, render_settings *E1) { @@ -419,6 +431,9 @@ Marshal(render_settings_0 *E0, render_settings *E1) #include } +poof(deserialize_struct(render_settings_1)) +#include + poof(deserialize_struct(render_settings_0)) #include From 42f751507d97b058e9d7daa52b52d04933631bae Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 29 Oct 2024 09:56:19 -0700 Subject: [PATCH 129/421] make.sh now tolerates poof not being found, even if it was called --- external/bonsai_stdlib | 2 +- make.sh | 29 +++++++++++++++++------------ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index de3517db7..c3d79c301 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit de3517db73c290fb48499485b61c26e575a3730e +Subproject commit c3d79c3013597a1e3b2c3f78395b46d4ad307996 diff --git a/make.sh b/make.sh index c5ee62871..512e5d368 100755 --- a/make.sh +++ b/make.sh @@ -299,20 +299,25 @@ function RunPoofHelper { # -I "C:/Program Files (x86)/Windows Kits/10/include/10.0.18362.0/winrt" \ + which poof > /dev/null 2>&1 + if [ $? -eq 0 ]; then + + poof \ + $COLOR_FLAG \ + -D POOF_PREPROCESSOR \ + -D BONSAI_PREPROCESSOR \ + -I src/ \ + -I external/ \ + $PLATFORM_DEFINES \ + $BONSAI_INTERNAL \ + -o generated \ + $1 + + else + echo "poof not found, skipping." + fi - # --log-level LogLevel_Debug \ - poof \ - $COLOR_FLAG \ - -D POOF_PREPROCESSOR \ - -D BONSAI_PREPROCESSOR \ - -I src/ \ - -I external/ \ - $PLATFORM_DEFINES \ - $BONSAI_INTERNAL \ - -o generated \ - $1 - } function RunPoof From 5f5630699cbcaa8a215d6670c0a7438943a7ba19 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 29 Oct 2024 13:23:58 -0700 Subject: [PATCH 130/421] Fix FOV serialization & loading --- external/bonsai_stdlib | 2 +- generated/are_equal_lighting_settings.h | 25 ++++++ ...tor_ui_for_compound_type_render_settings.h | 2 +- generated/gen_are_equal_665365505.h | 72 +++++++++++++++++- generated/gen_primitive_deep_copy_715421923.h | 2 +- generated/serdes_struct_render_settings.h | 34 +++------ jesse.make.sh | 2 +- runtime_settings/graphics_settings.bin | Bin 469 -> 461 bytes src/engine/api.cpp | 2 + src/engine/camera.cpp | 7 +- src/engine/render/render_init.cpp | 16 ++-- src/engine/render_settings.h | 2 +- 12 files changed, 127 insertions(+), 39 deletions(-) create mode 100644 generated/are_equal_lighting_settings.h diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index c3d79c301..e56357817 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit c3d79c3013597a1e3b2c3f78395b46d4ad307996 +Subproject commit e56357817bf9e18cd596b743c31e606bcd4d8b61 diff --git a/generated/are_equal_lighting_settings.h b/generated/are_equal_lighting_settings.h new file mode 100644 index 000000000..102e5c2ab --- /dev/null +++ b/generated/are_equal_lighting_settings.h @@ -0,0 +1,25 @@ +// src/engine/render_settings.h:34:0 + +link_internal b32 +AreEqual(lighting_settings *Thing1, lighting_settings *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( lighting_settings ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(lighting_settings Thing1, lighting_settings Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( lighting_settings ) ); + + return Result; +} + diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index d30347e80..69ff7d66b 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -184,7 +184,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(f32*, Element->GameCameraFOV), + Cast(f32*,&Element->GameCameraFOV), CSz("GameCameraFOV"), Params ,5, 250 ); diff --git a/generated/gen_are_equal_665365505.h b/generated/gen_are_equal_665365505.h index cb11e3820..1d7fb0c1e 100644 --- a/generated/gen_are_equal_665365505.h +++ b/generated/gen_are_equal_665365505.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/primitives.h:226:0 +// external/bonsai_stdlib/src/primitives.h:233:0 link_internal b32 AreEqual( s64 E1, s64 E2 ) @@ -6,54 +6,117 @@ AreEqual( s64 E1, s64 E2 ) b32 Result = E1 == E2; return Result; } + +link_internal b32 +AreEqual( s64 *E1, s64 *E2 ) +{ + b32 Result = *E1 == *E2; + return Result; +} link_internal b32 AreEqual( u64 E1, u64 E2 ) { b32 Result = E1 == E2; return Result; } + +link_internal b32 +AreEqual( u64 *E1, u64 *E2 ) +{ + b32 Result = *E1 == *E2; + return Result; +} link_internal b32 AreEqual( r64 E1, r64 E2 ) { b32 Result = E1 == E2; return Result; } + +link_internal b32 +AreEqual( r64 *E1, r64 *E2 ) +{ + b32 Result = *E1 == *E2; + return Result; +} link_internal b32 AreEqual( s32 E1, s32 E2 ) { b32 Result = E1 == E2; return Result; } + +link_internal b32 +AreEqual( s32 *E1, s32 *E2 ) +{ + b32 Result = *E1 == *E2; + return Result; +} link_internal b32 AreEqual( u32 E1, u32 E2 ) { b32 Result = E1 == E2; return Result; } + +link_internal b32 +AreEqual( u32 *E1, u32 *E2 ) +{ + b32 Result = *E1 == *E2; + return Result; +} link_internal b32 AreEqual( r32 E1, r32 E2 ) { b32 Result = E1 == E2; return Result; } + +link_internal b32 +AreEqual( r32 *E1, r32 *E2 ) +{ + b32 Result = *E1 == *E2; + return Result; +} link_internal b32 AreEqual( s16 E1, s16 E2 ) { b32 Result = E1 == E2; return Result; } + +link_internal b32 +AreEqual( s16 *E1, s16 *E2 ) +{ + b32 Result = *E1 == *E2; + return Result; +} link_internal b32 AreEqual( u16 E1, u16 E2 ) { b32 Result = E1 == E2; return Result; } + +link_internal b32 +AreEqual( u16 *E1, u16 *E2 ) +{ + b32 Result = *E1 == *E2; + return Result; +} link_internal b32 AreEqual( s8 E1, s8 E2 ) { b32 Result = E1 == E2; return Result; } + +link_internal b32 +AreEqual( s8 *E1, s8 *E2 ) +{ + b32 Result = *E1 == *E2; + return Result; +} link_internal b32 AreEqual( u8 E1, u8 E2 ) { @@ -61,3 +124,10 @@ AreEqual( u8 E1, u8 E2 ) return Result; } +link_internal b32 +AreEqual( u8 *E1, u8 *E2 ) +{ + b32 Result = *E1 == *E2; + return Result; +} + diff --git a/generated/gen_primitive_deep_copy_715421923.h b/generated/gen_primitive_deep_copy_715421923.h index e626cebd3..2c46f2098 100644 --- a/generated/gen_primitive_deep_copy_715421923.h +++ b/generated/gen_primitive_deep_copy_715421923.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/primitives.h:243:0 +// external/bonsai_stdlib/src/primitives.h:250:0 link_internal void DeepCopy( s64 *Src, s64 *Dest ) diff --git a/generated/serdes_struct_render_settings.h b/generated/serdes_struct_render_settings.h index 9acc3eec4..6a501e45c 100644 --- a/generated/serdes_struct_render_settings.h +++ b/generated/serdes_struct_render_settings.h @@ -114,8 +114,9 @@ Serialize(u8_cursor_block_array *Bytes, render_settings *BaseElement, umm Count - if (Element->GameCameraFOV) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } - else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } + Result &= Serialize(Bytes, &Element->GameCameraFOV); + + @@ -157,11 +158,7 @@ Serialize(u8_cursor_block_array *Bytes, render_settings *BaseElement, umm Count Result &= Serialize(Bytes, &Element->iLuminanceMapResolution); - if (Element->GameCameraFOV) { Result &= Serialize(Bytes, Element->GameCameraFOV); } - - - - + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -311,8 +308,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - b64 HadGameCameraFOVPointer = Read_u64(Bytes); - Assert(HadGameCameraFOVPointer < 2); // Should be 0 or 1 + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->GameCameraFOV, Memory); + + @@ -368,21 +368,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->iLuminanceMapResolution, Memory); - if (HadGameCameraFOVPointer) - { - umm Count = 1; - - - if (Element->GameCameraFOV == 0) - { - Element->GameCameraFOV = Allocate(f32, Memory, Count); - } - - Result &= Deserialize(Bytes, Element->GameCameraFOV, Memory, Count); - } - - - + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/jesse.make.sh b/jesse.make.sh index 69863b0a3..aff4f18c0 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" # ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/runtime_settings/graphics_settings.bin b/runtime_settings/graphics_settings.bin index 1f37b70f9ffdc224ed422d45a6bea84c64e4ffa8..f0501a1a0780195e11304b4132f48261e739330b 100644 GIT binary patch delta 118 zcmcc0e3p4a&%_I?{tU>V!I2TjW!-bc;fMf-y|BGh>kGRxC8G9|BN+=gUGameCamera.Frust.FOV = Graphics->Settings.GameCameraFOV; + Graphics->PrevSettings = Graphics->Settings; return Result; diff --git a/src/engine/camera.cpp b/src/engine/camera.cpp index 0ad96aa21..367b0cdad 100644 --- a/src/engine/camera.cpp +++ b/src/engine/camera.cpp @@ -180,7 +180,12 @@ StandardCamera(camera* Camera, f32 FarClip, f32 DistanceFromTarget, f32 Blend) Camera->Frust.farClip = FarClip; Camera->Frust.nearClip = 1.0f; Camera->Frust.width = 30.0f; - Camera->Frust.FOV = 45.0f; + + // Someone already set FOV .. probably when deserializing stored runtime settings. + if (Camera->Frust.FOV == 0.f) + { + Camera->Frust.FOV = 45.0f; + } Camera->Up = WORLD_Z; Camera->Right = WORLD_X; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 47ce24d3d..f087c183b 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -571,6 +571,10 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Result->Memory = GraphicsMemory; + StandardCamera(&Result->GameCamera, 100000.f, 500.f); + StandardCamera(&Result->DebugCamera, 100000.f, 500.f); + Result->Camera = &Result->GameCamera; + if (FileExists(RUNTIME_SETTINGS__GRAPHICS_SETTINGS_PATH)) { u8_cursor Bytes = BeginDeserialization(CSz(RUNTIME_SETTINGS__GRAPHICS_SETTINGS_PATH), GetTranArena()); @@ -591,7 +595,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr /* Result->Settings.DrawMajorGrid = True; */ /* Result->Settings.DrawMinorGrid = True; */ - Result->Settings.MajorGridDim = 8.f; + Result->Settings.MajorGridDim = 16.f; Result->Settings.ApplicationResolution = V2(GetApplicationResolution(EngineSettings)); Result->Settings.ShadowMapResolution = V2(GetShadowMapResolution(EngineSettings)); @@ -600,8 +604,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Result->Settings.iApplicationResolution = GetApplicationResolution(EngineSettings); Result->Settings.iShadowMapResolution = GetShadowMapResolution(EngineSettings); Result->Settings.iLuminanceMapResolution = GetLuminanceMapResolution(EngineSettings); - Result->Settings.GameCameraFOV = &Result->GameCamera.Frust.FOV; + Result->Settings.GameCameraFOV = Result->GameCamera.Frust.FOV; { lighting_settings *Lighting = &Result->Settings.Lighting; @@ -622,18 +626,14 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr } } + Result->PrevSettings = Result->Settings; - Result->Exposure = 1.5f; + Result->Exposure = 1.5f; Result->FogPower = 2.f; Result->FogColor = V3(0.01f, 0.04f, 0.25f); Result->SkyColor = V3(0.001f, 0.001f, 0.35f); - StandardCamera(&Result->GameCamera, 100000.f, 500.f); - StandardCamera(&Result->DebugCamera, 100000.f, 500.f); - - Result->Camera = &Result->GameCamera; - AllocateGpuElementBuffer(Result->GpuBuffers + 0, DataType_v3, (u32)Megabytes(1)); AllocateGpuElementBuffer(Result->GpuBuffers + 1, DataType_v3, (u32)Megabytes(1)); diff --git a/src/engine/render_settings.h b/src/engine/render_settings.h index 8e241d069..9d7678e30 100644 --- a/src/engine/render_settings.h +++ b/src/engine/render_settings.h @@ -78,7 +78,7 @@ struct render_settings poof(@version(2)) tone_mapping_type ToneMappingType; - f32 *GameCameraFOV; poof(@ui_value_range(5, 250)) + f32 GameCameraFOV; poof(@ui_value_range(5, 250)) lighting_settings Lighting; From 0b07d730a36357a6491921d65b7e6fa9abbf9c8e Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 29 Oct 2024 14:27:23 -0700 Subject: [PATCH 131/421] Fix near-plane clipping --- runtime_settings/graphics_settings.bin | Bin 461 -> 461 bytes src/engine/camera.cpp | 2 +- src/engine/render.h | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime_settings/graphics_settings.bin b/runtime_settings/graphics_settings.bin index f0501a1a0780195e11304b4132f48261e739330b..84910c28f7dbe2578989b7aefeb5a052174b3d4e 100644 GIT binary patch delta 23 VcmX@he3p5_3LXX|uyKndBLF}!1Y`gJ delta 23 fcmX@he3p5_3Z5eZ9FDK2>~rvV-|et*izFied2|W@ diff --git a/src/engine/camera.cpp b/src/engine/camera.cpp index 367b0cdad..735d40d06 100644 --- a/src/engine/camera.cpp +++ b/src/engine/camera.cpp @@ -178,7 +178,7 @@ StandardCamera(camera* Camera, f32 FarClip, f32 DistanceFromTarget, f32 Blend) Camera->Blend = Blend; Camera->Frust.farClip = FarClip; - Camera->Frust.nearClip = 1.0f; + Camera->Frust.nearClip = 0.5f; Camera->Frust.width = 30.0f; // Someone already set FOV .. probably when deserializing stored runtime settings. diff --git a/src/engine/render.h b/src/engine/render.h index 414896fcb..a2eee1f62 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -1,7 +1,7 @@ struct world_chunk; -#define GLOBAL_RENDER_SCALE_FACTOR (0.010f) +#define GLOBAL_RENDER_SCALE_FACTOR (0.05f) // NOTE(Jesse): Must match defines in header.glsl #define VERTEX_POSITION_LAYOUT_LOCATION 0 From dbb19822162d12260ea759b3492f1c6244d37067 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 29 Oct 2024 14:36:05 -0700 Subject: [PATCH 132/421] Remove asserts for screendim > 0 --- external/bonsai_stdlib | 2 +- runtime_settings/graphics_settings.bin | Bin 461 -> 461 bytes src/game_loader.cpp | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index e56357817..fed1a1d7f 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit e56357817bf9e18cd596b743c31e606bcd4d8b61 +Subproject commit fed1a1d7f22d1de94acff527ca2adf640d23c49e diff --git a/runtime_settings/graphics_settings.bin b/runtime_settings/graphics_settings.bin index 84910c28f7dbe2578989b7aefeb5a052174b3d4e..607fd9ee340352e4d58cc6178f7b05374e1d9789 100644 GIT binary patch delta 23 fcmX@he3p5_3Z5$}T8>3##f~Skb~$X^BFP8MouseP; while ( ProcessOsMessages(Os, Plat) ); Plat->MouseDP = LastMouseP - Plat->MouseP; - Assert(Plat->ScreenDim.x > 0); - Assert(Plat->ScreenDim.y > 0); + /* Assert(Plat->ScreenDim.x > 0); */ + /* Assert(Plat->ScreenDim.y > 0); */ BindHotkeysToInput(&EngineResources->Hotkeys, &Plat->Input); From e7e11b0447206e2f126d9edfb1ef2ba118d3f083 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 30 Oct 2024 09:14:19 -0700 Subject: [PATCH 133/421] Ignore runtime_settings/* --- .gitignore | 2 ++ runtime_settings/graphics_settings.bin | Bin 461 -> 0 bytes src/engine/terrain.cpp | 1 - 3 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 runtime_settings/graphics_settings.bin diff --git a/.gitignore b/.gitignore index ab0656846..5fed10274 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ levels/ brushes/_untitled.brush +runtime_settings/* + bin/ tmp/ diff --git a/runtime_settings/graphics_settings.bin b/runtime_settings/graphics_settings.bin deleted file mode 100644 index 607fd9ee340352e4d58cc6178f7b05374e1d9789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 zcmZQ%fB+^a%?PChp>$4WdPYfRUV40SY6*xghA9BaulWOk{7}V3sd*`>MR27sGm(|T zw7}$G#=&T)Nl>c65hTvK=ZM1<6)ndivtq{+S-TuyW`God%qcjO?1ZG>!TvkGRxC8BUU5oR^GGBB{aBKQn$K=a)Yd^C9h Vpr<$x;me=^R1L&%^=R@iaR3n{v{(QD diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index c713a07f0..6a265a1fd 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -25,7 +25,6 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No Assert(NoiseChoice == 1 || NoiseChoice == 0); ChunkSum += u32(NoiseChoice); - u16 NoiseColor = ThisNoiseV & ((1 << 15) -1); u32 FiveBits = (1<<5)-1; From ddaea7d61bae28190199dc3942b68dc1307adbe4 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 7 Nov 2024 17:07:22 -0700 Subject: [PATCH 134/421] Mouse picking voxel nominally working; off by 1.. I think .. --- external/bonsai_stdlib | 2 +- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_octree_node.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- .../block_array_octree_node_ptr_688853862.h | 263 ++++++++++++++++++ ...block_array_picked_octree_node_688853862.h | 263 ++++++++++++++++++ generated/bubble_sort_686708022.h | 158 ++++++++++- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- .../default_marshal_layered_brush_editor_0.h | 2 +- .../default_marshal_layered_brush_editor_1.h | 2 +- .../default_marshal_layered_brush_editor_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 16 ++ ...do_editor_ui_for_compound_type_maybe_ray.h | 68 +++++ .../do_editor_ui_for_compound_type_ray.h | 68 +++++ .../do_editor_ui_for_compound_type_rect3.h | 2 +- .../do_editor_ui_for_compound_type_rect3cp.h | 2 +- .../do_editor_ui_for_compound_type_rect3i.h | 2 +- ...or_ui_for_compound_type_world_edit_brush.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 37 +++ .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...editor_ui_for_radio_enum_world_edit_mode.h | 2 +- ..._for_radio_enum_world_edit_mode_modifier.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 18 ++ generated/for_datatypes_fkubhsYl.h | 18 ++ generated/for_datatypes_kv3WBTai.h | 18 ++ generated/freelist_allocator_octree_node.h | 2 +- generated/freelist_allocator_world_chunk.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 44 +++ .../string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- .../string_and_value_tables_world_edit_mode.h | 2 +- ...nd_value_tables_world_edit_mode_modifier.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ..._value_tables_world_update_op_shape_type.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- shaders/terrain/default.fragmentshader | 3 +- shaders/terrain/trunchet.fragmentshader | 79 ++++++ src/engine/api.cpp | 75 ++++- src/engine/camera.cpp | 13 +- src/engine/debug.h | 2 + src/engine/debug_draw.cpp | 34 ++- src/engine/editor.h | 11 + src/engine/ray.h | 18 +- src/engine/render.h | 2 +- src/engine/render_position.h | 5 +- src/engine/resources.cpp | 2 +- src/engine/world.h | 17 ++ src/engine/world_chunk.cpp | 234 ++++++++++++---- 65 files changed, 1430 insertions(+), 118 deletions(-) create mode 100644 generated/block_array_octree_node_ptr_688853862.h create mode 100644 generated/block_array_picked_octree_node_688853862.h create mode 100644 generated/do_editor_ui_for_compound_type_maybe_ray.h create mode 100644 generated/do_editor_ui_for_compound_type_ray.h create mode 100644 generated/do_editor_ui_for_enum_maybe_tag.h create mode 100644 generated/string_and_value_tables_maybe_tag.h create mode 100644 shaders/terrain/trunchet.fragmentshader diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index fed1a1d7f..68b3cba0e 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit fed1a1d7f22d1de94acff527ca2adf640d23c49e +Subproject commit 68b3cba0ef801c6458ec8cd121d113ea2a0ca09b diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 319c84f97..73771d7af 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:919:0 +// src/engine/editor.h:930:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index 472e504a8..97990a794 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:33:0 +// src/engine/world.h:39:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 5876a06d9..d79ae0835 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:663:0 +// src/engine/editor.h:674:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index cddfb4da5..57113164e 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:524:0 +// src/engine/editor.h:529:0 struct asset_thumbnail_block { diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h new file mode 100644 index 000000000..35a524b5e --- /dev/null +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -0,0 +1,263 @@ +// src/engine/world.h:53:0 + +struct octree_node_ptr_block +{ + u32 Index; + u32 At; + octree_node_ptr *Elements; + octree_node_ptr_block *Next; +}; + +struct octree_node_ptr_block_array_index +{ + octree_node_ptr_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct octree_node_ptr_block_array +{ + octree_node_ptr_block *First; + octree_node_ptr_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +typedef octree_node_ptr_block_array octree_node_ptr_paged_list; + +link_internal octree_node_ptr_block_array_index +operator++(octree_node_ptr_block_array_index &I0) +{ + if (I0.Block) + { + if (I0.ElementIndex == 8-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<(octree_node_ptr_block_array_index I0, octree_node_ptr_block_array_index I1) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex(octree_node_ptr_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*8); + return Result; +} + +link_internal octree_node_ptr_block_array_index +ZerothIndex(octree_node_ptr_block_array *Arr) +{ + octree_node_ptr_block_array_index Result = {}; + Result.Block = Arr->First; + /* Assert(Result.Block->Index == 0); */ + return Result; +} + +link_internal umm +TotalElements(octree_node_ptr_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 8) + Arr->Current->At; + } + return Result; +} + +link_internal octree_node_ptr_block_array_index +LastIndex(octree_node_ptr_block_array *Arr) +{ + octree_node_ptr_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal octree_node_ptr_block_array_index +AtElements(octree_node_ptr_block_array *Arr) +{ + octree_node_ptr_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal umm +Count(octree_node_ptr_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + +link_internal octree_node_ptr * +GetPtr(octree_node_ptr_block_array *Arr, octree_node_ptr_block_array_index Index) +{ + octree_node_ptr *Result = {}; + if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + return Result; +} + +link_internal octree_node_ptr * +GetPtr(octree_node_ptr_block *Block, umm Index) +{ + octree_node_ptr *Result = 0; + if (Index < Block->At) { Result = Block->Elements + Index; } + return Result; +} + +link_internal octree_node_ptr * +GetPtr(octree_node_ptr_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + umm AtBlock = 0; + octree_node_ptr_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + octree_node_ptr *Result = Block->Elements+ElementIndex; + return Result; +} + +link_internal octree_node_ptr * +TryGetPtr(octree_node_ptr_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + octree_node_ptr *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(octree_node_ptr_block *Block) +{ + return Block->At; +} + + +link_internal octree_node_ptr_block* +Allocate_octree_node_ptr_block(memory_arena *Memory) +{ + octree_node_ptr_block *Result = Allocate(octree_node_ptr_block, Memory, 1); + Result->Elements = Allocate(octree_node_ptr, Memory, 8); + return Result; +} + +link_internal cs +CS(octree_node_ptr_block_array_index Index) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal void +RemoveUnordered(octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) +{ + octree_node_ptr_block_array_index LastI = LastIndex(Array); + + octree_node_ptr *Element = GetPtr(Array, Index); + octree_node_ptr *LastElement = GetPtr(Array, LastI); + + *Element = *LastElement; + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + octree_node_ptr_block *Current = Array->First; + octree_node_ptr_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal octree_node_ptr * +Push(octree_node_ptr_block_array *Array, octree_node_ptr *Element) +{ + if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + + if (Array->First == 0) { Array->First = Allocate_octree_node_ptr_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 8) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + octree_node_ptr_block *Next = Allocate_octree_node_ptr_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + octree_node_ptr *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + + diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h new file mode 100644 index 000000000..6b1b7983f --- /dev/null +++ b/generated/block_array_picked_octree_node_688853862.h @@ -0,0 +1,263 @@ +// src/engine/world.h:56:0 + +struct picked_octree_node_block +{ + u32 Index; + u32 At; + picked_octree_node *Elements; + picked_octree_node_block *Next; +}; + +struct picked_octree_node_block_array_index +{ + picked_octree_node_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct picked_octree_node_block_array +{ + picked_octree_node_block *First; + picked_octree_node_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +typedef picked_octree_node_block_array picked_octree_node_paged_list; + +link_internal picked_octree_node_block_array_index +operator++(picked_octree_node_block_array_index &I0) +{ + if (I0.Block) + { + if (I0.ElementIndex == 8-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<(picked_octree_node_block_array_index I0, picked_octree_node_block_array_index I1) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex(picked_octree_node_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*8); + return Result; +} + +link_internal picked_octree_node_block_array_index +ZerothIndex(picked_octree_node_block_array *Arr) +{ + picked_octree_node_block_array_index Result = {}; + Result.Block = Arr->First; + /* Assert(Result.Block->Index == 0); */ + return Result; +} + +link_internal umm +TotalElements(picked_octree_node_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 8) + Arr->Current->At; + } + return Result; +} + +link_internal picked_octree_node_block_array_index +LastIndex(picked_octree_node_block_array *Arr) +{ + picked_octree_node_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal picked_octree_node_block_array_index +AtElements(picked_octree_node_block_array *Arr) +{ + picked_octree_node_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal umm +Count(picked_octree_node_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + +link_internal picked_octree_node * +GetPtr(picked_octree_node_block_array *Arr, picked_octree_node_block_array_index Index) +{ + picked_octree_node *Result = {}; + if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + return Result; +} + +link_internal picked_octree_node * +GetPtr(picked_octree_node_block *Block, umm Index) +{ + picked_octree_node *Result = 0; + if (Index < Block->At) { Result = Block->Elements + Index; } + return Result; +} + +link_internal picked_octree_node * +GetPtr(picked_octree_node_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + umm AtBlock = 0; + picked_octree_node_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + picked_octree_node *Result = Block->Elements+ElementIndex; + return Result; +} + +link_internal picked_octree_node * +TryGetPtr(picked_octree_node_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + picked_octree_node *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(picked_octree_node_block *Block) +{ + return Block->At; +} + + +link_internal picked_octree_node_block* +Allocate_picked_octree_node_block(memory_arena *Memory) +{ + picked_octree_node_block *Result = Allocate(picked_octree_node_block, Memory, 1); + Result->Elements = Allocate(picked_octree_node, Memory, 8); + return Result; +} + +link_internal cs +CS(picked_octree_node_block_array_index Index) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal void +RemoveUnordered(picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) +{ + picked_octree_node_block_array_index LastI = LastIndex(Array); + + picked_octree_node *Element = GetPtr(Array, Index); + picked_octree_node *LastElement = GetPtr(Array, LastI); + + *Element = *LastElement; + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + picked_octree_node_block *Current = Array->First; + picked_octree_node_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal picked_octree_node * +Push(picked_octree_node_block_array *Array, picked_octree_node *Element) +{ + if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + + if (Array->First == 0) { Array->First = Allocate_picked_octree_node_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 8) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + picked_octree_node_block *Next = Allocate_picked_octree_node_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + picked_octree_node *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + + diff --git a/generated/bubble_sort_686708022.h b/generated/bubble_sort_686708022.h index 21a0aae9e..ed444f629 100644 --- a/generated/bubble_sort_686708022.h +++ b/generated/bubble_sort_686708022.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/sort.h:68:0 +// external/bonsai_stdlib/src/sort.h:108:0 link_internal void BubbleSort(sort_key *Keys, u32 Count) @@ -30,8 +30,39 @@ BubbleSort(sort_key *Keys, u32 Count) return; } + link_internal void -BubbleSort(sort_key_f *Keys, u32 Count) +BubbleSort_descending(sort_key *Keys, u32 Count) +{ + for (u32 Ignored = 0; + Ignored < Count; + ++Ignored) + { + b32 Sorted = True; + + for (u32 Inner = 0; + Inner < (Count-1); + ++Inner) + { + auto *KeyA = Keys+Inner; + auto *KeyB = Keys+Inner+1; + + if (*KeyA > *KeyB) + { + auto Temp = *KeyA; + *KeyA = *KeyB; + *KeyB = Temp; + Sorted = False; + } + } + + if (Sorted) break; + } + + return; +} +link_internal void +BubbleSort(sort_key_f64 *Keys, u32 Count) { for (u32 Ignored = 0; Ignored < Count; @@ -60,6 +91,98 @@ BubbleSort(sort_key_f *Keys, u32 Count) return; } + +link_internal void +BubbleSort_descending(sort_key_f64 *Keys, u32 Count) +{ + for (u32 Ignored = 0; + Ignored < Count; + ++Ignored) + { + b32 Sorted = True; + + for (u32 Inner = 0; + Inner < (Count-1); + ++Inner) + { + auto *KeyA = Keys+Inner; + auto *KeyB = Keys+Inner+1; + + if (*KeyA > *KeyB) + { + auto Temp = *KeyA; + *KeyA = *KeyB; + *KeyB = Temp; + Sorted = False; + } + } + + if (Sorted) break; + } + + return; +} +link_internal void +BubbleSort(sort_key_f32 *Keys, u32 Count) +{ + for (u32 Ignored = 0; + Ignored < Count; + ++Ignored) + { + b32 Sorted = True; + + for (u32 Inner = 0; + Inner < (Count-1); + ++Inner) + { + auto *KeyA = Keys+Inner; + auto *KeyB = Keys+Inner+1; + + if (*KeyA < *KeyB) + { + auto Temp = *KeyA; + *KeyA = *KeyB; + *KeyB = Temp; + Sorted = False; + } + } + + if (Sorted) break; + } + + return; +} + +link_internal void +BubbleSort_descending(sort_key_f32 *Keys, u32 Count) +{ + for (u32 Ignored = 0; + Ignored < Count; + ++Ignored) + { + b32 Sorted = True; + + for (u32 Inner = 0; + Inner < (Count-1); + ++Inner) + { + auto *KeyA = Keys+Inner; + auto *KeyB = Keys+Inner+1; + + if (*KeyA > *KeyB) + { + auto Temp = *KeyA; + *KeyA = *KeyB; + *KeyB = Temp; + Sorted = False; + } + } + + if (Sorted) break; + } + + return; +} link_internal void BubbleSort(sort_key_string *Keys, u32 Count) { @@ -91,3 +214,34 @@ BubbleSort(sort_key_string *Keys, u32 Count) return; } +link_internal void +BubbleSort_descending(sort_key_string *Keys, u32 Count) +{ + for (u32 Ignored = 0; + Ignored < Count; + ++Ignored) + { + b32 Sorted = True; + + for (u32 Inner = 0; + Inner < (Count-1); + ++Inner) + { + auto *KeyA = Keys+Inner; + auto *KeyB = Keys+Inner+1; + + if (*KeyA > *KeyB) + { + auto Temp = *KeyA; + *KeyA = *KeyB; + *KeyB = Temp; + Sorted = False; + } + } + + if (Sorted) break; + } + + return; +} + diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 3bd5ddda6..974d03c23 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:984:0 +// src/engine/editor.h:995:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index cb23a5563..66bdde115 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:977:0 +// src/engine/editor.h:988:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index b96178f06..a0608f02d 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:970:0 +// src/engine/editor.h:981:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_layered_brush_editor_0.h b/generated/default_marshal_layered_brush_editor_0.h index c129c95bc..0fc75a305 100644 --- a/generated/default_marshal_layered_brush_editor_0.h +++ b/generated/default_marshal_layered_brush_editor_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1082:0 +// src/engine/editor.h:1093:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_layered_brush_editor_1.h b/generated/default_marshal_layered_brush_editor_1.h index 1f4a473e8..2e7802a4f 100644 --- a/generated/default_marshal_layered_brush_editor_1.h +++ b/generated/default_marshal_layered_brush_editor_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1075:0 +// src/engine/editor.h:1086:0 RangeIterator(Index, (256)) { diff --git a/generated/default_marshal_layered_brush_editor_2.h b/generated/default_marshal_layered_brush_editor_2.h index 51035a7c4..ab899b238 100644 --- a/generated/default_marshal_layered_brush_editor_2.h +++ b/generated/default_marshal_layered_brush_editor_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1068:0 +// src/engine/editor.h:1079:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index bebba3026..b1700a422 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:848:0 +// src/engine/editor.h:859:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 8d23354b4..4815e6327 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -274,6 +274,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*,&Element->DrawGameCameraLocation), + CSz("DrawGameCameraLocation"), + Params + ); + + + + + + + PushNewRow(Ui); DoEditorUi(Ui, diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h new file mode 100644 index 000000000..7c0e849f1 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -0,0 +1,68 @@ +// src/engine/editor.h:535:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle maybe_ray", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(maybe_tag*,&Element->Tag), + CSz("Tag"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(ray*,&Element->Ray), + CSz("Ray"), + Params + ); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h new file mode 100644 index 000000000..bc60b4ba2 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -0,0 +1,68 @@ +// src/engine/editor.h:532:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle ray", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*,&Element->Origin), + CSz("Origin"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*,&Element->Dir), + CSz("Dir"), + Params + ); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index 25c2adf50..97aa7e235 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:515:0 +// src/engine/editor.h:520:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index af9660061..5c5edc54e 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:521:0 +// src/engine/editor.h:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 6bfc2ac4a..f960fedf8 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:518:0 +// src/engine/editor.h:523:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_world_edit_brush.h index 71d2a9f81..c0e47454d 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:785:0 +// src/engine/editor.h:796:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 367165071..178bda774 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:512:0 +// src/engine/editor.h:517:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h new file mode 100644 index 000000000..7ba42d7a4 --- /dev/null +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -0,0 +1,37 @@ +// src/engine/editor.h:512:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + { + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("No"), UiId(Window, "enum Maybe_No", Element), Params)) + { + *Element = Maybe_No; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Yes"), UiId(Window, "enum Maybe_Yes", Element), Params)) + { + *Element = Maybe_Yes; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + } + else + { + PushNewRow(Ui); + } +} + diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 975c2bb85..d8177ad7e 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:553:0 +// src/engine/editor.h:564:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index e5b0108af..6259579da 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:689:0 +// src/engine/editor.h:700:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 174a1e644..3f057c2e4 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:862:0 +// src/engine/editor.h:873:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 37bf109c5..01d92280e 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:703:0 +// src/engine/editor.h:714:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_mode.h index 196aed6dc..c774f4409 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:697:0 +// src/engine/editor.h:708:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h index d7f3e84d3..f357a80b0 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:676:0 +// src/engine/editor.h:687:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_mode_modifier Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 753249966..9ec6f5377 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:700:0 +// src/engine/editor.h:711:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 65480aa10..047390ba6 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -201,6 +201,13 @@ + + + + + + + @@ -684,6 +691,17 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + + + + + + + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index ea3d3d582..9ed44398f 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -201,6 +201,13 @@ + + + + + + + @@ -674,6 +681,17 @@ render_to_texture_async_params render_to_texture_async_params; + + + + + + + + + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 89995aa74..4ec1b1608 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -201,6 +201,13 @@ + + + + + + + @@ -674,6 +681,17 @@ type_render_to_texture_async_params, + + + + + + + + + + + diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index 1c6fe9b0a..525bca6cd 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:38:0 +// src/engine/world.h:44:0 struct octree_node_freelist { diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h index 93b658a14..126c3e43d 100644 --- a/generated/freelist_allocator_world_chunk.h +++ b/generated/freelist_allocator_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/world.h:41:0 +// src/engine/world.h:47:0 struct world_chunk_freelist { diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index 9b1773481..74d96f2c9 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:44:0 +// src/engine/world.h:50:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index e93458852..bc3273e8a 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:35:0 +// src/engine/world.h:41:0 struct octree_node_ptr_stack { diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 49654dce7..78cd0fa69 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3042:0 +// src/engine/world_chunk.cpp:3043:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index f263bc019..804bf85aa 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:539:0 +// src/engine/editor.h:550:0 link_internal ui_toggle_button_group RadioButtonGroup_level_editor_flags( renderer_2d *Ui, diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index d12771406..22b9ec165 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:551:0 +// src/engine/editor.h:562:0 link_internal ui_toggle_button_group RadioButtonGroup_ui_noise_type( renderer_2d *Ui, diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index ba4a5af1c..6f0f876d1 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:510:0 +// src/engine/editor.h:515:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h new file mode 100644 index 000000000..8b2a79f38 --- /dev/null +++ b/generated/string_and_value_tables_maybe_tag.h @@ -0,0 +1,44 @@ +// src/engine/editor.h:510:0 + +link_internal counted_string +ToStringPrefixless(maybe_tag Type) +{ + counted_string Result = {}; + switch (Type) + { + case Maybe_No: { Result = CSz("No"); } break; + case Maybe_Yes: { Result = CSz("Yes"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(maybe_tag Type) +{ + counted_string Result = {}; + switch (Type) + { + case Maybe_No: { Result = CSz("Maybe_No"); } break; + case Maybe_Yes: { Result = CSz("Maybe_Yes"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal maybe_tag +MaybeTag(counted_string S) +{ + maybe_tag Result = {}; + + if (StringsMatch(S, CSz("Maybe_No"))) { return Maybe_No; } + if (StringsMatch(S, CSz("Maybe_Yes"))) { return Maybe_Yes; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index ca5caf141..fb34e0354 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:812:0 +// src/engine/editor.h:823:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 9e448c9f8..131f99b7b 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:549:0 +// src/engine/editor.h:560:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_mode.h b/generated/string_and_value_tables_world_edit_mode.h index c4f858bbb..9af86638d 100644 --- a/generated/string_and_value_tables_world_edit_mode.h +++ b/generated/string_and_value_tables_world_edit_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:692:0 +// src/engine/editor.h:703:0 link_internal counted_string ToStringPrefixless(world_edit_mode Type) diff --git a/generated/string_and_value_tables_world_edit_mode_modifier.h b/generated/string_and_value_tables_world_edit_mode_modifier.h index bdeb54f55..3edf8ee21 100644 --- a/generated/string_and_value_tables_world_edit_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:679:0 +// src/engine/editor.h:690:0 link_internal counted_string ToStringPrefixless(world_edit_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 5a659cfeb..aed62bfc6 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:583:0 +// src/engine/editor.h:594:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/string_and_value_tables_world_update_op_shape_type.h b/generated/string_and_value_tables_world_update_op_shape_type.h index 6a1e35867..f96c6ef34 100644 --- a/generated/string_and_value_tables_world_update_op_shape_type.h +++ b/generated/string_and_value_tables_world_update_op_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:725:0 +// src/engine/editor.h:736:0 link_internal counted_string ToStringPrefixless(world_update_op_shape_type Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index a7e302727..01d61fb7a 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:684:0 +// src/engine/editor.h:695:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index bd019f49d..fa1a59310 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2056:0 +// src/engine/world_chunk.cpp:2057:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 09847c7d4..a62ca3fad 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2059:0 +// src/engine/world_chunk.cpp:2060:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index 6f6562b0f..ccd6a8791 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -257,7 +257,8 @@ void main() } deriv = normalize(deriv); - ColorValue = abs(deriv); + /* ColorValue = abs(deriv); */ + ColorValue = v3(0.75f); // Bias noise value to lower values as we get higher in z. // This creates a "plane" of terrain diff --git a/shaders/terrain/trunchet.fragmentshader b/shaders/terrain/trunchet.fragmentshader new file mode 100644 index 000000000..36ea14f18 --- /dev/null +++ b/shaders/terrain/trunchet.fragmentshader @@ -0,0 +1,79 @@ +uniform v3 WorldspaceBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out uint Output; + +// https://www.shadertoy.com/view/4td3zj +float heightMap(in vec2 p) { + + p *= 3.; + + // Hexagonal coordinates. + vec2 h = vec2(p.x + p.y*.57735, p.y*1.1547); + + // Closest hexagon center. + vec2 fh = floor(h); + vec2 f = h - fh; h = fh; + float c = fract((h.x + h.y)/3.); + h = c<.666 ? c<.333 ? h : h + 1. : h + step(f.yx, f); + + p -= vec2(h.x - h.y*.5, h.y*.8660254); + + // Rotate (flip, in this case) random hexagons. Otherwise, you'd have a bunch of circles only. + // Note that "h" is unique to each hexagon, so we can use it as the random ID. + c = fract(cos(dot(h, vec2(41, 289)))*43758.5453); // Reusing "c." + p -= p*step(c, .5)*2.; // Equivalent to: if (c<.5) p *= -1.; + + // Minimum squared distance to neighbors. Taking the square root after comparing, for speed. + // Three partitions need to be checked due to the flipping process. + p -= vec2(-1, 0); + c = dot(p, p); // Reusing "c" again. + p -= vec2(1.5, .8660254); + c = min(c, dot(p, p)); + p -= vec2(0, -1.73205); + c = min(c, dot(p, p)); + + return sqrt(c); + + // Wrapping the values - or folding the values over (abs(c-.5)*2., cos(c*6.283*1.), etc) - to produce + // the nicely lined-up, wavy patterns. I"m perfoming this step in the "map" function. It has to do + // with coloring and so forth. + //c = sqrt(c); + //c = cos(c*6.283*1.) + cos(c*6.283*2.); + //return (clamp(c*.6+.5, 0., 1.)); + +} + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); + + v3 Offset = V3(-1, -1, -1); + v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + Basis *= .2; + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.f); + f32 NoiseValue = 1000.f; + + // + // -- user code -- + // + { + f32 H = heightMap(Basis.xy/100.f); + NoiseValue = Basis.z - 10.f + H; + ColorValue = V3(H); + } + + // + // -- end user code -- + // + + uint SolidBit = NoiseValue > 0.0f ? 1u : 0u; + uint PackedColor = PackRGB(ColorValue); + + Output = (SolidBit << 15) | PackedColor; +} diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 0c8eb4249..424dd46ee 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -139,6 +139,15 @@ Bonsai_FrameBegin(engine_resources *Resources) DEBUG_DrawLine_Aligned(&CopyDest, V3(0,0,0), V3(0, 0, 10000), RGB_BLUE, 0.35f ); } + /* if (GetEngineDebug()->DrawGameCameraLocation) */ + { + if (Resources->Graphics.Camera == &Resources->Graphics.DebugCamera) + { + /* DEBUG_HighlightVoxel(Engine, Camera->ViewingTarget, RED); */ + DEBUG_HighlightVoxel(Resources, Graphics->GameCamera.CurrentP, RGB_PINK, 10.f); + } + } + Graphics->Lighting.Lights.Count = 0; @@ -148,20 +157,69 @@ Bonsai_FrameBegin(engine_resources *Resources) // // @camera-update-ui-update-frame-jank // + // + f32 LineWidth = 3.f; + LineWidth = .1f; if (UiHoveredMouseInput(Ui)) { - Resources->MaybeMouseRay = {}; - Resources->MousedOverVoxel = {}; - Resources->HoverEntity = {}; + // We want to preserve these when we swap to the debug camera + if (Camera == &Graphics->GameCamera) + { + Resources->MaybeMouseRay = {}; + Resources->MousedOverVoxel = {}; + Resources->HoverEntity = {}; + } } else { - Resources->MaybeMouseRay = ComputeRayFromCursor(Resources, &gBuffer->ViewProjection, Camera, World->ChunkDim); - Resources->MousedOverVoxel = MousePickVoxel(Resources); + if (Camera == &Graphics->GameCamera) + { + Resources->MaybeMouseRay = ComputeCameraSpaceRayFromCursor(Resources, &gBuffer->ViewProjection, &Resources->Graphics.GameCamera, World->ChunkDim); + + ray *Ray = &Resources->MaybeMouseRay.Ray; + v3 GameCameraSimSpaceP = GetSimSpaceP(World, Graphics->GameCamera.CurrentP); + Ray->Origin = GameCameraSimSpaceP; + } + + ray *Ray = &Resources->MaybeMouseRay.Ray; + + DEBUG_VALUE_r32(Ray->Origin.x); + DEBUG_VALUE_r32(Ray->Origin.y); + DEBUG_VALUE_r32(Ray->Origin.z); + + DEBUG_VALUE_r32(Ray->Dir.x); + DEBUG_VALUE_r32(Ray->Dir.y); + DEBUG_VALUE_r32(Ray->Dir.z); + + Resources->MousedOverVoxel = MousePickVoxel(Resources, Ray); Resources->HoverEntity = GetClosestEntityIntersectingRay(World, EntityTable, &Resources->MaybeMouseRay.Ray); } +#if 0 + { + ray *Ray = &Resources->MaybeMouseRay.Ray; + + { + untextured_3d_geometry_buffer Mesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_LINE); + DEBUG_DrawLine(&Mesh, V3(0.,0.,LineWidth) + Ray->Origin, Ray->Origin + Ray->Dir*50000.f, RGB_PINK, LineWidth ); + } + + picked_octree_node_block_array NodeList = GetOctreeLeafNodesIntersectingRay(World, Ray, GetTranArena()); + IterateOver(&NodeList, PickedNode, NodeIndex) + { + random_series Entropy = {Cast(u64, PickedNode->Node)}; + v3 Color = RandomV3Unilateral(&Entropy); + aabb AABB = GetSimSpaceAABB(World, PickedNode->Node); + DEBUG_DrawSimSpaceAABB(Resources, &AABB, Color, 3.f); + + v3 IntersectionPoint = Ray->Origin + Ray->Dir*PickedNode->t; + DEBUG_HighlightVoxel(Resources, IntersectionPoint, Color, 3); + + } + } +#endif + // Find closest standing spot to cursor { Resources->ClosestStandingSpotToCursor = {}; @@ -644,6 +702,10 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ { MakeFaceMasks_NoExteriorFaces(SynChunk->Occupancy, SynChunk->xOccupancyBorder, SynChunk->FaceMasks, SynChunk->Voxels, SynChunk->Dim, {}, SynChunk->Dim); + Assert(SynChunk->Dim.x == 64); + Assert(SynChunk->Dim.y == 66); + Assert(SynChunk->Dim.z == 66); + Assert(DestChunk->FilledCount == 0); Assert(DestChunk->Dim.x == 64); Assert(DestChunk->Dim.y == 64); @@ -651,7 +713,8 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ RangeIterator(z, 64) RangeIterator(y, 64) { - u64 Occ = DestChunk->Occupancy[y + z*64]; + u64 Occ = SynChunk->Occupancy[(y+1) + ((z+1)*66)]; + DestChunk->Occupancy[y + (z*64)] = Occ; DestChunk->FilledCount += CountBitsSet_Kernighan(Occ); } diff --git a/src/engine/camera.cpp b/src/engine/camera.cpp index 735d40d06..fab16b4b7 100644 --- a/src/engine/camera.cpp +++ b/src/engine/camera.cpp @@ -261,16 +261,15 @@ Unproject(v2 ScreenP, r32 ClipZDepth, v2 ScreenDim, m4 *InvViewProj) // // NOTE(Jesse): Returns a sim-space ray link_internal maybe_ray -ComputeRayFromCursor(engine_resources *Engine, m4* ViewProjection, camera *Camera, v3i WorldChunkDim) +ComputeCameraSpaceRayFromCursor(engine_resources *Engine, m4* ViewProjection, camera *Camera, v3i WorldChunkDim) { platform *Plat = &Engine->Stdlib.Plat; world *World = Engine->World; maybe_ray Result = {}; - m4 InverseViewProjection = {}; - b32 Inverted = Inverse((r32*)ViewProjection, (r32*)&InverseViewProjection); - if (Inverted) + m4 InverseViewProjection; + if (Inverse(Cast(r32*, ViewProjection), Cast(r32*, &InverseViewProjection))) { v3 MouseMinWorldP = Unproject( Plat->MouseP, 0.0f, @@ -286,8 +285,10 @@ ComputeRayFromCursor(engine_resources *Engine, m4* ViewProjection, camera *Camer /* DEBUG_HighlightVoxel(Engine, Camera->ViewingTarget, RED); */ /* v3 CameraOffset = Camera->ViewingTarget.Offset + V3(Camera->ViewingTarget.WorldP * WorldChunkDim); */ - v3 CameraOffset = GetSimSpaceP(World, ComputeTarget(Camera)); - /* v3 CameraOffset = V3(0); */ + /* v3 CameraOffset = GetSimSpaceP(World, ComputeTarget(Camera)); */ + /* v3 CameraOffset = GetSimSpaceP(World, Camera->CurrentP); */ + /* v3 CameraOffset = Camera->RenderSpacePosition; */ + v3 CameraOffset = V3(0); Result.Ray = { .Origin = MouseMinWorldP + CameraOffset, .Dir = RayDirection }; Result.Tag = Maybe_Yes; } diff --git a/src/engine/debug.h b/src/engine/debug.h index cc1ddd791..99981c829 100644 --- a/src/engine/debug.h +++ b/src/engine/debug.h @@ -66,6 +66,8 @@ struct engine_debug b8 MarkChunkBorderVoxels; + b8 DrawGameCameraLocation; + r64 ChunkGenTimeElapsedMS; u64 CellsGenerated; r64 ChunkGenCyclesElapsed; diff --git a/src/engine/debug_draw.cpp b/src/engine/debug_draw.cpp index 2f5f9b8a8..b7abd229f 100644 --- a/src/engine/debug_draw.cpp +++ b/src/engine/debug_draw.cpp @@ -22,8 +22,19 @@ DEBUG_DrawLine( untextured_3d_geometry_buffer *Mesh, v3 P1, v3 P2, v3 RGBColor, /* v3 Color = GetColorData(Color); */ vertex_material Materials[VERTS_PER_FACE]; +#if 1 FillArray(VertexMaterial(RGBtoPackedHSV(RGBColor), 0.f, 0.f), Materials, VERTS_PER_FACE); - /* FillColorArray(Color, Materials, Global_ColorPalette, VERTS_PER_FACE); */ +#else + + Materials[0] = VertexMaterial(RGBtoPackedHSV(RGBColor), 0.f, 0.f); + Materials[1] = {}; + Materials[2] = VertexMaterial(RGBtoPackedHSV(RGBColor), 0.f, 0.f); + + Materials[3] = VertexMaterial(RGBtoPackedHSV(RGBColor), 0.f, 0.f); + Materials[5] = {}; + Materials[4] = {}; + +#endif v2 TransEmiss[VERTS_PER_FACE] = {}; @@ -185,6 +196,7 @@ DEBUG_DrawAABB(untextured_3d_geometry_buffer *Mesh, v3 MinP, v3 MaxP, v3 RGBColo // Top #define LINES_PER_AABB (12) #define VERTS_PER_AABB (VERTS_PER_VOXEL*LINES_PER_AABB) +#if 0 DEBUG_DrawLine_Aligned(Mesh, TopRL, TopRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); DEBUG_DrawLine_Aligned(Mesh, TopFL, TopFR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); DEBUG_DrawLine_Aligned(Mesh, TopFL, TopRL, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); @@ -203,6 +215,26 @@ DEBUG_DrawAABB(untextured_3d_geometry_buffer *Mesh, v3 MinP, v3 MaxP, v3 RGBColo DEBUG_DrawLine_Aligned(Mesh, BotFL, BotFR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); DEBUG_DrawLine_Aligned(Mesh, BotFL, BotRL, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); DEBUG_DrawLine_Aligned(Mesh, BotFR, BotRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); +#else + DEBUG_DrawLine(Mesh, TopRL, TopRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine(Mesh, TopFL, TopFR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine(Mesh, TopFL, TopRL, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine(Mesh, TopFR, TopRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + + // Right + DEBUG_DrawLine(Mesh, TopFR, BotFR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine(Mesh, TopRR, BotRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + + // Left + DEBUG_DrawLine(Mesh, TopFL, BotFL, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine(Mesh, TopRL, BotRL, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + + // Bottom + DEBUG_DrawLine(Mesh, BotRL, BotRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine(Mesh, BotFL, BotFR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine(Mesh, BotFL, BotRL, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); + DEBUG_DrawLine(Mesh, BotFR, BotRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); +#endif } link_internal void diff --git a/src/engine/editor.h b/src/engine/editor.h index 363491307..24f05e213 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -507,6 +507,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, cp *Value, cs Name, EDITOR_UI DoEditorUi(Ui, Window, &Value->Offset, CSz("Offset")); } +poof(string_and_value_tables(maybe_tag)) +#include +poof(do_editor_ui_for_enum(maybe_tag)) +#include + poof(string_and_value_tables(data_type)) #include poof(do_editor_ui_for_enum(data_type)) @@ -524,6 +529,12 @@ poof(do_editor_ui_for_compound_type(rect3cp)) poof(block_array_h(asset_thumbnail, {8}, {})) #include +poof(do_editor_ui_for_compound_type(ray)) +#include + +poof(do_editor_ui_for_compound_type(maybe_ray)) +#include + struct selection_modification_state { face_index ClickedFace; diff --git a/src/engine/ray.h b/src/engine/ray.h index 728d22ea4..ddcabcae1 100644 --- a/src/engine/ray.h +++ b/src/engine/ray.h @@ -18,7 +18,6 @@ struct maybe_ray ray Ray; }; - struct aabb_intersect_result { face_index Face; @@ -104,6 +103,23 @@ Intersect(aabb AABB, ray *Ray) return Intersect(&AABB, Ray); } +link_internal b32 +Intersect(aabb *AABB, ray *Ray, r32 *t) +{ + b32 Result = False; + aabb_intersect_result IRes = Intersect(AABB, Ray); + + if (IRes.Face != FaceIndex_None) + { + Assert(IRes.t != f32_MAX); + *t = IRes.t; + Result = True; + } + return Result; +} + + + // https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-plane-and-ray-disk-intersection.html link_internal b32 diff --git a/src/engine/render.h b/src/engine/render.h index a2eee1f62..78d1fcbed 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -1,7 +1,7 @@ struct world_chunk; -#define GLOBAL_RENDER_SCALE_FACTOR (0.05f) +#define GLOBAL_RENDER_SCALE_FACTOR (1.00f) // NOTE(Jesse): Must match defines in header.glsl #define VERTEX_POSITION_LAYOUT_LOCATION 0 diff --git a/src/engine/render_position.h b/src/engine/render_position.h index 04643935a..1619adaf4 100644 --- a/src/engine/render_position.h +++ b/src/engine/render_position.h @@ -8,9 +8,8 @@ ComputeTarget(camera *Camera) inline v3 GetRenderP(cp P, camera *Camera, world_position WorldChunkDim) { - cp ViewingTarget = ComputeTarget(Camera); - cp TargetRelative = P-ViewingTarget; - v3 Result = TargetRelative.Offset + (V3(TargetRelative.WorldP) * WorldChunkDim); + cp CameraRelative = P-Camera->CurrentP; + v3 Result = CameraRelative.Offset + (V3(CameraRelative.WorldP) * WorldChunkDim); return Result; } diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 5d97e3414..be2fa39bd 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -436,7 +436,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) if (GpuMap->Buffer.At) { RenderImmediateGeometryToGBuffer(GetApplicationResolution(&Engine->Settings), GpuMap, Graphics); - RenderImmediateGeometryToShadowMap(GpuMap, Graphics); + /* RenderImmediateGeometryToShadowMap(GpuMap, Graphics); */ } Clear(&GpuMap->Buffer); diff --git a/src/engine/world.h b/src/engine/world.h index 09d05d137..f736d6c39 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -30,6 +30,12 @@ struct octree_node typedef octree_node* octree_node_ptr; +struct picked_octree_node +{ + octree_node *Node; + r32 t; +}; + poof(are_equal(octree_node)) #include poof(generate_stack(octree_node_ptr, {})) @@ -44,6 +50,12 @@ poof(freelist_allocator(world_chunk)) poof(generate_cursor(octree_node_ptr)) #include +poof(block_array(octree_node_ptr, {32})) +#include + +poof(block_array(picked_octree_node, {32})) +#include + struct world { v3i Center; // the world chunk position of the center of the visible region @@ -233,6 +245,11 @@ InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks); link_internal world * AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion); +link_internal rect3cp +GetBoundingBox(world *World, octree_node *Node); link_internal void SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue *Queue, octree_node *NodeToSplit, octree_node *Parent, memory_arena *Memory); + +link_internal rect3 +GetSimSpaceAABB(world *World, octree_node *Node); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index b7541cfb5..54a322cd4 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -72,6 +72,7 @@ FinalizeChunkInitialization(world_chunk *Chunk) UnSetFlag(&Chunk->Flags, Chunk_Queued); SetFlag(&Chunk->Flags, Chunk_VoxelsInitialized); + FullBarrier; } inline b32 @@ -4006,7 +4007,7 @@ GetStandingSpotsWithinRadiusSorted(world *World, standing_spot_buffer *Spots, cp v3 SimP = GetSimSpaceP(World, P); standing_spot_buffer UnsortedSpots = StandingSpotBuffer(Spots->Count, TempMemory); - sort_key_f *SortKeys = Allocate(sort_key_f, TempMemory, Spots->Count); + sort_key_f64 *SortKeys = Allocate(sort_key_f64, TempMemory, Spots->Count); r32 RadSq = Square(Radius); u32 ResultAt = 0; @@ -4150,24 +4151,27 @@ GetChunksIntersectingRay(world *World, ray *Ray, picked_world_chunk_static_buffe for (s32 x = Min.x; x < Max.x; ++ x) { world_position P = World_Position(x,y,z); - world_chunk *Chunk = GetWorldChunkFromHashtable( World, P ); - - if (Chunk) + /* world_chunk *Chunk = GetWorldChunkFromHashtable( World, P ); */ + + if (octree_node *Node = GetWorldChunkFromOctree( World, P )) { - /* aabb ChunkAABB = AABBMinDim( V3(World->ChunkDim*Chunk->WorldP), V3(World->ChunkDim) ); */ - aabb ChunkAABB = GetSimSpaceAABB(World, Chunk); - - aabb_intersect_result IntersectResult = Intersect(ChunkAABB, Ray); - if ( IntersectResult.Face != FaceIndex_None ) + if (world_chunk *Chunk = Node->Chunk) { - /* DEBUG_DrawSimSpaceAABB(GetEngineResources(), &ChunkAABB, RED); */ - r32 tChunk = IntersectResult.t; - if ( AllChunksBuffer ) { Push(AllChunksBuffer, Chunk, tChunk); } + /* aabb ChunkAABB = AABBMinDim( V3(World->ChunkDim*Chunk->WorldP), V3(World->ChunkDim) ); */ + aabb ChunkAABB = GetSimSpaceAABB(World, Chunk); - if (Chunk->FilledCount && tChunk < tChunkMin) + aabb_intersect_result IntersectResult = Intersect(ChunkAABB, Ray); + if ( IntersectResult.Face != FaceIndex_None ) { - ClosestChunk = Chunk; - tChunkMin = tChunk; + /* DEBUG_DrawSimSpaceAABB(GetEngineResources(), &ChunkAABB, RED); */ + r32 tChunk = IntersectResult.t; + if ( AllChunksBuffer ) { Push(AllChunksBuffer, Chunk, tChunk); } + + if (Chunk->FilledCount && tChunk < tChunkMin) + { + ClosestChunk = Chunk; + tChunkMin = tChunk; + } } } } @@ -4178,6 +4182,56 @@ GetChunksIntersectingRay(world *World, ray *Ray, picked_world_chunk_static_buffe return { .Chunk = ClosestChunk, .tChunk = r64(tChunkMin) }; } +link_internal void +IntersectOctreeLeaves_Recursive(world *World, ray *Ray, octree_node *Node, picked_octree_node_block_array *Intersections) +{ + aabb Box = GetSimSpaceAABB(World, Node); + r32 t; + if (Intersect(&Box, Ray, &t)) + { + switch(Node->Type) + { + InvalidCase(OctreeNodeType_Undefined); + + case OctreeNodeType_Leaf: + { + /* if (Node->Chunk && (Node->Chunk->Flags&Chunk_VoxelsInitialized) && t > 0) */ + if (t > 0) + { + picked_octree_node PNode = {Node, t}; + Push(Intersections, &PNode); + } + } break; + + case OctreeNodeType_Branch: + { + /* aabb AABB = GetSimSpaceAABB(World, Node); */ + /* DEBUG_DrawSimSpaceAABB(GetEngineResources(), &AABB, RGB_GREEN, 2.f); */ + IntersectOctreeLeaves_Recursive(World, Ray, Node->Children[0], Intersections); + IntersectOctreeLeaves_Recursive(World, Ray, Node->Children[1], Intersections); + IntersectOctreeLeaves_Recursive(World, Ray, Node->Children[2], Intersections); + IntersectOctreeLeaves_Recursive(World, Ray, Node->Children[3], Intersections); + IntersectOctreeLeaves_Recursive(World, Ray, Node->Children[4], Intersections); + IntersectOctreeLeaves_Recursive(World, Ray, Node->Children[5], Intersections); + IntersectOctreeLeaves_Recursive(World, Ray, Node->Children[6], Intersections); + IntersectOctreeLeaves_Recursive(World, Ray, Node->Children[7], Intersections); + } break; + } + } +} + +link_internal picked_octree_node_block_array +GetOctreeLeafNodesIntersectingRay(world *World, ray *Ray, memory_arena *Memory) +{ + picked_octree_node_block_array Result = {}; + Result.Memory = Memory; + + octree_node *Current = &World->Root; + IntersectOctreeLeaves_Recursive(World, Ray, Current, &Result); + + return Result; +} + link_internal world_chunk* GetChunksFromMouseP(engine_resources *Engine, picked_world_chunk_static_buffer *AllChunksBuffer) { @@ -4205,52 +4259,85 @@ WorldChunkAABB(world_chunk *Chunk, v3 WorldChunkDim) } link_internal picked_voxel -RayTraceCollision(engine_resources *Resources, canonical_position AbsRayOrigin, v3 RayDir) +RayTraceCollision(engine_resources *Engine, ray *Ray) { - UNPACK_ENGINE_RESOURCES(Resources); - Assert(Length(RayDir) <= 1.01f); - - /* { */ - /* untextured_3d_geometry_buffer VoxelMesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); */ - /* v3 RenderP = GetRenderP(World->ChunkDim, AbsRayOrigin, Camera); */ - /* DrawVoxel( &VoxelMesh, RenderP, V4(1,1,0,1), V3(11.f) ); */ - /* } */ + UNPACK_ENGINE_RESOURCES(Engine); b32 Collision = False; v3 WorldChunkDim = V3(World->ChunkDim); picked_world_chunk_static_buffer AllChunksBuffer = {}; - // TODO(Jesse): Use pre-computed ray on resources. - maybe_ray MaybeRay = ComputeRayFromCursor(Resources, &gBuffer->ViewProjection, Camera, World->ChunkDim); - if (MaybeRay.Tag == Maybe_Yes) { GetChunksIntersectingRay(World, &MaybeRay.Ray, &AllChunksBuffer); } + DEBUG_DrawSimSpaceVectorAt(Engine, Ray->Origin+V3(1,1,1), Ray->Dir*10000.f, RGB_PINK, 1.f); + picked_voxel Result = {}; +#if 1 + picked_octree_node_block_array NodeList = GetOctreeLeafNodesIntersectingRay(World, Ray, GetTranArena()); - v3 Advance = MaybeRay.Ray.Dir; - // b32 Hit = False; + u32 NodeCount = u32(Count(&NodeList)); - BubbleSort((sort_key_f*)AllChunksBuffer.E, (u32)AllChunksBuffer.At); + sort_key_f32 *SortKeys = Allocate(sort_key_f32, GetTranArena(), NodeCount); - picked_voxel Result = {}; - for (s64 ClosestChunkIndex = s64(AllChunksBuffer.At)-1; ClosestChunkIndex > -1; --ClosestChunkIndex) { - r32 tChunk = (r32)AllChunksBuffer.E[ClosestChunkIndex].tChunk; - world_chunk *ClosestChunk = AllChunksBuffer.E[ClosestChunkIndex].Chunk; + IterateOver(&NodeList, Node, NodeIndex) + { + umm I = GetIndex(&NodeIndex); + SortKeys[I].Index = Cast(u64, Node); + SortKeys[I].Value = Node->t; + } + } + + BubbleSort_descending(SortKeys, NodeCount); + + b32 Done = False; + /* IterateOver(&NodeList, PickedNode, NodeIndex) */ + RangeIterator_t(u32, SortKeyIndex, NodeCount) + { + picked_octree_node *PickedNode = Cast(picked_octree_node*, SortKeys[SortKeyIndex].Index); - if (ClosestChunk->FilledCount == 0) continue; + if (Done) break; + + octree_node *Node = PickedNode->Node; + r32 tChunk = PickedNode->t; + world_chunk *ClosestChunk = Node->Chunk; #if 0 { - aabb ChunkAABB = GetSimSpaceAABB(World, ClosestChunk); - DEBUG_DrawSimSpaceAABB(GetEngineResources(), &ChunkAABB, RED); + v3 Color = RGB_PINK; + if (Node->Chunk) + { + Color = RGB_YELLOW; + if (Node->Chunk->Flags & Chunk_VoxelsInitialized) + { + Color = RGB_GREEN; + } + } + else + { + Color = RGB_RED; + } + + aabb AABB = GetSimSpaceAABB(World, Node); + DEBUG_DrawSimSpaceAABB(Engine, &AABB, Color, 1.f); } #endif - v3 CollisionP = MaybeRay.Ray.Origin + (MaybeRay.Ray.Dir*tChunk); + if (Node->Chunk == 0) + { + continue; + } + + v3 Advance = Ray->Dir*0.1f; + + // TODO(Jesse): This should pass. + /* Assert (ClosestChunk->FilledCount > 0); */ + + v3 CollisionP = Ray->Origin + (Ray->Dir*tChunk); v3 StartP = CollisionP + (Advance*0.1f); - v3 AtP = StartP - GetSimSpaceP(World, Canonical_Position(V3(0), ClosestChunk->WorldP)); + v3 ChunkSimP = GetSimSpaceP(World, Canonical_Position(V3(0), ClosestChunk->WorldP)); + v3 AtP = (StartP - ChunkSimP) / V3(ClosestChunk->DimInChunks); u32 AxisIndex = 0; for (;;) @@ -4267,24 +4354,68 @@ RayTraceCollision(engine_resources *Resources, canonical_position AbsRayOrigin, voxel_position LocalTestP = Voxel_Position(AtP); if (IsFilledInChunk(ClosestChunk, LocalTestP, World->ChunkDim)) { - // Hit = True; - ClosestChunkIndex = -1; + Done = True; Result.Chunks[PickedVoxel_FirstFilled] = {ClosestChunk, r64(tChunk)}; Result.Picks[PickedVoxel_FirstFilled] = Canonical_Position(AtP, ClosestChunk->WorldP); + { + untextured_3d_geometry_buffer VoxMesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); + v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP*ClosestChunk->DimInChunks); + /* v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP); */ + DrawVoxel_MinDim( &VoxMesh, RenderMin, RGB_GREEN, V3(ClosestChunk->DimInChunks)); + } + break; } else { Result.Chunks[PickedVoxel_LastEmpty] = {ClosestChunk, r64(tChunk)}; Result.Picks[PickedVoxel_LastEmpty] = Canonical_Position(AtP, ClosestChunk->WorldP); + { + /* untextured_3d_geometry_buffer VoxMesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); */ + /* v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP*ClosestChunk->DimInChunks); */ + /* v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP); */ + /* DrawVoxel_MinDim( &VoxMesh, RenderMin, RGB_BLUE, V3(ClosestChunk->DimInChunks)); */ + } } AtP.E[AxisIndex] += Advance.E[AxisIndex]; AxisIndex = (AxisIndex + 1) % 3; } + +#if 1 + { + +#if 0 + { + random_series Entropy = {u64(ClosestChunk)}; + v3 Color = RandomV3Unilateral(&Entropy); + untextured_3d_geometry_buffer VoxMesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); + cp CollisionCP = SimSpaceToCanonical(World, CollisionP); + v3 RenderMin = GetRenderP(Engine, CollisionCP); + DrawVoxel_MinDim( &VoxMesh, RenderMin, Color, V3(ClosestChunk->DimInChunks)); + } +#endif + + v3 Color = RGB_RED; + if (ClosestChunk == Result.Chunks[PickedVoxel_FirstFilled].Chunk) + { + Color = RGB_GREEN; + } + else if (ClosestChunk == Result.Chunks[PickedVoxel_LastEmpty].Chunk) + { + Color = RGB_BLUE; + } + + untextured_3d_geometry_buffer Mesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_AABB); + DEBUG_DrawChunkAABB( &Mesh, Graphics, ClosestChunk, World->ChunkDim, Color, 2.f); + + } +#endif + } +#endif return Result; } @@ -4324,7 +4455,7 @@ RayTraceCollision(world_chunk *Chunk, chunk_dimension Dim, v3 StartingP, v3 Ray, } link_internal maybe_picked_voxel -MousePickVoxel(engine_resources *Resources) +MousePickVoxel(engine_resources *Resources, ray *Ray) { TIMED_FUNCTION(); @@ -4332,22 +4463,15 @@ MousePickVoxel(engine_resources *Resources) UNPACK_ENGINE_RESOURCES(Resources); -#if 0 - maybe_ray MaybeRay = Resources->MaybeMouseRay; - if (MaybeRay.Tag == Maybe_Yes) + picked_voxel RayResult = RayTraceCollision(Resources, Ray); + if (world_chunk *ClosestChunk = RayResult.Chunks[PickedVoxel_FirstFilled].Chunk) { - picked_voxel RayResult = RayTraceCollision( Resources, Camera->CurrentP, MaybeRay.Ray.Dir); - - if (world_chunk *ClosestChunk = RayResult.Chunks[PickedVoxel_FirstFilled].Chunk) - { - v3 MinP = V3(ClosestChunk->WorldP * World->ChunkDim); - v3 VoxelP = MinP + Truncate(RayResult.Picks[PickedVoxel_FirstFilled].Offset); + v3 MinP = V3(ClosestChunk->WorldP * World->ChunkDim); + v3 VoxelP = MinP + Truncate(RayResult.Picks[PickedVoxel_FirstFilled].Offset); - Result.Tag = Maybe_Yes; - Result.Value = RayResult; - } + Result.Tag = Maybe_Yes; + Result.Value = RayResult; } -#endif return Result; } From 52c8bd27633f238291aaf6b4013ed9b31d0087b8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 11 Nov 2024 06:43:04 -0700 Subject: [PATCH 135/421] Fix an off-by-one drawing bug --- ...mesh_functions_untextured_3d_geometry_buffer_v3.h | 8 ++++---- ...h_functions_untextured_3d_geometry_buffer_v3_u8.h | 8 ++++---- src/engine/api.cpp | 1 + src/engine/world_chunk.cpp | 12 ++++++------ 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index fa1a59310..37460faa7 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -27,12 +27,12 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, matl Materials[VERTS_PER_FACE]; s32 Result = 0; - for ( s32 zBlock = 1; zBlock < SrcChunkDim.z; ++zBlock ) + for ( s32 zBlock = 1; zBlock < SrcChunkDim.z-1; ++zBlock ) { - s32 z = zBlock; - for ( s32 yBlock = 1; yBlock < SrcChunkDim.y; ++yBlock ) + s32 z = zBlock-1; + for ( s32 yBlock = 1; yBlock < SrcChunkDim.y-1; ++yBlock ) { - s32 y = yBlock; + s32 y = yBlock-1; s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); u64 LeftFaces = FaceMasks[(OccupancyIndex*6)+0]; diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index a62ca3fad..1707931b0 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -27,12 +27,12 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, matl Materials[VERTS_PER_FACE]; s32 Result = 0; - for ( s32 zBlock = 1; zBlock < SrcChunkDim.z; ++zBlock ) + for ( s32 zBlock = 1; zBlock < SrcChunkDim.z-1; ++zBlock ) { - s32 z = zBlock; - for ( s32 yBlock = 1; yBlock < SrcChunkDim.y; ++yBlock ) + s32 z = zBlock-1; + for ( s32 yBlock = 1; yBlock < SrcChunkDim.y-1; ++yBlock ) { - s32 y = yBlock; + s32 y = yBlock-1; s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); u64 LeftFaces = FaceMasks[(OccupancyIndex*6)+0]; diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 424dd46ee..9c55ee781 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -690,6 +690,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ world_chunk *SynChunk = GetOrAllocate(&UserData->SynChunkFreelist, {}, Chunk1->Dim + V3i(0, 2, 2), Chunk1->DimInChunks, Thread->PermMemory); SynChunk->Flags = Chunk_Queued; + Assert(NoiseDim == V3i(66, 66, 66)); Assert(SynChunk->Dim == V3i(64, 66, 66)); v3i WorldBasis = {}; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 54a322cd4..9dd7e4096 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -1476,12 +1476,12 @@ poof( matl Materials[VERTS_PER_FACE]; s32 Result = 0; - for ( s32 zBlock = 1; zBlock < SrcChunkDim.z; ++zBlock ) + for ( s32 zBlock = 1; zBlock < SrcChunkDim.z-1; ++zBlock ) { - s32 z = zBlock; - for ( s32 yBlock = 1; yBlock < SrcChunkDim.y; ++yBlock ) + s32 z = zBlock-1; + for ( s32 yBlock = 1; yBlock < SrcChunkDim.y-1; ++yBlock ) { - s32 y = yBlock; + s32 y = yBlock-1; s32 OccupancyIndex = GetIndex(yBlock, zBlock, SrcChunkDim.yz); u64 LeftFaces = FaceMasks[(OccupancyIndex*6)+0]; @@ -4196,7 +4196,7 @@ IntersectOctreeLeaves_Recursive(world *World, ray *Ray, octree_node *Node, picke case OctreeNodeType_Leaf: { /* if (Node->Chunk && (Node->Chunk->Flags&Chunk_VoxelsInitialized) && t > 0) */ - if (t > 0) + /* if (t > 0) */ { picked_octree_node PNode = {Node, t}; Push(Intersections, &PNode); @@ -4327,7 +4327,7 @@ RayTraceCollision(engine_resources *Engine, ray *Ray) continue; } - v3 Advance = Ray->Dir*0.1f; + v3 Advance = Ray->Dir*0.01f; // TODO(Jesse): This should pass. /* Assert (ClosestChunk->FilledCount > 0); */ From f2b5525165e70305dac1c2306de5316dec3c39fc Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 11 Nov 2024 09:52:31 -0700 Subject: [PATCH 136/421] Turn off some debug code --- src/engine/world_chunk.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 9dd7e4096..7da87f257 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -4268,7 +4268,7 @@ RayTraceCollision(engine_resources *Engine, ray *Ray) picked_world_chunk_static_buffer AllChunksBuffer = {}; - DEBUG_DrawSimSpaceVectorAt(Engine, Ray->Origin+V3(1,1,1), Ray->Dir*10000.f, RGB_PINK, 1.f); + /* DEBUG_DrawSimSpaceVectorAt(Engine, Ray->Origin+V3(1,1,1), Ray->Dir*10000.f, RGB_PINK, 1.f); */ picked_voxel Result = {}; #if 1 @@ -4359,12 +4359,14 @@ RayTraceCollision(engine_resources *Engine, ray *Ray) Result.Chunks[PickedVoxel_FirstFilled] = {ClosestChunk, r64(tChunk)}; Result.Picks[PickedVoxel_FirstFilled] = Canonical_Position(AtP, ClosestChunk->WorldP); +#if 0 { untextured_3d_geometry_buffer VoxMesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP*ClosestChunk->DimInChunks); /* v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP); */ DrawVoxel_MinDim( &VoxMesh, RenderMin, RGB_GREEN, V3(ClosestChunk->DimInChunks)); } +#endif break; } @@ -4384,7 +4386,7 @@ RayTraceCollision(engine_resources *Engine, ray *Ray) AxisIndex = (AxisIndex + 1) % 3; } -#if 1 +#if 0 { #if 0 From de326b87f8eec0f4af202f651a82a2703240e84f Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 24 Nov 2024 07:53:31 -0700 Subject: [PATCH 137/421] Remove small bit of now-unnessary init code --- external/bonsai_stdlib | 2 +- src/engine/api.cpp | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 68b3cba0e..03b1e77db 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 68b3cba0ef801c6458ec8cd121d113ea2a0ca09b +Subproject commit 03b1e77db86f4c9bf64c4516ae138d0014d098c9 diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 9c55ee781..8188d0afc 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -589,11 +589,8 @@ Bonsai_Render(engine_resources *Engine) { layout DefaultLayout = {}; - DefaultLayout.DrawBounds = InvertedInfinityRectangle(); - render_state RenderState = {}; RenderState.Layout = &DefaultLayout; - RenderState.ClipRect = DISABLE_CLIPPING; SetWindowZDepths(Ui->CommandBuffer); FlushCommandBuffer(Ui, &RenderState, Ui->CommandBuffer, &DefaultLayout); From 93572639ad56e2e9292e7aed75c478b1b1703e09 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 24 Nov 2024 07:54:11 -0700 Subject: [PATCH 138/421] Random fafing with world gen --- examples/terrain_gen/game_constants.h | 4 +- generated/anonymous_input_Lwen2qoF.h | 2 +- jesse.make.sh | 4 +- shaders/terrain/cliffy_hills.fragmentshader | 116 ++++++++++++++------ src/engine/resources.cpp | 5 +- src/engine/world_chunk.cpp | 91 +-------------- 6 files changed, 92 insertions(+), 130 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index d542edd02..a24ba403f 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -18,8 +18,8 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ -/* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ -g_VisibleRegion = Chunk_Dimension(64, 64, 64); +g_VisibleRegion = Chunk_Dimension(128, 128, 128); +/* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 05d6cd6a1..7806137b2 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3291:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3297:0 if (Input->Dot.Clicked) { diff --git a/jesse.make.sh b/jesse.make.sh index aff4f18c0..931f25e36 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,7 +1,7 @@ #! /usr/bin/env bash -# OPT="-O2" -# +OPT="-O2" + ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/cliffy_hills.fragmentshader b/shaders/terrain/cliffy_hills.fragmentshader index e6f0a423b..fb27d926d 100644 --- a/shaders/terrain/cliffy_hills.fragmentshader +++ b/shaders/terrain/cliffy_hills.fragmentshader @@ -448,6 +448,16 @@ MapNoiseValueToFinal(f32 Value) return Result; } +f32 +RoundToNearestMultiple(f32 NumToRound, f32 Multiple) +{ + f32 Remainder = mod(NumToRound, Multiple); + if (Remainder == 0) + return NumToRound; + + return NumToRound + Multiple - Remainder; +} + void main() { f32 x = floor(gl_FragCoord.x); @@ -458,6 +468,24 @@ void main() v3 Offset = V3(0); v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); +#if 1 + { + v3 TileCoord = trunc(Basis/16.f); + TileCoord.z = 0.f; + f32 TileNoise = white_noise(TileCoord); + + f32 zMod = mod(Basis.z, 16.f)/16.f; + + f32 Soften = clamp(zMod-0.4f, 0.f, 1.f)*16.f; + + Basis.z = Basis.z - zMod + Soften; //+ TileNoise; + } +#endif + +#if 0 + Basis.z = RoundToNearestMultiple(Basis.z, 16.f); +#endif + // NOTE(Jesse): Set these in the -- user code -- section v3 ColorValue = V3(0.f); f32 NoiseValue = 0.f; @@ -466,10 +494,10 @@ void main() // -- user code -- // { - v3 Period = V3(10000.f); - float Amplitude = 10000.f; - /* f32 StartingZDepth = -800; */ - f32 StartingZDepth = 15000; + v3 Period = V3(1500.f); + float Amplitude = 500.f; + f32 StartingZDepth = 1000; + /* f32 StartingZDepth = 0; */ s32 Octaves = 6; NoiseValue = StartingZDepth; @@ -531,34 +559,6 @@ void main() f32 rng2d = white_noise(Basis.xy); f32 rng3d = white_noise(Basis); - f32 gravel_patch_stregth = value_noise_derivs(150+(Basis/300)).x; - gravel_patch_stregth = value_noise_derivs(150+(Basis/160)).x; - gravel_patch_stregth = value_noise_derivs(150+(Basis/80)).x; - gravel_patch_stregth += value_noise_derivs(150+(Basis/40)).x; - gravel_patch_stregth += value_noise_derivs(150+(Basis/20)).x; - gravel_patch_stregth += value_noise_derivs(150+(Basis/8)).x; - gravel_patch_stregth = max(gravel_patch_stregth, 0.f); - - - // Rocky edges - { - f32 MinDotValue = 0.6f; - v3 v = voronoi_noise(Basis/v3(20,20,20)); - f32 Power = 100*gravel_patch_stregth*Cliffness*abs(clamp(Cliffness-MinDotValue, -MinDotValue, 0)); - NoiseValue += v.x*Power; - ColorValue = mix(ColorValue, v3(1.0), Power/5*v.x); - } - { - f32 MinDotValue = 0.4f; - v3 v = voronoi_noise(Basis/v3(10,10,10)); - f32 Power = 400*gravel_patch_stregth*Cliffness*abs(clamp(Cliffness-MinDotValue, -MinDotValue, 0)); - NoiseValue += v.x*Power; - /* NoiseValue -= ((1.f/v.x)*2)*Power; */ - ColorValue = mix(ColorValue, v3(1.0), Power/3*v.x); - } - - - // Main cliffs { v3 v = voronoi_noise(Basis/v3(200,200,1800)); @@ -583,6 +583,15 @@ void main() } + f32 gravel_patch_stregth = value_noise_derivs(150+(Basis/300)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/160)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/80)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/40)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/20)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/8)).x; + gravel_patch_stregth = max(gravel_patch_stregth, 0.f); + + // Grass & Flowers { f32 n = clamp(rng2d-0.7f, 0.f, 1.f); @@ -620,19 +629,60 @@ void main() /* ColorValue = V3(GrassValue/1.f); */ } + // Rocky edges + { + f32 MinDotValue = 0.6f; + v3 v = voronoi_noise(Basis/v3(20,20,20)); + f32 Power = 100*gravel_patch_stregth*Cliffness*abs(clamp(Cliffness-MinDotValue, -MinDotValue, 0)); + if (v.x*Power > 3.f) + { + NoiseValue += v.x*Power; + ColorValue = v3(1.0); + } + } + /* { */ + /* f32 MinDotValue = 0.4f; */ + /* v3 v = voronoi_noise(Basis/v3(10,10,10)); */ + /* f32 Power = 400*gravel_patch_stregth*Cliffness*abs(clamp(Cliffness-MinDotValue, -MinDotValue, 0)); */ + /* NoiseValue += v.x*Power; */ + /* /1* NoiseValue -= ((1.f/v.x)*2)*Power; *1/ */ + /* ColorValue = mix(ColorValue, v3(1.0), Power/3*v.x); */ + /* } */ + + + { } + /* ColorValue = V3(Grassness, Cliffness, 0.f); */ /* ColorValue = V3(Cliffness); */ // Bias noise value to lower values as we get higher in z. // This creates a "plane" of terrain /* NoiseValue = NoiseValue - Basis.z + sin(Basis.x/500.f)*1000.f; */ - NoiseValue = NoiseValue - Basis.z + sin(Basis.x/5000.f)*10000.f - cos(Basis.y/8000.f)*8000.f;; + NoiseValue = NoiseValue - Basis.z + sin(Basis.x/500.f)*300.f - cos(Basis.y/800.f)*200.f;; + +#if 0 + if (NoiseValue <= 0) + { + v3 TileCoord = trunc(Basis/16.f); + TileCoord.z = 0.f; + + f32 TileNoise = white_noise(TileCoord)*14.f; + + f32 NoiseToTile = TileNoise - NoiseValue; + NoiseToTile = clamp(NoiseToTile, -1, 1); + + NoiseValue += NoiseToTile; + } +#endif + + + } // diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index be2fa39bd..d81ee7f44 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -456,6 +456,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) CompositeGameTexturesAndDisplay(Plat, Graphics); + UiFrameEnd(&Engine->Ui); @@ -482,8 +483,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { #if BONSAI_DEBUG_SYSTEM_API GetDebugState()->PushHistogramDataPoint(Timer->Ns); - // NOTE(Jesse): This skips the next timer, but it'll get hit - // on the next frame, so no worries .. + // NOTE(Jesse): This skips the next timer, but it'll get + // hit on the next frame, so no worries .. RemoveUnordered(&Graphics->GpuTimers, TimerIndex); #endif } diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 7da87f257..8923b8146 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3608,8 +3608,6 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, b32 MakeExteriorFaces = False, v3i NoiseBasisOffset = {} ) { - NotImplemented; -#if 0 /* HISTOGRAM_FUNCTION(); */ /* TIMED_FUNCTION(); */ @@ -3652,94 +3650,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, SyntheticChunk->FilledCount = s32(NoiseCallback( SyntheticChunk, NoiseBasisOffset, - NoiseParams, - UserData )); - -#if 0 -#else - // If the chunk didn't have any voxels filled, we're done - if (SyntheticChunk->FilledCount) - { - Assert(SyntheticChunk->Dim == SynChunkDim); - - /* MakeExteriorFaces = True; */ - if (MakeExteriorFaces) - { - MarkBoundaryVoxels_MakeExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->Voxels, SynChunkDim, Global_ChunkApronMinDim, SynChunkDim-Global_ChunkApronMaxDim); - } - else - { - MarkBoundaryVoxels_NoExteriorFaces(SyntheticChunk->Occupancy, SyntheticChunk->xOccupancyBorder, SyntheticChunk->FaceMasks, SyntheticChunk->Voxels, SynChunkDim, {}, SynChunkDim); - } - - Assert(DestChunk->FilledCount == 0); - Assert(DestChunk->Dim.x == 64); - Assert(DestChunk->Dim.y == 64); - Assert(DestChunk->Dim.z == 64); - RangeIterator(z, 64) - RangeIterator(y, 64) - { - u64 Occ = DestChunk->Occupancy[y + z*64]; - DestChunk->FilledCount += CountBitsSet_Kernighan(Occ); - } - - Assert(DestChunk->FilledCount <= s32(Volume(DestChunk->Dim))); - - // NOTE(Jesse): The DestChunk is finalized at the end of the routine - /* SetFlag(DestChunk, Chunk_VoxelsInitialized); */ - FinalizeChunkInitialization(SyntheticChunk); - - if (Flags & ChunkInitFlag_ComputeStandingSpots) - { - NotImplemented; - ComputeStandingSpots( SynChunkDim, SyntheticChunk, {{1,1,0}}, {{0,0,1}}, Global_StandingSpotDim, - DestChunk->Dim, 0, &DestChunk->StandingSpots, - Thread->TempMemory); - } - - geo_u3d *TempMesh = AllocateTempMesh(Thread->TempMemory, DataType_v3_u8); - - RebuildWorldChunkMesh(Thread, SyntheticChunk, {}, {}, MeshBit_Lod0, TempMesh, Thread->TempMemory); - TempMesh->At = 0; - - Assert( (Flags & ChunkInitFlag_GenLODs) == 0); - -#define FINALIZE_MESH_FOR_CHUNK(Src, Dest, Bit) \ - { \ - auto *SrcMesh = (Src)->Meshes.E[ToIndex(Bit)]; \ - if (SrcMesh) { \ - if (SrcMesh->At) { \ - DestChunk->HasMesh = True; \ - AtomicReplaceMesh(&(Dest)->Meshes, Bit, SrcMesh, SrcMesh->Timestamp); \ - } else { \ - DeallocateMesh(EngineResources, SrcMesh); \ - } \ - } \ - } - - { - TIMED_NAMED_BLOCK(Chunk_Finalize); - FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod0 ); - FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod1 ); - FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod2 ); - FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod3 ); - FINALIZE_MESH_FOR_CHUNK(SyntheticChunk, DestChunk, MeshBit_Lod4 ); -#undef FINALIZE_MESH_FOR_CHUNK - - Assert( (DestChunk->Flags & Chunk_VoxelsInitialized) == 0); - Assert( DestChunk->FilledCount <= s32(Volume(SyntheticChunk))); - - /* if (DestChunk->WorldP == V3i(0)) { RuntimeBreak(); } */ - } - - } - FinalizeChunkInitialization(DestChunk); - - auto Graphics = &EngineResources->Graphics; - Assert(Graphics->ChunksCurrentlyQueued > 0); - AtomicDecrement(&Graphics->ChunksCurrentlyQueued); -#endif -#endif + NoiseParams, UserData )); } // TODO(Jesse): Remove this thnk From 3781791e5bea9fce0cfa69c3cdf244698a0af5fa Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 24 Nov 2024 09:25:39 -0700 Subject: [PATCH 139/421] Cut out chunk init code from LayeredBrushEditor, drive selection region from a struct --- ...editor_ui_for_compound_type_level_editor.h | 123 +------ generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + jesse.make.sh | 2 +- src/engine/debug.cpp | 2 +- src/engine/editor.cpp | 324 +++++++++--------- src/engine/editor.h | 46 +-- src/engine/render.cpp | 4 +- 9 files changed, 206 insertions(+), 298 deletions(-) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 6cd7f7f26..539aea98f 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -160,51 +160,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*,&Element->MostRecentSelectionRegionMin), - CSz("MostRecentSelectionRegionMin"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*,&Element->NextSelectionRegionMin), - CSz("NextSelectionRegionMin"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*,&Element->EditorPreviewRegionMin), - CSz("EditorPreviewRegionMin"), - Params - ); - - - - - - - - DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there @@ -235,72 +190,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - Cast(b8*,&Element->SelectionChanged), - CSz("SelectionChanged"), - &DefaultUiRenderParams_Checkbox - ); - - - - - PushNewRow(Ui); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->SelectionClicks), - CSz("SelectionClicks"), - Params - ); - - - - - - - - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*,&Element->SelectionBase), - CSz("SelectionBase"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(rect3cp*,&Element->SelectionRegion), - CSz("SelectionRegion"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(rect3cp*,&Element->PrevSelectionRegion), - CSz("PrevSelectionRegion"), + Cast(selection_region*,&Element->Selection), + CSz("Selection"), Params ); @@ -326,21 +222,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(selection_modification_state*,&Element->Selection), - CSz("Selection"), - Params - ); - - - - - - - - DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 047390ba6..977ca30bb 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -712,6 +712,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 9ed44398f..0b63a23c9 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -702,6 +702,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 4ec1b1608..cef26ddec 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -702,6 +702,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/jesse.make.sh b/jesse.make.sh index 931f25e36..dddb34e4c 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index eb161a3b5..ec3dac231 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -517,7 +517,7 @@ DoAssetWindow(engine_resources *Engine) cs NewAssetFromSelectionFilename = CS(Engine->Editor.NewAssetFromSelectionFilename); Engine->Editor.NewAssetFromSelection = False; - world_chunk SaveChunk = GatherVoxelsOverlappingArea(Engine, Editor->SelectionRegion, GetTranArena()); + world_chunk SaveChunk = GatherVoxelsOverlappingArea(Engine, Editor->Selection.Region, GetTranArena()); cs SaveName = {}; if (EndsWith(NewAssetFromSelectionFilename, CSz(".chunk"))) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index c346214a6..660634ccd 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1005,7 +1005,7 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br v3i SelectionDim = GetSelectionDim(World, Editor); v3i RequiredLayerDim = GetRequiredDimForLayer(SelectionDim, Layer); - b32 ReallocChunk = Editor->SelectionChanged || Preview->Chunk.Dim != RequiredLayerDim; + b32 ReallocChunk = Editor->Selection.Changed || Preview->Chunk.Dim != RequiredLayerDim; b32 SettingsChanged = !AreEqual(Settings, PrevSettings); b32 UpdateVoxels = ReallocChunk || SettingsChanged; @@ -1122,7 +1122,7 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br ChunkInitFlag_Noop, UserData, True, - Settings->NoiseBasisOffset + V3i(GetAbsoluteP(Editor->SelectionRegion.Min, GetWorldChunkDim()))); + Settings->NoiseBasisOffset + V3i(GetAbsoluteP(Editor->Selection.Region.Min, GetWorldChunkDim()))); } break; } @@ -1170,7 +1170,7 @@ BrushSettingsForNoiseBrush(engine_resources *Engine, window_layout *Window, nois UNPACK_ENGINE_RESOURCES(Engine); PushTableStart(Ui); - if (SelectionComplete(Editor->SelectionClicks)) + if (SelectionComplete(Editor->Selection.Clicks)) { DoEditorUi(Ui, Window, &Layer->Type, CSz("NoiseType"), &DefaultUiRenderParams_Generic); PushTableStart(Ui); // TODO(Jesse): Necessary? @@ -1265,10 +1265,10 @@ DoSettingsForBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thum PushNewRow(Ui); } - PushTableStart(Ui); - InteractWithThumbnailTexture(Engine, Ui, Window, "noise preview interaction", &Preview->Thumbnail); - PushNewRow(Ui); - PushTableEnd(Ui); + /* PushTableStart(Ui); */ + /* InteractWithThumbnailTexture(Engine, Ui, Window, "noise preview interaction", &Preview->Thumbnail); */ + /* PushNewRow(Ui); */ + /* PushTableEnd(Ui); */ CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -1442,6 +1442,10 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti IsNewBrush = True; } + // + // Brush toolbar buttons + // +#if 1 { PushWindowStart(Ui, BrushSettingsWindow); memory_arena *Tran = GetTranArena(); @@ -1514,7 +1518,6 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti } else { - if (Button(Ui, CSz("New"), UiId(BrushSettingsWindow, "brush new", 0u))) { NewBrush(LayeredBrush); @@ -1557,10 +1560,117 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti } } + + { + b32 ReorderUp = False; + b32 ReorderDown = False; + b32 Duplicate = False; + b32 Delete = False; + s32 EditLayerIndex = 0; + PushTableStart(Ui); + RangeIterator(LayerIndex, LayeredBrush->LayerCount) + { + brush_layer *Layer = Layers + LayerIndex; + chunk_thumbnail *Preview = Previews + LayerIndex; + + ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", Layer); + if (ToggleButton(Ui, FSz("v Layer %d", LayerIndex), FSz("> Layer %d", LayerIndex), ToggleId)) + { + if (Button(Ui, CSz("Up"), UiId(BrushSettingsWindow, "layer_reorder_up", Layer))) + { + ReorderUp = True; + EditLayerIndex = LayerIndex; + } + + if (Button(Ui, CSz("Down"), UiId(BrushSettingsWindow, "layer_reorder_down", Layer))) + { + ReorderDown = True; + EditLayerIndex = LayerIndex; + } + + if (Button(Ui, CSz("Dup"), UiId(BrushSettingsWindow, "layer_duplicate", Layer))) + { + Duplicate = True; + EditLayerIndex = LayerIndex; + } + + if (Button(Ui, CSz("Del"), UiId(BrushSettingsWindow, "layer_delete", Layer))) + { + Delete = True; + EditLayerIndex = LayerIndex; + } + + DoSettingsForBrushLayer(Engine, Layer, Preview, BrushSettingsWindow); + } + + if (IsNewBrush && LayerIndex == 0) + { + SetToggleButton(Ui, ToggleId, True); + } + + PushNewRow(Ui); + } + PushTableEnd(Ui); + + if (ReorderUp) + { + if (EditLayerIndex > 0) + { + brush_layer *Layer = Layers + EditLayerIndex; + brush_layer Tmp = Layers[EditLayerIndex-1]; + Layers[EditLayerIndex-1].Settings = Layer->Settings; + Layer->Settings = Tmp.Settings; + } + } + + if (ReorderDown) + { + if (LayeredBrush->LayerCount) + { + if (EditLayerIndex < LayeredBrush->LayerCount-1) + { + brush_layer *Layer = Layers + EditLayerIndex; + brush_layer Tmp = Layers[EditLayerIndex+1]; + Layers[EditLayerIndex+1].Settings = Layer->Settings; + Layer->Settings = Tmp.Settings; + } + } + } + + if (Duplicate) + { + if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) + { + LayeredBrush->LayerCount += 1; + + // Shuffle layers forward. This conveniently duplicates the EditLayerIndex + RangeIteratorReverseRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) + { + Layers[LayerIndex].Settings = Layers[LayerIndex-1].Settings; + } + } + } + + if (Delete) + { + if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) + { + // Shuffle layers backwards, overwriting EditLayerIndex + RangeIteratorRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) + { + Layers[LayerIndex-1].Settings = Layers[LayerIndex].Settings; + } + + LayeredBrush->LayerCount -= 1; + } + } + } } +#endif - if (SelectionComplete(Editor->SelectionClicks)) +#if 0 + if (SelectionComplete(Editor->Selection.Clicks)) { b32 AnyChanges = False; RangeIterator(LayerIndex, LayeredBrush->LayerCount) @@ -1576,6 +1686,7 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti Editor->MostRecentSelectionRegionMin = Editor->SelectionRegion.Min; } } +#endif @@ -1605,113 +1716,12 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti } #endif + // NOTE(Jesse): This is old code for maintaining the world edit memory. We + // no longer need this, but I'm keeping it around for a bit in case I want to + // read it for some reason.. +#if 0 { - { - b32 ReorderUp = False; - b32 ReorderDown = False; - b32 Duplicate = False; - b32 Delete = False; - s32 EditLayerIndex = 0; - PushTableStart(Ui); - RangeIterator(LayerIndex, LayeredBrush->LayerCount) - { - brush_layer *Layer = Layers + LayerIndex; - chunk_thumbnail *Preview = Previews + LayerIndex; - - ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", Layer); - if (ToggleButton(Ui, FSz("v Layer %d", LayerIndex), FSz("> Layer %d", LayerIndex), ToggleId)) - { - if (Button(Ui, CSz("Up"), UiId(BrushSettingsWindow, "layer_reorder_up", Layer))) - { - ReorderUp = True; - EditLayerIndex = LayerIndex; - } - - if (Button(Ui, CSz("Down"), UiId(BrushSettingsWindow, "layer_reorder_down", Layer))) - { - ReorderDown = True; - EditLayerIndex = LayerIndex; - } - - if (Button(Ui, CSz("Dup"), UiId(BrushSettingsWindow, "layer_duplicate", Layer))) - { - Duplicate = True; - EditLayerIndex = LayerIndex; - } - - if (Button(Ui, CSz("Del"), UiId(BrushSettingsWindow, "layer_delete", Layer))) - { - Delete = True; - EditLayerIndex = LayerIndex; - } - - DoSettingsForBrushLayer(Engine, Layer, Preview, BrushSettingsWindow); - } - - if (IsNewBrush && LayerIndex == 0) - { - SetToggleButton(Ui, ToggleId, True); - } - - PushNewRow(Ui); - } - PushTableEnd(Ui); - - if (ReorderUp) - { - if (EditLayerIndex > 0) - { - brush_layer *Layer = Layers + EditLayerIndex; - brush_layer Tmp = Layers[EditLayerIndex-1]; - Layers[EditLayerIndex-1].Settings = Layer->Settings; - Layer->Settings = Tmp.Settings; - } - } - - if (ReorderDown) - { - if (LayeredBrush->LayerCount) - { - if (EditLayerIndex < LayeredBrush->LayerCount-1) - { - brush_layer *Layer = Layers + EditLayerIndex; - brush_layer Tmp = Layers[EditLayerIndex+1]; - Layers[EditLayerIndex+1].Settings = Layer->Settings; - Layer->Settings = Tmp.Settings; - } - } - } - - if (Duplicate) - { - if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) - { - LayeredBrush->LayerCount += 1; - - // Shuffle layers forward. This conveniently duplicates the EditLayerIndex - RangeIteratorReverseRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) - { - Layers[LayerIndex].Settings = Layers[LayerIndex-1].Settings; - } - } - } - - if (Delete) - { - if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) - { - // Shuffle layers backwards, overwriting EditLayerIndex - RangeIteratorRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) - { - Layers[LayerIndex-1].Settings = Layers[LayerIndex].Settings; - } - - LayeredBrush->LayerCount -= 1; - } - } - } - { world_chunk *Root_LayeredBrushPreview = &LayeredBrush->Preview.Chunk; Assert( (Root_LayeredBrushPreview->Flags&Chunk_Queued) == False ); @@ -1751,11 +1761,11 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti -#if 1 +#if 0 auto Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); if (LayeredBrush->SeedBrushWithSelection) { - if (SelectionComplete(Editor->SelectionClicks)) + if (SelectionComplete(Editor->Selection.Clicks)) { rect3cp GatherRegion = Editor->SelectionRegion; GatherRegion.Min.Offset -= V3(1); @@ -1836,6 +1846,7 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti } } +#endif PushWindowEnd(Ui, BrushSettingsWindow); } @@ -1897,21 +1908,21 @@ EditWorldSelection(engine_resources *Engine) aabb_intersect_result AABBTest = {}; - if (Editor->SelectionClicks) + if (Editor->Selection.Clicks) { r32 Thickness = 0.10f; - if (SelectionIncomplete(Editor->SelectionClicks)) + if (SelectionIncomplete(Editor->Selection.Clicks)) { if (Engine->MousedOverVoxel.Tag) { auto MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value); MouseP.Offset = Floor(MouseP.Offset); - cp MinP = Min(Editor->SelectionBase, MouseP); - cp MaxP = Max(Editor->SelectionBase, MouseP) + V3(1.f); + cp MinP = Min(Editor->Selection.Base, MouseP); + cp MaxP = Max(Editor->Selection.Base, MouseP) + V3(1.f); /* Assert(MinP <= MaxP); */ - Editor->SelectionRegion = RectMinMax(MinP, MaxP); + Editor->Selection.Region = RectMinMax(MinP, MaxP); } } else @@ -1928,23 +1939,23 @@ EditWorldSelection(engine_resources *Engine) { cp MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value, PickedVoxel_LastEmpty); - v3 SelectionDim = GetDim(GetSimSpaceRect(World, Editor->SelectionRegion)); + v3 SelectionDim = GetDim(GetSimSpaceRect(World, Editor->Selection.Region)); v3 SelectionRad = SelectionDim / 2.f; - Editor->SelectionRegion.Min = MouseP - SelectionRad; - Editor->SelectionRegion.Max = MouseP + SelectionRad; + Editor->Selection.Region.Min = MouseP - SelectionRad; + Editor->Selection.Region.Max = MouseP + SelectionRad; - Canonicalize(World, &Editor->SelectionRegion.Min); - Canonicalize(World, &Editor->SelectionRegion.Max); + Canonicalize(World, &Editor->Selection.Region.Min); + Canonicalize(World, &Editor->Selection.Region.Max); - Truncate(&Editor->SelectionRegion.Min.Offset); - Truncate(&Editor->SelectionRegion.Max.Offset); + Truncate(&Editor->Selection.Region.Min.Offset); + Truncate(&Editor->Selection.Region.Max.Offset); } } } - aabb SelectionAABB = GetSimSpaceRect(World, Editor->SelectionRegion); + aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); { if (Engine->MaybeMouseRay.Tag == Maybe_Yes) { @@ -1969,12 +1980,12 @@ EditWorldSelection(engine_resources *Engine) if ( Input->LMB.Clicked && (Input->Ctrl.Pressed || Input->Shift.Pressed || Input->Alt.Pressed) ) { v3 PlaneBaseP = Ray.Origin + (AABBTest.t*Ray.Dir); - Editor->Selection.ClickedFace = Face; - Editor->Selection.ClickedP[0] = PlaneBaseP; + Editor->Selection.ModState.ClickedFace = Face; + Editor->Selection.ModState.ClickedP[0] = PlaneBaseP; } } - if (Editor->Selection.ClickedFace) + if (Editor->Selection.ModState.ClickedFace) { world_edit_selection_mode SelectionMode = {}; @@ -2007,7 +2018,7 @@ EditWorldSelection(engine_resources *Engine) /* Info("%S", ToString(SelectionMode)); */ /* if (SelectionMode) { Ui->RequestedForceCapture = True; } */ - rect3i ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection, SelectionAABB); + rect3i ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB); if (!Input->LMB.Pressed) { @@ -2015,8 +2026,8 @@ EditWorldSelection(engine_resources *Engine) rect3cp ProposedSelection = SimSpaceToCanonical(World, &ModifiedSelection); // Make ModifiedSelection permanent - Editor->SelectionRegion = ProposedSelection; - Editor->Selection.ClickedFace = FaceIndex_None; + Editor->Selection.Region = ProposedSelection; + Editor->Selection.ModState.ClickedFace = FaceIndex_None; } } } @@ -2031,17 +2042,17 @@ EditWorldSelection(engine_resources *Engine) // Don't fire selection changed event when dragging selection with selection edit tool - if (Editor->SelectionClicks != 1) + if (Editor->Selection.Clicks != 1) { - if (AreEqual(Editor->SelectionRegion, Editor->PrevSelectionRegion)) + if (AreEqual(Editor->Selection.Region, Editor->Selection.PrevRegion)) { - Editor->SelectionChanged = False; + Editor->Selection.Changed = False; } else { - Editor->SelectionChanged = True; + Editor->Selection.Changed = True; } - Editor->PrevSelectionRegion = Editor->SelectionRegion; + Editor->Selection.PrevRegion = Editor->Selection.Region; } return AABBTest; @@ -2051,7 +2062,7 @@ link_internal cp GetSelectionCenterP(world *World, level_editor *Editor) { v3i Dim = GetSelectionDim(World, Editor); - cp Result = Canonicalize(World, Editor->SelectionRegion.Min + V3(Dim/2)); + cp Result = Canonicalize(World, Editor->Selection.Region.Min + V3(Dim/2)); return Result; } @@ -2223,7 +2234,7 @@ DoWorldEditor(engine_resources *Engine) // @selection_changed_flag // aabb_intersect_result AABBTest = EditWorldSelection(Engine); - aabb SelectionAABB = GetSimSpaceRect(World, Editor->SelectionRegion); + aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); ui_toggle_button_group WorldEditToolButtonGroup = {}; ui_toggle_button_group WorldEditModeButtonGroup = {}; @@ -2441,7 +2452,7 @@ DoWorldEditor(engine_resources *Engine) } chunk_data D = {Chunk->Flags, Chunk->Dim, Chunk->Occupancy, Chunk->xOccupancyBorder, Chunk->FaceMasks, Chunk->Voxels, Chunk->VoxelLighting}; - world_update_op_shape_params_chunk_data ChunkDataShape = { D, V3(Offset) + GetSimSpaceP(World, Editor->SelectionRegion.Min) - V3i(1) }; + world_update_op_shape_params_chunk_data ChunkDataShape = { D, V3(Offset) + GetSimSpaceP(World, Editor->Selection.Region.Min) - V3i(1) }; world_edit_shape Shape = { @@ -2458,22 +2469,22 @@ DoWorldEditor(engine_resources *Engine) case WorldEdit_Tool_Select: { if (Input->LMB.Clicked) - { switch (Editor->SelectionClicks) + { switch (Editor->Selection.Clicks) { case 0: { if (Engine->MousedOverVoxel.Tag) { - Editor->SelectionClicks += 1; + Editor->Selection.Clicks += 1; auto MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value); MouseP.Offset = Floor(MouseP.Offset); - Editor->SelectionBase = MouseP; + Editor->Selection.Base = MouseP; } } break; case 1: { - Editor->SelectionClicks += 1; + Editor->Selection.Clicks += 1; if (Editor->PreviousTool) { @@ -2591,11 +2602,11 @@ DoWorldEditor(engine_resources *Engine) if (Input->Ctrl.Pressed && Input->G.Clicked) { if (entity *Ghost = GetCameraGhost(Engine)) { Ghost->P = GetSelectionCenterP(World, Editor); } } - if (Editor->SelectionClicks == 2) + if (Editor->Selection.Clicks == 2) { if (Input->Ctrl.Pressed && Input->D.Clicked) { ApplyEditToRegion(Engine, &SelectionAABB, {}, {}, WorldEdit_Mode_Remove, WorldEdit_Modifier_Default); } - if (Input->Ctrl.Pressed && Input->C.Clicked) { Editor->CopyRegion = Editor->SelectionRegion; } + if (Input->Ctrl.Pressed && Input->C.Clicked) { Editor->CopyRegion = Editor->Selection.Region; } if (Input->Ctrl.Pressed && Input->V.Clicked) { @@ -2612,7 +2623,7 @@ DoWorldEditor(engine_resources *Engine) D.Dim = V3i(CopyDim); D.Voxels = V; - world_update_op_shape_params_chunk_data ChunkDataShape = { D, GetSimSpaceP(World, Editor->SelectionRegion.Min) }; + world_update_op_shape_params_chunk_data ChunkDataShape = { D, GetSimSpaceP(World, Editor->Selection.Region.Min) }; world_edit_shape Shape = { @@ -2623,12 +2634,19 @@ DoWorldEditor(engine_resources *Engine) } } + if (Editor->Selection.Changed) + { + Info("Changed"); + } + + + #if VOXEL_DEBUG_COLOR { cp DebugVoxel = {}; - if (Editor->SelectionClicks > 0) + if (Editor->Selection.Clicks > 0) { - DebugVoxel = Editor->SelectionRegion.Min; + DebugVoxel = Editor->Selection.Region.Min; } else if (Engine->MousedOverVoxel.Tag) { @@ -2668,7 +2686,7 @@ DrawEditorPreview(engine_resources *Engine, shader *Shader) layered_brush_editor *LayeredBrushEditor = &Editor->LayeredBrushEditor; v3i SmallestMinOffset = GetSmallestMinOffset(LayeredBrushEditor); Chunk = &LayeredBrushEditor->Preview.Chunk; - Basis = V3(SmallestMinOffset) + GetRenderP(Engine, Editor->EditorPreviewRegionMin) - V3i(1); + Basis = V3(SmallestMinOffset) - V3i(1); } break; default: {} break; diff --git a/src/engine/editor.h b/src/engine/editor.h index 24f05e213..81f264493 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1116,6 +1116,24 @@ struct asset_brush_settings +struct selection_region +{ + u32 Clicks; + + // NOTE(Jesse): We need to save the first point we clicked such that we can + // synthetically construct the region and construct it while we're clicking + // on a second point. The problem without this Base point is that we don't + // know if the point we clicked is the min or the max of the current box. + // There's probably a way to get around having this Base point, but it's not + // really a big deal. + cp Base; + + rect3cp Region; + rect3cp PrevRegion; // Change detection + b32 Changed; + + selection_modification_state ModState; +}; struct level_editor @@ -1135,26 +1153,16 @@ struct level_editor b32 RootChunkNeedsNewMesh; - cp MostRecentSelectionRegionMin; - cp NextSelectionRegionMin; - cp EditorPreviewRegionMin; - u64 EngineDebugViewModeToggleBits; - /* u16 SelectedColorIndex; */ u16 HoverColorIndex; - b32 SelectionChanged; - u32 SelectionClicks; - cp SelectionBase; + selection_region Selection; - rect3cp SelectionRegion; - rect3cp PrevSelectionRegion; // Change detection - // rect3cp CopyRegion; // Recorded when accel-clicking on the selection to manipulate it - selection_modification_state Selection; + /* selection_modification_state Selection; */ selection_modification_state Entity; asset_thumbnail_block_array AssetThumbnails; @@ -1185,22 +1193,20 @@ SelectionIncomplete(u32 SelectionClicks) link_internal void ResetSelection(level_editor *Editor) { - Editor->SelectionClicks = 0; - Editor->SelectionBase = {}; - Editor->SelectionRegion = {}; + Editor->Selection = {}; } link_internal void ResetSelectionIfIncomplete(level_editor *Editor) { - if (SelectionIncomplete(Editor->SelectionClicks)) { ResetSelection(Editor); } + if (SelectionIncomplete(Editor->Selection.Clicks)) { ResetSelection(Editor); } } link_internal rect3 GetSelectionRect(world *World, level_editor *Editor) { - v3 SelectionMinP = GetSimSpaceP(World, Editor->SelectionRegion.Min); - v3 SelectionMaxP = GetSimSpaceP(World, Editor->SelectionRegion.Max); + v3 SelectionMinP = GetSimSpaceP(World, Editor->Selection.Region.Min); + v3 SelectionMaxP = GetSimSpaceP(World, Editor->Selection.Region.Max); rect3 Result = RectMinMax(SelectionMinP, SelectionMaxP); return Result; @@ -1209,8 +1215,8 @@ GetSelectionRect(world *World, level_editor *Editor) link_internal v3i GetSelectionDim(world *World, level_editor *Editor) { - v3 SelectionMinP = GetSimSpaceP(World, Editor->SelectionRegion.Min); - v3 SelectionMaxP = GetSimSpaceP(World, Editor->SelectionRegion.Max); + v3 SelectionMinP = GetSimSpaceP(World, Editor->Selection.Region.Min); + v3 SelectionMaxP = GetSimSpaceP(World, Editor->Selection.Region.Max); v3i Result = V3i(SelectionMaxP - SelectionMinP); return Result; diff --git a/src/engine/render.cpp b/src/engine/render.cpp index c89b5cfd2..1f97d7463 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1349,7 +1349,7 @@ SetupGBufferShader(graphics *Graphics, v2i ApplicationResolution, b32 DoSelectio if (DoSelectionMasking) { - auto SelectionRegion = GetLevelEditor()->SelectionRegion; + auto SelectionRegion = GetLevelEditor()->Selection.Region; SelectionRegion.Min.Offset += V3(0.0001f); SelectionRegion.Max.Offset -= V3(0.0001f); Graphics->MinClipP_worldspace = GetRenderP(GetEngineResources(), SelectionRegion.Min); @@ -1391,7 +1391,7 @@ SetupShadowMapShader(graphics *Graphics, v2i ShadowMapResolution, b32 DoSelectio if (DoSelectionMasking) { - auto SelectionRegion = GetLevelEditor()->SelectionRegion; + auto SelectionRegion = GetLevelEditor()->Selection.Region; SelectionRegion.Min.Offset += V3(0.0001f); SelectionRegion.Max.Offset -= V3(0.0001f); Graphics->MinClipP_worldspace = GetRenderP(GetEngineResources(), SelectionRegion.Min); From 0aafcd805aa7c9c099c82ba8a100d222e04acf7c Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 30 Nov 2024 19:06:03 -0700 Subject: [PATCH 140/421] Rename layered_brush_editor -> layered_brush --- generated/block_array_world_edit_688735882.h | 263 ++++++++++++++++++ generated/block_array_world_edit_688853862.h | 263 ++++++++++++++++++ generated/default_marshal_layered_brush_0.h | 15 + generated/default_marshal_layered_brush_1.h | 30 ++ generated/default_marshal_layered_brush_2.h | 23 ++ ...ditor_ui_for_compound_type_layered_brush.h | 198 +++++++++++++ ...editor_ui_for_compound_type_level_editor.h | 12 +- generated/for_datatypes_0XxWqGSZ.h | 9 + generated/for_datatypes_fkubhsYl.h | 9 + generated/for_datatypes_kv3WBTai.h | 9 + generated/serdes_struct_layered_brush.h | 219 +++++++++++++++ generated/serdes_struct_layered_brush_0.h | 119 ++++++++ generated/serdes_struct_layered_brush_1.h | 167 +++++++++++ generated/serdes_struct_layered_brush_2.h | 147 ++++++++++ src/engine/editor.cpp | 44 +-- src/engine/editor.h | 46 +-- src/engine/render.cpp | 2 +- src/engine/resources.cpp | 4 +- src/engine/serdes.cpp | 16 +- 19 files changed, 1543 insertions(+), 52 deletions(-) create mode 100644 generated/block_array_world_edit_688735882.h create mode 100644 generated/block_array_world_edit_688853862.h create mode 100644 generated/default_marshal_layered_brush_0.h create mode 100644 generated/default_marshal_layered_brush_1.h create mode 100644 generated/default_marshal_layered_brush_2.h create mode 100644 generated/do_editor_ui_for_compound_type_layered_brush.h create mode 100644 generated/serdes_struct_layered_brush.h create mode 100644 generated/serdes_struct_layered_brush_0.h create mode 100644 generated/serdes_struct_layered_brush_1.h create mode 100644 generated/serdes_struct_layered_brush_2.h diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h new file mode 100644 index 000000000..46dd6f6b2 --- /dev/null +++ b/generated/block_array_world_edit_688735882.h @@ -0,0 +1,263 @@ +// src/engine/editor.h:1147:0 + +struct world_edit_block +{ + u32 Index; + u32 At; + world_edit *Elements; + world_edit_block *Next; +}; + +struct world_edit_block_array_index +{ + world_edit_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct world_edit_block_array +{ + world_edit_block *First; + world_edit_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +typedef world_edit_block_array world_edit_paged_list; + +link_internal world_edit_block_array_index +operator++(world_edit_block_array_index &I0) +{ + if (I0.Block) + { + if (I0.ElementIndex == 8-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<(world_edit_block_array_index I0, world_edit_block_array_index I1) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex(world_edit_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*8); + return Result; +} + +link_internal world_edit_block_array_index +ZerothIndex(world_edit_block_array *Arr) +{ + world_edit_block_array_index Result = {}; + Result.Block = Arr->First; + /* Assert(Result.Block->Index == 0); */ + return Result; +} + +link_internal umm +TotalElements(world_edit_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 8) + Arr->Current->At; + } + return Result; +} + +link_internal world_edit_block_array_index +LastIndex(world_edit_block_array *Arr) +{ + world_edit_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal world_edit_block_array_index +AtElements(world_edit_block_array *Arr) +{ + world_edit_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal umm +Count(world_edit_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + +link_internal world_edit * +GetPtr(world_edit_block_array *Arr, world_edit_block_array_index Index) +{ + world_edit *Result = {}; + if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + return Result; +} + +link_internal world_edit * +GetPtr(world_edit_block *Block, umm Index) +{ + world_edit *Result = 0; + if (Index < Block->At) { Result = Block->Elements + Index; } + return Result; +} + +link_internal world_edit * +GetPtr(world_edit_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + umm AtBlock = 0; + world_edit_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + world_edit *Result = Block->Elements+ElementIndex; + return Result; +} + +link_internal world_edit * +TryGetPtr(world_edit_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + world_edit *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(world_edit_block *Block) +{ + return Block->At; +} + + +link_internal world_edit_block* +Allocate_world_edit_block(memory_arena *Memory) +{ + world_edit_block *Result = Allocate(world_edit_block, Memory, 1); + Result->Elements = Allocate(world_edit, Memory, 8); + return Result; +} + +link_internal cs +CS(world_edit_block_array_index Index) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal void +RemoveUnordered(world_edit_block_array *Array, world_edit_block_array_index Index) +{ + world_edit_block_array_index LastI = LastIndex(Array); + + world_edit *Element = GetPtr(Array, Index); + world_edit *LastElement = GetPtr(Array, LastI); + + *Element = *LastElement; + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + world_edit_block *Current = Array->First; + world_edit_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal world_edit * +Push(world_edit_block_array *Array, world_edit *Element) +{ + if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + + if (Array->First == 0) { Array->First = Allocate_world_edit_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 8) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + world_edit_block *Next = Allocate_world_edit_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + world_edit *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + + diff --git a/generated/block_array_world_edit_688853862.h b/generated/block_array_world_edit_688853862.h new file mode 100644 index 000000000..9e7618702 --- /dev/null +++ b/generated/block_array_world_edit_688853862.h @@ -0,0 +1,263 @@ +// src/engine/editor.h:1132:0 + +struct world_edit_block +{ + u32 Index; + u32 At; + world_edit *Elements; + world_edit_block *Next; +}; + +struct world_edit_block_array_index +{ + world_edit_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct world_edit_block_array +{ + world_edit_block *First; + world_edit_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +typedef world_edit_block_array world_edit_paged_list; + +link_internal world_edit_block_array_index +operator++(world_edit_block_array_index &I0) +{ + if (I0.Block) + { + if (I0.ElementIndex == 8-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<(world_edit_block_array_index I0, world_edit_block_array_index I1) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex(world_edit_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*8); + return Result; +} + +link_internal world_edit_block_array_index +ZerothIndex(world_edit_block_array *Arr) +{ + world_edit_block_array_index Result = {}; + Result.Block = Arr->First; + /* Assert(Result.Block->Index == 0); */ + return Result; +} + +link_internal umm +TotalElements(world_edit_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 8) + Arr->Current->At; + } + return Result; +} + +link_internal world_edit_block_array_index +LastIndex(world_edit_block_array *Arr) +{ + world_edit_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal world_edit_block_array_index +AtElements(world_edit_block_array *Arr) +{ + world_edit_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal umm +Count(world_edit_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + +link_internal world_edit * +GetPtr(world_edit_block_array *Arr, world_edit_block_array_index Index) +{ + world_edit *Result = {}; + if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + return Result; +} + +link_internal world_edit * +GetPtr(world_edit_block *Block, umm Index) +{ + world_edit *Result = 0; + if (Index < Block->At) { Result = Block->Elements + Index; } + return Result; +} + +link_internal world_edit * +GetPtr(world_edit_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + umm AtBlock = 0; + world_edit_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + world_edit *Result = Block->Elements+ElementIndex; + return Result; +} + +link_internal world_edit * +TryGetPtr(world_edit_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + world_edit *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(world_edit_block *Block) +{ + return Block->At; +} + + +link_internal world_edit_block* +Allocate_world_edit_block(memory_arena *Memory) +{ + world_edit_block *Result = Allocate(world_edit_block, Memory, 1); + Result->Elements = Allocate(world_edit, Memory, 8); + return Result; +} + +link_internal cs +CS(world_edit_block_array_index Index) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal void +RemoveUnordered(world_edit_block_array *Array, world_edit_block_array_index Index) +{ + world_edit_block_array_index LastI = LastIndex(Array); + + world_edit *Element = GetPtr(Array, Index); + world_edit *LastElement = GetPtr(Array, LastI); + + *Element = *LastElement; + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + world_edit_block *Current = Array->First; + world_edit_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal world_edit * +Push(world_edit_block_array *Array, world_edit *Element) +{ + if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + + if (Array->First == 0) { Array->First = Allocate_world_edit_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 8) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + world_edit_block *Next = Allocate_world_edit_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + world_edit *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + + diff --git a/generated/default_marshal_layered_brush_0.h b/generated/default_marshal_layered_brush_0.h new file mode 100644 index 000000000..0fc75a305 --- /dev/null +++ b/generated/default_marshal_layered_brush_0.h @@ -0,0 +1,15 @@ +// src/engine/editor.h:1093:0 + +Live->LayerCount = Stored->LayerCount; + + + +RangeIterator(Index, 16) +{ + Live->Layers[Index] = Stored->Layers[Index]; + +} + + + + diff --git a/generated/default_marshal_layered_brush_1.h b/generated/default_marshal_layered_brush_1.h new file mode 100644 index 000000000..2e7802a4f --- /dev/null +++ b/generated/default_marshal_layered_brush_1.h @@ -0,0 +1,30 @@ +// src/engine/editor.h:1086:0 + +RangeIterator(Index, (256)) +{ + Live->NameBuf[Index] = Stored->NameBuf[Index]; + +} + + +Live->LayerCount = Stored->LayerCount; + + + +RangeIterator(Index, 16) +{ + Live->Layers[Index] = Stored->Layers[Index]; + +} + + +Live->SeedBrushWithSelection = Stored->SeedBrushWithSelection; + + + +Live->BrushFollowsCursor = Stored->BrushFollowsCursor; + + + + + diff --git a/generated/default_marshal_layered_brush_2.h b/generated/default_marshal_layered_brush_2.h new file mode 100644 index 000000000..ab899b238 --- /dev/null +++ b/generated/default_marshal_layered_brush_2.h @@ -0,0 +1,23 @@ +// src/engine/editor.h:1079:0 + +Live->LayerCount = Stored->LayerCount; + + + +RangeIterator(Index, 16) +{ + Live->Layers[Index] = Stored->Layers[Index]; + +} + + +Live->SeedBrushWithSelection = Stored->SeedBrushWithSelection; + + + +Live->BrushFollowsCursor = Stored->BrushFollowsCursor; + + + + + diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h new file mode 100644 index 000000000..76b3ed839 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -0,0 +1,198 @@ +// src/engine/editor.cpp:352:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle layered_brush", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + if (ToggleButton(Ui, CSz("v NameBuf[(256) + 1]"), CSz("> NameBuf[(256) + 1]"), UiId(Window, "toggle layered_brush char NameBuf", Element->NameBuf), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, (256) + 1) + { + DoEditorUi(Ui, Window, Element->NameBuf+ArrayIndex, FSz("NameBuf[%d]", ArrayIndex), Params); + + PushNewRow(Ui); + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*,&Element->LayerCount), + CSz("LayerCount"), + Params + ); + + + + + + + + PushNewRow(Ui); + + if (ToggleButton(Ui, CSz("v Layers[16]"), CSz("> Layers[16]"), UiId(Window, "toggle layered_brush brush_layer Layers", Element->Layers), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 16) + { + DoEditorUi(Ui, Window, Element->Layers+ArrayIndex, FSz("Layers[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + if (ToggleButton(Ui, CSz("v LayerPreviews[16]"), CSz("> LayerPreviews[16]"), UiId(Window, "toggle layered_brush chunk_thumbnail LayerPreviews", Element->LayerPreviews), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 16) + { + DoEditorUi(Ui, Window, Element->LayerPreviews+ArrayIndex, FSz("LayerPreviews[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(chunk_thumbnail*,&Element->SeedLayer), + CSz("SeedLayer"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*,&Element->SeedBrushWithSelection), + CSz("SeedBrushWithSelection"), + Params + ); + + + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*,&Element->BrushFollowsCursor), + CSz("BrushFollowsCursor"), + Params + ); + + + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_mode*,&Element->Mode), + CSz("Mode"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_mode_modifier*,&Element->Modifier), + CSz("Modifier"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(chunk_thumbnail*,&Element->Preview), + CSz("Preview"), + Params + ); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 539aea98f..ee38ef0b2 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -119,8 +119,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(layered_brush_editor*,&Element->LayeredBrushEditor), - CSz("LayeredBrushEditor"), + Cast(layered_brush*,&Element->LayeredBrush), + CSz("LayeredBrush"), Params ); @@ -282,6 +282,14 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_block_array*,&Element->WorldEdits), + CSz("WorldEdits"), + Params + ); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 977ca30bb..923f5c6f0 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -211,6 +211,10 @@ + + + + @@ -709,6 +713,11 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 0b63a23c9..5c7f2b121 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -211,6 +211,10 @@ + + + + @@ -699,6 +703,11 @@ render_to_texture_async_params render_to_texture_async_params; + + + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index cef26ddec..2a0239e03 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -211,6 +211,10 @@ + + + + @@ -699,6 +703,11 @@ type_render_to_texture_async_params, + + + + + diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h new file mode 100644 index 000000000..8a8f034de --- /dev/null +++ b/generated/serdes_struct_layered_brush.h @@ -0,0 +1,219 @@ +// src/engine/serdes.cpp:572:0 + +link_internal bonsai_type_info +TypeInfo(layered_brush *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("layered_brush"); + Result.Version =3 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, layered_brush *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); + u64 VersionNumber =3; + Serialize(Bytes, &VersionNumber); + + + RangeIterator_t(umm, ElementIndex, Count) + { + layered_brush *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->LayerCount); + + + + + + { + // TODO(Jesse): Should this really be a safe cast? + umm ThisCount = umm(Element->LayerCount); + + Result &= Serialize(Bytes, Element->Layers, ThisCount); + } + + + + + + Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); + + + + + + Result &= Serialize(Bytes, &Element->BrushFollowsCursor); + + + + + + Result &= Serialize(Bytes, (u32*)&Element->Mode); + + + + + Result &= Serialize(Bytes, (u32*)&Element->Modifier); + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, layered_brush *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena *Memory); + + +link_internal b32 +DeserializeVersioned(u8_cursor *Bytes, layered_brush *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) +{ + Assert(TypeInfo->Version <=3); + + b32 Result = True; + + if (TypeInfo->Version == 0) + { + layered_brush_0 T0 = {}; + Result &= Deserialize(Bytes, &T0, Memory); + Marshal(&T0, Element); + } + if (TypeInfo->Version == 1) + { + layered_brush_1 T1 = {}; + Result &= Deserialize(Bytes, &T1, Memory); + Marshal(&T1, Element); + } + if (TypeInfo->Version == 2) + { + layered_brush_2 T2 = {}; + Result &= Deserialize(Bytes, &T2, Memory); + Marshal(&T2, Element); + } + + + if (TypeInfo->Version ==3) + { + Result &= DeserializeCurrentVersion(Bytes, Element, Memory); + } + + return Result; +} + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->LayerCount, Memory); + + + + + + { + // TODO(Jesse): Should this really be a safe cast? + umm Count = umm(Element->LayerCount); + + Result &= Deserialize(Bytes, Element->Layers, Memory, Count); + } + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->BrushFollowsCursor, Memory); + + + + + + Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); + + + + + Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, layered_brush *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("layered_brush")); + + if (MaybeSerializedType.Tag) + { + u64 OldIgnoredVersionNumber; + if (MaybeSerializedType.Value.Version > 0) + { + Deserialize(Bytes, &OldIgnoredVersionNumber, Memory); + } + Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &MaybeSerializedType.Value, Memory); + } + else + { + bonsai_type_info T0TypeInfo = {}; + Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &T0TypeInfo, Memory); + } + + } + + return Result; +} + + diff --git a/generated/serdes_struct_layered_brush_0.h b/generated/serdes_struct_layered_brush_0.h new file mode 100644 index 000000000..a70578bc2 --- /dev/null +++ b/generated/serdes_struct_layered_brush_0.h @@ -0,0 +1,119 @@ +// src/engine/serdes.cpp:566:0 + +link_internal bonsai_type_info +TypeInfo(layered_brush_0 *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("layered_brush_0"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, layered_brush_0 *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + layered_brush_0 *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->LayerCount); + + + + + + { + // TODO(Jesse): Should this really be a safe cast? + umm ThisCount = umm(Element->LayerCount); + + Result &= Serialize(Bytes, Element->Layers, ThisCount); + } + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, layered_brush_0 *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_0 *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_0 *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->LayerCount, Memory); + + + + + + { + // TODO(Jesse): Should this really be a safe cast? + umm Count = umm(Element->LayerCount); + + Result &= Deserialize(Bytes, Element->Layers, Memory, Count); + } + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, layered_brush_0 *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serdes_struct_layered_brush_1.h b/generated/serdes_struct_layered_brush_1.h new file mode 100644 index 000000000..b77a470ba --- /dev/null +++ b/generated/serdes_struct_layered_brush_1.h @@ -0,0 +1,167 @@ +// src/engine/serdes.cpp:568:0 + +link_internal bonsai_type_info +TypeInfo(layered_brush_1 *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("layered_brush_1"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, layered_brush_1 *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + layered_brush_1 *Element = BaseElement + ElementIndex; + { + umm ThisCount = (256); + + Result &= Serialize(Bytes, Element->NameBuf, ThisCount); + } + + + + + + Result &= Serialize(Bytes, &Element->LayerCount); + + + + + + { + // TODO(Jesse): Should this really be a safe cast? + umm ThisCount = umm(Element->LayerCount); + + Result &= Serialize(Bytes, Element->Layers, ThisCount); + } + + + + + + Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); + + + + + + Result &= Serialize(Bytes, &Element->BrushFollowsCursor); + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, layered_brush_1 *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_1 *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_1 *Element, memory_arena *Memory) +{ + b32 Result = True; + { + umm Count = (256); + + Result &= Deserialize(Bytes, Element->NameBuf, Memory, Count); + } + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->LayerCount, Memory); + + + + + + { + // TODO(Jesse): Should this really be a safe cast? + umm Count = umm(Element->LayerCount); + + Result &= Deserialize(Bytes, Element->Layers, Memory, Count); + } + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->BrushFollowsCursor, Memory); + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, layered_brush_1 *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serdes_struct_layered_brush_2.h b/generated/serdes_struct_layered_brush_2.h new file mode 100644 index 000000000..9d0bffec4 --- /dev/null +++ b/generated/serdes_struct_layered_brush_2.h @@ -0,0 +1,147 @@ +// src/engine/serdes.cpp:570:0 + +link_internal bonsai_type_info +TypeInfo(layered_brush_2 *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("layered_brush_2"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, layered_brush_2 *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + layered_brush_2 *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->LayerCount); + + + + + + { + // TODO(Jesse): Should this really be a safe cast? + umm ThisCount = umm(Element->LayerCount); + + Result &= Serialize(Bytes, Element->Layers, ThisCount); + } + + + + + + Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); + + + + + + Result &= Serialize(Bytes, &Element->BrushFollowsCursor); + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, layered_brush_2 *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_2 *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_2 *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->LayerCount, Memory); + + + + + + { + // TODO(Jesse): Should this really be a safe cast? + umm Count = umm(Element->LayerCount); + + Result &= Deserialize(Bytes, Element->Layers, Memory, Count); + } + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->BrushFollowsCursor, Memory); + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, layered_brush_2 *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 660634ccd..8dd1cb47b 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -32,10 +32,10 @@ InitEditor(level_editor *Editor) RangeIterator(LayerIndex, MAX_BRUSH_LAYERS) { - Editor->LayeredBrushEditor.LayerPreviews[LayerIndex].Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); + Editor->LayeredBrush.LayerPreviews[LayerIndex].Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); } - Editor->LayeredBrushEditor.SeedLayer.Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); - Editor->LayeredBrushEditor.Preview.Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); + Editor->LayeredBrush.SeedLayer.Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); + Editor->LayeredBrush.Preview.Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); return Result; } @@ -349,8 +349,8 @@ poof(do_editor_ui_for_compound_type(noise_layer)) poof(do_editor_ui_for_compound_type(brush_layer)) #include -poof(do_editor_ui_for_compound_type(layered_brush_editor)) -#include +poof(do_editor_ui_for_compound_type(layered_brush)) +#include link_internal void @@ -1348,7 +1348,7 @@ ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *P } link_internal v3i -GetSmallestMinOffset(layered_brush_editor *LayeredBrush, v3i *LargestLayerDim) +GetSmallestMinOffset(layered_brush *LayeredBrush, v3i *LargestLayerDim) { v3i SmallestMinOffset = V3i(s32_MAX); @@ -1385,7 +1385,7 @@ GetFilenameForBrush(cs Name, s32 Version = 0) } link_internal void -SaveBrush(layered_brush_editor *LayeredBrush, const char *FilenameZ) +SaveBrush(layered_brush *LayeredBrush, const char *FilenameZ) { u8_cursor_block_array OutputStream = BeginSerialization(); Serialize(&OutputStream, LayeredBrush); @@ -1406,7 +1406,7 @@ SaveBrush(layered_brush_editor *LayeredBrush, const char *FilenameZ) link_internal void -NewBrush(layered_brush_editor *LayeredBrush) +NewBrush(layered_brush *LayeredBrush) { cs BrushNameBuf = CS(LayeredBrush->NameBuf, NameBuf_Len); brush_layer *Layers = LayeredBrush->Layers; @@ -1429,7 +1429,7 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti { UNPACK_ENGINE_RESOURCES(Engine); - layered_brush_editor *LayeredBrush = &Editor->LayeredBrushEditor; + layered_brush *LayeredBrush = &Editor->LayeredBrush; brush_layer *Layers = LayeredBrush->Layers; chunk_thumbnail *Previews = LayeredBrush->LayerPreviews; @@ -1501,10 +1501,10 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti { cs Filename = Concat(ClickedFileNode.Value.Dir, CSz("/"), ClickedFileNode.Value.Name, Tran); u8_cursor Bytes = BeginDeserialization(Filename, Tran); - if (Deserialize(&Bytes, &Editor->LayeredBrushEditor, Tran) == False) + if (Deserialize(&Bytes, &Editor->LayeredBrush, Tran) == False) { SoftError("While deserializing brush (%S).", Filename); - Editor->LayeredBrushEditor = {}; + Editor->LayeredBrush = {}; } FinalizeDeserialization(&Bytes); @@ -1703,14 +1703,14 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti world_chunk *SeedChunk = &LayeredBrush->SeedLayer.Chunk; chunk_thumbnail *SeedPreview = &LayeredBrush->SeedLayer; if (SeedPreview->Thumbnail.Texture.ID) { RenderToTexture_Async(&Plat->RenderQ, Engine, &SeedPreview->Thumbnail, &SeedChunk->Meshes, V3(SeedChunk->Dim)/-2.f, 0); } - InteractWithThumbnailTexture(Engine, Ui, BrushSettingsWindow, "seed preview interaction", &Editor->LayeredBrushEditor.SeedLayer.Thumbnail); + InteractWithThumbnailTexture(Engine, Ui, BrushSettingsWindow, "seed preview interaction", &Editor->LayeredBrush.SeedLayer.Thumbnail); PushNewRow(Ui); PushTableEnd(Ui); PushTableStart(Ui); world_chunk *Root_LayeredBrushPreview = &LayeredBrush->Preview.Chunk; if (SeedPreview->Thumbnail.Texture.ID) { RenderToTexture_Async(&Plat->RenderQ, Engine, &LayeredBrush->Preview.Thumbnail, &Root_LayeredBrushPreview->Meshes, V3(Root_LayeredBrushPreview->Dim)/-2.f, 0); } - InteractWithThumbnailTexture(Engine, Ui, BrushSettingsWindow, "root preview interaction", &Editor->LayeredBrushEditor.Preview.Thumbnail); + InteractWithThumbnailTexture(Engine, Ui, BrushSettingsWindow, "root preview interaction", &Editor->LayeredBrush.Preview.Thumbnail); PushNewRow(Ui); PushTableEnd(Ui); } @@ -1932,7 +1932,7 @@ EditWorldSelection(engine_resources *Engine) if (CurrentToolIs(Editor, WorldEdit_Tool_Brush, WorldEdit_BrushType_Layered)) { - layered_brush_editor *Brush = &Editor->LayeredBrushEditor; + layered_brush *Brush = &Editor->LayeredBrush; if (Brush->BrushFollowsCursor) { if (Engine->MousedOverVoxel.Tag) @@ -2094,7 +2094,7 @@ GetEditModeForSelectedTool(level_editor *Editor) case WorldEdit_BrushType_Entity: {} break; case WorldEdit_BrushType_Single: { Result = Editor->SingleBrush.Mode; } break; case WorldEdit_BrushType_Asset: { Result = Editor->AssetBrush.Mode; } break; - case WorldEdit_BrushType_Layered: { Result = Editor->LayeredBrushEditor.Mode;} break; + case WorldEdit_BrushType_Layered: { Result = Editor->LayeredBrush.Mode;} break; } } break; } @@ -2442,12 +2442,12 @@ DoWorldEditor(engine_resources *Engine) if (AABBTest.Face && InputStateIsValidToApplyEdit(Input)) { v3i Offset = V3i(s32_MAX); - world_chunk *Chunk = &Editor->LayeredBrushEditor.Preview.Chunk; + world_chunk *Chunk = &Editor->LayeredBrush.Preview.Chunk; // TODO(Jesse): Call GetSmallestMinOffset here - RangeIterator(LayerIndex, Editor->LayeredBrushEditor.LayerCount) + RangeIterator(LayerIndex, Editor->LayeredBrush.LayerCount) { - brush_layer *Layer = Editor->LayeredBrushEditor.Layers + LayerIndex; + brush_layer *Layer = Editor->LayeredBrush.Layers + LayerIndex; Offset = Min(Layer->Settings.Offset.Min, Offset); } @@ -2459,7 +2459,7 @@ DoWorldEditor(engine_resources *Engine) type_world_update_op_shape_params_chunk_data, .world_update_op_shape_params_chunk_data = ChunkDataShape, }; - QueueWorldUpdateForRegion(Engine, Editor->LayeredBrushEditor.Mode, Editor->LayeredBrushEditor.Modifier, &Shape, DEFAULT_HSV_COLOR, Editor->LayeredBrushEditor.SeedBrushWithSelection, Engine->WorldUpdateMemory); + QueueWorldUpdateForRegion(Engine, Editor->LayeredBrush.Mode, Editor->LayeredBrush.Modifier, &Shape, DEFAULT_HSV_COLOR, Editor->LayeredBrush.SeedBrushWithSelection, Engine->WorldUpdateMemory); } } break; @@ -2683,9 +2683,9 @@ DrawEditorPreview(engine_resources *Engine, shader *Shader) { case WorldEdit_BrushType_Layered: { - layered_brush_editor *LayeredBrushEditor = &Editor->LayeredBrushEditor; - v3i SmallestMinOffset = GetSmallestMinOffset(LayeredBrushEditor); - Chunk = &LayeredBrushEditor->Preview.Chunk; + layered_brush *LayeredBrush = &Editor->LayeredBrush; + v3i SmallestMinOffset = GetSmallestMinOffset(LayeredBrush); + Chunk = &LayeredBrush->Preview.Chunk; Basis = V3(SmallestMinOffset) - V3i(1); } break; diff --git a/src/engine/editor.h b/src/engine/editor.h index 81f264493..4d19419d3 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1009,7 +1009,7 @@ struct brush_layer // TODO(Jesse): Make this dynamic .. probably .. #define MAX_BRUSH_LAYERS 16 #define BRUSH_PREVIEW_TEXTURE_DIM 256 -struct layered_brush_editor poof(@version(3)) +struct layered_brush poof(@version(3)) { // NOTE(Jesse): This is so we can just copy the name of the brush in here and // not fuck around with allocating a single string when we load these in. @@ -1019,7 +1019,7 @@ struct layered_brush_editor poof(@version(3)) // because the deserialization code isn't smart enough to not stomp on the // texture handles when it marshals old types to the current one. s32 LayerCount; - brush_layer Layers[MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount)) + brush_layer Layers [MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount)) chunk_thumbnail LayerPreviews[MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount) @no_serialize) chunk_thumbnail SeedLayer; poof(@no_serialize) // NOTE(Jesse): Special layer that acts as the seed value @@ -1035,7 +1035,7 @@ struct layered_brush_editor poof(@version(3)) chunk_thumbnail Preview; poof(@no_serialize) }; -struct layered_brush_editor_2 +struct layered_brush_2 { // NOTE(Jesse): This is so we can just copy the name of the brush in here and // not fuck around with allocating a single string when we load these in. @@ -1051,7 +1051,7 @@ struct layered_brush_editor_2 }; -struct layered_brush_editor_1 +struct layered_brush_1 { char NameBuf[NameBuf_Len]; @@ -1064,7 +1064,7 @@ struct layered_brush_editor_1 chunk_thumbnail Preview; poof(@no_serialize) }; -struct layered_brush_editor_0 +struct layered_brush_0 { s32 LayerCount = 1; brush_layer Layers[MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount)) @@ -1074,24 +1074,24 @@ struct layered_brush_editor_0 }; link_internal void -Marshal(layered_brush_editor_2 *Stored, layered_brush_editor *Live) +Marshal(layered_brush_2 *Stored, layered_brush *Live) { - poof(default_marshal(layered_brush_editor_2)) -#include + poof(default_marshal(layered_brush_2)) +#include } link_internal void -Marshal(layered_brush_editor_1 *Stored, layered_brush_editor *Live) +Marshal(layered_brush_1 *Stored, layered_brush *Live) { - poof(default_marshal(layered_brush_editor_1)) -#include + poof(default_marshal(layered_brush_1)) +#include } link_internal void -Marshal(layered_brush_editor_0 *Stored, layered_brush_editor *Live) +Marshal(layered_brush_0 *Stored, layered_brush *Live) { - poof(default_marshal(layered_brush_editor_0)) -#include + poof(default_marshal(layered_brush_0)) +#include } @@ -1116,6 +1116,9 @@ struct asset_brush_settings +// NOTE(Jesse): This isn't really meant to be used outside the the level_editor +// I just packed all the things together such that it's a bit more obvious +// they're all for doing the selection struct selection_region { u32 Clicks; @@ -1135,6 +1138,15 @@ struct selection_region selection_modification_state ModState; }; +struct world_edit +{ + cs ShaderName; + rect3cp Region; +}; + +poof(block_array(world_edit, {128})) +#include + struct level_editor { @@ -1147,7 +1159,7 @@ struct level_editor single_brush_settings SingleBrush; asset_brush_settings AssetBrush; - layered_brush_editor LayeredBrushEditor; + layered_brush LayeredBrush; b8 SelectionFollowsCursor; @@ -1170,7 +1182,7 @@ struct level_editor b32 NewAssetFromSelection; char NewAssetFromSelectionFilename[512]; - /* v3 HSVColorSelection = {{0.f, 0.8f, 0.5f}}; */ + world_edit_block_array WorldEdits; }; @@ -1235,7 +1247,7 @@ link_internal void ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *Preview, world_chunk *DestChunk, v3i SmallestMinOffset); link_internal v3i -GetSmallestMinOffset(layered_brush_editor *LayeredBrush, v3i *LargestLayerDim = 0); +GetSmallestMinOffset(layered_brush *LayeredBrush, v3i *LargestLayerDim = 0); link_internal void DrawEditorPreview(engine_resources *Engine, shader *Shader); diff --git a/src/engine/render.cpp b/src/engine/render.cpp index 1f97d7463..c7c574a88 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1620,7 +1620,7 @@ DrawWorldAndEntitiesToShadowMap(v2i ShadowMapResolution, engine_resources *Engin shadow_render_group *SG = Graphics->SG; - SetupShadowMapShader(Graphics, ShadowMapResolution, Editor->LayeredBrushEditor.SeedBrushWithSelection); + SetupShadowMapShader(Graphics, ShadowMapResolution, Editor->LayeredBrush.SeedBrushWithSelection); // NOTE(Jesse): So there's a visual distinction between preview and instantiated /* DrawEditorPreview(Engine, &SG->DepthShader); */ diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index d81ee7f44..393646ef0 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -255,12 +255,12 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case BonsaiRenderCommand_ShaderId_gBuffer: { - SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), Editor->LayeredBrushEditor.SeedBrushWithSelection); + SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), Editor->LayeredBrush.SeedBrushWithSelection); } break; case BonsaiRenderCommand_ShaderId_ShadowMap: { - SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), Editor->LayeredBrushEditor.SeedBrushWithSelection); + SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), Editor->LayeredBrush.SeedBrushWithSelection); } break; } } break; diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index 2f3435a73..f1a4d850f 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -563,11 +563,11 @@ poof(serdes_struct(brush_settings)) poof(serdes_struct(brush_layer)) #include -poof(serdes_struct(layered_brush_editor_0)) -#include -poof(serdes_struct(layered_brush_editor_1)) -#include -poof(serdes_struct(layered_brush_editor_2)) -#include -poof(serdes_struct(layered_brush_editor)) -#include +poof(serdes_struct(layered_brush_0)) +#include +poof(serdes_struct(layered_brush_1)) +#include +poof(serdes_struct(layered_brush_2)) +#include +poof(serdes_struct(layered_brush)) +#include From 197af16c881ce6791f826fd927640e0316326b0e Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 19 Dec 2024 13:58:55 -0700 Subject: [PATCH 141/421] Shuffle some members around --- .../anonymous_render_settings_0_wwLVyABc.h | 2 +- .../anonymous_render_settings_1_pFpWPpyN.h | 2 +- generated/block_array_entity_688856407.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- generated/default_marshal_level_header_3.h | 2 +- generated/default_marshal_particle_system_0.h | 2 +- generated/deserialize_struct_entity.h | 2 +- generated/deserialize_struct_level_header.h | 2 +- generated/deserialize_struct_level_header_0.h | 2 +- generated/deserialize_struct_level_header_1.h | 2 +- generated/deserialize_struct_level_header_2.h | 2 +- generated/deserialize_struct_level_header_3.h | 2 +- .../deserialize_struct_render_settings_1.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 62 +++++------------ ...or_ui_for_compound_type_world_edit_brush.h | 4 +- generated/serdes_primitive_592771169.h | 2 +- generated/serdes_struct_bonsai_type_info.h | 12 ++-- .../serdes_struct_bonsai_type_info_buffer.h | 7 +- generated/serdes_struct_brush_layer.h | 7 +- generated/serdes_struct_brush_settings.h | 30 +++++---- generated/serdes_struct_brush_settings_0.h | 24 ++++--- generated/serdes_struct_brush_settings_1.h | 27 ++++---- generated/serdes_struct_brush_settings_2.h | 30 +++++---- generated/serdes_struct_camera.h | 37 +++++++---- generated/serdes_struct_canonical_position.h | 7 +- generated/serdes_struct_entity_0.h | 35 ++++++---- generated/serdes_struct_entity_1.h | 38 +++++++---- generated/serdes_struct_entity_id.h | 7 +- generated/serdes_struct_file_traversal_node.h | 11 ++-- generated/serdes_struct_frustum.h | 25 ++++--- generated/serdes_struct_keyframe.h | 7 +- generated/serdes_struct_layered_brush.h | 17 +++-- generated/serdes_struct_layered_brush_0.h | 7 +- generated/serdes_struct_layered_brush_1.h | 13 ++-- generated/serdes_struct_layered_brush_2.h | 13 ++-- generated/serdes_struct_lighting_settings.h | 39 +++++++---- generated/serdes_struct_lighting_settings_0.h | 39 +++++++---- generated/serdes_struct_model.h | 15 +++-- generated/serdes_struct_noise_layer.h | 14 ++-- generated/serdes_struct_noise_layer_0.h | 11 ++-- generated/serdes_struct_particle_system.h | 66 ++++++++++++------- generated/serdes_struct_particle_system_0.h | 66 ++++++++++++------- generated/serdes_struct_perlin_noise_params.h | 12 ++-- generated/serdes_struct_physics.h | 18 +++-- generated/serdes_struct_plane.h | 11 ++-- generated/serdes_struct_random_series.h | 6 +- generated/serdes_struct_rect3.h | 7 +- generated/serdes_struct_rect3i.h | 7 +- generated/serdes_struct_render_settings.h | 65 +++++++++++------- generated/serdes_struct_shape_layer.h | 11 ++-- generated/serdes_struct_vertex_material.h | 10 +-- .../serdes_struct_voronoi_noise_params.h | 18 +++-- generated/serdes_struct_vox_data.h | 4 +- generated/serdes_struct_voxel.h | 7 +- generated/serdes_struct_voxel_lighting.h | 4 +- generated/serdes_struct_white_noise_params.h | 6 +- generated/serdes_struct_world_chunk.h | 11 ++-- generated/serdes_struct_world_chunk_0.h | 8 ++- ...struct_world_update_op_shape_params_rect.h | 6 +- ...ruct_world_update_op_shape_params_sphere.h | 9 +-- generated/serialize_struct_entity.h | 38 +++++++---- generated/serialize_struct_level_header.h | 24 ++++--- .../serialize_struct_render_settings_0.h | 2 +- src/engine/editor.cpp | 61 +++++++++-------- src/engine/editor.h | 35 ++++++---- src/engine/render.cpp | 3 +- src/engine/resources.cpp | 4 +- src/engine/serdes.cpp | 9 +++ src/engine/serdes.h | 19 +++++- src/engine/work_queue.h | 4 +- 70 files changed, 664 insertions(+), 453 deletions(-) diff --git a/generated/anonymous_render_settings_0_wwLVyABc.h b/generated/anonymous_render_settings_0_wwLVyABc.h index e8929414d..e258c4e35 100644 --- a/generated/anonymous_render_settings_0_wwLVyABc.h +++ b/generated/anonymous_render_settings_0_wwLVyABc.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:426:0 +// src/engine/serdes.cpp:429:0 E1->UseSsao = E0->UseSsao; E1->UseShadowMapping = E0->UseShadowMapping; diff --git a/generated/anonymous_render_settings_1_pFpWPpyN.h b/generated/anonymous_render_settings_1_pFpWPpyN.h index 9b8862596..c42f2e289 100644 --- a/generated/anonymous_render_settings_1_pFpWPpyN.h +++ b/generated/anonymous_render_settings_1_pFpWPpyN.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:414:0 +// src/engine/serdes.cpp:417:0 E1->UseSsao = E0->UseSsao; E1->UseShadowMapping = E0->UseShadowMapping; diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index b220e3afb..b3f5ab647 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:366:0 +// src/engine/serdes.cpp:369:0 struct entity_block { diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 46dd6f6b2..33f77e5ff 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1147:0 +// src/engine/editor.h:1160:0 struct world_edit_block { diff --git a/generated/default_marshal_level_header_3.h b/generated/default_marshal_level_header_3.h index 44d39a671..86b8e0faf 100644 --- a/generated/default_marshal_level_header_3.h +++ b/generated/default_marshal_level_header_3.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:499:0 +// src/engine/serdes.cpp:502:0 Live->ChunkCount = Stored->ChunkCount; diff --git a/generated/default_marshal_particle_system_0.h b/generated/default_marshal_particle_system_0.h index 97bec78f6..4fec64d12 100644 --- a/generated/default_marshal_particle_system_0.h +++ b/generated/default_marshal_particle_system_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:280:0 +// src/engine/serdes.cpp:283:0 Live->Entropy = Stored->Entropy; diff --git a/generated/deserialize_struct_entity.h b/generated/deserialize_struct_entity.h index 1b5a9cc95..502d61c07 100644 --- a/generated/deserialize_struct_entity.h +++ b/generated/deserialize_struct_entity.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:358:0 +// src/engine/serdes.cpp:361:0 link_internal b32 Deserialize(u8_cursor *Bytes, entity *Element, memory_arena *Memory, umm Count = 1); diff --git a/generated/deserialize_struct_level_header.h b/generated/deserialize_struct_level_header.h index 69023212b..1863492f8 100644 --- a/generated/deserialize_struct_level_header.h +++ b/generated/deserialize_struct_level_header.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:516:0 +// src/engine/serdes.cpp:519:0 link_internal b32 Deserialize(u8_cursor *Bytes, level_header *Element, memory_arena *Memory, umm Count = 1); diff --git a/generated/deserialize_struct_level_header_0.h b/generated/deserialize_struct_level_header_0.h index 7278ca1e7..adce13d4e 100644 --- a/generated/deserialize_struct_level_header_0.h +++ b/generated/deserialize_struct_level_header_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:504:0 +// src/engine/serdes.cpp:507:0 link_internal b32 Deserialize(u8_cursor *Bytes, level_header_0 *Element, memory_arena *Memory, umm Count = 1); diff --git a/generated/deserialize_struct_level_header_1.h b/generated/deserialize_struct_level_header_1.h index 9929b018d..54973810f 100644 --- a/generated/deserialize_struct_level_header_1.h +++ b/generated/deserialize_struct_level_header_1.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:507:0 +// src/engine/serdes.cpp:510:0 link_internal b32 Deserialize(u8_cursor *Bytes, level_header_1 *Element, memory_arena *Memory, umm Count = 1); diff --git a/generated/deserialize_struct_level_header_2.h b/generated/deserialize_struct_level_header_2.h index 9797b2aae..3fd9372bb 100644 --- a/generated/deserialize_struct_level_header_2.h +++ b/generated/deserialize_struct_level_header_2.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:510:0 +// src/engine/serdes.cpp:513:0 link_internal b32 Deserialize(u8_cursor *Bytes, level_header_2 *Element, memory_arena *Memory, umm Count = 1); diff --git a/generated/deserialize_struct_level_header_3.h b/generated/deserialize_struct_level_header_3.h index d5175e975..969abcdf1 100644 --- a/generated/deserialize_struct_level_header_3.h +++ b/generated/deserialize_struct_level_header_3.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:513:0 +// src/engine/serdes.cpp:516:0 link_internal b32 Deserialize(u8_cursor *Bytes, level_header_3 *Element, memory_arena *Memory, umm Count = 1); diff --git a/generated/deserialize_struct_render_settings_1.h b/generated/deserialize_struct_render_settings_1.h index cf5da720f..0cbed3d3d 100644 --- a/generated/deserialize_struct_render_settings_1.h +++ b/generated/deserialize_struct_render_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:434:0 +// src/engine/serdes.cpp:437:0 link_internal b32 Deserialize(u8_cursor *Bytes, render_settings_1 *Element, memory_arena *Memory, umm Count = 1); diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index ee38ef0b2..81edfd6f5 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -74,53 +74,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_brush_type*,&Element->BrushType), - CSz("BrushType"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(single_brush_settings*,&Element->SingleBrush), - CSz("SingleBrush"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(asset_brush_settings*,&Element->AssetBrush), - CSz("AssetBrush"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(layered_brush*,&Element->LayeredBrush), - CSz("LayeredBrush"), + Cast(world_edit*,&Element->Brush), + CSz("Brush"), Params ); @@ -281,6 +236,19 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + Cast(b8*,&Element->MaskSelection), + CSz("MaskSelection"), + &DefaultUiRenderParams_Checkbox + ); + + + + + PushNewRow(Ui); DoEditorUi(Ui, diff --git a/generated/do_editor_ui_for_compound_type_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_world_edit_brush.h index c0e47454d..c6c35299c 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_brush.h @@ -1,7 +1,7 @@ // src/engine/editor.h:796:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) { if (Element) { @@ -11,7 +11,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_brush", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_brush_constraints", Element), Params)) { DidToggle = True; PushNewRow(Ui); diff --git a/generated/serdes_primitive_592771169.h b/generated/serdes_primitive_592771169.h index c2c1a2b5b..b19cab56e 100644 --- a/generated/serdes_primitive_592771169.h +++ b/generated/serdes_primitive_592771169.h @@ -1,4 +1,4 @@ -// src/engine/serdes.h:490:0 +// src/engine/serdes.h:503:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, u8 *Element, umm Count = 1) diff --git a/generated/serdes_struct_bonsai_type_info.h b/generated/serdes_struct_bonsai_type_info.h index cb732d141..6239972fe 100644 --- a/generated/serdes_struct_bonsai_type_info.h +++ b/generated/serdes_struct_bonsai_type_info.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:449:0 +// src/engine/serdes.cpp:452:0 link_internal bonsai_type_info TypeInfo(bonsai_type_info *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, bonsai_type_info *BaseElement, umm Count { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,19 +34,21 @@ Serialize(u8_cursor_block_array *Bytes, bonsai_type_info *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { bonsai_type_info *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Name); + Result &= Serialize(Bytes, &Element->Name); // default - Result &= Serialize(Bytes, &Element->Version); + Result &= Serialize(Bytes, &Element->Version); // default - Result &= Serialize(Bytes, &Element->SizeOfInBytes); + + + Result &= Serialize(Bytes, &Element->SizeOfInBytes); // default diff --git a/generated/serdes_struct_bonsai_type_info_buffer.h b/generated/serdes_struct_bonsai_type_info_buffer.h index 319c359d7..b2a98ec6d 100644 --- a/generated/serdes_struct_bonsai_type_info_buffer.h +++ b/generated/serdes_struct_bonsai_type_info_buffer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:451:0 +// src/engine/serdes.cpp:454:0 link_internal bonsai_type_info TypeInfo(bonsai_type_info_buffer *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, bonsai_type_info_buffer *BaseElement, um { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,7 +34,8 @@ Serialize(u8_cursor_block_array *Bytes, bonsai_type_info_buffer *BaseElement, um RangeIterator_t(umm, ElementIndex, Count) { bonsai_type_info_buffer *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Count); + Result &= Serialize(Bytes, &Element->Count); // default + diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index 9cd50f015..76258eb90 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:563:0 +// src/engine/serdes.cpp:566:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, brush_layer *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,7 +34,8 @@ Serialize(u8_cursor_block_array *Bytes, brush_layer *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { brush_layer *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Settings); + Result &= Serialize(Bytes, &Element->Settings); // default + diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index e5c058318..2d2f74d00 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:560:0 +// src/engine/serdes.cpp:563:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings *BaseElement, umm Count = { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -37,58 +37,64 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings *BaseElement, umm Count = RangeIterator_t(umm, ElementIndex, Count) { brush_settings *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Noise); + Result &= Serialize(Bytes, &Element->Noise); // default - Result &= Serialize(Bytes, &Element->Shape); + Result &= Serialize(Bytes, &Element->Shape); // default - Result &= Serialize(Bytes, (u32*)&Element->Mode); + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum - Result &= Serialize(Bytes, (u32*)&Element->Modifier); + Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum - Result &= Serialize(Bytes, &Element->Iterations); + Result &= Serialize(Bytes, &Element->Iterations); // default - Result &= Serialize(Bytes, &Element->Offset); + Result &= Serialize(Bytes, &Element->Offset); // default - Result &= Serialize(Bytes, &Element->NoiseBasisOffset); + Result &= Serialize(Bytes, &Element->NoiseBasisOffset); // default - Result &= Serialize(Bytes, &Element->HSVColor); - Result &= Serialize(Bytes, &Element->Invert); + Result &= Serialize(Bytes, &Element->HSVColor); // default + + + + + + + Result &= Serialize(Bytes, &Element->Invert); // default diff --git a/generated/serdes_struct_brush_settings_0.h b/generated/serdes_struct_brush_settings_0.h index be7d60741..cf546fc81 100644 --- a/generated/serdes_struct_brush_settings_0.h +++ b/generated/serdes_struct_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:554:0 +// src/engine/serdes.cpp:557:0 link_internal bonsai_type_info TypeInfo(brush_settings_0 *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings_0 *BaseElement, umm Count { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,46 +34,50 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings_0 *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { brush_settings_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Noise); + Result &= Serialize(Bytes, &Element->Noise); // default - Result &= Serialize(Bytes, &Element->Shape); + Result &= Serialize(Bytes, &Element->Shape); // default - Result &= Serialize(Bytes, (u32*)&Element->Mode); + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum - Result &= Serialize(Bytes, (u32*)&Element->Modifier); + Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum - Result &= Serialize(Bytes, &Element->Iterations); + Result &= Serialize(Bytes, &Element->Iterations); // default - Result &= Serialize(Bytes, &Element->Offset); + Result &= Serialize(Bytes, &Element->Offset); // default - Result &= Serialize(Bytes, &Element->Color); + + + + + Result &= Serialize(Bytes, &Element->Color); // default diff --git a/generated/serdes_struct_brush_settings_1.h b/generated/serdes_struct_brush_settings_1.h index 33217101f..5144e9d56 100644 --- a/generated/serdes_struct_brush_settings_1.h +++ b/generated/serdes_struct_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:556:0 +// src/engine/serdes.cpp:559:0 link_internal bonsai_type_info TypeInfo(brush_settings_1 *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings_1 *BaseElement, umm Count { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,52 +34,57 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings_1 *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { brush_settings_1 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Noise); + Result &= Serialize(Bytes, &Element->Noise); // default - Result &= Serialize(Bytes, &Element->Shape); + Result &= Serialize(Bytes, &Element->Shape); // default - Result &= Serialize(Bytes, (u32*)&Element->Mode); + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum - Result &= Serialize(Bytes, (u32*)&Element->Modifier); + Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum - Result &= Serialize(Bytes, &Element->Iterations); + Result &= Serialize(Bytes, &Element->Iterations); // default - Result &= Serialize(Bytes, &Element->Offset); + Result &= Serialize(Bytes, &Element->Offset); // default - Result &= Serialize(Bytes, &Element->NoiseBasisOffset); + Result &= Serialize(Bytes, &Element->NoiseBasisOffset); // default - Result &= Serialize(Bytes, &Element->Color); + + + + + + Result &= Serialize(Bytes, &Element->Color); // default diff --git a/generated/serdes_struct_brush_settings_2.h b/generated/serdes_struct_brush_settings_2.h index 3f06d19c5..b73f05c15 100644 --- a/generated/serdes_struct_brush_settings_2.h +++ b/generated/serdes_struct_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:558:0 +// src/engine/serdes.cpp:561:0 link_internal bonsai_type_info TypeInfo(brush_settings_2 *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings_2 *BaseElement, umm Count { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,58 +34,64 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings_2 *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { brush_settings_2 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Noise); + Result &= Serialize(Bytes, &Element->Noise); // default - Result &= Serialize(Bytes, &Element->Shape); + Result &= Serialize(Bytes, &Element->Shape); // default - Result &= Serialize(Bytes, (u32*)&Element->Mode); + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum - Result &= Serialize(Bytes, (u32*)&Element->Modifier); + Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum - Result &= Serialize(Bytes, &Element->Iterations); + Result &= Serialize(Bytes, &Element->Iterations); // default - Result &= Serialize(Bytes, &Element->Offset); + Result &= Serialize(Bytes, &Element->Offset); // default - Result &= Serialize(Bytes, &Element->NoiseBasisOffset); + Result &= Serialize(Bytes, &Element->NoiseBasisOffset); // default - Result &= Serialize(Bytes, &Element->Color); - Result &= Serialize(Bytes, &Element->Invert); + Result &= Serialize(Bytes, &Element->Color); // default + + + + + + + Result &= Serialize(Bytes, &Element->Invert); // default diff --git a/generated/serdes_struct_camera.h b/generated/serdes_struct_camera.h index 78dd023b5..888f63db3 100644 --- a/generated/serdes_struct_camera.h +++ b/generated/serdes_struct_camera.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, camera *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -37,73 +37,84 @@ Serialize(u8_cursor_block_array *Bytes, camera *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { camera *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Frust); + Result &= Serialize(Bytes, &Element->Frust); // default - Result &= Serialize(Bytes, &Element->CurrentP); + Result &= Serialize(Bytes, &Element->CurrentP); // default - Result &= Serialize(Bytes, &Element->RenderSpacePosition); + Result &= Serialize(Bytes, &Element->RenderSpacePosition); // default - Result &= Serialize(Bytes, &Element->TargetPitch); + Result &= Serialize(Bytes, &Element->TargetPitch); // default - Result &= Serialize(Bytes, &Element->TargetRoll); + Result &= Serialize(Bytes, &Element->TargetRoll); // default - Result &= Serialize(Bytes, &Element->TargetYaw); - Result &= Serialize(Bytes, &Element->TargetDistanceFromTarget); + Result &= Serialize(Bytes, &Element->TargetYaw); // default - Result &= Serialize(Bytes, &Element->Blend); + Result &= Serialize(Bytes, &Element->TargetDistanceFromTarget); // default - Result &= Serialize(Bytes, &Element->Front); + Result &= Serialize(Bytes, &Element->Blend); // default - Result &= Serialize(Bytes, &Element->Right); + Result &= Serialize(Bytes, &Element->Front); // default - Result &= Serialize(Bytes, &Element->Up); + Result &= Serialize(Bytes, &Element->Right); // default - Result &= Serialize(Bytes, &Element->GhostId); + + + + + + Result &= Serialize(Bytes, &Element->Up); // default + + + + + + + Result &= Serialize(Bytes, &Element->GhostId); // default diff --git a/generated/serdes_struct_canonical_position.h b/generated/serdes_struct_canonical_position.h index a9743ae1d..30ba25357 100644 --- a/generated/serdes_struct_canonical_position.h +++ b/generated/serdes_struct_canonical_position.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, canonical_position *BaseElement, umm Cou { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,13 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, canonical_position *BaseElement, umm Cou RangeIterator_t(umm, ElementIndex, Count) { canonical_position *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Offset); + Result &= Serialize(Bytes, &Element->Offset); // default - Result &= Serialize(Bytes, &Element->WorldP); + + Result &= Serialize(Bytes, &Element->WorldP); // default diff --git a/generated/serdes_struct_entity_0.h b/generated/serdes_struct_entity_0.h index 831cbaa25..6f87214ca 100644 --- a/generated/serdes_struct_entity_0.h +++ b/generated/serdes_struct_entity_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:355:0 +// src/engine/serdes.cpp:358:0 link_internal bonsai_type_info TypeInfo(entity_0 *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, entity_0 *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,49 +34,57 @@ Serialize(u8_cursor_block_array *Bytes, entity_0 *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { entity_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Id); + Result &= Serialize(Bytes, &Element->Id); // default - Result &= Serialize(Bytes, &Element->P); + Result &= Serialize(Bytes, &Element->P); // default - Result &= Serialize(Bytes, &Element->EulerAngles); + Result &= Serialize(Bytes, &Element->EulerAngles); // default - Result &= Serialize(Bytes, &Element->Scale); + Result &= Serialize(Bytes, &Element->Scale); // default - Result &= Serialize(Bytes, &Element->_CollisionVolumeRadius); + Result &= Serialize(Bytes, &Element->_CollisionVolumeRadius); // default - Result &= Serialize(Bytes, &Element->Physics); - Result &= Serialize(Bytes, &Element->AssetId); + Result &= Serialize(Bytes, &Element->Physics); // default - Result &= Serialize(Bytes, &Element->ModelIndex); + + Result &= Serialize(Bytes, &Element->AssetId); // default + + + + + + + Result &= Serialize(Bytes, &Element->ModelIndex); // default + @@ -87,17 +95,18 @@ Serialize(u8_cursor_block_array *Bytes, entity_0 *BaseElement, umm Count = 1) - Result &= Serialize(Bytes, (u32*)&Element->State); + Result &= Serialize(Bytes, (u32*)&Element->State); // enum + + Result &= Serialize(Bytes, (u32*)&Element->Behavior); // enum - Result &= Serialize(Bytes, (u32*)&Element->Behavior); + Result &= Serialize(Bytes, &Element->UserType); // default - Result &= Serialize(Bytes, &Element->UserType); diff --git a/generated/serdes_struct_entity_1.h b/generated/serdes_struct_entity_1.h index 04f51b29c..9ae177294 100644 --- a/generated/serdes_struct_entity_1.h +++ b/generated/serdes_struct_entity_1.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:352:0 +// src/engine/serdes.cpp:355:0 link_internal bonsai_type_info TypeInfo(entity_1 *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, entity_1 *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,49 +34,57 @@ Serialize(u8_cursor_block_array *Bytes, entity_1 *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { entity_1 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Id); + Result &= Serialize(Bytes, &Element->Id); // default - Result &= Serialize(Bytes, &Element->P); + Result &= Serialize(Bytes, &Element->P); // default - Result &= Serialize(Bytes, &Element->EulerAngles); + Result &= Serialize(Bytes, &Element->EulerAngles); // default - Result &= Serialize(Bytes, &Element->Scale); + Result &= Serialize(Bytes, &Element->Scale); // default - Result &= Serialize(Bytes, &Element->_CollisionVolumeRadius); + Result &= Serialize(Bytes, &Element->_CollisionVolumeRadius); // default - Result &= Serialize(Bytes, &Element->Physics); - Result &= Serialize(Bytes, &Element->AssetId); + Result &= Serialize(Bytes, &Element->Physics); // default - Result &= Serialize(Bytes, &Element->ModelIndex); + + Result &= Serialize(Bytes, &Element->AssetId); // default + + + + + + + Result &= Serialize(Bytes, &Element->ModelIndex); // default + @@ -87,23 +95,25 @@ Serialize(u8_cursor_block_array *Bytes, entity_1 *BaseElement, umm Count = 1) - Result &= Serialize(Bytes, (u32*)&Element->State); + Result &= Serialize(Bytes, (u32*)&Element->State); // enum + + + Result &= Serialize(Bytes, (u32*)&Element->Behavior); // enum - Result &= Serialize(Bytes, (u32*)&Element->Behavior); + Result &= Serialize(Bytes, &Element->Carrying); // default - Result &= Serialize(Bytes, &Element->Carrying); + Result &= Serialize(Bytes, &Element->UserType); // default - Result &= Serialize(Bytes, &Element->UserType); diff --git a/generated/serdes_struct_entity_id.h b/generated/serdes_struct_entity_id.h index b2b3ba073..e14153f31 100644 --- a/generated/serdes_struct_entity_id.h +++ b/generated/serdes_struct_entity_id.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, entity_id *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,13 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, entity_id *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { entity_id *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Index); + Result &= Serialize(Bytes, &Element->Index); // default - Result &= Serialize(Bytes, &Element->Generation); + + Result &= Serialize(Bytes, &Element->Generation); // default diff --git a/generated/serdes_struct_file_traversal_node.h b/generated/serdes_struct_file_traversal_node.h index fcd39c40c..56d0b04c1 100644 --- a/generated/serdes_struct_file_traversal_node.h +++ b/generated/serdes_struct_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:299:0 +// src/engine/serdes.cpp:302:0 link_internal bonsai_type_info TypeInfo(file_traversal_node *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, file_traversal_node *BaseElement, umm Co { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,18 +34,19 @@ Serialize(u8_cursor_block_array *Bytes, file_traversal_node *BaseElement, umm Co RangeIterator_t(umm, ElementIndex, Count) { file_traversal_node *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Dir); + Result &= Serialize(Bytes, &Element->Dir); // default - Result &= Serialize(Bytes, &Element->Name); + + Result &= Serialize(Bytes, &Element->Name); // default diff --git a/generated/serdes_struct_frustum.h b/generated/serdes_struct_frustum.h index eea4dad88..c6227c448 100644 --- a/generated/serdes_struct_frustum.h +++ b/generated/serdes_struct_frustum.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, frustum *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,49 +34,56 @@ Serialize(u8_cursor_block_array *Bytes, frustum *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { frustum *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->farClip); + Result &= Serialize(Bytes, &Element->farClip); // default - Result &= Serialize(Bytes, &Element->nearClip); + Result &= Serialize(Bytes, &Element->nearClip); // default - Result &= Serialize(Bytes, &Element->width); + Result &= Serialize(Bytes, &Element->width); // default - Result &= Serialize(Bytes, &Element->FOV); + Result &= Serialize(Bytes, &Element->FOV); // default - Result &= Serialize(Bytes, &Element->Top); + Result &= Serialize(Bytes, &Element->Top); // default - Result &= Serialize(Bytes, &Element->Bot); - Result &= Serialize(Bytes, &Element->Left); + Result &= Serialize(Bytes, &Element->Bot); // default - Result &= Serialize(Bytes, &Element->Right); + + Result &= Serialize(Bytes, &Element->Left); // default + + + + + + + Result &= Serialize(Bytes, &Element->Right); // default diff --git a/generated/serdes_struct_keyframe.h b/generated/serdes_struct_keyframe.h index 2891300d6..1e599eb4b 100644 --- a/generated/serdes_struct_keyframe.h +++ b/generated/serdes_struct_keyframe.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, keyframe *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,13 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, keyframe *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { keyframe *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->tEnd); + Result &= Serialize(Bytes, &Element->tEnd); // default - Result &= Serialize(Bytes, &Element->Value); + + Result &= Serialize(Bytes, &Element->Value); // default diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 8a8f034de..586f49ea5 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:572:0 +// src/engine/serdes.cpp:575:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush *BaseElement, umm Count = { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -37,7 +37,8 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush *BaseElement, umm Count = RangeIterator_t(umm, ElementIndex, Count) { layered_brush *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->LayerCount); + Result &= Serialize(Bytes, &Element->LayerCount); // default + @@ -54,24 +55,26 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush *BaseElement, umm Count = - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); + Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default + + + Result &= Serialize(Bytes, &Element->BrushFollowsCursor); // default - Result &= Serialize(Bytes, &Element->BrushFollowsCursor); - Result &= Serialize(Bytes, (u32*)&Element->Mode); + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum - Result &= Serialize(Bytes, (u32*)&Element->Modifier); + Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum diff --git a/generated/serdes_struct_layered_brush_0.h b/generated/serdes_struct_layered_brush_0.h index a70578bc2..a2b1c4d7f 100644 --- a/generated/serdes_struct_layered_brush_0.h +++ b/generated/serdes_struct_layered_brush_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:566:0 +// src/engine/serdes.cpp:569:0 link_internal bonsai_type_info TypeInfo(layered_brush_0 *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_0 *BaseElement, umm Count { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,7 +34,8 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_0 *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { layered_brush_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->LayerCount); + Result &= Serialize(Bytes, &Element->LayerCount); // default + diff --git a/generated/serdes_struct_layered_brush_1.h b/generated/serdes_struct_layered_brush_1.h index b77a470ba..298f7e78e 100644 --- a/generated/serdes_struct_layered_brush_1.h +++ b/generated/serdes_struct_layered_brush_1.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:568:0 +// src/engine/serdes.cpp:571:0 link_internal bonsai_type_info TypeInfo(layered_brush_1 *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_1 *BaseElement, umm Count { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -44,7 +44,8 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_1 *BaseElement, umm Count - Result &= Serialize(Bytes, &Element->LayerCount); + Result &= Serialize(Bytes, &Element->LayerCount); // default + @@ -61,13 +62,15 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_1 *BaseElement, umm Count - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); + Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default + + + Result &= Serialize(Bytes, &Element->BrushFollowsCursor); // default - Result &= Serialize(Bytes, &Element->BrushFollowsCursor); diff --git a/generated/serdes_struct_layered_brush_2.h b/generated/serdes_struct_layered_brush_2.h index 9d0bffec4..b51d14d81 100644 --- a/generated/serdes_struct_layered_brush_2.h +++ b/generated/serdes_struct_layered_brush_2.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:570:0 +// src/engine/serdes.cpp:573:0 link_internal bonsai_type_info TypeInfo(layered_brush_2 *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_2 *BaseElement, umm Count { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,7 +34,8 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_2 *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { layered_brush_2 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->LayerCount); + Result &= Serialize(Bytes, &Element->LayerCount); // default + @@ -51,13 +52,15 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_2 *BaseElement, umm Count - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); + Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default + + + Result &= Serialize(Bytes, &Element->BrushFollowsCursor); // default - Result &= Serialize(Bytes, &Element->BrushFollowsCursor); diff --git a/generated/serdes_struct_lighting_settings.h b/generated/serdes_struct_lighting_settings.h index 8a6029a80..026def4c5 100644 --- a/generated/serdes_struct_lighting_settings.h +++ b/generated/serdes_struct_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:403:0 +// src/engine/serdes.cpp:406:0 link_internal bonsai_type_info TypeInfo(lighting_settings *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings *BaseElement, umm Coun { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -37,73 +37,84 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings *BaseElement, umm Coun RangeIterator_t(umm, ElementIndex, Count) { lighting_settings *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->AutoDayNightCycle); + Result &= Serialize(Bytes, &Element->AutoDayNightCycle); // default - Result &= Serialize(Bytes, &Element->tDay); + Result &= Serialize(Bytes, &Element->tDay); // default - Result &= Serialize(Bytes, &Element->SunP); + Result &= Serialize(Bytes, &Element->SunP); // default - Result &= Serialize(Bytes, &Element->DawnIntensity); + Result &= Serialize(Bytes, &Element->DawnIntensity); // default - Result &= Serialize(Bytes, &Element->DawnColor); + Result &= Serialize(Bytes, &Element->DawnColor); // default - Result &= Serialize(Bytes, &Element->SunIntensity); - Result &= Serialize(Bytes, &Element->SunColor); + Result &= Serialize(Bytes, &Element->SunIntensity); // default - Result &= Serialize(Bytes, &Element->DuskIntensity); + Result &= Serialize(Bytes, &Element->SunColor); // default - Result &= Serialize(Bytes, &Element->DuskColor); + Result &= Serialize(Bytes, &Element->DuskIntensity); // default - Result &= Serialize(Bytes, &Element->MoonIntensity); + Result &= Serialize(Bytes, &Element->DuskColor); // default - Result &= Serialize(Bytes, &Element->MoonColor); + Result &= Serialize(Bytes, &Element->MoonIntensity); // default - Result &= Serialize(Bytes, &Element->CurrentSunColor); + + + + + + Result &= Serialize(Bytes, &Element->MoonColor); // default + + + + + + + Result &= Serialize(Bytes, &Element->CurrentSunColor); // default diff --git a/generated/serdes_struct_lighting_settings_0.h b/generated/serdes_struct_lighting_settings_0.h index 70639a59c..17705cf53 100644 --- a/generated/serdes_struct_lighting_settings_0.h +++ b/generated/serdes_struct_lighting_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:400:0 +// src/engine/serdes.cpp:403:0 link_internal bonsai_type_info TypeInfo(lighting_settings_0 *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings_0 *BaseElement, umm Co { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,73 +34,84 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings_0 *BaseElement, umm Co RangeIterator_t(umm, ElementIndex, Count) { lighting_settings_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->AutoDayNightCycle); + Result &= Serialize(Bytes, &Element->AutoDayNightCycle); // default - Result &= Serialize(Bytes, &Element->tDay); + Result &= Serialize(Bytes, &Element->tDay); // default - Result &= Serialize(Bytes, &Element->SunP); + Result &= Serialize(Bytes, &Element->SunP); // default - Result &= Serialize(Bytes, &Element->DawnColor); + Result &= Serialize(Bytes, &Element->DawnColor); // default - Result &= Serialize(Bytes, &Element->SunColor); + Result &= Serialize(Bytes, &Element->SunColor); // default - Result &= Serialize(Bytes, &Element->DuskColor); - Result &= Serialize(Bytes, &Element->MoonColor); + Result &= Serialize(Bytes, &Element->DuskColor); // default - Result &= Serialize(Bytes, &Element->SunIntensity); + Result &= Serialize(Bytes, &Element->MoonColor); // default - Result &= Serialize(Bytes, &Element->MoonIntensity); + Result &= Serialize(Bytes, &Element->SunIntensity); // default - Result &= Serialize(Bytes, &Element->DawnIntensity); + Result &= Serialize(Bytes, &Element->MoonIntensity); // default - Result &= Serialize(Bytes, &Element->DuskIntensity); + Result &= Serialize(Bytes, &Element->DawnIntensity); // default - Result &= Serialize(Bytes, &Element->CurrentSunColor); + + + + + + Result &= Serialize(Bytes, &Element->DuskIntensity); // default + + + + + + + Result &= Serialize(Bytes, &Element->CurrentSunColor); // default diff --git a/generated/serdes_struct_model.h b/generated/serdes_struct_model.h index 8fce9f3ed..32465cc28 100644 --- a/generated/serdes_struct_model.h +++ b/generated/serdes_struct_model.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:296:0 +// src/engine/serdes.cpp:299:0 link_internal bonsai_type_info TypeInfo(model *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, model *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,25 +34,28 @@ Serialize(u8_cursor_block_array *Bytes, model *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { model *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Vox); + Result &= Serialize(Bytes, &Element->Vox); // default - Result &= Serialize(Bytes, &Element->TransparentMesh); + Result &= Serialize(Bytes, &Element->TransparentMesh); // default - Result &= Serialize(Bytes, &Element->Animation); + Result &= Serialize(Bytes, &Element->Animation); // default - Result &= Serialize(Bytes, &Element->Dim); + + + + Result &= Serialize(Bytes, &Element->Dim); // default diff --git a/generated/serdes_struct_noise_layer.h b/generated/serdes_struct_noise_layer.h index d5ff40715..c316c4e0f 100644 --- a/generated/serdes_struct_noise_layer.h +++ b/generated/serdes_struct_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:545:0 +// src/engine/serdes.cpp:548:0 link_internal bonsai_type_info TypeInfo(noise_layer *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, noise_layer *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -37,24 +37,26 @@ Serialize(u8_cursor_block_array *Bytes, noise_layer *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { noise_layer *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->White); + Result &= Serialize(Bytes, &Element->White); // default - Result &= Serialize(Bytes, &Element->Perlin); + Result &= Serialize(Bytes, &Element->Perlin); // default - Result &= Serialize(Bytes, &Element->Voronoi); + + + Result &= Serialize(Bytes, &Element->Voronoi); // default diff --git a/generated/serdes_struct_noise_layer_0.h b/generated/serdes_struct_noise_layer_0.h index c2ac96f28..c51ce8924 100644 --- a/generated/serdes_struct_noise_layer_0.h +++ b/generated/serdes_struct_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:543:0 +// src/engine/serdes.cpp:546:0 link_internal bonsai_type_info TypeInfo(noise_layer_0 *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, noise_layer_0 *BaseElement, umm Count = { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,18 +34,19 @@ Serialize(u8_cursor_block_array *Bytes, noise_layer_0 *BaseElement, umm Count = RangeIterator_t(umm, ElementIndex, Count) { noise_layer_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Perlin); + Result &= Serialize(Bytes, &Element->Perlin); // default - Result &= Serialize(Bytes, &Element->Voronoi); + + Result &= Serialize(Bytes, &Element->Voronoi); // default diff --git a/generated/serdes_struct_particle_system.h b/generated/serdes_struct_particle_system.h index 4e39922e7..ad8c3262e 100644 --- a/generated/serdes_struct_particle_system.h +++ b/generated/serdes_struct_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:287:0 +// src/engine/serdes.cpp:290:0 link_internal bonsai_type_info TypeInfo(particle_system *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, particle_system *BaseElement, umm Count { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -37,126 +37,146 @@ Serialize(u8_cursor_block_array *Bytes, particle_system *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { particle_system *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Entropy); + Result &= Serialize(Bytes, &Element->Entropy); // default - Result &= Serialize(Bytes, (u32*)&Element->SpawnType); + Result &= Serialize(Bytes, (u32*)&Element->SpawnType); // enum - Result &= Serialize(Bytes, &Element->Drag); + Result &= Serialize(Bytes, &Element->Drag); // default - Result &= Serialize(Bytes, &Element->Lifetime); + Result &= Serialize(Bytes, &Element->Lifetime); // default - Result &= Serialize(Bytes, &Element->EmissionDelay); + Result &= Serialize(Bytes, &Element->EmissionDelay); // default - Result &= Serialize(Bytes, &Element->EmissionLifespan); + Result &= Serialize(Bytes, &Element->EmissionLifespan); // default - Result &= Serialize(Bytes, &Element->ActiveParticles); - Result &= Serialize(Bytes, &Element->LifespanMod); + Result &= Serialize(Bytes, &Element->ActiveParticles); // default - Result &= Serialize(Bytes, &Element->ParticleLifespan); + Result &= Serialize(Bytes, &Element->LifespanMod); // default - Result &= Serialize(Bytes, &Element->ParticlesPerSecond); + Result &= Serialize(Bytes, &Element->ParticleLifespan); // default - Result &= Serialize(Bytes, &Element->ParticleLightEmission); + Result &= Serialize(Bytes, &Element->ParticlesPerSecond); // default - Result &= Serialize(Bytes, &Element->ParticleLightEmissionChance); + Result &= Serialize(Bytes, &Element->ParticleLightEmission); // default - Result &= Serialize(Bytes, &Element->ParticleStartingTransparency); - Result &= Serialize(Bytes, &Element->ParticleEndingTransparency); + Result &= Serialize(Bytes, &Element->ParticleLightEmissionChance); // default - Result &= Serialize(Bytes, &Element->ParticleStartingDim); + Result &= Serialize(Bytes, &Element->ParticleStartingTransparency); // default - Result &= Serialize(Bytes, &Element->ParticleEndingDim); + Result &= Serialize(Bytes, &Element->ParticleEndingTransparency); // default - Result &= Serialize(Bytes, &Element->ParticleTurbMin); + Result &= Serialize(Bytes, &Element->ParticleStartingDim); // default - Result &= Serialize(Bytes, &Element->ParticleTurbMax); + Result &= Serialize(Bytes, &Element->ParticleEndingDim); // default - Result &= Serialize(Bytes, &Element->SpawnRegion); - Result &= Serialize(Bytes, &Element->SystemMovementCoefficient); + Result &= Serialize(Bytes, &Element->ParticleTurbMin); // default - Result &= Serialize(Bytes, &Element->ElapsedSinceLastEmission); + + Result &= Serialize(Bytes, &Element->ParticleTurbMax); // default + + + + + + + Result &= Serialize(Bytes, &Element->SpawnRegion); // default + + + + + + + Result &= Serialize(Bytes, &Element->SystemMovementCoefficient); // default + + + + + + + Result &= Serialize(Bytes, &Element->ElapsedSinceLastEmission); // default + diff --git a/generated/serdes_struct_particle_system_0.h b/generated/serdes_struct_particle_system_0.h index 57bb243d1..8ffcb212e 100644 --- a/generated/serdes_struct_particle_system_0.h +++ b/generated/serdes_struct_particle_system_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:284:0 +// src/engine/serdes.cpp:287:0 link_internal bonsai_type_info TypeInfo(particle_system_0 *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, particle_system_0 *BaseElement, umm Coun { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,126 +34,146 @@ Serialize(u8_cursor_block_array *Bytes, particle_system_0 *BaseElement, umm Coun RangeIterator_t(umm, ElementIndex, Count) { particle_system_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Entropy); + Result &= Serialize(Bytes, &Element->Entropy); // default - Result &= Serialize(Bytes, (u32*)&Element->SpawnType); + Result &= Serialize(Bytes, (u32*)&Element->SpawnType); // enum - Result &= Serialize(Bytes, &Element->Drag); + Result &= Serialize(Bytes, &Element->Drag); // default - Result &= Serialize(Bytes, &Element->Lifetime); + Result &= Serialize(Bytes, &Element->Lifetime); // default - Result &= Serialize(Bytes, &Element->EmissionDelay); + Result &= Serialize(Bytes, &Element->EmissionDelay); // default - Result &= Serialize(Bytes, &Element->EmissionLifespan); + Result &= Serialize(Bytes, &Element->EmissionLifespan); // default - Result &= Serialize(Bytes, &Element->ActiveParticles); - Result &= Serialize(Bytes, &Element->LifespanMod); + Result &= Serialize(Bytes, &Element->ActiveParticles); // default - Result &= Serialize(Bytes, &Element->ParticleLifespan); + Result &= Serialize(Bytes, &Element->LifespanMod); // default - Result &= Serialize(Bytes, &Element->ParticlesPerSecond); + Result &= Serialize(Bytes, &Element->ParticleLifespan); // default - Result &= Serialize(Bytes, &Element->ParticleLightEmission); + Result &= Serialize(Bytes, &Element->ParticlesPerSecond); // default - Result &= Serialize(Bytes, &Element->ParticleLightEmissionChance); + Result &= Serialize(Bytes, &Element->ParticleLightEmission); // default - Result &= Serialize(Bytes, &Element->ParticleStartingTransparency); - Result &= Serialize(Bytes, &Element->ParticleEndingTransparency); + Result &= Serialize(Bytes, &Element->ParticleLightEmissionChance); // default - Result &= Serialize(Bytes, &Element->ParticleStartingDim); + Result &= Serialize(Bytes, &Element->ParticleStartingTransparency); // default - Result &= Serialize(Bytes, &Element->ParticleEndingDim); + Result &= Serialize(Bytes, &Element->ParticleEndingTransparency); // default - Result &= Serialize(Bytes, &Element->ParticleTurbMin); + Result &= Serialize(Bytes, &Element->ParticleStartingDim); // default - Result &= Serialize(Bytes, &Element->ParticleTurbMax); + Result &= Serialize(Bytes, &Element->ParticleEndingDim); // default - Result &= Serialize(Bytes, &Element->SpawnRegion); - Result &= Serialize(Bytes, &Element->SystemMovementCoefficient); + Result &= Serialize(Bytes, &Element->ParticleTurbMin); // default - Result &= Serialize(Bytes, &Element->ElapsedSinceLastEmission); + + Result &= Serialize(Bytes, &Element->ParticleTurbMax); // default + + + + + + + Result &= Serialize(Bytes, &Element->SpawnRegion); // default + + + + + + + Result &= Serialize(Bytes, &Element->SystemMovementCoefficient); // default + + + + + + + Result &= Serialize(Bytes, &Element->ElapsedSinceLastEmission); // default + diff --git a/generated/serdes_struct_perlin_noise_params.h b/generated/serdes_struct_perlin_noise_params.h index 68c5791b2..28b8d2b4b 100644 --- a/generated/serdes_struct_perlin_noise_params.h +++ b/generated/serdes_struct_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:539:0 +// src/engine/serdes.cpp:542:0 link_internal bonsai_type_info TypeInfo(perlin_noise_params *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, perlin_noise_params *BaseElement, umm Co { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,19 +34,21 @@ Serialize(u8_cursor_block_array *Bytes, perlin_noise_params *BaseElement, umm Co RangeIterator_t(umm, ElementIndex, Count) { perlin_noise_params *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Threshold); + Result &= Serialize(Bytes, &Element->Threshold); // default - Result &= Serialize(Bytes, &Element->Period); + Result &= Serialize(Bytes, &Element->Period); // default - Result &= Serialize(Bytes, &Element->Amplitude); + + + Result &= Serialize(Bytes, &Element->Amplitude); // default diff --git a/generated/serdes_struct_physics.h b/generated/serdes_struct_physics.h index 151f27d65..27e2bbaf1 100644 --- a/generated/serdes_struct_physics.h +++ b/generated/serdes_struct_physics.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:293:0 +// src/engine/serdes.cpp:296:0 link_internal bonsai_type_info TypeInfo(physics *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, physics *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,31 +34,35 @@ Serialize(u8_cursor_block_array *Bytes, physics *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { physics *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Velocity); + Result &= Serialize(Bytes, &Element->Velocity); // default - Result &= Serialize(Bytes, &Element->Force); + Result &= Serialize(Bytes, &Element->Force); // default - Result &= Serialize(Bytes, &Element->Delta); + Result &= Serialize(Bytes, &Element->Delta); // default - Result &= Serialize(Bytes, &Element->Mass); + Result &= Serialize(Bytes, &Element->Mass); // default - Result &= Serialize(Bytes, &Element->Speed); + + + + + Result &= Serialize(Bytes, &Element->Speed); // default diff --git a/generated/serdes_struct_plane.h b/generated/serdes_struct_plane.h index 86a77017b..d35aa097b 100644 --- a/generated/serdes_struct_plane.h +++ b/generated/serdes_struct_plane.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, plane *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,19 +34,22 @@ Serialize(u8_cursor_block_array *Bytes, plane *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { plane *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->P); + Result &= Serialize(Bytes, &Element->P); // default - Result &= Serialize(Bytes, &Element->Normal); + Result &= Serialize(Bytes, &Element->Normal); // default - Result &= Serialize(Bytes, &Element->d); + + + Result &= Serialize(Bytes, &Element->d); // default + diff --git a/generated/serdes_struct_random_series.h b/generated/serdes_struct_random_series.h index 8069cdc99..30dbe3c00 100644 --- a/generated/serdes_struct_random_series.h +++ b/generated/serdes_struct_random_series.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:274:0 +// src/engine/serdes.cpp:277:0 link_internal bonsai_type_info TypeInfo(random_series *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, random_series *BaseElement, umm Count = { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,7 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, random_series *BaseElement, umm Count = RangeIterator_t(umm, ElementIndex, Count) { random_series *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Seed); + Result &= Serialize(Bytes, &Element->Seed); // default diff --git a/generated/serdes_struct_rect3.h b/generated/serdes_struct_rect3.h index 9f3a25825..ac152ff10 100644 --- a/generated/serdes_struct_rect3.h +++ b/generated/serdes_struct_rect3.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, rect3 *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,13 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, rect3 *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { rect3 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Min); + Result &= Serialize(Bytes, &Element->Min); // default - Result &= Serialize(Bytes, &Element->Max); + + Result &= Serialize(Bytes, &Element->Max); // default diff --git a/generated/serdes_struct_rect3i.h b/generated/serdes_struct_rect3i.h index ac7841fbf..3b2f2e797 100644 --- a/generated/serdes_struct_rect3i.h +++ b/generated/serdes_struct_rect3i.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, rect3i *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,13 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, rect3i *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { rect3i *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Min); + Result &= Serialize(Bytes, &Element->Min); // default - Result &= Serialize(Bytes, &Element->Max); + + Result &= Serialize(Bytes, &Element->Max); // default diff --git a/generated/serdes_struct_render_settings.h b/generated/serdes_struct_render_settings.h index 6a501e45c..226f568c0 100644 --- a/generated/serdes_struct_render_settings.h +++ b/generated/serdes_struct_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:440:0 +// src/engine/serdes.cpp:443:0 link_internal bonsai_type_info TypeInfo(render_settings *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, render_settings *BaseElement, umm Count { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -37,126 +37,145 @@ Serialize(u8_cursor_block_array *Bytes, render_settings *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { render_settings *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->UseSsao); + Result &= Serialize(Bytes, &Element->UseSsao); // default - Result &= Serialize(Bytes, &Element->UseShadowMapping); + Result &= Serialize(Bytes, &Element->UseShadowMapping); // default - Result &= Serialize(Bytes, &Element->UseLightingBloom); + Result &= Serialize(Bytes, &Element->UseLightingBloom); // default - Result &= Serialize(Bytes, &Element->BravoilMyersOIT); + Result &= Serialize(Bytes, &Element->BravoilMyersOIT); // default - Result &= Serialize(Bytes, &Element->BravoilMcGuireOIT); + Result &= Serialize(Bytes, &Element->BravoilMcGuireOIT); // default - Result &= Serialize(Bytes, &Element->DrawMajorGrid); - Result &= Serialize(Bytes, &Element->DrawMinorGrid); + Result &= Serialize(Bytes, &Element->DrawMajorGrid); // default - Result &= Serialize(Bytes, &Element->MajorGridDim); + Result &= Serialize(Bytes, &Element->DrawMinorGrid); // default - Result &= Serialize(Bytes, &Element->DrawCameraGhost); + Result &= Serialize(Bytes, &Element->MajorGridDim); // default - Result &= Serialize(Bytes, &Element->CameraGhostSize); + Result &= Serialize(Bytes, &Element->DrawCameraGhost); // default - Result &= Serialize(Bytes, &Element->OffsetOfWorldCenterToGrid); + Result &= Serialize(Bytes, &Element->CameraGhostSize); // default - Result &= Serialize(Bytes, &Element->Headless); - Result &= Serialize(Bytes, (u32*)&Element->ToneMappingType); + Result &= Serialize(Bytes, &Element->OffsetOfWorldCenterToGrid); // default - Result &= Serialize(Bytes, &Element->GameCameraFOV); + Result &= Serialize(Bytes, &Element->Headless); // default - Result &= Serialize(Bytes, &Element->Lighting); + Result &= Serialize(Bytes, (u32*)&Element->ToneMappingType); // enum - Result &= Serialize(Bytes, &Element->ApplicationResolution); + Result &= Serialize(Bytes, &Element->GameCameraFOV); // default - Result &= Serialize(Bytes, &Element->ShadowMapResolution); + Result &= Serialize(Bytes, &Element->Lighting); // default - Result &= Serialize(Bytes, &Element->LuminanceMapResolution); + Result &= Serialize(Bytes, &Element->ApplicationResolution); // default - Result &= Serialize(Bytes, &Element->iApplicationResolution); - Result &= Serialize(Bytes, &Element->iShadowMapResolution); + Result &= Serialize(Bytes, &Element->ShadowMapResolution); // default - Result &= Serialize(Bytes, &Element->iLuminanceMapResolution); + + Result &= Serialize(Bytes, &Element->LuminanceMapResolution); // default + + + + + + + Result &= Serialize(Bytes, &Element->iApplicationResolution); // default + + + + + + + Result &= Serialize(Bytes, &Element->iShadowMapResolution); // default + + + + + + + Result &= Serialize(Bytes, &Element->iLuminanceMapResolution); // default diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index a0eab98b6..b32975468 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:551:0 +// src/engine/serdes.cpp:554:0 link_internal bonsai_type_info TypeInfo(shape_layer *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,18 +34,19 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { shape_layer *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Sphere); + Result &= Serialize(Bytes, &Element->Sphere); // default - Result &= Serialize(Bytes, &Element->Rect); + + Result &= Serialize(Bytes, &Element->Rect); // default diff --git a/generated/serdes_struct_vertex_material.h b/generated/serdes_struct_vertex_material.h index 17c97050e..d3f311efe 100644 --- a/generated/serdes_struct_vertex_material.h +++ b/generated/serdes_struct_vertex_material.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, vertex_material *BaseElement, umm Count { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,19 +34,21 @@ Serialize(u8_cursor_block_array *Bytes, vertex_material *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { vertex_material *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->ColorIndex); + Result &= Serialize(Bytes, &Element->ColorIndex); // default - Result &= Serialize(Bytes, &Element->Transparency); + Result &= Serialize(Bytes, &Element->Transparency); // default - Result &= Serialize(Bytes, &Element->Emission); + + + Result &= Serialize(Bytes, &Element->Emission); // default diff --git a/generated/serdes_struct_voronoi_noise_params.h b/generated/serdes_struct_voronoi_noise_params.h index d032722bf..7c0e5d8a1 100644 --- a/generated/serdes_struct_voronoi_noise_params.h +++ b/generated/serdes_struct_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:541:0 +// src/engine/serdes.cpp:544:0 link_internal bonsai_type_info TypeInfo(voronoi_noise_params *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, voronoi_noise_params *BaseElement, umm C { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,31 +34,35 @@ Serialize(u8_cursor_block_array *Bytes, voronoi_noise_params *BaseElement, umm C RangeIterator_t(umm, ElementIndex, Count) { voronoi_noise_params *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Threshold); + Result &= Serialize(Bytes, &Element->Threshold); // default - Result &= Serialize(Bytes, &Element->Period); + Result &= Serialize(Bytes, &Element->Period); // default - Result &= Serialize(Bytes, &Element->Amplitude); + Result &= Serialize(Bytes, &Element->Amplitude); // default - Result &= Serialize(Bytes, &Element->Squareness); + Result &= Serialize(Bytes, &Element->Squareness); // default - Result &= Serialize(Bytes, &Element->MaskChance); + + + + + Result &= Serialize(Bytes, &Element->MaskChance); // default diff --git a/generated/serdes_struct_vox_data.h b/generated/serdes_struct_vox_data.h index 8b68075e5..fa972d20f 100644 --- a/generated/serdes_struct_vox_data.h +++ b/generated/serdes_struct_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:290:0 +// src/engine/serdes.cpp:293:0 link_internal bonsai_type_info TypeInfo(vox_data *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, vox_data *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; diff --git a/generated/serdes_struct_voxel.h b/generated/serdes_struct_voxel.h index 29f5410bd..bb2c7b1f0 100644 --- a/generated/serdes_struct_voxel.h +++ b/generated/serdes_struct_voxel.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, voxel *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,13 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, voxel *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { voxel *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Transparency); + Result &= Serialize(Bytes, &Element->Transparency); // default - Result &= Serialize(Bytes, &Element->Color); + + Result &= Serialize(Bytes, &Element->Color); // default diff --git a/generated/serdes_struct_voxel_lighting.h b/generated/serdes_struct_voxel_lighting.h index 6a96cf2b2..c0eea8ccf 100644 --- a/generated/serdes_struct_voxel_lighting.h +++ b/generated/serdes_struct_voxel_lighting.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, voxel_lighting *BaseElement, umm Count = { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,7 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, voxel_lighting *BaseElement, umm Count = RangeIterator_t(umm, ElementIndex, Count) { voxel_lighting *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Emission); + Result &= Serialize(Bytes, &Element->Emission); // default diff --git a/generated/serdes_struct_white_noise_params.h b/generated/serdes_struct_white_noise_params.h index d75df9092..2e78a11c4 100644 --- a/generated/serdes_struct_white_noise_params.h +++ b/generated/serdes_struct_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:537:0 +// src/engine/serdes.cpp:540:0 link_internal bonsai_type_info TypeInfo(white_noise_params *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, white_noise_params *BaseElement, umm Cou { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,7 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, white_noise_params *BaseElement, umm Cou RangeIterator_t(umm, ElementIndex, Count) { white_noise_params *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Threshold); + Result &= Serialize(Bytes, &Element->Threshold); // default diff --git a/generated/serdes_struct_world_chunk.h b/generated/serdes_struct_world_chunk.h index 14e093682..10cffa3bd 100644 --- a/generated/serdes_struct_world_chunk.h +++ b/generated/serdes_struct_world_chunk.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -37,7 +37,8 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { world_chunk *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Dim); + Result &= Serialize(Bytes, &Element->Dim); // default + @@ -68,13 +69,15 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) - Result &= Serialize(Bytes, &Element->DimInChunks); + Result &= Serialize(Bytes, &Element->DimInChunks); // default + + + Result &= Serialize(Bytes, &Element->WorldP); // default - Result &= Serialize(Bytes, &Element->WorldP); diff --git a/generated/serdes_struct_world_chunk_0.h b/generated/serdes_struct_world_chunk_0.h index db65acef1..cef7152e0 100644 --- a/generated/serdes_struct_world_chunk_0.h +++ b/generated/serdes_struct_world_chunk_0.h @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk_0 *BaseElement, umm Count = { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,7 +34,8 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk_0 *BaseElement, umm Count = RangeIterator_t(umm, ElementIndex, Count) { world_chunk_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Dim); + Result &= Serialize(Bytes, &Element->Dim); // default + @@ -50,7 +51,8 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk_0 *BaseElement, umm Count = - Result &= Serialize(Bytes, &Element->WorldP); + Result &= Serialize(Bytes, &Element->WorldP); // default + diff --git a/generated/serdes_struct_world_update_op_shape_params_rect.h b/generated/serdes_struct_world_update_op_shape_params_rect.h index 7fd31a1d7..29f2c5517 100644 --- a/generated/serdes_struct_world_update_op_shape_params_rect.h +++ b/generated/serdes_struct_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:547:0 +// src/engine/serdes.cpp:550:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_rect *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_rect *BaseE { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,7 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_rect *BaseE RangeIterator_t(umm, ElementIndex, Count) { world_update_op_shape_params_rect *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Region); + Result &= Serialize(Bytes, &Element->Region); // default diff --git a/generated/serdes_struct_world_update_op_shape_params_sphere.h b/generated/serdes_struct_world_update_op_shape_params_sphere.h index a91375055..2928910bc 100644 --- a/generated/serdes_struct_world_update_op_shape_params_sphere.h +++ b/generated/serdes_struct_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:549:0 +// src/engine/serdes.cpp:552:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_sphere *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_sphere *Bas { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -34,13 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_sphere *Bas RangeIterator_t(umm, ElementIndex, Count) { world_update_op_shape_params_sphere *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Location); + Result &= Serialize(Bytes, &Element->Location); // default - Result &= Serialize(Bytes, &Element->Radius); + + Result &= Serialize(Bytes, &Element->Radius); // default diff --git a/generated/serialize_struct_entity.h b/generated/serialize_struct_entity.h index cfa7ae79c..ffecab17e 100644 --- a/generated/serialize_struct_entity.h +++ b/generated/serialize_struct_entity.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:361:0 +// src/engine/serdes.cpp:364:0 link_internal bonsai_type_info TypeInfo(entity *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, entity *BaseElement, umm Count = 1) { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -37,49 +37,57 @@ Serialize(u8_cursor_block_array *Bytes, entity *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { entity *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Id); + Result &= Serialize(Bytes, &Element->Id); // default - Result &= Serialize(Bytes, &Element->P); + Result &= Serialize(Bytes, &Element->P); // default - Result &= Serialize(Bytes, &Element->EulerAngles); + Result &= Serialize(Bytes, &Element->EulerAngles); // default - Result &= Serialize(Bytes, &Element->Scale); + Result &= Serialize(Bytes, &Element->Scale); // default - Result &= Serialize(Bytes, &Element->_CollisionVolumeRadius); + Result &= Serialize(Bytes, &Element->_CollisionVolumeRadius); // default - Result &= Serialize(Bytes, &Element->Physics); - Result &= Serialize(Bytes, &Element->AssetId); + Result &= Serialize(Bytes, &Element->Physics); // default - Result &= Serialize(Bytes, &Element->ModelIndex); + + Result &= Serialize(Bytes, &Element->AssetId); // default + + + + + + + Result &= Serialize(Bytes, &Element->ModelIndex); // default + @@ -90,23 +98,25 @@ Serialize(u8_cursor_block_array *Bytes, entity *BaseElement, umm Count = 1) - Result &= Serialize(Bytes, (u32*)&Element->State); + Result &= Serialize(Bytes, (u32*)&Element->State); // enum + + + Result &= Serialize(Bytes, (u32*)&Element->Behavior); // enum - Result &= Serialize(Bytes, (u32*)&Element->Behavior); + Result &= Serialize(Bytes, &Element->Carrying); // default - Result &= Serialize(Bytes, &Element->Carrying); + Result &= Serialize(Bytes, &Element->UserType); // default - Result &= Serialize(Bytes, &Element->UserType); diff --git a/generated/serialize_struct_level_header.h b/generated/serialize_struct_level_header.h index 5430def6a..55368322f 100644 --- a/generated/serialize_struct_level_header.h +++ b/generated/serialize_struct_level_header.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:519:0 +// src/engine/serdes.cpp:522:0 link_internal bonsai_type_info TypeInfo(level_header *Ignored) @@ -24,7 +24,7 @@ Serialize(u8_cursor_block_array *Bytes, level_header *BaseElement, umm Count = 1 { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -37,43 +37,49 @@ Serialize(u8_cursor_block_array *Bytes, level_header *BaseElement, umm Count = 1 RangeIterator_t(umm, ElementIndex, Count) { level_header *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->ChunkCount); + Result &= Serialize(Bytes, &Element->ChunkCount); // default - Result &= Serialize(Bytes, &Element->EntityCount); + Result &= Serialize(Bytes, &Element->EntityCount); // default - Result &= Serialize(Bytes, &Element->WorldFlags); + Result &= Serialize(Bytes, &Element->WorldFlags); // default - Result &= Serialize(Bytes, &Element->WorldCenter); + Result &= Serialize(Bytes, &Element->WorldCenter); // default - Result &= Serialize(Bytes, &Element->VisibleRegion); + Result &= Serialize(Bytes, &Element->VisibleRegion); // default - Result &= Serialize(Bytes, &Element->Camera); - Result &= Serialize(Bytes, &Element->RenderSettings); + Result &= Serialize(Bytes, &Element->Camera); // default + + + + + + + Result &= Serialize(Bytes, &Element->RenderSettings); // default diff --git a/generated/serialize_struct_render_settings_0.h b/generated/serialize_struct_render_settings_0.h index 43e4893d6..0519cd4e0 100644 --- a/generated/serialize_struct_render_settings_0.h +++ b/generated/serialize_struct_render_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:437:0 +// src/engine/serdes.cpp:440:0 link_internal b32 Deserialize(u8_cursor *Bytes, render_settings_0 *Element, memory_arena *Memory, umm Count = 1); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 8dd1cb47b..e43e60e6d 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -30,12 +30,12 @@ InitEditor(level_editor *Editor) Editor->AssetThumbnails.Memory = Editor->Memory; - RangeIterator(LayerIndex, MAX_BRUSH_LAYERS) - { - Editor->LayeredBrush.LayerPreviews[LayerIndex].Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); - } - Editor->LayeredBrush.SeedLayer.Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); - Editor->LayeredBrush.Preview.Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); +/* RangeIterator(LayerIndex, MAX_BRUSH_LAYERS) */ +/* { */ +/* Editor->LayeredBrush.LayerPreviews[LayerIndex].Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); */ +/* } */ +/* Editor->LayeredBrush.SeedLayer.Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); */ +/* Editor->LayeredBrush.Preview.Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); */ return Result; } @@ -1425,11 +1425,11 @@ NewBrush(layered_brush *LayeredBrush) } link_internal void -BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSettingsWindow) +BrushSettingsForLayeredBrush(engine_resources *Engine, layered_brush *LayeredBrush, window_layout *BrushSettingsWindow) { UNPACK_ENGINE_RESOURCES(Engine); - layered_brush *LayeredBrush = &Editor->LayeredBrush; + /* layered_brush *LayeredBrush = &Editor->LayeredBrush; */ brush_layer *Layers = LayeredBrush->Layers; chunk_thumbnail *Previews = LayeredBrush->LayerPreviews; @@ -1500,13 +1500,17 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, window_layout *BrushSetti if (ClickedFileNode.Tag) { cs Filename = Concat(ClickedFileNode.Value.Dir, CSz("/"), ClickedFileNode.Value.Name, Tran); +#if 1 + NotImplemented; +#else u8_cursor Bytes = BeginDeserialization(Filename, Tran); - if (Deserialize(&Bytes, &Editor->LayeredBrush, Tran) == False) + if (Deserialize(&Bytes, &Editor->Brush, Tran) == False) { SoftError("While deserializing brush (%S).", Filename); Editor->LayeredBrush = {}; } FinalizeDeserialization(&Bytes); +#endif // NOTE(Jesse): This has to happen after deserialization cause some // brushes got saved out with a name, which gets read back in.. @@ -1878,7 +1882,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_tool WorldEditTool, w case WorldEdit_BrushType_Layered: { - BrushSettingsForLayeredBrush(Engine, &Window); + BrushSettingsForLayeredBrush(Engine, &Engine->Editor.Brush.Layered, &Window); } break; } @@ -1895,7 +1899,7 @@ CurrentToolIs(level_editor *Editor, world_edit_tool Tool, world_edit_brush_type Result = True; if (Editor->Tool == WorldEdit_Tool_Brush) { - Result = (Editor->BrushType == BrushType); + Result = (Editor->Brush.Type == BrushType); } } return Result; @@ -1932,7 +1936,7 @@ EditWorldSelection(engine_resources *Engine) if (CurrentToolIs(Editor, WorldEdit_Tool_Brush, WorldEdit_BrushType_Layered)) { - layered_brush *Brush = &Editor->LayeredBrush; + layered_brush *Brush = &Editor->Brush.Layered; if (Brush->BrushFollowsCursor) { if (Engine->MousedOverVoxel.Tag) @@ -2088,13 +2092,13 @@ GetEditModeForSelectedTool(level_editor *Editor) case WorldEdit_Tool_Brush: { - switch(Editor->BrushType) + switch(Editor->Brush.Type) { case WorldEdit_BrushType_Disabled: {} break; case WorldEdit_BrushType_Entity: {} break; - case WorldEdit_BrushType_Single: { Result = Editor->SingleBrush.Mode; } break; - case WorldEdit_BrushType_Asset: { Result = Editor->AssetBrush.Mode; } break; - case WorldEdit_BrushType_Layered: { Result = Editor->LayeredBrush.Mode;} break; + case WorldEdit_BrushType_Single: { Result = Editor->Brush.Single.Mode; } break; + case WorldEdit_BrushType_Asset: { Result = Editor->Brush.Asset.Mode; } break; + case WorldEdit_BrushType_Layered: { Result = Editor->Brush.Layered.Mode;} break; } } break; } @@ -2259,7 +2263,7 @@ DoWorldEditor(engine_resources *Engine) { Params.RelativePosition.Position = Position_RightOf; Params.RelativePosition.RelativeTo = CurrentRef; - WorldEditBrushTypeButtonGroup = DoEditorUi(Ui, &Window, &Editor->BrushType, CSz("Brush Type"), &Params, ToggleButtonGroupFlags_DrawVertical); + WorldEditBrushTypeButtonGroup = DoEditorUi(Ui, &Window, &Editor->Brush.Type, CSz("Brush Type"), &Params, ToggleButtonGroupFlags_DrawVertical); CurrentRef = WorldEditBrushTypeButtonGroup.UiRef; } @@ -2316,7 +2320,7 @@ DoWorldEditor(engine_resources *Engine) case WorldEdit_Tool_Brush: { - switch (Editor->BrushType) + switch (Editor->Brush.Type) { case WorldEdit_BrushType_Disabled: {} break; @@ -2355,16 +2359,16 @@ DoWorldEditor(engine_resources *Engine) Canonicalize(World, EntityOrigin - V3(AssetHalfDim.xy, 0.f)) }; - if (Editor->BrushType == WorldEdit_BrushType_Asset) + if (Editor->Brush.Type == WorldEdit_BrushType_Asset) { world_edit_shape Shape = { type_world_update_op_shape_params_asset, .world_update_op_shape_params_asset = AssetUpdateShape, }; - QueueWorldUpdateForRegion(Engine, Editor->AssetBrush.Mode, Editor->AssetBrush.Modifier, &Shape, {}, {}, Engine->WorldUpdateMemory); + QueueWorldUpdateForRegion(Engine, Editor->Brush.Asset.Mode, Editor->Brush.Asset.Modifier, &Shape, {}, {}, Engine->WorldUpdateMemory); } - else if (Editor->BrushType == WorldEdit_BrushType_Entity) + else if (Editor->Brush.Type == WorldEdit_BrushType_Entity) { entity *E = TryGetFreeEntityPtr(Engine->EntityTable); if (E) @@ -2439,15 +2443,16 @@ DoWorldEditor(engine_resources *Engine) case WorldEdit_BrushType_Layered: { + layered_brush *Layered = &Editor->Brush.Layered; if (AABBTest.Face && InputStateIsValidToApplyEdit(Input)) { v3i Offset = V3i(s32_MAX); - world_chunk *Chunk = &Editor->LayeredBrush.Preview.Chunk; + world_chunk *Chunk = &Layered->Preview.Chunk; // TODO(Jesse): Call GetSmallestMinOffset here - RangeIterator(LayerIndex, Editor->LayeredBrush.LayerCount) + RangeIterator(LayerIndex, Layered->LayerCount) { - brush_layer *Layer = Editor->LayeredBrush.Layers + LayerIndex; + brush_layer *Layer = Layered->Layers + LayerIndex; Offset = Min(Layer->Settings.Offset.Min, Offset); } @@ -2459,7 +2464,7 @@ DoWorldEditor(engine_resources *Engine) type_world_update_op_shape_params_chunk_data, .world_update_op_shape_params_chunk_data = ChunkDataShape, }; - QueueWorldUpdateForRegion(Engine, Editor->LayeredBrush.Mode, Editor->LayeredBrush.Modifier, &Shape, DEFAULT_HSV_COLOR, Editor->LayeredBrush.SeedBrushWithSelection, Engine->WorldUpdateMemory); + QueueWorldUpdateForRegion(Engine, Layered->Mode, Layered->Modifier, &Shape, DEFAULT_HSV_COLOR, Layered->SeedBrushWithSelection, Engine->WorldUpdateMemory); } } break; @@ -2583,7 +2588,7 @@ DoWorldEditor(engine_resources *Engine) // the Select tool is active, doesn't update any of the brush stuff, then // the preview gets drawn because we pop back to the Layered brush tool and // there's a frame of lag. - DoBrushSettingsWindow(Engine, Editor->Tool, Editor->BrushType); + DoBrushSettingsWindow(Engine, Editor->Tool, Editor->Brush.Type); @@ -2679,11 +2684,11 @@ DrawEditorPreview(engine_resources *Engine, shader *Shader) { case WorldEdit_Tool_Brush: { - switch (Editor->BrushType) + switch (Editor->Brush.Type) { case WorldEdit_BrushType_Layered: { - layered_brush *LayeredBrush = &Editor->LayeredBrush; + layered_brush *LayeredBrush = &Editor->Brush.Layered; v3i SmallestMinOffset = GetSmallestMinOffset(LayeredBrush); Chunk = &LayeredBrush->Preview.Chunk; Basis = V3(SmallestMinOffset) - V3i(1); diff --git a/src/engine/editor.h b/src/engine/editor.h index 4d19419d3..0fa437944 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -775,7 +775,7 @@ struct world_edit_shape }; }; -struct world_edit_brush +struct world_edit_brush_constraints { world_edit_shape Shape; @@ -793,7 +793,7 @@ struct world_edit_brush /* v3 SimFloodOrigin; */ }; -poof(do_editor_ui_for_compound_type(world_edit_brush)) +poof(do_editor_ui_for_compound_type(world_edit_brush_constraints)) #include @@ -1099,13 +1099,13 @@ Marshal(layered_brush_0 *Stored, layered_brush *Live) -struct single_brush_settings +struct single_brush { world_edit_mode Mode; }; -struct asset_brush_settings +struct asset_brush { world_edit_mode Mode; world_edit_mode_modifier Modifier; @@ -1138,10 +1138,23 @@ struct selection_region selection_modification_state ModState; }; + + struct world_edit { - cs ShaderName; rect3cp Region; + + world_edit_shape Shape; + world_edit_mode Mode; + world_edit_mode_modifier Modifier; + + world_edit_brush_type Type; + union + { + single_brush Single; + asset_brush Asset; + layered_brush Layered; + }; }; poof(block_array(world_edit, {128})) @@ -1152,14 +1165,10 @@ struct level_editor { memory_arena *Memory; - world_edit_tool Tool; - world_edit_tool PreviousTool; // So we can 'pop' back to the last tool on select/eyedropper + world_edit_tool Tool; + world_edit_tool PreviousTool; // So we can 'pop' back to the last tool on select/eyedropper - world_edit_brush_type BrushType; - - single_brush_settings SingleBrush; - asset_brush_settings AssetBrush; - layered_brush LayeredBrush; + world_edit Brush; b8 SelectionFollowsCursor; @@ -1182,6 +1191,8 @@ struct level_editor b32 NewAssetFromSelection; char NewAssetFromSelectionFilename[512]; + b32 MaskSelection; + world_edit_block_array WorldEdits; }; diff --git a/src/engine/render.cpp b/src/engine/render.cpp index c7c574a88..3fb38766d 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1620,7 +1620,8 @@ DrawWorldAndEntitiesToShadowMap(v2i ShadowMapResolution, engine_resources *Engin shadow_render_group *SG = Graphics->SG; - SetupShadowMapShader(Graphics, ShadowMapResolution, Editor->LayeredBrush.SeedBrushWithSelection); + b32 MaskSelection = False; + SetupShadowMapShader(Graphics, ShadowMapResolution, MaskSelection); // NOTE(Jesse): So there's a visual distinction between preview and instantiated /* DrawEditorPreview(Engine, &SG->DepthShader); */ diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 393646ef0..c96d25ac1 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -255,12 +255,12 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case BonsaiRenderCommand_ShaderId_gBuffer: { - SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), Editor->LayeredBrush.SeedBrushWithSelection); + SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), Editor->MaskSelection); } break; case BonsaiRenderCommand_ShaderId_ShadowMap: { - SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), Editor->LayeredBrush.SeedBrushWithSelection); + SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), Editor->MaskSelection); } break; } } break; diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index f1a4d850f..fb38a46ac 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -271,6 +271,9 @@ poof(serdes_struct(rect3)) poof(serdes_struct(rect3i)) #include +poof(serdes_struct(rect3cp)) +#include + poof(serdes_struct(random_series)) #include @@ -571,3 +574,9 @@ poof(serdes_struct(layered_brush_2)) #include poof(serdes_struct(layered_brush)) #include + +/* poof(serdes_dunion(world_edit_shape)) */ +/* #include */ + +/* poof(serdes_struct(world_edit)) */ +/* #include */ diff --git a/src/engine/serdes.h b/src/engine/serdes.h index bde7aefe9..ebd52b7c7 100644 --- a/src/engine/serdes.h +++ b/src/engine/serdes.h @@ -155,7 +155,7 @@ poof( { Assert(Count > 0); - u64 PointerTrue = True; + u64 PointerTrue = True; u64 PointerFalse = False; b32 Result = True; @@ -189,7 +189,7 @@ poof( { member.is_enum? { - Result &= Serialize(Bytes, (u32*)&Element->(member.name)); + Result &= Serialize(Bytes, (u32*)&Element->(member.name)); // enum } { member.is_array? @@ -207,7 +207,13 @@ poof( } } { - Result &= Serialize(Bytes, &Element->(member.name)); + member.name? + { + Result &= Serialize(Bytes, &Element->(member.name)); // default + } + { + /// NOTE(Jesse): This path is here because of a bug in poof, issue #19 + } } } } @@ -460,6 +466,13 @@ poof( } ) +poof( + func serdes_dunion(type) + { + serialize_dunion(type) + } +) + // TODO(Jesse): Do this in terms of poof tag @array_length link_internal b32 diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index bcfa2abce..f8555f62e 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -91,7 +91,7 @@ struct work_queue_entry_rebuild_mesh struct work_queue_entry_update_world_region { - world_edit_brush Brush; + world_edit_brush_constraints Brush; // TODO(Jesse): These feel like part of the brush? v3 HSVColor; @@ -263,7 +263,7 @@ poof( // nocheckin // TODO(Jesse): Turn this on -CAssert(sizeof(work_queue_entry) % CACHE_LINE_SIZE == 0); +/* CAssert(sizeof(work_queue_entry) % CACHE_LINE_SIZE == 0); */ poof(d_union_constructors(work_queue_entry)) #include From 2a2164eaf964a6c49899df378985a4bbd80d7367 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 19 Dec 2024 15:47:02 -0700 Subject: [PATCH 142/421] Fix brush deserialization --- examples/terrain_gen/game_constants.h | 4 ++-- src/engine/editor.cpp | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index a24ba403f..b4fec95ad 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -18,10 +18,10 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ -g_VisibleRegion = Chunk_Dimension(128, 128, 128); +/* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ -/* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ +g_VisibleRegion = Chunk_Dimension(16, 16, 16); /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ /* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index e43e60e6d..01ba8bf49 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1500,14 +1500,15 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, layered_brush *LayeredBru if (ClickedFileNode.Tag) { cs Filename = Concat(ClickedFileNode.Value.Dir, CSz("/"), ClickedFileNode.Value.Name, Tran); -#if 1 +#if 0 NotImplemented; #else + Assert(Editor->Brush.Type == WorldEdit_BrushType_Layered); u8_cursor Bytes = BeginDeserialization(Filename, Tran); - if (Deserialize(&Bytes, &Editor->Brush, Tran) == False) + if (Deserialize(&Bytes, &Editor->Brush.Layered, Tran) == False) { SoftError("While deserializing brush (%S).", Filename); - Editor->LayeredBrush = {}; + Editor->Brush = {}; } FinalizeDeserialization(&Bytes); #endif From d723bcf5588df1b20078a358cf651f536a7ce612 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 27 Dec 2024 21:05:49 -0700 Subject: [PATCH 143/421] Nominally track edit regions --- ...editor_ui_for_compound_type_level_editor.h | 15 ++++++++ jesse.make.sh | 2 +- shaders/terrain/default.fragmentshader | 4 +-- src/engine/editor.cpp | 34 +++++++++++++++---- src/engine/editor.h | 1 + 5 files changed, 47 insertions(+), 9 deletions(-) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 81edfd6f5..6f1ae0484 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -251,6 +251,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam PushNewRow(Ui); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit*, Element->CurrentEdit), + CSz("CurrentEdit"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/jesse.make.sh b/jesse.make.sh index dddb34e4c..80e120b7a 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,7 +11,7 @@ ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ - BuildExecutables \ + # BuildExecutables \ # BuildTests \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index ccd6a8791..4a634aee6 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -257,8 +257,8 @@ void main() } deriv = normalize(deriv); - /* ColorValue = abs(deriv); */ - ColorValue = v3(0.75f); + ColorValue = abs(deriv); + /* ColorValue = v3(0.75f); */ // Bias noise value to lower values as we get higher in z. // This creates a "plane" of terrain diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 01ba8bf49..16568a9a0 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1016,9 +1016,9 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br world_chunk *Chunk = &Preview->Chunk; if (ReallocChunk) { - // TODO(Jesse)(leak): Figure out exactly how this works. We can't allocate from the Editor - // memory pool because the goemetry buffers get freed to a freelist, and the editor memory - // pool gets cleared on game reload + // TODO(Jesse)(leak, stability): Figure out exactly how this works. We + // can't allocate from the Editor memory pool because the goemetry buffers + // get freed to a freelist, and the editor memory pool gets cleared on game reload // // @editor_chunk_memory_question // @@ -1084,7 +1084,7 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br generic_noise_params NoiseParams = {}; void *UserData = {}; - NoiseParams.RGBColor = HSVtoRGB(Settings->HSVColor); + NoiseParams.RGBColor = HSVtoRGB(Settings->HSVColor); switch (Noise->Type) { case NoiseType_White: @@ -2033,6 +2033,11 @@ EditWorldSelection(engine_resources *Engine) // Make ModifiedSelection permanent Editor->Selection.Region = ProposedSelection; Editor->Selection.ModState.ClickedFace = FaceIndex_None; + + if (Editor->CurrentEdit) + { + Editor->CurrentEdit->Region = ProposedSelection; + } } } } @@ -2591,6 +2596,15 @@ DoWorldEditor(engine_resources *Engine) // there's a frame of lag. DoBrushSettingsWindow(Engine, Editor->Tool, Editor->Brush.Type); + IterateOver(&Editor->WorldEdits, Edit, EditIndex) + { + auto EditAABB = GetSimSpaceAABB(World, Edit->Region); + random_series S = {u64(Edit)}; + v3 BaseColor = RandomV3Unilateral(&S); + + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, 1.f); + } + // @@ -2602,12 +2616,20 @@ DoWorldEditor(engine_resources *Engine) if (Input->Ctrl.Pressed || Input->Shift.Pressed || Input->Alt.Pressed) { Ui->RequestedForceCapture = True; } - if (Input->Ctrl.Pressed && Input->S.Clicked) { Editor->PreviousTool = Editor->Tool; Editor->Tool = WorldEdit_Tool_Select; ResetSelection(Editor); } - if (Input->Ctrl.Pressed && Input->E.Clicked) { Editor->PreviousTool = Editor->Tool; Editor->Tool = WorldEdit_Tool_Eyedropper; ResetSelectionIfIncomplete(Editor); } if (Input->Ctrl.Pressed && Input->G.Clicked) { if (entity *Ghost = GetCameraGhost(Engine)) { Ghost->P = GetSelectionCenterP(World, Editor); } } + if (Input->Ctrl.Pressed && Input->S.Clicked) + { + Editor->PreviousTool = Editor->Tool; + Editor->Tool = WorldEdit_Tool_Select; + ResetSelection(Editor); + + world_edit E = {}; + Editor->CurrentEdit = Push(&Editor->WorldEdits, &E); + } + if (Editor->Selection.Clicks == 2) { if (Input->Ctrl.Pressed && Input->D.Clicked) { ApplyEditToRegion(Engine, &SelectionAABB, {}, {}, WorldEdit_Mode_Remove, WorldEdit_Modifier_Default); } diff --git a/src/engine/editor.h b/src/engine/editor.h index 0fa437944..52dc1fcbe 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1193,6 +1193,7 @@ struct level_editor b32 MaskSelection; + world_edit *CurrentEdit; world_edit_block_array WorldEdits; }; From ecff8e46ef0824b9432e9d88c639464bf0110b42 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 16 Jan 2025 19:35:04 -0700 Subject: [PATCH 144/421] WIP --- ...mous_function_ui_render_command_RuTTrHiW.h | 4 + generated/anonymous_input_5Nt8cwGP.h | 118 +++---- generated/anonymous_input_Lwen2qoF.h | 82 ++--- generated/anonymous_input_nPw6miGy.h | 118 +++---- .../anonymous_ui_render_command_nKuoMe2B.h | 4 + generated/are_equal_bonsai_type_info.h | 16 +- generated/are_equal_brush_settings.h | 4 +- generated/are_equal_debug_profile_scope.h | 4 +- generated/are_equal_file_traversal_node.h | 16 +- generated/are_equal_memory_arena_stats.h | 4 +- generated/are_equal_octree_node.h | 6 +- generated/are_equal_perlin_noise_params.h | 4 +- generated/are_equal_rect3cp.h | 4 +- generated/are_equal_render_settings.h | 4 +- generated/are_equal_texture.h | 36 +-- generated/are_equal_ui_toggle.h | 4 +- ..._voxel_synthesis_change_propagation_info.h | 4 +- generated/are_equal_window_layout.h | 76 ++--- generated/are_equal_xml_property.h | 4 +- generated/are_equal_xml_tag.h | 4 +- generated/are_equal_xml_token.h | 4 +- .../asyncify_render_function_c_DrawLod.h | 4 +- ...yncify_render_function_c_RenderToTexture.h | 4 +- .../asyncify_render_function_h_DrawLod.h | 14 +- ...yncify_render_function_h_RenderToTexture.h | 10 +- generated/block_array_bitmap_688853862.h | 48 ++- .../block_array_c_asset_thumbnail_688856411.h | 48 ++- generated/block_array_c_gpu_timer_688735882.h | 48 ++- .../block_array_c_shader_ptr_688853971.h | 48 ++- generated/block_array_c_texture_688856411.h | 48 ++- generated/block_array_c_u32_688856411.h | 48 ++- generated/block_array_c_u8_cursor_688856411.h | 48 ++- ...k_queue_entry_build_chunk_mesh_688853862.h | 48 ++- generated/block_array_entity_688856407.h | 48 ++- generated/block_array_entity_ptr_688856411.h | 48 ++- ...lock_array_file_traversal_node_688853862.h | 48 ++- ...lock_array_gpu_readback_buffer_688853862.h | 48 ++- generated/block_array_member_info_688856411.h | 48 ++- generated/block_array_model_688856411.h | 48 ++- .../block_array_octree_node_ptr_688853862.h | 50 ++- ...block_array_picked_octree_node_688853862.h | 50 ++- .../block_array_standing_spot_688853862.h | 48 ++- generated/block_array_texture_ptr_688856411.h | 48 ++- generated/block_array_vox_data_688856411.h | 48 ++- ...lock_array_voxel_stack_element_688853862.h | 48 ++- .../block_array_world_chunk_ptr_688853862.h | 48 ++- .../block_array_world_edit_ptr_688735882.h | 299 ++++++++++++++++++ generated/buffer_octree_node_ptr.h | 77 +++++ ..._work_queue_entry__bonsai_render_command.h | 158 +++++---- .../d_union_constructors_work_queue_entry.h | 2 + generated/default_marshal_layered_brush_0.h | 2 +- generated/default_marshal_layered_brush_1.h | 4 +- generated/default_marshal_layered_brush_2.h | 2 +- generated/default_marshal_particle_system_0.h | 2 +- generated/deserialize_struct_camera_0.h | 24 +- generated/deserialize_struct_camera_1.h | 32 +- generated/deserialize_struct_entity.h | 40 +-- generated/deserialize_struct_level_header.h | 22 +- generated/deserialize_struct_level_header_0.h | 16 +- generated/deserialize_struct_level_header_1.h | 16 +- generated/deserialize_struct_level_header_2.h | 16 +- generated/deserialize_struct_level_header_3.h | 16 +- .../deserialize_struct_render_settings_1.h | 38 +-- ...itor_ui_for_compound_type_brush_settings.h | 44 +-- ...do_editor_ui_for_compound_type_maybe_ray.h | 8 +- ...ui_for_compound_type_perlin_noise_params.h | 22 +- .../do_editor_ui_for_compound_type_ray.h | 8 +- .../do_editor_ui_for_compound_type_rect3.h | 8 +- .../do_editor_ui_for_compound_type_rect3cp.h | 8 +- .../do_editor_ui_for_compound_type_rect3i.h | 8 +- ..._editor_ui_for_compound_type_shape_layer.h | 12 +- ...i_for_compound_type_voronoi_noise_params.h | 34 +- ..._ui_for_compound_type_white_noise_params.h | 8 +- ...or_ui_for_compound_type_world_edit_brush.h | 12 +- ...d_type_world_update_op_shape_params_rect.h | 13 +- ...type_world_update_op_shape_params_sphere.h | 10 +- generated/do_editor_ui_for_enum_data_type.h | 8 +- generated/do_editor_ui_for_enum_maybe_tag.h | 6 +- generated/do_editor_ui_for_enum_shape_type.h | 8 +- .../do_editor_ui_for_enum_ui_noise_type.h | 8 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...editor_ui_for_radio_enum_world_edit_mode.h | 2 +- ..._for_radio_enum_world_edit_mode_modifier.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 32 +- generated/for_datatypes_0XxWqGSZ.h | 5 +- generated/for_datatypes_fkubhsYl.h | 3 +- generated/for_datatypes_kv3WBTai.h | 3 +- generated/freelist_allocator_octree_node.h | 2 +- generated/freelist_allocator_world_chunk.h | 2 +- generated/gen_common_vector_v2.h | 18 +- generated/gen_common_vector_v3.h | 18 +- generated/gen_common_vector_v3i.h | 18 +- .../gen_constructor_gpu_readback_buffer.h | 8 +- generated/gen_constructor_perlin_params.h | 14 +- generated/gen_constructor_vertex_material.h | 10 +- generated/gen_constructor_voxel_lighting.h | 6 +- .../gen_constructor_voxel_stack_element.h | 8 +- ..._voxel_synthesis_change_propagation_info.h | 10 +- ...n_default_equality_operator_tile_rule_id.h | 2 +- .../gen_default_equality_operator_ui_id.h | 2 +- .../gen_hetero_vector_operators_v2_v2i.h | 8 +- .../gen_hetero_vector_operators_v2i_v2.h | 8 +- .../gen_hetero_vector_operators_v3_u8_v3.h | 8 +- .../gen_hetero_vector_operators_v3_u8_v3i.h | 8 +- .../gen_hetero_vector_operators_v3_v3i.h | 8 +- .../gen_hetero_vector_operators_v3i_v3.h | 8 +- generated/gen_vector_area_v2.h | 2 +- generated/gen_vector_area_v2i.h | 2 +- .../gen_vector_infix_operator_v3i_688856393.h | 2 +- .../gen_vector_infix_operator_v3i_688856449.h | 2 +- generated/gen_vector_operators_v2.h | 50 +-- generated/gen_vector_operators_v2i.h | 50 +-- generated/gen_vector_operators_v3.h | 50 +-- generated/gen_vector_operators_v3_u8.h | 50 +-- generated/gen_vector_operators_v3i.h | 50 +-- generated/gen_vector_operators_v4.h | 50 +-- generated/generate_cursor_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- generated/generate_string_table_Chunk_ID.h | 4 +- .../generate_string_table_asset_load_state.h | 4 +- .../generate_string_table_c_token_type.h | 4 +- ...erate_string_table_entity_behavior_flags.h | 8 +- .../generate_string_table_entity_state.h | 4 +- .../generate_string_table_parse_error_code.h | 4 +- .../generate_string_table_text_encoding.h | 4 +- ...enerate_string_table_token_cursor_source.h | 4 +- ...e_string_table_world_chunk_mesh_bitfield.h | 4 +- ...rate_string_table_world_chunk_mesh_index.h | 4 +- ..._work_queue_entry__bonsai_render_command.h | 84 ++--- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- generated/serdes_primitive_85387614.h | 1 + generated/serdes_struct_bonsai_type_info.h | 16 +- .../serdes_struct_bonsai_type_info_buffer.h | 25 +- generated/serdes_struct_brush_layer.h | 8 +- generated/serdes_struct_brush_settings.h | 54 ++-- generated/serdes_struct_brush_settings_0.h | 36 +-- generated/serdes_struct_brush_settings_1.h | 40 +-- generated/serdes_struct_brush_settings_2.h | 44 +-- generated/serdes_struct_camera.h | 62 ++-- generated/serdes_struct_canonical_position.h | 12 +- generated/serdes_struct_entity_0.h | 62 ++-- generated/serdes_struct_entity_1.h | 66 ++-- generated/serdes_struct_entity_id.h | 12 +- generated/serdes_struct_file_traversal_node.h | 16 +- generated/serdes_struct_frustum.h | 36 +-- generated/serdes_struct_keyframe.h | 12 +- generated/serdes_struct_layered_brush.h | 42 +-- generated/serdes_struct_layered_brush_0.h | 16 +- generated/serdes_struct_layered_brush_1.h | 32 +- generated/serdes_struct_layered_brush_2.h | 24 +- generated/serdes_struct_lighting_settings.h | 62 ++-- generated/serdes_struct_lighting_settings_0.h | 52 +-- generated/serdes_struct_model.h | 20 +- generated/serdes_struct_noise_layer.h | 30 +- generated/serdes_struct_noise_layer_0.h | 16 +- generated/serdes_struct_particle_system.h | 106 +++---- generated/serdes_struct_particle_system_0.h | 96 +++--- generated/serdes_struct_perlin_noise_params.h | 16 +- generated/serdes_struct_physics.h | 24 +- generated/serdes_struct_plane.h | 16 +- generated/serdes_struct_random_series.h | 21 +- generated/serdes_struct_rect3.h | 12 +- generated/serdes_struct_rect3cp.h | 100 ++++++ generated/serdes_struct_rect3i.h | 12 +- generated/serdes_struct_render_settings.h | 98 +++--- generated/serdes_struct_shape_layer.h | 16 +- generated/serdes_struct_vertex_material.h | 16 +- .../serdes_struct_voronoi_noise_params.h | 24 +- generated/serdes_struct_vox_data.h | 29 +- generated/serdes_struct_voxel.h | 12 +- generated/serdes_struct_voxel_lighting.h | 21 +- generated/serdes_struct_white_noise_params.h | 21 +- generated/serdes_struct_world_chunk.h | 76 ++--- generated/serdes_struct_world_chunk_0.h | 32 +- ...struct_world_update_op_shape_params_rect.h | 21 +- ...ruct_world_update_op_shape_params_sphere.h | 12 +- generated/serialize_struct_entity.h | 36 +-- generated/serialize_struct_level_header.h | 20 +- .../serialize_struct_render_settings_0.h | 26 +- .../shader_magic_bloom_downsample_shader.h | 16 +- .../shader_magic_bloom_upsample_shader.h | 16 +- generated/shader_magic_shadow_map_shader.h | 28 +- generated/shader_magic_terrain_shader.h | 26 +- ...and_value_tables_bitmap_compression_type.h | 6 +- .../string_and_value_tables_chunk_flag.h | 10 +- generated/string_and_value_tables_data_type.h | 6 +- ...nd_value_tables_lighting_quality_setting.h | 6 +- generated/string_and_value_tables_log_level.h | 6 +- generated/string_and_value_tables_maybe_tag.h | 6 +- .../string_and_value_tables_model_index.h | 6 +- ...ring_and_value_tables_resolution_setting.h | 6 +- ...and_value_tables_shader_language_setting.h | 6 +- ..._and_value_tables_shadow_quality_setting.h | 6 +- .../string_and_value_tables_shape_type.h | 6 +- ..._and_value_tables_texture_storage_format.h | 6 +- .../string_and_value_tables_ui_noise_type.h | 6 +- .../string_and_value_tables_world_edit_mode.h | 6 +- ...nd_value_tables_world_edit_mode_modifier.h | 6 +- ...d_value_tables_world_edit_selection_mode.h | 6 +- ..._value_tables_world_update_op_shape_type.h | 6 +- generated/string_concat_10.h | 6 +- generated/string_concat_2.h | 6 +- generated/string_concat_3.h | 6 +- generated/string_concat_4.h | 6 +- generated/string_concat_5.h | 6 +- generated/string_concat_6.h | 6 +- generated/string_concat_7.h | 6 +- generated/string_concat_8.h | 6 +- generated/string_concat_9.h | 6 +- generated/to_string_texture.h | 14 +- generated/to_string_vector_240271411.h | 4 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- generated/tuple_822959015.h | 6 +- jesse.bonsai.rdbg | Bin 15230 -> 15259 bytes src/engine/canonical_position.h | 13 +- src/engine/editor.cpp | 59 +++- src/engine/editor.h | 8 +- src/engine/entity.cpp | 10 + src/engine/entity.h | 1 + src/engine/work_queue.h | 6 +- src/engine/world.cpp | 94 +++++- src/engine/world.h | 13 +- src/engine/world_chunk.h | 4 +- 227 files changed, 3441 insertions(+), 1918 deletions(-) create mode 100644 generated/block_array_world_edit_ptr_688735882.h create mode 100644 generated/buffer_octree_node_ptr.h create mode 100644 generated/serdes_struct_rect3cp.h diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index dd78de6d6..b3cb0d1fe 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -42,3 +42,7 @@ case type_ui_render_command_untextured_quad_at: Result.Min = Min(Result.Min, GetAbsoluteDrawBoundsMin(&Command->ui_render_command_untextured_quad_at.Layout)); } break; + + + + diff --git a/generated/anonymous_input_5Nt8cwGP.h b/generated/anonymous_input_5Nt8cwGP.h index 7cad4234c..3743b3e31 100644 --- a/generated/anonymous_input_5Nt8cwGP.h +++ b/generated/anonymous_input_5Nt8cwGP.h @@ -1,122 +1,122 @@ // external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:410:0 -BindKeyupToInput(VK_RETURN, Enter); +BindKeyupToInput( VK_RETURN, Enter); -BindKeyupToInput(VK_ESCAPE, Escape); +BindKeyupToInput( VK_ESCAPE, Escape); -BindKeyupToInput(VK_MENU, Alt); +BindKeyupToInput( VK_MENU, Alt); -BindKeyupToInput(VK_CONTROL, Ctrl); +BindKeyupToInput( VK_CONTROL, Ctrl); -BindKeyupToInput(VK_SHIFT, Shift); +BindKeyupToInput( VK_SHIFT, Shift); -BindKeyupToInput(VK_BACK, Backspace); +BindKeyupToInput( VK_BACK, Backspace); -BindKeyupToInput(VK_DELETE, Delete); +BindKeyupToInput( VK_DELETE, Delete); -BindKeyupToInput(VK_F12, F12); +BindKeyupToInput( VK_F12, F12); -BindKeyupToInput(VK_F11, F11); +BindKeyupToInput( VK_F11, F11); -BindKeyupToInput(VK_F10, F10); +BindKeyupToInput( VK_F10, F10); -BindKeyupToInput(VK_F9, F9); +BindKeyupToInput( VK_F9, F9); -BindKeyupToInput(VK_F8, F8); +BindKeyupToInput( VK_F8, F8); -BindKeyupToInput(VK_F7, F7); +BindKeyupToInput( VK_F7, F7); -BindKeyupToInput(VK_F6, F6); +BindKeyupToInput( VK_F6, F6); -BindKeyupToInput(VK_F5, F5); +BindKeyupToInput( VK_F5, F5); -BindKeyupToInput(VK_F4, F4); +BindKeyupToInput( VK_F4, F4); -BindKeyupToInput(VK_F3, F3); +BindKeyupToInput( VK_F3, F3); -BindKeyupToInput(VK_F2, F2); +BindKeyupToInput( VK_F2, F2); -BindKeyupToInput(VK_F1, F1); +BindKeyupToInput( VK_F1, F1); -BindKeyupToInput(VK_OEM_PERIOD, Dot); +BindKeyupToInput( VK_OEM_PERIOD, Dot); -BindKeyupToInput(VK_OEM_MINUS, Minus); +BindKeyupToInput( VK_OEM_MINUS, Minus); -BindKeyupToInput(VK_OEM_2, FSlash); +BindKeyupToInput( VK_OEM_2, FSlash); -BindKeyupToInput(VK_SPACE, Space); +BindKeyupToInput( VK_SPACE, Space); -BindKeyupToInput(0x30, N0); +BindKeyupToInput( 0x30, N0); -BindKeyupToInput(0x31, N1); +BindKeyupToInput( 0x31, N1); -BindKeyupToInput(0x32, N2); +BindKeyupToInput( 0x32, N2); -BindKeyupToInput(0x33, N3); +BindKeyupToInput( 0x33, N3); -BindKeyupToInput(0x34, N4); +BindKeyupToInput( 0x34, N4); -BindKeyupToInput(0x35, N5); +BindKeyupToInput( 0x35, N5); -BindKeyupToInput(0x36, N6); +BindKeyupToInput( 0x36, N6); -BindKeyupToInput(0x37, N7); +BindKeyupToInput( 0x37, N7); -BindKeyupToInput(0x38, N8); +BindKeyupToInput( 0x38, N8); -BindKeyupToInput(0x39, N9); +BindKeyupToInput( 0x39, N9); -BindKeyupToInput(0x41, A); +BindKeyupToInput( 0x41, A); -BindKeyupToInput(0x42, B); +BindKeyupToInput( 0x42, B); -BindKeyupToInput(0x43, C); +BindKeyupToInput( 0x43, C); -BindKeyupToInput(0x44, D); +BindKeyupToInput( 0x44, D); -BindKeyupToInput(0x45, E); +BindKeyupToInput( 0x45, E); -BindKeyupToInput(0x46, F); +BindKeyupToInput( 0x46, F); -BindKeyupToInput(0x47, G); +BindKeyupToInput( 0x47, G); -BindKeyupToInput(0x48, H); +BindKeyupToInput( 0x48, H); -BindKeyupToInput(0x49, I); +BindKeyupToInput( 0x49, I); -BindKeyupToInput(0x4A, J); +BindKeyupToInput( 0x4A, J); -BindKeyupToInput(0x4B, K); +BindKeyupToInput( 0x4B, K); -BindKeyupToInput(0x4C, L); +BindKeyupToInput( 0x4C, L); -BindKeyupToInput(0x4D, M); +BindKeyupToInput( 0x4D, M); -BindKeyupToInput(0x4E, N); +BindKeyupToInput( 0x4E, N); -BindKeyupToInput(0x4F, O); +BindKeyupToInput( 0x4F, O); -BindKeyupToInput(0x50, P); +BindKeyupToInput( 0x50, P); -BindKeyupToInput(0x51, Q); +BindKeyupToInput( 0x51, Q); -BindKeyupToInput(0x52, R); +BindKeyupToInput( 0x52, R); -BindKeyupToInput(0x53, S); +BindKeyupToInput( 0x53, S); -BindKeyupToInput(0x54, T); +BindKeyupToInput( 0x54, T); -BindKeyupToInput(0x55, U); +BindKeyupToInput( 0x55, U); -BindKeyupToInput(0x56, V); +BindKeyupToInput( 0x56, V); -BindKeyupToInput(0x57, W); +BindKeyupToInput( 0x57, W); -BindKeyupToInput(0x58, X); +BindKeyupToInput( 0x58, X); -BindKeyupToInput(0x59, Y); +BindKeyupToInput( 0x59, Y); -BindKeyupToInput(0x5A, Z); +BindKeyupToInput( 0x5A, Z); diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 7806137b2..67c3681e0 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -8,7 +8,7 @@ if (Input->Dot.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='.'; + Cast(char*, Text.Start)[Text.Count] = '.'; } Text.Count++; } @@ -21,7 +21,7 @@ if (Input->Minus.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='-'; + Cast(char*, Text.Start)[Text.Count] = '-'; } Text.Count++; } @@ -34,7 +34,7 @@ if (Input->FSlash.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='/'; + Cast(char*, Text.Start)[Text.Count] = '/'; } Text.Count++; } @@ -47,7 +47,7 @@ if (Input->Space.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] =' '; + Cast(char*, Text.Start)[Text.Count] = ' '; } Text.Count++; } @@ -60,7 +60,7 @@ if (Input->Underscore.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='_'; + Cast(char*, Text.Start)[Text.Count] = '_'; } Text.Count++; } @@ -73,7 +73,7 @@ if (Input->N0.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='0'; + Cast(char*, Text.Start)[Text.Count] = '0'; } Text.Count++; } @@ -86,7 +86,7 @@ if (Input->N1.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='1'; + Cast(char*, Text.Start)[Text.Count] = '1'; } Text.Count++; } @@ -99,7 +99,7 @@ if (Input->N2.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='2'; + Cast(char*, Text.Start)[Text.Count] = '2'; } Text.Count++; } @@ -112,7 +112,7 @@ if (Input->N3.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='3'; + Cast(char*, Text.Start)[Text.Count] = '3'; } Text.Count++; } @@ -125,7 +125,7 @@ if (Input->N4.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='4'; + Cast(char*, Text.Start)[Text.Count] = '4'; } Text.Count++; } @@ -138,7 +138,7 @@ if (Input->N5.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='5'; + Cast(char*, Text.Start)[Text.Count] = '5'; } Text.Count++; } @@ -151,7 +151,7 @@ if (Input->N6.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='6'; + Cast(char*, Text.Start)[Text.Count] = '6'; } Text.Count++; } @@ -164,7 +164,7 @@ if (Input->N7.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='7'; + Cast(char*, Text.Start)[Text.Count] = '7'; } Text.Count++; } @@ -177,7 +177,7 @@ if (Input->N8.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='8'; + Cast(char*, Text.Start)[Text.Count] = '8'; } Text.Count++; } @@ -190,7 +190,7 @@ if (Input->N9.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='9'; + Cast(char*, Text.Start)[Text.Count] = '9'; } Text.Count++; } @@ -203,7 +203,7 @@ if (Input->A.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='a'; + Cast(char*, Text.Start)[Text.Count] = 'a'; } Text.Count++; } @@ -216,7 +216,7 @@ if (Input->B.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='b'; + Cast(char*, Text.Start)[Text.Count] = 'b'; } Text.Count++; } @@ -229,7 +229,7 @@ if (Input->C.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='c'; + Cast(char*, Text.Start)[Text.Count] = 'c'; } Text.Count++; } @@ -242,7 +242,7 @@ if (Input->D.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='d'; + Cast(char*, Text.Start)[Text.Count] = 'd'; } Text.Count++; } @@ -255,7 +255,7 @@ if (Input->E.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='e'; + Cast(char*, Text.Start)[Text.Count] = 'e'; } Text.Count++; } @@ -268,7 +268,7 @@ if (Input->F.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='f'; + Cast(char*, Text.Start)[Text.Count] = 'f'; } Text.Count++; } @@ -281,7 +281,7 @@ if (Input->G.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='g'; + Cast(char*, Text.Start)[Text.Count] = 'g'; } Text.Count++; } @@ -294,7 +294,7 @@ if (Input->H.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='h'; + Cast(char*, Text.Start)[Text.Count] = 'h'; } Text.Count++; } @@ -307,7 +307,7 @@ if (Input->I.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='i'; + Cast(char*, Text.Start)[Text.Count] = 'i'; } Text.Count++; } @@ -320,7 +320,7 @@ if (Input->J.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='j'; + Cast(char*, Text.Start)[Text.Count] = 'j'; } Text.Count++; } @@ -333,7 +333,7 @@ if (Input->K.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='k'; + Cast(char*, Text.Start)[Text.Count] = 'k'; } Text.Count++; } @@ -346,7 +346,7 @@ if (Input->L.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='l'; + Cast(char*, Text.Start)[Text.Count] = 'l'; } Text.Count++; } @@ -359,7 +359,7 @@ if (Input->M.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='m'; + Cast(char*, Text.Start)[Text.Count] = 'm'; } Text.Count++; } @@ -372,7 +372,7 @@ if (Input->N.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='n'; + Cast(char*, Text.Start)[Text.Count] = 'n'; } Text.Count++; } @@ -385,7 +385,7 @@ if (Input->O.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='o'; + Cast(char*, Text.Start)[Text.Count] = 'o'; } Text.Count++; } @@ -398,7 +398,7 @@ if (Input->P.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='p'; + Cast(char*, Text.Start)[Text.Count] = 'p'; } Text.Count++; } @@ -411,7 +411,7 @@ if (Input->Q.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='q'; + Cast(char*, Text.Start)[Text.Count] = 'q'; } Text.Count++; } @@ -424,7 +424,7 @@ if (Input->R.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='r'; + Cast(char*, Text.Start)[Text.Count] = 'r'; } Text.Count++; } @@ -437,7 +437,7 @@ if (Input->S.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='s'; + Cast(char*, Text.Start)[Text.Count] = 's'; } Text.Count++; } @@ -450,7 +450,7 @@ if (Input->T.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='t'; + Cast(char*, Text.Start)[Text.Count] = 't'; } Text.Count++; } @@ -463,7 +463,7 @@ if (Input->U.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='u'; + Cast(char*, Text.Start)[Text.Count] = 'u'; } Text.Count++; } @@ -476,7 +476,7 @@ if (Input->V.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='v'; + Cast(char*, Text.Start)[Text.Count] = 'v'; } Text.Count++; } @@ -489,7 +489,7 @@ if (Input->W.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='w'; + Cast(char*, Text.Start)[Text.Count] = 'w'; } Text.Count++; } @@ -502,7 +502,7 @@ if (Input->X.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='x'; + Cast(char*, Text.Start)[Text.Count] = 'x'; } Text.Count++; } @@ -515,7 +515,7 @@ if (Input->Y.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='y'; + Cast(char*, Text.Start)[Text.Count] = 'y'; } Text.Count++; } @@ -528,7 +528,7 @@ if (Input->Z.Clicked) } else { - Cast(char*, Text.Start)[Text.Count] ='z'; + Cast(char*, Text.Start)[Text.Count] = 'z'; } Text.Count++; } diff --git a/generated/anonymous_input_nPw6miGy.h b/generated/anonymous_input_nPw6miGy.h index ad178c02a..6b6a7c94d 100644 --- a/generated/anonymous_input_nPw6miGy.h +++ b/generated/anonymous_input_nPw6miGy.h @@ -1,122 +1,122 @@ // external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:438:0 -BindKeydownToInput(VK_RETURN, Enter); +BindKeydownToInput( VK_RETURN, Enter); -BindKeydownToInput(VK_ESCAPE, Escape); +BindKeydownToInput( VK_ESCAPE, Escape); -BindKeydownToInput(VK_MENU, Alt); +BindKeydownToInput( VK_MENU, Alt); -BindKeydownToInput(VK_CONTROL, Ctrl); +BindKeydownToInput( VK_CONTROL, Ctrl); -BindKeydownToInput(VK_SHIFT, Shift); +BindKeydownToInput( VK_SHIFT, Shift); -BindKeydownToInput(VK_BACK, Backspace); +BindKeydownToInput( VK_BACK, Backspace); -BindKeydownToInput(VK_DELETE, Delete); +BindKeydownToInput( VK_DELETE, Delete); -BindKeydownToInput(VK_F12, F12); +BindKeydownToInput( VK_F12, F12); -BindKeydownToInput(VK_F11, F11); +BindKeydownToInput( VK_F11, F11); -BindKeydownToInput(VK_F10, F10); +BindKeydownToInput( VK_F10, F10); -BindKeydownToInput(VK_F9, F9); +BindKeydownToInput( VK_F9, F9); -BindKeydownToInput(VK_F8, F8); +BindKeydownToInput( VK_F8, F8); -BindKeydownToInput(VK_F7, F7); +BindKeydownToInput( VK_F7, F7); -BindKeydownToInput(VK_F6, F6); +BindKeydownToInput( VK_F6, F6); -BindKeydownToInput(VK_F5, F5); +BindKeydownToInput( VK_F5, F5); -BindKeydownToInput(VK_F4, F4); +BindKeydownToInput( VK_F4, F4); -BindKeydownToInput(VK_F3, F3); +BindKeydownToInput( VK_F3, F3); -BindKeydownToInput(VK_F2, F2); +BindKeydownToInput( VK_F2, F2); -BindKeydownToInput(VK_F1, F1); +BindKeydownToInput( VK_F1, F1); -BindKeydownToInput(VK_OEM_PERIOD, Dot); +BindKeydownToInput( VK_OEM_PERIOD, Dot); -BindKeydownToInput(VK_OEM_MINUS, Minus); +BindKeydownToInput( VK_OEM_MINUS, Minus); -BindKeydownToInput(VK_OEM_2, FSlash); +BindKeydownToInput( VK_OEM_2, FSlash); -BindKeydownToInput(VK_SPACE, Space); +BindKeydownToInput( VK_SPACE, Space); -BindKeydownToInput(0x30, N0); +BindKeydownToInput( 0x30, N0); -BindKeydownToInput(0x31, N1); +BindKeydownToInput( 0x31, N1); -BindKeydownToInput(0x32, N2); +BindKeydownToInput( 0x32, N2); -BindKeydownToInput(0x33, N3); +BindKeydownToInput( 0x33, N3); -BindKeydownToInput(0x34, N4); +BindKeydownToInput( 0x34, N4); -BindKeydownToInput(0x35, N5); +BindKeydownToInput( 0x35, N5); -BindKeydownToInput(0x36, N6); +BindKeydownToInput( 0x36, N6); -BindKeydownToInput(0x37, N7); +BindKeydownToInput( 0x37, N7); -BindKeydownToInput(0x38, N8); +BindKeydownToInput( 0x38, N8); -BindKeydownToInput(0x39, N9); +BindKeydownToInput( 0x39, N9); -BindKeydownToInput(0x41, A); +BindKeydownToInput( 0x41, A); -BindKeydownToInput(0x42, B); +BindKeydownToInput( 0x42, B); -BindKeydownToInput(0x43, C); +BindKeydownToInput( 0x43, C); -BindKeydownToInput(0x44, D); +BindKeydownToInput( 0x44, D); -BindKeydownToInput(0x45, E); +BindKeydownToInput( 0x45, E); -BindKeydownToInput(0x46, F); +BindKeydownToInput( 0x46, F); -BindKeydownToInput(0x47, G); +BindKeydownToInput( 0x47, G); -BindKeydownToInput(0x48, H); +BindKeydownToInput( 0x48, H); -BindKeydownToInput(0x49, I); +BindKeydownToInput( 0x49, I); -BindKeydownToInput(0x4A, J); +BindKeydownToInput( 0x4A, J); -BindKeydownToInput(0x4B, K); +BindKeydownToInput( 0x4B, K); -BindKeydownToInput(0x4C, L); +BindKeydownToInput( 0x4C, L); -BindKeydownToInput(0x4D, M); +BindKeydownToInput( 0x4D, M); -BindKeydownToInput(0x4E, N); +BindKeydownToInput( 0x4E, N); -BindKeydownToInput(0x4F, O); +BindKeydownToInput( 0x4F, O); -BindKeydownToInput(0x50, P); +BindKeydownToInput( 0x50, P); -BindKeydownToInput(0x51, Q); +BindKeydownToInput( 0x51, Q); -BindKeydownToInput(0x52, R); +BindKeydownToInput( 0x52, R); -BindKeydownToInput(0x53, S); +BindKeydownToInput( 0x53, S); -BindKeydownToInput(0x54, T); +BindKeydownToInput( 0x54, T); -BindKeydownToInput(0x55, U); +BindKeydownToInput( 0x55, U); -BindKeydownToInput(0x56, V); +BindKeydownToInput( 0x56, V); -BindKeydownToInput(0x57, W); +BindKeydownToInput( 0x57, W); -BindKeydownToInput(0x58, X); +BindKeydownToInput( 0x58, X); -BindKeydownToInput(0x59, Y); +BindKeydownToInput( 0x59, Y); -BindKeydownToInput(0x5A, Z); +BindKeydownToInput( 0x5A, Z); diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index aed826427..086f3bdf6 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -42,3 +42,7 @@ case type_ui_render_command_untextured_quad_at: Command->ui_render_command_untextured_quad_at.Layout.DrawBounds = InvertedInfinityRectangle(); } break; + + + + diff --git a/generated/are_equal_bonsai_type_info.h b/generated/are_equal_bonsai_type_info.h index 098253ffc..8e5948f58 100644 --- a/generated/are_equal_bonsai_type_info.h +++ b/generated/are_equal_bonsai_type_info.h @@ -5,12 +5,12 @@ AreEqual(bonsai_type_info *Thing1, bonsai_type_info *Thing2) { if (Thing1 && Thing2) { - b32 Result = True; - Result &= AreEqual(Thing1->Name, Thing2->Name); + b32 Result = True; + Result &= AreEqual(Thing1->Name, Thing2->Name); - Result &= AreEqual(Thing1->Version, Thing2->Version); + Result &= AreEqual(Thing1->Version, Thing2->Version); - Result &= AreEqual(Thing1->SizeOfInBytes, Thing2->SizeOfInBytes); + Result &= AreEqual(Thing1->SizeOfInBytes, Thing2->SizeOfInBytes); return Result; } @@ -23,12 +23,12 @@ AreEqual(bonsai_type_info *Thing1, bonsai_type_info *Thing2) link_internal b32 AreEqual(bonsai_type_info Thing1, bonsai_type_info Thing2) { - b32 Result = True; - Result &= AreEqual(Thing1.Name, Thing2.Name); + b32 Result = True; + Result &= AreEqual(Thing1.Name, Thing2.Name); - Result &= AreEqual(Thing1.Version, Thing2.Version); + Result &= AreEqual(Thing1.Version, Thing2.Version); - Result &= AreEqual(Thing1.SizeOfInBytes, Thing2.SizeOfInBytes); + Result &= AreEqual(Thing1.SizeOfInBytes, Thing2.SizeOfInBytes); return Result; } diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 73771d7af..60ecaba22 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -5,7 +5,7 @@ AreEqual(brush_settings *Thing1, brush_settings *Thing2) { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( brush_settings ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( brush_settings ) ); return Result; } @@ -18,7 +18,7 @@ AreEqual(brush_settings *Thing1, brush_settings *Thing2) link_internal b32 AreEqual(brush_settings Thing1, brush_settings Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( brush_settings ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( brush_settings ) ); return Result; } diff --git a/generated/are_equal_debug_profile_scope.h b/generated/are_equal_debug_profile_scope.h index 92628aad0..77253a0b9 100644 --- a/generated/are_equal_debug_profile_scope.h +++ b/generated/are_equal_debug_profile_scope.h @@ -5,7 +5,7 @@ AreEqual(debug_profile_scope *Thing1, debug_profile_scope *Thing2) { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( debug_profile_scope ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( debug_profile_scope ) ); return Result; } @@ -18,7 +18,7 @@ AreEqual(debug_profile_scope *Thing1, debug_profile_scope *Thing2) link_internal b32 AreEqual(debug_profile_scope Thing1, debug_profile_scope Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( debug_profile_scope ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( debug_profile_scope ) ); return Result; } diff --git a/generated/are_equal_file_traversal_node.h b/generated/are_equal_file_traversal_node.h index 638c9ad59..fe3fa42c4 100644 --- a/generated/are_equal_file_traversal_node.h +++ b/generated/are_equal_file_traversal_node.h @@ -5,12 +5,12 @@ AreEqual(file_traversal_node *Thing1, file_traversal_node *Thing2) { if (Thing1 && Thing2) { - b32 Result = True; - Result &= AreEqual(Thing1->Type, Thing2->Type); + b32 Result = True; + Result &= AreEqual(Thing1->Type, Thing2->Type); - Result &= AreEqual(Thing1->Dir, Thing2->Dir); + Result &= AreEqual(Thing1->Dir, Thing2->Dir); - Result &= AreEqual(Thing1->Name, Thing2->Name); + Result &= AreEqual(Thing1->Name, Thing2->Name); return Result; } @@ -23,12 +23,12 @@ AreEqual(file_traversal_node *Thing1, file_traversal_node *Thing2) link_internal b32 AreEqual(file_traversal_node Thing1, file_traversal_node Thing2) { - b32 Result = True; - Result &= AreEqual(Thing1.Type, Thing2.Type); + b32 Result = True; + Result &= AreEqual(Thing1.Type, Thing2.Type); - Result &= AreEqual(Thing1.Dir, Thing2.Dir); + Result &= AreEqual(Thing1.Dir, Thing2.Dir); - Result &= AreEqual(Thing1.Name, Thing2.Name); + Result &= AreEqual(Thing1.Name, Thing2.Name); return Result; } diff --git a/generated/are_equal_memory_arena_stats.h b/generated/are_equal_memory_arena_stats.h index 76556089a..f1cabfc23 100644 --- a/generated/are_equal_memory_arena_stats.h +++ b/generated/are_equal_memory_arena_stats.h @@ -5,7 +5,7 @@ AreEqual(memory_arena_stats *Thing1, memory_arena_stats *Thing2) { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( memory_arena_stats ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( memory_arena_stats ) ); return Result; } @@ -18,7 +18,7 @@ AreEqual(memory_arena_stats *Thing1, memory_arena_stats *Thing2) link_internal b32 AreEqual(memory_arena_stats Thing1, memory_arena_stats Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( memory_arena_stats ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( memory_arena_stats ) ); return Result; } diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index 97990a794..28267b749 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,11 +1,11 @@ -// src/engine/world.h:39:0 +// src/engine/world.h:43:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( octree_node ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( octree_node ) ); return Result; } @@ -18,7 +18,7 @@ AreEqual(octree_node *Thing1, octree_node *Thing2) link_internal b32 AreEqual(octree_node Thing1, octree_node Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( octree_node ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( octree_node ) ); return Result; } diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index d79ae0835..f136ed07a 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -5,7 +5,7 @@ AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( perlin_noise_params ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( perlin_noise_params ) ); return Result; } @@ -18,7 +18,7 @@ AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) link_internal b32 AreEqual(perlin_noise_params Thing1, perlin_noise_params Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( perlin_noise_params ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( perlin_noise_params ) ); return Result; } diff --git a/generated/are_equal_rect3cp.h b/generated/are_equal_rect3cp.h index d9566f96b..3bd225aba 100644 --- a/generated/are_equal_rect3cp.h +++ b/generated/are_equal_rect3cp.h @@ -5,7 +5,7 @@ AreEqual(rect3cp *Thing1, rect3cp *Thing2) { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( rect3cp ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( rect3cp ) ); return Result; } @@ -18,7 +18,7 @@ AreEqual(rect3cp *Thing1, rect3cp *Thing2) link_internal b32 AreEqual(rect3cp Thing1, rect3cp Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( rect3cp ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( rect3cp ) ); return Result; } diff --git a/generated/are_equal_render_settings.h b/generated/are_equal_render_settings.h index cc8634405..b8f89c4b2 100644 --- a/generated/are_equal_render_settings.h +++ b/generated/are_equal_render_settings.h @@ -5,7 +5,7 @@ AreEqual(render_settings *Thing1, render_settings *Thing2) { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( render_settings ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( render_settings ) ); return Result; } @@ -18,7 +18,7 @@ AreEqual(render_settings *Thing1, render_settings *Thing2) link_internal b32 AreEqual(render_settings Thing1, render_settings Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( render_settings ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( render_settings ) ); return Result; } diff --git a/generated/are_equal_texture.h b/generated/are_equal_texture.h index 1206bafbc..b6f323ebf 100644 --- a/generated/are_equal_texture.h +++ b/generated/are_equal_texture.h @@ -5,22 +5,22 @@ AreEqual(texture *Thing1, texture *Thing2) { if (Thing1 && Thing2) { - b32 Result = True; - Result &= AreEqual(Thing1->ID, Thing2->ID); + b32 Result = True; + Result &= AreEqual(Thing1->ID, Thing2->ID); - Result &= AreEqual(Thing1->Dim, Thing2->Dim); + Result &= AreEqual(Thing1->Dim, Thing2->Dim); - Result &= AreEqual(Thing1->Slices, Thing2->Slices); + Result &= AreEqual(Thing1->Slices, Thing2->Slices); - Result &= AreEqual(Thing1->Channels, Thing2->Channels); + Result &= AreEqual(Thing1->Channels, Thing2->Channels); - Result &= AreEqual(Thing1->IsDepthTexture, Thing2->IsDepthTexture); + Result &= AreEqual(Thing1->IsDepthTexture, Thing2->IsDepthTexture); - Result &= AreEqual(Thing1->Format, Thing2->Format); + Result &= AreEqual(Thing1->Format, Thing2->Format); - Result &= AreEqual(Thing1->DebugName, Thing2->DebugName); + Result &= AreEqual(Thing1->DebugName, Thing2->DebugName); - Result &= AreEqual(Thing1->Queued, Thing2->Queued); + Result &= AreEqual(Thing1->Queued, Thing2->Queued); return Result; } @@ -33,22 +33,22 @@ AreEqual(texture *Thing1, texture *Thing2) link_internal b32 AreEqual(texture Thing1, texture Thing2) { - b32 Result = True; - Result &= AreEqual(Thing1.ID, Thing2.ID); + b32 Result = True; + Result &= AreEqual(Thing1.ID, Thing2.ID); - Result &= AreEqual(Thing1.Dim, Thing2.Dim); + Result &= AreEqual(Thing1.Dim, Thing2.Dim); - Result &= AreEqual(Thing1.Slices, Thing2.Slices); + Result &= AreEqual(Thing1.Slices, Thing2.Slices); - Result &= AreEqual(Thing1.Channels, Thing2.Channels); + Result &= AreEqual(Thing1.Channels, Thing2.Channels); - Result &= AreEqual(Thing1.IsDepthTexture, Thing2.IsDepthTexture); + Result &= AreEqual(Thing1.IsDepthTexture, Thing2.IsDepthTexture); - Result &= AreEqual(Thing1.Format, Thing2.Format); + Result &= AreEqual(Thing1.Format, Thing2.Format); - Result &= AreEqual(Thing1.DebugName, Thing2.DebugName); + Result &= AreEqual(Thing1.DebugName, Thing2.DebugName); - Result &= AreEqual(Thing1.Queued, Thing2.Queued); + Result &= AreEqual(Thing1.Queued, Thing2.Queued); return Result; } diff --git a/generated/are_equal_ui_toggle.h b/generated/are_equal_ui_toggle.h index 8bc906cdc..dee15f4e4 100644 --- a/generated/are_equal_ui_toggle.h +++ b/generated/are_equal_ui_toggle.h @@ -5,7 +5,7 @@ AreEqual(ui_toggle *Thing1, ui_toggle *Thing2) { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( ui_toggle ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( ui_toggle ) ); return Result; } @@ -18,7 +18,7 @@ AreEqual(ui_toggle *Thing1, ui_toggle *Thing2) link_internal b32 AreEqual(ui_toggle Thing1, ui_toggle Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( ui_toggle ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( ui_toggle ) ); return Result; } diff --git a/generated/are_equal_voxel_synthesis_change_propagation_info.h b/generated/are_equal_voxel_synthesis_change_propagation_info.h index 23e9937dc..c37931792 100644 --- a/generated/are_equal_voxel_synthesis_change_propagation_info.h +++ b/generated/are_equal_voxel_synthesis_change_propagation_info.h @@ -5,7 +5,7 @@ AreEqual(voxel_synthesis_change_propagation_info *Thing1, voxel_synthesis_change { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( voxel_synthesis_change_propagation_info ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( voxel_synthesis_change_propagation_info ) ); return Result; } @@ -18,7 +18,7 @@ AreEqual(voxel_synthesis_change_propagation_info *Thing1, voxel_synthesis_change link_internal b32 AreEqual(voxel_synthesis_change_propagation_info Thing1, voxel_synthesis_change_propagation_info Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( voxel_synthesis_change_propagation_info ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( voxel_synthesis_change_propagation_info ) ); return Result; } diff --git a/generated/are_equal_window_layout.h b/generated/are_equal_window_layout.h index 5c8aad984..7a31974ea 100644 --- a/generated/are_equal_window_layout.h +++ b/generated/are_equal_window_layout.h @@ -5,42 +5,42 @@ AreEqual(window_layout *Thing1, window_layout *Thing2) { if (Thing1 && Thing2) { - b32 Result = True; - Result &= AreEqual(Thing1->HashtableKey, Thing2->HashtableKey); + b32 Result = True; + Result &= AreEqual(Thing1->HashtableKey, Thing2->HashtableKey); - Result &= AreEqual(Thing1->Title, Thing2->Title); + Result &= AreEqual(Thing1->Title, Thing2->Title); - Result &= AreEqual(Thing1->Minimized, Thing2->Minimized); + Result &= AreEqual(Thing1->Minimized, Thing2->Minimized); - Result &= AreEqual(Thing1->MinimizeIndex, Thing2->MinimizeIndex); + Result &= AreEqual(Thing1->MinimizeIndex, Thing2->MinimizeIndex); - Result &= AreEqual(Thing1->Flags, Thing2->Flags); + Result &= AreEqual(Thing1->Flags, Thing2->Flags); - Result &= AreEqual(Thing1->Basis, Thing2->Basis); + Result &= AreEqual(Thing1->Basis, Thing2->Basis); - Result &= AreEqual(Thing1->MaxClip, Thing2->MaxClip); + Result &= AreEqual(Thing1->MaxClip, Thing2->MaxClip); - Result &= AreEqual(Thing1->Scroll, Thing2->Scroll); + Result &= AreEqual(Thing1->Scroll, Thing2->Scroll); - Result &= AreEqual(Thing1->CachedFlags, Thing2->CachedFlags); + Result &= AreEqual(Thing1->CachedFlags, Thing2->CachedFlags); - Result &= AreEqual(Thing1->CachedBasis, Thing2->CachedBasis); + Result &= AreEqual(Thing1->CachedBasis, Thing2->CachedBasis); - Result &= AreEqual(Thing1->CachedMaxClip, Thing2->CachedMaxClip); + Result &= AreEqual(Thing1->CachedMaxClip, Thing2->CachedMaxClip); - Result &= AreEqual(Thing1->CachedScroll, Thing2->CachedScroll); + Result &= AreEqual(Thing1->CachedScroll, Thing2->CachedScroll); - Result &= AreEqual(Thing1->InteractionStackIndex, Thing2->InteractionStackIndex); + Result &= AreEqual(Thing1->InteractionStackIndex, Thing2->InteractionStackIndex); - Result &= AreEqual(Thing1->zBackground, Thing2->zBackground); + Result &= AreEqual(Thing1->zBackground, Thing2->zBackground); - Result &= AreEqual(Thing1->zText, Thing2->zText); + Result &= AreEqual(Thing1->zText, Thing2->zText); - Result &= AreEqual(Thing1->zBorder, Thing2->zBorder); + Result &= AreEqual(Thing1->zBorder, Thing2->zBorder); - Result &= AreEqual(Thing1->zTitleBar, Thing2->zTitleBar); + Result &= AreEqual(Thing1->zTitleBar, Thing2->zTitleBar); - Result &= AreEqual(Thing1->NextHotWindow, Thing2->NextHotWindow); + Result &= AreEqual(Thing1->NextHotWindow, Thing2->NextHotWindow); return Result; } @@ -53,42 +53,42 @@ AreEqual(window_layout *Thing1, window_layout *Thing2) link_internal b32 AreEqual(window_layout Thing1, window_layout Thing2) { - b32 Result = True; - Result &= AreEqual(Thing1.HashtableKey, Thing2.HashtableKey); + b32 Result = True; + Result &= AreEqual(Thing1.HashtableKey, Thing2.HashtableKey); - Result &= AreEqual(Thing1.Title, Thing2.Title); + Result &= AreEqual(Thing1.Title, Thing2.Title); - Result &= AreEqual(Thing1.Minimized, Thing2.Minimized); + Result &= AreEqual(Thing1.Minimized, Thing2.Minimized); - Result &= AreEqual(Thing1.MinimizeIndex, Thing2.MinimizeIndex); + Result &= AreEqual(Thing1.MinimizeIndex, Thing2.MinimizeIndex); - Result &= AreEqual(Thing1.Flags, Thing2.Flags); + Result &= AreEqual(Thing1.Flags, Thing2.Flags); - Result &= AreEqual(Thing1.Basis, Thing2.Basis); + Result &= AreEqual(Thing1.Basis, Thing2.Basis); - Result &= AreEqual(Thing1.MaxClip, Thing2.MaxClip); + Result &= AreEqual(Thing1.MaxClip, Thing2.MaxClip); - Result &= AreEqual(Thing1.Scroll, Thing2.Scroll); + Result &= AreEqual(Thing1.Scroll, Thing2.Scroll); - Result &= AreEqual(Thing1.CachedFlags, Thing2.CachedFlags); + Result &= AreEqual(Thing1.CachedFlags, Thing2.CachedFlags); - Result &= AreEqual(Thing1.CachedBasis, Thing2.CachedBasis); + Result &= AreEqual(Thing1.CachedBasis, Thing2.CachedBasis); - Result &= AreEqual(Thing1.CachedMaxClip, Thing2.CachedMaxClip); + Result &= AreEqual(Thing1.CachedMaxClip, Thing2.CachedMaxClip); - Result &= AreEqual(Thing1.CachedScroll, Thing2.CachedScroll); + Result &= AreEqual(Thing1.CachedScroll, Thing2.CachedScroll); - Result &= AreEqual(Thing1.InteractionStackIndex, Thing2.InteractionStackIndex); + Result &= AreEqual(Thing1.InteractionStackIndex, Thing2.InteractionStackIndex); - Result &= AreEqual(Thing1.zBackground, Thing2.zBackground); + Result &= AreEqual(Thing1.zBackground, Thing2.zBackground); - Result &= AreEqual(Thing1.zText, Thing2.zText); + Result &= AreEqual(Thing1.zText, Thing2.zText); - Result &= AreEqual(Thing1.zBorder, Thing2.zBorder); + Result &= AreEqual(Thing1.zBorder, Thing2.zBorder); - Result &= AreEqual(Thing1.zTitleBar, Thing2.zTitleBar); + Result &= AreEqual(Thing1.zTitleBar, Thing2.zTitleBar); - Result &= AreEqual(Thing1.NextHotWindow, Thing2.NextHotWindow); + Result &= AreEqual(Thing1.NextHotWindow, Thing2.NextHotWindow); return Result; } diff --git a/generated/are_equal_xml_property.h b/generated/are_equal_xml_property.h index f003bb9db..70758fdf6 100644 --- a/generated/are_equal_xml_property.h +++ b/generated/are_equal_xml_property.h @@ -5,7 +5,7 @@ AreEqual(xml_property *Thing1, xml_property *Thing2) { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( xml_property ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( xml_property ) ); return Result; } @@ -18,7 +18,7 @@ AreEqual(xml_property *Thing1, xml_property *Thing2) link_internal b32 AreEqual(xml_property Thing1, xml_property Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( xml_property ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( xml_property ) ); return Result; } diff --git a/generated/are_equal_xml_tag.h b/generated/are_equal_xml_tag.h index 3fafca1fe..895ccc11b 100644 --- a/generated/are_equal_xml_tag.h +++ b/generated/are_equal_xml_tag.h @@ -5,7 +5,7 @@ AreEqual(xml_tag *Thing1, xml_tag *Thing2) { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( xml_tag ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( xml_tag ) ); return Result; } @@ -18,7 +18,7 @@ AreEqual(xml_tag *Thing1, xml_tag *Thing2) link_internal b32 AreEqual(xml_tag Thing1, xml_tag Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( xml_tag ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( xml_tag ) ); return Result; } diff --git a/generated/are_equal_xml_token.h b/generated/are_equal_xml_token.h index 95f83c833..40a5aeb5c 100644 --- a/generated/are_equal_xml_token.h +++ b/generated/are_equal_xml_token.h @@ -5,7 +5,7 @@ AreEqual(xml_token *Thing1, xml_token *Thing2) { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( xml_token ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( xml_token ) ); return Result; } @@ -18,7 +18,7 @@ AreEqual(xml_token *Thing1, xml_token *Thing2) link_internal b32 AreEqual(xml_token Thing1, xml_token Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( xml_token ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( xml_token ) ); return Result; } diff --git a/generated/asyncify_render_function_c_DrawLod.h b/generated/asyncify_render_function_c_DrawLod.h index ddef67315..d05fc3394 100644 --- a/generated/asyncify_render_function_c_DrawLod.h +++ b/generated/asyncify_render_function_c_DrawLod.h @@ -1,11 +1,11 @@ // src/engine/work_queue.h:327:0 link_internal void -DrawLod_Async(work_queue *Queue,engine_resources *Engine ,shader *Shader ,gpu_mapped_element_buffer *Meshes ,r32 DistanceSquared ,v3 Basis ,Quaternion Rotation ,v3 Scale ) +DrawLod_Async(work_queue *Queue, engine_resources *Engine , shader *Shader , gpu_mapped_element_buffer *Meshes , r32 DistanceSquared , v3 Basis , Quaternion Rotation , v3 Scale ) { draw_lod_async_params Params = { - Engine, Shader, Meshes, DistanceSquared, Basis, Rotation, Scale, + Engine, Shader, Meshes, DistanceSquared, Basis, Rotation, Scale, }; work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); diff --git a/generated/asyncify_render_function_c_RenderToTexture.h b/generated/asyncify_render_function_c_RenderToTexture.h index 3ec43a5aa..97af18895 100644 --- a/generated/asyncify_render_function_c_RenderToTexture.h +++ b/generated/asyncify_render_function_c_RenderToTexture.h @@ -1,11 +1,11 @@ // src/engine/work_queue.h:324:0 link_internal void -RenderToTexture_Async(work_queue *Queue,engine_resources *Engine ,asset_thumbnail *Thumb ,gpu_mapped_element_buffer *Meshes ,v3 Offset ,camera *Camera ) +RenderToTexture_Async(work_queue *Queue, engine_resources *Engine , asset_thumbnail *Thumb , gpu_mapped_element_buffer *Meshes , v3 Offset , camera *Camera ) { render_to_texture_async_params Params = { - Engine, Thumb, Meshes, Offset, Camera, + Engine, Thumb, Meshes, Offset, Camera, }; work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); diff --git a/generated/asyncify_render_function_h_DrawLod.h b/generated/asyncify_render_function_h_DrawLod.h index f17b43d52..52cb30689 100644 --- a/generated/asyncify_render_function_h_DrawLod.h +++ b/generated/asyncify_render_function_h_DrawLod.h @@ -2,12 +2,12 @@ struct draw_lod_async_params poof(@async_function_params) { -engine_resources *Engine; -shader *Shader; -gpu_mapped_element_buffer *Meshes; -r32 DistanceSquared; -v3 Basis; -Quaternion Rotation; -v3 Scale; + engine_resources *Engine; + shader *Shader; + gpu_mapped_element_buffer *Meshes; + r32 DistanceSquared; + v3 Basis; + Quaternion Rotation; + v3 Scale; }; diff --git a/generated/asyncify_render_function_h_RenderToTexture.h b/generated/asyncify_render_function_h_RenderToTexture.h index 8c40b92bc..87537f42b 100644 --- a/generated/asyncify_render_function_h_RenderToTexture.h +++ b/generated/asyncify_render_function_h_RenderToTexture.h @@ -2,10 +2,10 @@ struct render_to_texture_async_params poof(@async_function_params) { -engine_resources *Engine; -asset_thumbnail *Thumb; -gpu_mapped_element_buffer *Meshes; -v3 Offset; -camera *Camera; + engine_resources *Engine; + asset_thumbnail *Thumb; + gpu_mapped_element_buffer *Meshes; + v3 Offset; + camera *Camera; }; diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index a496e30c0..051965e01 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -171,22 +171,33 @@ AtElements(bitmap_block *Block) } -link_internal bitmap_block* + + + +link_internal bitmap_block_array +BitmapBlockArray(memory_arena *Memory) +{ + bitmap_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal bitmap_block * Allocate_bitmap_block(memory_arena *Memory) { - bitmap_block *Result = Allocate(bitmap_block, Memory, 1); - Result->Elements = Allocate(bitmap, Memory, 8); + bitmap_block *Result = Allocate( bitmap_block, Memory, 1); + Result->Elements = Allocate( bitmap, Memory, 8); return Result; } link_internal cs -CS(bitmap_block_array_index Index) +CS( bitmap_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(bitmap_block_array *Array, bitmap_block_array_index Index) +RemoveUnordered( bitmap_block_array *Array, bitmap_block_array_index Index) { bitmap_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(bitmap_block_array *Array, bitmap_block_array_index Index) } } +link_internal bitmap_block_array_index +Find( bitmap_block_array *Array, bitmap *Query) +{ + bitmap_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(bitmap_block_array_index *Index) +{ + NotImplemented; + bitmap_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal bitmap * -Push(bitmap_block_array *Array, bitmap *Element) +Push( bitmap_block_array *Array, bitmap *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 814094ad9..81a4d5da7 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,22 +1,33 @@ // src/engine/editor.cpp:80:0 -link_internal asset_thumbnail_block* + + + +link_internal asset_thumbnail_block_array +AssetThumbnailBlockArray(memory_arena *Memory) +{ + asset_thumbnail_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal asset_thumbnail_block * Allocate_asset_thumbnail_block(memory_arena *Memory) { - asset_thumbnail_block *Result = Allocate(asset_thumbnail_block, Memory, 1); - Result->Elements = Allocate(asset_thumbnail, Memory, 8); + asset_thumbnail_block *Result = Allocate( asset_thumbnail_block, Memory, 1); + Result->Elements = Allocate( asset_thumbnail, Memory, 8); return Result; } link_internal cs -CS(asset_thumbnail_block_array_index Index) +CS( asset_thumbnail_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index) +RemoveUnordered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index) { asset_thumbnail_block_array_index LastI = LastIndex(Array); @@ -59,8 +70,33 @@ RemoveUnordered(asset_thumbnail_block_array *Array, asset_thumbnail_block_array_ } } +link_internal asset_thumbnail_block_array_index +Find( asset_thumbnail_block_array *Array, asset_thumbnail *Query) +{ + asset_thumbnail_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(asset_thumbnail_block_array_index *Index) +{ + NotImplemented; + asset_thumbnail_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal asset_thumbnail * -Push(asset_thumbnail_block_array *Array, asset_thumbnail *Element) +Push( asset_thumbnail_block_array *Array, asset_thumbnail *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index a54091756..7a6e61367 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -1,22 +1,33 @@ // src/engine/render/gpu_timer.cpp:1:0 -link_internal gpu_timer_block* + + + +link_internal gpu_timer_block_array +GpuTimerBlockArray(memory_arena *Memory) +{ + gpu_timer_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal gpu_timer_block * Allocate_gpu_timer_block(memory_arena *Memory) { - gpu_timer_block *Result = Allocate(gpu_timer_block, Memory, 1); - Result->Elements = Allocate(gpu_timer, Memory, 128); + gpu_timer_block *Result = Allocate( gpu_timer_block, Memory, 1); + Result->Elements = Allocate( gpu_timer, Memory, 128); return Result; } link_internal cs -CS(gpu_timer_block_array_index Index) +CS( gpu_timer_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(gpu_timer_block_array *Array, gpu_timer_block_array_index Index) +RemoveUnordered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index) { gpu_timer_block_array_index LastI = LastIndex(Array); @@ -59,8 +70,33 @@ RemoveUnordered(gpu_timer_block_array *Array, gpu_timer_block_array_index Index) } } +link_internal gpu_timer_block_array_index +Find( gpu_timer_block_array *Array, gpu_timer *Query) +{ + gpu_timer_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(gpu_timer_block_array_index *Index) +{ + NotImplemented; + gpu_timer_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal gpu_timer * -Push(gpu_timer_block_array *Array, gpu_timer *Element) +Push( gpu_timer_block_array *Array, gpu_timer *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index 09728b13a..fcc6327e8 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -1,22 +1,33 @@ // external/bonsai_stdlib/src/shader.cpp:2:0 -link_internal shader_ptr_block* + + + +link_internal shader_ptr_block_array +ShaderPtrBlockArray(memory_arena *Memory) +{ + shader_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal shader_ptr_block * Allocate_shader_ptr_block(memory_arena *Memory) { - shader_ptr_block *Result = Allocate(shader_ptr_block, Memory, 1); - Result->Elements = Allocate(shader_ptr, Memory, 64); + shader_ptr_block *Result = Allocate( shader_ptr_block, Memory, 1); + Result->Elements = Allocate( shader_ptr, Memory, 64); return Result; } link_internal cs -CS(shader_ptr_block_array_index Index) +CS( shader_ptr_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(shader_ptr_block_array *Array, shader_ptr_block_array_index Index) +RemoveUnordered( shader_ptr_block_array *Array, shader_ptr_block_array_index Index) { shader_ptr_block_array_index LastI = LastIndex(Array); @@ -59,8 +70,33 @@ RemoveUnordered(shader_ptr_block_array *Array, shader_ptr_block_array_index Inde } } +link_internal shader_ptr_block_array_index +Find( shader_ptr_block_array *Array, shader_ptr *Query) +{ + shader_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(shader_ptr_block_array_index *Index) +{ + NotImplemented; + shader_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal shader_ptr * -Push(shader_ptr_block_array *Array, shader_ptr *Element) +Push( shader_ptr_block_array *Array, shader_ptr *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index 8e28e33a1..c47009b64 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -1,22 +1,33 @@ // external/bonsai_stdlib/src/texture.cpp:5:0 -link_internal texture_block* + + + +link_internal texture_block_array +TextureBlockArray(memory_arena *Memory) +{ + texture_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal texture_block * Allocate_texture_block(memory_arena *Memory) { - texture_block *Result = Allocate(texture_block, Memory, 1); - Result->Elements = Allocate(texture, Memory, 8); + texture_block *Result = Allocate( texture_block, Memory, 1); + Result->Elements = Allocate( texture, Memory, 8); return Result; } link_internal cs -CS(texture_block_array_index Index) +CS( texture_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(texture_block_array *Array, texture_block_array_index Index) +RemoveUnordered( texture_block_array *Array, texture_block_array_index Index) { texture_block_array_index LastI = LastIndex(Array); @@ -59,8 +70,33 @@ RemoveUnordered(texture_block_array *Array, texture_block_array_index Index) } } +link_internal texture_block_array_index +Find( texture_block_array *Array, texture *Query) +{ + texture_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(texture_block_array_index *Index) +{ + NotImplemented; + texture_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal texture * -Push(texture_block_array *Array, texture *Element) +Push( texture_block_array *Array, texture *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index bd0053460..800a0efeb 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -1,22 +1,33 @@ // external/bonsai_stdlib/src/primitive_containers.cpp:2:0 -link_internal u32_block* + + + +link_internal u32_block_array +U32BlockArray(memory_arena *Memory) +{ + u32_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal u32_block * Allocate_u32_block(memory_arena *Memory) { - u32_block *Result = Allocate(u32_block, Memory, 1); - Result->Elements = Allocate(u32, Memory, 8); + u32_block *Result = Allocate( u32_block, Memory, 1); + Result->Elements = Allocate( u32, Memory, 8); return Result; } link_internal cs -CS(u32_block_array_index Index) +CS( u32_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(u32_block_array *Array, u32_block_array_index Index) +RemoveUnordered( u32_block_array *Array, u32_block_array_index Index) { u32_block_array_index LastI = LastIndex(Array); @@ -59,8 +70,33 @@ RemoveUnordered(u32_block_array *Array, u32_block_array_index Index) } } +link_internal u32_block_array_index +Find( u32_block_array *Array, u32 *Query) +{ + u32_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(u32_block_array_index *Index) +{ + NotImplemented; + u32_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal u32 * -Push(u32_block_array *Array, u32 *Element) +Push( u32_block_array *Array, u32 *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index db4ae7291..9cca779a1 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -1,22 +1,33 @@ // external/bonsai_stdlib/src/ansi_stream.cpp:3:0 -link_internal u8_cursor_block* + + + +link_internal u8_cursor_block_array +U8CursorBlockArray(memory_arena *Memory) +{ + u8_cursor_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal u8_cursor_block * Allocate_u8_cursor_block(memory_arena *Memory) { - u8_cursor_block *Result = Allocate(u8_cursor_block, Memory, 1); - Result->Elements = Allocate(u8_cursor, Memory, 8); + u8_cursor_block *Result = Allocate( u8_cursor_block, Memory, 1); + Result->Elements = Allocate( u8_cursor, Memory, 8); return Result; } link_internal cs -CS(u8_cursor_block_array_index Index) +CS( u8_cursor_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(u8_cursor_block_array *Array, u8_cursor_block_array_index Index) +RemoveUnordered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index) { u8_cursor_block_array_index LastI = LastIndex(Array); @@ -59,8 +70,33 @@ RemoveUnordered(u8_cursor_block_array *Array, u8_cursor_block_array_index Index) } } +link_internal u8_cursor_block_array_index +Find( u8_cursor_block_array *Array, u8_cursor *Query) +{ + u8_cursor_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(u8_cursor_block_array_index *Index) +{ + NotImplemented; + u8_cursor_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal u8_cursor * -Push(u8_cursor_block_array *Array, u8_cursor *Element) +Push( u8_cursor_block_array *Array, u8_cursor *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 9587e0e7c..9e7d59736 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -171,22 +171,33 @@ AtElements(dummy_work_queue_entry_build_chunk_mesh_block *Block) } -link_internal dummy_work_queue_entry_build_chunk_mesh_block* + + + +link_internal dummy_work_queue_entry_build_chunk_mesh_block_array +DummyWorkQueueEntryBuildChunkMeshBlockArray(memory_arena *Memory) +{ + dummy_work_queue_entry_build_chunk_mesh_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal dummy_work_queue_entry_build_chunk_mesh_block * Allocate_dummy_work_queue_entry_build_chunk_mesh_block(memory_arena *Memory) { - dummy_work_queue_entry_build_chunk_mesh_block *Result = Allocate(dummy_work_queue_entry_build_chunk_mesh_block, Memory, 1); - Result->Elements = Allocate(dummy_work_queue_entry_build_chunk_mesh, Memory, 8); + dummy_work_queue_entry_build_chunk_mesh_block *Result = Allocate( dummy_work_queue_entry_build_chunk_mesh_block, Memory, 1); + Result->Elements = Allocate( dummy_work_queue_entry_build_chunk_mesh, Memory, 8); return Result; } link_internal cs -CS(dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) +CS( dummy_work_queue_entry_build_chunk_mesh_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) +RemoveUnordered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) { dummy_work_queue_entry_build_chunk_mesh_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dumm } } +link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index +Find( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Query) +{ + dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(dummy_work_queue_entry_build_chunk_mesh_block_array_index *Index) +{ + NotImplemented; + dummy_work_queue_entry_build_chunk_mesh_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal dummy_work_queue_entry_build_chunk_mesh * -Push(dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Element) +Push( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index b3f5ab647..d6c8f3955 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -171,22 +171,33 @@ AtElements(entity_block *Block) } -link_internal entity_block* + + + +link_internal entity_block_array +EntityBlockArray(memory_arena *Memory) +{ + entity_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal entity_block * Allocate_entity_block(memory_arena *Memory) { - entity_block *Result = Allocate(entity_block, Memory, 1); - Result->Elements = Allocate(entity, Memory, 8); + entity_block *Result = Allocate( entity_block, Memory, 1); + Result->Elements = Allocate( entity, Memory, 8); return Result; } link_internal cs -CS(entity_block_array_index Index) +CS( entity_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(entity_block_array *Array, entity_block_array_index Index) +RemoveUnordered( entity_block_array *Array, entity_block_array_index Index) { entity_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(entity_block_array *Array, entity_block_array_index Index) } } +link_internal entity_block_array_index +Find( entity_block_array *Array, entity *Query) +{ + entity_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(entity_block_array_index *Index) +{ + NotImplemented; + entity_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal entity * -Push(entity_block_array *Array, entity *Element) +Push( entity_block_array *Array, entity *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h index 71aba0486..9b587fe7c 100644 --- a/generated/block_array_entity_ptr_688856411.h +++ b/generated/block_array_entity_ptr_688856411.h @@ -171,22 +171,33 @@ AtElements(entity_ptr_block *Block) } -link_internal entity_ptr_block* + + + +link_internal entity_ptr_block_array +EntityPtrBlockArray(memory_arena *Memory) +{ + entity_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal entity_ptr_block * Allocate_entity_ptr_block(memory_arena *Memory) { - entity_ptr_block *Result = Allocate(entity_ptr_block, Memory, 1); - Result->Elements = Allocate(entity_ptr, Memory, 8); + entity_ptr_block *Result = Allocate( entity_ptr_block, Memory, 1); + Result->Elements = Allocate( entity_ptr, Memory, 8); return Result; } link_internal cs -CS(entity_ptr_block_array_index Index) +CS( entity_ptr_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(entity_ptr_block_array *Array, entity_ptr_block_array_index Index) +RemoveUnordered( entity_ptr_block_array *Array, entity_ptr_block_array_index Index) { entity_ptr_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(entity_ptr_block_array *Array, entity_ptr_block_array_index Inde } } +link_internal entity_ptr_block_array_index +Find( entity_ptr_block_array *Array, entity_ptr *Query) +{ + entity_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(entity_ptr_block_array_index *Index) +{ + NotImplemented; + entity_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal entity_ptr * -Push(entity_ptr_block_array *Array, entity_ptr *Element) +Push( entity_ptr_block_array *Array, entity_ptr *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index 069d4b257..a73426309 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -171,22 +171,33 @@ AtElements(file_traversal_node_block *Block) } -link_internal file_traversal_node_block* + + + +link_internal file_traversal_node_block_array +FileTraversalNodeBlockArray(memory_arena *Memory) +{ + file_traversal_node_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal file_traversal_node_block * Allocate_file_traversal_node_block(memory_arena *Memory) { - file_traversal_node_block *Result = Allocate(file_traversal_node_block, Memory, 1); - Result->Elements = Allocate(file_traversal_node, Memory, 8); + file_traversal_node_block *Result = Allocate( file_traversal_node_block, Memory, 1); + Result->Elements = Allocate( file_traversal_node, Memory, 8); return Result; } link_internal cs -CS(file_traversal_node_block_array_index Index) +CS( file_traversal_node_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index) +RemoveUnordered( file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index) { file_traversal_node_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(file_traversal_node_block_array *Array, file_traversal_node_bloc } } +link_internal file_traversal_node_block_array_index +Find( file_traversal_node_block_array *Array, file_traversal_node *Query) +{ + file_traversal_node_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(file_traversal_node_block_array_index *Index) +{ + NotImplemented; + file_traversal_node_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal file_traversal_node * -Push(file_traversal_node_block_array *Array, file_traversal_node *Element) +Push( file_traversal_node_block_array *Array, file_traversal_node *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index c2061066a..7525cc314 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -171,22 +171,33 @@ AtElements(gpu_readback_buffer_block *Block) } -link_internal gpu_readback_buffer_block* + + + +link_internal gpu_readback_buffer_block_array +GpuReadbackBufferBlockArray(memory_arena *Memory) +{ + gpu_readback_buffer_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal gpu_readback_buffer_block * Allocate_gpu_readback_buffer_block(memory_arena *Memory) { - gpu_readback_buffer_block *Result = Allocate(gpu_readback_buffer_block, Memory, 1); - Result->Elements = Allocate(gpu_readback_buffer, Memory, 8); + gpu_readback_buffer_block *Result = Allocate( gpu_readback_buffer_block, Memory, 1); + Result->Elements = Allocate( gpu_readback_buffer, Memory, 8); return Result; } link_internal cs -CS(gpu_readback_buffer_block_array_index Index) +CS( gpu_readback_buffer_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) +RemoveUnordered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) { gpu_readback_buffer_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(gpu_readback_buffer_block_array *Array, gpu_readback_buffer_bloc } } +link_internal gpu_readback_buffer_block_array_index +Find( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Query) +{ + gpu_readback_buffer_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(gpu_readback_buffer_block_array_index *Index) +{ + NotImplemented; + gpu_readback_buffer_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal gpu_readback_buffer * -Push(gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element) +Push( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index ea24a13a0..f82124602 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -171,22 +171,33 @@ AtElements(member_info_block *Block) } -link_internal member_info_block* + + + +link_internal member_info_block_array +MemberInfoBlockArray(memory_arena *Memory) +{ + member_info_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal member_info_block * Allocate_member_info_block(memory_arena *Memory) { - member_info_block *Result = Allocate(member_info_block, Memory, 1); - Result->Elements = Allocate(member_info, Memory, 8); + member_info_block *Result = Allocate( member_info_block, Memory, 1); + Result->Elements = Allocate( member_info, Memory, 8); return Result; } link_internal cs -CS(member_info_block_array_index Index) +CS( member_info_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(member_info_block_array *Array, member_info_block_array_index Index) +RemoveUnordered( member_info_block_array *Array, member_info_block_array_index Index) { member_info_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(member_info_block_array *Array, member_info_block_array_index In } } +link_internal member_info_block_array_index +Find( member_info_block_array *Array, member_info *Query) +{ + member_info_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(member_info_block_array_index *Index) +{ + NotImplemented; + member_info_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal member_info * -Push(member_info_block_array *Array, member_info *Element) +Push( member_info_block_array *Array, member_info *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 46bf33806..cf0b4b466 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -171,22 +171,33 @@ AtElements(model_block *Block) } -link_internal model_block* + + + +link_internal model_block_array +ModelBlockArray(memory_arena *Memory) +{ + model_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal model_block * Allocate_model_block(memory_arena *Memory) { - model_block *Result = Allocate(model_block, Memory, 1); - Result->Elements = Allocate(model, Memory, 8); + model_block *Result = Allocate( model_block, Memory, 1); + Result->Elements = Allocate( model, Memory, 8); return Result; } link_internal cs -CS(model_block_array_index Index) +CS( model_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(model_block_array *Array, model_block_array_index Index) +RemoveUnordered( model_block_array *Array, model_block_array_index Index) { model_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(model_block_array *Array, model_block_array_index Index) } } +link_internal model_block_array_index +Find( model_block_array *Array, model *Query) +{ + model_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(model_block_array_index *Index) +{ + NotImplemented; + model_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal model * -Push(model_block_array *Array, model *Element) +Push( model_block_array *Array, model *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 35a524b5e..fc2748551 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:53:0 +// src/engine/world.h:57:0 struct octree_node_ptr_block { @@ -171,22 +171,33 @@ AtElements(octree_node_ptr_block *Block) } -link_internal octree_node_ptr_block* + + + +link_internal octree_node_ptr_block_array +OctreeNodePtrBlockArray(memory_arena *Memory) +{ + octree_node_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal octree_node_ptr_block * Allocate_octree_node_ptr_block(memory_arena *Memory) { - octree_node_ptr_block *Result = Allocate(octree_node_ptr_block, Memory, 1); - Result->Elements = Allocate(octree_node_ptr, Memory, 8); + octree_node_ptr_block *Result = Allocate( octree_node_ptr_block, Memory, 1); + Result->Elements = Allocate( octree_node_ptr, Memory, 8); return Result; } link_internal cs -CS(octree_node_ptr_block_array_index Index) +CS( octree_node_ptr_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) +RemoveUnordered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) { octree_node_ptr_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(octree_node_ptr_block_array *Array, octree_node_ptr_block_array_ } } +link_internal octree_node_ptr_block_array_index +Find( octree_node_ptr_block_array *Array, octree_node_ptr *Query) +{ + octree_node_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(octree_node_ptr_block_array_index *Index) +{ + NotImplemented; + octree_node_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal octree_node_ptr * -Push(octree_node_ptr_block_array *Array, octree_node_ptr *Element) +Push( octree_node_ptr_block_array *Array, octree_node_ptr *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 6b1b7983f..1487ecfe8 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:56:0 +// src/engine/world.h:60:0 struct picked_octree_node_block { @@ -171,22 +171,33 @@ AtElements(picked_octree_node_block *Block) } -link_internal picked_octree_node_block* + + + +link_internal picked_octree_node_block_array +PickedOctreeNodeBlockArray(memory_arena *Memory) +{ + picked_octree_node_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal picked_octree_node_block * Allocate_picked_octree_node_block(memory_arena *Memory) { - picked_octree_node_block *Result = Allocate(picked_octree_node_block, Memory, 1); - Result->Elements = Allocate(picked_octree_node, Memory, 8); + picked_octree_node_block *Result = Allocate( picked_octree_node_block, Memory, 1); + Result->Elements = Allocate( picked_octree_node, Memory, 8); return Result; } link_internal cs -CS(picked_octree_node_block_array_index Index) +CS( picked_octree_node_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) +RemoveUnordered( picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) { picked_octree_node_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(picked_octree_node_block_array *Array, picked_octree_node_block_ } } +link_internal picked_octree_node_block_array_index +Find( picked_octree_node_block_array *Array, picked_octree_node *Query) +{ + picked_octree_node_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(picked_octree_node_block_array_index *Index) +{ + NotImplemented; + picked_octree_node_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal picked_octree_node * -Push(picked_octree_node_block_array *Array, picked_octree_node *Element) +Push( picked_octree_node_block_array *Array, picked_octree_node *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 421e62dfe..3e6b85d04 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -171,22 +171,33 @@ AtElements(standing_spot_block *Block) } -link_internal standing_spot_block* + + + +link_internal standing_spot_block_array +StandingSpotBlockArray(memory_arena *Memory) +{ + standing_spot_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal standing_spot_block * Allocate_standing_spot_block(memory_arena *Memory) { - standing_spot_block *Result = Allocate(standing_spot_block, Memory, 1); - Result->Elements = Allocate(standing_spot, Memory, 8); + standing_spot_block *Result = Allocate( standing_spot_block, Memory, 1); + Result->Elements = Allocate( standing_spot, Memory, 8); return Result; } link_internal cs -CS(standing_spot_block_array_index Index) +CS( standing_spot_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(standing_spot_block_array *Array, standing_spot_block_array_index Index) +RemoveUnordered( standing_spot_block_array *Array, standing_spot_block_array_index Index) { standing_spot_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(standing_spot_block_array *Array, standing_spot_block_array_inde } } +link_internal standing_spot_block_array_index +Find( standing_spot_block_array *Array, standing_spot *Query) +{ + standing_spot_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(standing_spot_block_array_index *Index) +{ + NotImplemented; + standing_spot_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal standing_spot * -Push(standing_spot_block_array *Array, standing_spot *Element) +Push( standing_spot_block_array *Array, standing_spot *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index 179ea20a2..d3ee87004 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -1,22 +1,33 @@ // external/bonsai_stdlib/src/texture.cpp:8:0 -link_internal texture_ptr_block* + + + +link_internal texture_ptr_block_array +TexturePtrBlockArray(memory_arena *Memory) +{ + texture_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal texture_ptr_block * Allocate_texture_ptr_block(memory_arena *Memory) { - texture_ptr_block *Result = Allocate(texture_ptr_block, Memory, 1); - Result->Elements = Allocate(texture_ptr, Memory, 8); + texture_ptr_block *Result = Allocate( texture_ptr_block, Memory, 1); + Result->Elements = Allocate( texture_ptr, Memory, 8); return Result; } link_internal cs -CS(texture_ptr_block_array_index Index) +CS( texture_ptr_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(texture_ptr_block_array *Array, texture_ptr_block_array_index Index) +RemoveUnordered( texture_ptr_block_array *Array, texture_ptr_block_array_index Index) { texture_ptr_block_array_index LastI = LastIndex(Array); @@ -59,8 +70,33 @@ RemoveUnordered(texture_ptr_block_array *Array, texture_ptr_block_array_index In } } +link_internal texture_ptr_block_array_index +Find( texture_ptr_block_array *Array, texture_ptr *Query) +{ + texture_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(texture_ptr_block_array_index *Index) +{ + NotImplemented; + texture_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal texture_ptr * -Push(texture_ptr_block_array *Array, texture_ptr *Element) +Push( texture_ptr_block_array *Array, texture_ptr *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index aabe963b8..0d1b27341 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -171,22 +171,33 @@ AtElements(vox_data_block *Block) } -link_internal vox_data_block* + + + +link_internal vox_data_block_array +VoxDataBlockArray(memory_arena *Memory) +{ + vox_data_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal vox_data_block * Allocate_vox_data_block(memory_arena *Memory) { - vox_data_block *Result = Allocate(vox_data_block, Memory, 1); - Result->Elements = Allocate(vox_data, Memory, 8); + vox_data_block *Result = Allocate( vox_data_block, Memory, 1); + Result->Elements = Allocate( vox_data, Memory, 8); return Result; } link_internal cs -CS(vox_data_block_array_index Index) +CS( vox_data_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(vox_data_block_array *Array, vox_data_block_array_index Index) +RemoveUnordered( vox_data_block_array *Array, vox_data_block_array_index Index) { vox_data_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(vox_data_block_array *Array, vox_data_block_array_index Index) } } +link_internal vox_data_block_array_index +Find( vox_data_block_array *Array, vox_data *Query) +{ + vox_data_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(vox_data_block_array_index *Index) +{ + NotImplemented; + vox_data_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal vox_data * -Push(vox_data_block_array *Array, vox_data *Element) +Push( vox_data_block_array *Array, vox_data *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index e62779150..8c3800287 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -171,22 +171,33 @@ AtElements(voxel_stack_element_block *Block) } -link_internal voxel_stack_element_block* + + + +link_internal voxel_stack_element_block_array +VoxelStackElementBlockArray(memory_arena *Memory) +{ + voxel_stack_element_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal voxel_stack_element_block * Allocate_voxel_stack_element_block(memory_arena *Memory) { - voxel_stack_element_block *Result = Allocate(voxel_stack_element_block, Memory, 1); - Result->Elements = Allocate(voxel_stack_element, Memory, 8); + voxel_stack_element_block *Result = Allocate( voxel_stack_element_block, Memory, 1); + Result->Elements = Allocate( voxel_stack_element, Memory, 8); return Result; } link_internal cs -CS(voxel_stack_element_block_array_index Index) +CS( voxel_stack_element_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index) +RemoveUnordered( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index) { voxel_stack_element_block_array_index LastI = LastIndex(Array); @@ -229,8 +240,33 @@ RemoveUnordered(voxel_stack_element_block_array *Array, voxel_stack_element_bloc } } +link_internal voxel_stack_element_block_array_index +Find( voxel_stack_element_block_array *Array, voxel_stack_element *Query) +{ + voxel_stack_element_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(voxel_stack_element_block_array_index *Index) +{ + NotImplemented; + voxel_stack_element_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal voxel_stack_element * -Push(voxel_stack_element_block_array *Array, voxel_stack_element *Element) +Push( voxel_stack_element_block_array *Array, voxel_stack_element *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index b4bba8f08..0a0254a84 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -1,22 +1,33 @@ // src/engine/world_chunk.cpp:2:0 -link_internal world_chunk_ptr_block* + + + +link_internal world_chunk_ptr_block_array +WorldChunkPtrBlockArray(memory_arena *Memory) +{ + world_chunk_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal world_chunk_ptr_block * Allocate_world_chunk_ptr_block(memory_arena *Memory) { - world_chunk_ptr_block *Result = Allocate(world_chunk_ptr_block, Memory, 1); - Result->Elements = Allocate(world_chunk_ptr, Memory, 32); + world_chunk_ptr_block *Result = Allocate( world_chunk_ptr_block, Memory, 1); + Result->Elements = Allocate( world_chunk_ptr, Memory, 32); return Result; } link_internal cs -CS(world_chunk_ptr_block_array_index Index) +CS( world_chunk_ptr_block_array_index Index ) { return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } link_internal void -RemoveUnordered(world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index) +RemoveUnordered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index) { world_chunk_ptr_block_array_index LastI = LastIndex(Array); @@ -59,8 +70,33 @@ RemoveUnordered(world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_ } } +link_internal world_chunk_ptr_block_array_index +Find( world_chunk_ptr_block_array *Array, world_chunk_ptr *Query) +{ + world_chunk_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(world_chunk_ptr_block_array_index *Index) +{ + NotImplemented; + world_chunk_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + link_internal world_chunk_ptr * -Push(world_chunk_ptr_block_array *Array, world_chunk_ptr *Element) +Push( world_chunk_ptr_block_array *Array, world_chunk_ptr *Element) { if (Array->Memory == 0) { Array->Memory = AllocateArena(); } diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h new file mode 100644 index 000000000..823f34882 --- /dev/null +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -0,0 +1,299 @@ +// src/engine/editor.h:1164:0 + +struct world_edit_ptr_block +{ + u32 Index; + u32 At; + world_edit_ptr *Elements; + world_edit_ptr_block *Next; +}; + +struct world_edit_ptr_block_array_index +{ + world_edit_ptr_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct world_edit_ptr_block_array +{ + world_edit_ptr_block *First; + world_edit_ptr_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +typedef world_edit_ptr_block_array world_edit_ptr_paged_list; + +link_internal world_edit_ptr_block_array_index +operator++(world_edit_ptr_block_array_index &I0) +{ + if (I0.Block) + { + if (I0.ElementIndex == 8-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<(world_edit_ptr_block_array_index I0, world_edit_ptr_block_array_index I1) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex(world_edit_ptr_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*8); + return Result; +} + +link_internal world_edit_ptr_block_array_index +ZerothIndex(world_edit_ptr_block_array *Arr) +{ + world_edit_ptr_block_array_index Result = {}; + Result.Block = Arr->First; + /* Assert(Result.Block->Index == 0); */ + return Result; +} + +link_internal umm +TotalElements(world_edit_ptr_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 8) + Arr->Current->At; + } + return Result; +} + +link_internal world_edit_ptr_block_array_index +LastIndex(world_edit_ptr_block_array *Arr) +{ + world_edit_ptr_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal world_edit_ptr_block_array_index +AtElements(world_edit_ptr_block_array *Arr) +{ + world_edit_ptr_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal umm +Count(world_edit_ptr_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + +link_internal world_edit_ptr * +GetPtr(world_edit_ptr_block_array *Arr, world_edit_ptr_block_array_index Index) +{ + world_edit_ptr *Result = {}; + if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + return Result; +} + +link_internal world_edit_ptr * +GetPtr(world_edit_ptr_block *Block, umm Index) +{ + world_edit_ptr *Result = 0; + if (Index < Block->At) { Result = Block->Elements + Index; } + return Result; +} + +link_internal world_edit_ptr * +GetPtr(world_edit_ptr_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + umm AtBlock = 0; + world_edit_ptr_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + world_edit_ptr *Result = Block->Elements+ElementIndex; + return Result; +} + +link_internal world_edit_ptr * +TryGetPtr(world_edit_ptr_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + world_edit_ptr *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(world_edit_ptr_block *Block) +{ + return Block->At; +} + + + + + +link_internal world_edit_ptr_block_array +WorldEditPtrBlockArray(memory_arena *Memory) +{ + world_edit_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal world_edit_ptr_block * +Allocate_world_edit_ptr_block(memory_arena *Memory) +{ + world_edit_ptr_block *Result = Allocate( world_edit_ptr_block, Memory, 1); + Result->Elements = Allocate( world_edit_ptr, Memory, 8); + return Result; +} + +link_internal cs +CS( world_edit_ptr_block_array_index Index ) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal void +RemoveUnordered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index Index) +{ + world_edit_ptr_block_array_index LastI = LastIndex(Array); + + world_edit_ptr *Element = GetPtr(Array, Index); + world_edit_ptr *LastElement = GetPtr(Array, LastI); + + *Element = *LastElement; + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + world_edit_ptr_block *Current = Array->First; + world_edit_ptr_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal world_edit_ptr_block_array_index +Find( world_edit_ptr_block_array *Array, world_edit_ptr *Query) +{ + world_edit_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if (E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(world_edit_ptr_block_array_index *Index) +{ + NotImplemented; + world_edit_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + /* b32 Result = AreEqual(*Index, Test); */ + b32 Result = False; + return Result; +} + +link_internal world_edit_ptr * +Push( world_edit_ptr_block_array *Array, world_edit_ptr *Element) +{ + if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + + if (Array->First == 0) { Array->First = Allocate_world_edit_ptr_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 8) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + world_edit_ptr_block *Next = Allocate_world_edit_ptr_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + world_edit_ptr *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + + diff --git a/generated/buffer_octree_node_ptr.h b/generated/buffer_octree_node_ptr.h new file mode 100644 index 000000000..aa082c8e6 --- /dev/null +++ b/generated/buffer_octree_node_ptr.h @@ -0,0 +1,77 @@ +// src/engine/world.h:34:0 + +struct octree_node_ptr_buffer +{ + umm Count; + octree_node_ptr *Start; poof(@array_length(Element->Count)) +}; + +link_internal octree_node_ptr_buffer +OctreeNodePtrBuffer( umm ElementCount, memory_arena* Memory) +{ + octree_node_ptr_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( octree_node_ptr, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate octree_node_ptr_buffer of 0 length."); + } + + return Result; +} + +link_inline umm +LastIndex(octree_node_ptr_buffer *Buf) +{ + umm Result = Buf->Count > 0? Buf->Count-1 : 0; + return Result; +} + +link_inline umm +ZerothIndex(octree_node_ptr_buffer *Buf) +{ + umm Result = 0; + return Result; +} + +link_inline umm +AtElements(octree_node_ptr_buffer *Buf) +{ + umm Result = Buf->Count; + return Result; +} + +link_inline umm +TotalElements(octree_node_ptr_buffer *Buf) +{ + umm Result = Buf->Count; + return Result; +} + +link_inline umm +CurrentCount(octree_node_ptr_buffer *Buf) +{ + umm Result = Buf->Count; + return Result; +} + +link_inline octree_node_ptr * +GetPtr(octree_node_ptr_buffer *Buf, umm Index) +{ + octree_node_ptr *Result = 0; + if (Index < Buf->Count) { Result = Buf->Start + Index; } + return Result; +} + +link_inline octree_node_ptr * +Get(octree_node_ptr_buffer *Buf, umm Index) +{ + octree_node_ptr *Result = GetPtr(Buf, Index); + return Result; +} + + diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index 17db3b278..221f887a7 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -288,11 +288,15 @@ WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_cancel_all_noise_readba } + + link_internal bonsai_render_command_initialize_noise_buffer -BonsaiRenderCommandInitializeNoiseBuffer( world_chunk* Chunk ) +BonsaiRenderCommandInitializeNoiseBuffer( world_chunk * Chunk ) { bonsai_render_command_initialize_noise_buffer Reuslt = { - .Chunk = Chunk + .Chunk = Chunk + + }; @@ -300,10 +304,12 @@ BonsaiRenderCommandInitializeNoiseBuffer( world_chunk* Chunk ) } link_internal bonsai_render_command_clear_all_framebuffers -BonsaiRenderCommandClearAllFramebuffers( u32 Ignored ) +BonsaiRenderCommandClearAllFramebuffers( u32 Ignored ) { bonsai_render_command_clear_all_framebuffers Reuslt = { - .Ignored = Ignored + .Ignored = Ignored + + }; @@ -311,12 +317,12 @@ BonsaiRenderCommandClearAllFramebuffers( u32 Ignored ) } link_internal bonsai_render_command_allocate_texture -BonsaiRenderCommandAllocateTexture( texture* Texture , void * Data ) +BonsaiRenderCommandAllocateTexture( texture * Texture , void * Data ) { bonsai_render_command_allocate_texture Reuslt = { - .Texture = Texture -, - .Data = Data + .Texture = Texture + +, .Data = Data }; @@ -324,12 +330,12 @@ BonsaiRenderCommandAllocateTexture( texture* Texture , void * Data ) } link_internal bonsai_render_command_deallocate_texture -BonsaiRenderCommandDeallocateTexture( u32* Buffers , s32 Count ) +BonsaiRenderCommandDeallocateTexture( u32 * Buffers , s32 Count ) { bonsai_render_command_deallocate_texture Reuslt = { - .Buffers = Buffers -, - .Count = Count + .Buffers = Buffers + +, .Count = Count }; @@ -337,12 +343,12 @@ BonsaiRenderCommandDeallocateTexture( u32* Buffers , s32 Count ) } link_internal bonsai_render_command_allocate_buffers -BonsaiRenderCommandAllocateBuffers( u32* Buffers , s32 Count ) +BonsaiRenderCommandAllocateBuffers( u32 * Buffers , s32 Count ) { bonsai_render_command_allocate_buffers Reuslt = { - .Buffers = Buffers -, - .Count = Count + .Buffers = Buffers + +, .Count = Count }; @@ -350,12 +356,12 @@ BonsaiRenderCommandAllocateBuffers( u32* Buffers , s32 Count ) } link_internal bonsai_render_command_reallocate_buffers -BonsaiRenderCommandReallocateBuffers( gpu_element_buffer_handles* Handles , untextured_3d_geometry_buffer* Mesh ) +BonsaiRenderCommandReallocateBuffers( gpu_element_buffer_handles * Handles , untextured_3d_geometry_buffer * Mesh ) { bonsai_render_command_reallocate_buffers Reuslt = { - .Handles = Handles -, - .Mesh = Mesh + .Handles = Handles + +, .Mesh = Mesh }; @@ -363,15 +369,15 @@ BonsaiRenderCommandReallocateBuffers( gpu_element_buffer_handles* Handles , unt } link_internal bonsai_render_command_deallocate_buffers -BonsaiRenderCommandDeallocateBuffers( u32* Buffers , s32 Count ) +BonsaiRenderCommandDeallocateBuffers( u32 * Buffers , s32 Count ) { bonsai_render_command_deallocate_buffers Reuslt = { - .Buffers = {} -, - .Count = Count + .Buffers = {} + +, .Count = Count }; - RangeIterator(Index, s32(Count)) + RangeIterator(Index, s32(Count)) { Reuslt.Buffers[Index] = Buffers[Index]; } @@ -381,10 +387,12 @@ BonsaiRenderCommandDeallocateBuffers( u32* Buffers , s32 Count ) } link_internal bonsai_render_command_deallocate_world_chunk -BonsaiRenderCommandDeallocateWorldChunk( world_chunk* Chunk ) +BonsaiRenderCommandDeallocateWorldChunk( world_chunk * Chunk ) { bonsai_render_command_deallocate_world_chunk Reuslt = { - .Chunk = Chunk + .Chunk = Chunk + + }; @@ -392,10 +400,12 @@ BonsaiRenderCommandDeallocateWorldChunk( world_chunk* Chunk ) } link_internal bonsai_render_command_do_stuff -BonsaiRenderCommandDoStuff( u32 Ignored ) +BonsaiRenderCommandDoStuff( u32 Ignored ) { bonsai_render_command_do_stuff Reuslt = { - .Ignored = Ignored + .Ignored = Ignored + + }; @@ -403,18 +413,18 @@ BonsaiRenderCommandDoStuff( u32 Ignored ) } link_internal bonsai_render_command_allocate_and_map_gpu_element_buffer -BonsaiRenderCommandAllocateAndMapGpuElementBuffer( data_type Type , u32 ElementCount , gpu_mapped_element_buffer* Dest , world_chunk* SynChunk , world_chunk* DestChunk ) +BonsaiRenderCommandAllocateAndMapGpuElementBuffer( data_type Type , u32 ElementCount , gpu_mapped_element_buffer * Dest , world_chunk * SynChunk , world_chunk * DestChunk ) { bonsai_render_command_allocate_and_map_gpu_element_buffer Reuslt = { - .Type = Type -, - .ElementCount = ElementCount + .Type = Type + +, .ElementCount = ElementCount , - .Dest = Dest + .Dest = Dest , - .SynChunk = SynChunk + .SynChunk = SynChunk , - .DestChunk = DestChunk + .DestChunk = DestChunk }; @@ -422,12 +432,12 @@ BonsaiRenderCommandAllocateAndMapGpuElementBuffer( data_type Type , u32 Elem } link_internal bonsai_render_command_unmap_gpu_element_buffer -BonsaiRenderCommandUnmapGpuElementBuffer( gpu_mapped_element_buffer* Buf , world_chunk* Chunk ) +BonsaiRenderCommandUnmapGpuElementBuffer( gpu_mapped_element_buffer * Buf , world_chunk * Chunk ) { bonsai_render_command_unmap_gpu_element_buffer Reuslt = { - .Buf = Buf -, - .Chunk = Chunk + .Buf = Buf + +, .Chunk = Chunk }; @@ -435,10 +445,12 @@ BonsaiRenderCommandUnmapGpuElementBuffer( gpu_mapped_element_buffer* Buf , worl } link_internal bonsai_render_command_unmap_and_deallocate_buffer -BonsaiRenderCommandUnmapAndDeallocateBuffer( gpu_readback_buffer PBOBuf ) +BonsaiRenderCommandUnmapAndDeallocateBuffer( gpu_readback_buffer PBOBuf ) { bonsai_render_command_unmap_and_deallocate_buffer Reuslt = { - .PBOBuf = PBOBuf + .PBOBuf = PBOBuf + + }; @@ -446,10 +458,12 @@ BonsaiRenderCommandUnmapAndDeallocateBuffer( gpu_readback_buffer PBOBuf ) } link_internal bonsai_render_command_setup_shader -BonsaiRenderCommandSetupShader( bonsai_render_command_shader_id ShaderId ) +BonsaiRenderCommandSetupShader( bonsai_render_command_shader_id ShaderId ) { bonsai_render_command_setup_shader Reuslt = { - .ShaderId = ShaderId + .ShaderId = ShaderId + + }; @@ -457,10 +471,12 @@ BonsaiRenderCommandSetupShader( bonsai_render_command_shader_id ShaderId ) } link_internal bonsai_render_command_teardown_shader -BonsaiRenderCommandTeardownShader( bonsai_render_command_shader_id ShaderId ) +BonsaiRenderCommandTeardownShader( bonsai_render_command_shader_id ShaderId ) { bonsai_render_command_teardown_shader Reuslt = { - .ShaderId = ShaderId + .ShaderId = ShaderId + + }; @@ -468,14 +484,14 @@ BonsaiRenderCommandTeardownShader( bonsai_render_command_shader_id ShaderId ) } link_internal bonsai_render_command_set_shader_uniform -BonsaiRenderCommandSetShaderUniform( shader_uniform Uniform , shader* Shader , s32 TextureUnit ) +BonsaiRenderCommandSetShaderUniform( shader_uniform Uniform , shader * Shader , s32 TextureUnit ) { bonsai_render_command_set_shader_uniform Reuslt = { - .Uniform = Uniform -, - .Shader = Shader + .Uniform = Uniform + +, .Shader = Shader , - .TextureUnit = TextureUnit + .TextureUnit = TextureUnit }; @@ -483,12 +499,12 @@ BonsaiRenderCommandSetShaderUniform( shader_uniform Uniform , shader* Shader } link_internal bonsai_render_command_draw_world_chunk_draw_list -BonsaiRenderCommandDrawWorldChunkDrawList( world_chunk_ptr_paged_list* DrawList , shader* Shader ) +BonsaiRenderCommandDrawWorldChunkDrawList( world_chunk_ptr_paged_list * DrawList , shader * Shader ) { bonsai_render_command_draw_world_chunk_draw_list Reuslt = { - .DrawList = DrawList -, - .Shader = Shader + .DrawList = DrawList + +, .Shader = Shader }; @@ -496,10 +512,12 @@ BonsaiRenderCommandDrawWorldChunkDrawList( world_chunk_ptr_paged_list* DrawList } link_internal bonsai_render_command_draw_all_entities -BonsaiRenderCommandDrawAllEntities( shader* Shader ) +BonsaiRenderCommandDrawAllEntities( shader * Shader ) { bonsai_render_command_draw_all_entities Reuslt = { - .Shader = Shader + .Shader = Shader + + }; @@ -507,10 +525,12 @@ BonsaiRenderCommandDrawAllEntities( shader* Shader ) } link_internal bonsai_render_command_gl_timer_init -BonsaiRenderCommandGlTimerInit( u32* GlTimerObject ) +BonsaiRenderCommandGlTimerInit( u32 * GlTimerObject ) { bonsai_render_command_gl_timer_init Reuslt = { - .GlTimerObject = GlTimerObject + .GlTimerObject = GlTimerObject + + }; @@ -518,10 +538,12 @@ BonsaiRenderCommandGlTimerInit( u32* GlTimerObject ) } link_internal bonsai_render_command_gl_timer_start -BonsaiRenderCommandGlTimerStart( u32 GlTimerObject ) +BonsaiRenderCommandGlTimerStart( u32 GlTimerObject ) { bonsai_render_command_gl_timer_start Reuslt = { - .GlTimerObject = GlTimerObject + .GlTimerObject = GlTimerObject + + }; @@ -529,10 +551,12 @@ BonsaiRenderCommandGlTimerStart( u32 GlTimerObject ) } link_internal bonsai_render_command_gl_timer_end -BonsaiRenderCommandGlTimerEnd( u32 GlTimerObject ) +BonsaiRenderCommandGlTimerEnd( u32 GlTimerObject ) { bonsai_render_command_gl_timer_end Reuslt = { - .GlTimerObject = GlTimerObject + .GlTimerObject = GlTimerObject + + }; @@ -540,10 +564,12 @@ BonsaiRenderCommandGlTimerEnd( u32 GlTimerObject ) } link_internal bonsai_render_command_gl_timer_read_value_and_histogram -BonsaiRenderCommandGlTimerReadValueAndHistogram( u32 GlTimerObject ) +BonsaiRenderCommandGlTimerReadValueAndHistogram( u32 GlTimerObject ) { bonsai_render_command_gl_timer_read_value_and_histogram Reuslt = { - .GlTimerObject = GlTimerObject + .GlTimerObject = GlTimerObject + + }; @@ -561,3 +587,5 @@ BonsaiRenderCommandCancelAllNoiseReadbackJobs( ) return Reuslt; } + + diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 6fac544a2..43c5a695f 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -157,3 +157,5 @@ WorkQueueEntry( work_queue_entry__align_to_cache_line_helper A ) return Result; } + + diff --git a/generated/default_marshal_layered_brush_0.h b/generated/default_marshal_layered_brush_0.h index 0fc75a305..9c7b2870c 100644 --- a/generated/default_marshal_layered_brush_0.h +++ b/generated/default_marshal_layered_brush_0.h @@ -6,7 +6,7 @@ Live->LayerCount = Stored->LayerCount; RangeIterator(Index, 16) { - Live->Layers[Index] = Stored->Layers[Index]; + Live->Layers[Index] = Stored->Layers[Index]; } diff --git a/generated/default_marshal_layered_brush_1.h b/generated/default_marshal_layered_brush_1.h index 2e7802a4f..7f9b4b065 100644 --- a/generated/default_marshal_layered_brush_1.h +++ b/generated/default_marshal_layered_brush_1.h @@ -2,7 +2,7 @@ RangeIterator(Index, (256)) { - Live->NameBuf[Index] = Stored->NameBuf[Index]; + Live->NameBuf[Index] = Stored->NameBuf[Index]; } @@ -13,7 +13,7 @@ Live->LayerCount = Stored->LayerCount; RangeIterator(Index, 16) { - Live->Layers[Index] = Stored->Layers[Index]; + Live->Layers[Index] = Stored->Layers[Index]; } diff --git a/generated/default_marshal_layered_brush_2.h b/generated/default_marshal_layered_brush_2.h index ab899b238..504e7ae60 100644 --- a/generated/default_marshal_layered_brush_2.h +++ b/generated/default_marshal_layered_brush_2.h @@ -6,7 +6,7 @@ Live->LayerCount = Stored->LayerCount; RangeIterator(Index, 16) { - Live->Layers[Index] = Stored->Layers[Index]; + Live->Layers[Index] = Stored->Layers[Index]; } diff --git a/generated/default_marshal_particle_system_0.h b/generated/default_marshal_particle_system_0.h index 4fec64d12..b4db7e731 100644 --- a/generated/default_marshal_particle_system_0.h +++ b/generated/default_marshal_particle_system_0.h @@ -86,7 +86,7 @@ Live->ElapsedSinceLastEmission = Stored->ElapsedSinceLastEmission; RangeIterator(Index, 6) { - Live->PackedHSVColors[Index] = MagicaVoxelDefaultPaletteToPackedHSV(Stored->MCVColors[Index]); + Live->PackedHSVColors[Index] = MagicaVoxelDefaultPaletteToPackedHSV(Stored->MCVColors[Index]); } diff --git a/generated/deserialize_struct_camera_0.h b/generated/deserialize_struct_camera_0.h index bafdc1abe..f66312cfd 100644 --- a/generated/deserialize_struct_camera_0.h +++ b/generated/deserialize_struct_camera_0.h @@ -13,7 +13,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, camera_0 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Frust, Memory); @@ -21,7 +21,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->CurrentP, Memory); @@ -29,7 +29,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->RenderSpacePosition, Memory); @@ -37,7 +37,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Pitch, Memory); @@ -45,7 +45,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Roll, Memory); @@ -53,7 +53,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Yaw, Memory); @@ -61,7 +61,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DistanceFromTarget, Memory); @@ -69,7 +69,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Front, Memory); @@ -77,7 +77,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Right, Memory); @@ -85,7 +85,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Up, Memory); @@ -93,7 +93,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->GhostId, Memory); @@ -111,7 +111,7 @@ Deserialize(u8_cursor *Bytes, camera_0 *Element, memory_arena *Memory, umm Count b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/deserialize_struct_camera_1.h b/generated/deserialize_struct_camera_1.h index 938c62761..53a172280 100644 --- a/generated/deserialize_struct_camera_1.h +++ b/generated/deserialize_struct_camera_1.h @@ -13,7 +13,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Frust, Memory); @@ -21,7 +21,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->CurrentP, Memory); @@ -29,7 +29,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->RenderSpacePosition, Memory); @@ -37,7 +37,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Pitch, Memory); @@ -45,7 +45,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Roll, Memory); @@ -53,7 +53,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Yaw, Memory); @@ -61,7 +61,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->TargetPitch, Memory); @@ -69,7 +69,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->TargetRoll, Memory); @@ -77,7 +77,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->TargetYaw, Memory); @@ -85,7 +85,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Blend, Memory); @@ -93,7 +93,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DistanceFromTarget, Memory); @@ -101,7 +101,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Front, Memory); @@ -109,7 +109,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Right, Memory); @@ -117,7 +117,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Up, Memory); @@ -125,7 +125,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->GhostId, Memory); @@ -143,7 +143,7 @@ Deserialize(u8_cursor *Bytes, camera_1 *Element, memory_arena *Memory, umm Count b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/deserialize_struct_entity.h b/generated/deserialize_struct_entity.h index 502d61c07..8ba8299d6 100644 --- a/generated/deserialize_struct_entity.h +++ b/generated/deserialize_struct_entity.h @@ -10,11 +10,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor link_internal b32 DeserializeVersioned(u8_cursor *Bytes, entity *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) { - Assert(TypeInfo->Version <=2); + Assert(TypeInfo->Version <= 2); b32 Result = True; - if (TypeInfo->Version == 0) + if (TypeInfo->Version == 0) { entity_0 T0 = {}; Result &= Deserialize(Bytes, &T0, Memory); @@ -28,7 +28,7 @@ DeserializeVersioned(u8_cursor *Bytes, entity *Element, bonsai_type_info *TypeIn } - if (TypeInfo->Version ==2) + if (TypeInfo->Version == 2) { Result &= DeserializeCurrentVersion(Bytes, Element, Memory); } @@ -41,7 +41,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Id, Memory); @@ -49,7 +49,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->P, Memory); @@ -57,7 +57,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EulerAngles, Memory); @@ -65,7 +65,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Scale, Memory); @@ -73,7 +73,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->_CollisionVolumeRadius, Memory); @@ -81,7 +81,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Physics, Memory); @@ -89,7 +89,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->AssetId, Memory); @@ -97,7 +97,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ModelIndex, Memory); @@ -105,22 +105,22 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor - b64 HadEmitterPointer = Read_u64(Bytes); + b64 HadEmitterPointer = Read_u64(Bytes); Assert(HadEmitterPointer < 2); // Should be 0 or 1 - Element->State = Cast(entity_state, Read_u32(Bytes)); + Element->State = Cast(entity_state, Read_u32(Bytes)); - Element->Behavior = Cast(entity_behavior_flags, Read_u32(Bytes)); + Element->Behavior = Cast(entity_behavior_flags, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Carrying, Memory); @@ -128,7 +128,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->UserType, Memory); @@ -136,11 +136,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor -if (EntityUserDataDeserialize) {Result &= EntityUserDataDeserialize(Bytes, &Element->UserType, &Element->UserData, Memory);} + if (EntityUserDataDeserialize) {Result &= EntityUserDataDeserialize(Bytes, &Element->UserType, &Element->UserData, Memory);} - if (HadEmitterPointer) + if (HadEmitterPointer) { - umm Count = 1; + umm Count = 1; if (Element->Emitter == 0) @@ -166,7 +166,7 @@ Deserialize(u8_cursor *Bytes, entity *Element, memory_arena *Memory, umm Count) b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("entity")); + maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("entity")); if (MaybeSerializedType.Tag) { diff --git a/generated/deserialize_struct_level_header.h b/generated/deserialize_struct_level_header.h index 1863492f8..40405f0fa 100644 --- a/generated/deserialize_struct_level_header.h +++ b/generated/deserialize_struct_level_header.h @@ -10,11 +10,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena link_internal b32 DeserializeVersioned(u8_cursor *Bytes, level_header *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) { - Assert(TypeInfo->Version <=4); + Assert(TypeInfo->Version <= 4); b32 Result = True; - if (TypeInfo->Version == 0) + if (TypeInfo->Version == 0) { level_header_0 T0 = {}; Result &= Deserialize(Bytes, &T0, Memory); @@ -40,7 +40,7 @@ DeserializeVersioned(u8_cursor *Bytes, level_header *Element, bonsai_type_info * } - if (TypeInfo->Version ==4) + if (TypeInfo->Version == 4) { Result &= DeserializeCurrentVersion(Bytes, Element, Memory); } @@ -53,7 +53,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ChunkCount, Memory); @@ -61,7 +61,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EntityCount, Memory); @@ -69,7 +69,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldFlags, Memory); @@ -77,7 +77,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldCenter, Memory); @@ -85,7 +85,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->VisibleRegion, Memory); @@ -93,7 +93,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Camera, Memory); @@ -101,7 +101,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->RenderSettings, Memory); @@ -119,7 +119,7 @@ Deserialize(u8_cursor *Bytes, level_header *Element, memory_arena *Memory, umm C b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("level_header")); + maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("level_header")); if (MaybeSerializedType.Tag) { diff --git a/generated/deserialize_struct_level_header_0.h b/generated/deserialize_struct_level_header_0.h index adce13d4e..9267dc4cd 100644 --- a/generated/deserialize_struct_level_header_0.h +++ b/generated/deserialize_struct_level_header_0.h @@ -13,7 +13,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, level_header_0 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ChunkCount, Memory); @@ -21,7 +21,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_0 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EntityCount, Memory); @@ -29,7 +29,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_0 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldFlags, Memory); @@ -37,7 +37,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_0 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldCenter, Memory); @@ -45,7 +45,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_0 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->VisibleRegion, Memory); @@ -53,7 +53,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_0 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Camera, Memory); @@ -61,7 +61,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_0 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->CameraTarget, Memory); @@ -79,7 +79,7 @@ Deserialize(u8_cursor *Bytes, level_header_0 *Element, memory_arena *Memory, umm b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/deserialize_struct_level_header_1.h b/generated/deserialize_struct_level_header_1.h index 54973810f..02642569d 100644 --- a/generated/deserialize_struct_level_header_1.h +++ b/generated/deserialize_struct_level_header_1.h @@ -13,7 +13,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, level_header_1 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ChunkCount, Memory); @@ -21,7 +21,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_1 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EntityCount, Memory); @@ -29,7 +29,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_1 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldFlags, Memory); @@ -37,7 +37,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_1 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldCenter, Memory); @@ -45,7 +45,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_1 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->VisibleRegion, Memory); @@ -53,7 +53,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_1 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Camera, Memory); @@ -61,7 +61,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_1 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->CameraTarget, Memory); @@ -79,7 +79,7 @@ Deserialize(u8_cursor *Bytes, level_header_1 *Element, memory_arena *Memory, umm b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/deserialize_struct_level_header_2.h b/generated/deserialize_struct_level_header_2.h index 3fd9372bb..5953a77f5 100644 --- a/generated/deserialize_struct_level_header_2.h +++ b/generated/deserialize_struct_level_header_2.h @@ -13,7 +13,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, level_header_2 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ChunkCount, Memory); @@ -21,7 +21,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_2 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EntityCount, Memory); @@ -29,7 +29,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_2 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldFlags, Memory); @@ -37,7 +37,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_2 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldCenter, Memory); @@ -45,7 +45,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_2 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->VisibleRegion, Memory); @@ -53,7 +53,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_2 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Camera, Memory); @@ -61,7 +61,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_2 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->CameraTarget, Memory); @@ -79,7 +79,7 @@ Deserialize(u8_cursor *Bytes, level_header_2 *Element, memory_arena *Memory, umm b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/deserialize_struct_level_header_3.h b/generated/deserialize_struct_level_header_3.h index 969abcdf1..adb86d647 100644 --- a/generated/deserialize_struct_level_header_3.h +++ b/generated/deserialize_struct_level_header_3.h @@ -13,7 +13,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, level_header_3 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ChunkCount, Memory); @@ -21,7 +21,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_3 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EntityCount, Memory); @@ -29,7 +29,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_3 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldFlags, Memory); @@ -37,7 +37,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_3 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldCenter, Memory); @@ -45,7 +45,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_3 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->VisibleRegion, Memory); @@ -53,7 +53,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_3 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Camera, Memory); @@ -61,7 +61,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header_3 *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->RenderSettings, Memory); @@ -79,7 +79,7 @@ Deserialize(u8_cursor *Bytes, level_header_3 *Element, memory_arena *Memory, umm b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/deserialize_struct_render_settings_1.h b/generated/deserialize_struct_render_settings_1.h index 0cbed3d3d..a01dc738e 100644 --- a/generated/deserialize_struct_render_settings_1.h +++ b/generated/deserialize_struct_render_settings_1.h @@ -13,7 +13,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->UseSsao, Memory); @@ -21,7 +21,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->UseShadowMapping, Memory); @@ -29,7 +29,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->UseLightingBloom, Memory); @@ -37,7 +37,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->BravoilMyersOIT, Memory); @@ -45,7 +45,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->BravoilMcGuireOIT, Memory); @@ -53,7 +53,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DrawMajorGrid, Memory); @@ -61,7 +61,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DrawMinorGrid, Memory); @@ -69,7 +69,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->MajorGridDim, Memory); @@ -77,7 +77,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->OffsetOfWorldCenterToGrid, Memory); @@ -85,7 +85,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Headless, Memory); @@ -93,12 +93,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - Element->ToneMappingType = Cast(tone_mapping_type, Read_u32(Bytes)); + Element->ToneMappingType = Cast(tone_mapping_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Lighting, Memory); @@ -106,7 +106,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ApplicationResolution, Memory); @@ -114,7 +114,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ShadowMapResolution, Memory); @@ -122,7 +122,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->LuminanceMapResolution, Memory); @@ -130,7 +130,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->iApplicationResolution, Memory); @@ -138,7 +138,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->iShadowMapResolution, Memory); @@ -146,7 +146,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->iLuminanceMapResolution, Memory); @@ -164,7 +164,7 @@ Deserialize(u8_cursor *Bytes, render_settings_1 *Element, memory_arena *Memory, b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 32cdb7e90..5a1e7e5a3 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(brush_layer_type*,&Element->Type), + Cast(brush_layer_type*, &Element->Type), CSz("Type"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(noise_layer*,&Element->Noise), + Cast(noise_layer*, &Element->Noise), CSz("Noise"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shape_layer*,&Element->Shape), + Cast(shape_layer*, &Element->Shape), CSz("Shape"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode*,&Element->Mode), + Cast(world_edit_mode*, &Element->Mode), CSz("Mode"), Params ); @@ -86,10 +86,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode_modifier*,&Element->Modifier), + Cast(world_edit_mode_modifier*, &Element->Modifier), CSz("Modifier"), Params ); @@ -101,10 +101,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->Iterations), + Cast(s32*, &Element->Iterations), CSz("Iterations"), Params ); @@ -115,12 +115,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(rect3i*,&Element->Offset), + Cast(rect3i*, &Element->Offset), CSz("Offset"), Params ); @@ -132,10 +132,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->NoiseBasisOffset), + Cast(v3i*, &Element->NoiseBasisOffset), CSz("NoiseBasisOffset"), Params ); @@ -147,10 +147,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->HSVColor), + Cast(v3*, &Element->HSVColor), CSz("HSVColor"), Params ); @@ -162,10 +162,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->Invert), + Cast(b8*, &Element->Invert), CSz("Invert"), Params ); @@ -176,7 +176,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index 7c0e849f1..da47d5a57 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(maybe_tag*,&Element->Tag), + Cast(maybe_tag*, &Element->Tag), CSz("Tag"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(ray*,&Element->Ray), + Cast(ray*, &Element->Ray), CSz("Ray"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 9c6012c81..5b6d0df66 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -26,13 +26,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Threshold), + Cast(r32*, &Element->Threshold), CSz("Threshold"), Params -,0.1f, 20.f ); + , 0.1f, 20.f ); @@ -40,15 +40,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Period), + Cast(v3*, &Element->Period), CSz("Period"), Params -,0.1f, 20.f ); + , 0.1f, 20.f ); @@ -57,13 +57,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Amplitude), + Cast(r32*, &Element->Amplitude), CSz("Amplitude"), Params -,0.1f, 20.f ); + , 0.1f, 20.f ); @@ -71,7 +71,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index bc60b4ba2..d8ff63b6b 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Origin), + Cast(v3*, &Element->Origin), CSz("Origin"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Dir), + Cast(v3*, &Element->Dir), CSz("Dir"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index 97aa7e235..554047f7b 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Min), + Cast(v3*, &Element->Min), CSz("Min"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Max), + Cast(v3*, &Element->Max), CSz("Max"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index 5c5edc54e..e9c9cdbb9 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(cp*,&Element->Min), + Cast(cp*, &Element->Min), CSz("Min"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(cp*,&Element->Max), + Cast(cp*, &Element->Max), CSz("Max"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index f960fedf8..826c65f1b 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->Min), + Cast(v3i*, &Element->Min), CSz("Min"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->Max), + Cast(v3i*, &Element->Max), CSz("Max"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index fb4822413..ae98e3ecc 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shape_type*,&Element->Type), + Cast(shape_type*, &Element->Type), CSz("Type"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_update_op_shape_params_sphere*,&Element->Sphere), + Cast(world_update_op_shape_params_sphere*, &Element->Sphere), CSz("Sphere"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_update_op_shape_params_rect*,&Element->Rect), + Cast(world_update_op_shape_params_rect*, &Element->Rect), CSz("Rect"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index fff999516..d0636545e 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -26,13 +26,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Threshold), + Cast(r32*, &Element->Threshold), CSz("Threshold"), Params -,0.1f, 20.f ); + , 0.1f, 20.f ); @@ -40,15 +40,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Period), + Cast(v3*, &Element->Period), CSz("Period"), Params -,0.1f, 20.f ); + , 0.1f, 20.f ); @@ -57,13 +57,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Amplitude), + Cast(r32*, &Element->Amplitude), CSz("Amplitude"), Params -,0.1f, 20.f ); + , 0.1f, 20.f ); @@ -71,12 +71,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Squareness), + Cast(r32*, &Element->Squareness), CSz("Squareness"), Params ); @@ -87,12 +87,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->MaskChance), + Cast(r32*, &Element->MaskChance), CSz("MaskChance"), Params ); @@ -103,7 +103,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index d1544aa2f..74e4601b1 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Threshold), + Cast(r32*, &Element->Threshold), CSz("Threshold"), Params ); @@ -40,7 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, - PushNewRow(Ui); + PushNewRow(Ui); + + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_world_edit_brush.h index c6c35299c..5c8034a6c 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_brush.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_shape*,&Element->Shape), + Cast(world_edit_shape*, &Element->Shape), CSz("Shape"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode*,&Element->Mode), + Cast(world_edit_mode*, &Element->Mode), CSz("Mode"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode_modifier*,&Element->Modifier), + Cast(world_edit_mode_modifier*, &Element->Modifier), CSz("Modifier"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index fa8ca99b5..34a29bd1c 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -26,13 +26,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(rect3*,&Element->Region), + Cast(rect3*, &Element->Region), CSz("Region"), Params ); + + + + + + + + + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 088fe3ef9..dff3c4637 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(cp*,&Element->Location), + Cast(cp*, &Element->Location), CSz("Location"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(f32*,&Element->Radius), + Cast(f32*, &Element->Radius), CSz("Radius"), Params ); @@ -55,7 +55,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 178bda774..4614447c2 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Undefinded"), UiId(Window, "enum DataType_Undefinded", Element), Params)) { - *Element = DataType_Undefinded; + *Element = DataType_Undefinded; SetToggleButton(Ui, ToggleButtonId, False); @@ -22,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("v3"), UiId(Window, "enum DataType_v3", Element), Params)) { - *Element = DataType_v3; + *Element = DataType_v3; SetToggleButton(Ui, ToggleButtonId, False); @@ -31,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("u8"), UiId(Window, "enum DataType_v3_u8", Element), Params)) { - *Element = DataType_v3_u8; + *Element = DataType_v3_u8; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 7ba42d7a4..a82c13d03 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("No"), UiId(Window, "enum Maybe_No", Element), Params)) { - *Element = Maybe_No; + *Element = Maybe_No; SetToggleButton(Ui, ToggleButtonId, False); @@ -22,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Yes"), UiId(Window, "enum Maybe_Yes", Element), Params)) { - *Element = Maybe_Yes; + *Element = Maybe_Yes; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 7284d0ea8..e2ec54123 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("None"), UiId(Window, "enum ShapeType_None", Element), Params)) { - *Element = ShapeType_None; + *Element = ShapeType_None; SetToggleButton(Ui, ToggleButtonId, False); @@ -22,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Sphere"), UiId(Window, "enum ShapeType_Sphere", Element), Params)) { - *Element = ShapeType_Sphere; + *Element = ShapeType_Sphere; SetToggleButton(Ui, ToggleButtonId, False); @@ -31,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Rect"), UiId(Window, "enum ShapeType_Rect", Element), Params)) { - *Element = ShapeType_Rect; + *Element = ShapeType_Rect; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index d8177ad7e..41db6bc39 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Na if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Perlin"), UiId(Window, "enum NoiseType_Perlin", Element), Params)) { - *Element = NoiseType_Perlin; + *Element = NoiseType_Perlin; SetToggleButton(Ui, ToggleButtonId, False); @@ -22,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Na if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Voronoi"), UiId(Window, "enum NoiseType_Voronoi", Element), Params)) { - *Element = NoiseType_Voronoi; + *Element = NoiseType_Voronoi; SetToggleButton(Ui, ToggleButtonId, False); @@ -31,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Na if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("White"), UiId(Window, "enum NoiseType_White", Element), Params)) { - *Element = NoiseType_White; + *Element = NoiseType_White; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 6259579da..8d08c9bd4 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -18,7 +18,7 @@ RadioButtonGroup_asset_window_view_mode( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("AssetFiles"), UiId(Window, Cast(void*, Element), Cast(void*, "asset_window_view_mode AssetWindowViewMode_AssetFiles")), AssetWindowViewMode_AssetFiles }, + { CSz("AssetFiles"), UiId(Window, Cast(void*, Element), Cast(void*, "asset_window_view_mode AssetWindowViewMode_AssetFiles")), AssetWindowViewMode_AssetFiles }, { CSz("AssetTable"), UiId(Window, Cast(void*, Element), Cast(void*, "asset_window_view_mode AssetWindowViewMode_AssetTable")), AssetWindowViewMode_AssetTable }, }; diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 3f057c2e4..93780d181 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -18,7 +18,7 @@ RadioButtonGroup_brush_layer_type( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Noise"), UiId(Window, Cast(void*, Element), Cast(void*, "brush_layer_type BrushLayerType_Noise")), BrushLayerType_Noise }, + { CSz("Noise"), UiId(Window, Cast(void*, Element), Cast(void*, "brush_layer_type BrushLayerType_Noise")), BrushLayerType_Noise }, { CSz("Shape"), UiId(Window, Cast(void*, Element), Cast(void*, "brush_layer_type BrushLayerType_Shape")), BrushLayerType_Shape }, }; diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 01d92280e..15368f8e8 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -18,7 +18,7 @@ RadioButtonGroup_world_edit_brush_type( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Disabled"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Disabled")), WorldEdit_BrushType_Disabled }, + { CSz("Disabled"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Disabled")), WorldEdit_BrushType_Disabled }, { CSz("Single"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Single")), WorldEdit_BrushType_Single }, { CSz("Asset"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Asset")), WorldEdit_BrushType_Asset }, { CSz("Entity"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Entity")), WorldEdit_BrushType_Entity }, diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_mode.h index c774f4409..15567b7c9 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_mode.h @@ -18,7 +18,7 @@ RadioButtonGroup_world_edit_mode( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Attach"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode WorldEdit_Mode_Attach")), WorldEdit_Mode_Attach }, + { CSz("Attach"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode WorldEdit_Mode_Attach")), WorldEdit_Mode_Attach }, { CSz("Remove"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode WorldEdit_Mode_Remove")), WorldEdit_Mode_Remove }, { CSz("Paint"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode WorldEdit_Mode_Paint")), WorldEdit_Mode_Paint }, { CSz("Disabled"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode WorldEdit_Mode_Disabled")), WorldEdit_Mode_Disabled }, diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h index f357a80b0..cebb317e0 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h @@ -18,7 +18,7 @@ RadioButtonGroup_world_edit_mode_modifier( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Default"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode_modifier WorldEdit_Modifier_Default")), WorldEdit_Modifier_Default }, + { CSz("Default"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode_modifier WorldEdit_Modifier_Default")), WorldEdit_Modifier_Default }, { CSz("Flood"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode_modifier WorldEdit_Modifier_Flood")), WorldEdit_Modifier_Flood }, { CSz("Surface"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode_modifier WorldEdit_Modifier_Surface")), WorldEdit_Modifier_Surface }, }; diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 9ec6f5377..b866be386 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -18,7 +18,7 @@ RadioButtonGroup_world_edit_tool( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Disabled"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Disabled")), WorldEdit_Tool_Disabled }, + { CSz("Disabled"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Disabled")), WorldEdit_Tool_Disabled }, { CSz("Select"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Select")), WorldEdit_Tool_Select }, { CSz("Brush"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Brush")), WorldEdit_Tool_Brush }, { CSz("Eyedropper"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Eyedropper")), WorldEdit_Tool_Eyedropper }, diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index f0dacd968..4de56d340 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -3,14 +3,14 @@ link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - /* PushTableStart(Ui); */ + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } if (Value) { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[2], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[3], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); @@ -25,14 +25,14 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_rende link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - /* PushTableStart(Ui); */ + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } if (Value) { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[2], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[3], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); @@ -47,14 +47,14 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v4 *Value, cs Name, ui_render link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - /* PushTableStart(Ui); */ + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } if (Value) { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[2], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); PushTableEnd(Ui); @@ -68,14 +68,14 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v3i *Value, cs Name, ui_rende link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - /* PushTableStart(Ui); */ + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } if (Value) { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[2], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); PushTableEnd(Ui); @@ -89,14 +89,14 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v3 *Value, cs Name, ui_render link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v2i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - /* PushTableStart(Ui); */ + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } if (Value) { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); PushTableEnd(Ui); /* PushNewRow(Ui); */ @@ -109,14 +109,14 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2i *Value, cs Name, ui_rende link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v2 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - /* PushTableStart(Ui); */ + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } if (Value) { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); PushTableEnd(Ui); /* PushNewRow(Ui); */ @@ -129,14 +129,14 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2 *Value, cs Name, ui_render link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, Quaternion *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - /* PushTableStart(Ui); */ + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } if (Value) { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[2], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[3], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); @@ -151,14 +151,14 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, Quaternion *Value, cs Name, u link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, m4 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - /* PushTableStart(Ui); */ + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } if (Value) { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[2], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[3], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 923f5c6f0..fc0411e90 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -213,9 +213,6 @@ - - - @@ -721,6 +718,8 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 5c7f2b121..7778e4fd5 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -217,11 +217,10 @@ +render_to_texture_async_params render_to_texture_async_params; -render_to_texture_async_params render_to_texture_async_params; - diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 2a0239e03..7b2d1c06c 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -217,11 +217,10 @@ +type_render_to_texture_async_params, -type_render_to_texture_async_params, - diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index 525bca6cd..944a16797 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:44:0 +// src/engine/world.h:48:0 struct octree_node_freelist { diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h index 126c3e43d..501e30fd6 100644 --- a/generated/freelist_allocator_world_chunk.h +++ b/generated/freelist_allocator_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/world.h:47:0 +// src/engine/world.h:51:0 struct world_chunk_freelist { diff --git a/generated/gen_common_vector_v2.h b/generated/gen_common_vector_v2.h index 27a186f63..ef1e619d3 100644 --- a/generated/gen_common_vector_v2.h +++ b/generated/gen_common_vector_v2.h @@ -3,7 +3,7 @@ inline r32 LengthSq( v2 Vec ) { - r32 Result = Vec.E[0]*Vec.E[0] + Vec.E[1]*Vec.E[1] ; + r32 Result = Vec.E[0]*Vec.E[0] + Vec.E[1]*Vec.E[1] ; return Result; } @@ -18,7 +18,7 @@ inline v2 Max( v2 A, v2 B ) { v2 Result; - Result.E[0] = Max( A.E[0], B.E[0] ); + Result.E[0] = Max( A.E[0], B.E[0] ); Result.E[1] = Max( A.E[1], B.E[1] ); return Result; } @@ -27,7 +27,7 @@ inline v2 Min( v2 A, v2 B ) { v2 Result; - Result.E[0] = Min( A.E[0], B.E[0] ); + Result.E[0] = Min( A.E[0], B.E[0] ); Result.E[1] = Min( A.E[1], B.E[1] ); return Result; } @@ -36,7 +36,7 @@ inline v2 Abs( v2 Vec ) { v2 Result; - Result.E[0] = (r32)Abs( Vec.E[0] ); + Result.E[0] = (r32)Abs( Vec.E[0] ); Result.E[1] = (r32)Abs( Vec.E[1] ); return Result; } @@ -46,7 +46,7 @@ inline v2 GetSign( v2 Vec ) { v2 Result; - Result.E[0] = GetSign( Vec.E[0] ); + Result.E[0] = GetSign( Vec.E[0] ); Result.E[1] = GetSign( Vec.E[1] ); return Result; } @@ -56,7 +56,7 @@ inline v2 Bilateral( v2 Vec ) { v2 Result; - Result.E[0] = Bilateral( Vec.E[0] ); + Result.E[0] = Bilateral( Vec.E[0] ); Result.E[1] = Bilateral( Vec.E[1] ); return Result; } @@ -65,7 +65,7 @@ inline v2 ClampNegative( v2 V ) { v2 Result = V; - if ( V.E[0] > r32(0) ) Result.E[0] = r32(0); + if ( V.E[0] > r32(0) ) Result.E[0] = r32(0); if ( V.E[1] > r32(0) ) Result.E[1] = r32(0); return Result; } @@ -74,7 +74,7 @@ inline v2 ClampPositive( v2 V ) { v2 Result = V; - if ( V.E[0] < r32(0) ) Result.E[0] = r32(0); + if ( V.E[0] < r32(0) ) Result.E[0] = r32(0); if ( V.E[1] < r32(0) ) Result.E[1] = r32(0); return Result; } @@ -83,7 +83,7 @@ inline v2 Clamp01( v2 V ) { v2 Result = V; - if ( V.E[0] < r32(0) ) Result.E[0] = r32(0); + if ( V.E[0] < r32(0) ) Result.E[0] = r32(0); if ( V.E[0] > r32(1) ) Result.E[0] = r32(1); if ( V.E[1] < r32(0) ) Result.E[1] = r32(0); if ( V.E[1] > r32(1) ) Result.E[1] = r32(1); diff --git a/generated/gen_common_vector_v3.h b/generated/gen_common_vector_v3.h index 6d7e76e63..d54496c2a 100644 --- a/generated/gen_common_vector_v3.h +++ b/generated/gen_common_vector_v3.h @@ -3,7 +3,7 @@ inline r32 LengthSq( v3 Vec ) { - r32 Result = Vec.E[0]*Vec.E[0] + Vec.E[1]*Vec.E[1] + Vec.E[2]*Vec.E[2] ; + r32 Result = Vec.E[0]*Vec.E[0] + Vec.E[1]*Vec.E[1] + Vec.E[2]*Vec.E[2] ; return Result; } @@ -18,7 +18,7 @@ inline v3 Max( v3 A, v3 B ) { v3 Result; - Result.E[0] = Max( A.E[0], B.E[0] ); + Result.E[0] = Max( A.E[0], B.E[0] ); Result.E[1] = Max( A.E[1], B.E[1] ); Result.E[2] = Max( A.E[2], B.E[2] ); return Result; @@ -28,7 +28,7 @@ inline v3 Min( v3 A, v3 B ) { v3 Result; - Result.E[0] = Min( A.E[0], B.E[0] ); + Result.E[0] = Min( A.E[0], B.E[0] ); Result.E[1] = Min( A.E[1], B.E[1] ); Result.E[2] = Min( A.E[2], B.E[2] ); return Result; @@ -38,7 +38,7 @@ inline v3 Abs( v3 Vec ) { v3 Result; - Result.E[0] = (r32)Abs( Vec.E[0] ); + Result.E[0] = (r32)Abs( Vec.E[0] ); Result.E[1] = (r32)Abs( Vec.E[1] ); Result.E[2] = (r32)Abs( Vec.E[2] ); return Result; @@ -49,7 +49,7 @@ inline v3 GetSign( v3 Vec ) { v3 Result; - Result.E[0] = GetSign( Vec.E[0] ); + Result.E[0] = GetSign( Vec.E[0] ); Result.E[1] = GetSign( Vec.E[1] ); Result.E[2] = GetSign( Vec.E[2] ); return Result; @@ -60,7 +60,7 @@ inline v3 Bilateral( v3 Vec ) { v3 Result; - Result.E[0] = Bilateral( Vec.E[0] ); + Result.E[0] = Bilateral( Vec.E[0] ); Result.E[1] = Bilateral( Vec.E[1] ); Result.E[2] = Bilateral( Vec.E[2] ); return Result; @@ -70,7 +70,7 @@ inline v3 ClampNegative( v3 V ) { v3 Result = V; - if ( V.E[0] > r32(0) ) Result.E[0] = r32(0); + if ( V.E[0] > r32(0) ) Result.E[0] = r32(0); if ( V.E[1] > r32(0) ) Result.E[1] = r32(0); if ( V.E[2] > r32(0) ) Result.E[2] = r32(0); return Result; @@ -80,7 +80,7 @@ inline v3 ClampPositive( v3 V ) { v3 Result = V; - if ( V.E[0] < r32(0) ) Result.E[0] = r32(0); + if ( V.E[0] < r32(0) ) Result.E[0] = r32(0); if ( V.E[1] < r32(0) ) Result.E[1] = r32(0); if ( V.E[2] < r32(0) ) Result.E[2] = r32(0); return Result; @@ -90,7 +90,7 @@ inline v3 Clamp01( v3 V ) { v3 Result = V; - if ( V.E[0] < r32(0) ) Result.E[0] = r32(0); + if ( V.E[0] < r32(0) ) Result.E[0] = r32(0); if ( V.E[0] > r32(1) ) Result.E[0] = r32(1); if ( V.E[1] < r32(0) ) Result.E[1] = r32(0); if ( V.E[1] > r32(1) ) Result.E[1] = r32(1); diff --git a/generated/gen_common_vector_v3i.h b/generated/gen_common_vector_v3i.h index 17915d817..293c04baa 100644 --- a/generated/gen_common_vector_v3i.h +++ b/generated/gen_common_vector_v3i.h @@ -3,7 +3,7 @@ inline s32 LengthSq( v3i Vec ) { - s32 Result = Vec.E[0]*Vec.E[0] + Vec.E[1]*Vec.E[1] + Vec.E[2]*Vec.E[2] ; + s32 Result = Vec.E[0]*Vec.E[0] + Vec.E[1]*Vec.E[1] + Vec.E[2]*Vec.E[2] ; return Result; } @@ -18,7 +18,7 @@ inline v3i Max( v3i A, v3i B ) { v3i Result; - Result.E[0] = Max( A.E[0], B.E[0] ); + Result.E[0] = Max( A.E[0], B.E[0] ); Result.E[1] = Max( A.E[1], B.E[1] ); Result.E[2] = Max( A.E[2], B.E[2] ); return Result; @@ -28,7 +28,7 @@ inline v3i Min( v3i A, v3i B ) { v3i Result; - Result.E[0] = Min( A.E[0], B.E[0] ); + Result.E[0] = Min( A.E[0], B.E[0] ); Result.E[1] = Min( A.E[1], B.E[1] ); Result.E[2] = Min( A.E[2], B.E[2] ); return Result; @@ -38,7 +38,7 @@ inline v3i Abs( v3i Vec ) { v3i Result; - Result.E[0] = (s32)Abs( Vec.E[0] ); + Result.E[0] = (s32)Abs( Vec.E[0] ); Result.E[1] = (s32)Abs( Vec.E[1] ); Result.E[2] = (s32)Abs( Vec.E[2] ); return Result; @@ -49,7 +49,7 @@ inline v3i GetSign( v3i Vec ) { v3i Result; - Result.E[0] = GetSign( Vec.E[0] ); + Result.E[0] = GetSign( Vec.E[0] ); Result.E[1] = GetSign( Vec.E[1] ); Result.E[2] = GetSign( Vec.E[2] ); return Result; @@ -60,7 +60,7 @@ inline v3i Bilateral( v3i Vec ) { v3i Result; - Result.E[0] = Bilateral( Vec.E[0] ); + Result.E[0] = Bilateral( Vec.E[0] ); Result.E[1] = Bilateral( Vec.E[1] ); Result.E[2] = Bilateral( Vec.E[2] ); return Result; @@ -70,7 +70,7 @@ inline v3i ClampNegative( v3i V ) { v3i Result = V; - if ( V.E[0] > s32(0) ) Result.E[0] = s32(0); + if ( V.E[0] > s32(0) ) Result.E[0] = s32(0); if ( V.E[1] > s32(0) ) Result.E[1] = s32(0); if ( V.E[2] > s32(0) ) Result.E[2] = s32(0); return Result; @@ -80,7 +80,7 @@ inline v3i ClampPositive( v3i V ) { v3i Result = V; - if ( V.E[0] < s32(0) ) Result.E[0] = s32(0); + if ( V.E[0] < s32(0) ) Result.E[0] = s32(0); if ( V.E[1] < s32(0) ) Result.E[1] = s32(0); if ( V.E[2] < s32(0) ) Result.E[2] = s32(0); return Result; @@ -90,7 +90,7 @@ inline v3i Clamp01( v3i V ) { v3i Result = V; - if ( V.E[0] < s32(0) ) Result.E[0] = s32(0); + if ( V.E[0] < s32(0) ) Result.E[0] = s32(0); if ( V.E[0] > s32(1) ) Result.E[0] = s32(1); if ( V.E[1] < s32(0) ) Result.E[1] = s32(0); if ( V.E[1] > s32(1) ) Result.E[1] = s32(1); diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index 844b1a672..8a6456a6a 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,12 +1,12 @@ // src/engine/graphics.h:51:0 link_internal gpu_readback_buffer -GpuReadbackBuffer( u32 PBO , GLsync Fence ) +GpuReadbackBuffer( u32 PBO , GLsync Fence ) { gpu_readback_buffer Reuslt = { - .PBO = PBO -, - .Fence = Fence + .PBO = PBO + +, .Fence = Fence }; diff --git a/generated/gen_constructor_perlin_params.h b/generated/gen_constructor_perlin_params.h index 2dff3a02d..a3886bf60 100644 --- a/generated/gen_constructor_perlin_params.h +++ b/generated/gen_constructor_perlin_params.h @@ -1,18 +1,18 @@ // external/bonsai_stdlib/src/perlin.h:12:0 link_internal perlin_params -PerlinParams( u32_8x P0 , u32_8x P1 , f32_8x Fract0 , f32_8x Fract1 , f32_8x Fade ) +PerlinParams( u32_8x P0 , u32_8x P1 , f32_8x Fract0 , f32_8x Fract1 , f32_8x Fade ) { perlin_params Reuslt = { - .P0 = P0 -, - .P1 = P1 + .P0 = P0 + +, .P1 = P1 , - .Fract0 = Fract0 + .Fract0 = Fract0 , - .Fract1 = Fract1 + .Fract1 = Fract1 , - .Fade = Fade + .Fade = Fade }; diff --git a/generated/gen_constructor_vertex_material.h b/generated/gen_constructor_vertex_material.h index 188e60073..5b3f33418 100644 --- a/generated/gen_constructor_vertex_material.h +++ b/generated/gen_constructor_vertex_material.h @@ -1,14 +1,14 @@ // external/bonsai_stdlib/src/mesh.h:35:0 link_internal vertex_material -VertexMaterial( u16 ColorIndex , u8 Transparency , u8 Emission ) +VertexMaterial( u16 ColorIndex , u8 Transparency , u8 Emission ) { vertex_material Reuslt = { - .ColorIndex = ColorIndex -, - .Transparency = Transparency + .ColorIndex = ColorIndex + +, .Transparency = Transparency , - .Emission = Emission + .Emission = Emission }; diff --git a/generated/gen_constructor_voxel_lighting.h b/generated/gen_constructor_voxel_lighting.h index 71e233bbc..714f441f9 100644 --- a/generated/gen_constructor_voxel_lighting.h +++ b/generated/gen_constructor_voxel_lighting.h @@ -1,10 +1,12 @@ // src/engine/world_chunk.h:125:0 link_internal voxel_lighting -VoxelLighting( u8 Emission ) +VoxelLighting( u8 Emission ) { voxel_lighting Reuslt = { - .Emission = Emission + .Emission = Emission + + }; diff --git a/generated/gen_constructor_voxel_stack_element.h b/generated/gen_constructor_voxel_stack_element.h index fc8f4fbc6..23f04be5c 100644 --- a/generated/gen_constructor_voxel_stack_element.h +++ b/generated/gen_constructor_voxel_stack_element.h @@ -1,12 +1,12 @@ // src/engine/world_update.h:32:0 link_internal voxel_stack_element -VoxelStackElement( v3i VoxSimP , voxel_rule_direction Dir ) +VoxelStackElement( v3i VoxSimP , voxel_rule_direction Dir ) { voxel_stack_element Reuslt = { - .VoxSimP = VoxSimP -, - .Dir = Dir + .VoxSimP = VoxSimP + +, .Dir = Dir }; diff --git a/generated/gen_constructor_voxel_synthesis_change_propagation_info.h b/generated/gen_constructor_voxel_synthesis_change_propagation_info.h index beb2cf292..24d08a8b6 100644 --- a/generated/gen_constructor_voxel_synthesis_change_propagation_info.h +++ b/generated/gen_constructor_voxel_synthesis_change_propagation_info.h @@ -1,14 +1,14 @@ // src/engine/voxel_synthesis.h:309:0 link_internal voxel_synthesis_change_propagation_info -VoxelSynthesisChangePropagationInfo( tile_rule PrevTileOptions , v3i PrevTileP , v3i DirOfTravel ) +VoxelSynthesisChangePropagationInfo( tile_rule PrevTileOptions , v3i PrevTileP , v3i DirOfTravel ) { voxel_synthesis_change_propagation_info Reuslt = { - .PrevTileOptions = PrevTileOptions -, - .PrevTileP = PrevTileP + .PrevTileOptions = PrevTileOptions + +, .PrevTileP = PrevTileP , - .DirOfTravel = DirOfTravel + .DirOfTravel = DirOfTravel }; diff --git a/generated/gen_default_equality_operator_tile_rule_id.h b/generated/gen_default_equality_operator_tile_rule_id.h index 382ef129b..1055c981d 100644 --- a/generated/gen_default_equality_operator_tile_rule_id.h +++ b/generated/gen_default_equality_operator_tile_rule_id.h @@ -3,7 +3,7 @@ link_internal b32 operator==( tile_rule_id E1, tile_rule_id E2 ) { - b32 Reuslt = E1.PageIndex == E2.PageIndex && E1.Bit == E2.Bit ; + b32 Reuslt = E1.PageIndex == E2.PageIndex && E1.Bit == E2.Bit ; return Reuslt; } diff --git a/generated/gen_default_equality_operator_ui_id.h b/generated/gen_default_equality_operator_ui_id.h index cdf26f088..9400f4a66 100644 --- a/generated/gen_default_equality_operator_ui_id.h +++ b/generated/gen_default_equality_operator_ui_id.h @@ -3,7 +3,7 @@ link_internal b32 operator==( ui_id E1, ui_id E2 ) { - b32 Reuslt = E1._Reserved == E2._Reserved && E1.WindowBits == E2.WindowBits && E1.InteractionBits == E2.InteractionBits && E1.ElementBits == E2.ElementBits ; + b32 Reuslt = E1._Reserved == E2._Reserved && E1.WindowBits == E2.WindowBits && E1.InteractionBits == E2.InteractionBits && E1.ElementBits == E2.ElementBits ; return Reuslt; } diff --git a/generated/gen_hetero_vector_operators_v2_v2i.h b/generated/gen_hetero_vector_operators_v2_v2i.h index 49d98f943..392355a67 100644 --- a/generated/gen_hetero_vector_operators_v2_v2i.h +++ b/generated/gen_hetero_vector_operators_v2_v2i.h @@ -4,7 +4,7 @@ inline v2 operator+( v2 P1, v2i P2 ) { v2 Result; - Result.E[0] = Cast(r32, P1.E[0] + Cast(r32, P2.E[0])); + Result.E[0] = Cast(r32, P1.E[0] + Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] + Cast(r32, P2.E[1])); return Result; } @@ -15,7 +15,7 @@ inline v2 operator-( v2 P1, v2i P2 ) { v2 Result; - Result.E[0] = Cast(r32, P1.E[0] - Cast(r32, P2.E[0])); + Result.E[0] = Cast(r32, P1.E[0] - Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] - Cast(r32, P2.E[1])); return Result; } @@ -26,7 +26,7 @@ inline v2 operator*( v2 P1, v2i P2 ) { v2 Result; - Result.E[0] = Cast(r32, P1.E[0] * Cast(r32, P2.E[0])); + Result.E[0] = Cast(r32, P1.E[0] * Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] * Cast(r32, P2.E[1])); return Result; } @@ -37,7 +37,7 @@ inline v2 operator/( v2 P1, v2i P2 ) { v2 Result; - Result.E[0] = Cast(r32, P1.E[0] / Cast(r32, P2.E[0])); + Result.E[0] = Cast(r32, P1.E[0] / Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] / Cast(r32, P2.E[1])); return Result; } diff --git a/generated/gen_hetero_vector_operators_v2i_v2.h b/generated/gen_hetero_vector_operators_v2i_v2.h index 775ef8e1c..a51c96623 100644 --- a/generated/gen_hetero_vector_operators_v2i_v2.h +++ b/generated/gen_hetero_vector_operators_v2i_v2.h @@ -4,7 +4,7 @@ inline v2i operator+( v2i P1, v2 P2 ) { v2i Result; - Result.E[0] = Cast(s32, P1.E[0] + Cast(s32, P2.E[0])); + Result.E[0] = Cast(s32, P1.E[0] + Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] + Cast(s32, P2.E[1])); return Result; } @@ -15,7 +15,7 @@ inline v2i operator-( v2i P1, v2 P2 ) { v2i Result; - Result.E[0] = Cast(s32, P1.E[0] - Cast(s32, P2.E[0])); + Result.E[0] = Cast(s32, P1.E[0] - Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] - Cast(s32, P2.E[1])); return Result; } @@ -26,7 +26,7 @@ inline v2i operator*( v2i P1, v2 P2 ) { v2i Result; - Result.E[0] = Cast(s32, P1.E[0] * Cast(s32, P2.E[0])); + Result.E[0] = Cast(s32, P1.E[0] * Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] * Cast(s32, P2.E[1])); return Result; } @@ -37,7 +37,7 @@ inline v2i operator/( v2i P1, v2 P2 ) { v2i Result; - Result.E[0] = Cast(s32, P1.E[0] / Cast(s32, P2.E[0])); + Result.E[0] = Cast(s32, P1.E[0] / Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] / Cast(s32, P2.E[1])); return Result; } diff --git a/generated/gen_hetero_vector_operators_v3_u8_v3.h b/generated/gen_hetero_vector_operators_v3_u8_v3.h index 761cf0591..0d591fd48 100644 --- a/generated/gen_hetero_vector_operators_v3_u8_v3.h +++ b/generated/gen_hetero_vector_operators_v3_u8_v3.h @@ -4,7 +4,7 @@ inline v3_u8 operator+( v3_u8 P1, v3 P2 ) { v3_u8 Result; - Result.E[0] = Cast(u8, P1.E[0] + Cast(u8, P2.E[0])); + Result.E[0] = Cast(u8, P1.E[0] + Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] + Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] + Cast(u8, P2.E[2])); return Result; @@ -16,7 +16,7 @@ inline v3_u8 operator-( v3_u8 P1, v3 P2 ) { v3_u8 Result; - Result.E[0] = Cast(u8, P1.E[0] - Cast(u8, P2.E[0])); + Result.E[0] = Cast(u8, P1.E[0] - Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] - Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] - Cast(u8, P2.E[2])); return Result; @@ -28,7 +28,7 @@ inline v3_u8 operator*( v3_u8 P1, v3 P2 ) { v3_u8 Result; - Result.E[0] = Cast(u8, P1.E[0] * Cast(u8, P2.E[0])); + Result.E[0] = Cast(u8, P1.E[0] * Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] * Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] * Cast(u8, P2.E[2])); return Result; @@ -40,7 +40,7 @@ inline v3_u8 operator/( v3_u8 P1, v3 P2 ) { v3_u8 Result; - Result.E[0] = Cast(u8, P1.E[0] / Cast(u8, P2.E[0])); + Result.E[0] = Cast(u8, P1.E[0] / Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] / Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] / Cast(u8, P2.E[2])); return Result; diff --git a/generated/gen_hetero_vector_operators_v3_u8_v3i.h b/generated/gen_hetero_vector_operators_v3_u8_v3i.h index e5977a31b..10f0d8ee0 100644 --- a/generated/gen_hetero_vector_operators_v3_u8_v3i.h +++ b/generated/gen_hetero_vector_operators_v3_u8_v3i.h @@ -4,7 +4,7 @@ inline v3_u8 operator+( v3_u8 P1, v3i P2 ) { v3_u8 Result; - Result.E[0] = Cast(u8, P1.E[0] + Cast(u8, P2.E[0])); + Result.E[0] = Cast(u8, P1.E[0] + Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] + Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] + Cast(u8, P2.E[2])); return Result; @@ -16,7 +16,7 @@ inline v3_u8 operator-( v3_u8 P1, v3i P2 ) { v3_u8 Result; - Result.E[0] = Cast(u8, P1.E[0] - Cast(u8, P2.E[0])); + Result.E[0] = Cast(u8, P1.E[0] - Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] - Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] - Cast(u8, P2.E[2])); return Result; @@ -28,7 +28,7 @@ inline v3_u8 operator*( v3_u8 P1, v3i P2 ) { v3_u8 Result; - Result.E[0] = Cast(u8, P1.E[0] * Cast(u8, P2.E[0])); + Result.E[0] = Cast(u8, P1.E[0] * Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] * Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] * Cast(u8, P2.E[2])); return Result; @@ -40,7 +40,7 @@ inline v3_u8 operator/( v3_u8 P1, v3i P2 ) { v3_u8 Result; - Result.E[0] = Cast(u8, P1.E[0] / Cast(u8, P2.E[0])); + Result.E[0] = Cast(u8, P1.E[0] / Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] / Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] / Cast(u8, P2.E[2])); return Result; diff --git a/generated/gen_hetero_vector_operators_v3_v3i.h b/generated/gen_hetero_vector_operators_v3_v3i.h index fbd0644cc..18ba501f2 100644 --- a/generated/gen_hetero_vector_operators_v3_v3i.h +++ b/generated/gen_hetero_vector_operators_v3_v3i.h @@ -4,7 +4,7 @@ inline v3 operator+( v3 P1, v3i P2 ) { v3 Result; - Result.E[0] = Cast(r32, P1.E[0] + Cast(r32, P2.E[0])); + Result.E[0] = Cast(r32, P1.E[0] + Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] + Cast(r32, P2.E[1])); Result.E[2] = Cast(r32, P1.E[2] + Cast(r32, P2.E[2])); return Result; @@ -16,7 +16,7 @@ inline v3 operator-( v3 P1, v3i P2 ) { v3 Result; - Result.E[0] = Cast(r32, P1.E[0] - Cast(r32, P2.E[0])); + Result.E[0] = Cast(r32, P1.E[0] - Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] - Cast(r32, P2.E[1])); Result.E[2] = Cast(r32, P1.E[2] - Cast(r32, P2.E[2])); return Result; @@ -28,7 +28,7 @@ inline v3 operator*( v3 P1, v3i P2 ) { v3 Result; - Result.E[0] = Cast(r32, P1.E[0] * Cast(r32, P2.E[0])); + Result.E[0] = Cast(r32, P1.E[0] * Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] * Cast(r32, P2.E[1])); Result.E[2] = Cast(r32, P1.E[2] * Cast(r32, P2.E[2])); return Result; @@ -40,7 +40,7 @@ inline v3 operator/( v3 P1, v3i P2 ) { v3 Result; - Result.E[0] = Cast(r32, P1.E[0] / Cast(r32, P2.E[0])); + Result.E[0] = Cast(r32, P1.E[0] / Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] / Cast(r32, P2.E[1])); Result.E[2] = Cast(r32, P1.E[2] / Cast(r32, P2.E[2])); return Result; diff --git a/generated/gen_hetero_vector_operators_v3i_v3.h b/generated/gen_hetero_vector_operators_v3i_v3.h index 947fcbf96..547146241 100644 --- a/generated/gen_hetero_vector_operators_v3i_v3.h +++ b/generated/gen_hetero_vector_operators_v3i_v3.h @@ -4,7 +4,7 @@ inline v3i operator+( v3i P1, v3 P2 ) { v3i Result; - Result.E[0] = Cast(s32, P1.E[0] + Cast(s32, P2.E[0])); + Result.E[0] = Cast(s32, P1.E[0] + Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] + Cast(s32, P2.E[1])); Result.E[2] = Cast(s32, P1.E[2] + Cast(s32, P2.E[2])); return Result; @@ -16,7 +16,7 @@ inline v3i operator-( v3i P1, v3 P2 ) { v3i Result; - Result.E[0] = Cast(s32, P1.E[0] - Cast(s32, P2.E[0])); + Result.E[0] = Cast(s32, P1.E[0] - Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] - Cast(s32, P2.E[1])); Result.E[2] = Cast(s32, P1.E[2] - Cast(s32, P2.E[2])); return Result; @@ -28,7 +28,7 @@ inline v3i operator*( v3i P1, v3 P2 ) { v3i Result; - Result.E[0] = Cast(s32, P1.E[0] * Cast(s32, P2.E[0])); + Result.E[0] = Cast(s32, P1.E[0] * Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] * Cast(s32, P2.E[1])); Result.E[2] = Cast(s32, P1.E[2] * Cast(s32, P2.E[2])); return Result; @@ -40,7 +40,7 @@ inline v3i operator/( v3i P1, v3 P2 ) { v3i Result; - Result.E[0] = Cast(s32, P1.E[0] / Cast(s32, P2.E[0])); + Result.E[0] = Cast(s32, P1.E[0] / Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] / Cast(s32, P2.E[1])); Result.E[2] = Cast(s32, P1.E[2] / Cast(s32, P2.E[2])); return Result; diff --git a/generated/gen_vector_area_v2.h b/generated/gen_vector_area_v2.h index 5a01ba207..9381e3004 100644 --- a/generated/gen_vector_area_v2.h +++ b/generated/gen_vector_area_v2.h @@ -5,7 +5,7 @@ Area( v2 Vec ) { Assert(Vec.x > 0); Assert(Vec.y > 0); - r32 Result = Vec.E[0] * Vec.E[1] ; + r32 Result = Vec.E[0] * Vec.E[1] ; return Result; } diff --git a/generated/gen_vector_area_v2i.h b/generated/gen_vector_area_v2i.h index 57c0e4fce..315e614ca 100644 --- a/generated/gen_vector_area_v2i.h +++ b/generated/gen_vector_area_v2i.h @@ -5,7 +5,7 @@ Area( v2i Vec ) { Assert(Vec.x > 0); Assert(Vec.y > 0); - s32 Result = Vec.E[0] * Vec.E[1] ; + s32 Result = Vec.E[0] * Vec.E[1] ; return Result; } diff --git a/generated/gen_vector_infix_operator_v3i_688856393.h b/generated/gen_vector_infix_operator_v3i_688856393.h index 634e0f98e..0807d1bf8 100644 --- a/generated/gen_vector_infix_operator_v3i_688856393.h +++ b/generated/gen_vector_infix_operator_v3i_688856393.h @@ -4,7 +4,7 @@ inline v3i operator&( v3i P1, v3i P2 ) { v3i Result = { - .E[0] = P1.E[0] & P2.E[0], + .E[0] = P1.E[0] & P2.E[0], .E[1] = P1.E[1] & P2.E[1], .E[2] = P1.E[2] & P2.E[2], }; diff --git a/generated/gen_vector_infix_operator_v3i_688856449.h b/generated/gen_vector_infix_operator_v3i_688856449.h index 6085bbf5c..8b2815373 100644 --- a/generated/gen_vector_infix_operator_v3i_688856449.h +++ b/generated/gen_vector_infix_operator_v3i_688856449.h @@ -4,7 +4,7 @@ inline v3i operator^( v3i P1, v3i P2 ) { v3i Result = { - .E[0] = P1.E[0] ^ P2.E[0], + .E[0] = P1.E[0] ^ P2.E[0], .E[1] = P1.E[1] ^ P2.E[1], .E[2] = P1.E[2] ^ P2.E[2], }; diff --git a/generated/gen_vector_operators_v2.h b/generated/gen_vector_operators_v2.h index 7b3cde9dc..8bd253e1a 100644 --- a/generated/gen_vector_operators_v2.h +++ b/generated/gen_vector_operators_v2.h @@ -9,7 +9,7 @@ DeepCopy(v2 *Src, v2 *Dest) inline b32 operator==( v2 P1, v2 P2 ) { - b32 Result = ( P1.E[0] == P2.E[0] && P1.E[1] == P2.E[1] ); + b32 Result = ( P1.E[0] == P2.E[0] && P1.E[1] == P2.E[1] ); return Result; } @@ -36,7 +36,7 @@ operator!=( v2 P1, v2 P2 ) inline b32 operator<( v2 P1, v2 P2 ) { - b32 Result = ( P1.E[0] < P2.E[0] && P1.E[1] < P2.E[1] ); + b32 Result = ( P1.E[0] < P2.E[0] && P1.E[1] < P2.E[1] ); return Result; } @@ -44,7 +44,7 @@ operator<( v2 P1, v2 P2 ) inline b32 operator<=( v2 P1, v2 P2 ) { - b32 Result = ( P1.E[0] <= P2.E[0] && P1.E[1] <= P2.E[1] ); + b32 Result = ( P1.E[0] <= P2.E[0] && P1.E[1] <= P2.E[1] ); return Result; } @@ -52,7 +52,7 @@ operator<=( v2 P1, v2 P2 ) inline b32 operator>( v2 P1, v2 P2 ) { - b32 Result = ( P1.E[0] > P2.E[0] && P1.E[1] > P2.E[1] ); + b32 Result = ( P1.E[0] > P2.E[0] && P1.E[1] > P2.E[1] ); return Result; } @@ -60,7 +60,7 @@ operator>( v2 P1, v2 P2 ) inline b32 operator>=( v2 P1, v2 P2 ) { - b32 Result = ( P1.E[0] >= P2.E[0] && P1.E[1] >= P2.E[1] ); + b32 Result = ( P1.E[0] >= P2.E[0] && P1.E[1] >= P2.E[1] ); return Result; } @@ -69,7 +69,7 @@ inline v2 operator+( v2 P1, v2 P2 ) { v2 Result = {{ - Cast(r32, P1.E[0] + P2.E[0]), + Cast(r32, P1.E[0] + P2.E[0]), Cast(r32, P1.E[1] + P2.E[1]), }}; return Result; @@ -79,7 +79,7 @@ inline v2 operator+( v2 P1, r32 Scalar ) { v2 Result = {{ - Cast(r32, P1.E[0] + Scalar), + Cast(r32, P1.E[0] + Scalar), Cast(r32, P1.E[1] + Scalar), }}; return Result; @@ -89,7 +89,7 @@ inline v2 operator+( r32 Scalar, v2 P1 ) { v2 Result = {{ - Cast(r32, Scalar + P1.E[0]), + Cast(r32, Scalar + P1.E[0]), Cast(r32, Scalar + P1.E[1]), }}; return Result; @@ -101,7 +101,7 @@ inline v2 operator-( v2 P1, v2 P2 ) { v2 Result = {{ - Cast(r32, P1.E[0] - P2.E[0]), + Cast(r32, P1.E[0] - P2.E[0]), Cast(r32, P1.E[1] - P2.E[1]), }}; return Result; @@ -111,7 +111,7 @@ inline v2 operator-( v2 P1, r32 Scalar ) { v2 Result = {{ - Cast(r32, P1.E[0] - Scalar), + Cast(r32, P1.E[0] - Scalar), Cast(r32, P1.E[1] - Scalar), }}; return Result; @@ -121,7 +121,7 @@ inline v2 operator-( r32 Scalar, v2 P1 ) { v2 Result = {{ - Cast(r32, Scalar - P1.E[0]), + Cast(r32, Scalar - P1.E[0]), Cast(r32, Scalar - P1.E[1]), }}; return Result; @@ -133,7 +133,7 @@ inline v2 operator*( v2 P1, v2 P2 ) { v2 Result = {{ - Cast(r32, P1.E[0] * P2.E[0]), + Cast(r32, P1.E[0] * P2.E[0]), Cast(r32, P1.E[1] * P2.E[1]), }}; return Result; @@ -143,7 +143,7 @@ inline v2 operator*( v2 P1, r32 Scalar ) { v2 Result = {{ - Cast(r32, P1.E[0] * Scalar), + Cast(r32, P1.E[0] * Scalar), Cast(r32, P1.E[1] * Scalar), }}; return Result; @@ -153,7 +153,7 @@ inline v2 operator*( r32 Scalar, v2 P1 ) { v2 Result = {{ - Cast(r32, Scalar * P1.E[0]), + Cast(r32, Scalar * P1.E[0]), Cast(r32, Scalar * P1.E[1]), }}; return Result; @@ -165,7 +165,7 @@ inline v2 operator/( v2 P1, v2 P2 ) { v2 Result = {{ - Cast(r32, P1.E[0] / P2.E[0]), + Cast(r32, P1.E[0] / P2.E[0]), Cast(r32, P1.E[1] / P2.E[1]), }}; return Result; @@ -175,7 +175,7 @@ inline v2 operator/( v2 P1, r32 Scalar ) { v2 Result = {{ - Cast(r32, P1.E[0] / Scalar), + Cast(r32, P1.E[0] / Scalar), Cast(r32, P1.E[1] / Scalar), }}; return Result; @@ -185,7 +185,7 @@ inline v2 operator/( r32 Scalar, v2 P1 ) { v2 Result = {{ - Cast(r32, Scalar / P1.E[0]), + Cast(r32, Scalar / P1.E[0]), Cast(r32, Scalar / P1.E[1]), }}; return Result; @@ -196,7 +196,7 @@ operator/( r32 Scalar, v2 P1 ) inline v2 & operator+=( v2 &P1, v2 P2 ) { - P1.E[0] += P2.E[0]; + P1.E[0] += P2.E[0]; P1.E[1] += P2.E[1]; return P1; } @@ -204,7 +204,7 @@ operator+=( v2 &P1, v2 P2 ) inline v2 & operator+=( v2 &P1, r32 Scalar ) { - P1.E[0] += Scalar; + P1.E[0] += Scalar; P1.E[1] += Scalar; return P1; } @@ -213,7 +213,7 @@ operator+=( v2 &P1, r32 Scalar ) inline v2 & operator-=( v2 &P1, v2 P2 ) { - P1.E[0] -= P2.E[0]; + P1.E[0] -= P2.E[0]; P1.E[1] -= P2.E[1]; return P1; } @@ -221,7 +221,7 @@ operator-=( v2 &P1, v2 P2 ) inline v2 & operator-=( v2 &P1, r32 Scalar ) { - P1.E[0] -= Scalar; + P1.E[0] -= Scalar; P1.E[1] -= Scalar; return P1; } @@ -230,7 +230,7 @@ operator-=( v2 &P1, r32 Scalar ) inline v2 & operator*=( v2 &P1, v2 P2 ) { - P1.E[0] *= P2.E[0]; + P1.E[0] *= P2.E[0]; P1.E[1] *= P2.E[1]; return P1; } @@ -238,7 +238,7 @@ operator*=( v2 &P1, v2 P2 ) inline v2 & operator*=( v2 &P1, r32 Scalar ) { - P1.E[0] *= Scalar; + P1.E[0] *= Scalar; P1.E[1] *= Scalar; return P1; } @@ -247,7 +247,7 @@ operator*=( v2 &P1, r32 Scalar ) inline v2 & operator/=( v2 &P1, v2 P2 ) { - P1.E[0] /= P2.E[0]; + P1.E[0] /= P2.E[0]; P1.E[1] /= P2.E[1]; return P1; } @@ -255,7 +255,7 @@ operator/=( v2 &P1, v2 P2 ) inline v2 & operator/=( v2 &P1, r32 Scalar ) { - P1.E[0] /= Scalar; + P1.E[0] /= Scalar; P1.E[1] /= Scalar; return P1; } diff --git a/generated/gen_vector_operators_v2i.h b/generated/gen_vector_operators_v2i.h index 6ff5a96a7..ee389caaf 100644 --- a/generated/gen_vector_operators_v2i.h +++ b/generated/gen_vector_operators_v2i.h @@ -9,7 +9,7 @@ DeepCopy(v2i *Src, v2i *Dest) inline b32 operator==( v2i P1, v2i P2 ) { - b32 Result = ( P1.E[0] == P2.E[0] && P1.E[1] == P2.E[1] ); + b32 Result = ( P1.E[0] == P2.E[0] && P1.E[1] == P2.E[1] ); return Result; } @@ -36,7 +36,7 @@ operator!=( v2i P1, v2i P2 ) inline b32 operator<( v2i P1, v2i P2 ) { - b32 Result = ( P1.E[0] < P2.E[0] && P1.E[1] < P2.E[1] ); + b32 Result = ( P1.E[0] < P2.E[0] && P1.E[1] < P2.E[1] ); return Result; } @@ -44,7 +44,7 @@ operator<( v2i P1, v2i P2 ) inline b32 operator<=( v2i P1, v2i P2 ) { - b32 Result = ( P1.E[0] <= P2.E[0] && P1.E[1] <= P2.E[1] ); + b32 Result = ( P1.E[0] <= P2.E[0] && P1.E[1] <= P2.E[1] ); return Result; } @@ -52,7 +52,7 @@ operator<=( v2i P1, v2i P2 ) inline b32 operator>( v2i P1, v2i P2 ) { - b32 Result = ( P1.E[0] > P2.E[0] && P1.E[1] > P2.E[1] ); + b32 Result = ( P1.E[0] > P2.E[0] && P1.E[1] > P2.E[1] ); return Result; } @@ -60,7 +60,7 @@ operator>( v2i P1, v2i P2 ) inline b32 operator>=( v2i P1, v2i P2 ) { - b32 Result = ( P1.E[0] >= P2.E[0] && P1.E[1] >= P2.E[1] ); + b32 Result = ( P1.E[0] >= P2.E[0] && P1.E[1] >= P2.E[1] ); return Result; } @@ -69,7 +69,7 @@ inline v2i operator+( v2i P1, v2i P2 ) { v2i Result = {{ - Cast(s32, P1.E[0] + P2.E[0]), + Cast(s32, P1.E[0] + P2.E[0]), Cast(s32, P1.E[1] + P2.E[1]), }}; return Result; @@ -79,7 +79,7 @@ inline v2i operator+( v2i P1, s32 Scalar ) { v2i Result = {{ - Cast(s32, P1.E[0] + Scalar), + Cast(s32, P1.E[0] + Scalar), Cast(s32, P1.E[1] + Scalar), }}; return Result; @@ -89,7 +89,7 @@ inline v2i operator+( s32 Scalar, v2i P1 ) { v2i Result = {{ - Cast(s32, Scalar + P1.E[0]), + Cast(s32, Scalar + P1.E[0]), Cast(s32, Scalar + P1.E[1]), }}; return Result; @@ -101,7 +101,7 @@ inline v2i operator-( v2i P1, v2i P2 ) { v2i Result = {{ - Cast(s32, P1.E[0] - P2.E[0]), + Cast(s32, P1.E[0] - P2.E[0]), Cast(s32, P1.E[1] - P2.E[1]), }}; return Result; @@ -111,7 +111,7 @@ inline v2i operator-( v2i P1, s32 Scalar ) { v2i Result = {{ - Cast(s32, P1.E[0] - Scalar), + Cast(s32, P1.E[0] - Scalar), Cast(s32, P1.E[1] - Scalar), }}; return Result; @@ -121,7 +121,7 @@ inline v2i operator-( s32 Scalar, v2i P1 ) { v2i Result = {{ - Cast(s32, Scalar - P1.E[0]), + Cast(s32, Scalar - P1.E[0]), Cast(s32, Scalar - P1.E[1]), }}; return Result; @@ -133,7 +133,7 @@ inline v2i operator*( v2i P1, v2i P2 ) { v2i Result = {{ - Cast(s32, P1.E[0] * P2.E[0]), + Cast(s32, P1.E[0] * P2.E[0]), Cast(s32, P1.E[1] * P2.E[1]), }}; return Result; @@ -143,7 +143,7 @@ inline v2i operator*( v2i P1, s32 Scalar ) { v2i Result = {{ - Cast(s32, P1.E[0] * Scalar), + Cast(s32, P1.E[0] * Scalar), Cast(s32, P1.E[1] * Scalar), }}; return Result; @@ -153,7 +153,7 @@ inline v2i operator*( s32 Scalar, v2i P1 ) { v2i Result = {{ - Cast(s32, Scalar * P1.E[0]), + Cast(s32, Scalar * P1.E[0]), Cast(s32, Scalar * P1.E[1]), }}; return Result; @@ -165,7 +165,7 @@ inline v2i operator/( v2i P1, v2i P2 ) { v2i Result = {{ - Cast(s32, P1.E[0] / P2.E[0]), + Cast(s32, P1.E[0] / P2.E[0]), Cast(s32, P1.E[1] / P2.E[1]), }}; return Result; @@ -175,7 +175,7 @@ inline v2i operator/( v2i P1, s32 Scalar ) { v2i Result = {{ - Cast(s32, P1.E[0] / Scalar), + Cast(s32, P1.E[0] / Scalar), Cast(s32, P1.E[1] / Scalar), }}; return Result; @@ -185,7 +185,7 @@ inline v2i operator/( s32 Scalar, v2i P1 ) { v2i Result = {{ - Cast(s32, Scalar / P1.E[0]), + Cast(s32, Scalar / P1.E[0]), Cast(s32, Scalar / P1.E[1]), }}; return Result; @@ -196,7 +196,7 @@ operator/( s32 Scalar, v2i P1 ) inline v2i & operator+=( v2i &P1, v2i P2 ) { - P1.E[0] += P2.E[0]; + P1.E[0] += P2.E[0]; P1.E[1] += P2.E[1]; return P1; } @@ -204,7 +204,7 @@ operator+=( v2i &P1, v2i P2 ) inline v2i & operator+=( v2i &P1, s32 Scalar ) { - P1.E[0] += Scalar; + P1.E[0] += Scalar; P1.E[1] += Scalar; return P1; } @@ -213,7 +213,7 @@ operator+=( v2i &P1, s32 Scalar ) inline v2i & operator-=( v2i &P1, v2i P2 ) { - P1.E[0] -= P2.E[0]; + P1.E[0] -= P2.E[0]; P1.E[1] -= P2.E[1]; return P1; } @@ -221,7 +221,7 @@ operator-=( v2i &P1, v2i P2 ) inline v2i & operator-=( v2i &P1, s32 Scalar ) { - P1.E[0] -= Scalar; + P1.E[0] -= Scalar; P1.E[1] -= Scalar; return P1; } @@ -230,7 +230,7 @@ operator-=( v2i &P1, s32 Scalar ) inline v2i & operator*=( v2i &P1, v2i P2 ) { - P1.E[0] *= P2.E[0]; + P1.E[0] *= P2.E[0]; P1.E[1] *= P2.E[1]; return P1; } @@ -238,7 +238,7 @@ operator*=( v2i &P1, v2i P2 ) inline v2i & operator*=( v2i &P1, s32 Scalar ) { - P1.E[0] *= Scalar; + P1.E[0] *= Scalar; P1.E[1] *= Scalar; return P1; } @@ -247,7 +247,7 @@ operator*=( v2i &P1, s32 Scalar ) inline v2i & operator/=( v2i &P1, v2i P2 ) { - P1.E[0] /= P2.E[0]; + P1.E[0] /= P2.E[0]; P1.E[1] /= P2.E[1]; return P1; } @@ -255,7 +255,7 @@ operator/=( v2i &P1, v2i P2 ) inline v2i & operator/=( v2i &P1, s32 Scalar ) { - P1.E[0] /= Scalar; + P1.E[0] /= Scalar; P1.E[1] /= Scalar; return P1; } diff --git a/generated/gen_vector_operators_v3.h b/generated/gen_vector_operators_v3.h index e0271c9b5..c680b5b0c 100644 --- a/generated/gen_vector_operators_v3.h +++ b/generated/gen_vector_operators_v3.h @@ -9,7 +9,7 @@ DeepCopy(v3 *Src, v3 *Dest) inline b32 operator==( v3 P1, v3 P2 ) { - b32 Result = ( P1.E[0] == P2.E[0] && P1.E[1] == P2.E[1] && P1.E[2] == P2.E[2] ); + b32 Result = ( P1.E[0] == P2.E[0] && P1.E[1] == P2.E[1] && P1.E[2] == P2.E[2] ); return Result; } @@ -36,7 +36,7 @@ operator!=( v3 P1, v3 P2 ) inline b32 operator<( v3 P1, v3 P2 ) { - b32 Result = ( P1.E[0] < P2.E[0] && P1.E[1] < P2.E[1] && P1.E[2] < P2.E[2] ); + b32 Result = ( P1.E[0] < P2.E[0] && P1.E[1] < P2.E[1] && P1.E[2] < P2.E[2] ); return Result; } @@ -44,7 +44,7 @@ operator<( v3 P1, v3 P2 ) inline b32 operator<=( v3 P1, v3 P2 ) { - b32 Result = ( P1.E[0] <= P2.E[0] && P1.E[1] <= P2.E[1] && P1.E[2] <= P2.E[2] ); + b32 Result = ( P1.E[0] <= P2.E[0] && P1.E[1] <= P2.E[1] && P1.E[2] <= P2.E[2] ); return Result; } @@ -52,7 +52,7 @@ operator<=( v3 P1, v3 P2 ) inline b32 operator>( v3 P1, v3 P2 ) { - b32 Result = ( P1.E[0] > P2.E[0] && P1.E[1] > P2.E[1] && P1.E[2] > P2.E[2] ); + b32 Result = ( P1.E[0] > P2.E[0] && P1.E[1] > P2.E[1] && P1.E[2] > P2.E[2] ); return Result; } @@ -60,7 +60,7 @@ operator>( v3 P1, v3 P2 ) inline b32 operator>=( v3 P1, v3 P2 ) { - b32 Result = ( P1.E[0] >= P2.E[0] && P1.E[1] >= P2.E[1] && P1.E[2] >= P2.E[2] ); + b32 Result = ( P1.E[0] >= P2.E[0] && P1.E[1] >= P2.E[1] && P1.E[2] >= P2.E[2] ); return Result; } @@ -69,7 +69,7 @@ inline v3 operator+( v3 P1, v3 P2 ) { v3 Result = {{ - Cast(r32, P1.E[0] + P2.E[0]), + Cast(r32, P1.E[0] + P2.E[0]), Cast(r32, P1.E[1] + P2.E[1]), Cast(r32, P1.E[2] + P2.E[2]), }}; @@ -80,7 +80,7 @@ inline v3 operator+( v3 P1, r32 Scalar ) { v3 Result = {{ - Cast(r32, P1.E[0] + Scalar), + Cast(r32, P1.E[0] + Scalar), Cast(r32, P1.E[1] + Scalar), Cast(r32, P1.E[2] + Scalar), }}; @@ -91,7 +91,7 @@ inline v3 operator+( r32 Scalar, v3 P1 ) { v3 Result = {{ - Cast(r32, Scalar + P1.E[0]), + Cast(r32, Scalar + P1.E[0]), Cast(r32, Scalar + P1.E[1]), Cast(r32, Scalar + P1.E[2]), }}; @@ -104,7 +104,7 @@ inline v3 operator-( v3 P1, v3 P2 ) { v3 Result = {{ - Cast(r32, P1.E[0] - P2.E[0]), + Cast(r32, P1.E[0] - P2.E[0]), Cast(r32, P1.E[1] - P2.E[1]), Cast(r32, P1.E[2] - P2.E[2]), }}; @@ -115,7 +115,7 @@ inline v3 operator-( v3 P1, r32 Scalar ) { v3 Result = {{ - Cast(r32, P1.E[0] - Scalar), + Cast(r32, P1.E[0] - Scalar), Cast(r32, P1.E[1] - Scalar), Cast(r32, P1.E[2] - Scalar), }}; @@ -126,7 +126,7 @@ inline v3 operator-( r32 Scalar, v3 P1 ) { v3 Result = {{ - Cast(r32, Scalar - P1.E[0]), + Cast(r32, Scalar - P1.E[0]), Cast(r32, Scalar - P1.E[1]), Cast(r32, Scalar - P1.E[2]), }}; @@ -139,7 +139,7 @@ inline v3 operator*( v3 P1, v3 P2 ) { v3 Result = {{ - Cast(r32, P1.E[0] * P2.E[0]), + Cast(r32, P1.E[0] * P2.E[0]), Cast(r32, P1.E[1] * P2.E[1]), Cast(r32, P1.E[2] * P2.E[2]), }}; @@ -150,7 +150,7 @@ inline v3 operator*( v3 P1, r32 Scalar ) { v3 Result = {{ - Cast(r32, P1.E[0] * Scalar), + Cast(r32, P1.E[0] * Scalar), Cast(r32, P1.E[1] * Scalar), Cast(r32, P1.E[2] * Scalar), }}; @@ -161,7 +161,7 @@ inline v3 operator*( r32 Scalar, v3 P1 ) { v3 Result = {{ - Cast(r32, Scalar * P1.E[0]), + Cast(r32, Scalar * P1.E[0]), Cast(r32, Scalar * P1.E[1]), Cast(r32, Scalar * P1.E[2]), }}; @@ -174,7 +174,7 @@ inline v3 operator/( v3 P1, v3 P2 ) { v3 Result = {{ - Cast(r32, P1.E[0] / P2.E[0]), + Cast(r32, P1.E[0] / P2.E[0]), Cast(r32, P1.E[1] / P2.E[1]), Cast(r32, P1.E[2] / P2.E[2]), }}; @@ -185,7 +185,7 @@ inline v3 operator/( v3 P1, r32 Scalar ) { v3 Result = {{ - Cast(r32, P1.E[0] / Scalar), + Cast(r32, P1.E[0] / Scalar), Cast(r32, P1.E[1] / Scalar), Cast(r32, P1.E[2] / Scalar), }}; @@ -196,7 +196,7 @@ inline v3 operator/( r32 Scalar, v3 P1 ) { v3 Result = {{ - Cast(r32, Scalar / P1.E[0]), + Cast(r32, Scalar / P1.E[0]), Cast(r32, Scalar / P1.E[1]), Cast(r32, Scalar / P1.E[2]), }}; @@ -208,7 +208,7 @@ operator/( r32 Scalar, v3 P1 ) inline v3 & operator+=( v3 &P1, v3 P2 ) { - P1.E[0] += P2.E[0]; + P1.E[0] += P2.E[0]; P1.E[1] += P2.E[1]; P1.E[2] += P2.E[2]; return P1; @@ -217,7 +217,7 @@ operator+=( v3 &P1, v3 P2 ) inline v3 & operator+=( v3 &P1, r32 Scalar ) { - P1.E[0] += Scalar; + P1.E[0] += Scalar; P1.E[1] += Scalar; P1.E[2] += Scalar; return P1; @@ -227,7 +227,7 @@ operator+=( v3 &P1, r32 Scalar ) inline v3 & operator-=( v3 &P1, v3 P2 ) { - P1.E[0] -= P2.E[0]; + P1.E[0] -= P2.E[0]; P1.E[1] -= P2.E[1]; P1.E[2] -= P2.E[2]; return P1; @@ -236,7 +236,7 @@ operator-=( v3 &P1, v3 P2 ) inline v3 & operator-=( v3 &P1, r32 Scalar ) { - P1.E[0] -= Scalar; + P1.E[0] -= Scalar; P1.E[1] -= Scalar; P1.E[2] -= Scalar; return P1; @@ -246,7 +246,7 @@ operator-=( v3 &P1, r32 Scalar ) inline v3 & operator*=( v3 &P1, v3 P2 ) { - P1.E[0] *= P2.E[0]; + P1.E[0] *= P2.E[0]; P1.E[1] *= P2.E[1]; P1.E[2] *= P2.E[2]; return P1; @@ -255,7 +255,7 @@ operator*=( v3 &P1, v3 P2 ) inline v3 & operator*=( v3 &P1, r32 Scalar ) { - P1.E[0] *= Scalar; + P1.E[0] *= Scalar; P1.E[1] *= Scalar; P1.E[2] *= Scalar; return P1; @@ -265,7 +265,7 @@ operator*=( v3 &P1, r32 Scalar ) inline v3 & operator/=( v3 &P1, v3 P2 ) { - P1.E[0] /= P2.E[0]; + P1.E[0] /= P2.E[0]; P1.E[1] /= P2.E[1]; P1.E[2] /= P2.E[2]; return P1; @@ -274,7 +274,7 @@ operator/=( v3 &P1, v3 P2 ) inline v3 & operator/=( v3 &P1, r32 Scalar ) { - P1.E[0] /= Scalar; + P1.E[0] /= Scalar; P1.E[1] /= Scalar; P1.E[2] /= Scalar; return P1; diff --git a/generated/gen_vector_operators_v3_u8.h b/generated/gen_vector_operators_v3_u8.h index 0c2d43420..f55789260 100644 --- a/generated/gen_vector_operators_v3_u8.h +++ b/generated/gen_vector_operators_v3_u8.h @@ -9,7 +9,7 @@ DeepCopy(v3_u8 *Src, v3_u8 *Dest) inline b32 operator==( v3_u8 P1, v3_u8 P2 ) { - b32 Result = ( P1.E[0] == P2.E[0] && P1.E[1] == P2.E[1] && P1.E[2] == P2.E[2] ); + b32 Result = ( P1.E[0] == P2.E[0] && P1.E[1] == P2.E[1] && P1.E[2] == P2.E[2] ); return Result; } @@ -36,7 +36,7 @@ operator!=( v3_u8 P1, v3_u8 P2 ) inline b32 operator<( v3_u8 P1, v3_u8 P2 ) { - b32 Result = ( P1.E[0] < P2.E[0] && P1.E[1] < P2.E[1] && P1.E[2] < P2.E[2] ); + b32 Result = ( P1.E[0] < P2.E[0] && P1.E[1] < P2.E[1] && P1.E[2] < P2.E[2] ); return Result; } @@ -44,7 +44,7 @@ operator<( v3_u8 P1, v3_u8 P2 ) inline b32 operator<=( v3_u8 P1, v3_u8 P2 ) { - b32 Result = ( P1.E[0] <= P2.E[0] && P1.E[1] <= P2.E[1] && P1.E[2] <= P2.E[2] ); + b32 Result = ( P1.E[0] <= P2.E[0] && P1.E[1] <= P2.E[1] && P1.E[2] <= P2.E[2] ); return Result; } @@ -52,7 +52,7 @@ operator<=( v3_u8 P1, v3_u8 P2 ) inline b32 operator>( v3_u8 P1, v3_u8 P2 ) { - b32 Result = ( P1.E[0] > P2.E[0] && P1.E[1] > P2.E[1] && P1.E[2] > P2.E[2] ); + b32 Result = ( P1.E[0] > P2.E[0] && P1.E[1] > P2.E[1] && P1.E[2] > P2.E[2] ); return Result; } @@ -60,7 +60,7 @@ operator>( v3_u8 P1, v3_u8 P2 ) inline b32 operator>=( v3_u8 P1, v3_u8 P2 ) { - b32 Result = ( P1.E[0] >= P2.E[0] && P1.E[1] >= P2.E[1] && P1.E[2] >= P2.E[2] ); + b32 Result = ( P1.E[0] >= P2.E[0] && P1.E[1] >= P2.E[1] && P1.E[2] >= P2.E[2] ); return Result; } @@ -69,7 +69,7 @@ inline v3_u8 operator+( v3_u8 P1, v3_u8 P2 ) { v3_u8 Result = {{ - Cast(u8, P1.E[0] + P2.E[0]), + Cast(u8, P1.E[0] + P2.E[0]), Cast(u8, P1.E[1] + P2.E[1]), Cast(u8, P1.E[2] + P2.E[2]), }}; @@ -80,7 +80,7 @@ inline v3_u8 operator+( v3_u8 P1, u8 Scalar ) { v3_u8 Result = {{ - Cast(u8, P1.E[0] + Scalar), + Cast(u8, P1.E[0] + Scalar), Cast(u8, P1.E[1] + Scalar), Cast(u8, P1.E[2] + Scalar), }}; @@ -91,7 +91,7 @@ inline v3_u8 operator+( u8 Scalar, v3_u8 P1 ) { v3_u8 Result = {{ - Cast(u8, Scalar + P1.E[0]), + Cast(u8, Scalar + P1.E[0]), Cast(u8, Scalar + P1.E[1]), Cast(u8, Scalar + P1.E[2]), }}; @@ -104,7 +104,7 @@ inline v3_u8 operator-( v3_u8 P1, v3_u8 P2 ) { v3_u8 Result = {{ - Cast(u8, P1.E[0] - P2.E[0]), + Cast(u8, P1.E[0] - P2.E[0]), Cast(u8, P1.E[1] - P2.E[1]), Cast(u8, P1.E[2] - P2.E[2]), }}; @@ -115,7 +115,7 @@ inline v3_u8 operator-( v3_u8 P1, u8 Scalar ) { v3_u8 Result = {{ - Cast(u8, P1.E[0] - Scalar), + Cast(u8, P1.E[0] - Scalar), Cast(u8, P1.E[1] - Scalar), Cast(u8, P1.E[2] - Scalar), }}; @@ -126,7 +126,7 @@ inline v3_u8 operator-( u8 Scalar, v3_u8 P1 ) { v3_u8 Result = {{ - Cast(u8, Scalar - P1.E[0]), + Cast(u8, Scalar - P1.E[0]), Cast(u8, Scalar - P1.E[1]), Cast(u8, Scalar - P1.E[2]), }}; @@ -139,7 +139,7 @@ inline v3_u8 operator*( v3_u8 P1, v3_u8 P2 ) { v3_u8 Result = {{ - Cast(u8, P1.E[0] * P2.E[0]), + Cast(u8, P1.E[0] * P2.E[0]), Cast(u8, P1.E[1] * P2.E[1]), Cast(u8, P1.E[2] * P2.E[2]), }}; @@ -150,7 +150,7 @@ inline v3_u8 operator*( v3_u8 P1, u8 Scalar ) { v3_u8 Result = {{ - Cast(u8, P1.E[0] * Scalar), + Cast(u8, P1.E[0] * Scalar), Cast(u8, P1.E[1] * Scalar), Cast(u8, P1.E[2] * Scalar), }}; @@ -161,7 +161,7 @@ inline v3_u8 operator*( u8 Scalar, v3_u8 P1 ) { v3_u8 Result = {{ - Cast(u8, Scalar * P1.E[0]), + Cast(u8, Scalar * P1.E[0]), Cast(u8, Scalar * P1.E[1]), Cast(u8, Scalar * P1.E[2]), }}; @@ -174,7 +174,7 @@ inline v3_u8 operator/( v3_u8 P1, v3_u8 P2 ) { v3_u8 Result = {{ - Cast(u8, P1.E[0] / P2.E[0]), + Cast(u8, P1.E[0] / P2.E[0]), Cast(u8, P1.E[1] / P2.E[1]), Cast(u8, P1.E[2] / P2.E[2]), }}; @@ -185,7 +185,7 @@ inline v3_u8 operator/( v3_u8 P1, u8 Scalar ) { v3_u8 Result = {{ - Cast(u8, P1.E[0] / Scalar), + Cast(u8, P1.E[0] / Scalar), Cast(u8, P1.E[1] / Scalar), Cast(u8, P1.E[2] / Scalar), }}; @@ -196,7 +196,7 @@ inline v3_u8 operator/( u8 Scalar, v3_u8 P1 ) { v3_u8 Result = {{ - Cast(u8, Scalar / P1.E[0]), + Cast(u8, Scalar / P1.E[0]), Cast(u8, Scalar / P1.E[1]), Cast(u8, Scalar / P1.E[2]), }}; @@ -208,7 +208,7 @@ operator/( u8 Scalar, v3_u8 P1 ) inline v3_u8 & operator+=( v3_u8 &P1, v3_u8 P2 ) { - P1.E[0] += P2.E[0]; + P1.E[0] += P2.E[0]; P1.E[1] += P2.E[1]; P1.E[2] += P2.E[2]; return P1; @@ -217,7 +217,7 @@ operator+=( v3_u8 &P1, v3_u8 P2 ) inline v3_u8 & operator+=( v3_u8 &P1, u8 Scalar ) { - P1.E[0] += Scalar; + P1.E[0] += Scalar; P1.E[1] += Scalar; P1.E[2] += Scalar; return P1; @@ -227,7 +227,7 @@ operator+=( v3_u8 &P1, u8 Scalar ) inline v3_u8 & operator-=( v3_u8 &P1, v3_u8 P2 ) { - P1.E[0] -= P2.E[0]; + P1.E[0] -= P2.E[0]; P1.E[1] -= P2.E[1]; P1.E[2] -= P2.E[2]; return P1; @@ -236,7 +236,7 @@ operator-=( v3_u8 &P1, v3_u8 P2 ) inline v3_u8 & operator-=( v3_u8 &P1, u8 Scalar ) { - P1.E[0] -= Scalar; + P1.E[0] -= Scalar; P1.E[1] -= Scalar; P1.E[2] -= Scalar; return P1; @@ -246,7 +246,7 @@ operator-=( v3_u8 &P1, u8 Scalar ) inline v3_u8 & operator*=( v3_u8 &P1, v3_u8 P2 ) { - P1.E[0] *= P2.E[0]; + P1.E[0] *= P2.E[0]; P1.E[1] *= P2.E[1]; P1.E[2] *= P2.E[2]; return P1; @@ -255,7 +255,7 @@ operator*=( v3_u8 &P1, v3_u8 P2 ) inline v3_u8 & operator*=( v3_u8 &P1, u8 Scalar ) { - P1.E[0] *= Scalar; + P1.E[0] *= Scalar; P1.E[1] *= Scalar; P1.E[2] *= Scalar; return P1; @@ -265,7 +265,7 @@ operator*=( v3_u8 &P1, u8 Scalar ) inline v3_u8 & operator/=( v3_u8 &P1, v3_u8 P2 ) { - P1.E[0] /= P2.E[0]; + P1.E[0] /= P2.E[0]; P1.E[1] /= P2.E[1]; P1.E[2] /= P2.E[2]; return P1; @@ -274,7 +274,7 @@ operator/=( v3_u8 &P1, v3_u8 P2 ) inline v3_u8 & operator/=( v3_u8 &P1, u8 Scalar ) { - P1.E[0] /= Scalar; + P1.E[0] /= Scalar; P1.E[1] /= Scalar; P1.E[2] /= Scalar; return P1; diff --git a/generated/gen_vector_operators_v3i.h b/generated/gen_vector_operators_v3i.h index 840695722..090bf86ad 100644 --- a/generated/gen_vector_operators_v3i.h +++ b/generated/gen_vector_operators_v3i.h @@ -9,7 +9,7 @@ DeepCopy(v3i *Src, v3i *Dest) inline b32 operator==( v3i P1, v3i P2 ) { - b32 Result = ( P1.E[0] == P2.E[0] && P1.E[1] == P2.E[1] && P1.E[2] == P2.E[2] ); + b32 Result = ( P1.E[0] == P2.E[0] && P1.E[1] == P2.E[1] && P1.E[2] == P2.E[2] ); return Result; } @@ -36,7 +36,7 @@ operator!=( v3i P1, v3i P2 ) inline b32 operator<( v3i P1, v3i P2 ) { - b32 Result = ( P1.E[0] < P2.E[0] && P1.E[1] < P2.E[1] && P1.E[2] < P2.E[2] ); + b32 Result = ( P1.E[0] < P2.E[0] && P1.E[1] < P2.E[1] && P1.E[2] < P2.E[2] ); return Result; } @@ -44,7 +44,7 @@ operator<( v3i P1, v3i P2 ) inline b32 operator<=( v3i P1, v3i P2 ) { - b32 Result = ( P1.E[0] <= P2.E[0] && P1.E[1] <= P2.E[1] && P1.E[2] <= P2.E[2] ); + b32 Result = ( P1.E[0] <= P2.E[0] && P1.E[1] <= P2.E[1] && P1.E[2] <= P2.E[2] ); return Result; } @@ -52,7 +52,7 @@ operator<=( v3i P1, v3i P2 ) inline b32 operator>( v3i P1, v3i P2 ) { - b32 Result = ( P1.E[0] > P2.E[0] && P1.E[1] > P2.E[1] && P1.E[2] > P2.E[2] ); + b32 Result = ( P1.E[0] > P2.E[0] && P1.E[1] > P2.E[1] && P1.E[2] > P2.E[2] ); return Result; } @@ -60,7 +60,7 @@ operator>( v3i P1, v3i P2 ) inline b32 operator>=( v3i P1, v3i P2 ) { - b32 Result = ( P1.E[0] >= P2.E[0] && P1.E[1] >= P2.E[1] && P1.E[2] >= P2.E[2] ); + b32 Result = ( P1.E[0] >= P2.E[0] && P1.E[1] >= P2.E[1] && P1.E[2] >= P2.E[2] ); return Result; } @@ -69,7 +69,7 @@ inline v3i operator+( v3i P1, v3i P2 ) { v3i Result = {{ - Cast(s32, P1.E[0] + P2.E[0]), + Cast(s32, P1.E[0] + P2.E[0]), Cast(s32, P1.E[1] + P2.E[1]), Cast(s32, P1.E[2] + P2.E[2]), }}; @@ -80,7 +80,7 @@ inline v3i operator+( v3i P1, s32 Scalar ) { v3i Result = {{ - Cast(s32, P1.E[0] + Scalar), + Cast(s32, P1.E[0] + Scalar), Cast(s32, P1.E[1] + Scalar), Cast(s32, P1.E[2] + Scalar), }}; @@ -91,7 +91,7 @@ inline v3i operator+( s32 Scalar, v3i P1 ) { v3i Result = {{ - Cast(s32, Scalar + P1.E[0]), + Cast(s32, Scalar + P1.E[0]), Cast(s32, Scalar + P1.E[1]), Cast(s32, Scalar + P1.E[2]), }}; @@ -104,7 +104,7 @@ inline v3i operator-( v3i P1, v3i P2 ) { v3i Result = {{ - Cast(s32, P1.E[0] - P2.E[0]), + Cast(s32, P1.E[0] - P2.E[0]), Cast(s32, P1.E[1] - P2.E[1]), Cast(s32, P1.E[2] - P2.E[2]), }}; @@ -115,7 +115,7 @@ inline v3i operator-( v3i P1, s32 Scalar ) { v3i Result = {{ - Cast(s32, P1.E[0] - Scalar), + Cast(s32, P1.E[0] - Scalar), Cast(s32, P1.E[1] - Scalar), Cast(s32, P1.E[2] - Scalar), }}; @@ -126,7 +126,7 @@ inline v3i operator-( s32 Scalar, v3i P1 ) { v3i Result = {{ - Cast(s32, Scalar - P1.E[0]), + Cast(s32, Scalar - P1.E[0]), Cast(s32, Scalar - P1.E[1]), Cast(s32, Scalar - P1.E[2]), }}; @@ -139,7 +139,7 @@ inline v3i operator*( v3i P1, v3i P2 ) { v3i Result = {{ - Cast(s32, P1.E[0] * P2.E[0]), + Cast(s32, P1.E[0] * P2.E[0]), Cast(s32, P1.E[1] * P2.E[1]), Cast(s32, P1.E[2] * P2.E[2]), }}; @@ -150,7 +150,7 @@ inline v3i operator*( v3i P1, s32 Scalar ) { v3i Result = {{ - Cast(s32, P1.E[0] * Scalar), + Cast(s32, P1.E[0] * Scalar), Cast(s32, P1.E[1] * Scalar), Cast(s32, P1.E[2] * Scalar), }}; @@ -161,7 +161,7 @@ inline v3i operator*( s32 Scalar, v3i P1 ) { v3i Result = {{ - Cast(s32, Scalar * P1.E[0]), + Cast(s32, Scalar * P1.E[0]), Cast(s32, Scalar * P1.E[1]), Cast(s32, Scalar * P1.E[2]), }}; @@ -174,7 +174,7 @@ inline v3i operator/( v3i P1, v3i P2 ) { v3i Result = {{ - Cast(s32, P1.E[0] / P2.E[0]), + Cast(s32, P1.E[0] / P2.E[0]), Cast(s32, P1.E[1] / P2.E[1]), Cast(s32, P1.E[2] / P2.E[2]), }}; @@ -185,7 +185,7 @@ inline v3i operator/( v3i P1, s32 Scalar ) { v3i Result = {{ - Cast(s32, P1.E[0] / Scalar), + Cast(s32, P1.E[0] / Scalar), Cast(s32, P1.E[1] / Scalar), Cast(s32, P1.E[2] / Scalar), }}; @@ -196,7 +196,7 @@ inline v3i operator/( s32 Scalar, v3i P1 ) { v3i Result = {{ - Cast(s32, Scalar / P1.E[0]), + Cast(s32, Scalar / P1.E[0]), Cast(s32, Scalar / P1.E[1]), Cast(s32, Scalar / P1.E[2]), }}; @@ -208,7 +208,7 @@ operator/( s32 Scalar, v3i P1 ) inline v3i & operator+=( v3i &P1, v3i P2 ) { - P1.E[0] += P2.E[0]; + P1.E[0] += P2.E[0]; P1.E[1] += P2.E[1]; P1.E[2] += P2.E[2]; return P1; @@ -217,7 +217,7 @@ operator+=( v3i &P1, v3i P2 ) inline v3i & operator+=( v3i &P1, s32 Scalar ) { - P1.E[0] += Scalar; + P1.E[0] += Scalar; P1.E[1] += Scalar; P1.E[2] += Scalar; return P1; @@ -227,7 +227,7 @@ operator+=( v3i &P1, s32 Scalar ) inline v3i & operator-=( v3i &P1, v3i P2 ) { - P1.E[0] -= P2.E[0]; + P1.E[0] -= P2.E[0]; P1.E[1] -= P2.E[1]; P1.E[2] -= P2.E[2]; return P1; @@ -236,7 +236,7 @@ operator-=( v3i &P1, v3i P2 ) inline v3i & operator-=( v3i &P1, s32 Scalar ) { - P1.E[0] -= Scalar; + P1.E[0] -= Scalar; P1.E[1] -= Scalar; P1.E[2] -= Scalar; return P1; @@ -246,7 +246,7 @@ operator-=( v3i &P1, s32 Scalar ) inline v3i & operator*=( v3i &P1, v3i P2 ) { - P1.E[0] *= P2.E[0]; + P1.E[0] *= P2.E[0]; P1.E[1] *= P2.E[1]; P1.E[2] *= P2.E[2]; return P1; @@ -255,7 +255,7 @@ operator*=( v3i &P1, v3i P2 ) inline v3i & operator*=( v3i &P1, s32 Scalar ) { - P1.E[0] *= Scalar; + P1.E[0] *= Scalar; P1.E[1] *= Scalar; P1.E[2] *= Scalar; return P1; @@ -265,7 +265,7 @@ operator*=( v3i &P1, s32 Scalar ) inline v3i & operator/=( v3i &P1, v3i P2 ) { - P1.E[0] /= P2.E[0]; + P1.E[0] /= P2.E[0]; P1.E[1] /= P2.E[1]; P1.E[2] /= P2.E[2]; return P1; @@ -274,7 +274,7 @@ operator/=( v3i &P1, v3i P2 ) inline v3i & operator/=( v3i &P1, s32 Scalar ) { - P1.E[0] /= Scalar; + P1.E[0] /= Scalar; P1.E[1] /= Scalar; P1.E[2] /= Scalar; return P1; diff --git a/generated/gen_vector_operators_v4.h b/generated/gen_vector_operators_v4.h index a258ec2e7..1fd6b476c 100644 --- a/generated/gen_vector_operators_v4.h +++ b/generated/gen_vector_operators_v4.h @@ -9,7 +9,7 @@ DeepCopy(v4 *Src, v4 *Dest) inline b32 operator==( v4 P1, v4 P2 ) { - b32 Result = ( P1.E[0] == P2.E[0] && P1.E[1] == P2.E[1] && P1.E[2] == P2.E[2] && P1.E[3] == P2.E[3] ); + b32 Result = ( P1.E[0] == P2.E[0] && P1.E[1] == P2.E[1] && P1.E[2] == P2.E[2] && P1.E[3] == P2.E[3] ); return Result; } @@ -36,7 +36,7 @@ operator!=( v4 P1, v4 P2 ) inline b32 operator<( v4 P1, v4 P2 ) { - b32 Result = ( P1.E[0] < P2.E[0] && P1.E[1] < P2.E[1] && P1.E[2] < P2.E[2] && P1.E[3] < P2.E[3] ); + b32 Result = ( P1.E[0] < P2.E[0] && P1.E[1] < P2.E[1] && P1.E[2] < P2.E[2] && P1.E[3] < P2.E[3] ); return Result; } @@ -44,7 +44,7 @@ operator<( v4 P1, v4 P2 ) inline b32 operator<=( v4 P1, v4 P2 ) { - b32 Result = ( P1.E[0] <= P2.E[0] && P1.E[1] <= P2.E[1] && P1.E[2] <= P2.E[2] && P1.E[3] <= P2.E[3] ); + b32 Result = ( P1.E[0] <= P2.E[0] && P1.E[1] <= P2.E[1] && P1.E[2] <= P2.E[2] && P1.E[3] <= P2.E[3] ); return Result; } @@ -52,7 +52,7 @@ operator<=( v4 P1, v4 P2 ) inline b32 operator>( v4 P1, v4 P2 ) { - b32 Result = ( P1.E[0] > P2.E[0] && P1.E[1] > P2.E[1] && P1.E[2] > P2.E[2] && P1.E[3] > P2.E[3] ); + b32 Result = ( P1.E[0] > P2.E[0] && P1.E[1] > P2.E[1] && P1.E[2] > P2.E[2] && P1.E[3] > P2.E[3] ); return Result; } @@ -60,7 +60,7 @@ operator>( v4 P1, v4 P2 ) inline b32 operator>=( v4 P1, v4 P2 ) { - b32 Result = ( P1.E[0] >= P2.E[0] && P1.E[1] >= P2.E[1] && P1.E[2] >= P2.E[2] && P1.E[3] >= P2.E[3] ); + b32 Result = ( P1.E[0] >= P2.E[0] && P1.E[1] >= P2.E[1] && P1.E[2] >= P2.E[2] && P1.E[3] >= P2.E[3] ); return Result; } @@ -69,7 +69,7 @@ inline v4 operator+( v4 P1, v4 P2 ) { v4 Result = {{ - Cast(r32, P1.E[0] + P2.E[0]), + Cast(r32, P1.E[0] + P2.E[0]), Cast(r32, P1.E[1] + P2.E[1]), Cast(r32, P1.E[2] + P2.E[2]), Cast(r32, P1.E[3] + P2.E[3]), @@ -81,7 +81,7 @@ inline v4 operator+( v4 P1, r32 Scalar ) { v4 Result = {{ - Cast(r32, P1.E[0] + Scalar), + Cast(r32, P1.E[0] + Scalar), Cast(r32, P1.E[1] + Scalar), Cast(r32, P1.E[2] + Scalar), Cast(r32, P1.E[3] + Scalar), @@ -93,7 +93,7 @@ inline v4 operator+( r32 Scalar, v4 P1 ) { v4 Result = {{ - Cast(r32, Scalar + P1.E[0]), + Cast(r32, Scalar + P1.E[0]), Cast(r32, Scalar + P1.E[1]), Cast(r32, Scalar + P1.E[2]), Cast(r32, Scalar + P1.E[3]), @@ -107,7 +107,7 @@ inline v4 operator-( v4 P1, v4 P2 ) { v4 Result = {{ - Cast(r32, P1.E[0] - P2.E[0]), + Cast(r32, P1.E[0] - P2.E[0]), Cast(r32, P1.E[1] - P2.E[1]), Cast(r32, P1.E[2] - P2.E[2]), Cast(r32, P1.E[3] - P2.E[3]), @@ -119,7 +119,7 @@ inline v4 operator-( v4 P1, r32 Scalar ) { v4 Result = {{ - Cast(r32, P1.E[0] - Scalar), + Cast(r32, P1.E[0] - Scalar), Cast(r32, P1.E[1] - Scalar), Cast(r32, P1.E[2] - Scalar), Cast(r32, P1.E[3] - Scalar), @@ -131,7 +131,7 @@ inline v4 operator-( r32 Scalar, v4 P1 ) { v4 Result = {{ - Cast(r32, Scalar - P1.E[0]), + Cast(r32, Scalar - P1.E[0]), Cast(r32, Scalar - P1.E[1]), Cast(r32, Scalar - P1.E[2]), Cast(r32, Scalar - P1.E[3]), @@ -145,7 +145,7 @@ inline v4 operator*( v4 P1, v4 P2 ) { v4 Result = {{ - Cast(r32, P1.E[0] * P2.E[0]), + Cast(r32, P1.E[0] * P2.E[0]), Cast(r32, P1.E[1] * P2.E[1]), Cast(r32, P1.E[2] * P2.E[2]), Cast(r32, P1.E[3] * P2.E[3]), @@ -157,7 +157,7 @@ inline v4 operator*( v4 P1, r32 Scalar ) { v4 Result = {{ - Cast(r32, P1.E[0] * Scalar), + Cast(r32, P1.E[0] * Scalar), Cast(r32, P1.E[1] * Scalar), Cast(r32, P1.E[2] * Scalar), Cast(r32, P1.E[3] * Scalar), @@ -169,7 +169,7 @@ inline v4 operator*( r32 Scalar, v4 P1 ) { v4 Result = {{ - Cast(r32, Scalar * P1.E[0]), + Cast(r32, Scalar * P1.E[0]), Cast(r32, Scalar * P1.E[1]), Cast(r32, Scalar * P1.E[2]), Cast(r32, Scalar * P1.E[3]), @@ -183,7 +183,7 @@ inline v4 operator/( v4 P1, v4 P2 ) { v4 Result = {{ - Cast(r32, P1.E[0] / P2.E[0]), + Cast(r32, P1.E[0] / P2.E[0]), Cast(r32, P1.E[1] / P2.E[1]), Cast(r32, P1.E[2] / P2.E[2]), Cast(r32, P1.E[3] / P2.E[3]), @@ -195,7 +195,7 @@ inline v4 operator/( v4 P1, r32 Scalar ) { v4 Result = {{ - Cast(r32, P1.E[0] / Scalar), + Cast(r32, P1.E[0] / Scalar), Cast(r32, P1.E[1] / Scalar), Cast(r32, P1.E[2] / Scalar), Cast(r32, P1.E[3] / Scalar), @@ -207,7 +207,7 @@ inline v4 operator/( r32 Scalar, v4 P1 ) { v4 Result = {{ - Cast(r32, Scalar / P1.E[0]), + Cast(r32, Scalar / P1.E[0]), Cast(r32, Scalar / P1.E[1]), Cast(r32, Scalar / P1.E[2]), Cast(r32, Scalar / P1.E[3]), @@ -220,7 +220,7 @@ operator/( r32 Scalar, v4 P1 ) inline v4 & operator+=( v4 &P1, v4 P2 ) { - P1.E[0] += P2.E[0]; + P1.E[0] += P2.E[0]; P1.E[1] += P2.E[1]; P1.E[2] += P2.E[2]; P1.E[3] += P2.E[3]; @@ -230,7 +230,7 @@ operator+=( v4 &P1, v4 P2 ) inline v4 & operator+=( v4 &P1, r32 Scalar ) { - P1.E[0] += Scalar; + P1.E[0] += Scalar; P1.E[1] += Scalar; P1.E[2] += Scalar; P1.E[3] += Scalar; @@ -241,7 +241,7 @@ operator+=( v4 &P1, r32 Scalar ) inline v4 & operator-=( v4 &P1, v4 P2 ) { - P1.E[0] -= P2.E[0]; + P1.E[0] -= P2.E[0]; P1.E[1] -= P2.E[1]; P1.E[2] -= P2.E[2]; P1.E[3] -= P2.E[3]; @@ -251,7 +251,7 @@ operator-=( v4 &P1, v4 P2 ) inline v4 & operator-=( v4 &P1, r32 Scalar ) { - P1.E[0] -= Scalar; + P1.E[0] -= Scalar; P1.E[1] -= Scalar; P1.E[2] -= Scalar; P1.E[3] -= Scalar; @@ -262,7 +262,7 @@ operator-=( v4 &P1, r32 Scalar ) inline v4 & operator*=( v4 &P1, v4 P2 ) { - P1.E[0] *= P2.E[0]; + P1.E[0] *= P2.E[0]; P1.E[1] *= P2.E[1]; P1.E[2] *= P2.E[2]; P1.E[3] *= P2.E[3]; @@ -272,7 +272,7 @@ operator*=( v4 &P1, v4 P2 ) inline v4 & operator*=( v4 &P1, r32 Scalar ) { - P1.E[0] *= Scalar; + P1.E[0] *= Scalar; P1.E[1] *= Scalar; P1.E[2] *= Scalar; P1.E[3] *= Scalar; @@ -283,7 +283,7 @@ operator*=( v4 &P1, r32 Scalar ) inline v4 & operator/=( v4 &P1, v4 P2 ) { - P1.E[0] /= P2.E[0]; + P1.E[0] /= P2.E[0]; P1.E[1] /= P2.E[1]; P1.E[2] /= P2.E[2]; P1.E[3] /= P2.E[3]; @@ -293,7 +293,7 @@ operator/=( v4 &P1, v4 P2 ) inline v4 & operator/=( v4 &P1, r32 Scalar ) { - P1.E[0] /= Scalar; + P1.E[0] /= Scalar; P1.E[1] /= Scalar; P1.E[2] /= Scalar; P1.E[3] /= Scalar; diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index 74d96f2c9..ee2a2c565 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:50:0 +// src/engine/world.h:54:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index bc3273e8a..1081f28f2 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:41:0 +// src/engine/world.h:45:0 struct octree_node_ptr_stack { diff --git a/generated/generate_string_table_Chunk_ID.h b/generated/generate_string_table_Chunk_ID.h index 7aee9d4e2..e459fc7c2 100644 --- a/generated/generate_string_table_Chunk_ID.h +++ b/generated/generate_string_table_Chunk_ID.h @@ -6,7 +6,7 @@ ToStringPrefixless(Chunk_ID Type) counted_string Result = {}; switch (Type) { - case ID_NONE: { Result = CSz("NONE"); } break; + case ID_NONE: { Result = CSz("NONE"); } break; case ID_VOX: { Result = CSz("VOX"); } break; case ID_MAIN: { Result = CSz("MAIN"); } break; case ID_PACK: { Result = CSz("PACK"); } break; @@ -35,7 +35,7 @@ ToString(Chunk_ID Type) counted_string Result = {}; switch (Type) { - case ID_NONE: { Result = CSz("ID_NONE"); } break; + case ID_NONE: { Result = CSz("ID_NONE"); } break; case ID_VOX: { Result = CSz("ID_VOX"); } break; case ID_MAIN: { Result = CSz("ID_MAIN"); } break; case ID_PACK: { Result = CSz("ID_PACK"); } break; diff --git a/generated/generate_string_table_asset_load_state.h b/generated/generate_string_table_asset_load_state.h index 9027206f6..95e8c4a01 100644 --- a/generated/generate_string_table_asset_load_state.h +++ b/generated/generate_string_table_asset_load_state.h @@ -6,7 +6,7 @@ ToStringPrefixless(asset_load_state Type) counted_string Result = {}; switch (Type) { - case AssetLoadState_Unloaded: { Result = CSz("Unloaded"); } break; + case AssetLoadState_Unloaded: { Result = CSz("Unloaded"); } break; case AssetLoadState_Allocated: { Result = CSz("Allocated"); } break; case AssetLoadState_Queued: { Result = CSz("Queued"); } break; case AssetLoadState_Loaded: { Result = CSz("Loaded"); } break; @@ -24,7 +24,7 @@ ToString(asset_load_state Type) counted_string Result = {}; switch (Type) { - case AssetLoadState_Unloaded: { Result = CSz("AssetLoadState_Unloaded"); } break; + case AssetLoadState_Unloaded: { Result = CSz("AssetLoadState_Unloaded"); } break; case AssetLoadState_Allocated: { Result = CSz("AssetLoadState_Allocated"); } break; case AssetLoadState_Queued: { Result = CSz("AssetLoadState_Queued"); } break; case AssetLoadState_Loaded: { Result = CSz("AssetLoadState_Loaded"); } break; diff --git a/generated/generate_string_table_c_token_type.h b/generated/generate_string_table_c_token_type.h index 638ac107b..b996a8f4c 100644 --- a/generated/generate_string_table_c_token_type.h +++ b/generated/generate_string_table_c_token_type.h @@ -6,7 +6,7 @@ ToStringPrefixless(c_token_type Type) counted_string Result = {}; switch (Type) { - case CTokenType_Unknown: { Result = CSz("Unknown"); } break; + case CTokenType_Unknown: { Result = CSz("Unknown"); } break; case CT_ControlChar_Start_of_Heading: { Result = CSz("Heading"); } break; case CT_ControlChar_Start_of_Text: { Result = CSz("Text"); } break; case CT_ControlChar_End_of_Text: { Result = CSz("Text"); } break; @@ -192,7 +192,7 @@ ToString(c_token_type Type) counted_string Result = {}; switch (Type) { - case CTokenType_Unknown: { Result = CSz("CTokenType_Unknown"); } break; + case CTokenType_Unknown: { Result = CSz("CTokenType_Unknown"); } break; case CT_ControlChar_Start_of_Heading: { Result = CSz("CT_ControlChar_Start_of_Heading"); } break; case CT_ControlChar_Start_of_Text: { Result = CSz("CT_ControlChar_Start_of_Text"); } break; case CT_ControlChar_End_of_Text: { Result = CSz("CT_ControlChar_End_of_Text"); } break; diff --git a/generated/generate_string_table_entity_behavior_flags.h b/generated/generate_string_table_entity_behavior_flags.h index 8bffafeae..efe934a44 100644 --- a/generated/generate_string_table_entity_behavior_flags.h +++ b/generated/generate_string_table_entity_behavior_flags.h @@ -6,7 +6,7 @@ ToStringPrefixless(entity_behavior_flags Type) counted_string Result = {}; switch (Type) { - case EntityBehaviorFlags_None: { Result = CSz("None"); } break; + case EntityBehaviorFlags_None: { Result = CSz("None"); } break; case EntityBehaviorFlags_Gravity: { Result = CSz("Gravity"); } break; case EntityBehaviorFlags_WorldCollision: { Result = CSz("WorldCollision"); } break; case EntityBehaviorFlags_EntityCollision: { Result = CSz("EntityCollision"); } break; @@ -16,7 +16,7 @@ ToStringPrefixless(entity_behavior_flags Type) case EntityBehaviorFlags_WorldCenter: { Result = CSz("WorldCenter"); } break; case EntityBehaviorFlags_Default: { Result = CSz("Default"); } break; - // TODO(Jesse): This is pretty barf and we could do it in a single allocation, + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: { @@ -51,7 +51,7 @@ ToString(entity_behavior_flags Type) counted_string Result = {}; switch (Type) { - case EntityBehaviorFlags_None: { Result = CSz("EntityBehaviorFlags_None"); } break; + case EntityBehaviorFlags_None: { Result = CSz("EntityBehaviorFlags_None"); } break; case EntityBehaviorFlags_Gravity: { Result = CSz("EntityBehaviorFlags_Gravity"); } break; case EntityBehaviorFlags_WorldCollision: { Result = CSz("EntityBehaviorFlags_WorldCollision"); } break; case EntityBehaviorFlags_EntityCollision: { Result = CSz("EntityBehaviorFlags_EntityCollision"); } break; @@ -61,7 +61,7 @@ ToString(entity_behavior_flags Type) case EntityBehaviorFlags_WorldCenter: { Result = CSz("EntityBehaviorFlags_WorldCenter"); } break; case EntityBehaviorFlags_Default: { Result = CSz("EntityBehaviorFlags_Default"); } break; - // TODO(Jesse): This is pretty barf and we could do it in a single allocation, + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: { diff --git a/generated/generate_string_table_entity_state.h b/generated/generate_string_table_entity_state.h index a247a0fcd..1fca516bb 100644 --- a/generated/generate_string_table_entity_state.h +++ b/generated/generate_string_table_entity_state.h @@ -6,7 +6,7 @@ ToStringPrefixless(entity_state Type) counted_string Result = {}; switch (Type) { - case EntityState_Free: { Result = CSz("Free"); } break; + case EntityState_Free: { Result = CSz("Free"); } break; case EntityState_Spawned: { Result = CSz("Spawned"); } break; case EntityState_Destroyed: { Result = CSz("Destroyed"); } break; case EntityState_Reserved: { Result = CSz("Reserved"); } break; @@ -23,7 +23,7 @@ ToString(entity_state Type) counted_string Result = {}; switch (Type) { - case EntityState_Free: { Result = CSz("EntityState_Free"); } break; + case EntityState_Free: { Result = CSz("EntityState_Free"); } break; case EntityState_Spawned: { Result = CSz("EntityState_Spawned"); } break; case EntityState_Destroyed: { Result = CSz("EntityState_Destroyed"); } break; case EntityState_Reserved: { Result = CSz("EntityState_Reserved"); } break; diff --git a/generated/generate_string_table_parse_error_code.h b/generated/generate_string_table_parse_error_code.h index df0f3e225..144f4b826 100644 --- a/generated/generate_string_table_parse_error_code.h +++ b/generated/generate_string_table_parse_error_code.h @@ -6,7 +6,7 @@ ToStringPrefixless(parse_error_code Type) counted_string Result = {}; switch (Type) { - case ParseErrorCode_None: { Result = CSz("None"); } break; + case ParseErrorCode_None: { Result = CSz("None"); } break; case ParseErrorCode_ExpectedSemicolonOrEquals: { Result = CSz("ExpectedSemicolonOrEquals"); } break; case ParseErrorCode_StreamEndedUnexpectedly: { Result = CSz("StreamEndedUnexpectedly"); } break; case ParseErrorCode_RequireTokenFailed: { Result = CSz("RequireTokenFailed"); } break; @@ -44,7 +44,7 @@ ToString(parse_error_code Type) counted_string Result = {}; switch (Type) { - case ParseErrorCode_None: { Result = CSz("ParseErrorCode_None"); } break; + case ParseErrorCode_None: { Result = CSz("ParseErrorCode_None"); } break; case ParseErrorCode_ExpectedSemicolonOrEquals: { Result = CSz("ParseErrorCode_ExpectedSemicolonOrEquals"); } break; case ParseErrorCode_StreamEndedUnexpectedly: { Result = CSz("ParseErrorCode_StreamEndedUnexpectedly"); } break; case ParseErrorCode_RequireTokenFailed: { Result = CSz("ParseErrorCode_RequireTokenFailed"); } break; diff --git a/generated/generate_string_table_text_encoding.h b/generated/generate_string_table_text_encoding.h index 82001217b..2cd7065e8 100644 --- a/generated/generate_string_table_text_encoding.h +++ b/generated/generate_string_table_text_encoding.h @@ -6,7 +6,7 @@ ToStringPrefixless(text_encoding Type) counted_string Result = {}; switch (Type) { - case TextEncoding_ASCII: { Result = CSz("ASCII"); } break; + case TextEncoding_ASCII: { Result = CSz("ASCII"); } break; case TextEncoding_UTF8: { Result = CSz("UTF8"); } break; case TextEncoding_UTF16LE: { Result = CSz("UTF16LE"); } break; case TextEncoding_UTF16BE: { Result = CSz("UTF16BE"); } break; @@ -31,7 +31,7 @@ ToString(text_encoding Type) counted_string Result = {}; switch (Type) { - case TextEncoding_ASCII: { Result = CSz("TextEncoding_ASCII"); } break; + case TextEncoding_ASCII: { Result = CSz("TextEncoding_ASCII"); } break; case TextEncoding_UTF8: { Result = CSz("TextEncoding_UTF8"); } break; case TextEncoding_UTF16LE: { Result = CSz("TextEncoding_UTF16LE"); } break; case TextEncoding_UTF16BE: { Result = CSz("TextEncoding_UTF16BE"); } break; diff --git a/generated/generate_string_table_token_cursor_source.h b/generated/generate_string_table_token_cursor_source.h index 32a3969ac..7e7fe2bce 100644 --- a/generated/generate_string_table_token_cursor_source.h +++ b/generated/generate_string_table_token_cursor_source.h @@ -6,7 +6,7 @@ ToStringPrefixless(token_cursor_source Type) counted_string Result = {}; switch (Type) { - case TokenCursorSource_Unknown: { Result = CSz("Unknown"); } break; + case TokenCursorSource_Unknown: { Result = CSz("Unknown"); } break; case TokenCursorSource_RootFile: { Result = CSz("RootFile"); } break; case TokenCursorSource_Include: { Result = CSz("Include"); } break; case TokenCursorSource_MacroExpansion: { Result = CSz("MacroExpansion"); } break; @@ -30,7 +30,7 @@ ToString(token_cursor_source Type) counted_string Result = {}; switch (Type) { - case TokenCursorSource_Unknown: { Result = CSz("TokenCursorSource_Unknown"); } break; + case TokenCursorSource_Unknown: { Result = CSz("TokenCursorSource_Unknown"); } break; case TokenCursorSource_RootFile: { Result = CSz("TokenCursorSource_RootFile"); } break; case TokenCursorSource_Include: { Result = CSz("TokenCursorSource_Include"); } break; case TokenCursorSource_MacroExpansion: { Result = CSz("TokenCursorSource_MacroExpansion"); } break; diff --git a/generated/generate_string_table_world_chunk_mesh_bitfield.h b/generated/generate_string_table_world_chunk_mesh_bitfield.h index 63946e99e..b23965b5e 100644 --- a/generated/generate_string_table_world_chunk_mesh_bitfield.h +++ b/generated/generate_string_table_world_chunk_mesh_bitfield.h @@ -6,7 +6,7 @@ ToStringPrefixless(world_chunk_mesh_bitfield Type) counted_string Result = {}; switch (Type) { - case MeshBit_None: { Result = CSz("None"); } break; + case MeshBit_None: { Result = CSz("None"); } break; case MeshBit_Lod0: { Result = CSz("Lod0"); } break; case MeshBit_Lod1: { Result = CSz("Lod1"); } break; case MeshBit_Lod2: { Result = CSz("Lod2"); } break; @@ -26,7 +26,7 @@ ToString(world_chunk_mesh_bitfield Type) counted_string Result = {}; switch (Type) { - case MeshBit_None: { Result = CSz("MeshBit_None"); } break; + case MeshBit_None: { Result = CSz("MeshBit_None"); } break; case MeshBit_Lod0: { Result = CSz("MeshBit_Lod0"); } break; case MeshBit_Lod1: { Result = CSz("MeshBit_Lod1"); } break; case MeshBit_Lod2: { Result = CSz("MeshBit_Lod2"); } break; diff --git a/generated/generate_string_table_world_chunk_mesh_index.h b/generated/generate_string_table_world_chunk_mesh_index.h index 25c8d6260..b907dba67 100644 --- a/generated/generate_string_table_world_chunk_mesh_index.h +++ b/generated/generate_string_table_world_chunk_mesh_index.h @@ -6,7 +6,7 @@ ToStringPrefixless(world_chunk_mesh_index Type) counted_string Result = {}; switch (Type) { - case MeshIndex_Lod0: { Result = CSz("Lod0"); } break; + case MeshIndex_Lod0: { Result = CSz("Lod0"); } break; case MeshIndex_Lod1: { Result = CSz("Lod1"); } break; case MeshIndex_Lod2: { Result = CSz("Lod2"); } break; case MeshIndex_Lod3: { Result = CSz("Lod3"); } break; @@ -25,7 +25,7 @@ ToString(world_chunk_mesh_index Type) counted_string Result = {}; switch (Type) { - case MeshIndex_Lod0: { Result = CSz("MeshIndex_Lod0"); } break; + case MeshIndex_Lod0: { Result = CSz("MeshIndex_Lod0"); } break; case MeshIndex_Lod1: { Result = CSz("MeshIndex_Lod1"); } break; case MeshIndex_Lod2: { Result = CSz("MeshIndex_Lod2"); } break; case MeshIndex_Lod3: { Result = CSz("MeshIndex_Lod3"); } break; diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index 5a00a4225..e65a96ece 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -3,231 +3,231 @@ link_internal void PushBonsaiRenderCommandInitializeNoiseBuffer( work_queue *RenderQueue - , world_chunk* Chunk + , world_chunk* Chunk ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandInitializeNoiseBuffer( Chunk ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandInitializeNoiseBuffer( Chunk ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandClearAllFramebuffers( work_queue *RenderQueue - , u32 Ignored = 0 + , u32 Ignored = 0 ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandClearAllFramebuffers( Ignored ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandClearAllFramebuffers( Ignored ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandAllocateTexture( work_queue *RenderQueue - , texture* Texture , void * Data + , texture* Texture , void * Data ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandAllocateTexture( Texture , Data ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandAllocateTexture( Texture , Data ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandDeallocateTexture( work_queue *RenderQueue - , u32* Buffers , s32 Count = 3 + , u32* Buffers , s32 Count = 3 ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDeallocateTexture( Buffers , Count ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDeallocateTexture( Buffers , Count ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandAllocateBuffers( work_queue *RenderQueue - , u32* Buffers , s32 Count = 3 + , u32* Buffers , s32 Count = 3 ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandAllocateBuffers( Buffers , Count ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandAllocateBuffers( Buffers , Count ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandReallocateBuffers( work_queue *RenderQueue - , gpu_element_buffer_handles* Handles , untextured_3d_geometry_buffer* Mesh + , gpu_element_buffer_handles* Handles , untextured_3d_geometry_buffer* Mesh ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandReallocateBuffers( Handles , Mesh ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandReallocateBuffers( Handles , Mesh ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandDeallocateBuffers( work_queue *RenderQueue - , u32* Buffers , s32 Count + , u32* Buffers , s32 Count ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDeallocateBuffers( Buffers , Count ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDeallocateBuffers( Buffers , Count ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandDeallocateWorldChunk( work_queue *RenderQueue - , world_chunk* Chunk + , world_chunk* Chunk ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDeallocateWorldChunk( Chunk ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDeallocateWorldChunk( Chunk ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandDoStuff( work_queue *RenderQueue - , u32 Ignored = 0 + , u32 Ignored = 0 ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDoStuff( Ignored ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDoStuff( Ignored ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandAllocateAndMapGpuElementBuffer( work_queue *RenderQueue - , data_type Type , u32 ElementCount , gpu_mapped_element_buffer* Dest , world_chunk* SynChunk , world_chunk* DestChunk + , data_type Type , u32 ElementCount , gpu_mapped_element_buffer* Dest , world_chunk* SynChunk , world_chunk* DestChunk ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandAllocateAndMapGpuElementBuffer( Type , ElementCount , Dest , SynChunk , DestChunk ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandAllocateAndMapGpuElementBuffer( Type , ElementCount , Dest , SynChunk , DestChunk ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandUnmapGpuElementBuffer( work_queue *RenderQueue - , gpu_mapped_element_buffer* Buf , world_chunk* Chunk + , gpu_mapped_element_buffer* Buf , world_chunk* Chunk ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandUnmapGpuElementBuffer( Buf , Chunk ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandUnmapGpuElementBuffer( Buf , Chunk ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandUnmapAndDeallocateBuffer( work_queue *RenderQueue - , gpu_readback_buffer PBOBuf + , gpu_readback_buffer PBOBuf ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandUnmapAndDeallocateBuffer( PBOBuf ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandUnmapAndDeallocateBuffer( PBOBuf ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandSetupShader( work_queue *RenderQueue - , bonsai_render_command_shader_id ShaderId + , bonsai_render_command_shader_id ShaderId ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandSetupShader( ShaderId ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandSetupShader( ShaderId ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandTeardownShader( work_queue *RenderQueue - , bonsai_render_command_shader_id ShaderId + , bonsai_render_command_shader_id ShaderId ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandTeardownShader( ShaderId ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandTeardownShader( ShaderId ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandSetShaderUniform( work_queue *RenderQueue - , shader_uniform Uniform , shader* Shader , s32 TextureUnit + , shader_uniform Uniform , shader* Shader , s32 TextureUnit ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandSetShaderUniform( Uniform , Shader , TextureUnit ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandSetShaderUniform( Uniform , Shader , TextureUnit ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandDrawWorldChunkDrawList( work_queue *RenderQueue - , world_chunk_ptr_paged_list* DrawList , shader* Shader + , world_chunk_ptr_paged_list* DrawList , shader* Shader ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDrawWorldChunkDrawList( DrawList , Shader ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDrawWorldChunkDrawList( DrawList , Shader ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandDrawAllEntities( work_queue *RenderQueue - , shader* Shader + , shader* Shader ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDrawAllEntities( Shader ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDrawAllEntities( Shader ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandGlTimerInit( work_queue *RenderQueue - , u32* GlTimerObject + , u32* GlTimerObject ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandGlTimerInit( GlTimerObject ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandGlTimerInit( GlTimerObject ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandGlTimerStart( work_queue *RenderQueue - , u32 GlTimerObject + , u32 GlTimerObject ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandGlTimerStart( GlTimerObject ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandGlTimerStart( GlTimerObject ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandGlTimerEnd( work_queue *RenderQueue - , u32 GlTimerObject + , u32 GlTimerObject ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandGlTimerEnd( GlTimerObject ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandGlTimerEnd( GlTimerObject ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandGlTimerReadValueAndHistogram( work_queue *RenderQueue - , u32 GlTimerObject + , u32 GlTimerObject ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandGlTimerReadValueAndHistogram( GlTimerObject ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandGlTimerReadValueAndHistogram( GlTimerObject ))); PushWorkQueueEntry(RenderQueue, &Work); } diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 804bf85aa..3326b04f3 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -10,7 +10,7 @@ RadioButtonGroup_level_editor_flags( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Noop"), UiId(Window, Cast(void*, Element), Cast(void*, "level_editor_flags LevelEditorFlags_Noop")), LevelEditorFlags_Noop }, + { CSz("Noop"), UiId(Window, Cast(void*, Element), Cast(void*, "level_editor_flags LevelEditorFlags_Noop")), LevelEditorFlags_Noop }, }; diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 22b9ec165..99e3d273a 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -10,7 +10,7 @@ RadioButtonGroup_ui_noise_type( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Perlin"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_Perlin")), NoiseType_Perlin }, + { CSz("Perlin"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_Perlin")), NoiseType_Perlin }, { CSz("Voronoi"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_Voronoi")), NoiseType_Voronoi }, { CSz("White"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_White")), NoiseType_White }, }; diff --git a/generated/serdes_primitive_85387614.h b/generated/serdes_primitive_85387614.h index ccd79d971..ef4b69ded 100644 --- a/generated/serdes_primitive_85387614.h +++ b/generated/serdes_primitive_85387614.h @@ -23,3 +23,4 @@ Deserialize(u8_cursor *Bytes, chunk_flag *Element, memory_arena *Ignored = 0, um /* serdes_array(type) */ + diff --git a/generated/serdes_struct_bonsai_type_info.h b/generated/serdes_struct_bonsai_type_info.h index 6239972fe..08236aedf 100644 --- a/generated/serdes_struct_bonsai_type_info.h +++ b/generated/serdes_struct_bonsai_type_info.h @@ -6,7 +6,7 @@ TypeInfo(bonsai_type_info *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("bonsai_type_info"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,21 +34,21 @@ Serialize(u8_cursor_block_array *Bytes, bonsai_type_info *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { bonsai_type_info *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Name); // default + Result &= Serialize(Bytes, &Element->Name); // default - Result &= Serialize(Bytes, &Element->Version); // default + Result &= Serialize(Bytes, &Element->Version); // default - Result &= Serialize(Bytes, &Element->SizeOfInBytes); // default + Result &= Serialize(Bytes, &Element->SizeOfInBytes); // default @@ -71,7 +71,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, bonsai_type_info *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Name, Memory); @@ -79,7 +79,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, bonsai_type_info *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Version, Memory); @@ -87,7 +87,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, bonsai_type_info *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SizeOfInBytes, Memory); @@ -105,7 +105,7 @@ Deserialize(u8_cursor *Bytes, bonsai_type_info *Element, memory_arena *Memory, u b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_bonsai_type_info_buffer.h b/generated/serdes_struct_bonsai_type_info_buffer.h index b2a98ec6d..52904ad80 100644 --- a/generated/serdes_struct_bonsai_type_info_buffer.h +++ b/generated/serdes_struct_bonsai_type_info_buffer.h @@ -6,7 +6,7 @@ TypeInfo(bonsai_type_info_buffer *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("bonsai_type_info_buffer"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,17 +34,21 @@ Serialize(u8_cursor_block_array *Bytes, bonsai_type_info_buffer *BaseElement, um RangeIterator_t(umm, ElementIndex, Count) { bonsai_type_info_buffer *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Count); // default + Result &= Serialize(Bytes, &Element->Count); // default - if (Element->Start) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + if (Element->Start) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - if (Element->Start) { Result &= Serialize(Bytes, Element->Start,Element->Count ); } + if (Element->Start) { Result &= Serialize(Bytes, Element->Start, Element->Count ); } + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -65,7 +69,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, bonsai_type_info_buffer *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Count, Memory); @@ -73,12 +77,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, bonsai_type_info_buffer *Element, me - b64 HadStartPointer = Read_u64(Bytes); + b64 HadStartPointer = Read_u64(Bytes); Assert(HadStartPointer < 2); // Should be 0 or 1 - if (HadStartPointer) + if (HadStartPointer) { - umm Count =Element->Count; + umm Count = Element->Count; if (Element->Start == 0) @@ -89,6 +93,9 @@ DeserializeCurrentVersion(u8_cursor *Bytes, bonsai_type_info_buffer *Element, me Result &= Deserialize(Bytes, Element->Start, Memory, Count); } + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } @@ -101,7 +108,7 @@ Deserialize(u8_cursor *Bytes, bonsai_type_info_buffer *Element, memory_arena *Me b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index 76258eb90..ac44dd5c4 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -6,7 +6,7 @@ TypeInfo(brush_layer *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("brush_layer"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,7 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, brush_layer *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { brush_layer *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Settings); // default + Result &= Serialize(Bytes, &Element->Settings); // default @@ -64,7 +64,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, brush_layer *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Settings, Memory); @@ -88,7 +88,7 @@ Deserialize(u8_cursor *Bytes, brush_layer *Element, memory_arena *Memory, umm Co b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index 2d2f74d00..c7b5d5d5e 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -6,7 +6,7 @@ TypeInfo(brush_settings *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("brush_settings"); - Result.Version =3 ; + Result.Version = 3 ; /* type.map(member) */ /* { */ @@ -29,72 +29,72 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings *BaseElement, umm Count = b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber =3; + Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); + u64 VersionNumber = 3; Serialize(Bytes, &VersionNumber); RangeIterator_t(umm, ElementIndex, Count) { brush_settings *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); // enum + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Noise); // default + Result &= Serialize(Bytes, &Element->Noise); // default - Result &= Serialize(Bytes, &Element->Shape); // default + Result &= Serialize(Bytes, &Element->Shape); // default - Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum - Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum + Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum - Result &= Serialize(Bytes, &Element->Iterations); // default + Result &= Serialize(Bytes, &Element->Iterations); // default - Result &= Serialize(Bytes, &Element->Offset); // default + Result &= Serialize(Bytes, &Element->Offset); // default - Result &= Serialize(Bytes, &Element->NoiseBasisOffset); // default + Result &= Serialize(Bytes, &Element->NoiseBasisOffset); // default - Result &= Serialize(Bytes, &Element->HSVColor); // default + Result &= Serialize(Bytes, &Element->HSVColor); // default - Result &= Serialize(Bytes, &Element->Invert); // default + Result &= Serialize(Bytes, &Element->Invert); // default @@ -114,11 +114,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren link_internal b32 DeserializeVersioned(u8_cursor *Bytes, brush_settings *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) { - Assert(TypeInfo->Version <=3); + Assert(TypeInfo->Version <= 3); b32 Result = True; - if (TypeInfo->Version == 0) + if (TypeInfo->Version == 0) { brush_settings_0 T0 = {}; Result &= Deserialize(Bytes, &T0, Memory); @@ -138,7 +138,7 @@ DeserializeVersioned(u8_cursor *Bytes, brush_settings *Element, bonsai_type_info } - if (TypeInfo->Version ==3) + if (TypeInfo->Version == 3) { Result &= DeserializeCurrentVersion(Bytes, Element, Memory); } @@ -151,12 +151,12 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_arena *Memory) { b32 Result = True; - Element->Type = Cast(brush_layer_type, Read_u32(Bytes)); + Element->Type = Cast(brush_layer_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Noise, Memory); @@ -164,7 +164,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Shape, Memory); @@ -172,17 +172,17 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren - Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); + Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); - Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); + Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Iterations, Memory); @@ -190,7 +190,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Offset, Memory); @@ -198,7 +198,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->NoiseBasisOffset, Memory); @@ -206,7 +206,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->HSVColor, Memory); @@ -214,7 +214,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Invert, Memory); @@ -232,7 +232,7 @@ Deserialize(u8_cursor *Bytes, brush_settings *Element, memory_arena *Memory, umm b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("brush_settings")); + maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("brush_settings")); if (MaybeSerializedType.Tag) { diff --git a/generated/serdes_struct_brush_settings_0.h b/generated/serdes_struct_brush_settings_0.h index cf546fc81..f9bd3ebff 100644 --- a/generated/serdes_struct_brush_settings_0.h +++ b/generated/serdes_struct_brush_settings_0.h @@ -6,7 +6,7 @@ TypeInfo(brush_settings_0 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("brush_settings_0"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,50 +34,50 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings_0 *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { brush_settings_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); // enum + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Noise); // default + Result &= Serialize(Bytes, &Element->Noise); // default - Result &= Serialize(Bytes, &Element->Shape); // default + Result &= Serialize(Bytes, &Element->Shape); // default - Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum - Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum + Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum - Result &= Serialize(Bytes, &Element->Iterations); // default + Result &= Serialize(Bytes, &Element->Iterations); // default - Result &= Serialize(Bytes, &Element->Offset); // default + Result &= Serialize(Bytes, &Element->Offset); // default - Result &= Serialize(Bytes, &Element->Color); // default + Result &= Serialize(Bytes, &Element->Color); // default @@ -100,12 +100,12 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_0 *Element, memory_arena *Memory) { b32 Result = True; - Element->Type = Cast(brush_layer_type, Read_u32(Bytes)); + Element->Type = Cast(brush_layer_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Noise, Memory); @@ -113,7 +113,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_0 *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Shape, Memory); @@ -121,17 +121,17 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_0 *Element, memory_ar - Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); + Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); - Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); + Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Iterations, Memory); @@ -139,7 +139,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_0 *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Offset, Memory); @@ -147,7 +147,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_0 *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Color, Memory); @@ -165,7 +165,7 @@ Deserialize(u8_cursor *Bytes, brush_settings_0 *Element, memory_arena *Memory, u b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_brush_settings_1.h b/generated/serdes_struct_brush_settings_1.h index 5144e9d56..7b7ca2515 100644 --- a/generated/serdes_struct_brush_settings_1.h +++ b/generated/serdes_struct_brush_settings_1.h @@ -6,7 +6,7 @@ TypeInfo(brush_settings_1 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("brush_settings_1"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,57 +34,57 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings_1 *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { brush_settings_1 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); // enum + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Noise); // default + Result &= Serialize(Bytes, &Element->Noise); // default - Result &= Serialize(Bytes, &Element->Shape); // default + Result &= Serialize(Bytes, &Element->Shape); // default - Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum - Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum + Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum - Result &= Serialize(Bytes, &Element->Iterations); // default + Result &= Serialize(Bytes, &Element->Iterations); // default - Result &= Serialize(Bytes, &Element->Offset); // default + Result &= Serialize(Bytes, &Element->Offset); // default - Result &= Serialize(Bytes, &Element->NoiseBasisOffset); // default + Result &= Serialize(Bytes, &Element->NoiseBasisOffset); // default - Result &= Serialize(Bytes, &Element->Color); // default + Result &= Serialize(Bytes, &Element->Color); // default @@ -107,12 +107,12 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_1 *Element, memory_arena *Memory) { b32 Result = True; - Element->Type = Cast(brush_layer_type, Read_u32(Bytes)); + Element->Type = Cast(brush_layer_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Noise, Memory); @@ -120,7 +120,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_1 *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Shape, Memory); @@ -128,17 +128,17 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_1 *Element, memory_ar - Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); + Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); - Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); + Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Iterations, Memory); @@ -146,7 +146,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_1 *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Offset, Memory); @@ -154,7 +154,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_1 *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->NoiseBasisOffset, Memory); @@ -162,7 +162,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_1 *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Color, Memory); @@ -180,7 +180,7 @@ Deserialize(u8_cursor *Bytes, brush_settings_1 *Element, memory_arena *Memory, u b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_brush_settings_2.h b/generated/serdes_struct_brush_settings_2.h index b73f05c15..d3dced3b8 100644 --- a/generated/serdes_struct_brush_settings_2.h +++ b/generated/serdes_struct_brush_settings_2.h @@ -6,7 +6,7 @@ TypeInfo(brush_settings_2 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("brush_settings_2"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,64 +34,64 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings_2 *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { brush_settings_2 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); // enum + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Noise); // default + Result &= Serialize(Bytes, &Element->Noise); // default - Result &= Serialize(Bytes, &Element->Shape); // default + Result &= Serialize(Bytes, &Element->Shape); // default - Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum - Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum + Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum - Result &= Serialize(Bytes, &Element->Iterations); // default + Result &= Serialize(Bytes, &Element->Iterations); // default - Result &= Serialize(Bytes, &Element->Offset); // default + Result &= Serialize(Bytes, &Element->Offset); // default - Result &= Serialize(Bytes, &Element->NoiseBasisOffset); // default + Result &= Serialize(Bytes, &Element->NoiseBasisOffset); // default - Result &= Serialize(Bytes, &Element->Color); // default + Result &= Serialize(Bytes, &Element->Color); // default - Result &= Serialize(Bytes, &Element->Invert); // default + Result &= Serialize(Bytes, &Element->Invert); // default @@ -114,12 +114,12 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_2 *Element, memory_arena *Memory) { b32 Result = True; - Element->Type = Cast(brush_layer_type, Read_u32(Bytes)); + Element->Type = Cast(brush_layer_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Noise, Memory); @@ -127,7 +127,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_2 *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Shape, Memory); @@ -135,17 +135,17 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_2 *Element, memory_ar - Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); + Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); - Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); + Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Iterations, Memory); @@ -153,7 +153,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_2 *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Offset, Memory); @@ -161,7 +161,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_2 *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->NoiseBasisOffset, Memory); @@ -169,7 +169,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_2 *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Color, Memory); @@ -177,7 +177,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_2 *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Invert, Memory); @@ -195,7 +195,7 @@ Deserialize(u8_cursor *Bytes, brush_settings_2 *Element, memory_arena *Memory, u b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_camera.h b/generated/serdes_struct_camera.h index 888f63db3..4aecdd14c 100644 --- a/generated/serdes_struct_camera.h +++ b/generated/serdes_struct_camera.h @@ -6,7 +6,7 @@ TypeInfo(camera *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("camera"); - Result.Version =2 ; + Result.Version = 2 ; /* type.map(member) */ /* { */ @@ -29,92 +29,92 @@ Serialize(u8_cursor_block_array *Bytes, camera *BaseElement, umm Count = 1) b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber =2; + Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); + u64 VersionNumber = 2; Serialize(Bytes, &VersionNumber); RangeIterator_t(umm, ElementIndex, Count) { camera *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Frust); // default + Result &= Serialize(Bytes, &Element->Frust); // default - Result &= Serialize(Bytes, &Element->CurrentP); // default + Result &= Serialize(Bytes, &Element->CurrentP); // default - Result &= Serialize(Bytes, &Element->RenderSpacePosition); // default + Result &= Serialize(Bytes, &Element->RenderSpacePosition); // default - Result &= Serialize(Bytes, &Element->TargetPitch); // default + Result &= Serialize(Bytes, &Element->TargetPitch); // default - Result &= Serialize(Bytes, &Element->TargetRoll); // default + Result &= Serialize(Bytes, &Element->TargetRoll); // default - Result &= Serialize(Bytes, &Element->TargetYaw); // default + Result &= Serialize(Bytes, &Element->TargetYaw); // default - Result &= Serialize(Bytes, &Element->TargetDistanceFromTarget); // default + Result &= Serialize(Bytes, &Element->TargetDistanceFromTarget); // default - Result &= Serialize(Bytes, &Element->Blend); // default + Result &= Serialize(Bytes, &Element->Blend); // default - Result &= Serialize(Bytes, &Element->Front); // default + Result &= Serialize(Bytes, &Element->Front); // default - Result &= Serialize(Bytes, &Element->Right); // default + Result &= Serialize(Bytes, &Element->Right); // default - Result &= Serialize(Bytes, &Element->Up); // default + Result &= Serialize(Bytes, &Element->Up); // default - Result &= Serialize(Bytes, &Element->GhostId); // default + Result &= Serialize(Bytes, &Element->GhostId); // default @@ -134,11 +134,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor link_internal b32 DeserializeVersioned(u8_cursor *Bytes, camera *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) { - Assert(TypeInfo->Version <=2); + Assert(TypeInfo->Version <= 2); b32 Result = True; - if (TypeInfo->Version == 0) + if (TypeInfo->Version == 0) { camera_0 T0 = {}; Result &= Deserialize(Bytes, &T0, Memory); @@ -152,7 +152,7 @@ DeserializeVersioned(u8_cursor *Bytes, camera *Element, bonsai_type_info *TypeIn } - if (TypeInfo->Version ==2) + if (TypeInfo->Version == 2) { Result &= DeserializeCurrentVersion(Bytes, Element, Memory); } @@ -165,7 +165,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Frust, Memory); @@ -173,7 +173,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->CurrentP, Memory); @@ -181,7 +181,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->RenderSpacePosition, Memory); @@ -189,7 +189,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->TargetPitch, Memory); @@ -197,7 +197,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->TargetRoll, Memory); @@ -205,7 +205,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->TargetYaw, Memory); @@ -213,7 +213,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->TargetDistanceFromTarget, Memory); @@ -221,7 +221,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Blend, Memory); @@ -229,7 +229,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Front, Memory); @@ -237,7 +237,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Right, Memory); @@ -245,7 +245,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Up, Memory); @@ -253,7 +253,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->GhostId, Memory); @@ -271,7 +271,7 @@ Deserialize(u8_cursor *Bytes, camera *Element, memory_arena *Memory, umm Count) b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("camera")); + maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("camera")); if (MaybeSerializedType.Tag) { diff --git a/generated/serdes_struct_canonical_position.h b/generated/serdes_struct_canonical_position.h index 30ba25357..cf93e00ab 100644 --- a/generated/serdes_struct_canonical_position.h +++ b/generated/serdes_struct_canonical_position.h @@ -6,7 +6,7 @@ TypeInfo(canonical_position *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("canonical_position"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,14 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, canonical_position *BaseElement, umm Cou RangeIterator_t(umm, ElementIndex, Count) { canonical_position *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Offset); // default + Result &= Serialize(Bytes, &Element->Offset); // default - Result &= Serialize(Bytes, &Element->WorldP); // default + Result &= Serialize(Bytes, &Element->WorldP); // default @@ -64,7 +64,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, canonical_position *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Offset, Memory); @@ -72,7 +72,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, canonical_position *Element, memory_ - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldP, Memory); @@ -90,7 +90,7 @@ Deserialize(u8_cursor *Bytes, canonical_position *Element, memory_arena *Memory, b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_entity_0.h b/generated/serdes_struct_entity_0.h index 6f87214ca..9126ade45 100644 --- a/generated/serdes_struct_entity_0.h +++ b/generated/serdes_struct_entity_0.h @@ -6,7 +6,7 @@ TypeInfo(entity_0 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("entity_0"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,87 +34,87 @@ Serialize(u8_cursor_block_array *Bytes, entity_0 *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { entity_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Id); // default + Result &= Serialize(Bytes, &Element->Id); // default - Result &= Serialize(Bytes, &Element->P); // default + Result &= Serialize(Bytes, &Element->P); // default - Result &= Serialize(Bytes, &Element->EulerAngles); // default + Result &= Serialize(Bytes, &Element->EulerAngles); // default - Result &= Serialize(Bytes, &Element->Scale); // default + Result &= Serialize(Bytes, &Element->Scale); // default - Result &= Serialize(Bytes, &Element->_CollisionVolumeRadius); // default + Result &= Serialize(Bytes, &Element->_CollisionVolumeRadius); // default - Result &= Serialize(Bytes, &Element->Physics); // default + Result &= Serialize(Bytes, &Element->Physics); // default - Result &= Serialize(Bytes, &Element->AssetId); // default + Result &= Serialize(Bytes, &Element->AssetId); // default - Result &= Serialize(Bytes, &Element->ModelIndex); // default + Result &= Serialize(Bytes, &Element->ModelIndex); // default - if (Element->Emitter) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + if (Element->Emitter) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - Result &= Serialize(Bytes, (u32*)&Element->State); // enum + Result &= Serialize(Bytes, (u32*)&Element->State); // enum - Result &= Serialize(Bytes, (u32*)&Element->Behavior); // enum + Result &= Serialize(Bytes, (u32*)&Element->Behavior); // enum - Result &= Serialize(Bytes, &Element->UserType); // default + Result &= Serialize(Bytes, &Element->UserType); // default - if (EntityUserDataSerialize) {Result &= EntityUserDataSerialize(Bytes, Element->UserType, Element->UserData);} + if (EntityUserDataSerialize) {Result &= EntityUserDataSerialize(Bytes, Element->UserType, Element->UserData);} - if (Element->Emitter) { Result &= Serialize(Bytes, Element->Emitter); } + if (Element->Emitter) { Result &= Serialize(Bytes, Element->Emitter); } @@ -139,7 +139,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Id, Memory); @@ -147,7 +147,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->P, Memory); @@ -155,7 +155,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EulerAngles, Memory); @@ -163,7 +163,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Scale, Memory); @@ -171,7 +171,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->_CollisionVolumeRadius, Memory); @@ -179,7 +179,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Physics, Memory); @@ -187,7 +187,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->AssetId, Memory); @@ -195,7 +195,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ModelIndex, Memory); @@ -203,22 +203,22 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Mem - b64 HadEmitterPointer = Read_u64(Bytes); + b64 HadEmitterPointer = Read_u64(Bytes); Assert(HadEmitterPointer < 2); // Should be 0 or 1 - Element->State = Cast(entity_state, Read_u32(Bytes)); + Element->State = Cast(entity_state, Read_u32(Bytes)); - Element->Behavior = Cast(entity_behavior_flags, Read_u32(Bytes)); + Element->Behavior = Cast(entity_behavior_flags, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->UserType, Memory); @@ -226,11 +226,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Mem -if (EntityUserDataDeserialize) {Result &= EntityUserDataDeserialize(Bytes, &Element->UserType, &Element->UserData, Memory);} + if (EntityUserDataDeserialize) {Result &= EntityUserDataDeserialize(Bytes, &Element->UserType, &Element->UserData, Memory);} - if (HadEmitterPointer) + if (HadEmitterPointer) { - umm Count = 1; + umm Count = 1; if (Element->Emitter == 0) @@ -256,7 +256,7 @@ Deserialize(u8_cursor *Bytes, entity_0 *Element, memory_arena *Memory, umm Count b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_entity_1.h b/generated/serdes_struct_entity_1.h index 9ae177294..d22e7904c 100644 --- a/generated/serdes_struct_entity_1.h +++ b/generated/serdes_struct_entity_1.h @@ -6,7 +6,7 @@ TypeInfo(entity_1 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("entity_1"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,94 +34,94 @@ Serialize(u8_cursor_block_array *Bytes, entity_1 *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { entity_1 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Id); // default + Result &= Serialize(Bytes, &Element->Id); // default - Result &= Serialize(Bytes, &Element->P); // default + Result &= Serialize(Bytes, &Element->P); // default - Result &= Serialize(Bytes, &Element->EulerAngles); // default + Result &= Serialize(Bytes, &Element->EulerAngles); // default - Result &= Serialize(Bytes, &Element->Scale); // default + Result &= Serialize(Bytes, &Element->Scale); // default - Result &= Serialize(Bytes, &Element->_CollisionVolumeRadius); // default + Result &= Serialize(Bytes, &Element->_CollisionVolumeRadius); // default - Result &= Serialize(Bytes, &Element->Physics); // default + Result &= Serialize(Bytes, &Element->Physics); // default - Result &= Serialize(Bytes, &Element->AssetId); // default + Result &= Serialize(Bytes, &Element->AssetId); // default - Result &= Serialize(Bytes, &Element->ModelIndex); // default + Result &= Serialize(Bytes, &Element->ModelIndex); // default - if (Element->Emitter) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + if (Element->Emitter) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - Result &= Serialize(Bytes, (u32*)&Element->State); // enum + Result &= Serialize(Bytes, (u32*)&Element->State); // enum - Result &= Serialize(Bytes, (u32*)&Element->Behavior); // enum + Result &= Serialize(Bytes, (u32*)&Element->Behavior); // enum - Result &= Serialize(Bytes, &Element->Carrying); // default + Result &= Serialize(Bytes, &Element->Carrying); // default - Result &= Serialize(Bytes, &Element->UserType); // default + Result &= Serialize(Bytes, &Element->UserType); // default - if (EntityUserDataSerialize) {Result &= EntityUserDataSerialize(Bytes, Element->UserType, Element->UserData);} + if (EntityUserDataSerialize) {Result &= EntityUserDataSerialize(Bytes, Element->UserType, Element->UserData);} - if (Element->Emitter) { Result &= Serialize(Bytes, Element->Emitter); } + if (Element->Emitter) { Result &= Serialize(Bytes, Element->Emitter); } @@ -146,7 +146,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Id, Memory); @@ -154,7 +154,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->P, Memory); @@ -162,7 +162,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EulerAngles, Memory); @@ -170,7 +170,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Scale, Memory); @@ -178,7 +178,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->_CollisionVolumeRadius, Memory); @@ -186,7 +186,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Physics, Memory); @@ -194,7 +194,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->AssetId, Memory); @@ -202,7 +202,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ModelIndex, Memory); @@ -210,22 +210,22 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem - b64 HadEmitterPointer = Read_u64(Bytes); + b64 HadEmitterPointer = Read_u64(Bytes); Assert(HadEmitterPointer < 2); // Should be 0 or 1 - Element->State = Cast(entity_state, Read_u32(Bytes)); + Element->State = Cast(entity_state, Read_u32(Bytes)); - Element->Behavior = Cast(entity_behavior_flags, Read_u32(Bytes)); + Element->Behavior = Cast(entity_behavior_flags, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Carrying, Memory); @@ -233,7 +233,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->UserType, Memory); @@ -241,11 +241,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem -if (EntityUserDataDeserialize) {Result &= EntityUserDataDeserialize(Bytes, &Element->UserType, &Element->UserData, Memory);} + if (EntityUserDataDeserialize) {Result &= EntityUserDataDeserialize(Bytes, &Element->UserType, &Element->UserData, Memory);} - if (HadEmitterPointer) + if (HadEmitterPointer) { - umm Count = 1; + umm Count = 1; if (Element->Emitter == 0) @@ -271,7 +271,7 @@ Deserialize(u8_cursor *Bytes, entity_1 *Element, memory_arena *Memory, umm Count b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_entity_id.h b/generated/serdes_struct_entity_id.h index e14153f31..df47db61b 100644 --- a/generated/serdes_struct_entity_id.h +++ b/generated/serdes_struct_entity_id.h @@ -6,7 +6,7 @@ TypeInfo(entity_id *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("entity_id"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,14 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, entity_id *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { entity_id *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Index); // default + Result &= Serialize(Bytes, &Element->Index); // default - Result &= Serialize(Bytes, &Element->Generation); // default + Result &= Serialize(Bytes, &Element->Generation); // default @@ -64,7 +64,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, entity_id *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Index, Memory); @@ -72,7 +72,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_id *Element, memory_arena *Me - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Generation, Memory); @@ -90,7 +90,7 @@ Deserialize(u8_cursor *Bytes, entity_id *Element, memory_arena *Memory, umm Coun b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_file_traversal_node.h b/generated/serdes_struct_file_traversal_node.h index 56d0b04c1..c499b847b 100644 --- a/generated/serdes_struct_file_traversal_node.h +++ b/generated/serdes_struct_file_traversal_node.h @@ -6,7 +6,7 @@ TypeInfo(file_traversal_node *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("file_traversal_node"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,19 +34,19 @@ Serialize(u8_cursor_block_array *Bytes, file_traversal_node *BaseElement, umm Co RangeIterator_t(umm, ElementIndex, Count) { file_traversal_node *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); // enum + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Dir); // default + Result &= Serialize(Bytes, &Element->Dir); // default - Result &= Serialize(Bytes, &Element->Name); // default + Result &= Serialize(Bytes, &Element->Name); // default @@ -69,12 +69,12 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, file_traversal_node *Element, memory_arena *Memory) { b32 Result = True; - Element->Type = Cast(file_traversal_type, Read_u32(Bytes)); + Element->Type = Cast(file_traversal_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Dir, Memory); @@ -82,7 +82,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, file_traversal_node *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Name, Memory); @@ -100,7 +100,7 @@ Deserialize(u8_cursor *Bytes, file_traversal_node *Element, memory_arena *Memory b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_frustum.h b/generated/serdes_struct_frustum.h index c6227c448..b2f758002 100644 --- a/generated/serdes_struct_frustum.h +++ b/generated/serdes_struct_frustum.h @@ -6,7 +6,7 @@ TypeInfo(frustum *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("frustum"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,56 +34,56 @@ Serialize(u8_cursor_block_array *Bytes, frustum *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { frustum *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->farClip); // default + Result &= Serialize(Bytes, &Element->farClip); // default - Result &= Serialize(Bytes, &Element->nearClip); // default + Result &= Serialize(Bytes, &Element->nearClip); // default - Result &= Serialize(Bytes, &Element->width); // default + Result &= Serialize(Bytes, &Element->width); // default - Result &= Serialize(Bytes, &Element->FOV); // default + Result &= Serialize(Bytes, &Element->FOV); // default - Result &= Serialize(Bytes, &Element->Top); // default + Result &= Serialize(Bytes, &Element->Top); // default - Result &= Serialize(Bytes, &Element->Bot); // default + Result &= Serialize(Bytes, &Element->Bot); // default - Result &= Serialize(Bytes, &Element->Left); // default + Result &= Serialize(Bytes, &Element->Left); // default - Result &= Serialize(Bytes, &Element->Right); // default + Result &= Serialize(Bytes, &Element->Right); // default @@ -106,7 +106,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, frustum *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->farClip, Memory); @@ -114,7 +114,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, frustum *Element, memory_arena *Memo - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->nearClip, Memory); @@ -122,7 +122,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, frustum *Element, memory_arena *Memo - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->width, Memory); @@ -130,7 +130,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, frustum *Element, memory_arena *Memo - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->FOV, Memory); @@ -138,7 +138,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, frustum *Element, memory_arena *Memo - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Top, Memory); @@ -146,7 +146,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, frustum *Element, memory_arena *Memo - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Bot, Memory); @@ -154,7 +154,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, frustum *Element, memory_arena *Memo - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Left, Memory); @@ -162,7 +162,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, frustum *Element, memory_arena *Memo - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Right, Memory); @@ -180,7 +180,7 @@ Deserialize(u8_cursor *Bytes, frustum *Element, memory_arena *Memory, umm Count) b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_keyframe.h b/generated/serdes_struct_keyframe.h index 1e599eb4b..fd856aa4b 100644 --- a/generated/serdes_struct_keyframe.h +++ b/generated/serdes_struct_keyframe.h @@ -6,7 +6,7 @@ TypeInfo(keyframe *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("keyframe"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,14 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, keyframe *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { keyframe *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->tEnd); // default + Result &= Serialize(Bytes, &Element->tEnd); // default - Result &= Serialize(Bytes, &Element->Value); // default + Result &= Serialize(Bytes, &Element->Value); // default @@ -64,7 +64,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, keyframe *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->tEnd, Memory); @@ -72,7 +72,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, keyframe *Element, memory_arena *Mem - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Value, Memory); @@ -90,7 +90,7 @@ Deserialize(u8_cursor *Bytes, keyframe *Element, memory_arena *Memory, umm Count b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 586f49ea5..6d3826770 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -6,7 +6,7 @@ TypeInfo(layered_brush *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("layered_brush"); - Result.Version =3 ; + Result.Version = 3 ; /* type.map(member) */ /* { */ @@ -29,23 +29,23 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush *BaseElement, umm Count = b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber =3; + Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); + u64 VersionNumber = 3; Serialize(Bytes, &VersionNumber); RangeIterator_t(umm, ElementIndex, Count) { layered_brush *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->LayerCount); // default + Result &= Serialize(Bytes, &Element->LayerCount); // default - { - // TODO(Jesse): Should this really be a safe cast? + { + // TODO(Jesse): Should this really be a safe cast? umm ThisCount = umm(Element->LayerCount); Result &= Serialize(Bytes, Element->Layers, ThisCount); @@ -55,26 +55,26 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush *BaseElement, umm Count = - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default + Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default - Result &= Serialize(Bytes, &Element->BrushFollowsCursor); // default + Result &= Serialize(Bytes, &Element->BrushFollowsCursor); // default - Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum - Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum + Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum @@ -99,11 +99,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena link_internal b32 DeserializeVersioned(u8_cursor *Bytes, layered_brush *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) { - Assert(TypeInfo->Version <=3); + Assert(TypeInfo->Version <= 3); b32 Result = True; - if (TypeInfo->Version == 0) + if (TypeInfo->Version == 0) { layered_brush_0 T0 = {}; Result &= Deserialize(Bytes, &T0, Memory); @@ -123,7 +123,7 @@ DeserializeVersioned(u8_cursor *Bytes, layered_brush *Element, bonsai_type_info } - if (TypeInfo->Version ==3) + if (TypeInfo->Version == 3) { Result &= DeserializeCurrentVersion(Bytes, Element, Memory); } @@ -136,7 +136,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->LayerCount, Memory); @@ -144,8 +144,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena - { - // TODO(Jesse): Should this really be a safe cast? + { + // TODO(Jesse): Should this really be a safe cast? umm Count = umm(Element->LayerCount); Result &= Deserialize(Bytes, Element->Layers, Memory, Count); @@ -155,7 +155,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); @@ -163,7 +163,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->BrushFollowsCursor, Memory); @@ -171,12 +171,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena - Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); + Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); - Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); + Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); @@ -197,7 +197,7 @@ Deserialize(u8_cursor *Bytes, layered_brush *Element, memory_arena *Memory, umm b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("layered_brush")); + maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("layered_brush")); if (MaybeSerializedType.Tag) { diff --git a/generated/serdes_struct_layered_brush_0.h b/generated/serdes_struct_layered_brush_0.h index a2b1c4d7f..edbfdc8f1 100644 --- a/generated/serdes_struct_layered_brush_0.h +++ b/generated/serdes_struct_layered_brush_0.h @@ -6,7 +6,7 @@ TypeInfo(layered_brush_0 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("layered_brush_0"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,15 +34,15 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_0 *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { layered_brush_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->LayerCount); // default + Result &= Serialize(Bytes, &Element->LayerCount); // default - { - // TODO(Jesse): Should this really be a safe cast? + { + // TODO(Jesse): Should this really be a safe cast? umm ThisCount = umm(Element->LayerCount); Result &= Serialize(Bytes, Element->Layers, ThisCount); @@ -75,7 +75,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_0 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->LayerCount, Memory); @@ -83,8 +83,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_0 *Element, memory_are - { - // TODO(Jesse): Should this really be a safe cast? + { + // TODO(Jesse): Should this really be a safe cast? umm Count = umm(Element->LayerCount); Result &= Deserialize(Bytes, Element->Layers, Memory, Count); @@ -110,7 +110,7 @@ Deserialize(u8_cursor *Bytes, layered_brush_0 *Element, memory_arena *Memory, um b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_layered_brush_1.h b/generated/serdes_struct_layered_brush_1.h index 298f7e78e..2416f478d 100644 --- a/generated/serdes_struct_layered_brush_1.h +++ b/generated/serdes_struct_layered_brush_1.h @@ -6,7 +6,7 @@ TypeInfo(layered_brush_1 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("layered_brush_1"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,8 +34,8 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_1 *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { layered_brush_1 *Element = BaseElement + ElementIndex; - { - umm ThisCount = (256); + { + umm ThisCount = (256); Result &= Serialize(Bytes, Element->NameBuf, ThisCount); } @@ -44,15 +44,15 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_1 *BaseElement, umm Count - Result &= Serialize(Bytes, &Element->LayerCount); // default + Result &= Serialize(Bytes, &Element->LayerCount); // default - { - // TODO(Jesse): Should this really be a safe cast? + { + // TODO(Jesse): Should this really be a safe cast? umm ThisCount = umm(Element->LayerCount); Result &= Serialize(Bytes, Element->Layers, ThisCount); @@ -62,14 +62,14 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_1 *BaseElement, umm Count - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default + Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default - Result &= Serialize(Bytes, &Element->BrushFollowsCursor); // default + Result &= Serialize(Bytes, &Element->BrushFollowsCursor); // default @@ -99,8 +99,8 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_1 *Element, memory_arena *Memory) { b32 Result = True; - { - umm Count = (256); + { + umm Count = (256); Result &= Deserialize(Bytes, Element->NameBuf, Memory, Count); } @@ -109,7 +109,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_1 *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->LayerCount, Memory); @@ -117,8 +117,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_1 *Element, memory_are - { - // TODO(Jesse): Should this really be a safe cast? + { + // TODO(Jesse): Should this really be a safe cast? umm Count = umm(Element->LayerCount); Result &= Deserialize(Bytes, Element->Layers, Memory, Count); @@ -128,7 +128,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_1 *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); @@ -136,7 +136,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_1 *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->BrushFollowsCursor, Memory); @@ -160,7 +160,7 @@ Deserialize(u8_cursor *Bytes, layered_brush_1 *Element, memory_arena *Memory, um b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_layered_brush_2.h b/generated/serdes_struct_layered_brush_2.h index b51d14d81..cdd9facb6 100644 --- a/generated/serdes_struct_layered_brush_2.h +++ b/generated/serdes_struct_layered_brush_2.h @@ -6,7 +6,7 @@ TypeInfo(layered_brush_2 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("layered_brush_2"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,15 +34,15 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_2 *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { layered_brush_2 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->LayerCount); // default + Result &= Serialize(Bytes, &Element->LayerCount); // default - { - // TODO(Jesse): Should this really be a safe cast? + { + // TODO(Jesse): Should this really be a safe cast? umm ThisCount = umm(Element->LayerCount); Result &= Serialize(Bytes, Element->Layers, ThisCount); @@ -52,14 +52,14 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_2 *BaseElement, umm Count - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default + Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default - Result &= Serialize(Bytes, &Element->BrushFollowsCursor); // default + Result &= Serialize(Bytes, &Element->BrushFollowsCursor); // default @@ -89,7 +89,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_2 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->LayerCount, Memory); @@ -97,8 +97,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_2 *Element, memory_are - { - // TODO(Jesse): Should this really be a safe cast? + { + // TODO(Jesse): Should this really be a safe cast? umm Count = umm(Element->LayerCount); Result &= Deserialize(Bytes, Element->Layers, Memory, Count); @@ -108,7 +108,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_2 *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); @@ -116,7 +116,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_2 *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->BrushFollowsCursor, Memory); @@ -140,7 +140,7 @@ Deserialize(u8_cursor *Bytes, layered_brush_2 *Element, memory_arena *Memory, um b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_lighting_settings.h b/generated/serdes_struct_lighting_settings.h index 026def4c5..7cb4e5954 100644 --- a/generated/serdes_struct_lighting_settings.h +++ b/generated/serdes_struct_lighting_settings.h @@ -6,7 +6,7 @@ TypeInfo(lighting_settings *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("lighting_settings"); - Result.Version =1 ; + Result.Version = 1 ; /* type.map(member) */ /* { */ @@ -29,92 +29,92 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings *BaseElement, umm Coun b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber =1; + Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); + u64 VersionNumber = 1; Serialize(Bytes, &VersionNumber); RangeIterator_t(umm, ElementIndex, Count) { lighting_settings *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->AutoDayNightCycle); // default + Result &= Serialize(Bytes, &Element->AutoDayNightCycle); // default - Result &= Serialize(Bytes, &Element->tDay); // default + Result &= Serialize(Bytes, &Element->tDay); // default - Result &= Serialize(Bytes, &Element->SunP); // default + Result &= Serialize(Bytes, &Element->SunP); // default - Result &= Serialize(Bytes, &Element->DawnIntensity); // default + Result &= Serialize(Bytes, &Element->DawnIntensity); // default - Result &= Serialize(Bytes, &Element->DawnColor); // default + Result &= Serialize(Bytes, &Element->DawnColor); // default - Result &= Serialize(Bytes, &Element->SunIntensity); // default + Result &= Serialize(Bytes, &Element->SunIntensity); // default - Result &= Serialize(Bytes, &Element->SunColor); // default + Result &= Serialize(Bytes, &Element->SunColor); // default - Result &= Serialize(Bytes, &Element->DuskIntensity); // default + Result &= Serialize(Bytes, &Element->DuskIntensity); // default - Result &= Serialize(Bytes, &Element->DuskColor); // default + Result &= Serialize(Bytes, &Element->DuskColor); // default - Result &= Serialize(Bytes, &Element->MoonIntensity); // default + Result &= Serialize(Bytes, &Element->MoonIntensity); // default - Result &= Serialize(Bytes, &Element->MoonColor); // default + Result &= Serialize(Bytes, &Element->MoonColor); // default - Result &= Serialize(Bytes, &Element->CurrentSunColor); // default + Result &= Serialize(Bytes, &Element->CurrentSunColor); // default @@ -134,11 +134,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a link_internal b32 DeserializeVersioned(u8_cursor *Bytes, lighting_settings *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) { - Assert(TypeInfo->Version <=1); + Assert(TypeInfo->Version <= 1); b32 Result = True; - if (TypeInfo->Version == 0) + if (TypeInfo->Version == 0) { lighting_settings_0 T0 = {}; Result &= Deserialize(Bytes, &T0, Memory); @@ -146,7 +146,7 @@ DeserializeVersioned(u8_cursor *Bytes, lighting_settings *Element, bonsai_type_i } - if (TypeInfo->Version ==1) + if (TypeInfo->Version == 1) { Result &= DeserializeCurrentVersion(Bytes, Element, Memory); } @@ -159,7 +159,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->AutoDayNightCycle, Memory); @@ -167,7 +167,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->tDay, Memory); @@ -175,7 +175,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SunP, Memory); @@ -183,7 +183,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DawnIntensity, Memory); @@ -191,7 +191,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DawnColor, Memory); @@ -199,7 +199,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SunIntensity, Memory); @@ -207,7 +207,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SunColor, Memory); @@ -215,7 +215,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DuskIntensity, Memory); @@ -223,7 +223,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DuskColor, Memory); @@ -231,7 +231,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->MoonIntensity, Memory); @@ -239,7 +239,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->MoonColor, Memory); @@ -247,7 +247,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->CurrentSunColor, Memory); @@ -265,7 +265,7 @@ Deserialize(u8_cursor *Bytes, lighting_settings *Element, memory_arena *Memory, b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("lighting_settings")); + maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("lighting_settings")); if (MaybeSerializedType.Tag) { diff --git a/generated/serdes_struct_lighting_settings_0.h b/generated/serdes_struct_lighting_settings_0.h index 17705cf53..63bb1864d 100644 --- a/generated/serdes_struct_lighting_settings_0.h +++ b/generated/serdes_struct_lighting_settings_0.h @@ -6,7 +6,7 @@ TypeInfo(lighting_settings_0 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("lighting_settings_0"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,84 +34,84 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings_0 *BaseElement, umm Co RangeIterator_t(umm, ElementIndex, Count) { lighting_settings_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->AutoDayNightCycle); // default + Result &= Serialize(Bytes, &Element->AutoDayNightCycle); // default - Result &= Serialize(Bytes, &Element->tDay); // default + Result &= Serialize(Bytes, &Element->tDay); // default - Result &= Serialize(Bytes, &Element->SunP); // default + Result &= Serialize(Bytes, &Element->SunP); // default - Result &= Serialize(Bytes, &Element->DawnColor); // default + Result &= Serialize(Bytes, &Element->DawnColor); // default - Result &= Serialize(Bytes, &Element->SunColor); // default + Result &= Serialize(Bytes, &Element->SunColor); // default - Result &= Serialize(Bytes, &Element->DuskColor); // default + Result &= Serialize(Bytes, &Element->DuskColor); // default - Result &= Serialize(Bytes, &Element->MoonColor); // default + Result &= Serialize(Bytes, &Element->MoonColor); // default - Result &= Serialize(Bytes, &Element->SunIntensity); // default + Result &= Serialize(Bytes, &Element->SunIntensity); // default - Result &= Serialize(Bytes, &Element->MoonIntensity); // default + Result &= Serialize(Bytes, &Element->MoonIntensity); // default - Result &= Serialize(Bytes, &Element->DawnIntensity); // default + Result &= Serialize(Bytes, &Element->DawnIntensity); // default - Result &= Serialize(Bytes, &Element->DuskIntensity); // default + Result &= Serialize(Bytes, &Element->DuskIntensity); // default - Result &= Serialize(Bytes, &Element->CurrentSunColor); // default + Result &= Serialize(Bytes, &Element->CurrentSunColor); // default @@ -134,7 +134,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->AutoDayNightCycle, Memory); @@ -142,7 +142,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->tDay, Memory); @@ -150,7 +150,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SunP, Memory); @@ -158,7 +158,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DawnColor, Memory); @@ -166,7 +166,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SunColor, Memory); @@ -174,7 +174,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DuskColor, Memory); @@ -182,7 +182,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->MoonColor, Memory); @@ -190,7 +190,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SunIntensity, Memory); @@ -198,7 +198,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->MoonIntensity, Memory); @@ -206,7 +206,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DawnIntensity, Memory); @@ -214,7 +214,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DuskIntensity, Memory); @@ -222,7 +222,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->CurrentSunColor, Memory); @@ -240,7 +240,7 @@ Deserialize(u8_cursor *Bytes, lighting_settings_0 *Element, memory_arena *Memory b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_model.h b/generated/serdes_struct_model.h index 32465cc28..cc3076959 100644 --- a/generated/serdes_struct_model.h +++ b/generated/serdes_struct_model.h @@ -6,7 +6,7 @@ TypeInfo(model *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("model"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,28 +34,28 @@ Serialize(u8_cursor_block_array *Bytes, model *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { model *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Vox); // default + Result &= Serialize(Bytes, &Element->Vox); // default - Result &= Serialize(Bytes, &Element->TransparentMesh); // default + Result &= Serialize(Bytes, &Element->TransparentMesh); // default - Result &= Serialize(Bytes, &Element->Animation); // default + Result &= Serialize(Bytes, &Element->Animation); // default - Result &= Serialize(Bytes, &Element->Dim); // default + Result &= Serialize(Bytes, &Element->Dim); // default @@ -78,7 +78,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, model *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Vox, Memory); @@ -86,7 +86,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, model *Element, memory_arena *Memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->TransparentMesh, Memory); @@ -94,7 +94,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, model *Element, memory_arena *Memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Animation, Memory); @@ -102,7 +102,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, model *Element, memory_arena *Memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Dim, Memory); @@ -120,7 +120,7 @@ Deserialize(u8_cursor *Bytes, model *Element, memory_arena *Memory, umm Count) b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_noise_layer.h b/generated/serdes_struct_noise_layer.h index c316c4e0f..e8e32b754 100644 --- a/generated/serdes_struct_noise_layer.h +++ b/generated/serdes_struct_noise_layer.h @@ -6,7 +6,7 @@ TypeInfo(noise_layer *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("noise_layer"); - Result.Version =1 ; + Result.Version = 1 ; /* type.map(member) */ /* { */ @@ -29,34 +29,34 @@ Serialize(u8_cursor_block_array *Bytes, noise_layer *BaseElement, umm Count = 1) b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber =1; + Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); + u64 VersionNumber = 1; Serialize(Bytes, &VersionNumber); RangeIterator_t(umm, ElementIndex, Count) { noise_layer *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); // enum + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->White); // default + Result &= Serialize(Bytes, &Element->White); // default - Result &= Serialize(Bytes, &Element->Perlin); // default + Result &= Serialize(Bytes, &Element->Perlin); // default - Result &= Serialize(Bytes, &Element->Voronoi); // default + Result &= Serialize(Bytes, &Element->Voronoi); // default @@ -76,11 +76,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, noise_layer *Element, memory_arena * link_internal b32 DeserializeVersioned(u8_cursor *Bytes, noise_layer *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) { - Assert(TypeInfo->Version <=1); + Assert(TypeInfo->Version <= 1); b32 Result = True; - if (TypeInfo->Version == 0) + if (TypeInfo->Version == 0) { noise_layer_0 T0 = {}; Result &= Deserialize(Bytes, &T0, Memory); @@ -88,7 +88,7 @@ DeserializeVersioned(u8_cursor *Bytes, noise_layer *Element, bonsai_type_info *T } - if (TypeInfo->Version ==1) + if (TypeInfo->Version == 1) { Result &= DeserializeCurrentVersion(Bytes, Element, Memory); } @@ -101,12 +101,12 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, noise_layer *Element, memory_arena *Memory) { b32 Result = True; - Element->Type = Cast(ui_noise_type, Read_u32(Bytes)); + Element->Type = Cast(ui_noise_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->White, Memory); @@ -114,7 +114,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, noise_layer *Element, memory_arena * - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Perlin, Memory); @@ -122,7 +122,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, noise_layer *Element, memory_arena * - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Voronoi, Memory); @@ -140,7 +140,7 @@ Deserialize(u8_cursor *Bytes, noise_layer *Element, memory_arena *Memory, umm Co b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("noise_layer")); + maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("noise_layer")); if (MaybeSerializedType.Tag) { diff --git a/generated/serdes_struct_noise_layer_0.h b/generated/serdes_struct_noise_layer_0.h index c51ce8924..b8c4d926b 100644 --- a/generated/serdes_struct_noise_layer_0.h +++ b/generated/serdes_struct_noise_layer_0.h @@ -6,7 +6,7 @@ TypeInfo(noise_layer_0 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("noise_layer_0"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,19 +34,19 @@ Serialize(u8_cursor_block_array *Bytes, noise_layer_0 *BaseElement, umm Count = RangeIterator_t(umm, ElementIndex, Count) { noise_layer_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); // enum + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Perlin); // default + Result &= Serialize(Bytes, &Element->Perlin); // default - Result &= Serialize(Bytes, &Element->Voronoi); // default + Result &= Serialize(Bytes, &Element->Voronoi); // default @@ -69,12 +69,12 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, noise_layer_0 *Element, memory_arena *Memory) { b32 Result = True; - Element->Type = Cast(ui_noise_type, Read_u32(Bytes)); + Element->Type = Cast(ui_noise_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Perlin, Memory); @@ -82,7 +82,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, noise_layer_0 *Element, memory_arena - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Voronoi, Memory); @@ -100,7 +100,7 @@ Deserialize(u8_cursor *Bytes, noise_layer_0 *Element, memory_arena *Memory, umm b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_particle_system.h b/generated/serdes_struct_particle_system.h index ad8c3262e..2e7185b6f 100644 --- a/generated/serdes_struct_particle_system.h +++ b/generated/serdes_struct_particle_system.h @@ -6,7 +6,7 @@ TypeInfo(particle_system *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("particle_system"); - Result.Version =1 ; + Result.Version = 1 ; /* type.map(member) */ /* { */ @@ -29,161 +29,161 @@ Serialize(u8_cursor_block_array *Bytes, particle_system *BaseElement, umm Count b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber =1; + Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); + u64 VersionNumber = 1; Serialize(Bytes, &VersionNumber); RangeIterator_t(umm, ElementIndex, Count) { particle_system *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Entropy); // default + Result &= Serialize(Bytes, &Element->Entropy); // default - Result &= Serialize(Bytes, (u32*)&Element->SpawnType); // enum + Result &= Serialize(Bytes, (u32*)&Element->SpawnType); // enum - Result &= Serialize(Bytes, &Element->Drag); // default + Result &= Serialize(Bytes, &Element->Drag); // default - Result &= Serialize(Bytes, &Element->Lifetime); // default + Result &= Serialize(Bytes, &Element->Lifetime); // default - Result &= Serialize(Bytes, &Element->EmissionDelay); // default + Result &= Serialize(Bytes, &Element->EmissionDelay); // default - Result &= Serialize(Bytes, &Element->EmissionLifespan); // default + Result &= Serialize(Bytes, &Element->EmissionLifespan); // default - Result &= Serialize(Bytes, &Element->ActiveParticles); // default + Result &= Serialize(Bytes, &Element->ActiveParticles); // default - Result &= Serialize(Bytes, &Element->LifespanMod); // default + Result &= Serialize(Bytes, &Element->LifespanMod); // default - Result &= Serialize(Bytes, &Element->ParticleLifespan); // default + Result &= Serialize(Bytes, &Element->ParticleLifespan); // default - Result &= Serialize(Bytes, &Element->ParticlesPerSecond); // default + Result &= Serialize(Bytes, &Element->ParticlesPerSecond); // default - Result &= Serialize(Bytes, &Element->ParticleLightEmission); // default + Result &= Serialize(Bytes, &Element->ParticleLightEmission); // default - Result &= Serialize(Bytes, &Element->ParticleLightEmissionChance); // default + Result &= Serialize(Bytes, &Element->ParticleLightEmissionChance); // default - Result &= Serialize(Bytes, &Element->ParticleStartingTransparency); // default + Result &= Serialize(Bytes, &Element->ParticleStartingTransparency); // default - Result &= Serialize(Bytes, &Element->ParticleEndingTransparency); // default + Result &= Serialize(Bytes, &Element->ParticleEndingTransparency); // default - Result &= Serialize(Bytes, &Element->ParticleStartingDim); // default + Result &= Serialize(Bytes, &Element->ParticleStartingDim); // default - Result &= Serialize(Bytes, &Element->ParticleEndingDim); // default + Result &= Serialize(Bytes, &Element->ParticleEndingDim); // default - Result &= Serialize(Bytes, &Element->ParticleTurbMin); // default + Result &= Serialize(Bytes, &Element->ParticleTurbMin); // default - Result &= Serialize(Bytes, &Element->ParticleTurbMax); // default + Result &= Serialize(Bytes, &Element->ParticleTurbMax); // default - Result &= Serialize(Bytes, &Element->SpawnRegion); // default + Result &= Serialize(Bytes, &Element->SpawnRegion); // default - Result &= Serialize(Bytes, &Element->SystemMovementCoefficient); // default + Result &= Serialize(Bytes, &Element->SystemMovementCoefficient); // default - Result &= Serialize(Bytes, &Element->ElapsedSinceLastEmission); // default + Result &= Serialize(Bytes, &Element->ElapsedSinceLastEmission); // default - { - umm ThisCount = 6; + { + umm ThisCount = 6; Result &= Serialize(Bytes, Element->PackedHSVColors, ThisCount); } @@ -212,11 +212,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are link_internal b32 DeserializeVersioned(u8_cursor *Bytes, particle_system *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) { - Assert(TypeInfo->Version <=1); + Assert(TypeInfo->Version <= 1); b32 Result = True; - if (TypeInfo->Version == 0) + if (TypeInfo->Version == 0) { particle_system_0 T0 = {}; Result &= Deserialize(Bytes, &T0, Memory); @@ -224,7 +224,7 @@ DeserializeVersioned(u8_cursor *Bytes, particle_system *Element, bonsai_type_inf } - if (TypeInfo->Version ==1) + if (TypeInfo->Version == 1) { Result &= DeserializeCurrentVersion(Bytes, Element, Memory); } @@ -237,7 +237,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Entropy, Memory); @@ -245,12 +245,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - Element->SpawnType = Cast(particle_spawn_type, Read_u32(Bytes)); + Element->SpawnType = Cast(particle_spawn_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Drag, Memory); @@ -258,7 +258,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Lifetime, Memory); @@ -266,7 +266,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EmissionDelay, Memory); @@ -274,7 +274,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EmissionLifespan, Memory); @@ -282,7 +282,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ActiveParticles, Memory); @@ -290,7 +290,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->LifespanMod, Memory); @@ -298,7 +298,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleLifespan, Memory); @@ -306,7 +306,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticlesPerSecond, Memory); @@ -314,7 +314,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleLightEmission, Memory); @@ -322,7 +322,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleLightEmissionChance, Memory); @@ -330,7 +330,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleStartingTransparency, Memory); @@ -338,7 +338,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleEndingTransparency, Memory); @@ -346,7 +346,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleStartingDim, Memory); @@ -354,7 +354,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleEndingDim, Memory); @@ -362,7 +362,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleTurbMin, Memory); @@ -370,7 +370,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleTurbMax, Memory); @@ -378,7 +378,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SpawnRegion, Memory); @@ -386,7 +386,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SystemMovementCoefficient, Memory); @@ -394,7 +394,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ElapsedSinceLastEmission, Memory); @@ -402,8 +402,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are - { - umm Count = 6; + { + umm Count = 6; Result &= Deserialize(Bytes, Element->PackedHSVColors, Memory, Count); } @@ -428,7 +428,7 @@ Deserialize(u8_cursor *Bytes, particle_system *Element, memory_arena *Memory, um b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("particle_system")); + maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("particle_system")); if (MaybeSerializedType.Tag) { diff --git a/generated/serdes_struct_particle_system_0.h b/generated/serdes_struct_particle_system_0.h index 8ffcb212e..b63862fce 100644 --- a/generated/serdes_struct_particle_system_0.h +++ b/generated/serdes_struct_particle_system_0.h @@ -6,7 +6,7 @@ TypeInfo(particle_system_0 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("particle_system_0"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,153 +34,153 @@ Serialize(u8_cursor_block_array *Bytes, particle_system_0 *BaseElement, umm Coun RangeIterator_t(umm, ElementIndex, Count) { particle_system_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Entropy); // default + Result &= Serialize(Bytes, &Element->Entropy); // default - Result &= Serialize(Bytes, (u32*)&Element->SpawnType); // enum + Result &= Serialize(Bytes, (u32*)&Element->SpawnType); // enum - Result &= Serialize(Bytes, &Element->Drag); // default + Result &= Serialize(Bytes, &Element->Drag); // default - Result &= Serialize(Bytes, &Element->Lifetime); // default + Result &= Serialize(Bytes, &Element->Lifetime); // default - Result &= Serialize(Bytes, &Element->EmissionDelay); // default + Result &= Serialize(Bytes, &Element->EmissionDelay); // default - Result &= Serialize(Bytes, &Element->EmissionLifespan); // default + Result &= Serialize(Bytes, &Element->EmissionLifespan); // default - Result &= Serialize(Bytes, &Element->ActiveParticles); // default + Result &= Serialize(Bytes, &Element->ActiveParticles); // default - Result &= Serialize(Bytes, &Element->LifespanMod); // default + Result &= Serialize(Bytes, &Element->LifespanMod); // default - Result &= Serialize(Bytes, &Element->ParticleLifespan); // default + Result &= Serialize(Bytes, &Element->ParticleLifespan); // default - Result &= Serialize(Bytes, &Element->ParticlesPerSecond); // default + Result &= Serialize(Bytes, &Element->ParticlesPerSecond); // default - Result &= Serialize(Bytes, &Element->ParticleLightEmission); // default + Result &= Serialize(Bytes, &Element->ParticleLightEmission); // default - Result &= Serialize(Bytes, &Element->ParticleLightEmissionChance); // default + Result &= Serialize(Bytes, &Element->ParticleLightEmissionChance); // default - Result &= Serialize(Bytes, &Element->ParticleStartingTransparency); // default + Result &= Serialize(Bytes, &Element->ParticleStartingTransparency); // default - Result &= Serialize(Bytes, &Element->ParticleEndingTransparency); // default + Result &= Serialize(Bytes, &Element->ParticleEndingTransparency); // default - Result &= Serialize(Bytes, &Element->ParticleStartingDim); // default + Result &= Serialize(Bytes, &Element->ParticleStartingDim); // default - Result &= Serialize(Bytes, &Element->ParticleEndingDim); // default + Result &= Serialize(Bytes, &Element->ParticleEndingDim); // default - Result &= Serialize(Bytes, &Element->ParticleTurbMin); // default + Result &= Serialize(Bytes, &Element->ParticleTurbMin); // default - Result &= Serialize(Bytes, &Element->ParticleTurbMax); // default + Result &= Serialize(Bytes, &Element->ParticleTurbMax); // default - Result &= Serialize(Bytes, &Element->SpawnRegion); // default + Result &= Serialize(Bytes, &Element->SpawnRegion); // default - Result &= Serialize(Bytes, &Element->SystemMovementCoefficient); // default + Result &= Serialize(Bytes, &Element->SystemMovementCoefficient); // default - Result &= Serialize(Bytes, &Element->ElapsedSinceLastEmission); // default + Result &= Serialize(Bytes, &Element->ElapsedSinceLastEmission); // default - { - umm ThisCount = 6; + { + umm ThisCount = 6; Result &= Serialize(Bytes, Element->MCVColors, ThisCount); } @@ -212,7 +212,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Entropy, Memory); @@ -220,12 +220,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - Element->SpawnType = Cast(particle_spawn_type, Read_u32(Bytes)); + Element->SpawnType = Cast(particle_spawn_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Drag, Memory); @@ -233,7 +233,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Lifetime, Memory); @@ -241,7 +241,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EmissionDelay, Memory); @@ -249,7 +249,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EmissionLifespan, Memory); @@ -257,7 +257,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ActiveParticles, Memory); @@ -265,7 +265,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->LifespanMod, Memory); @@ -273,7 +273,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleLifespan, Memory); @@ -281,7 +281,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticlesPerSecond, Memory); @@ -289,7 +289,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleLightEmission, Memory); @@ -297,7 +297,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleLightEmissionChance, Memory); @@ -305,7 +305,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleStartingTransparency, Memory); @@ -313,7 +313,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleEndingTransparency, Memory); @@ -321,7 +321,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleStartingDim, Memory); @@ -329,7 +329,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleEndingDim, Memory); @@ -337,7 +337,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleTurbMin, Memory); @@ -345,7 +345,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ParticleTurbMax, Memory); @@ -353,7 +353,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SpawnRegion, Memory); @@ -361,7 +361,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SystemMovementCoefficient, Memory); @@ -369,7 +369,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ElapsedSinceLastEmission, Memory); @@ -377,8 +377,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a - { - umm Count = 6; + { + umm Count = 6; Result &= Deserialize(Bytes, Element->MCVColors, Memory, Count); } @@ -403,7 +403,7 @@ Deserialize(u8_cursor *Bytes, particle_system_0 *Element, memory_arena *Memory, b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_perlin_noise_params.h b/generated/serdes_struct_perlin_noise_params.h index 28b8d2b4b..48b18d1c9 100644 --- a/generated/serdes_struct_perlin_noise_params.h +++ b/generated/serdes_struct_perlin_noise_params.h @@ -6,7 +6,7 @@ TypeInfo(perlin_noise_params *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("perlin_noise_params"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,21 +34,21 @@ Serialize(u8_cursor_block_array *Bytes, perlin_noise_params *BaseElement, umm Co RangeIterator_t(umm, ElementIndex, Count) { perlin_noise_params *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Threshold); // default + Result &= Serialize(Bytes, &Element->Threshold); // default - Result &= Serialize(Bytes, &Element->Period); // default + Result &= Serialize(Bytes, &Element->Period); // default - Result &= Serialize(Bytes, &Element->Amplitude); // default + Result &= Serialize(Bytes, &Element->Amplitude); // default @@ -71,7 +71,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, perlin_noise_params *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Threshold, Memory); @@ -79,7 +79,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, perlin_noise_params *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Period, Memory); @@ -87,7 +87,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, perlin_noise_params *Element, memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Amplitude, Memory); @@ -105,7 +105,7 @@ Deserialize(u8_cursor *Bytes, perlin_noise_params *Element, memory_arena *Memory b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_physics.h b/generated/serdes_struct_physics.h index 27e2bbaf1..2ac8ec369 100644 --- a/generated/serdes_struct_physics.h +++ b/generated/serdes_struct_physics.h @@ -6,7 +6,7 @@ TypeInfo(physics *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("physics"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,35 +34,35 @@ Serialize(u8_cursor_block_array *Bytes, physics *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { physics *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Velocity); // default + Result &= Serialize(Bytes, &Element->Velocity); // default - Result &= Serialize(Bytes, &Element->Force); // default + Result &= Serialize(Bytes, &Element->Force); // default - Result &= Serialize(Bytes, &Element->Delta); // default + Result &= Serialize(Bytes, &Element->Delta); // default - Result &= Serialize(Bytes, &Element->Mass); // default + Result &= Serialize(Bytes, &Element->Mass); // default - Result &= Serialize(Bytes, &Element->Speed); // default + Result &= Serialize(Bytes, &Element->Speed); // default @@ -85,7 +85,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, physics *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Velocity, Memory); @@ -93,7 +93,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, physics *Element, memory_arena *Memo - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Force, Memory); @@ -101,7 +101,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, physics *Element, memory_arena *Memo - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Delta, Memory); @@ -109,7 +109,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, physics *Element, memory_arena *Memo - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Mass, Memory); @@ -117,7 +117,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, physics *Element, memory_arena *Memo - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Speed, Memory); @@ -135,7 +135,7 @@ Deserialize(u8_cursor *Bytes, physics *Element, memory_arena *Memory, umm Count) b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_plane.h b/generated/serdes_struct_plane.h index d35aa097b..3b09179ba 100644 --- a/generated/serdes_struct_plane.h +++ b/generated/serdes_struct_plane.h @@ -6,7 +6,7 @@ TypeInfo(plane *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("plane"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,21 +34,21 @@ Serialize(u8_cursor_block_array *Bytes, plane *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { plane *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->P); // default + Result &= Serialize(Bytes, &Element->P); // default - Result &= Serialize(Bytes, &Element->Normal); // default + Result &= Serialize(Bytes, &Element->Normal); // default - Result &= Serialize(Bytes, &Element->d); // default + Result &= Serialize(Bytes, &Element->d); // default @@ -78,7 +78,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, plane *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->P, Memory); @@ -86,7 +86,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, plane *Element, memory_arena *Memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Normal, Memory); @@ -94,7 +94,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, plane *Element, memory_arena *Memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->d, Memory); @@ -118,7 +118,7 @@ Deserialize(u8_cursor *Bytes, plane *Element, memory_arena *Memory, umm Count) b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_random_series.h b/generated/serdes_struct_random_series.h index 30dbe3c00..9701c5f6e 100644 --- a/generated/serdes_struct_random_series.h +++ b/generated/serdes_struct_random_series.h @@ -6,7 +6,7 @@ TypeInfo(random_series *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("random_series"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,7 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, random_series *BaseElement, umm Count = RangeIterator_t(umm, ElementIndex, Count) { random_series *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Seed); // default + Result &= Serialize(Bytes, &Element->Seed); // default + + + + + + + @@ -57,10 +64,16 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, random_series *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Seed, Memory); + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); @@ -75,7 +88,7 @@ Deserialize(u8_cursor *Bytes, random_series *Element, memory_arena *Memory, umm b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_rect3.h b/generated/serdes_struct_rect3.h index ac152ff10..a141742d7 100644 --- a/generated/serdes_struct_rect3.h +++ b/generated/serdes_struct_rect3.h @@ -6,7 +6,7 @@ TypeInfo(rect3 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("rect3"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,14 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, rect3 *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { rect3 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Min); // default + Result &= Serialize(Bytes, &Element->Min); // default - Result &= Serialize(Bytes, &Element->Max); // default + Result &= Serialize(Bytes, &Element->Max); // default @@ -64,7 +64,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, rect3 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Min, Memory); @@ -72,7 +72,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, rect3 *Element, memory_arena *Memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Max, Memory); @@ -90,7 +90,7 @@ Deserialize(u8_cursor *Bytes, rect3 *Element, memory_arena *Memory, umm Count) b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_rect3cp.h b/generated/serdes_struct_rect3cp.h new file mode 100644 index 000000000..e65e300ed --- /dev/null +++ b/generated/serdes_struct_rect3cp.h @@ -0,0 +1,100 @@ +// src/engine/serdes.cpp:274:0 + +link_internal bonsai_type_info +TypeInfo(rect3cp *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("rect3cp"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, rect3cp *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + rect3cp *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->Min); // default + + + + + + + Result &= Serialize(Bytes, &Element->Max); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, rect3cp *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, rect3cp *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, rect3cp *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Min, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Max, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, rect3cp *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serdes_struct_rect3i.h b/generated/serdes_struct_rect3i.h index 3b2f2e797..900ffd2ed 100644 --- a/generated/serdes_struct_rect3i.h +++ b/generated/serdes_struct_rect3i.h @@ -6,7 +6,7 @@ TypeInfo(rect3i *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("rect3i"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,14 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, rect3i *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { rect3i *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Min); // default + Result &= Serialize(Bytes, &Element->Min); // default - Result &= Serialize(Bytes, &Element->Max); // default + Result &= Serialize(Bytes, &Element->Max); // default @@ -64,7 +64,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, rect3i *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Min, Memory); @@ -72,7 +72,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, rect3i *Element, memory_arena *Memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Max, Memory); @@ -90,7 +90,7 @@ Deserialize(u8_cursor *Bytes, rect3i *Element, memory_arena *Memory, umm Count) b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_render_settings.h b/generated/serdes_struct_render_settings.h index 226f568c0..6aa9b5b7e 100644 --- a/generated/serdes_struct_render_settings.h +++ b/generated/serdes_struct_render_settings.h @@ -6,7 +6,7 @@ TypeInfo(render_settings *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("render_settings"); - Result.Version =2 ; + Result.Version = 2 ; /* type.map(member) */ /* { */ @@ -29,153 +29,153 @@ Serialize(u8_cursor_block_array *Bytes, render_settings *BaseElement, umm Count b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber =2; + Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); + u64 VersionNumber = 2; Serialize(Bytes, &VersionNumber); RangeIterator_t(umm, ElementIndex, Count) { render_settings *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->UseSsao); // default + Result &= Serialize(Bytes, &Element->UseSsao); // default - Result &= Serialize(Bytes, &Element->UseShadowMapping); // default + Result &= Serialize(Bytes, &Element->UseShadowMapping); // default - Result &= Serialize(Bytes, &Element->UseLightingBloom); // default + Result &= Serialize(Bytes, &Element->UseLightingBloom); // default - Result &= Serialize(Bytes, &Element->BravoilMyersOIT); // default + Result &= Serialize(Bytes, &Element->BravoilMyersOIT); // default - Result &= Serialize(Bytes, &Element->BravoilMcGuireOIT); // default + Result &= Serialize(Bytes, &Element->BravoilMcGuireOIT); // default - Result &= Serialize(Bytes, &Element->DrawMajorGrid); // default + Result &= Serialize(Bytes, &Element->DrawMajorGrid); // default - Result &= Serialize(Bytes, &Element->DrawMinorGrid); // default + Result &= Serialize(Bytes, &Element->DrawMinorGrid); // default - Result &= Serialize(Bytes, &Element->MajorGridDim); // default + Result &= Serialize(Bytes, &Element->MajorGridDim); // default - Result &= Serialize(Bytes, &Element->DrawCameraGhost); // default + Result &= Serialize(Bytes, &Element->DrawCameraGhost); // default - Result &= Serialize(Bytes, &Element->CameraGhostSize); // default + Result &= Serialize(Bytes, &Element->CameraGhostSize); // default - Result &= Serialize(Bytes, &Element->OffsetOfWorldCenterToGrid); // default + Result &= Serialize(Bytes, &Element->OffsetOfWorldCenterToGrid); // default - Result &= Serialize(Bytes, &Element->Headless); // default + Result &= Serialize(Bytes, &Element->Headless); // default - Result &= Serialize(Bytes, (u32*)&Element->ToneMappingType); // enum + Result &= Serialize(Bytes, (u32*)&Element->ToneMappingType); // enum - Result &= Serialize(Bytes, &Element->GameCameraFOV); // default + Result &= Serialize(Bytes, &Element->GameCameraFOV); // default - Result &= Serialize(Bytes, &Element->Lighting); // default + Result &= Serialize(Bytes, &Element->Lighting); // default - Result &= Serialize(Bytes, &Element->ApplicationResolution); // default + Result &= Serialize(Bytes, &Element->ApplicationResolution); // default - Result &= Serialize(Bytes, &Element->ShadowMapResolution); // default + Result &= Serialize(Bytes, &Element->ShadowMapResolution); // default - Result &= Serialize(Bytes, &Element->LuminanceMapResolution); // default + Result &= Serialize(Bytes, &Element->LuminanceMapResolution); // default - Result &= Serialize(Bytes, &Element->iApplicationResolution); // default + Result &= Serialize(Bytes, &Element->iApplicationResolution); // default - Result &= Serialize(Bytes, &Element->iShadowMapResolution); // default + Result &= Serialize(Bytes, &Element->iShadowMapResolution); // default - Result &= Serialize(Bytes, &Element->iLuminanceMapResolution); // default + Result &= Serialize(Bytes, &Element->iLuminanceMapResolution); // default @@ -195,11 +195,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are link_internal b32 DeserializeVersioned(u8_cursor *Bytes, render_settings *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) { - Assert(TypeInfo->Version <=2); + Assert(TypeInfo->Version <= 2); b32 Result = True; - if (TypeInfo->Version == 0) + if (TypeInfo->Version == 0) { render_settings_0 T0 = {}; Result &= Deserialize(Bytes, &T0, Memory); @@ -213,7 +213,7 @@ DeserializeVersioned(u8_cursor *Bytes, render_settings *Element, bonsai_type_inf } - if (TypeInfo->Version ==2) + if (TypeInfo->Version == 2) { Result &= DeserializeCurrentVersion(Bytes, Element, Memory); } @@ -226,7 +226,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->UseSsao, Memory); @@ -234,7 +234,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->UseShadowMapping, Memory); @@ -242,7 +242,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->UseLightingBloom, Memory); @@ -250,7 +250,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->BravoilMyersOIT, Memory); @@ -258,7 +258,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->BravoilMcGuireOIT, Memory); @@ -266,7 +266,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DrawMajorGrid, Memory); @@ -274,7 +274,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DrawMinorGrid, Memory); @@ -282,7 +282,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->MajorGridDim, Memory); @@ -290,7 +290,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DrawCameraGhost, Memory); @@ -298,7 +298,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->CameraGhostSize, Memory); @@ -306,7 +306,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->OffsetOfWorldCenterToGrid, Memory); @@ -314,7 +314,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Headless, Memory); @@ -322,12 +322,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - Element->ToneMappingType = Cast(tone_mapping_type, Read_u32(Bytes)); + Element->ToneMappingType = Cast(tone_mapping_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->GameCameraFOV, Memory); @@ -335,7 +335,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Lighting, Memory); @@ -343,7 +343,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ApplicationResolution, Memory); @@ -351,7 +351,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ShadowMapResolution, Memory); @@ -359,7 +359,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->LuminanceMapResolution, Memory); @@ -367,7 +367,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->iApplicationResolution, Memory); @@ -375,7 +375,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->iShadowMapResolution, Memory); @@ -383,7 +383,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->iLuminanceMapResolution, Memory); @@ -401,7 +401,7 @@ Deserialize(u8_cursor *Bytes, render_settings *Element, memory_arena *Memory, um b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("render_settings")); + maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("render_settings")); if (MaybeSerializedType.Tag) { diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index b32975468..bf6899b0f 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -6,7 +6,7 @@ TypeInfo(shape_layer *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("shape_layer"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,19 +34,19 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { shape_layer *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Type); // enum + Result &= Serialize(Bytes, (u32*)&Element->Type); // enum - Result &= Serialize(Bytes, &Element->Sphere); // default + Result &= Serialize(Bytes, &Element->Sphere); // default - Result &= Serialize(Bytes, &Element->Rect); // default + Result &= Serialize(Bytes, &Element->Rect); // default @@ -69,12 +69,12 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer *Element, memory_arena *Memory) { b32 Result = True; - Element->Type = Cast(shape_type, Read_u32(Bytes)); + Element->Type = Cast(shape_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Sphere, Memory); @@ -82,7 +82,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer *Element, memory_arena * - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Rect, Memory); @@ -100,7 +100,7 @@ Deserialize(u8_cursor *Bytes, shape_layer *Element, memory_arena *Memory, umm Co b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_vertex_material.h b/generated/serdes_struct_vertex_material.h index d3f311efe..7a28031a0 100644 --- a/generated/serdes_struct_vertex_material.h +++ b/generated/serdes_struct_vertex_material.h @@ -6,7 +6,7 @@ TypeInfo(vertex_material *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("vertex_material"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,21 +34,21 @@ Serialize(u8_cursor_block_array *Bytes, vertex_material *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { vertex_material *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->ColorIndex); // default + Result &= Serialize(Bytes, &Element->ColorIndex); // default - Result &= Serialize(Bytes, &Element->Transparency); // default + Result &= Serialize(Bytes, &Element->Transparency); // default - Result &= Serialize(Bytes, &Element->Emission); // default + Result &= Serialize(Bytes, &Element->Emission); // default @@ -71,7 +71,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, vertex_material *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->ColorIndex, Memory); @@ -79,7 +79,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, vertex_material *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Transparency, Memory); @@ -87,7 +87,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, vertex_material *Element, memory_are - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Emission, Memory); @@ -105,7 +105,7 @@ Deserialize(u8_cursor *Bytes, vertex_material *Element, memory_arena *Memory, um b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_voronoi_noise_params.h b/generated/serdes_struct_voronoi_noise_params.h index 7c0e5d8a1..61b221139 100644 --- a/generated/serdes_struct_voronoi_noise_params.h +++ b/generated/serdes_struct_voronoi_noise_params.h @@ -6,7 +6,7 @@ TypeInfo(voronoi_noise_params *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("voronoi_noise_params"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,35 +34,35 @@ Serialize(u8_cursor_block_array *Bytes, voronoi_noise_params *BaseElement, umm C RangeIterator_t(umm, ElementIndex, Count) { voronoi_noise_params *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Threshold); // default + Result &= Serialize(Bytes, &Element->Threshold); // default - Result &= Serialize(Bytes, &Element->Period); // default + Result &= Serialize(Bytes, &Element->Period); // default - Result &= Serialize(Bytes, &Element->Amplitude); // default + Result &= Serialize(Bytes, &Element->Amplitude); // default - Result &= Serialize(Bytes, &Element->Squareness); // default + Result &= Serialize(Bytes, &Element->Squareness); // default - Result &= Serialize(Bytes, &Element->MaskChance); // default + Result &= Serialize(Bytes, &Element->MaskChance); // default @@ -85,7 +85,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, voronoi_noise_params *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Threshold, Memory); @@ -93,7 +93,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, voronoi_noise_params *Element, memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Period, Memory); @@ -101,7 +101,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, voronoi_noise_params *Element, memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Amplitude, Memory); @@ -109,7 +109,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, voronoi_noise_params *Element, memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Squareness, Memory); @@ -117,7 +117,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, voronoi_noise_params *Element, memor - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->MaskChance, Memory); @@ -135,7 +135,7 @@ Deserialize(u8_cursor *Bytes, voronoi_noise_params *Element, memory_arena *Memor b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_vox_data.h b/generated/serdes_struct_vox_data.h index fa972d20f..12c73ca06 100644 --- a/generated/serdes_struct_vox_data.h +++ b/generated/serdes_struct_vox_data.h @@ -6,7 +6,7 @@ TypeInfo(vox_data *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("vox_data"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,10 +34,18 @@ Serialize(u8_cursor_block_array *Bytes, vox_data *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { vox_data *Element = BaseElement + ElementIndex; - if (Element->ChunkData) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + if (Element->ChunkData) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - if (Element->ChunkData) { Result &= Serialize(Bytes, Element->ChunkData); } + + + + + if (Element->ChunkData) { Result &= Serialize(Bytes, Element->ChunkData); } + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -58,12 +66,16 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, vox_data *Element, memory_arena *Memory) { b32 Result = True; - b64 HadChunkDataPointer = Read_u64(Bytes); + b64 HadChunkDataPointer = Read_u64(Bytes); Assert(HadChunkDataPointer < 2); // Should be 0 or 1 - if (HadChunkDataPointer) + + + + + if (HadChunkDataPointer) { - umm Count = 1; + umm Count = 1; if (Element->ChunkData == 0) @@ -74,6 +86,9 @@ DeserializeCurrentVersion(u8_cursor *Bytes, vox_data *Element, memory_arena *Mem Result &= Deserialize(Bytes, Element->ChunkData, Memory, Count); } + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } @@ -86,7 +101,7 @@ Deserialize(u8_cursor *Bytes, vox_data *Element, memory_arena *Memory, umm Count b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_voxel.h b/generated/serdes_struct_voxel.h index bb2c7b1f0..e43899ac2 100644 --- a/generated/serdes_struct_voxel.h +++ b/generated/serdes_struct_voxel.h @@ -6,7 +6,7 @@ TypeInfo(voxel *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("voxel"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,14 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, voxel *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { voxel *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Transparency); // default + Result &= Serialize(Bytes, &Element->Transparency); // default - Result &= Serialize(Bytes, &Element->Color); // default + Result &= Serialize(Bytes, &Element->Color); // default @@ -64,7 +64,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, voxel *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Transparency, Memory); @@ -72,7 +72,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, voxel *Element, memory_arena *Memory - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Color, Memory); @@ -90,7 +90,7 @@ Deserialize(u8_cursor *Bytes, voxel *Element, memory_arena *Memory, umm Count) b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_voxel_lighting.h b/generated/serdes_struct_voxel_lighting.h index c0eea8ccf..d21d4af08 100644 --- a/generated/serdes_struct_voxel_lighting.h +++ b/generated/serdes_struct_voxel_lighting.h @@ -6,7 +6,7 @@ TypeInfo(voxel_lighting *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("voxel_lighting"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,7 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, voxel_lighting *BaseElement, umm Count = RangeIterator_t(umm, ElementIndex, Count) { voxel_lighting *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Emission); // default + Result &= Serialize(Bytes, &Element->Emission); // default + + + + + + + @@ -57,10 +64,16 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, voxel_lighting *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Emission, Memory); + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); @@ -75,7 +88,7 @@ Deserialize(u8_cursor *Bytes, voxel_lighting *Element, memory_arena *Memory, umm b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_white_noise_params.h b/generated/serdes_struct_white_noise_params.h index 2e78a11c4..265f006d5 100644 --- a/generated/serdes_struct_white_noise_params.h +++ b/generated/serdes_struct_white_noise_params.h @@ -6,7 +6,7 @@ TypeInfo(white_noise_params *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("white_noise_params"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,7 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, white_noise_params *BaseElement, umm Cou RangeIterator_t(umm, ElementIndex, Count) { white_noise_params *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Threshold); // default + Result &= Serialize(Bytes, &Element->Threshold); // default + + + + + + + @@ -57,10 +64,16 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, white_noise_params *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Threshold, Memory); + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); @@ -75,7 +88,7 @@ Deserialize(u8_cursor *Bytes, white_noise_params *Element, memory_arena *Memory, b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_world_chunk.h b/generated/serdes_struct_world_chunk.h index 10cffa3bd..3ce3d1d8a 100644 --- a/generated/serdes_struct_world_chunk.h +++ b/generated/serdes_struct_world_chunk.h @@ -6,7 +6,7 @@ TypeInfo(world_chunk *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("world_chunk"); - Result.Version =1 ; + Result.Version = 1 ; /* type.map(member) */ /* { */ @@ -29,54 +29,54 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber =1; + Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); + u64 VersionNumber = 1; Serialize(Bytes, &VersionNumber); RangeIterator_t(umm, ElementIndex, Count) { world_chunk *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Dim); // default + Result &= Serialize(Bytes, &Element->Dim); // default - if (Element->Occupancy) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + if (Element->Occupancy) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - if (Element->xOccupancyBorder) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + if (Element->xOccupancyBorder) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - if (Element->FaceMasks) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + if (Element->FaceMasks) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - if (Element->Voxels) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + if (Element->Voxels) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - if (Element->VoxelLighting) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + if (Element->VoxelLighting) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - Result &= Serialize(Bytes, &Element->DimInChunks); // default + Result &= Serialize(Bytes, &Element->DimInChunks); // default - Result &= Serialize(Bytes, &Element->WorldP); // default + Result &= Serialize(Bytes, &Element->WorldP); // default @@ -85,23 +85,23 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) - if (Element->Occupancy) { Result &= Serialize(Bytes, Element->Occupancy); } + if (Element->Occupancy) { Result &= Serialize(Bytes, Element->Occupancy); } - if (Element->xOccupancyBorder) { Result &= Serialize(Bytes, Element->xOccupancyBorder); } + if (Element->xOccupancyBorder) { Result &= Serialize(Bytes, Element->xOccupancyBorder); } - if (Element->FaceMasks) { Result &= Serialize(Bytes, Element->FaceMasks); } + if (Element->FaceMasks) { Result &= Serialize(Bytes, Element->FaceMasks); } - if (Element->Voxels) { Result &= Serialize(Bytes, Element->Voxels, Cast(umm, Volume(Element->Dim)) ); } + if (Element->Voxels) { Result &= Serialize(Bytes, Element->Voxels, Cast(umm, Volume(Element->Dim)) ); } - if (Element->VoxelLighting) { Result &= Serialize(Bytes, Element->VoxelLighting, Cast(umm, Volume(Element->Dim)) ); } + if (Element->VoxelLighting) { Result &= Serialize(Bytes, Element->VoxelLighting, Cast(umm, Volume(Element->Dim)) ); } @@ -123,11 +123,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * link_internal b32 DeserializeVersioned(u8_cursor *Bytes, world_chunk *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) { - Assert(TypeInfo->Version <=1); + Assert(TypeInfo->Version <= 1); b32 Result = True; - if (TypeInfo->Version == 0) + if (TypeInfo->Version == 0) { world_chunk_0 T0 = {}; Result &= Deserialize(Bytes, &T0, Memory); @@ -135,7 +135,7 @@ DeserializeVersioned(u8_cursor *Bytes, world_chunk *Element, bonsai_type_info *T } - if (TypeInfo->Version ==1) + if (TypeInfo->Version == 1) { Result &= DeserializeCurrentVersion(Bytes, Element, Memory); } @@ -148,7 +148,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Dim, Memory); @@ -156,32 +156,32 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * - b64 HadOccupancyPointer = Read_u64(Bytes); + b64 HadOccupancyPointer = Read_u64(Bytes); Assert(HadOccupancyPointer < 2); // Should be 0 or 1 - b64 HadxOccupancyBorderPointer = Read_u64(Bytes); + b64 HadxOccupancyBorderPointer = Read_u64(Bytes); Assert(HadxOccupancyBorderPointer < 2); // Should be 0 or 1 - b64 HadFaceMasksPointer = Read_u64(Bytes); + b64 HadFaceMasksPointer = Read_u64(Bytes); Assert(HadFaceMasksPointer < 2); // Should be 0 or 1 - b64 HadVoxelsPointer = Read_u64(Bytes); + b64 HadVoxelsPointer = Read_u64(Bytes); Assert(HadVoxelsPointer < 2); // Should be 0 or 1 - b64 HadVoxelLightingPointer = Read_u64(Bytes); + b64 HadVoxelLightingPointer = Read_u64(Bytes); Assert(HadVoxelLightingPointer < 2); // Should be 0 or 1 - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DimInChunks, Memory); @@ -189,7 +189,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldP, Memory); @@ -199,9 +199,9 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * - if (HadOccupancyPointer) + if (HadOccupancyPointer) { - umm Count = 1; + umm Count = 1; if (Element->Occupancy == 0) @@ -213,9 +213,9 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * } - if (HadxOccupancyBorderPointer) + if (HadxOccupancyBorderPointer) { - umm Count = 1; + umm Count = 1; if (Element->xOccupancyBorder == 0) @@ -227,9 +227,9 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * } - if (HadFaceMasksPointer) + if (HadFaceMasksPointer) { - umm Count = 1; + umm Count = 1; if (Element->FaceMasks == 0) @@ -241,9 +241,9 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * } - if (HadVoxelsPointer) + if (HadVoxelsPointer) { - umm Count = Cast(umm, Volume(Element->Dim)); + umm Count = Cast(umm, Volume(Element->Dim)); if (Element->Voxels == 0) @@ -255,9 +255,9 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * } - if (HadVoxelLightingPointer) + if (HadVoxelLightingPointer) { - umm Count = Cast(umm, Volume(Element->Dim)); + umm Count = Cast(umm, Volume(Element->Dim)); if (Element->VoxelLighting == 0) @@ -283,7 +283,7 @@ Deserialize(u8_cursor *Bytes, world_chunk *Element, memory_arena *Memory, umm Co b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("world_chunk")); + maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("world_chunk")); if (MaybeSerializedType.Tag) { diff --git a/generated/serdes_struct_world_chunk_0.h b/generated/serdes_struct_world_chunk_0.h index cef7152e0..d1387ed9b 100644 --- a/generated/serdes_struct_world_chunk_0.h +++ b/generated/serdes_struct_world_chunk_0.h @@ -6,7 +6,7 @@ TypeInfo(world_chunk_0 *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("world_chunk_0"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,24 +34,24 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk_0 *BaseElement, umm Count = RangeIterator_t(umm, ElementIndex, Count) { world_chunk_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Dim); // default + Result &= Serialize(Bytes, &Element->Dim); // default - if (Element->Voxels) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + if (Element->Voxels) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - if (Element->VoxelLighting) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + if (Element->VoxelLighting) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - Result &= Serialize(Bytes, &Element->WorldP); // default + Result &= Serialize(Bytes, &Element->WorldP); // default @@ -60,11 +60,11 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk_0 *BaseElement, umm Count = - if (Element->Voxels) { Result &= Serialize(Bytes, Element->Voxels, Cast(umm, Volume(Element->Dim)) ); } + if (Element->Voxels) { Result &= Serialize(Bytes, Element->Voxels, Cast(umm, Volume(Element->Dim)) ); } - if (Element->VoxelLighting) { Result &= Serialize(Bytes, Element->VoxelLighting, Cast(umm, Volume(Element->Dim)) ); } + if (Element->VoxelLighting) { Result &= Serialize(Bytes, Element->VoxelLighting, Cast(umm, Volume(Element->Dim)) ); } @@ -89,7 +89,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk_0 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Dim, Memory); @@ -97,17 +97,17 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk_0 *Element, memory_arena - b64 HadVoxelsPointer = Read_u64(Bytes); + b64 HadVoxelsPointer = Read_u64(Bytes); Assert(HadVoxelsPointer < 2); // Should be 0 or 1 - b64 HadVoxelLightingPointer = Read_u64(Bytes); + b64 HadVoxelLightingPointer = Read_u64(Bytes); Assert(HadVoxelLightingPointer < 2); // Should be 0 or 1 - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldP, Memory); @@ -117,9 +117,9 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk_0 *Element, memory_arena - if (HadVoxelsPointer) + if (HadVoxelsPointer) { - umm Count = Cast(umm, Volume(Element->Dim)); + umm Count = Cast(umm, Volume(Element->Dim)); if (Element->Voxels == 0) @@ -131,9 +131,9 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk_0 *Element, memory_arena } - if (HadVoxelLightingPointer) + if (HadVoxelLightingPointer) { - umm Count = Cast(umm, Volume(Element->Dim)); + umm Count = Cast(umm, Volume(Element->Dim)); if (Element->VoxelLighting == 0) @@ -159,7 +159,7 @@ Deserialize(u8_cursor *Bytes, world_chunk_0 *Element, memory_arena *Memory, umm b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_world_update_op_shape_params_rect.h b/generated/serdes_struct_world_update_op_shape_params_rect.h index 29f2c5517..9ef43049a 100644 --- a/generated/serdes_struct_world_update_op_shape_params_rect.h +++ b/generated/serdes_struct_world_update_op_shape_params_rect.h @@ -6,7 +6,7 @@ TypeInfo(world_update_op_shape_params_rect *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("world_update_op_shape_params_rect"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,7 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_rect *BaseE RangeIterator_t(umm, ElementIndex, Count) { world_update_op_shape_params_rect *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Region); // default + Result &= Serialize(Bytes, &Element->Region); // default + + + + + + + @@ -57,10 +64,16 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_rect *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Region, Memory); + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); @@ -75,7 +88,7 @@ Deserialize(u8_cursor *Bytes, world_update_op_shape_params_rect *Element, memory b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_world_update_op_shape_params_sphere.h b/generated/serdes_struct_world_update_op_shape_params_sphere.h index 2928910bc..99804ca63 100644 --- a/generated/serdes_struct_world_update_op_shape_params_sphere.h +++ b/generated/serdes_struct_world_update_op_shape_params_sphere.h @@ -6,7 +6,7 @@ TypeInfo(world_update_op_shape_params_sphere *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("world_update_op_shape_params_sphere"); - Result.Version = 0 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -34,14 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_sphere *Bas RangeIterator_t(umm, ElementIndex, Count) { world_update_op_shape_params_sphere *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Location); // default + Result &= Serialize(Bytes, &Element->Location); // default - Result &= Serialize(Bytes, &Element->Radius); // default + Result &= Serialize(Bytes, &Element->Radius); // default @@ -64,7 +64,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_sphere *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Location, Memory); @@ -72,7 +72,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_sphere - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Radius, Memory); @@ -90,7 +90,7 @@ Deserialize(u8_cursor *Bytes, world_update_op_shape_params_sphere *Element, memo b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serialize_struct_entity.h b/generated/serialize_struct_entity.h index ffecab17e..72f3b3b5c 100644 --- a/generated/serialize_struct_entity.h +++ b/generated/serialize_struct_entity.h @@ -6,7 +6,7 @@ TypeInfo(entity *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("entity"); - Result.Version =2 ; + Result.Version = 2 ; /* type.map(member) */ /* { */ @@ -29,102 +29,102 @@ Serialize(u8_cursor_block_array *Bytes, entity *BaseElement, umm Count = 1) b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber =2; + Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); + u64 VersionNumber = 2; Serialize(Bytes, &VersionNumber); RangeIterator_t(umm, ElementIndex, Count) { entity *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Id); // default + Result &= Serialize(Bytes, &Element->Id); // default - Result &= Serialize(Bytes, &Element->P); // default + Result &= Serialize(Bytes, &Element->P); // default - Result &= Serialize(Bytes, &Element->EulerAngles); // default + Result &= Serialize(Bytes, &Element->EulerAngles); // default - Result &= Serialize(Bytes, &Element->Scale); // default + Result &= Serialize(Bytes, &Element->Scale); // default - Result &= Serialize(Bytes, &Element->_CollisionVolumeRadius); // default + Result &= Serialize(Bytes, &Element->_CollisionVolumeRadius); // default - Result &= Serialize(Bytes, &Element->Physics); // default + Result &= Serialize(Bytes, &Element->Physics); // default - Result &= Serialize(Bytes, &Element->AssetId); // default + Result &= Serialize(Bytes, &Element->AssetId); // default - Result &= Serialize(Bytes, &Element->ModelIndex); // default + Result &= Serialize(Bytes, &Element->ModelIndex); // default - if (Element->Emitter) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + if (Element->Emitter) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - Result &= Serialize(Bytes, (u32*)&Element->State); // enum + Result &= Serialize(Bytes, (u32*)&Element->State); // enum - Result &= Serialize(Bytes, (u32*)&Element->Behavior); // enum + Result &= Serialize(Bytes, (u32*)&Element->Behavior); // enum - Result &= Serialize(Bytes, &Element->Carrying); // default + Result &= Serialize(Bytes, &Element->Carrying); // default - Result &= Serialize(Bytes, &Element->UserType); // default + Result &= Serialize(Bytes, &Element->UserType); // default - if (EntityUserDataSerialize) {Result &= EntityUserDataSerialize(Bytes, Element->UserType, Element->UserData);} + if (EntityUserDataSerialize) {Result &= EntityUserDataSerialize(Bytes, Element->UserType, Element->UserData);} - if (Element->Emitter) { Result &= Serialize(Bytes, Element->Emitter); } + if (Element->Emitter) { Result &= Serialize(Bytes, Element->Emitter); } diff --git a/generated/serialize_struct_level_header.h b/generated/serialize_struct_level_header.h index 55368322f..281c1632d 100644 --- a/generated/serialize_struct_level_header.h +++ b/generated/serialize_struct_level_header.h @@ -6,7 +6,7 @@ TypeInfo(level_header *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("level_header"); - Result.Version =4 ; + Result.Version = 4 ; /* type.map(member) */ /* { */ @@ -29,57 +29,57 @@ Serialize(u8_cursor_block_array *Bytes, level_header *BaseElement, umm Count = 1 b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber =4; + Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); + u64 VersionNumber = 4; Serialize(Bytes, &VersionNumber); RangeIterator_t(umm, ElementIndex, Count) { level_header *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->ChunkCount); // default + Result &= Serialize(Bytes, &Element->ChunkCount); // default - Result &= Serialize(Bytes, &Element->EntityCount); // default + Result &= Serialize(Bytes, &Element->EntityCount); // default - Result &= Serialize(Bytes, &Element->WorldFlags); // default + Result &= Serialize(Bytes, &Element->WorldFlags); // default - Result &= Serialize(Bytes, &Element->WorldCenter); // default + Result &= Serialize(Bytes, &Element->WorldCenter); // default - Result &= Serialize(Bytes, &Element->VisibleRegion); // default + Result &= Serialize(Bytes, &Element->VisibleRegion); // default - Result &= Serialize(Bytes, &Element->Camera); // default + Result &= Serialize(Bytes, &Element->Camera); // default - Result &= Serialize(Bytes, &Element->RenderSettings); // default + Result &= Serialize(Bytes, &Element->RenderSettings); // default diff --git a/generated/serialize_struct_render_settings_0.h b/generated/serialize_struct_render_settings_0.h index 0519cd4e0..3e38fc72a 100644 --- a/generated/serialize_struct_render_settings_0.h +++ b/generated/serialize_struct_render_settings_0.h @@ -13,7 +13,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->UseSsao, Memory); @@ -21,7 +21,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->UseShadowMapping, Memory); @@ -29,7 +29,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->UseLightingBloom, Memory); @@ -37,7 +37,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->BravoilMyersOIT, Memory); @@ -45,7 +45,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->BravoilMcGuireOIT, Memory); @@ -53,7 +53,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DrawMajorGrid, Memory); @@ -61,7 +61,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DrawMinorGrid, Memory); @@ -69,7 +69,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->MajorGridDim, Memory); @@ -77,7 +77,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->OffsetOfWorldCenterToGrid, Memory); @@ -85,7 +85,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_a - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Headless, Memory); @@ -93,12 +93,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_a - Element->ToneMappingType = Cast(tone_mapping_type, Read_u32(Bytes)); + Element->ToneMappingType = Cast(tone_mapping_type, Read_u32(Bytes)); - // NOTE(Jesse): Unfortunately we can't check for primitives because + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Lighting, Memory); @@ -116,7 +116,7 @@ Deserialize(u8_cursor *Bytes, render_settings_0 *Element, memory_arena *Memory, b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index aa61c38af..39eeb6b23 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -1,17 +1,19 @@ // src/engine/bloom.h:11:0 link_internal void -InitializeBloomDownsampleShader( bloom_downsample_shader *Struct , v2*SrcResolution ) +InitializeBloomDownsampleShader( bloom_downsample_shader *Struct , v2 *SrcResolution ) { - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_downsample.fragmentshader")); + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_downsample.fragmentshader")); u32 UniformIndex = 0; - Struct->SrcResolution = SrcResolution; + Struct->SrcResolution = SrcResolution; Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->SrcResolution, "SrcResolution"); ++UniformIndex; - if (UniformIndex != 1 ) + + + if (UniformIndex != 1 ) { Error("Shader (bloom_downsample_shader) had an incorrect number of uniform slots!"); } @@ -28,10 +30,12 @@ UseShader( bloom_downsample_shader *Struct ) s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - if (UniformIndex != 1 ) + + + if (UniformIndex != 1 ) { Error("Shader (bloom_downsample_shader) had an incorrect number of uniform slots!"); } diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index d31035222..d3455c0f7 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -1,17 +1,19 @@ // src/engine/bloom.h:25:0 link_internal void -InitializeBloomUpsampleShader( bloom_upsample_shader *Struct , f32*FilterRadius ) +InitializeBloomUpsampleShader( bloom_upsample_shader *Struct , f32 *FilterRadius ) { - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_upsample.fragmentshader")); + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_upsample.fragmentshader")); u32 UniformIndex = 0; - Struct->FilterRadius = FilterRadius; + Struct->FilterRadius = FilterRadius; Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->FilterRadius, "FilterRadius"); ++UniformIndex; - if (UniformIndex != 1 ) + + + if (UniformIndex != 1 ) { Error("Shader (bloom_upsample_shader) had an incorrect number of uniform slots!"); } @@ -28,10 +30,12 @@ UseShader( bloom_upsample_shader *Struct ) s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - if (UniformIndex != 1 ) + + + if (UniformIndex != 1 ) { Error("Shader (bloom_upsample_shader) had an incorrect number of uniform slots!"); } diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index a00d4ec3c..4bc41dc21 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -1,29 +1,29 @@ // src/engine/render/shadow_map.h:21:0 link_internal void -InitializeShadowMapShader( shadow_map_shader *Struct , m4 MVP , m4 ModelMatrix , v3*MinClipP_worldspace , v3*MaxClipP_worldspace ) +InitializeShadowMapShader( shadow_map_shader *Struct , m4 MVP , m4 ModelMatrix , v3 *MinClipP_worldspace , v3 *MaxClipP_worldspace ) { - Struct->Program = LoadShaders(CSz("shaders/DepthRTT.vertexshader"), CSz("shaders/DepthRTT.fragmentshader")); + Struct->Program = LoadShaders(CSz("shaders/DepthRTT.vertexshader"), CSz("shaders/DepthRTT.fragmentshader")); u32 UniformIndex = 0; - Struct->MVP = MVP; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->MVP, "MVP"); + Struct->MVP = MVP; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->MVP, "MVP"); ++UniformIndex; - Struct->ModelMatrix = ModelMatrix; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->ModelMatrix, "ModelMatrix"); + Struct->ModelMatrix = ModelMatrix; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ModelMatrix, "ModelMatrix"); ++UniformIndex; - Struct->MinClipP_worldspace = MinClipP_worldspace; + Struct->MinClipP_worldspace = MinClipP_worldspace; Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->MinClipP_worldspace, "MinClipP_worldspace"); ++UniformIndex; - Struct->MaxClipP_worldspace = MaxClipP_worldspace; + Struct->MaxClipP_worldspace = MaxClipP_worldspace; Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->MaxClipP_worldspace, "MaxClipP_worldspace"); ++UniformIndex; - if (UniformIndex != 4 ) + if (UniformIndex != 4 ) { Error("Shader (shadow_map_shader) had an incorrect number of uniform slots!"); } @@ -40,19 +40,19 @@ UseShader( shadow_map_shader *Struct ) s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - if (UniformIndex != 4 ) + if (UniformIndex != 4 ) { Error("Shader (shadow_map_shader) had an incorrect number of uniform slots!"); } diff --git a/generated/shader_magic_terrain_shader.h b/generated/shader_magic_terrain_shader.h index 7e5dee124..ed0c82f2d 100644 --- a/generated/shader_magic_terrain_shader.h +++ b/generated/shader_magic_terrain_shader.h @@ -1,25 +1,25 @@ // src/engine/graphics.h:16:0 link_internal void -InitializeTerrainShader( terrain_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) +InitializeTerrainShader( terrain_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) { - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/default.fragmentshader")); + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/default.fragmentshader")); u32 UniformIndex = 0; - Struct->ChunkDim = ChunkDim; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->ChunkDim, "ChunkDim"); + Struct->ChunkDim = ChunkDim; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkDim, "ChunkDim"); ++UniformIndex; - Struct->WorldspaceBasis = WorldspaceBasis; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->WorldspaceBasis, "WorldspaceBasis"); + Struct->WorldspaceBasis = WorldspaceBasis; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->WorldspaceBasis, "WorldspaceBasis"); ++UniformIndex; - Struct->ChunkResolution = ChunkResolution; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program,&Struct->ChunkResolution, "ChunkResolution"); + Struct->ChunkResolution = ChunkResolution; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); ++UniformIndex; - if (UniformIndex != 3 ) + if (UniformIndex != 3 ) { Error("Shader (terrain_shader) had an incorrect number of uniform slots!"); } @@ -36,16 +36,16 @@ UseShader( terrain_shader *Struct ) s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - if (UniformIndex != 3 ) + if (UniformIndex != 3 ) { Error("Shader (terrain_shader) had an incorrect number of uniform slots!"); } diff --git a/generated/string_and_value_tables_bitmap_compression_type.h b/generated/string_and_value_tables_bitmap_compression_type.h index f6baed806..36c69554e 100644 --- a/generated/string_and_value_tables_bitmap_compression_type.h +++ b/generated/string_and_value_tables_bitmap_compression_type.h @@ -6,7 +6,7 @@ ToStringPrefixless(bitmap_compression_type Type) counted_string Result = {}; switch (Type) { - case BitmapCompressionType_RGB: { Result = CSz("RGB"); } break; + case BitmapCompressionType_RGB: { Result = CSz("RGB"); } break; case BitmapCompressionType_RLE8: { Result = CSz("RLE8"); } break; case BitmapCompressionType_RLE4: { Result = CSz("RLE4"); } break; case BitmapCompressionType_BITFIELDS: { Result = CSz("BITFIELDS"); } break; @@ -29,7 +29,7 @@ ToString(bitmap_compression_type Type) counted_string Result = {}; switch (Type) { - case BitmapCompressionType_RGB: { Result = CSz("BitmapCompressionType_RGB"); } break; + case BitmapCompressionType_RGB: { Result = CSz("BitmapCompressionType_RGB"); } break; case BitmapCompressionType_RLE8: { Result = CSz("BitmapCompressionType_RLE8"); } break; case BitmapCompressionType_RLE4: { Result = CSz("BitmapCompressionType_RLE4"); } break; case BitmapCompressionType_BITFIELDS: { Result = CSz("BitmapCompressionType_BITFIELDS"); } break; @@ -51,7 +51,7 @@ BitmapCompressionType(counted_string S) { bitmap_compression_type Result = {}; - if (StringsMatch(S, CSz("BitmapCompressionType_RGB"))) { return BitmapCompressionType_RGB; } + if (StringsMatch(S, CSz("BitmapCompressionType_RGB"))) { return BitmapCompressionType_RGB; } if (StringsMatch(S, CSz("BitmapCompressionType_RLE8"))) { return BitmapCompressionType_RLE8; } if (StringsMatch(S, CSz("BitmapCompressionType_RLE4"))) { return BitmapCompressionType_RLE4; } if (StringsMatch(S, CSz("BitmapCompressionType_BITFIELDS"))) { return BitmapCompressionType_BITFIELDS; } diff --git a/generated/string_and_value_tables_chunk_flag.h b/generated/string_and_value_tables_chunk_flag.h index 70d1ba9b3..34e486b59 100644 --- a/generated/string_and_value_tables_chunk_flag.h +++ b/generated/string_and_value_tables_chunk_flag.h @@ -6,14 +6,14 @@ ToStringPrefixless(chunk_flag Type) counted_string Result = {}; switch (Type) { - case Chunk_Uninitialized: { Result = CSz("Uninitialized"); } break; + case Chunk_Uninitialized: { Result = CSz("Uninitialized"); } break; case Chunk_Queued: { Result = CSz("Queued"); } break; case Chunk_VoxelsInitialized: { Result = CSz("VoxelsInitialized"); } break; case Chunk_Garbage: { Result = CSz("Garbage"); } break; case Chunk_Deallocate: { Result = CSz("Deallocate"); } break; case Chunk_Freelist: { Result = CSz("Freelist"); } break; - // TODO(Jesse): This is pretty barf and we could do it in a single allocation, + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: { @@ -48,14 +48,14 @@ ToString(chunk_flag Type) counted_string Result = {}; switch (Type) { - case Chunk_Uninitialized: { Result = CSz("Chunk_Uninitialized"); } break; + case Chunk_Uninitialized: { Result = CSz("Chunk_Uninitialized"); } break; case Chunk_Queued: { Result = CSz("Chunk_Queued"); } break; case Chunk_VoxelsInitialized: { Result = CSz("Chunk_VoxelsInitialized"); } break; case Chunk_Garbage: { Result = CSz("Chunk_Garbage"); } break; case Chunk_Deallocate: { Result = CSz("Chunk_Deallocate"); } break; case Chunk_Freelist: { Result = CSz("Chunk_Freelist"); } break; - // TODO(Jesse): This is pretty barf and we could do it in a single allocation, + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: { @@ -82,7 +82,7 @@ ChunkFlag(counted_string S) { chunk_flag Result = {}; - if (StringsMatch(S, CSz("Chunk_Uninitialized"))) { return Chunk_Uninitialized; } + if (StringsMatch(S, CSz("Chunk_Uninitialized"))) { return Chunk_Uninitialized; } if (StringsMatch(S, CSz("Chunk_Queued"))) { return Chunk_Queued; } if (StringsMatch(S, CSz("Chunk_VoxelsInitialized"))) { return Chunk_VoxelsInitialized; } if (StringsMatch(S, CSz("Chunk_Garbage"))) { return Chunk_Garbage; } diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 6f0f876d1..27081c46c 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -6,7 +6,7 @@ ToStringPrefixless(data_type Type) counted_string Result = {}; switch (Type) { - case DataType_Undefinded: { Result = CSz("Undefinded"); } break; + case DataType_Undefinded: { Result = CSz("Undefinded"); } break; case DataType_v3: { Result = CSz("v3"); } break; case DataType_v3_u8: { Result = CSz("u8"); } break; @@ -22,7 +22,7 @@ ToString(data_type Type) counted_string Result = {}; switch (Type) { - case DataType_Undefinded: { Result = CSz("DataType_Undefinded"); } break; + case DataType_Undefinded: { Result = CSz("DataType_Undefinded"); } break; case DataType_v3: { Result = CSz("DataType_v3"); } break; case DataType_v3_u8: { Result = CSz("DataType_v3_u8"); } break; @@ -37,7 +37,7 @@ DataType(counted_string S) { data_type Result = {}; - if (StringsMatch(S, CSz("DataType_Undefinded"))) { return DataType_Undefinded; } + if (StringsMatch(S, CSz("DataType_Undefinded"))) { return DataType_Undefinded; } if (StringsMatch(S, CSz("DataType_v3"))) { return DataType_v3; } if (StringsMatch(S, CSz("DataType_v3_u8"))) { return DataType_v3_u8; } diff --git a/generated/string_and_value_tables_lighting_quality_setting.h b/generated/string_and_value_tables_lighting_quality_setting.h index 601362569..364c6e5e7 100644 --- a/generated/string_and_value_tables_lighting_quality_setting.h +++ b/generated/string_and_value_tables_lighting_quality_setting.h @@ -6,7 +6,7 @@ ToStringPrefixless(lighting_quality_setting Type) counted_string Result = {}; switch (Type) { - case LightingQualitySetting_High: { Result = CSz("High"); } break; + case LightingQualitySetting_High: { Result = CSz("High"); } break; case LightingQualitySetting_Med: { Result = CSz("Med"); } break; case LightingQualitySetting_Low: { Result = CSz("Low"); } break; case LightingQualitySetting_Off: { Result = CSz("Off"); } break; @@ -23,7 +23,7 @@ ToString(lighting_quality_setting Type) counted_string Result = {}; switch (Type) { - case LightingQualitySetting_High: { Result = CSz("LightingQualitySetting_High"); } break; + case LightingQualitySetting_High: { Result = CSz("LightingQualitySetting_High"); } break; case LightingQualitySetting_Med: { Result = CSz("LightingQualitySetting_Med"); } break; case LightingQualitySetting_Low: { Result = CSz("LightingQualitySetting_Low"); } break; case LightingQualitySetting_Off: { Result = CSz("LightingQualitySetting_Off"); } break; @@ -39,7 +39,7 @@ LightingQualitySetting(counted_string S) { lighting_quality_setting Result = {}; - if (StringsMatch(S, CSz("LightingQualitySetting_High"))) { return LightingQualitySetting_High; } + if (StringsMatch(S, CSz("LightingQualitySetting_High"))) { return LightingQualitySetting_High; } if (StringsMatch(S, CSz("LightingQualitySetting_Med"))) { return LightingQualitySetting_Med; } if (StringsMatch(S, CSz("LightingQualitySetting_Low"))) { return LightingQualitySetting_Low; } if (StringsMatch(S, CSz("LightingQualitySetting_Off"))) { return LightingQualitySetting_Off; } diff --git a/generated/string_and_value_tables_log_level.h b/generated/string_and_value_tables_log_level.h index 65cc10100..0ba66768c 100644 --- a/generated/string_and_value_tables_log_level.h +++ b/generated/string_and_value_tables_log_level.h @@ -6,7 +6,7 @@ ToStringPrefixless(log_level Type) counted_string Result = {}; switch (Type) { - case LogLevel_Undefined: { Result = CSz("Undefined"); } break; + case LogLevel_Undefined: { Result = CSz("Undefined"); } break; case LogLevel_Verbose: { Result = CSz("Verbose"); } break; case LogLevel_Debug: { Result = CSz("Debug"); } break; case LogLevel_Info: { Result = CSz("Info"); } break; @@ -25,7 +25,7 @@ ToString(log_level Type) counted_string Result = {}; switch (Type) { - case LogLevel_Undefined: { Result = CSz("LogLevel_Undefined"); } break; + case LogLevel_Undefined: { Result = CSz("LogLevel_Undefined"); } break; case LogLevel_Verbose: { Result = CSz("LogLevel_Verbose"); } break; case LogLevel_Debug: { Result = CSz("LogLevel_Debug"); } break; case LogLevel_Info: { Result = CSz("LogLevel_Info"); } break; @@ -43,7 +43,7 @@ LogLevel(counted_string S) { log_level Result = {}; - if (StringsMatch(S, CSz("LogLevel_Undefined"))) { return LogLevel_Undefined; } + if (StringsMatch(S, CSz("LogLevel_Undefined"))) { return LogLevel_Undefined; } if (StringsMatch(S, CSz("LogLevel_Verbose"))) { return LogLevel_Verbose; } if (StringsMatch(S, CSz("LogLevel_Debug"))) { return LogLevel_Debug; } if (StringsMatch(S, CSz("LogLevel_Info"))) { return LogLevel_Info; } diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index 8b2a79f38..8f93653fe 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -6,7 +6,7 @@ ToStringPrefixless(maybe_tag Type) counted_string Result = {}; switch (Type) { - case Maybe_No: { Result = CSz("No"); } break; + case Maybe_No: { Result = CSz("No"); } break; case Maybe_Yes: { Result = CSz("Yes"); } break; @@ -21,7 +21,7 @@ ToString(maybe_tag Type) counted_string Result = {}; switch (Type) { - case Maybe_No: { Result = CSz("Maybe_No"); } break; + case Maybe_No: { Result = CSz("Maybe_No"); } break; case Maybe_Yes: { Result = CSz("Maybe_Yes"); } break; @@ -35,7 +35,7 @@ MaybeTag(counted_string S) { maybe_tag Result = {}; - if (StringsMatch(S, CSz("Maybe_No"))) { return Maybe_No; } + if (StringsMatch(S, CSz("Maybe_No"))) { return Maybe_No; } if (StringsMatch(S, CSz("Maybe_Yes"))) { return Maybe_Yes; } return Result; diff --git a/generated/string_and_value_tables_model_index.h b/generated/string_and_value_tables_model_index.h index 1227f5666..9f48b43a5 100644 --- a/generated/string_and_value_tables_model_index.h +++ b/generated/string_and_value_tables_model_index.h @@ -6,7 +6,7 @@ ToStringPrefixless(model_index Type) counted_string Result = {}; switch (Type) { - case ModelIndex_None: { Result = CSz("None"); } break; + case ModelIndex_None: { Result = CSz("None"); } break; case ModelIndex_Enemy_Skeleton_Axe: { Result = CSz("Axe"); } break; case ModelIndex_Enemy_Skeleton_Sword: { Result = CSz("Sword"); } break; case ModelIndex_Enemy_Skeleton_Lasher: { Result = CSz("Lasher"); } break; @@ -58,7 +58,7 @@ ToString(model_index Type) counted_string Result = {}; switch (Type) { - case ModelIndex_None: { Result = CSz("ModelIndex_None"); } break; + case ModelIndex_None: { Result = CSz("ModelIndex_None"); } break; case ModelIndex_Enemy_Skeleton_Axe: { Result = CSz("ModelIndex_Enemy_Skeleton_Axe"); } break; case ModelIndex_Enemy_Skeleton_Sword: { Result = CSz("ModelIndex_Enemy_Skeleton_Sword"); } break; case ModelIndex_Enemy_Skeleton_Lasher: { Result = CSz("ModelIndex_Enemy_Skeleton_Lasher"); } break; @@ -109,7 +109,7 @@ ModelIndex(counted_string S) { model_index Result = {}; - if (StringsMatch(S, CSz("ModelIndex_None"))) { return ModelIndex_None; } + if (StringsMatch(S, CSz("ModelIndex_None"))) { return ModelIndex_None; } if (StringsMatch(S, CSz("ModelIndex_Enemy_Skeleton_Axe"))) { return ModelIndex_Enemy_Skeleton_Axe; } if (StringsMatch(S, CSz("ModelIndex_Enemy_Skeleton_Sword"))) { return ModelIndex_Enemy_Skeleton_Sword; } if (StringsMatch(S, CSz("ModelIndex_Enemy_Skeleton_Lasher"))) { return ModelIndex_Enemy_Skeleton_Lasher; } diff --git a/generated/string_and_value_tables_resolution_setting.h b/generated/string_and_value_tables_resolution_setting.h index 55420c3b4..5836baa52 100644 --- a/generated/string_and_value_tables_resolution_setting.h +++ b/generated/string_and_value_tables_resolution_setting.h @@ -6,7 +6,7 @@ ToStringPrefixless(resolution_setting Type) counted_string Result = {}; switch (Type) { - case ResolutionSetting_4096x2160: { Result = CSz("4096x2160"); } break; + case ResolutionSetting_4096x2160: { Result = CSz("4096x2160"); } break; case ResolutionSetting_1920x1080: { Result = CSz("1920x1080"); } break; case ResolutionSetting_1280x720: { Result = CSz("1280x720"); } break; @@ -22,7 +22,7 @@ ToString(resolution_setting Type) counted_string Result = {}; switch (Type) { - case ResolutionSetting_4096x2160: { Result = CSz("ResolutionSetting_4096x2160"); } break; + case ResolutionSetting_4096x2160: { Result = CSz("ResolutionSetting_4096x2160"); } break; case ResolutionSetting_1920x1080: { Result = CSz("ResolutionSetting_1920x1080"); } break; case ResolutionSetting_1280x720: { Result = CSz("ResolutionSetting_1280x720"); } break; @@ -37,7 +37,7 @@ ResolutionSetting(counted_string S) { resolution_setting Result = {}; - if (StringsMatch(S, CSz("ResolutionSetting_4096x2160"))) { return ResolutionSetting_4096x2160; } + if (StringsMatch(S, CSz("ResolutionSetting_4096x2160"))) { return ResolutionSetting_4096x2160; } if (StringsMatch(S, CSz("ResolutionSetting_1920x1080"))) { return ResolutionSetting_1920x1080; } if (StringsMatch(S, CSz("ResolutionSetting_1280x720"))) { return ResolutionSetting_1280x720; } diff --git a/generated/string_and_value_tables_shader_language_setting.h b/generated/string_and_value_tables_shader_language_setting.h index f80569ca1..651808a10 100644 --- a/generated/string_and_value_tables_shader_language_setting.h +++ b/generated/string_and_value_tables_shader_language_setting.h @@ -6,7 +6,7 @@ ToStringPrefixless(shader_language_setting Type) counted_string Result = {}; switch (Type) { - case ShaderLanguageSetting_330core: { Result = CSz("330core"); } break; + case ShaderLanguageSetting_330core: { Result = CSz("330core"); } break; case ShaderLanguageSetting_310es: { Result = CSz("310es"); } break; @@ -21,7 +21,7 @@ ToString(shader_language_setting Type) counted_string Result = {}; switch (Type) { - case ShaderLanguageSetting_330core: { Result = CSz("ShaderLanguageSetting_330core"); } break; + case ShaderLanguageSetting_330core: { Result = CSz("ShaderLanguageSetting_330core"); } break; case ShaderLanguageSetting_310es: { Result = CSz("ShaderLanguageSetting_310es"); } break; @@ -35,7 +35,7 @@ ShaderLanguageSetting(counted_string S) { shader_language_setting Result = {}; - if (StringsMatch(S, CSz("ShaderLanguageSetting_330core"))) { return ShaderLanguageSetting_330core; } + if (StringsMatch(S, CSz("ShaderLanguageSetting_330core"))) { return ShaderLanguageSetting_330core; } if (StringsMatch(S, CSz("ShaderLanguageSetting_310es"))) { return ShaderLanguageSetting_310es; } return Result; diff --git a/generated/string_and_value_tables_shadow_quality_setting.h b/generated/string_and_value_tables_shadow_quality_setting.h index d14934fba..f671f4a32 100644 --- a/generated/string_and_value_tables_shadow_quality_setting.h +++ b/generated/string_and_value_tables_shadow_quality_setting.h @@ -6,7 +6,7 @@ ToStringPrefixless(shadow_quality_setting Type) counted_string Result = {}; switch (Type) { - case ShadowQualitySetting_High: { Result = CSz("High"); } break; + case ShadowQualitySetting_High: { Result = CSz("High"); } break; case ShadowQualitySetting_Med: { Result = CSz("Med"); } break; case ShadowQualitySetting_Low: { Result = CSz("Low"); } break; case ShadowQualitySetting_Off: { Result = CSz("Off"); } break; @@ -23,7 +23,7 @@ ToString(shadow_quality_setting Type) counted_string Result = {}; switch (Type) { - case ShadowQualitySetting_High: { Result = CSz("ShadowQualitySetting_High"); } break; + case ShadowQualitySetting_High: { Result = CSz("ShadowQualitySetting_High"); } break; case ShadowQualitySetting_Med: { Result = CSz("ShadowQualitySetting_Med"); } break; case ShadowQualitySetting_Low: { Result = CSz("ShadowQualitySetting_Low"); } break; case ShadowQualitySetting_Off: { Result = CSz("ShadowQualitySetting_Off"); } break; @@ -39,7 +39,7 @@ ShadowQualitySetting(counted_string S) { shadow_quality_setting Result = {}; - if (StringsMatch(S, CSz("ShadowQualitySetting_High"))) { return ShadowQualitySetting_High; } + if (StringsMatch(S, CSz("ShadowQualitySetting_High"))) { return ShadowQualitySetting_High; } if (StringsMatch(S, CSz("ShadowQualitySetting_Med"))) { return ShadowQualitySetting_Med; } if (StringsMatch(S, CSz("ShadowQualitySetting_Low"))) { return ShadowQualitySetting_Low; } if (StringsMatch(S, CSz("ShadowQualitySetting_Off"))) { return ShadowQualitySetting_Off; } diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index fb34e0354..fe7f8421e 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -6,7 +6,7 @@ ToStringPrefixless(shape_type Type) counted_string Result = {}; switch (Type) { - case ShapeType_None: { Result = CSz("None"); } break; + case ShapeType_None: { Result = CSz("None"); } break; case ShapeType_Sphere: { Result = CSz("Sphere"); } break; case ShapeType_Rect: { Result = CSz("Rect"); } break; @@ -22,7 +22,7 @@ ToString(shape_type Type) counted_string Result = {}; switch (Type) { - case ShapeType_None: { Result = CSz("ShapeType_None"); } break; + case ShapeType_None: { Result = CSz("ShapeType_None"); } break; case ShapeType_Sphere: { Result = CSz("ShapeType_Sphere"); } break; case ShapeType_Rect: { Result = CSz("ShapeType_Rect"); } break; @@ -37,7 +37,7 @@ ShapeType(counted_string S) { shape_type Result = {}; - if (StringsMatch(S, CSz("ShapeType_None"))) { return ShapeType_None; } + if (StringsMatch(S, CSz("ShapeType_None"))) { return ShapeType_None; } if (StringsMatch(S, CSz("ShapeType_Sphere"))) { return ShapeType_Sphere; } if (StringsMatch(S, CSz("ShapeType_Rect"))) { return ShapeType_Rect; } diff --git a/generated/string_and_value_tables_texture_storage_format.h b/generated/string_and_value_tables_texture_storage_format.h index 1a78ea9a4..bbdabae42 100644 --- a/generated/string_and_value_tables_texture_storage_format.h +++ b/generated/string_and_value_tables_texture_storage_format.h @@ -6,7 +6,7 @@ ToStringPrefixless(texture_storage_format Type) counted_string Result = {}; switch (Type) { - case TextureStorageFormat_Undefined: { Result = CSz("Undefined"); } break; + case TextureStorageFormat_Undefined: { Result = CSz("Undefined"); } break; case TextureStorageFormat_R16I: { Result = CSz("R16I"); } break; case TextureStorageFormat_R16F: { Result = CSz("R16F"); } break; case TextureStorageFormat_R32F: { Result = CSz("R32F"); } break; @@ -31,7 +31,7 @@ ToString(texture_storage_format Type) counted_string Result = {}; switch (Type) { - case TextureStorageFormat_Undefined: { Result = CSz("TextureStorageFormat_Undefined"); } break; + case TextureStorageFormat_Undefined: { Result = CSz("TextureStorageFormat_Undefined"); } break; case TextureStorageFormat_R16I: { Result = CSz("TextureStorageFormat_R16I"); } break; case TextureStorageFormat_R16F: { Result = CSz("TextureStorageFormat_R16F"); } break; case TextureStorageFormat_R32F: { Result = CSz("TextureStorageFormat_R32F"); } break; @@ -55,7 +55,7 @@ TextureStorageFormat(counted_string S) { texture_storage_format Result = {}; - if (StringsMatch(S, CSz("TextureStorageFormat_Undefined"))) { return TextureStorageFormat_Undefined; } + if (StringsMatch(S, CSz("TextureStorageFormat_Undefined"))) { return TextureStorageFormat_Undefined; } if (StringsMatch(S, CSz("TextureStorageFormat_R16I"))) { return TextureStorageFormat_R16I; } if (StringsMatch(S, CSz("TextureStorageFormat_R16F"))) { return TextureStorageFormat_R16F; } if (StringsMatch(S, CSz("TextureStorageFormat_R32F"))) { return TextureStorageFormat_R32F; } diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 131f99b7b..e77ba9e6f 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -6,7 +6,7 @@ ToStringPrefixless(ui_noise_type Type) counted_string Result = {}; switch (Type) { - case NoiseType_Perlin: { Result = CSz("Perlin"); } break; + case NoiseType_Perlin: { Result = CSz("Perlin"); } break; case NoiseType_Voronoi: { Result = CSz("Voronoi"); } break; case NoiseType_White: { Result = CSz("White"); } break; @@ -22,7 +22,7 @@ ToString(ui_noise_type Type) counted_string Result = {}; switch (Type) { - case NoiseType_Perlin: { Result = CSz("NoiseType_Perlin"); } break; + case NoiseType_Perlin: { Result = CSz("NoiseType_Perlin"); } break; case NoiseType_Voronoi: { Result = CSz("NoiseType_Voronoi"); } break; case NoiseType_White: { Result = CSz("NoiseType_White"); } break; @@ -37,7 +37,7 @@ UiNoiseType(counted_string S) { ui_noise_type Result = {}; - if (StringsMatch(S, CSz("NoiseType_Perlin"))) { return NoiseType_Perlin; } + if (StringsMatch(S, CSz("NoiseType_Perlin"))) { return NoiseType_Perlin; } if (StringsMatch(S, CSz("NoiseType_Voronoi"))) { return NoiseType_Voronoi; } if (StringsMatch(S, CSz("NoiseType_White"))) { return NoiseType_White; } diff --git a/generated/string_and_value_tables_world_edit_mode.h b/generated/string_and_value_tables_world_edit_mode.h index 9af86638d..26d06e379 100644 --- a/generated/string_and_value_tables_world_edit_mode.h +++ b/generated/string_and_value_tables_world_edit_mode.h @@ -6,7 +6,7 @@ ToStringPrefixless(world_edit_mode Type) counted_string Result = {}; switch (Type) { - case WorldEdit_Mode_Attach: { Result = CSz("Attach"); } break; + case WorldEdit_Mode_Attach: { Result = CSz("Attach"); } break; case WorldEdit_Mode_Remove: { Result = CSz("Remove"); } break; case WorldEdit_Mode_Paint: { Result = CSz("Paint"); } break; case WorldEdit_Mode_Disabled: { Result = CSz("Disabled"); } break; @@ -23,7 +23,7 @@ ToString(world_edit_mode Type) counted_string Result = {}; switch (Type) { - case WorldEdit_Mode_Attach: { Result = CSz("WorldEdit_Mode_Attach"); } break; + case WorldEdit_Mode_Attach: { Result = CSz("WorldEdit_Mode_Attach"); } break; case WorldEdit_Mode_Remove: { Result = CSz("WorldEdit_Mode_Remove"); } break; case WorldEdit_Mode_Paint: { Result = CSz("WorldEdit_Mode_Paint"); } break; case WorldEdit_Mode_Disabled: { Result = CSz("WorldEdit_Mode_Disabled"); } break; @@ -39,7 +39,7 @@ WorldEditMode(counted_string S) { world_edit_mode Result = {}; - if (StringsMatch(S, CSz("WorldEdit_Mode_Attach"))) { return WorldEdit_Mode_Attach; } + if (StringsMatch(S, CSz("WorldEdit_Mode_Attach"))) { return WorldEdit_Mode_Attach; } if (StringsMatch(S, CSz("WorldEdit_Mode_Remove"))) { return WorldEdit_Mode_Remove; } if (StringsMatch(S, CSz("WorldEdit_Mode_Paint"))) { return WorldEdit_Mode_Paint; } if (StringsMatch(S, CSz("WorldEdit_Mode_Disabled"))) { return WorldEdit_Mode_Disabled; } diff --git a/generated/string_and_value_tables_world_edit_mode_modifier.h b/generated/string_and_value_tables_world_edit_mode_modifier.h index 3edf8ee21..90c8271e7 100644 --- a/generated/string_and_value_tables_world_edit_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_mode_modifier.h @@ -6,7 +6,7 @@ ToStringPrefixless(world_edit_mode_modifier Type) counted_string Result = {}; switch (Type) { - case WorldEdit_Modifier_Default: { Result = CSz("Default"); } break; + case WorldEdit_Modifier_Default: { Result = CSz("Default"); } break; case WorldEdit_Modifier_Flood: { Result = CSz("Flood"); } break; case WorldEdit_Modifier_Surface: { Result = CSz("Surface"); } break; @@ -22,7 +22,7 @@ ToString(world_edit_mode_modifier Type) counted_string Result = {}; switch (Type) { - case WorldEdit_Modifier_Default: { Result = CSz("WorldEdit_Modifier_Default"); } break; + case WorldEdit_Modifier_Default: { Result = CSz("WorldEdit_Modifier_Default"); } break; case WorldEdit_Modifier_Flood: { Result = CSz("WorldEdit_Modifier_Flood"); } break; case WorldEdit_Modifier_Surface: { Result = CSz("WorldEdit_Modifier_Surface"); } break; @@ -37,7 +37,7 @@ WorldEditModeModifier(counted_string S) { world_edit_mode_modifier Result = {}; - if (StringsMatch(S, CSz("WorldEdit_Modifier_Default"))) { return WorldEdit_Modifier_Default; } + if (StringsMatch(S, CSz("WorldEdit_Modifier_Default"))) { return WorldEdit_Modifier_Default; } if (StringsMatch(S, CSz("WorldEdit_Modifier_Flood"))) { return WorldEdit_Modifier_Flood; } if (StringsMatch(S, CSz("WorldEdit_Modifier_Surface"))) { return WorldEdit_Modifier_Surface; } diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index aed62bfc6..71de4c200 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -6,7 +6,7 @@ ToStringPrefixless(world_edit_selection_mode Type) counted_string Result = {}; switch (Type) { - case SelectionMode_Noop: { Result = CSz("Noop"); } break; + case SelectionMode_Noop: { Result = CSz("Noop"); } break; case SelectionMode_ResizeSingleLinearAxis: { Result = CSz("ResizeSingleLinearAxis"); } break; case SelectionMode_ResizeBothLinearAxies: { Result = CSz("ResizeBothLinearAxies"); } break; case SelectionMode_ResizeAllAxies: { Result = CSz("ResizeAllAxies"); } break; @@ -25,7 +25,7 @@ ToString(world_edit_selection_mode Type) counted_string Result = {}; switch (Type) { - case SelectionMode_Noop: { Result = CSz("SelectionMode_Noop"); } break; + case SelectionMode_Noop: { Result = CSz("SelectionMode_Noop"); } break; case SelectionMode_ResizeSingleLinearAxis: { Result = CSz("SelectionMode_ResizeSingleLinearAxis"); } break; case SelectionMode_ResizeBothLinearAxies: { Result = CSz("SelectionMode_ResizeBothLinearAxies"); } break; case SelectionMode_ResizeAllAxies: { Result = CSz("SelectionMode_ResizeAllAxies"); } break; @@ -43,7 +43,7 @@ WorldEditSelectionMode(counted_string S) { world_edit_selection_mode Result = {}; - if (StringsMatch(S, CSz("SelectionMode_Noop"))) { return SelectionMode_Noop; } + if (StringsMatch(S, CSz("SelectionMode_Noop"))) { return SelectionMode_Noop; } if (StringsMatch(S, CSz("SelectionMode_ResizeSingleLinearAxis"))) { return SelectionMode_ResizeSingleLinearAxis; } if (StringsMatch(S, CSz("SelectionMode_ResizeBothLinearAxies"))) { return SelectionMode_ResizeBothLinearAxies; } if (StringsMatch(S, CSz("SelectionMode_ResizeAllAxies"))) { return SelectionMode_ResizeAllAxies; } diff --git a/generated/string_and_value_tables_world_update_op_shape_type.h b/generated/string_and_value_tables_world_update_op_shape_type.h index f96c6ef34..c40c879b0 100644 --- a/generated/string_and_value_tables_world_update_op_shape_type.h +++ b/generated/string_and_value_tables_world_update_op_shape_type.h @@ -6,7 +6,7 @@ ToStringPrefixless(world_update_op_shape_type Type) counted_string Result = {}; switch (Type) { - case type_world_update_op_shape_params_noop: { Result = CSz("noop"); } break; + case type_world_update_op_shape_params_noop: { Result = CSz("noop"); } break; case type_world_update_op_shape_params_sphere: { Result = CSz("sphere"); } break; case type_world_update_op_shape_params_rect: { Result = CSz("rect"); } break; case type_world_update_op_shape_params_asset: { Result = CSz("asset"); } break; @@ -25,7 +25,7 @@ ToString(world_update_op_shape_type Type) counted_string Result = {}; switch (Type) { - case type_world_update_op_shape_params_noop: { Result = CSz("type_world_update_op_shape_params_noop"); } break; + case type_world_update_op_shape_params_noop: { Result = CSz("type_world_update_op_shape_params_noop"); } break; case type_world_update_op_shape_params_sphere: { Result = CSz("type_world_update_op_shape_params_sphere"); } break; case type_world_update_op_shape_params_rect: { Result = CSz("type_world_update_op_shape_params_rect"); } break; case type_world_update_op_shape_params_asset: { Result = CSz("type_world_update_op_shape_params_asset"); } break; @@ -43,7 +43,7 @@ WorldUpdateOpShapeType(counted_string S) { world_update_op_shape_type Result = {}; - if (StringsMatch(S, CSz("type_world_update_op_shape_params_noop"))) { return type_world_update_op_shape_params_noop; } + if (StringsMatch(S, CSz("type_world_update_op_shape_params_noop"))) { return type_world_update_op_shape_params_noop; } if (StringsMatch(S, CSz("type_world_update_op_shape_params_sphere"))) { return type_world_update_op_shape_params_sphere; } if (StringsMatch(S, CSz("type_world_update_op_shape_params_rect"))) { return type_world_update_op_shape_params_rect; } if (StringsMatch(S, CSz("type_world_update_op_shape_params_asset"))) { return type_world_update_op_shape_params_asset; } diff --git a/generated/string_concat_10.h b/generated/string_concat_10.h index ce271acab..dcddf250b 100644 --- a/generated/string_concat_10.h +++ b/generated/string_concat_10.h @@ -1,16 +1,16 @@ // external/bonsai_stdlib/src/counted_string.cpp:186:0 link_internal counted_string -Concat(cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, cs S6, cs S7, cs S8, cs S9, memory_arena* Memory, umm ExtraChars = 0) +Concat( cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, cs S6, cs S7, cs S8, cs S9, memory_arena* Memory, umm ExtraChars = 0) { - umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + S4.Count + S5.Count + S6.Count + S7.Count + S8.Count + S9.Count + 0; + umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + S4.Count + S5.Count + S6.Count + S7.Count + S8.Count + S9.Count + 0; counted_string Result = { .Count = TotalLength + ExtraChars, .Start = AllocateProtection(char, Memory, TotalLength, False), }; u64 At = 0; - MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); + MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); At += S0.Count; MemCopy((u8*)S1.Start, (u8*)Result.Start+At, S1.Count); At += S1.Count; diff --git a/generated/string_concat_2.h b/generated/string_concat_2.h index 9e0b2d413..b2ab665a6 100644 --- a/generated/string_concat_2.h +++ b/generated/string_concat_2.h @@ -1,16 +1,16 @@ // external/bonsai_stdlib/src/counted_string.cpp:170:0 link_internal counted_string -Concat(cs S0, cs S1, memory_arena* Memory, umm ExtraChars = 0) +Concat( cs S0, cs S1, memory_arena* Memory, umm ExtraChars = 0) { - umm TotalLength = S0.Count + S1.Count + 0; + umm TotalLength = S0.Count + S1.Count + 0; counted_string Result = { .Count = TotalLength + ExtraChars, .Start = AllocateProtection(char, Memory, TotalLength, False), }; u64 At = 0; - MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); + MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); At += S0.Count; MemCopy((u8*)S1.Start, (u8*)Result.Start+At, S1.Count); At += S1.Count; diff --git a/generated/string_concat_3.h b/generated/string_concat_3.h index 3e4cabe56..b1e56041b 100644 --- a/generated/string_concat_3.h +++ b/generated/string_concat_3.h @@ -1,16 +1,16 @@ // external/bonsai_stdlib/src/counted_string.cpp:172:0 link_internal counted_string -Concat(cs S0, cs S1, cs S2, memory_arena* Memory, umm ExtraChars = 0) +Concat( cs S0, cs S1, cs S2, memory_arena* Memory, umm ExtraChars = 0) { - umm TotalLength = S0.Count + S1.Count + S2.Count + 0; + umm TotalLength = S0.Count + S1.Count + S2.Count + 0; counted_string Result = { .Count = TotalLength + ExtraChars, .Start = AllocateProtection(char, Memory, TotalLength, False), }; u64 At = 0; - MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); + MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); At += S0.Count; MemCopy((u8*)S1.Start, (u8*)Result.Start+At, S1.Count); At += S1.Count; diff --git a/generated/string_concat_4.h b/generated/string_concat_4.h index 96c0ff5c6..0f135b6a6 100644 --- a/generated/string_concat_4.h +++ b/generated/string_concat_4.h @@ -1,16 +1,16 @@ // external/bonsai_stdlib/src/counted_string.cpp:174:0 link_internal counted_string -Concat(cs S0, cs S1, cs S2, cs S3, memory_arena* Memory, umm ExtraChars = 0) +Concat( cs S0, cs S1, cs S2, cs S3, memory_arena* Memory, umm ExtraChars = 0) { - umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + 0; + umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + 0; counted_string Result = { .Count = TotalLength + ExtraChars, .Start = AllocateProtection(char, Memory, TotalLength, False), }; u64 At = 0; - MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); + MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); At += S0.Count; MemCopy((u8*)S1.Start, (u8*)Result.Start+At, S1.Count); At += S1.Count; diff --git a/generated/string_concat_5.h b/generated/string_concat_5.h index de4ed546a..3c7206263 100644 --- a/generated/string_concat_5.h +++ b/generated/string_concat_5.h @@ -1,16 +1,16 @@ // external/bonsai_stdlib/src/counted_string.cpp:176:0 link_internal counted_string -Concat(cs S0, cs S1, cs S2, cs S3, cs S4, memory_arena* Memory, umm ExtraChars = 0) +Concat( cs S0, cs S1, cs S2, cs S3, cs S4, memory_arena* Memory, umm ExtraChars = 0) { - umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + S4.Count + 0; + umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + S4.Count + 0; counted_string Result = { .Count = TotalLength + ExtraChars, .Start = AllocateProtection(char, Memory, TotalLength, False), }; u64 At = 0; - MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); + MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); At += S0.Count; MemCopy((u8*)S1.Start, (u8*)Result.Start+At, S1.Count); At += S1.Count; diff --git a/generated/string_concat_6.h b/generated/string_concat_6.h index 5d185b604..a1066d201 100644 --- a/generated/string_concat_6.h +++ b/generated/string_concat_6.h @@ -1,16 +1,16 @@ // external/bonsai_stdlib/src/counted_string.cpp:178:0 link_internal counted_string -Concat(cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, memory_arena* Memory, umm ExtraChars = 0) +Concat( cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, memory_arena* Memory, umm ExtraChars = 0) { - umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + S4.Count + S5.Count + 0; + umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + S4.Count + S5.Count + 0; counted_string Result = { .Count = TotalLength + ExtraChars, .Start = AllocateProtection(char, Memory, TotalLength, False), }; u64 At = 0; - MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); + MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); At += S0.Count; MemCopy((u8*)S1.Start, (u8*)Result.Start+At, S1.Count); At += S1.Count; diff --git a/generated/string_concat_7.h b/generated/string_concat_7.h index 08820a67a..e58cad0e9 100644 --- a/generated/string_concat_7.h +++ b/generated/string_concat_7.h @@ -1,16 +1,16 @@ // external/bonsai_stdlib/src/counted_string.cpp:180:0 link_internal counted_string -Concat(cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, cs S6, memory_arena* Memory, umm ExtraChars = 0) +Concat( cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, cs S6, memory_arena* Memory, umm ExtraChars = 0) { - umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + S4.Count + S5.Count + S6.Count + 0; + umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + S4.Count + S5.Count + S6.Count + 0; counted_string Result = { .Count = TotalLength + ExtraChars, .Start = AllocateProtection(char, Memory, TotalLength, False), }; u64 At = 0; - MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); + MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); At += S0.Count; MemCopy((u8*)S1.Start, (u8*)Result.Start+At, S1.Count); At += S1.Count; diff --git a/generated/string_concat_8.h b/generated/string_concat_8.h index bd0acc864..de3c2bb21 100644 --- a/generated/string_concat_8.h +++ b/generated/string_concat_8.h @@ -1,16 +1,16 @@ // external/bonsai_stdlib/src/counted_string.cpp:182:0 link_internal counted_string -Concat(cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, cs S6, cs S7, memory_arena* Memory, umm ExtraChars = 0) +Concat( cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, cs S6, cs S7, memory_arena* Memory, umm ExtraChars = 0) { - umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + S4.Count + S5.Count + S6.Count + S7.Count + 0; + umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + S4.Count + S5.Count + S6.Count + S7.Count + 0; counted_string Result = { .Count = TotalLength + ExtraChars, .Start = AllocateProtection(char, Memory, TotalLength, False), }; u64 At = 0; - MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); + MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); At += S0.Count; MemCopy((u8*)S1.Start, (u8*)Result.Start+At, S1.Count); At += S1.Count; diff --git a/generated/string_concat_9.h b/generated/string_concat_9.h index b47e9751b..a3208f9cf 100644 --- a/generated/string_concat_9.h +++ b/generated/string_concat_9.h @@ -1,16 +1,16 @@ // external/bonsai_stdlib/src/counted_string.cpp:184:0 link_internal counted_string -Concat(cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, cs S6, cs S7, cs S8, memory_arena* Memory, umm ExtraChars = 0) +Concat( cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, cs S6, cs S7, cs S8, memory_arena* Memory, umm ExtraChars = 0) { - umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + S4.Count + S5.Count + S6.Count + S7.Count + S8.Count + 0; + umm TotalLength = S0.Count + S1.Count + S2.Count + S3.Count + S4.Count + S5.Count + S6.Count + S7.Count + S8.Count + 0; counted_string Result = { .Count = TotalLength + ExtraChars, .Start = AllocateProtection(char, Memory, TotalLength, False), }; u64 At = 0; - MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); + MemCopy((u8*)S0.Start, (u8*)Result.Start+At, S0.Count); At += S0.Count; MemCopy((u8*)S1.Start, (u8*)Result.Start+At, S1.Count); At += S1.Count; diff --git a/generated/to_string_texture.h b/generated/to_string_texture.h index 758025131..b6f31b1d1 100644 --- a/generated/to_string_texture.h +++ b/generated/to_string_texture.h @@ -3,14 +3,14 @@ link_internal cs ToString(texture *Element) { - cs Result = FSz("ID(%S) Dim(%S) Slices(%S) Channels(%S) IsDepthTexture(%S) Format(%S) DebugName(%S) Queued(%S) ", ToString(& Element->ID), - ToString(& Element->Dim), - ToString(& Element->Slices), - ToString(& Element->Channels), - ToString(& Element->IsDepthTexture), + cs Result = FSz("ID(%S) Dim(%S) Slices(%S) Channels(%S) IsDepthTexture(%S) Format(%S) DebugName(%S) Queued(%S) ", ToString( & Element->ID) +, ToString( & Element->Dim), + ToString( & Element->Slices), + ToString( & Element->Channels), + ToString( & Element->IsDepthTexture), ToString( Element->Format), - ToString(& Element->DebugName), - ToString(& Element->Queued)); + ToString( & Element->DebugName), + ToString( & Element->Queued)); return Result; } diff --git a/generated/to_string_vector_240271411.h b/generated/to_string_vector_240271411.h index 561ded450..5b71ba2e8 100644 --- a/generated/to_string_vector_240271411.h +++ b/generated/to_string_vector_240271411.h @@ -3,14 +3,14 @@ link_internal cs ToString(v2 *Element) { - cs Result = FSz("%S %S ", ToString(&Element->E[0]) , ToString(&Element->E[1]) ); + cs Result = FSz("%S %S ", ToString(&Element->E[0]) , ToString(&Element->E[1]) ); return Result; } link_internal cs ToString(v2i *Element) { - cs Result = FSz("%S %S ", ToString(&Element->E[0]) , ToString(&Element->E[1]) ); + cs Result = FSz("%S %S ", ToString(&Element->E[0]) , ToString(&Element->E[1]) ); return Result; } diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 01d61fb7a..1a06cbeb6 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -10,7 +10,7 @@ ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Level"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Level")), EngineDebugViewMode_Level }, + { CSz("Level"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Level")), EngineDebugViewMode_Level }, { CSz("WorldEdit"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_WorldEdit")), EngineDebugViewMode_WorldEdit }, { CSz("Entities"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Entities")), EngineDebugViewMode_Entities }, { CSz("Assets"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Assets")), EngineDebugViewMode_Assets }, diff --git a/generated/tuple_822959015.h b/generated/tuple_822959015.h index 58cb3eb40..137cca18c 100644 --- a/generated/tuple_822959015.h +++ b/generated/tuple_822959015.h @@ -2,7 +2,7 @@ struct tuple_cs_cs { - cs E0; + cs E0; cs E1; }; @@ -10,12 +10,12 @@ struct tuple_cs_cs /* gen_constructor(TupleType) */ link_internal tuple_cs_cs -Tuple( cs E0, cs E1 ) +Tuple( cs E0, cs E1 ) { /* TupleType Result = */ tuple_cs_cs Result = { - .E0 = E0, + .E0 = E0, .E1 = E1, }; return Result; diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 1faacb37f2364439e936927acb2906aae1c2af99..13f0e662b90513a7d99b76af72e8d3f34271b157 100644 GIT binary patch delta 2143 zcmYLLO>7(25!Rzba>*sd6-klQ4@HrVC{ZF;D@yzkV^x&x*iIX_m5amy>SVJL*IFhb zDf35(5wwll-VC^wzaR-vpl%K=(4t6|czBG+D$8z|xD6=9q$1`{_>2mh=YDO39Sq(Rf9)uSv zI9Hs6znH;;Lhj(*7_`U;ZWc0Ng&I4HqeupmY7o+*54w`Y?^pcnoUrOEN%k~HhDZ5f zBvvB0FPHG&Wj{Op*!t$Og6(h#=a)yxmwh&gpUzfrn0G_VKZk!Uy?`IM=JDau1>9JQ z(msQKN+WnVFC(`U!+~~*eVgK~;zwFoq(#v}X0u!GUekAshN)9JhH72HQEC;{p(LR@ z#&lyb%*y?p8|Nv5?J%Xel5pr6exW5%4SS*aym+uMgg>a$NGTbSOhc8hl1`vHCsXp{ zY(qE^Cv!oz#JQCBtZSY6c1PXb+k=)n-#_z+(wfMPQi=&^%Q3kRR8uV#*H^NRnu(W+ zDq2|&eZUdla>&P|+ei{@y&o;$>(%vcYiDQIRIQ7Gga1jxxV$h-JS1>en}Bm6z*e!8 zTf*VIO#Iu{_o8lGjjrLI%k8iPTKqpF<4ksbsBJcDcwvQb^%eGJuujDmBW-$}FanVSE-!;0;BF9&=%F+6y*2O?y9nHyy@Hk&~|8 za$dDoMgH~?Kk>zT?mvlH;wOW55>dvTXFOZ2X2+rug&8VJ7P6-)q+! z^=^IN?C_XJDHR_@ye{t9qLSKMBG!fYzX1X2V*`gd%E+Nt7hm>o;C^1`Oae0{x|i78^PviKw#JC2O^q7rq^GMF=l zU(cm5AC2N-DM3x6QGGV3<}|r9*&C6BT?S%H>dV6Wqp8Q={d_daHbtW^j!qDP$FlKR zI6zJP48=P|C~d1-w)55ZmnlaPIWU5Ip*i;a<59UD3imrN6H@Ggc(3-1uGwzZTTNnW zk!l@e`D4zY2PH41c_)xh(T+a`8Eh4_w zF|L?GiVUU1o+Qv&d`}6Inx2KML`frfbKeb&GJ9mI%tZ~)3s4LMse7-FpY`g!GG#}d zVl#1PIL@9WI9ybxsDf)l)b)m-<6$66$|_eJ|xgXTL&Ivc+2bF-Jlu^-D%;S+Bgw|yD>*1N_U!s?UHIC^FL!}A^S zBJO!|P_<0)D(T=O(P)ls${d9~> z<5H)+eYs)On|NX93ceU@;;BI@x?|#4$TkLlc<{vqtPhrjb*tWO7<*WET&C-odnh}4 zbtnsywEPx1K7~U~CS^Q0diLPmi`26H&|`K>suul37+~}`>Dl1F5B|)`c?aJOxM5Ug T8Kb`^aHFD#)f4!j@|UjxIJL31 delta 2103 zcmYjSYiv_x80OpBp0=l#tzFmAt~+hV*xGfc-AcO)myH1d6sCY&ywP>r8K=^&UE2+a zmx#oKA1Ie6{sIyeV~j?P@$y$8F+wzEM1J^3)DYz-C_jzh`+Y6LCe3-z_r2%+-uHQ* z=l#wfxxaX3o8j7u6)O{;s=eg7q}Q6Eq$K@XM^>4yYiGFnYdJUC|R>ef(DK;Ut zJ_*~9Oaw5+qPQD(u*Y#dJdCC;2fmI=OcOqX@iBa$&ay4y?W7uH1!0Z$ZN__QA3p0_ z&*thY+o?i+%+iE!y5dN!@?ei8g1ZI>?sa-ZfoXi)=_G>g#Zq_|+bYWWBpk+` z@BrrhweQ!26}DagB@ugte$R2|kY4pyFWz!n)QWBg<6$K+lk4#8jygf(0ri z#PL{GQ;a)H1+Aj1`gW1#sfbU?Wfqs4(BrjXceodsfSC%5qK}?8h>Dqjgbv4g%WN*M zaY5~=a9d5;Qcl$c=(bWhSIAX!i&{n137%~t%FAI1uPI@K{Ov@-%Sy^M zRh+A2bD2tYCZC()feFiC%#hd0C3N`Wc*Q4?O8W8p%5gR-GQQL0YDng=E8Kx}6c@eC zL|z5^yn#C2JzghLfll0Mb@G;xDvhFHeJ+XQJntXjBLLre9>YM_2)^_*vF%jaFm#Wb zBrqZ!%JaHL#oG623zb2;#)aH-3pvDFhDnuzwAPBAozcqNm&7+gg>9hYl0-BfOmR0; z5>fo(GUJ}ipAzm`!@Rq;f>tP&k7crDZH{D01BXkX&t+xX#HSBDPE5MPb>X=2wX#+! z(|F|=aVfVpy9p6G#4K`B^=AaND@`ffavmc1o_sWf%!T5Nmaq31ANgfL7LMOvat!<# zZ&C4vgR^k_VP!;Z2^Z~SG_U9sr>MCH+_>H(lYUai1Q% zYi+0GA~l)S{`D6W`x;<(96*VPDl$cUPnYw+WyQ6dUGihS1S zULHbQj2*=BCq=uH zje~eHu@(O`$dp3_?XnGM2;pEut%mW2c4AmB9xzLN7M)^temRQSj8n`}zjwx25SyKm zv-ehWS)`}+g}K8VV!FmxG}2$D|30l;)sAi|F3eSp^ty@rSjgC{RjT6U^Tg0VgV8`s e63&i<@al+(HP$U_vzgXe{m1QxJ9gY2`Qkquh>Min); + v3 Max = GetSimSpaceP(World, Rect->Max); rect3 Result = RectMinMax(Min, Max); return Result; } +link_internal rect3 +GetSimSpaceAABB(world *World, rect3cp Rect) +{ + rect3 Result = GetSimSpaceAABB(World, &Rect); + return Result; +} + link_internal cp SimSpaceToCanonical( world *World, v3 P ); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 16568a9a0..1c743f471 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2034,10 +2034,6 @@ EditWorldSelection(engine_resources *Engine) Editor->Selection.Region = ProposedSelection; Editor->Selection.ModState.ClickedFace = FaceIndex_None; - if (Editor->CurrentEdit) - { - Editor->CurrentEdit->Region = ProposedSelection; - } } } } @@ -2236,6 +2232,56 @@ ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowC } +link_internal void +UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memory_arena *TempMemory) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + // First, gather the currently edited nodes and remove the edit + { + octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); + GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Edit->Region, &Nodes); + + IterateOver(&Nodes, N, NodeIndex) + { + octree_node *Node = *N; + + auto Index = Find(Node->Edits, Edit); + Assert(IsValid(Index)); // There shouldn't be a node that doesn't contain the edit + RemoveUnordered(Node->Edits, Index); + } + } + + // + // Update the edit + // + Editor->CurrentEdit->Region = Region; + + // Gather newly overlapping nodes and add the edit + { + octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); + GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Region, &Nodes); + + IterateOver(&Nodes, N, NodeIndex) + { + octree_node *Node = *N; + /* auto EditAABB = GetSimSpaceAABB(World, Node); */ + /* random_series S = {u64(Node)}; */ + /* v3 BaseColor = RandomV3Unilateral(&S); */ + /* DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, 1.f); */ + + // Shouldn't have this edit already attached .. + Assert( IsValid(Find(Node->Edits, Node)) == False ); + + Push(&Node->Edits, Edit); + } + } + + QueueChunkForInit(Plat->WorldUpdateQ, Node->Chunk, MeshBit_None); + + VaporizeArena(Nodes.Memory); +} + link_internal void DoWorldEditor(engine_resources *Engine) { @@ -2664,7 +2710,10 @@ DoWorldEditor(engine_resources *Engine) if (Editor->Selection.Changed) { - Info("Changed"); + if (Editor->CurrentEdit) + { + UpdateWorldEdit(Engine, Editor->CurrentEdit, Editor->Selection.Region); + } } diff --git a/src/engine/editor.h b/src/engine/editor.h index 52dc1fcbe..a12be3ff5 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1148,6 +1148,8 @@ struct world_edit world_edit_mode Mode; world_edit_mode_modifier Modifier; + u32 Ordinal; // monotonically increasing integer sourced from level_editor::NextEditOrdinal + world_edit_brush_type Type; union { @@ -1157,8 +1159,9 @@ struct world_edit }; }; -poof(block_array(world_edit, {128})) -#include +typedef world_edit* world_edit_ptr; + +poof(block_array(world_edit_ptr, {128})) struct level_editor @@ -1193,6 +1196,7 @@ struct level_editor b32 MaskSelection; + u32 NextEditOrdinal; world_edit *CurrentEdit; world_edit_block_array WorldEdits; }; diff --git a/src/engine/entity.cpp b/src/engine/entity.cpp index 136e8e233..b3ab4e65d 100644 --- a/src/engine/entity.cpp +++ b/src/engine/entity.cpp @@ -1367,6 +1367,16 @@ Intersect(world *World, entity *First, aabb *Second) return Result; } +// TODO(Jesse): There's probably a better way to do this .. +inline b32 +Intersect(world *World, rect3cp *First, rect3cp *Second) +{ + rect3 R0 = GetSimSpaceAABB(World, First); + rect3 R1 = GetSimSpaceAABB(World, Second); + b32 Result = Intersect(&R0, &R1); + return Result; +} + inline b32 Intersect(world *World, aabb *First, entity *Second) { diff --git a/src/engine/entity.h b/src/engine/entity.h index 6c3c633a5..a72562d60 100644 --- a/src/engine/entity.h +++ b/src/engine/entity.h @@ -224,6 +224,7 @@ FinalizeEntityUpdate(entity *Entity) #include } + link_internal void DropEntityFromPreviouslyOccupiedChunks(world *World, entity *Entity, memory_arena *TempMemory) { diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index f8555f62e..a1b2a131b 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -304,12 +304,12 @@ poof( { struct struct_t.name; link_internal work_queue_entry - WorkQueueEntryAsyncFunction( (struct_t.type) *Params ) + WorkQueueEntryAsyncFunction( (struct_t.name) *Params ) { work_queue_entry Result = {}; Result.Type = type_work_queue_entry_async_function_call; - Result.work_queue_entry_async_function_call.Type = type_(struct_t.type); - Result.work_queue_entry_async_function_call.(struct_t.type) = *Params; + Result.work_queue_entry_async_function_call.Type = type_(struct_t.name); + Result.work_queue_entry_async_function_call.(struct_t.name) = *Params; return Result; } } diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 38727da75..c5231e88c 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -51,9 +51,13 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) // TODO(Jesse): rect3cp should probably be a pointer..? // +#if 1 link_internal world_chunk_ptr_buffer GatherChunksOverlappingArea(world *World, rect3cp Region, memory_arena *Memory) { + NotImplemented; + return {}; +#if 0 auto MinP = Region.Min; auto MaxP = Region.Max; @@ -86,7 +90,53 @@ GatherChunksOverlappingArea(world *World, rect3cp Region, memory_arena *Memory) Result.Count = ChunkIndex; return Result; +#endif } +#else +link_internal octree_node_ptr_buffer +GatherChunksOverlappingArea(world *World, rect3cp Region, memory_arena *Memory) +{ + auto MinP = Region.Min; + auto MaxP = Region.Max; + + Assert(MaxP.WorldP >= MinP.WorldP); + v3i Delta = MaxP.WorldP - MinP.WorldP + 1; + u32 TotalChunkCount = Abs(Volume(Delta)); + + world_chunk_ptr_buffer Result = {}; + + // NOTE(Jesse): These need to be aligned to the cache line size, so don't use the constructor fn + Result.Start = AllocateAligned(world_chunk*, Memory, TotalChunkCount, CACHE_LINE_SIZE); + + u32 ChunkIndex = 0; + for (s32 zChunk = MinP.WorldP.z; zChunk <= MaxP.WorldP.z; ++zChunk) + { + for (s32 yChunk = MinP.WorldP.y; yChunk <= MaxP.WorldP.y; ++yChunk) + { + for (s32 xChunk = MinP.WorldP.x; xChunk <= MaxP.WorldP.x; ++xChunk) + { + world_position ChunkP = World_Position(xChunk, yChunk, zChunk); + if (octree_node *Node = GetWorldChunkFromOctree( World, P )) + { + b32 AlreadyAddedToSet = False; + for (u32 TestIndex = 0; TestIndex < ChunkIndex; ++TestIndex) + { + if (Result.Start[TestIndex] == Node) { AlreadyAddedToSet = True; break; } + } + Assert(ChunkIndex < TotalChunkCount); + if (AlreadyAddedToSet == False) + { + Result.Start[ChunkIndex++] = Chunk; + } + } + } + } + } + + Result.Count = ChunkIndex; + return Result; +} +#endif link_internal void @@ -961,14 +1011,14 @@ MaintainWorldOctree(engine_resources *Engine) u32 MaxToQueueThisFrame = Max(0u, MAX_OCTREE_NODES_QUEUED_PER_FRAME - ChunksCurrentlyQueued); Assert(MaxToQueueThisFrame <= MAX_OCTREE_NODES_QUEUED_PER_FRAME); - DEBUG_VALUE_u32(u32(ChunksCurrentlyQueued)); - DEBUG_VALUE_u32(u32(MaxToQueueThisFrame)); +/* DEBUG_VALUE_u32(u32(ChunksCurrentlyQueued)); */ +/* DEBUG_VALUE_u32(u32(MaxToQueueThisFrame)); */ - DEBUG_VALUE_u32(TotalWorldChunksAllocated); - DEBUG_VALUE_u32(FreedNodes); - DEBUG_VALUE_u32(DeferrFreedNodes); +/* DEBUG_VALUE_u32(TotalWorldChunksAllocated); */ +/* DEBUG_VALUE_u32(FreedNodes); */ +/* DEBUG_VALUE_u32(DeferrFreedNodes); */ - DEBUG_VALUE_u32(TotalChunksQueued); +/* DEBUG_VALUE_u32(TotalChunksQueued); */ /* DEBUG_VALUE_u32(ReusedNode); */ /* DEBUG_VALUE_u32(AllocatedNode); */ @@ -1069,3 +1119,35 @@ GetWorldChunkFromOctree(world *World, v3i WorldP) return Result; } +link_internal void +GatherOctreeNodesOverlapping_Recursive(world *World, octree_node *Current, rect3cp *Region, octree_node_ptr_block_array *Result) +{ + Assert(Current); + + rect3cp Box = GetBoundingBox(World, Current); + if (Intersect(World, &Box, Region)) + { + switch(Current->Type) + { + InvalidCase(OctreeNodeType_Undefined); + + case OctreeNodeType_Leaf: + { + Push(Result, &Current); + } break; + + case OctreeNodeType_Branch: + { + GatherOctreeNodesOverlapping_Recursive(World, Current->Children[0], Region, Result); + GatherOctreeNodesOverlapping_Recursive(World, Current->Children[1], Region, Result); + GatherOctreeNodesOverlapping_Recursive(World, Current->Children[2], Region, Result); + GatherOctreeNodesOverlapping_Recursive(World, Current->Children[3], Region, Result); + GatherOctreeNodesOverlapping_Recursive(World, Current->Children[4], Region, Result); + GatherOctreeNodesOverlapping_Recursive(World, Current->Children[5], Region, Result); + GatherOctreeNodesOverlapping_Recursive(World, Current->Children[6], Region, Result); + GatherOctreeNodesOverlapping_Recursive(World, Current->Children[7], Region, Result); + } break; + } + } +} + diff --git a/src/engine/world.h b/src/engine/world.h index f736d6c39..0ed4ebe69 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -15,10 +15,9 @@ struct octree_node b32 HadNoVisibleSurface; v3i WorldP; - v3i Resolution; // in world-chunk space. Resolution of V3i(2) means the chunk occupies 2x2x2 in world-space + v3i Resolution; // in world-chunk space. Resolution of V3i(2) means the chunk occupies 2x2x2 chunks in world-space - // NOTE(Jesse): This is a pointer such that we can cull chunks that are - // empty, or completely full. + // NOTE(Jesse): This is a pointer such that we can cull chunks that are empty, or completely full. world_chunk *Chunk; // NOTE(Jesse): Took the union out because the UI doesn't know how to deal.. @@ -26,10 +25,15 @@ struct octree_node octree_node *Children[8]; poof(@custom_ui(if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[ArrayIndex], CSz("Child"), Params);})) octree_node *Next; // NOTE(Jesse): Freelist Next /* }; */ + + world_edit_ptr_block_array Edits; }; typedef octree_node* octree_node_ptr; +poof(buffer(octree_node_ptr)) +#include + struct picked_octree_node { octree_node *Node; @@ -239,6 +243,9 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node); link_internal u32 MergeOctreeChildren(engine_resources *Engine, octree_node *Node); +link_internal world_chunk_ptr_buffer +GatherChunksOverlappingArea(world *World, rect3cp Region, memory_arena *Memory); + link_internal void InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks); diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 67997bae4..39b8e070a 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -612,8 +612,8 @@ MapIntoQueryBox(v3i SimSpaceVoxP, v3i SimSpaceQueryMinP, voxel_position SimSpace link_internal world_chunk* GetWorldChunkFromHashtable(world *World, world_position P); -link_internal world_chunk_ptr_buffer -GatherChunksOverlappingArea(world *World, rect3cp Region, memory_arena *Memory); +/* link_internal octree_node_ptr_buffer */ +/* GatherChunksOverlappingArea(world *World, rect3cp Region, memory_arena *Memory); */ link_internal standing_spot_buffer GetStandingSpotsWithinRadius_FilteredByStandable(world *World, canonical_position P, r32 GatherRadius, v3 EntityRadius, memory_arena *Memory); From f185b98f82d0825e5de379d600665a34cc514051 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 20 Jan 2025 15:12:30 -0700 Subject: [PATCH 145/421] Run new poof and update stdlib --- external/bonsai_stdlib | 2 +- ...do_editor_ui_for_compound_type_animation.h | 36 +-- .../do_editor_ui_for_compound_type_asset.h | 18 +- .../do_editor_ui_for_compound_type_asset_id.h | 10 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 8 +- ...editor_ui_for_compound_type_bonsai_futex.h | 18 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 22 +- ..._editor_ui_for_compound_type_brush_layer.h | 4 +- .../do_editor_ui_for_compound_type_camera.h | 82 +++--- ...o_editor_ui_for_compound_type_chunk_data.h | 24 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 8 +- ...tor_ui_for_compound_type_collision_event.h | 20 +- ..._editor_ui_for_compound_type_debug_state.h | 114 ++++---- ...editor_ui_for_compound_type_engine_debug.h | 140 +++++----- ...or_ui_for_compound_type_engine_resources.h | 94 +++---- ...tor_ui_for_compound_type_engine_settings.h | 13 +- .../do_editor_ui_for_compound_type_entity.h | 70 ++--- ...do_editor_ui_for_compound_type_entity_id.h | 12 +- ...i_for_compound_type_entity_position_info.h | 18 +- ...ui_for_compound_type_file_traversal_node.h | 16 +- .../do_editor_ui_for_compound_type_frustum.h | 40 +-- ..._for_compound_type_g_buffer_render_group.h | 30 +- ..._editor_ui_for_compound_type_game_lights.h | 22 +- ...compound_type_gpu_element_buffer_handles.h | 46 ++-- ..._compound_type_gpu_mapped_element_buffer.h | 8 +- .../do_editor_ui_for_compound_type_graphics.h | 124 ++++----- ...r_ui_for_compound_type_graphics_settings.h | 20 +- .../do_editor_ui_for_compound_type_input.h | 258 +++++++++--------- ..._editor_ui_for_compound_type_input_event.h | 12 +- .../do_editor_ui_for_compound_type_keyframe.h | 12 +- ...ditor_ui_for_compound_type_layered_brush.h | 50 ++-- ...editor_ui_for_compound_type_level_editor.h | 96 ++++--- ..._for_compound_type_lighting_render_group.h | 20 +- ...r_ui_for_compound_type_lighting_settings.h | 66 ++--- ..._ui_for_compound_type_lod_element_buffer.h | 18 +- .../do_editor_ui_for_compound_type_model.h | 24 +- ..._editor_ui_for_compound_type_noise_layer.h | 16 +- ..._editor_ui_for_compound_type_octree_node.h | 41 ++- .../do_editor_ui_for_compound_type_particle.h | 26 +- ...tor_ui_for_compound_type_particle_system.h | 126 ++++----- .../do_editor_ui_for_compound_type_physics.h | 24 +- .../do_editor_ui_for_compound_type_plane.h | 14 +- .../do_editor_ui_for_compound_type_platform.h | 68 ++--- ...ditor_ui_for_compound_type_random_series.h | 8 +- ...r_ui_for_compound_type_render_buffers_2d.h | 40 +-- ...editor_ui_for_compound_type_render_debug.h | 24 +- ...tor_ui_for_compound_type_render_settings.h | 106 +++---- ..._editor_ui_for_compound_type_renderer_2d.h | 96 +++---- .../do_editor_ui_for_compound_type_shader.h | 38 +-- .../do_editor_ui_for_compound_type_texture.h | 44 +-- .../do_editor_ui_for_compound_type_ui_debug.h | 36 +-- .../do_editor_ui_for_compound_type_ui_id.h | 24 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 10 +- ...pound_type_untextured_3d_geometry_buffer.h | 42 +-- ...tor_ui_for_compound_type_vertex_material.h | 18 +- .../do_editor_ui_for_compound_type_vox_data.h | 11 +- .../do_editor_ui_for_compound_type_voxel.h | 12 +- ...itor_ui_for_compound_type_voxel_lighting.h | 8 +- ...o_editor_ui_for_compound_type_work_queue.h | 18 +- ...or_ui_for_compound_type_work_queue_entry.h | 4 +- .../do_editor_ui_for_compound_type_world.h | 28 +- ..._editor_ui_for_compound_type_world_chunk.h | 102 +++---- generated/do_editor_ui_for_enum_asset_type.h | 8 +- generated/do_editor_ui_for_enum_chunk_flag.h | 14 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 18 +- ...editor_ui_for_enum_entity_behavior_flags.h | 20 +- .../do_editor_ui_for_enum_entity_state.h | 10 +- ...o_editor_ui_for_enum_file_traversal_type.h | 8 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 10 +- ...do_editor_ui_for_enum_resolution_setting.h | 8 +- ...itor_ui_for_enum_shader_language_setting.h | 6 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 14 +- generated/for_datatypes_0XxWqGSZ.h | 4 + generated/for_datatypes_fkubhsYl.h | 4 + generated/for_datatypes_kv3WBTai.h | 4 + ...group_for_bitfield_enum_terrain_gen_type.h | 2 +- .../string_and_value_tables_asset_type.h | 6 +- ..._and_value_tables_engine_debug_view_mode.h | 10 +- ...ing_and_value_tables_file_traversal_node.h | 6 +- ...ing_and_value_tables_particle_spawn_type.h | 6 +- ...string_and_value_tables_terrain_gen_type.h | 6 +- ...tring_and_value_tables_tone_mapping_type.h | 6 +- jesse.make.sh | 6 +- make.sh | 15 +- src/engine/editor.h | 1 + 85 files changed, 1405 insertions(+), 1346 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 03b1e77db..236793d4c 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 03b1e77db86f4c9bf64c4516ae138d0014d098c9 +Subproject commit 236793d4c3266d333a2ec77dc65852540911e70c diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 8371bb72c..eb231bf4e 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->t), + Cast(r32*, &Element->t), CSz("t"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->tEnd), + Cast(r32*, &Element->tEnd), CSz("tEnd"), Params ); @@ -56,12 +56,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->xKeyframeCount), + Cast(u32*, &Element->xKeyframeCount), CSz("xKeyframeCount"), Params ); @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(keyframe*, Element->xKeyframes), @@ -89,10 +89,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->yKeyframeCount), + Cast(u32*, &Element->yKeyframeCount), CSz("yKeyframeCount"), Params ); @@ -103,9 +103,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(keyframe*, Element->yKeyframes), @@ -120,10 +120,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->zKeyframeCount), + Cast(u32*, &Element->zKeyframeCount), CSz("zKeyframeCount"), Params ); @@ -134,9 +134,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(keyframe*, Element->zKeyframes), diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 4341b7938..2e2aa4ec6 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(asset_load_state*,&Element->LoadState), + Cast(asset_load_state*, &Element->LoadState), CSz("LoadState"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(asset_id*,&Element->Id), + Cast(asset_id*, &Element->Id), CSz("Id"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*,&Element->LRUFrameIndex), + Cast(u64*, &Element->LRUFrameIndex), CSz("LRUFrameIndex"), Params ); @@ -70,12 +70,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(asset_type*,&Element->Type), + Cast(asset_type*, &Element->Type), CSz("Type"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index f3c5445c4..818f5d5ed 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u16*,&Element->Index), + Cast(u16*, &Element->Index), CSz("Index"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(file_traversal_node*,&Element->FileNode), + Cast(file_traversal_node*, &Element->FileNode), CSz("FileNode"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index a266ccb0a..9c4079daa 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*,&Element->Texture), + Cast(texture*, &Element->Texture), CSz("Texture"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(camera*,&Element->Camera), + Cast(camera*, &Element->Camera), CSz("Camera"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 1aee43be8..0ee301331 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->SignalValue), + Cast(u32*, &Element->SignalValue), CSz("SignalValue"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->ThreadsWaiting), + Cast(u32*, &Element->ThreadsWaiting), CSz("ThreadsWaiting"), Params ); @@ -56,11 +56,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->Initialized), + Cast(b8*, &Element->Initialized), CSz("Initialized"), &DefaultUiRenderParams_Checkbox ); @@ -69,7 +69,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index a554b60d4..e7ea669f6 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(os*,&Element->Os), + Cast(os*, &Element->Os), CSz("Os"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(platform*,&Element->Plat), + Cast(platform*, &Element->Plat), CSz("Plat"), Params ); @@ -56,7 +56,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(thread_local_state*, Element->ThreadStates), @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture_block_array*,&Element->AllTextures), + Cast(texture_block_array*, &Element->AllTextures), CSz("AllTextures"), Params ); @@ -86,10 +86,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shader_ptr_block_array*,&Element->AllShaders), + Cast(shader_ptr_block_array*, &Element->AllShaders), CSz("AllShaders"), Params ); @@ -101,10 +101,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(debug_state*,&Element->DebugState), + Cast(debug_state*, &Element->DebugState), CSz("DebugState"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 2d3c0e0b0..055caa664 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(brush_settings*,&Element->Settings), + Cast(brush_settings*, &Element->Settings), CSz("Settings"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 320874adb..bc4ac474c 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(frustum*,&Element->Frust), + Cast(frustum*, &Element->Frust), CSz("Frust"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(cp*,&Element->CurrentP), + Cast(cp*, &Element->CurrentP), CSz("CurrentP"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->RenderSpacePosition), + Cast(v3*, &Element->RenderSpacePosition), CSz("RenderSpacePosition"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Pitch), + Cast(r32*, &Element->Pitch), CSz("Pitch"), Params ); @@ -85,12 +85,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Roll), + Cast(r32*, &Element->Roll), CSz("Roll"), Params ); @@ -101,12 +101,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Yaw), + Cast(r32*, &Element->Yaw), CSz("Yaw"), Params ); @@ -117,12 +117,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->DistanceFromTarget), + Cast(r32*, &Element->DistanceFromTarget), CSz("DistanceFromTarget"), Params ); @@ -133,12 +133,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->TargetPitch), + Cast(r32*, &Element->TargetPitch), CSz("TargetPitch"), Params ); @@ -149,12 +149,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->TargetRoll), + Cast(r32*, &Element->TargetRoll), CSz("TargetRoll"), Params ); @@ -165,12 +165,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->TargetYaw), + Cast(r32*, &Element->TargetYaw), CSz("TargetYaw"), Params ); @@ -181,12 +181,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->TargetDistanceFromTarget), + Cast(r32*, &Element->TargetDistanceFromTarget), CSz("TargetDistanceFromTarget"), Params ); @@ -197,12 +197,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Blend), + Cast(r32*, &Element->Blend), CSz("Blend"), Params ); @@ -213,12 +213,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Front), + Cast(v3*, &Element->Front), CSz("Front"), Params ); @@ -230,10 +230,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Right), + Cast(v3*, &Element->Right), CSz("Right"), Params ); @@ -245,10 +245,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Up), + Cast(v3*, &Element->Up), CSz("Up"), Params ); @@ -260,10 +260,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(entity_id*,&Element->GhostId), + Cast(entity_id*, &Element->GhostId), CSz("GhostId"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 51edbbaa4..46ae61f61 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(chunk_flag*,&Element->Flags), + Cast(chunk_flag*, &Element->Flags), CSz("Flags"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->Dim), + Cast(v3i*, &Element->Dim), CSz("Dim"), Params ); @@ -56,7 +56,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->Occupancy), @@ -70,9 +70,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->xOccupancyBorder), @@ -86,9 +86,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->FaceMasks), @@ -102,9 +102,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(voxel*, Element->Voxels), @@ -119,7 +119,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(voxel_lighting*, Element->VoxelLighting), diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index e48a5b30a..301ac1777 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_chunk*,&Element->Chunk), + Cast(world_chunk*, &Element->Chunk), CSz("Chunk"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(asset_thumbnail*,&Element->Thumbnail), + Cast(asset_thumbnail*, &Element->Thumbnail), CSz("Thumbnail"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index eba149c13..ac527abe6 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->FrameIndex), + Cast(u32*, &Element->FrameIndex), CSz("FrameIndex"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->Count), + Cast(u32*, &Element->Count), CSz("Count"), Params ); @@ -56,12 +56,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(cp*,&Element->MinP), + Cast(cp*, &Element->MinP), CSz("MinP"), Params ); @@ -73,10 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(cp*,&Element->MaxP), + Cast(cp*, &Element->MaxP), CSz("MaxP"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 16031f87c..f2c2a4e07 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -26,9 +26,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->Initialized), + Cast(b8*, &Element->Initialized), CSz("Initialized"), &DefaultUiRenderParams_Checkbox ); @@ -37,12 +37,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->UIType), + Cast(u32*, &Element->UIType), CSz("UIType"), Params ); @@ -53,12 +53,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*,&Element->BytesBufferedToCard), + Cast(u64*, &Element->BytesBufferedToCard), CSz("BytesBufferedToCard"), Params ); @@ -69,11 +69,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->DebugDoScopeProfiling), + Cast(b8*, &Element->DebugDoScopeProfiling), CSz("DebugDoScopeProfiling"), &DefaultUiRenderParams_Checkbox ); @@ -82,12 +82,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*,&Element->NumScopes), + Cast(u64*, &Element->NumScopes), CSz("NumScopes"), Params ); @@ -98,12 +98,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->DrawCallCountLastFrame), + Cast(u32*, &Element->DrawCallCountLastFrame), CSz("DrawCallCountLastFrame"), Params ); @@ -114,12 +114,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->VertexCountLastFrame), + Cast(u32*, &Element->VertexCountLastFrame), CSz("VertexCountLastFrame"), Params ); @@ -130,9 +130,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(picked_world_chunk*, Element->PickedChunk), @@ -147,7 +147,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(picked_world_chunk*, Element->HoverChunk), @@ -162,7 +162,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(debug_thread_state*, Element->ThreadStates), @@ -177,7 +177,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->MetaTableNameStringsArena), @@ -192,7 +192,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(renderer_2d*, Element->UiGroup), @@ -207,10 +207,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(untextured_3d_geometry_buffer*,&Element->LineMesh), + Cast(untextured_3d_geometry_buffer*, &Element->LineMesh), CSz("LineMesh"), Params ); @@ -222,7 +222,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(selected_arenas*, Element->SelectedArenas), @@ -237,9 +237,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->DisplayDebugMenu), + Cast(b8*, &Element->DisplayDebugMenu), CSz("DisplayDebugMenu"), &DefaultUiRenderParams_Checkbox ); @@ -248,9 +248,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(debug_profile_scope*, Element->HotFunction), @@ -265,10 +265,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64_cursor*,&Element->HistogramSamples), + Cast(u64_cursor*, &Element->HistogramSamples), CSz("HistogramSamples"), Params ); @@ -280,10 +280,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(bonsai_futex*,&Element->HistogramFutex), + Cast(bonsai_futex*, &Element->HistogramFutex), CSz("HistogramFutex"), Params ); @@ -295,10 +295,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(debug_profile_scope*,&Element->FreeScopeSentinel), + Cast(debug_profile_scope*, &Element->FreeScopeSentinel), CSz("FreeScopeSentinel"), Params ); @@ -310,10 +310,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(umm*,&Element->MinCycles), + Cast(umm*, &Element->MinCycles), CSz("MinCycles"), Params ); @@ -324,12 +324,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(umm*,&Element->MaxCycles), + Cast(umm*, &Element->MaxCycles), CSz("MaxCycles"), Params ); @@ -340,15 +340,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v Frames[(128)]"), CSz("> Frames[(128)]"), UiId(Window, "toggle debug_state frame_stats Frames", Element->Frames), Params )) + if (ToggleButton(Ui, CSz("v Frames[(128)]"), CSz("> Frames[(128)]"), UiId(Window, "toggle debug_state frame_stats Frames", Element->Frames), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, (128)) { - DoEditorUi(Ui, Window, Element->Frames+ArrayIndex, FSz("Frames[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->Frames+ArrayIndex, FSz("Frames[%d]", ArrayIndex), Params); } @@ -359,10 +359,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->ReadScopeIndex), + Cast(u32*, &Element->ReadScopeIndex), CSz("ReadScopeIndex"), Params ); @@ -373,12 +373,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->FreeScopeCount), + Cast(s32*, &Element->FreeScopeCount), CSz("FreeScopeCount"), Params ); @@ -389,15 +389,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v RegisteredMemoryArenas[(1024)]"), CSz("> RegisteredMemoryArenas[(1024)]"), UiId(Window, "toggle debug_state registered_memory_arena RegisteredMemoryArenas", Element->RegisteredMemoryArenas), Params )) + if (ToggleButton(Ui, CSz("v RegisteredMemoryArenas[(1024)]"), CSz("> RegisteredMemoryArenas[(1024)]"), UiId(Window, "toggle debug_state registered_memory_arena RegisteredMemoryArenas", Element->RegisteredMemoryArenas), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, (1024)) { - DoEditorUi(Ui, Window, Element->RegisteredMemoryArenas+ArrayIndex, FSz("RegisteredMemoryArenas[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->RegisteredMemoryArenas+ArrayIndex, FSz("RegisteredMemoryArenas[%d]", ArrayIndex), Params); } @@ -408,13 +408,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - if (ToggleButton(Ui, CSz("v TrackedDrawCalls[(4096)]"), CSz("> TrackedDrawCalls[(4096)]"), UiId(Window, "toggle debug_state debug_draw_call TrackedDrawCalls", Element->TrackedDrawCalls), Params )) + if (ToggleButton(Ui, CSz("v TrackedDrawCalls[(4096)]"), CSz("> TrackedDrawCalls[(4096)]"), UiId(Window, "toggle debug_state debug_draw_call TrackedDrawCalls", Element->TrackedDrawCalls), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, (4096)) { - DoEditorUi(Ui, Window, Element->TrackedDrawCalls+ArrayIndex, FSz("TrackedDrawCalls[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->TrackedDrawCalls+ArrayIndex, FSz("TrackedDrawCalls[%d]", ArrayIndex), Params); } diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 4815e6327..67cfc770d 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->Memory), @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(engine_debug_view_mode*,&Element->ViewMode), + Cast(engine_debug_view_mode*, &Element->ViewMode), CSz("ViewMode"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(picked_world_chunk_static_buffer*,&Element->PickedChunks), + Cast(picked_world_chunk_static_buffer*, &Element->PickedChunks), CSz("PickedChunks"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture_ptr_block_array*,&Element->Textures), + Cast(texture_ptr_block_array*, &Element->Textures), CSz("Textures"), Params ); @@ -86,10 +86,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(ui_debug*,&Element->UiDebug), + Cast(ui_debug*, &Element->UiDebug), CSz("UiDebug"), Params ); @@ -101,10 +101,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(render_debug*,&Element->Render), + Cast(render_debug*, &Element->Render), CSz("Render"), Params ); @@ -116,10 +116,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->DrawEntityCollisionVolumes), + Cast(b8*, &Element->DrawEntityCollisionVolumes), CSz("DrawEntityCollisionVolumes"), Params ); @@ -130,12 +130,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->DrawWorldAxies), + Cast(b8*, &Element->DrawWorldAxies), CSz("DrawWorldAxies"), Params ); @@ -146,12 +146,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->TriggerRuntimeBreak), + Cast(b8*, &Element->TriggerRuntimeBreak), CSz("TriggerRuntimeBreak"), Params ); @@ -162,12 +162,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->ResetAssetNodeView), + Cast(b8*, &Element->ResetAssetNodeView), CSz("ResetAssetNodeView"), Params ); @@ -178,12 +178,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->DrawBranchNodesWithMeshes), + Cast(b8*, &Element->DrawBranchNodesWithMeshes), CSz("DrawBranchNodesWithMeshes"), Params ); @@ -194,12 +194,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->DrawBranchNodes), + Cast(b8*, &Element->DrawBranchNodes), CSz("DrawBranchNodes"), Params ); @@ -210,12 +210,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->DrawLeafNodes), + Cast(b8*, &Element->DrawLeafNodes), CSz("DrawLeafNodes"), Params ); @@ -226,12 +226,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->DrawNodesWithChunks), + Cast(b8*, &Element->DrawNodesWithChunks), CSz("DrawNodesWithChunks"), Params ); @@ -242,12 +242,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->DrawQueuedNodes), + Cast(b8*, &Element->DrawQueuedNodes), CSz("DrawQueuedNodes"), Params ); @@ -258,12 +258,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->MarkChunkBorderVoxels), + Cast(b8*, &Element->MarkChunkBorderVoxels), CSz("MarkChunkBorderVoxels"), Params ); @@ -274,12 +274,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->DrawGameCameraLocation), + Cast(b8*, &Element->DrawGameCameraLocation), CSz("DrawGameCameraLocation"), Params ); @@ -290,12 +290,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r64*,&Element->ChunkGenTimeElapsedMS), + Cast(r64*, &Element->ChunkGenTimeElapsedMS), CSz("ChunkGenTimeElapsedMS"), Params ); @@ -306,12 +306,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*,&Element->CellsGenerated), + Cast(u64*, &Element->CellsGenerated), CSz("CellsGenerated"), Params ); @@ -322,12 +322,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r64*,&Element->ChunkGenCyclesElapsed), + Cast(r64*, &Element->ChunkGenCyclesElapsed), CSz("ChunkGenCyclesElapsed"), Params ); @@ -338,12 +338,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u8*,&Element->PickedChunkState), + Cast(u8*, &Element->PickedChunkState), CSz("PickedChunkState"), Params ); @@ -354,9 +354,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_chunk*, Element->PickedChunk), @@ -371,10 +371,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(asset_window_view_mode*,&Element->AssetWindowViewMode), + Cast(asset_window_view_mode*, &Element->AssetWindowViewMode), CSz("AssetWindowViewMode"), Params ); @@ -386,10 +386,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(asset_id*,&Element->SelectedAsset), + Cast(asset_id*, &Element->SelectedAsset), CSz("SelectedAsset"), Params ); @@ -401,10 +401,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*,&Element->ModelIndex), + Cast(u64*, &Element->ModelIndex), CSz("ModelIndex"), Params ); @@ -415,12 +415,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(entity_id*,&Element->SelectedEntity), + Cast(entity_id*, &Element->SelectedEntity), CSz("SelectedEntity"), Params ); @@ -432,10 +432,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->OctreeDrawDepth), + Cast(u32*, &Element->OctreeDrawDepth), CSz("OctreeDrawDepth"), Params ); @@ -446,9 +446,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(octree_node*, Element->SelectedNode), diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 1a931bdd8..f30c3163e 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(engine_settings*,&Element->Settings), + Cast(engine_settings*, &Element->Settings), CSz("Settings"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(bonsai_stdlib*,&Element->Stdlib), + Cast(bonsai_stdlib*, &Element->Stdlib), CSz("Stdlib"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(renderer_2d*,&Element->Ui), + Cast(renderer_2d*, &Element->Ui), CSz("Ui"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(application_api*,&Element->GameApi), + Cast(application_api*, &Element->GameApi), CSz("GameApi"), Params ); @@ -86,10 +86,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(hotkeys*,&Element->Hotkeys), + Cast(hotkeys*, &Element->Hotkeys), CSz("Hotkeys"), Params ); @@ -101,10 +101,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(maybe_ray*,&Element->MaybeMouseRay), + Cast(maybe_ray*, &Element->MaybeMouseRay), CSz("MaybeMouseRay"), Params ); @@ -116,7 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world*, Element->World), @@ -131,7 +131,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(game_state*, Element->GameState), @@ -146,10 +146,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(graphics*,&Element->Graphics), + Cast(graphics*, &Element->Graphics), CSz("Graphics"), Params ); @@ -161,10 +161,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(file_traversal_node*,&Element->RequestedGameLibReloadNode), + Cast(file_traversal_node*, &Element->RequestedGameLibReloadNode), CSz("RequestedGameLibReloadNode"), Params ); @@ -176,10 +176,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(game_lib_reload_behavior*,&Element->RequestedGameLibReloadBehavior), + Cast(game_lib_reload_behavior*, &Element->RequestedGameLibReloadBehavior), CSz("RequestedGameLibReloadBehavior"), Params ); @@ -191,10 +191,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(heap_allocator*,&Element->Heap), + Cast(heap_allocator*, &Element->Heap), CSz("Heap"), Params ); @@ -206,7 +206,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->GameMemory), @@ -221,7 +221,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->WorldUpdateMemory), @@ -236,7 +236,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(entity*, Element->EntityTable), @@ -251,10 +251,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(asset_system*,&Element->AssetSystem), + Cast(asset_system*, &Element->AssetSystem), CSz("AssetSystem"), Params ); @@ -266,10 +266,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->FrameIndex), + Cast(u32*, &Element->FrameIndex), CSz("FrameIndex"), Params ); @@ -280,12 +280,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(tiered_mesh_freelist*,&Element->geo_u3d_MeshFreelist), + Cast(tiered_mesh_freelist*, &Element->geo_u3d_MeshFreelist), CSz("geo_u3d_MeshFreelist"), Params ); @@ -297,10 +297,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(tiered_mesh_freelist*,&Element->world_chunk_MeshFreelist), + Cast(tiered_mesh_freelist*, &Element->world_chunk_MeshFreelist), CSz("world_chunk_MeshFreelist"), Params ); @@ -312,7 +312,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(debug_state*, Element->DebugState), @@ -327,10 +327,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(engine_debug*,&Element->EngineDebug), + Cast(engine_debug*, &Element->EngineDebug), CSz("EngineDebug"), Params ); @@ -342,10 +342,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(level_editor*,&Element->Editor), + Cast(level_editor*, &Element->Editor), CSz("Editor"), Params ); @@ -357,10 +357,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(maybe_picked_voxel*,&Element->MousedOverVoxel), + Cast(maybe_picked_voxel*, &Element->MousedOverVoxel), CSz("MousedOverVoxel"), Params ); @@ -372,10 +372,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(maybe_standing_spot*,&Element->ClosestStandingSpotToCursor), + Cast(maybe_standing_spot*, &Element->ClosestStandingSpotToCursor), CSz("ClosestStandingSpotToCursor"), Params ); @@ -387,10 +387,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(maybe_entity_ptr*,&Element->HoverEntity), + Cast(maybe_entity_ptr*, &Element->HoverEntity), CSz("HoverEntity"), Params ); @@ -402,10 +402,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(render_entity_to_texture_group*,&Element->RTTGroup), + Cast(render_entity_to_texture_group*, &Element->RTTGroup), CSz("RTTGroup"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index ebb879efa..f45e755ce 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -26,13 +26,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(graphics_settings*,&Element->Graphics), + Cast(graphics_settings*, &Element->Graphics), CSz("Graphics"), Params ); + + + + + + + + + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index e50d0cf67..bf63d56a7 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(entity_id*,&Element->Id), + Cast(entity_id*, &Element->Id), CSz("Id"), Params ); @@ -41,19 +41,19 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ -DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->EulerAngles), + Cast(v3*, &Element->EulerAngles), CSz("EulerAngles"), Params -,-PI32, PI32 ); + , -PI32, PI32 ); @@ -62,10 +62,10 @@ DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANC - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Scale), + Cast(r32*, &Element->Scale), CSz("Scale"), Params ); @@ -76,12 +76,12 @@ DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANC - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->_CollisionVolumeRadius), + Cast(v3*, &Element->_CollisionVolumeRadius), CSz("_CollisionVolumeRadius"), Params ); @@ -93,10 +93,10 @@ DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANC - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(physics*,&Element->Physics), + Cast(physics*, &Element->Physics), CSz("Physics"), Params ); @@ -108,10 +108,10 @@ DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANC - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(asset_id*,&Element->AssetId), + Cast(asset_id*, &Element->AssetId), CSz("AssetId"), Params ); @@ -123,10 +123,10 @@ DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANC - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*,&Element->ModelIndex), + Cast(u64*, &Element->ModelIndex), CSz("ModelIndex"), Params ); @@ -137,12 +137,12 @@ DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANC - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(collision_event*,&Element->LastResolvedCollision), + Cast(collision_event*, &Element->LastResolvedCollision), CSz("LastResolvedCollision"), Params ); @@ -154,10 +154,10 @@ DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANC - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(entity_position_info*,&Element->LastResolvedPosInfo), + Cast(entity_position_info*, &Element->LastResolvedPosInfo), CSz("LastResolvedPosInfo"), Params ); @@ -169,7 +169,7 @@ DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANC - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(particle_system*, Element->Emitter), @@ -184,10 +184,10 @@ DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANC - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(entity_state*,&Element->State), + Cast(entity_state*, &Element->State), CSz("State"), Params ); @@ -199,10 +199,10 @@ DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANC - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(entity_behavior_flags*,&Element->Behavior), + Cast(entity_behavior_flags*, &Element->Behavior), CSz("Behavior"), Params ); @@ -214,10 +214,10 @@ DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANC - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(entity_id*,&Element->Carrying), + Cast(entity_id*, &Element->Carrying), CSz("Carrying"), Params ); @@ -229,23 +229,23 @@ DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANC - if (EntityUserDataEditorUi) {EntityUserDataEditorUi(Ui, Window, &Element->UserType, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES);} + if (EntityUserDataEditorUi) {EntityUserDataEditorUi(Ui, Window, &Element->UserType, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES);} else {DoEditorUi(Ui, Window, &Element->UserType, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } -; + ; - PushNewRow(Ui); + PushNewRow(Ui); - if (EntityUserDataEditorUi) { /* User took control, skip this because it's intended */ } + if (EntityUserDataEditorUi) { /* User took control, skip this because it's intended */ } else {DoEditorUi(Ui, Window, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } -; + ; - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 273eb6dc4..684cbae56 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->Index), + Cast(u32*, &Element->Index), CSz("Index"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->Generation), + Cast(u32*, &Element->Generation), CSz("Generation"), Params ); @@ -56,7 +56,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 48663d4ab..7800f3309 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(cp*,&Element->P), + Cast(cp*, &Element->P), CSz("P"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->_CollisionVolumeRadius), + Cast(v3*, &Element->_CollisionVolumeRadius), CSz("_CollisionVolumeRadius"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Scale), + Cast(r32*, &Element->Scale), CSz("Scale"), Params ); @@ -70,12 +70,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->EulerAngles), + Cast(v3*, &Element->EulerAngles), CSz("EulerAngles"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 10b0ee870..d0955eb3e 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(file_traversal_type*,&Element->Type), + Cast(file_traversal_type*, &Element->Type), CSz("Type"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(cs*,&Element->Dir), + Cast(cs*, &Element->Dir), CSz("Dir"), Params ); @@ -55,12 +55,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(cs*,&Element->Name), + Cast(cs*, &Element->Name), CSz("Name"), Params ); @@ -71,7 +71,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 800a6e3b0..89f44a9ce 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(f32*,&Element->farClip), + Cast(f32*, &Element->farClip), CSz("farClip"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(f32*,&Element->nearClip), + Cast(f32*, &Element->nearClip), CSz("nearClip"), Params ); @@ -56,12 +56,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(f32*,&Element->width), + Cast(f32*, &Element->width), CSz("width"), Params ); @@ -72,12 +72,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(f32*,&Element->FOV), + Cast(f32*, &Element->FOV), CSz("FOV"), Params ); @@ -88,12 +88,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(plane*,&Element->Top), + Cast(plane*, &Element->Top), CSz("Top"), Params ); @@ -105,10 +105,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(plane*,&Element->Bot), + Cast(plane*, &Element->Bot), CSz("Bot"), Params ); @@ -120,10 +120,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(plane*,&Element->Left), + Cast(plane*, &Element->Left), CSz("Left"), Params ); @@ -135,10 +135,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(plane*,&Element->Right), + Cast(plane*, &Element->Right), CSz("Right"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index c8afd6cf7..6fb3ffd15 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*,&Element->FBO), + Cast(framebuffer*, &Element->FBO), CSz("FBO"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(g_buffer_textures*,&Element->Textures), + Cast(g_buffer_textures*, &Element->Textures), CSz("Textures"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shader*,&Element->gBufferShader), + Cast(shader*, &Element->gBufferShader), CSz("gBufferShader"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(m4*,&Element->InverseViewMatrix), + Cast(m4*, &Element->InverseViewMatrix), CSz("InverseViewMatrix"), Params ); @@ -86,10 +86,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(m4*,&Element->InverseProjectionMatrix), + Cast(m4*, &Element->InverseProjectionMatrix), CSz("InverseProjectionMatrix"), Params ); @@ -101,10 +101,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(m4*,&Element->ViewProjection), + Cast(m4*, &Element->ViewProjection), CSz("ViewProjection"), Params ); @@ -116,10 +116,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->GlTimerObject), + Cast(u32*, &Element->GlTimerObject), CSz("GlTimerObject"), Params ); @@ -130,7 +130,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 48b7965fd..464303728 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*,&Element->ColorTex), + Cast(texture*, &Element->ColorTex), CSz("ColorTex"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*,&Element->PositionTex), + Cast(texture*, &Element->PositionTex), CSz("PositionTex"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->IndexToUV), + Cast(r32*, &Element->IndexToUV), CSz("IndexToUV"), Params ); @@ -70,12 +70,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->Count), + Cast(s32*, &Element->Count), CSz("Count"), Params ); @@ -86,9 +86,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(light*, Element->Lights), diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 648d25bcb..e91f25e90 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->VertexHandle), + Cast(u32*, &Element->VertexHandle), CSz("VertexHandle"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->NormalHandle), + Cast(u32*, &Element->NormalHandle), CSz("NormalHandle"), Params ); @@ -56,12 +56,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->MatHandle), + Cast(u32*, &Element->MatHandle), CSz("MatHandle"), Params ); @@ -72,12 +72,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->ElementCount), + Cast(u32*, &Element->ElementCount), CSz("ElementCount"), Params ); @@ -88,12 +88,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(data_type*,&Element->ElementType), + Cast(data_type*, &Element->ElementType), CSz("ElementType"), Params ); @@ -105,10 +105,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->Mapped), + Cast(b8*, &Element->Mapped), CSz("Mapped"), Params ); @@ -119,12 +119,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->Pad), + Cast(b8*, &Element->Pad), CSz("Pad"), Params ); @@ -135,12 +135,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u16*,&Element->Flags), + Cast(u16*, &Element->Flags), CSz("Flags"), Params ); @@ -151,7 +151,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 21108ea02..fffebc570 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(gpu_element_buffer_handles*,&Element->Handles), + Cast(gpu_element_buffer_handles*, &Element->Handles), CSz("Handles"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(untextured_3d_geometry_buffer*,&Element->Buffer), + Cast(untextured_3d_geometry_buffer*, &Element->Buffer), CSz("Buffer"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index e00709c59..ccae0eee8 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -26,9 +26,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->Initialized), + Cast(b8*, &Element->Initialized), CSz("Initialized"), &DefaultUiRenderParams_Checkbox ); @@ -37,11 +37,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->RenderGate), + Cast(b8*, &Element->RenderGate), CSz("RenderGate"), &DefaultUiRenderParams_Checkbox ); @@ -50,12 +50,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(render_settings*,&Element->Settings), + Cast(render_settings*, &Element->Settings), CSz("Settings"), Params ); @@ -67,10 +67,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(render_settings*,&Element->PrevSettings), + Cast(render_settings*, &Element->PrevSettings), CSz("PrevSettings"), Params ); @@ -82,10 +82,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->SunBasis), + Cast(v3*, &Element->SunBasis), CSz("SunBasis"), Params ); @@ -97,10 +97,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->FogPower), + Cast(r32*, &Element->FogPower), CSz("FogPower"), Params ); @@ -111,12 +111,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->FogColor), + Cast(v3*, &Element->FogColor), CSz("FogColor"), Params ); @@ -128,10 +128,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->SkyColor), + Cast(v3*, &Element->SkyColor), CSz("SkyColor"), Params ); @@ -143,10 +143,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(camera*,&Element->GameCamera), + Cast(camera*, &Element->GameCamera), CSz("GameCamera"), Params ); @@ -158,10 +158,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(camera*,&Element->DebugCamera), + Cast(camera*, &Element->DebugCamera), CSz("DebugCamera"), Params ); @@ -173,10 +173,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Exposure), + Cast(r32*, &Element->Exposure), CSz("Exposure"), Params ); @@ -187,12 +187,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_chunk_ptr_paged_list*,&Element->MainDrawList), + Cast(world_chunk_ptr_paged_list*, &Element->MainDrawList), CSz("MainDrawList"), Params ); @@ -204,10 +204,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_chunk_ptr_paged_list*,&Element->ShadowMapDrawList), + Cast(world_chunk_ptr_paged_list*, &Element->ShadowMapDrawList), CSz("ShadowMapDrawList"), Params ); @@ -219,10 +219,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->MinClipP_worldspace), + Cast(v3*, &Element->MinClipP_worldspace), CSz("MinClipP_worldspace"), Params ); @@ -234,10 +234,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->MaxClipP_worldspace), + Cast(v3*, &Element->MaxClipP_worldspace), CSz("MaxClipP_worldspace"), Params ); @@ -249,7 +249,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(g_buffer_render_group*, Element->gBuffer), @@ -264,7 +264,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(ao_render_group*, Element->AoGroup), @@ -279,7 +279,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shadow_render_group*, Element->SG), @@ -294,10 +294,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*,&Element->ColorPaletteTexture), + Cast(texture*, &Element->ColorPaletteTexture), CSz("ColorPaletteTexture"), Params ); @@ -309,10 +309,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(transparency_render_group*,&Element->Transparency), + Cast(transparency_render_group*, &Element->Transparency), CSz("Transparency"), Params ); @@ -324,10 +324,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(lighting_render_group*,&Element->Lighting), + Cast(lighting_render_group*, &Element->Lighting), CSz("Lighting"), Params ); @@ -339,10 +339,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(gaussian_render_group*,&Element->Gaussian), + Cast(gaussian_render_group*, &Element->Gaussian), CSz("Gaussian"), Params ); @@ -354,10 +354,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(composite_render_group*,&Element->CompositeGroup), + Cast(composite_render_group*, &Element->CompositeGroup), CSz("CompositeGroup"), Params ); @@ -369,10 +369,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(gpu_noise_render_group*,&Element->GpuNoise), + Cast(gpu_noise_render_group*, &Element->GpuNoise), CSz("GpuNoise"), Params ); @@ -384,10 +384,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->NoiseFinalizeJobsPending), + Cast(u32*, &Element->NoiseFinalizeJobsPending), CSz("NoiseFinalizeJobsPending"), Params ); @@ -398,12 +398,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(dummy_work_queue_entry_build_chunk_mesh_block_array*,&Element->NoiseReadbackJobs), + Cast(dummy_work_queue_entry_build_chunk_mesh_block_array*, &Element->NoiseReadbackJobs), CSz("NoiseReadbackJobs"), Params ); @@ -415,13 +415,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - if (ToggleButton(Ui, CSz("v GpuBuffers[2]"), CSz("> GpuBuffers[2]"), UiId(Window, "toggle graphics gpu_mapped_element_buffer GpuBuffers", Element->GpuBuffers), Params )) + if (ToggleButton(Ui, CSz("v GpuBuffers[2]"), CSz("> GpuBuffers[2]"), UiId(Window, "toggle graphics gpu_mapped_element_buffer GpuBuffers", Element->GpuBuffers), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 2) { - DoEditorUi(Ui, Window, Element->GpuBuffers+ArrayIndex, FSz("GpuBuffers[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->GpuBuffers+ArrayIndex, FSz("GpuBuffers[%d]", ArrayIndex), Params); } @@ -432,10 +432,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->GpuBufferWriteIndex), + Cast(u32*, &Element->GpuBufferWriteIndex), CSz("GpuBufferWriteIndex"), Params ); @@ -446,12 +446,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(gpu_timer_block_array*,&Element->GpuTimers), + Cast(gpu_timer_block_array*, &Element->GpuTimers), CSz("GpuTimers"), Params ); @@ -463,7 +463,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->Memory), diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index ec36fde41..be0d5d833 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(resolution_setting*,&Element->Resolution), + Cast(resolution_setting*, &Element->Resolution), CSz("Resolution"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shadow_quality_setting*,&Element->ShadowQuality), + Cast(shadow_quality_setting*, &Element->ShadowQuality), CSz("ShadowQuality"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(lighting_quality_setting*,&Element->LightingQuality), + Cast(lighting_quality_setting*, &Element->LightingQuality), CSz("LightingQuality"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shader_language_setting*,&Element->ShaderLanguage), + Cast(shader_language_setting*, &Element->ShaderLanguage), CSz("ShaderLanguage"), Params ); @@ -86,10 +86,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(resolution_setting*,&Element->WindowStartingSize), + Cast(resolution_setting*, &Element->WindowStartingSize), CSz("WindowStartingSize"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 8141ba07a..a3099ffa8 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Enter), + Cast(input_event*, &Element->Enter), CSz("Enter"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Escape), + Cast(input_event*, &Element->Escape), CSz("Escape"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Alt), + Cast(input_event*, &Element->Alt), CSz("Alt"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Ctrl), + Cast(input_event*, &Element->Ctrl), CSz("Ctrl"), Params ); @@ -86,10 +86,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Shift), + Cast(input_event*, &Element->Shift), CSz("Shift"), Params ); @@ -101,10 +101,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Backspace), + Cast(input_event*, &Element->Backspace), CSz("Backspace"), Params ); @@ -116,10 +116,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Delete), + Cast(input_event*, &Element->Delete), CSz("Delete"), Params ); @@ -131,10 +131,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F12), + Cast(input_event*, &Element->F12), CSz("F12"), Params ); @@ -146,10 +146,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F11), + Cast(input_event*, &Element->F11), CSz("F11"), Params ); @@ -161,10 +161,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F10), + Cast(input_event*, &Element->F10), CSz("F10"), Params ); @@ -176,10 +176,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F9), + Cast(input_event*, &Element->F9), CSz("F9"), Params ); @@ -191,10 +191,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F8), + Cast(input_event*, &Element->F8), CSz("F8"), Params ); @@ -206,10 +206,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F7), + Cast(input_event*, &Element->F7), CSz("F7"), Params ); @@ -221,10 +221,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F6), + Cast(input_event*, &Element->F6), CSz("F6"), Params ); @@ -236,10 +236,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F5), + Cast(input_event*, &Element->F5), CSz("F5"), Params ); @@ -251,10 +251,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F4), + Cast(input_event*, &Element->F4), CSz("F4"), Params ); @@ -266,10 +266,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F3), + Cast(input_event*, &Element->F3), CSz("F3"), Params ); @@ -281,10 +281,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F2), + Cast(input_event*, &Element->F2), CSz("F2"), Params ); @@ -296,10 +296,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F1), + Cast(input_event*, &Element->F1), CSz("F1"), Params ); @@ -311,10 +311,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Dot), + Cast(input_event*, &Element->Dot), CSz("Dot"), Params ); @@ -326,10 +326,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Minus), + Cast(input_event*, &Element->Minus), CSz("Minus"), Params ); @@ -341,10 +341,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->FSlash), + Cast(input_event*, &Element->FSlash), CSz("FSlash"), Params ); @@ -356,10 +356,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Space), + Cast(input_event*, &Element->Space), CSz("Space"), Params ); @@ -371,10 +371,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Underscore), + Cast(input_event*, &Element->Underscore), CSz("Underscore"), Params ); @@ -386,10 +386,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->N0), + Cast(input_event*, &Element->N0), CSz("N0"), Params ); @@ -401,10 +401,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->N1), + Cast(input_event*, &Element->N1), CSz("N1"), Params ); @@ -416,10 +416,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->N2), + Cast(input_event*, &Element->N2), CSz("N2"), Params ); @@ -431,10 +431,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->N3), + Cast(input_event*, &Element->N3), CSz("N3"), Params ); @@ -446,10 +446,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->N4), + Cast(input_event*, &Element->N4), CSz("N4"), Params ); @@ -461,10 +461,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->N5), + Cast(input_event*, &Element->N5), CSz("N5"), Params ); @@ -476,10 +476,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->N6), + Cast(input_event*, &Element->N6), CSz("N6"), Params ); @@ -491,10 +491,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->N7), + Cast(input_event*, &Element->N7), CSz("N7"), Params ); @@ -506,10 +506,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->N8), + Cast(input_event*, &Element->N8), CSz("N8"), Params ); @@ -521,10 +521,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->N9), + Cast(input_event*, &Element->N9), CSz("N9"), Params ); @@ -536,10 +536,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->A), + Cast(input_event*, &Element->A), CSz("A"), Params ); @@ -551,10 +551,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->B), + Cast(input_event*, &Element->B), CSz("B"), Params ); @@ -566,10 +566,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->C), + Cast(input_event*, &Element->C), CSz("C"), Params ); @@ -581,10 +581,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->D), + Cast(input_event*, &Element->D), CSz("D"), Params ); @@ -596,10 +596,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->E), + Cast(input_event*, &Element->E), CSz("E"), Params ); @@ -611,10 +611,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->F), + Cast(input_event*, &Element->F), CSz("F"), Params ); @@ -626,10 +626,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->G), + Cast(input_event*, &Element->G), CSz("G"), Params ); @@ -641,10 +641,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->H), + Cast(input_event*, &Element->H), CSz("H"), Params ); @@ -656,10 +656,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->I), + Cast(input_event*, &Element->I), CSz("I"), Params ); @@ -671,10 +671,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->J), + Cast(input_event*, &Element->J), CSz("J"), Params ); @@ -686,10 +686,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->K), + Cast(input_event*, &Element->K), CSz("K"), Params ); @@ -701,10 +701,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->L), + Cast(input_event*, &Element->L), CSz("L"), Params ); @@ -716,10 +716,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->M), + Cast(input_event*, &Element->M), CSz("M"), Params ); @@ -731,10 +731,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->N), + Cast(input_event*, &Element->N), CSz("N"), Params ); @@ -746,10 +746,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->O), + Cast(input_event*, &Element->O), CSz("O"), Params ); @@ -761,10 +761,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->P), + Cast(input_event*, &Element->P), CSz("P"), Params ); @@ -776,10 +776,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Q), + Cast(input_event*, &Element->Q), CSz("Q"), Params ); @@ -791,10 +791,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->R), + Cast(input_event*, &Element->R), CSz("R"), Params ); @@ -806,10 +806,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->S), + Cast(input_event*, &Element->S), CSz("S"), Params ); @@ -821,10 +821,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->T), + Cast(input_event*, &Element->T), CSz("T"), Params ); @@ -836,10 +836,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->U), + Cast(input_event*, &Element->U), CSz("U"), Params ); @@ -851,10 +851,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->V), + Cast(input_event*, &Element->V), CSz("V"), Params ); @@ -866,10 +866,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->W), + Cast(input_event*, &Element->W), CSz("W"), Params ); @@ -881,10 +881,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->X), + Cast(input_event*, &Element->X), CSz("X"), Params ); @@ -896,10 +896,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Y), + Cast(input_event*, &Element->Y), CSz("Y"), Params ); @@ -911,10 +911,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->Z), + Cast(input_event*, &Element->Z), CSz("Z"), Params ); @@ -926,10 +926,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->RMB), + Cast(input_event*, &Element->RMB), CSz("RMB"), Params ); @@ -941,10 +941,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->LMB), + Cast(input_event*, &Element->LMB), CSz("LMB"), Params ); @@ -956,10 +956,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input_event*,&Element->MMB), + Cast(input_event*, &Element->MMB), CSz("MMB"), Params ); @@ -971,10 +971,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->MouseWheelDelta), + Cast(s32*, &Element->MouseWheelDelta), CSz("MouseWheelDelta"), Params ); @@ -985,7 +985,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index b19638ba1..a77ff674f 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -26,9 +26,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->Clicked), + Cast(b8*, &Element->Clicked), CSz("Clicked"), &DefaultUiRenderParams_Checkbox ); @@ -37,11 +37,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->Pressed), + Cast(b8*, &Element->Pressed), CSz("Pressed"), &DefaultUiRenderParams_Checkbox ); @@ -50,7 +50,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index fad73af5c..074e60a49 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->tEnd), + Cast(r32*, &Element->tEnd), CSz("tEnd"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Value), + Cast(r32*, &Element->Value), CSz("Value"), Params ); @@ -56,7 +56,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 76b3ed839..7e225446b 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -26,15 +26,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - if (ToggleButton(Ui, CSz("v NameBuf[(256) + 1]"), CSz("> NameBuf[(256) + 1]"), UiId(Window, "toggle layered_brush char NameBuf", Element->NameBuf), Params )) + if (ToggleButton(Ui, CSz("v NameBuf[(256) + 1]"), CSz("> NameBuf[(256) + 1]"), UiId(Window, "toggle layered_brush char NameBuf", Element->NameBuf), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, (256) + 1) { - DoEditorUi(Ui, Window, Element->NameBuf+ArrayIndex, FSz("NameBuf[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->NameBuf+ArrayIndex, FSz("NameBuf[%d]", ArrayIndex), Params); - PushNewRow(Ui); + PushNewRow(Ui); } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -42,12 +42,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->LayerCount), + Cast(s32*, &Element->LayerCount), CSz("LayerCount"), Params ); @@ -58,15 +58,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - PushNewRow(Ui); + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v Layers[16]"), CSz("> Layers[16]"), UiId(Window, "toggle layered_brush brush_layer Layers", Element->Layers), Params )) + if (ToggleButton(Ui, CSz("v Layers[16]"), CSz("> Layers[16]"), UiId(Window, "toggle layered_brush brush_layer Layers", Element->Layers), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 16) { - DoEditorUi(Ui, Window, Element->Layers+ArrayIndex, FSz("Layers[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->Layers+ArrayIndex, FSz("Layers[%d]", ArrayIndex), Params); } @@ -77,13 +77,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - if (ToggleButton(Ui, CSz("v LayerPreviews[16]"), CSz("> LayerPreviews[16]"), UiId(Window, "toggle layered_brush chunk_thumbnail LayerPreviews", Element->LayerPreviews), Params )) + if (ToggleButton(Ui, CSz("v LayerPreviews[16]"), CSz("> LayerPreviews[16]"), UiId(Window, "toggle layered_brush chunk_thumbnail LayerPreviews", Element->LayerPreviews), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 16) { - DoEditorUi(Ui, Window, Element->LayerPreviews+ArrayIndex, FSz("LayerPreviews[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->LayerPreviews+ArrayIndex, FSz("LayerPreviews[%d]", ArrayIndex), Params); } @@ -94,10 +94,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(chunk_thumbnail*,&Element->SeedLayer), + Cast(chunk_thumbnail*, &Element->SeedLayer), CSz("SeedLayer"), Params ); @@ -109,10 +109,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->SeedBrushWithSelection), + Cast(b8*, &Element->SeedBrushWithSelection), CSz("SeedBrushWithSelection"), Params ); @@ -123,12 +123,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->BrushFollowsCursor), + Cast(b8*, &Element->BrushFollowsCursor), CSz("BrushFollowsCursor"), Params ); @@ -139,12 +139,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode*,&Element->Mode), + Cast(world_edit_mode*, &Element->Mode), CSz("Mode"), Params ); @@ -156,10 +156,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode_modifier*,&Element->Modifier), + Cast(world_edit_mode_modifier*, &Element->Modifier), CSz("Modifier"), Params ); @@ -171,10 +171,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(chunk_thumbnail*,&Element->Preview), + Cast(chunk_thumbnail*, &Element->Preview), CSz("Preview"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 6f1ae0484..a754adf46 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->Memory), @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_tool*,&Element->Tool), + Cast(world_edit_tool*, &Element->Tool), CSz("Tool"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_tool*,&Element->PreviousTool), + Cast(world_edit_tool*, &Element->PreviousTool), CSz("PreviousTool"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit*,&Element->Brush), + Cast(world_edit*, &Element->Brush), CSz("Brush"), Params ); @@ -86,10 +86,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->SelectionFollowsCursor), + Cast(b8*, &Element->SelectionFollowsCursor), CSz("SelectionFollowsCursor"), Params ); @@ -100,11 +100,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->RootChunkNeedsNewMesh), + Cast(b8*, &Element->RootChunkNeedsNewMesh), CSz("RootChunkNeedsNewMesh"), &DefaultUiRenderParams_Checkbox ); @@ -113,12 +113,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*,&Element->EngineDebugViewModeToggleBits), + Cast(u64*, &Element->EngineDebugViewModeToggleBits), CSz("EngineDebugViewModeToggleBits"), Params ); @@ -129,12 +129,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u16*,&Element->HoverColorIndex), + Cast(u16*, &Element->HoverColorIndex), CSz("HoverColorIndex"), Params ); @@ -145,12 +145,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(selection_region*,&Element->Selection), + Cast(selection_region*, &Element->Selection), CSz("Selection"), Params ); @@ -162,10 +162,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(rect3cp*,&Element->CopyRegion), + Cast(rect3cp*, &Element->CopyRegion), CSz("CopyRegion"), Params ); @@ -177,10 +177,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(selection_modification_state*,&Element->Entity), + Cast(selection_modification_state*, &Element->Entity), CSz("Entity"), Params ); @@ -192,10 +192,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(asset_thumbnail_block_array*,&Element->AssetThumbnails), + Cast(asset_thumbnail_block_array*, &Element->AssetThumbnails), CSz("AssetThumbnails"), Params ); @@ -207,9 +207,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->NewAssetFromSelection), + Cast(b8*, &Element->NewAssetFromSelection), CSz("NewAssetFromSelection"), &DefaultUiRenderParams_Checkbox ); @@ -218,17 +218,17 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v NewAssetFromSelectionFilename[512]"), CSz("> NewAssetFromSelectionFilename[512]"), UiId(Window, "toggle level_editor char NewAssetFromSelectionFilename", Element->NewAssetFromSelectionFilename), Params )) + if (ToggleButton(Ui, CSz("v NewAssetFromSelectionFilename[512]"), CSz("> NewAssetFromSelectionFilename[512]"), UiId(Window, "toggle level_editor char NewAssetFromSelectionFilename", Element->NewAssetFromSelectionFilename), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 512) { - DoEditorUi(Ui, Window, Element->NewAssetFromSelectionFilename+ArrayIndex, FSz("NewAssetFromSelectionFilename[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->NewAssetFromSelectionFilename+ArrayIndex, FSz("NewAssetFromSelectionFilename[%d]", ArrayIndex), Params); - PushNewRow(Ui); + PushNewRow(Ui); } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -236,11 +236,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->MaskSelection), + Cast(b8*, &Element->MaskSelection), CSz("MaskSelection"), &DefaultUiRenderParams_Checkbox ); @@ -249,9 +249,25 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->NextEditOrdinal), + CSz("NextEditOrdinal"), + Params + ); + + + + + + + + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit*, Element->CurrentEdit), @@ -266,10 +282,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_block_array*,&Element->WorldEdits), + Cast(world_edit_block_array*, &Element->WorldEdits), CSz("WorldEdits"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 6dc6e485f..a88631405 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(game_lights*,&Element->Lights), + Cast(game_lights*, &Element->Lights), CSz("Lights"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*,&Element->FBO), + Cast(framebuffer*, &Element->FBO), CSz("FBO"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*,&Element->LuminanceTex), + Cast(texture*, &Element->LuminanceTex), CSz("LuminanceTex"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shader*,&Element->Shader), + Cast(shader*, &Element->Shader), CSz("Shader"), Params ); @@ -86,10 +86,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(bloom_render_group*,&Element->Bloom), + Cast(bloom_render_group*, &Element->Bloom), CSz("Bloom"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 47d451022..18358f4a6 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->AutoDayNightCycle), + Cast(b8*, &Element->AutoDayNightCycle), CSz("AutoDayNightCycle"), Params ); @@ -40,15 +40,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->tDay), + Cast(r32*, &Element->tDay), CSz("tDay"), Params -,-PI32, PI32 ); + , -PI32, PI32 ); @@ -56,15 +56,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(f32*,&Element->DawnIntensity), + Cast(f32*, &Element->DawnIntensity), CSz("DawnIntensity"), Params -,0.f, 3.f ); + , 0.f, 3.f ); @@ -72,12 +72,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->DawnColor), + Cast(v3*, &Element->DawnColor), CSz("DawnColor"), Params ); @@ -89,13 +89,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(f32*,&Element->SunIntensity), + Cast(f32*, &Element->SunIntensity), CSz("SunIntensity"), Params -,0.f, 3.f ); + , 0.f, 3.f ); @@ -103,12 +103,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->SunColor), + Cast(v3*, &Element->SunColor), CSz("SunColor"), Params ); @@ -120,13 +120,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(f32*,&Element->DuskIntensity), + Cast(f32*, &Element->DuskIntensity), CSz("DuskIntensity"), Params -,0.f, 3.f ); + , 0.f, 3.f ); @@ -134,12 +134,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->DuskColor), + Cast(v3*, &Element->DuskColor), CSz("DuskColor"), Params ); @@ -151,13 +151,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(f32*,&Element->MoonIntensity), + Cast(f32*, &Element->MoonIntensity), CSz("MoonIntensity"), Params -,0.f, 3.f ); + , 0.f, 3.f ); @@ -165,12 +165,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->MoonColor), + Cast(v3*, &Element->MoonColor), CSz("MoonColor"), Params ); @@ -182,10 +182,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->CurrentSunColor), + Cast(v3*, &Element->CurrentSunColor), CSz("CurrentSunColor"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 902dfe9de..58acdbcf7 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->MeshMask), + Cast(u32*, &Element->MeshMask), CSz("MeshMask"), Params ); @@ -40,15 +40,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, - PushNewRow(Ui); + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v GpuBufferHandles[MeshIndex_Count]"), CSz("> GpuBufferHandles[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer gpu_element_buffer_handles GpuBufferHandles", Element->GpuBufferHandles), Params )) + if (ToggleButton(Ui, CSz("v GpuBufferHandles[MeshIndex_Count]"), CSz("> GpuBufferHandles[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer gpu_element_buffer_handles GpuBufferHandles", Element->GpuBufferHandles), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, MeshIndex_Count) { - DoEditorUi(Ui, Window, Element->GpuBufferHandles+ArrayIndex, FSz("GpuBufferHandles[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->GpuBufferHandles+ArrayIndex, FSz("GpuBufferHandles[%d]", ArrayIndex), Params); } @@ -59,13 +59,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, - if (ToggleButton(Ui, CSz("v E[MeshIndex_Count]"), CSz("> E[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer geo_u3d_ptr E", Element->E), Params )) + if (ToggleButton(Ui, CSz("v E[MeshIndex_Count]"), CSz("> E[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer geo_u3d_ptr E", Element->E), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, MeshIndex_Count) { - DoEditorUi(Ui, Window, Element->E+ArrayIndex, FSz("E[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->E+ArrayIndex, FSz("E[%d]", ArrayIndex), Params); } @@ -76,13 +76,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, - if (ToggleButton(Ui, CSz("v Locks[MeshIndex_Count]"), CSz("> Locks[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer bonsai_futex Locks", Element->Locks), Params )) + if (ToggleButton(Ui, CSz("v Locks[MeshIndex_Count]"), CSz("> Locks[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer bonsai_futex Locks", Element->Locks), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, MeshIndex_Count) { - DoEditorUi(Ui, Window, Element->Locks+ArrayIndex, FSz("Locks[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->Locks+ArrayIndex, FSz("Locks[%d]", ArrayIndex), Params); } diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index d1c98f0b1..82ec29a47 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(vox_data*,&Element->Vox), + Cast(vox_data*, &Element->Vox), CSz("Vox"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(lod_element_buffer*,&Element->Meshes), + Cast(lod_element_buffer*, &Element->Meshes), CSz("Meshes"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(gpu_mapped_element_buffer*,&Element->Mesh), + Cast(gpu_mapped_element_buffer*, &Element->Mesh), CSz("Mesh"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(untextured_3d_geometry_buffer*,&Element->TransparentMesh), + Cast(untextured_3d_geometry_buffer*, &Element->TransparentMesh), CSz("TransparentMesh"), Params ); @@ -86,10 +86,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(animation*,&Element->Animation), + Cast(animation*, &Element->Animation), CSz("Animation"), Params ); @@ -101,10 +101,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->Dim), + Cast(v3i*, &Element->Dim), CSz("Dim"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 53bbc1e19..a69b0735b 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(ui_noise_type*,&Element->Type), + Cast(ui_noise_type*, &Element->Type), CSz("Type"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(white_noise_params*,&Element->White), + Cast(white_noise_params*, &Element->White), CSz("White"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(perlin_noise_params*,&Element->Perlin), + Cast(perlin_noise_params*, &Element->Perlin), CSz("Perlin"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(voronoi_noise_params*,&Element->Voronoi), + Cast(voronoi_noise_params*, &Element->Voronoi), CSz("Voronoi"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 54f8280d7..7075447fd 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(octree_node_type*,&Element->Type), + Cast(octree_node_type*, &Element->Type), CSz("Type"), Params ); @@ -41,9 +41,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->HadNoVisibleSurface), + Cast(b8*, &Element->HadNoVisibleSurface), CSz("HadNoVisibleSurface"), &DefaultUiRenderParams_Checkbox ); @@ -52,12 +52,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->WorldP), + Cast(v3i*, &Element->WorldP), CSz("WorldP"), Params ); @@ -69,10 +69,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->Resolution), + Cast(v3i*, &Element->Resolution), CSz("Resolution"), Params ); @@ -84,7 +84,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_chunk*, Element->Chunk), @@ -99,13 +99,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - if (ToggleButton(Ui, CSz("v Children[8]"), CSz("> Children[8]"), UiId(Window, "toggle octree_node octree_node Children", Element->Children), Params )) + if (ToggleButton(Ui, CSz("v Children[8]"), CSz("> Children[8]"), UiId(Window, "toggle octree_node octree_node Children", Element->Children), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 8) { -if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[ArrayIndex], CSz("Child"), Params);}; + if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[ArrayIndex], CSz("Child"), Params);}; } @@ -116,13 +116,28 @@ if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[Arr - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(octree_node*, Element->Next), CSz("Next"), Params ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_ptr_block_array*, &Element->Edits), + CSz("Edits"), + Params + ); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 80be568a8..e0a00f470 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Velocity), + Cast(v3*, &Element->Velocity), CSz("Velocity"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Offset), + Cast(v3*, &Element->Offset), CSz("Offset"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u8*,&Element->Color), + Cast(u8*, &Element->Color), CSz("Color"), Params ); @@ -70,12 +70,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->IsLight), + Cast(b8*, &Element->IsLight), CSz("IsLight"), Params ); @@ -86,12 +86,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->RemainingLifespan), + Cast(r32*, &Element->RemainingLifespan), CSz("RemainingLifespan"), Params ); @@ -102,7 +102,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 5cdcafe3e..f94af908e 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(random_series*,&Element->Entropy), + Cast(random_series*, &Element->Entropy), CSz("Entropy"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(particle_spawn_type*,&Element->SpawnType), + Cast(particle_spawn_type*, &Element->SpawnType), CSz("SpawnType"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Drag), + Cast(r32*, &Element->Drag), CSz("Drag"), Params ); @@ -70,12 +70,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Lifetime), + Cast(r32*, &Element->Lifetime), CSz("Lifetime"), Params ); @@ -86,12 +86,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->EmissionDelay), + Cast(r32*, &Element->EmissionDelay), CSz("EmissionDelay"), Params ); @@ -102,12 +102,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->EmissionLifespan), + Cast(r32*, &Element->EmissionLifespan), CSz("EmissionLifespan"), Params ); @@ -118,12 +118,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->ActiveParticles), + Cast(u32*, &Element->ActiveParticles), CSz("ActiveParticles"), Params ); @@ -134,12 +134,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->LifespanMod), + Cast(r32*, &Element->LifespanMod), CSz("LifespanMod"), Params ); @@ -150,12 +150,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->ParticleLifespan), + Cast(r32*, &Element->ParticleLifespan), CSz("ParticleLifespan"), Params ); @@ -166,12 +166,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->ParticlesPerSecond), + Cast(r32*, &Element->ParticlesPerSecond), CSz("ParticlesPerSecond"), Params ); @@ -182,12 +182,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->ParticleLightEmission), + Cast(r32*, &Element->ParticleLightEmission), CSz("ParticleLightEmission"), Params ); @@ -198,12 +198,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->ParticleLightEmissionChance), + Cast(r32*, &Element->ParticleLightEmissionChance), CSz("ParticleLightEmissionChance"), Params ); @@ -214,12 +214,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->ParticleStartingTransparency), + Cast(r32*, &Element->ParticleStartingTransparency), CSz("ParticleStartingTransparency"), Params ); @@ -230,12 +230,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->ParticleEndingTransparency), + Cast(r32*, &Element->ParticleEndingTransparency), CSz("ParticleEndingTransparency"), Params ); @@ -246,12 +246,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->ParticleStartingDim), + Cast(v3*, &Element->ParticleStartingDim), CSz("ParticleStartingDim"), Params ); @@ -263,10 +263,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(f32*,&Element->ParticleEndingDim), + Cast(f32*, &Element->ParticleEndingDim), CSz("ParticleEndingDim"), Params ); @@ -277,12 +277,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->ParticleTurbMin), + Cast(v3*, &Element->ParticleTurbMin), CSz("ParticleTurbMin"), Params ); @@ -294,10 +294,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->ParticleTurbMax), + Cast(v3*, &Element->ParticleTurbMax), CSz("ParticleTurbMax"), Params ); @@ -309,10 +309,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(aabb*,&Element->SpawnRegion), + Cast(aabb*, &Element->SpawnRegion), CSz("SpawnRegion"), Params ); @@ -324,10 +324,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->SystemMovementCoefficient), + Cast(r32*, &Element->SystemMovementCoefficient), CSz("SystemMovementCoefficient"), Params ); @@ -338,12 +338,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->ElapsedSinceLastEmission), + Cast(r32*, &Element->ElapsedSinceLastEmission), CSz("ElapsedSinceLastEmission"), Params ); @@ -354,17 +354,17 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v PackedHSVColors[6]"), CSz("> PackedHSVColors[6]"), UiId(Window, "toggle particle_system u16 PackedHSVColors", Element->PackedHSVColors), Params )) + if (ToggleButton(Ui, CSz("v PackedHSVColors[6]"), CSz("> PackedHSVColors[6]"), UiId(Window, "toggle particle_system u16 PackedHSVColors", Element->PackedHSVColors), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 6) { - DoEditorUi(Ui, Window, Element->PackedHSVColors+ArrayIndex, FSz("PackedHSVColors[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->PackedHSVColors+ArrayIndex, FSz("PackedHSVColors[%d]", ArrayIndex), Params); - PushNewRow(Ui); + PushNewRow(Ui); } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -372,15 +372,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v Particles[(4096)]"), CSz("> Particles[(4096)]"), UiId(Window, "toggle particle_system particle Particles", Element->Particles), Params )) + if (ToggleButton(Ui, CSz("v Particles[(4096)]"), CSz("> Particles[(4096)]"), UiId(Window, "toggle particle_system particle Particles", Element->Particles), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, (4096)) { - DoEditorUi(Ui, Window, Element->Particles+ArrayIndex, FSz("Particles[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->Particles+ArrayIndex, FSz("Particles[%d]", ArrayIndex), Params); } diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 741f58982..1bf84e243 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Velocity), + Cast(v3*, &Element->Velocity), CSz("Velocity"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Force), + Cast(v3*, &Element->Force), CSz("Force"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Delta), + Cast(v3*, &Element->Delta), CSz("Delta"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Mass), + Cast(r32*, &Element->Mass), CSz("Mass"), Params ); @@ -85,12 +85,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->Speed), + Cast(r32*, &Element->Speed), CSz("Speed"), Params ); @@ -101,7 +101,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 6c9f20acb..bdfea0b20 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->P), + Cast(v3*, &Element->P), CSz("P"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*,&Element->Normal), + Cast(v3*, &Element->Normal), CSz("Normal"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->d), + Cast(r32*, &Element->d), CSz("d"), Params ); @@ -70,7 +70,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index ad79e4b43..fa9671101 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(work_queue*,&Element->LowPriority), + Cast(work_queue*, &Element->LowPriority), CSz("LowPriority"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(work_queue*,&Element->HighPriority), + Cast(work_queue*, &Element->HighPriority), CSz("HighPriority"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(work_queue*,&Element->RenderQ), + Cast(work_queue*, &Element->RenderQ), CSz("RenderQ"), Params ); @@ -71,10 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(work_queue*,&Element->WorldUpdateQ), + Cast(work_queue*, &Element->WorldUpdateQ), CSz("WorldUpdateQ"), Params ); @@ -86,10 +86,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->HighPriorityWorkerCount), + Cast(u32*, &Element->HighPriorityWorkerCount), CSz("HighPriorityWorkerCount"), Params ); @@ -100,12 +100,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(bonsai_futex*,&Element->HighPriorityModeFutex), + Cast(bonsai_futex*, &Element->HighPriorityModeFutex), CSz("HighPriorityModeFutex"), Params ); @@ -117,10 +117,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(bonsai_futex*,&Element->WorkerThreadsSuspendFutex), + Cast(bonsai_futex*, &Element->WorkerThreadsSuspendFutex), CSz("WorkerThreadsSuspendFutex"), Params ); @@ -132,10 +132,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(bonsai_futex*,&Element->WorkerThreadsExitFutex), + Cast(bonsai_futex*, &Element->WorkerThreadsExitFutex), CSz("WorkerThreadsExitFutex"), Params ); @@ -147,7 +147,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(thread_startup_params*, Element->Threads), @@ -162,10 +162,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v2*,&Element->MouseP), + Cast(v2*, &Element->MouseP), CSz("MouseP"), Params ); @@ -177,10 +177,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v2*,&Element->MouseDP), + Cast(v2*, &Element->MouseDP), CSz("MouseDP"), Params ); @@ -192,7 +192,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->Memory), @@ -207,10 +207,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->GameTime), + Cast(r32*, &Element->GameTime), CSz("GameTime"), Params ); @@ -221,12 +221,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->dt), + Cast(r32*, &Element->dt), CSz("dt"), Params ); @@ -237,12 +237,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v2*,&Element->ScreenDim), + Cast(v2*, &Element->ScreenDim), CSz("ScreenDim"), Params ); @@ -254,10 +254,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(input*,&Element->Input), + Cast(input*, &Element->Input), CSz("Input"), Params ); @@ -269,7 +269,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(server_state*, Element->ServerState), diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index eb184e98d..3d337f469 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Na { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*,&Element->Seed), + Cast(u64*, &Element->Seed), CSz("Seed"), Params ); @@ -40,7 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Na - PushNewRow(Ui); + PushNewRow(Ui); + + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index c51dc1f16..ed4a886cd 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->SolidUIVertexBuffer), + Cast(u32*, &Element->SolidUIVertexBuffer), CSz("SolidUIVertexBuffer"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->SolidUIUVBuffer), + Cast(u32*, &Element->SolidUIUVBuffer), CSz("SolidUIUVBuffer"), Params ); @@ -56,12 +56,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->SolidUIColorBuffer), + Cast(u32*, &Element->SolidUIColorBuffer), CSz("SolidUIColorBuffer"), Params ); @@ -72,12 +72,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*,&Element->DebugTextureArray), + Cast(texture*, &Element->DebugTextureArray), CSz("DebugTextureArray"), Params ); @@ -89,10 +89,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->TextTextureUniform), + Cast(s32*, &Element->TextTextureUniform), CSz("TextTextureUniform"), Params ); @@ -103,12 +103,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shader*,&Element->Text2DShader), + Cast(shader*, &Element->Text2DShader), CSz("Text2DShader"), Params ); @@ -120,10 +120,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shader*,&Element->SolidUIShader), + Cast(shader*, &Element->SolidUIShader), CSz("SolidUIShader"), Params ); @@ -135,10 +135,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(textured_2d_geometry_buffer*,&Element->Geo), + Cast(textured_2d_geometry_buffer*, &Element->Geo), CSz("Geo"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 4b4c4f061..5b5a47ab5 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->BytesSolidGeoLastFrame), + Cast(u32*, &Element->BytesSolidGeoLastFrame), CSz("BytesSolidGeoLastFrame"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->BytesTransGeoLastFrame), + Cast(u32*, &Element->BytesTransGeoLastFrame), CSz("BytesTransGeoLastFrame"), Params ); @@ -56,12 +56,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->VertsDrawnLastFrame), + Cast(u32*, &Element->VertsDrawnLastFrame), CSz("VertsDrawnLastFrame"), Params ); @@ -72,12 +72,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->DrawCallsLastFrame), + Cast(u32*, &Element->DrawCallsLastFrame), CSz("DrawCallsLastFrame"), Params ); @@ -88,7 +88,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 69ff7d66b..d5784a301 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -26,9 +26,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->UseSsao), + Cast(b8*, &Element->UseSsao), CSz("UseSsao"), &DefaultUiRenderParams_Checkbox ); @@ -37,11 +37,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->UseShadowMapping), + Cast(b8*, &Element->UseShadowMapping), CSz("UseShadowMapping"), &DefaultUiRenderParams_Checkbox ); @@ -50,11 +50,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->UseLightingBloom), + Cast(b8*, &Element->UseLightingBloom), CSz("UseLightingBloom"), &DefaultUiRenderParams_Checkbox ); @@ -63,11 +63,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->BravoilMyersOIT), + Cast(b8*, &Element->BravoilMyersOIT), CSz("BravoilMyersOIT"), &DefaultUiRenderParams_Checkbox ); @@ -76,11 +76,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->BravoilMcGuireOIT), + Cast(b8*, &Element->BravoilMcGuireOIT), CSz("BravoilMcGuireOIT"), &DefaultUiRenderParams_Checkbox ); @@ -89,11 +89,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->DrawMajorGrid), + Cast(b8*, &Element->DrawMajorGrid), CSz("DrawMajorGrid"), &DefaultUiRenderParams_Checkbox ); @@ -102,11 +102,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->DrawMinorGrid), + Cast(b8*, &Element->DrawMinorGrid), CSz("DrawMinorGrid"), &DefaultUiRenderParams_Checkbox ); @@ -115,15 +115,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->MajorGridDim), + Cast(r32*, &Element->MajorGridDim), CSz("MajorGridDim"), Params -,0, 32 ); + , 0, 32 ); @@ -131,11 +131,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->DrawCameraGhost), + Cast(b8*, &Element->DrawCameraGhost), CSz("DrawCameraGhost"), &DefaultUiRenderParams_Checkbox ); @@ -144,15 +144,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->CameraGhostSize), + Cast(r32*, &Element->CameraGhostSize), CSz("CameraGhostSize"), Params -,1, 100 ); + , 1, 100 ); @@ -160,16 +160,16 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(tone_mapping_type*,&Element->ToneMappingType), + Cast(tone_mapping_type*, &Element->ToneMappingType), CSz("ToneMappingType"), Params ); @@ -181,13 +181,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(f32*,&Element->GameCameraFOV), + Cast(f32*, &Element->GameCameraFOV), CSz("GameCameraFOV"), Params -,5, 250 ); + , 5, 250 ); @@ -195,12 +195,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(lighting_settings*,&Element->Lighting), + Cast(lighting_settings*, &Element->Lighting), CSz("Lighting"), Params ); @@ -212,10 +212,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v2*,&Element->ApplicationResolution), + Cast(v2*, &Element->ApplicationResolution), CSz("ApplicationResolution"), Params ); @@ -227,10 +227,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v2*,&Element->ShadowMapResolution), + Cast(v2*, &Element->ShadowMapResolution), CSz("ShadowMapResolution"), Params ); @@ -242,10 +242,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v2*,&Element->LuminanceMapResolution), + Cast(v2*, &Element->LuminanceMapResolution), CSz("LuminanceMapResolution"), Params ); @@ -257,10 +257,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v2i*,&Element->iApplicationResolution), + Cast(v2i*, &Element->iApplicationResolution), CSz("iApplicationResolution"), Params ); @@ -272,10 +272,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v2i*,&Element->iShadowMapResolution), + Cast(v2i*, &Element->iShadowMapResolution), CSz("iShadowMapResolution"), Params ); @@ -287,10 +287,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v2i*,&Element->iLuminanceMapResolution), + Cast(v2i*, &Element->iLuminanceMapResolution), CSz("iLuminanceMapResolution"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index ea2b994ab..5f2d87cdb 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(render_buffers_2d*, Element->TextGroup), @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*,&Element->SpriteTextureArray), + Cast(texture*, &Element->SpriteTextureArray), CSz("SpriteTextureArray"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*,&Element->InteractionStackTop), + Cast(u64*, &Element->InteractionStackTop), CSz("InteractionStackTop"), Params ); @@ -70,9 +70,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2*, Element->MouseP), @@ -87,7 +87,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2*, Element->MouseDP), @@ -102,7 +102,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2*, Element->ScreenDim), @@ -117,7 +117,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input*, Element->Input), @@ -132,10 +132,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(ui_toggle_hashtable*,&Element->ToggleTable), + Cast(ui_toggle_hashtable*, &Element->ToggleTable), CSz("ToggleTable"), Params ); @@ -147,10 +147,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(window_layout_hashtable*,&Element->WindowTable), + Cast(window_layout_hashtable*, &Element->WindowTable), CSz("WindowTable"), Params ); @@ -162,13 +162,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - if (ToggleButton(Ui, CSz("v MinimizedWindowBuffer[64]"), CSz("> MinimizedWindowBuffer[64]"), UiId(Window, "toggle renderer_2d window_layout MinimizedWindowBuffer", Element->MinimizedWindowBuffer), Params )) + if (ToggleButton(Ui, CSz("v MinimizedWindowBuffer[64]"), CSz("> MinimizedWindowBuffer[64]"), UiId(Window, "toggle renderer_2d window_layout MinimizedWindowBuffer", Element->MinimizedWindowBuffer), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 64) { - DoEditorUi(Ui, Window, Element->MinimizedWindowBuffer+ArrayIndex, FSz("MinimizedWindowBuffer[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->MinimizedWindowBuffer+ArrayIndex, FSz("MinimizedWindowBuffer[%d]", ArrayIndex), Params); } @@ -179,7 +179,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(window_layout*, Element->HighestWindow), @@ -194,10 +194,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(interactable*,&Element->Hover), + Cast(interactable*, &Element->Hover), CSz("Hover"), Params ); @@ -209,10 +209,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(interactable*,&Element->Clicked), + Cast(interactable*, &Element->Clicked), CSz("Clicked"), Params ); @@ -224,10 +224,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(interactable*,&Element->Pressed), + Cast(interactable*, &Element->Pressed), CSz("Pressed"), Params ); @@ -239,9 +239,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->RequestedForceCapture), + Cast(b8*, &Element->RequestedForceCapture), CSz("RequestedForceCapture"), &DefaultUiRenderParams_Checkbox ); @@ -250,12 +250,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(text_box_edit_state*,&Element->TextEdit), + Cast(text_box_edit_state*, &Element->TextEdit), CSz("TextEdit"), Params ); @@ -267,10 +267,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(untextured_2d_geometry_buffer*,&Element->Geo), + Cast(untextured_2d_geometry_buffer*, &Element->Geo), CSz("Geo"), Params ); @@ -282,10 +282,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shader*,&Element->TexturedQuadShader), + Cast(shader*, &Element->TexturedQuadShader), CSz("TexturedQuadShader"), Params ); @@ -297,7 +297,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(ui_render_command_buffer*, Element->CommandBuffer), @@ -312,10 +312,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*,&Element->RenderCommandArena), + Cast(memory_arena*, &Element->RenderCommandArena), CSz("RenderCommandArena"), Params ); @@ -327,10 +327,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*,&Element->UiToggleArena), + Cast(memory_arena*, &Element->UiToggleArena), CSz("UiToggleArena"), Params ); @@ -342,10 +342,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*,&Element->WindowTableArena), + Cast(memory_arena*, &Element->WindowTableArena), CSz("WindowTableArena"), Params ); @@ -357,13 +357,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - if (ToggleButton(Ui, CSz("v DebugColors[128]"), CSz("> DebugColors[128]"), UiId(Window, "toggle renderer_2d v3 DebugColors", Element->DebugColors), Params )) + if (ToggleButton(Ui, CSz("v DebugColors[128]"), CSz("> DebugColors[128]"), UiId(Window, "toggle renderer_2d v3 DebugColors", Element->DebugColors), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 128) { - DoEditorUi(Ui, Window, Element->DebugColors+ArrayIndex, FSz("DebugColors[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->DebugColors+ArrayIndex, FSz("DebugColors[%d]", ArrayIndex), Params); } @@ -374,10 +374,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->SolidGeoCountLastFrame), + Cast(u32*, &Element->SolidGeoCountLastFrame), CSz("SolidGeoCountLastFrame"), Params ); @@ -388,12 +388,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->TextGeoCountLastFrame), + Cast(u32*, &Element->TextGeoCountLastFrame), CSz("TextGeoCountLastFrame"), Params ); @@ -404,9 +404,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3_cursor*, Element->ColorPalette), diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 140a00ac1..bca72ef97 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->ID), + Cast(u32*, &Element->ID), CSz("ID"), Params ); @@ -40,9 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shader_uniform*, Element->FirstUniform), @@ -57,10 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(cs*,&Element->VertexSourceFilename), + Cast(cs*, &Element->VertexSourceFilename), CSz("VertexSourceFilename"), Params ); @@ -71,12 +71,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(cs*,&Element->FragSourceFilename), + Cast(cs*, &Element->FragSourceFilename), CSz("FragSourceFilename"), Params ); @@ -87,12 +87,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s64*,&Element->VertexTimeModifiedWhenLoaded), + Cast(s64*, &Element->VertexTimeModifiedWhenLoaded), CSz("VertexTimeModifiedWhenLoaded"), Params ); @@ -103,12 +103,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s64*,&Element->FragmentTimeModifiedWhenLoaded), + Cast(s64*, &Element->FragmentTimeModifiedWhenLoaded), CSz("FragmentTimeModifiedWhenLoaded"), Params ); @@ -119,11 +119,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->HotReloaded), + Cast(b8*, &Element->HotReloaded), CSz("HotReloaded"), &DefaultUiRenderParams_Checkbox ); @@ -132,7 +132,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 1a95ca586..2995adc6e 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->ID), + Cast(u32*, &Element->ID), CSz("ID"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v2i*,&Element->Dim), + Cast(v2i*, &Element->Dim), CSz("Dim"), Params ); @@ -57,10 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->Slices), + Cast(u32*, &Element->Slices), CSz("Slices"), Params ); @@ -71,12 +71,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->Channels), + Cast(u32*, &Element->Channels), CSz("Channels"), Params ); @@ -87,11 +87,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->IsDepthTexture), + Cast(b8*, &Element->IsDepthTexture), CSz("IsDepthTexture"), &DefaultUiRenderParams_Checkbox ); @@ -100,12 +100,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture_storage_format*,&Element->Format), + Cast(texture_storage_format*, &Element->Format), CSz("Format"), Params ); @@ -117,10 +117,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(cs*,&Element->DebugName), + Cast(cs*, &Element->DebugName), CSz("DebugName"), Params ); @@ -131,11 +131,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->Queued), + Cast(b8*, &Element->Queued), CSz("Queued"), &DefaultUiRenderParams_Checkbox ); @@ -144,7 +144,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 90f0b05dd..be1a7bd68 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->OutlineUiValues), + Cast(b8*, &Element->OutlineUiValues), CSz("OutlineUiValues"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->OutlineUiButtons), + Cast(b8*, &Element->OutlineUiButtons), CSz("OutlineUiButtons"), Params ); @@ -56,12 +56,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->OutlineUiTables), + Cast(b8*, &Element->OutlineUiTables), CSz("OutlineUiTables"), Params ); @@ -72,12 +72,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->OutlineUiTableColumns), + Cast(b8*, &Element->OutlineUiTableColumns), CSz("OutlineUiTableColumns"), Params ); @@ -88,12 +88,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->DebugBreakOnElementClick), + Cast(b8*, &Element->DebugBreakOnElementClick), CSz("DebugBreakOnElementClick"), Params ); @@ -104,12 +104,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->DebugBreakUiCommand), + Cast(b8*, &Element->DebugBreakUiCommand), CSz("DebugBreakUiCommand"), Params ); @@ -120,7 +120,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 50f70ddf6..8a63e8a7d 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->_Reserved), + Cast(u32*, &Element->_Reserved), CSz("_Reserved"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->WindowBits), + Cast(u32*, &Element->WindowBits), CSz("WindowBits"), Params ); @@ -56,12 +56,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->InteractionBits), + Cast(u32*, &Element->InteractionBits), CSz("InteractionBits"), Params ); @@ -72,12 +72,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->ElementBits), + Cast(u32*, &Element->ElementBits), CSz("ElementBits"), Params ); @@ -88,7 +88,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 4752980bb..92464dbc5 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(ui_id*,&Element->Id), + Cast(ui_id*, &Element->Id), CSz("Id"), Params ); @@ -41,9 +41,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->ToggledOn), + Cast(b8*, &Element->ToggledOn), CSz("ToggledOn"), &DefaultUiRenderParams_Checkbox ); @@ -52,7 +52,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 3d1a41d0d..b5e758d91 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(data_type*,&Element->Type), + Cast(data_type*, &Element->Type), CSz("Type"), Params ); @@ -43,9 +43,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(void *, Element->Verts), @@ -59,9 +59,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(void *, Element->Normals), @@ -75,9 +75,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(vertex_material*, Element->Mat), @@ -92,10 +92,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->End), + Cast(u32*, &Element->End), CSz("End"), Params ); @@ -106,12 +106,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->At), + Cast(u32*, &Element->At), CSz("At"), Params ); @@ -122,9 +122,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(untextured_3d_geometry_buffer*, Element->Parent), @@ -139,10 +139,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->BufferNeedsToGrow), + Cast(u32*, &Element->BufferNeedsToGrow), CSz("BufferNeedsToGrow"), Params ); @@ -153,12 +153,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*,&Element->Timestamp), + Cast(u64*, &Element->Timestamp), CSz("Timestamp"), Params ); @@ -169,7 +169,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index c4243459e..50c30425d 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u16*,&Element->ColorIndex), + Cast(u16*, &Element->ColorIndex), CSz("ColorIndex"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u8*,&Element->Transparency), + Cast(u8*, &Element->Transparency), CSz("Transparency"), Params ); @@ -56,12 +56,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u8*,&Element->Emission), + Cast(u8*, &Element->Emission), CSz("Emission"), Params ); @@ -72,7 +72,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index b49b3934f..5cc1fb14c 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -26,13 +26,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(chunk_data*, Element->ChunkData), CSz("ChunkData"), Params ); + + + + + + + + + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 109896139..6352d0c34 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u8*,&Element->Transparency), + Cast(u8*, &Element->Transparency), CSz("Transparency"), Params ); @@ -40,12 +40,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u16*,&Element->Color), + Cast(u16*, &Element->Color), CSz("Color"), Params ); @@ -56,7 +56,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index dd9c4fb71..9e29e10e1 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs N { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u8*,&Element->Emission), + Cast(u8*, &Element->Emission), CSz("Emission"), Params ); @@ -40,7 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs N - PushNewRow(Ui); + PushNewRow(Ui); + + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index c3f0d2ed3..f7c57dc19 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(bonsai_futex*,&Element->EnqueueFutex), + Cast(bonsai_futex*, &Element->EnqueueFutex), CSz("EnqueueFutex"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->EnqueueIndex), + Cast(u32*, &Element->EnqueueIndex), CSz("EnqueueIndex"), Params ); @@ -55,12 +55,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->DequeueIndex), + Cast(u32*, &Element->DequeueIndex), CSz("DequeueIndex"), Params ); @@ -71,9 +71,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(work_queue_entry*, Element->Entries), diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 41b635c13..dd7daa880 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(work_queue_entry_type*,&Element->Type), + Cast(work_queue_entry_type*, &Element->Type), CSz("Type"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 93752ac2d..10385f7ec 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -26,10 +26,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->Center), + Cast(v3i*, &Element->Center), CSz("Center"), Params ); @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->VisibleRegion), + Cast(v3i*, &Element->VisibleRegion), CSz("VisibleRegion"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(octree_node*,&Element->Root), + Cast(octree_node*, &Element->Root), CSz("Root"), Params ); @@ -71,7 +71,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->OctreeMemory), @@ -86,10 +86,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(octree_node_freelist*,&Element->OctreeNodeFreelist), + Cast(octree_node_freelist*, &Element->OctreeNodeFreelist), CSz("OctreeNodeFreelist"), Params ); @@ -101,10 +101,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(octree_node_freelist*,&Element->OctreeNodeDeferFreelist), + Cast(octree_node_freelist*, &Element->OctreeNodeDeferFreelist), CSz("OctreeNodeDeferFreelist"), Params ); @@ -116,10 +116,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->FreeChunkCount), + Cast(s32*, &Element->FreeChunkCount), CSz("FreeChunkCount"), Params ); @@ -130,7 +130,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 893a67573..faa1c25aa 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_chunk*, Element->Next), @@ -41,10 +41,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(chunk_flag*,&Element->Flags), + Cast(chunk_flag*, &Element->Flags), CSz("Flags"), Params ); @@ -56,10 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->Dim), + Cast(v3i*, &Element->Dim), CSz("Dim"), Params ); @@ -71,7 +71,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->Occupancy), @@ -85,9 +85,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->xOccupancyBorder), @@ -101,9 +101,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->FaceMasks), @@ -117,9 +117,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(voxel*, Element->Voxels), @@ -134,7 +134,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(voxel_lighting*, Element->VoxelLighting), @@ -149,10 +149,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(gpu_mapped_element_buffer*,&Element->Mesh), + Cast(gpu_mapped_element_buffer*, &Element->Mesh), CSz("Mesh"), Params ); @@ -164,9 +164,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->HasMesh), + Cast(b8*, &Element->HasMesh), CSz("HasMesh"), &DefaultUiRenderParams_Checkbox ); @@ -175,12 +175,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(voxel_position_cursor*,&Element->StandingSpots), + Cast(voxel_position_cursor*, &Element->StandingSpots), CSz("StandingSpots"), Params ); @@ -192,10 +192,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->DimInChunks), + Cast(v3i*, &Element->DimInChunks), CSz("DimInChunks"), Params ); @@ -207,10 +207,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->WorldP), + Cast(v3i*, &Element->WorldP), CSz("WorldP"), Params ); @@ -222,10 +222,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->FilledCount), + Cast(s32*, &Element->FilledCount), CSz("FilledCount"), Params ); @@ -236,11 +236,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*,&Element->DrawBoundingVoxels), + Cast(b8*, &Element->DrawBoundingVoxels), CSz("DrawBoundingVoxels"), &DefaultUiRenderParams_Checkbox ); @@ -249,12 +249,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->PointsToLeaveRemaining), + Cast(s32*, &Element->PointsToLeaveRemaining), CSz("PointsToLeaveRemaining"), Params ); @@ -265,12 +265,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->TriCount), + Cast(u32*, &Element->TriCount), CSz("TriCount"), Params ); @@ -281,12 +281,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->EdgeBoundaryVoxelCount), + Cast(s32*, &Element->EdgeBoundaryVoxelCount), CSz("EdgeBoundaryVoxelCount"), Params ); @@ -297,12 +297,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->_Pad0), + Cast(u32*, &Element->_Pad0), CSz("_Pad0"), Params ); @@ -313,12 +313,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(entity_ptr_block_array*,&Element->Entities), + Cast(entity_ptr_block_array*, &Element->Entities), CSz("Entities"), Params ); @@ -330,10 +330,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->DEBUG_OwnedByThread), + Cast(s32*, &Element->DEBUG_OwnedByThread), CSz("DEBUG_OwnedByThread"), Params ); @@ -344,17 +344,17 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v _Pad1[20]"), CSz("> _Pad1[20]"), UiId(Window, "toggle world_chunk u8 _Pad1", Element->_Pad1), Params )) + if (ToggleButton(Ui, CSz("v _Pad1[20]"), CSz("> _Pad1[20]"), UiId(Window, "toggle world_chunk u8 _Pad1", Element->_Pad1), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 20) { - DoEditorUi(Ui, Window, Element->_Pad1+ArrayIndex, FSz("_Pad1[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->_Pad1+ArrayIndex, FSz("_Pad1[%d]", ArrayIndex), Params); - PushNewRow(Ui); + PushNewRow(Ui); } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -362,7 +362,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index b0acfb328..6e5f8235e 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Undefined"), UiId(Window, "enum AssetType_Undefined", Element), Params)) { - *Element = AssetType_Undefined; + *Element = AssetType_Undefined; SetToggleButton(Ui, ToggleButtonId, False); @@ -22,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Models"), UiId(Window, "enum AssetType_Models", Element), Params)) { - *Element = AssetType_Models; + *Element = AssetType_Models; SetToggleButton(Ui, ToggleButtonId, False); @@ -31,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("WorldChunk"), UiId(Window, "enum AssetType_WorldChunk", Element), Params)) { - *Element = AssetType_WorldChunk; + *Element = AssetType_WorldChunk; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 0dfe120eb..af2d5e1bc 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Uninitialized"), UiId(Window, "enum Chunk_Uninitialized", Element), Params)) { - if (Chunk_Uninitialized == chunk_flag(0)) + if (Chunk_Uninitialized == chunk_flag(0)) { *Element = chunk_flag(0); } @@ -36,7 +36,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Queued"), UiId(Window, "enum Chunk_Queued", Element), Params)) { - if (Chunk_Queued == chunk_flag(0)) + if (Chunk_Queued == chunk_flag(0)) { *Element = chunk_flag(0); } @@ -59,7 +59,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("VoxelsInitialized"), UiId(Window, "enum Chunk_VoxelsInitialized", Element), Params)) { - if (Chunk_VoxelsInitialized == chunk_flag(0)) + if (Chunk_VoxelsInitialized == chunk_flag(0)) { *Element = chunk_flag(0); } @@ -82,7 +82,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Garbage"), UiId(Window, "enum Chunk_Garbage", Element), Params)) { - if (Chunk_Garbage == chunk_flag(0)) + if (Chunk_Garbage == chunk_flag(0)) { *Element = chunk_flag(0); } @@ -105,7 +105,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Deallocate"), UiId(Window, "enum Chunk_Deallocate", Element), Params)) { - if (Chunk_Deallocate == chunk_flag(0)) + if (Chunk_Deallocate == chunk_flag(0)) { *Element = chunk_flag(0); } @@ -128,7 +128,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Freelist"), UiId(Window, "enum Chunk_Freelist", Element), Params)) { - if (Chunk_Freelist == chunk_flag(0)) + if (Chunk_Freelist == chunk_flag(0)) { *Element = chunk_flag(0); } diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 73946e05f..2ca8a7544 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Level"), UiId(Window, "enum EngineDebugViewMode_Level", Element), Params)) { - if (EngineDebugViewMode_Level == engine_debug_view_mode(0)) + if (EngineDebugViewMode_Level == engine_debug_view_mode(0)) { *Element = engine_debug_view_mode(0); } @@ -36,7 +36,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("WorldEdit"), UiId(Window, "enum EngineDebugViewMode_WorldEdit", Element), Params)) { - if (EngineDebugViewMode_WorldEdit == engine_debug_view_mode(0)) + if (EngineDebugViewMode_WorldEdit == engine_debug_view_mode(0)) { *Element = engine_debug_view_mode(0); } @@ -59,7 +59,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Entities"), UiId(Window, "enum EngineDebugViewMode_Entities", Element), Params)) { - if (EngineDebugViewMode_Entities == engine_debug_view_mode(0)) + if (EngineDebugViewMode_Entities == engine_debug_view_mode(0)) { *Element = engine_debug_view_mode(0); } @@ -82,7 +82,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Assets"), UiId(Window, "enum EngineDebugViewMode_Assets", Element), Params)) { - if (EngineDebugViewMode_Assets == engine_debug_view_mode(0)) + if (EngineDebugViewMode_Assets == engine_debug_view_mode(0)) { *Element = engine_debug_view_mode(0); } @@ -105,7 +105,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("WorldChunks"), UiId(Window, "enum EngineDebugViewMode_WorldChunks", Element), Params)) { - if (EngineDebugViewMode_WorldChunks == engine_debug_view_mode(0)) + if (EngineDebugViewMode_WorldChunks == engine_debug_view_mode(0)) { *Element = engine_debug_view_mode(0); } @@ -128,7 +128,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Textures"), UiId(Window, "enum EngineDebugViewMode_Textures", Element), Params)) { - if (EngineDebugViewMode_Textures == engine_debug_view_mode(0)) + if (EngineDebugViewMode_Textures == engine_debug_view_mode(0)) { *Element = engine_debug_view_mode(0); } @@ -151,7 +151,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("RenderSettings"), UiId(Window, "enum EngineDebugViewMode_RenderSettings", Element), Params)) { - if (EngineDebugViewMode_RenderSettings == engine_debug_view_mode(0)) + if (EngineDebugViewMode_RenderSettings == engine_debug_view_mode(0)) { *Element = engine_debug_view_mode(0); } @@ -174,7 +174,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("EngineDebug"), UiId(Window, "enum EngineDebugViewMode_EngineDebug", Element), Params)) { - if (EngineDebugViewMode_EngineDebug == engine_debug_view_mode(0)) + if (EngineDebugViewMode_EngineDebug == engine_debug_view_mode(0)) { *Element = engine_debug_view_mode(0); } diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 2122de0b7..8fea27923 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("None"), UiId(Window, "enum EntityBehaviorFlags_None", Element), Params)) { - if (EntityBehaviorFlags_None == entity_behavior_flags(0)) + if (EntityBehaviorFlags_None == entity_behavior_flags(0)) { *Element = entity_behavior_flags(0); } @@ -36,7 +36,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Gravity"), UiId(Window, "enum EntityBehaviorFlags_Gravity", Element), Params)) { - if (EntityBehaviorFlags_Gravity == entity_behavior_flags(0)) + if (EntityBehaviorFlags_Gravity == entity_behavior_flags(0)) { *Element = entity_behavior_flags(0); } @@ -59,7 +59,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("WorldCollision"), UiId(Window, "enum EntityBehaviorFlags_WorldCollision", Element), Params)) { - if (EntityBehaviorFlags_WorldCollision == entity_behavior_flags(0)) + if (EntityBehaviorFlags_WorldCollision == entity_behavior_flags(0)) { *Element = entity_behavior_flags(0); } @@ -82,7 +82,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("EntityCollision"), UiId(Window, "enum EntityBehaviorFlags_EntityCollision", Element), Params)) { - if (EntityBehaviorFlags_EntityCollision == entity_behavior_flags(0)) + if (EntityBehaviorFlags_EntityCollision == entity_behavior_flags(0)) { *Element = entity_behavior_flags(0); } @@ -105,7 +105,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("UnspawnOnParticleSystemTerminate"), UiId(Window, "enum EntityBehaviorFlags_UnspawnOnParticleSystemTerminate", Element), Params)) { - if (EntityBehaviorFlags_UnspawnOnParticleSystemTerminate == entity_behavior_flags(0)) + if (EntityBehaviorFlags_UnspawnOnParticleSystemTerminate == entity_behavior_flags(0)) { *Element = entity_behavior_flags(0); } @@ -128,7 +128,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("FitCollisionVolumeToModel"), UiId(Window, "enum EntityBehaviorFlags_FitCollisionVolumeToModel", Element), Params)) { - if (EntityBehaviorFlags_FitCollisionVolumeToModel == entity_behavior_flags(0)) + if (EntityBehaviorFlags_FitCollisionVolumeToModel == entity_behavior_flags(0)) { *Element = entity_behavior_flags(0); } @@ -151,7 +151,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("DefatulCameraGhostBehavior"), UiId(Window, "enum EntityBehaviorFlags_DefatulCameraGhostBehavior", Element), Params)) { - if (EntityBehaviorFlags_DefatulCameraGhostBehavior == entity_behavior_flags(0)) + if (EntityBehaviorFlags_DefatulCameraGhostBehavior == entity_behavior_flags(0)) { *Element = entity_behavior_flags(0); } @@ -174,7 +174,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("WorldCenter"), UiId(Window, "enum EntityBehaviorFlags_WorldCenter", Element), Params)) { - if (EntityBehaviorFlags_WorldCenter == entity_behavior_flags(0)) + if (EntityBehaviorFlags_WorldCenter == entity_behavior_flags(0)) { *Element = entity_behavior_flags(0); } @@ -197,7 +197,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Default"), UiId(Window, "enum EntityBehaviorFlags_Default", Element), Params)) { - if (EntityBehaviorFlags_Default == entity_behavior_flags(0)) + if (EntityBehaviorFlags_Default == entity_behavior_flags(0)) { *Element = entity_behavior_flags(0); } diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 8b6b70572..39969ae72 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Nam if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Free"), UiId(Window, "enum EntityState_Free", Element), Params)) { - *Element = EntityState_Free; + *Element = EntityState_Free; SetToggleButton(Ui, ToggleButtonId, False); @@ -22,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Nam if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Spawned"), UiId(Window, "enum EntityState_Spawned", Element), Params)) { - *Element = EntityState_Spawned; + *Element = EntityState_Spawned; SetToggleButton(Ui, ToggleButtonId, False); @@ -31,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Nam if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Destroyed"), UiId(Window, "enum EntityState_Destroyed", Element), Params)) { - *Element = EntityState_Destroyed; + *Element = EntityState_Destroyed; SetToggleButton(Ui, ToggleButtonId, False); @@ -40,7 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Nam if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Reserved"), UiId(Window, "enum EntityState_Reserved", Element), Params)) { - *Element = EntityState_Reserved; + *Element = EntityState_Reserved; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 7aaf3cb98..7fa3b1e39 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("None"), UiId(Window, "enum FileTraversalType_None", Element), Params)) { - *Element = FileTraversalType_None; + *Element = FileTraversalType_None; SetToggleButton(Ui, ToggleButtonId, False); @@ -22,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Dir"), UiId(Window, "enum FileTraversalType_Dir", Element), Params)) { - *Element = FileTraversalType_Dir; + *Element = FileTraversalType_Dir; SetToggleButton(Ui, ToggleButtonId, False); @@ -31,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("File"), UiId(Window, "enum FileTraversalType_File", Element), Params)) { - *Element = FileTraversalType_File; + *Element = FileTraversalType_File; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index dde317abf..df170ea2c 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("None"), UiId(Window, "enum ParticleSpawnType_None", Element), Params)) { - *Element = ParticleSpawnType_None; + *Element = ParticleSpawnType_None; SetToggleButton(Ui, ToggleButtonId, False); @@ -22,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Random"), UiId(Window, "enum ParticleSpawnType_Random", Element), Params)) { - *Element = ParticleSpawnType_Random; + *Element = ParticleSpawnType_Random; SetToggleButton(Ui, ToggleButtonId, False); @@ -31,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Expanding"), UiId(Window, "enum ParticleSpawnType_Expanding", Element), Params)) { - *Element = ParticleSpawnType_Expanding; + *Element = ParticleSpawnType_Expanding; SetToggleButton(Ui, ToggleButtonId, False); @@ -40,7 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Contracting"), UiId(Window, "enum ParticleSpawnType_Contracting", Element), Params)) { - *Element = ParticleSpawnType_Contracting; + *Element = ParticleSpawnType_Contracting; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 417facab6..877f5ba95 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("4096x2160"), UiId(Window, "enum ResolutionSetting_4096x2160", Element), Params)) { - *Element = ResolutionSetting_4096x2160; + *Element = ResolutionSetting_4096x2160; SetToggleButton(Ui, ToggleButtonId, False); @@ -22,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("1920x1080"), UiId(Window, "enum ResolutionSetting_1920x1080", Element), Params)) { - *Element = ResolutionSetting_1920x1080; + *Element = ResolutionSetting_1920x1080; SetToggleButton(Ui, ToggleButtonId, False); @@ -31,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("1280x720"), UiId(Window, "enum ResolutionSetting_1280x720", Element), Params)) { - *Element = ResolutionSetting_1280x720; + *Element = ResolutionSetting_1280x720; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 41995d121..473beaa35 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Elem if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("330core"), UiId(Window, "enum ShaderLanguageSetting_330core", Element), Params)) { - *Element = ShaderLanguageSetting_330core; + *Element = ShaderLanguageSetting_330core; SetToggleButton(Ui, ToggleButtonId, False); @@ -22,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Elem if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("310es"), UiId(Window, "enum ShaderLanguageSetting_310es", Element), Params)) { - *Element = ShaderLanguageSetting_310es; + *Element = ShaderLanguageSetting_310es; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 6a446d4b3..e83995368 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -10,10 +10,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("None"), UiId(Window, "enum ToneMappingType_None", Element), Params)) { - *Element = ToneMappingType_None; + *Element = ToneMappingType_None; SetToggleButton(Ui, ToggleButtonId, False); @@ -22,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Reinhard"), UiId(Window, "enum ToneMappingType_Reinhard", Element), Params)) { - *Element = ToneMappingType_Reinhard; + *Element = ToneMappingType_Reinhard; SetToggleButton(Ui, ToggleButtonId, False); @@ -31,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Exposure"), UiId(Window, "enum ToneMappingType_Exposure", Element), Params)) { - *Element = ToneMappingType_Exposure; + *Element = ToneMappingType_Exposure; SetToggleButton(Ui, ToggleButtonId, False); @@ -40,7 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("AGX"), UiId(Window, "enum ToneMappingType_AGX", Element), Params)) { - *Element = ToneMappingType_AGX; + *Element = ToneMappingType_AGX; SetToggleButton(Ui, ToggleButtonId, False); @@ -49,7 +49,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Sepia"), UiId(Window, "enum ToneMappingType_AGX_Sepia", Element), Params)) { - *Element = ToneMappingType_AGX_Sepia; + *Element = ToneMappingType_AGX_Sepia; SetToggleButton(Ui, ToggleButtonId, False); @@ -58,7 +58,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Punchy"), UiId(Window, "enum ToneMappingType_AGX_Punchy", Element), Params)) { - *Element = ToneMappingType_AGX_Punchy; + *Element = ToneMappingType_AGX_Punchy; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index fc0411e90..d5501a1ce 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -718,6 +718,10 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 7778e4fd5..47bedf4e4 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -708,6 +708,10 @@ render_to_texture_async_params render_to_texture_async_params; + + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 7b2d1c06c..aba8c0840 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -708,6 +708,10 @@ type_render_to_texture_async_params, + + + + diff --git a/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h b/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h index d7e0beeab..12bdcbfad 100644 --- a/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h +++ b/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h @@ -10,7 +10,7 @@ RadioButtonGroup_terrain_gen_type( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Flat"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Flat")), TerrainGenType_Flat }, + { CSz("Flat"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Flat")), TerrainGenType_Flat }, { CSz("Checkerboard"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Checkerboard")), TerrainGenType_Checkerboard }, { CSz("SinCos"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_SinCos")), TerrainGenType_SinCos }, { CSz("Voronoi"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Voronoi")), TerrainGenType_Voronoi }, diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 529b0543a..de1ffd9dd 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -6,7 +6,7 @@ ToStringPrefixless(asset_type Type) counted_string Result = {}; switch (Type) { - case AssetType_Undefined: { Result = CSz("Undefined"); } break; + case AssetType_Undefined: { Result = CSz("Undefined"); } break; case AssetType_Models: { Result = CSz("Models"); } break; case AssetType_WorldChunk: { Result = CSz("WorldChunk"); } break; @@ -22,7 +22,7 @@ ToString(asset_type Type) counted_string Result = {}; switch (Type) { - case AssetType_Undefined: { Result = CSz("AssetType_Undefined"); } break; + case AssetType_Undefined: { Result = CSz("AssetType_Undefined"); } break; case AssetType_Models: { Result = CSz("AssetType_Models"); } break; case AssetType_WorldChunk: { Result = CSz("AssetType_WorldChunk"); } break; @@ -37,7 +37,7 @@ AssetType(counted_string S) { asset_type Result = {}; - if (StringsMatch(S, CSz("AssetType_Undefined"))) { return AssetType_Undefined; } + if (StringsMatch(S, CSz("AssetType_Undefined"))) { return AssetType_Undefined; } if (StringsMatch(S, CSz("AssetType_Models"))) { return AssetType_Models; } if (StringsMatch(S, CSz("AssetType_WorldChunk"))) { return AssetType_WorldChunk; } diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 6e636ffd5..9032cfb4b 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -6,7 +6,7 @@ ToStringPrefixless(engine_debug_view_mode Type) counted_string Result = {}; switch (Type) { - case EngineDebugViewMode_Level: { Result = CSz("Level"); } break; + case EngineDebugViewMode_Level: { Result = CSz("Level"); } break; case EngineDebugViewMode_WorldEdit: { Result = CSz("WorldEdit"); } break; case EngineDebugViewMode_Entities: { Result = CSz("Entities"); } break; case EngineDebugViewMode_Assets: { Result = CSz("Assets"); } break; @@ -15,7 +15,7 @@ ToStringPrefixless(engine_debug_view_mode Type) case EngineDebugViewMode_RenderSettings: { Result = CSz("RenderSettings"); } break; case EngineDebugViewMode_EngineDebug: { Result = CSz("EngineDebug"); } break; - // TODO(Jesse): This is pretty barf and we could do it in a single allocation, + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: { @@ -50,7 +50,7 @@ ToString(engine_debug_view_mode Type) counted_string Result = {}; switch (Type) { - case EngineDebugViewMode_Level: { Result = CSz("EngineDebugViewMode_Level"); } break; + case EngineDebugViewMode_Level: { Result = CSz("EngineDebugViewMode_Level"); } break; case EngineDebugViewMode_WorldEdit: { Result = CSz("EngineDebugViewMode_WorldEdit"); } break; case EngineDebugViewMode_Entities: { Result = CSz("EngineDebugViewMode_Entities"); } break; case EngineDebugViewMode_Assets: { Result = CSz("EngineDebugViewMode_Assets"); } break; @@ -59,7 +59,7 @@ ToString(engine_debug_view_mode Type) case EngineDebugViewMode_RenderSettings: { Result = CSz("EngineDebugViewMode_RenderSettings"); } break; case EngineDebugViewMode_EngineDebug: { Result = CSz("EngineDebugViewMode_EngineDebug"); } break; - // TODO(Jesse): This is pretty barf and we could do it in a single allocation, + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: { @@ -86,7 +86,7 @@ EngineDebugViewMode(counted_string S) { engine_debug_view_mode Result = {}; - if (StringsMatch(S, CSz("EngineDebugViewMode_Level"))) { return EngineDebugViewMode_Level; } + if (StringsMatch(S, CSz("EngineDebugViewMode_Level"))) { return EngineDebugViewMode_Level; } if (StringsMatch(S, CSz("EngineDebugViewMode_WorldEdit"))) { return EngineDebugViewMode_WorldEdit; } if (StringsMatch(S, CSz("EngineDebugViewMode_Entities"))) { return EngineDebugViewMode_Entities; } if (StringsMatch(S, CSz("EngineDebugViewMode_Assets"))) { return EngineDebugViewMode_Assets; } diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 3550d3544..7042806dc 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -6,7 +6,7 @@ ToStringPrefixless(file_traversal_type Type) counted_string Result = {}; switch (Type) { - case FileTraversalType_None: { Result = CSz("None"); } break; + case FileTraversalType_None: { Result = CSz("None"); } break; case FileTraversalType_Dir: { Result = CSz("Dir"); } break; case FileTraversalType_File: { Result = CSz("File"); } break; @@ -22,7 +22,7 @@ ToString(file_traversal_type Type) counted_string Result = {}; switch (Type) { - case FileTraversalType_None: { Result = CSz("FileTraversalType_None"); } break; + case FileTraversalType_None: { Result = CSz("FileTraversalType_None"); } break; case FileTraversalType_Dir: { Result = CSz("FileTraversalType_Dir"); } break; case FileTraversalType_File: { Result = CSz("FileTraversalType_File"); } break; @@ -37,7 +37,7 @@ FileTraversalType(counted_string S) { file_traversal_type Result = {}; - if (StringsMatch(S, CSz("FileTraversalType_None"))) { return FileTraversalType_None; } + if (StringsMatch(S, CSz("FileTraversalType_None"))) { return FileTraversalType_None; } if (StringsMatch(S, CSz("FileTraversalType_Dir"))) { return FileTraversalType_Dir; } if (StringsMatch(S, CSz("FileTraversalType_File"))) { return FileTraversalType_File; } diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index ece11082d..aa541fc46 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -6,7 +6,7 @@ ToStringPrefixless(particle_spawn_type Type) counted_string Result = {}; switch (Type) { - case ParticleSpawnType_None: { Result = CSz("None"); } break; + case ParticleSpawnType_None: { Result = CSz("None"); } break; case ParticleSpawnType_Random: { Result = CSz("Random"); } break; case ParticleSpawnType_Expanding: { Result = CSz("Expanding"); } break; case ParticleSpawnType_Contracting: { Result = CSz("Contracting"); } break; @@ -23,7 +23,7 @@ ToString(particle_spawn_type Type) counted_string Result = {}; switch (Type) { - case ParticleSpawnType_None: { Result = CSz("ParticleSpawnType_None"); } break; + case ParticleSpawnType_None: { Result = CSz("ParticleSpawnType_None"); } break; case ParticleSpawnType_Random: { Result = CSz("ParticleSpawnType_Random"); } break; case ParticleSpawnType_Expanding: { Result = CSz("ParticleSpawnType_Expanding"); } break; case ParticleSpawnType_Contracting: { Result = CSz("ParticleSpawnType_Contracting"); } break; @@ -39,7 +39,7 @@ ParticleSpawnType(counted_string S) { particle_spawn_type Result = {}; - if (StringsMatch(S, CSz("ParticleSpawnType_None"))) { return ParticleSpawnType_None; } + if (StringsMatch(S, CSz("ParticleSpawnType_None"))) { return ParticleSpawnType_None; } if (StringsMatch(S, CSz("ParticleSpawnType_Random"))) { return ParticleSpawnType_Random; } if (StringsMatch(S, CSz("ParticleSpawnType_Expanding"))) { return ParticleSpawnType_Expanding; } if (StringsMatch(S, CSz("ParticleSpawnType_Contracting"))) { return ParticleSpawnType_Contracting; } diff --git a/generated/string_and_value_tables_terrain_gen_type.h b/generated/string_and_value_tables_terrain_gen_type.h index 7d322281c..0314c925b 100644 --- a/generated/string_and_value_tables_terrain_gen_type.h +++ b/generated/string_and_value_tables_terrain_gen_type.h @@ -6,7 +6,7 @@ ToStringPrefixless(terrain_gen_type Type) counted_string Result = {}; switch (Type) { - case TerrainGenType_Flat: { Result = CSz("Flat"); } break; + case TerrainGenType_Flat: { Result = CSz("Flat"); } break; case TerrainGenType_Checkerboard: { Result = CSz("Checkerboard"); } break; case TerrainGenType_SinCos: { Result = CSz("SinCos"); } break; case TerrainGenType_Voronoi: { Result = CSz("Voronoi"); } break; @@ -36,7 +36,7 @@ ToString(terrain_gen_type Type) counted_string Result = {}; switch (Type) { - case TerrainGenType_Flat: { Result = CSz("TerrainGenType_Flat"); } break; + case TerrainGenType_Flat: { Result = CSz("TerrainGenType_Flat"); } break; case TerrainGenType_Checkerboard: { Result = CSz("TerrainGenType_Checkerboard"); } break; case TerrainGenType_SinCos: { Result = CSz("TerrainGenType_SinCos"); } break; case TerrainGenType_Voronoi: { Result = CSz("TerrainGenType_Voronoi"); } break; @@ -65,7 +65,7 @@ TerrainGenType(counted_string S) { terrain_gen_type Result = {}; - if (StringsMatch(S, CSz("TerrainGenType_Flat"))) { return TerrainGenType_Flat; } + if (StringsMatch(S, CSz("TerrainGenType_Flat"))) { return TerrainGenType_Flat; } if (StringsMatch(S, CSz("TerrainGenType_Checkerboard"))) { return TerrainGenType_Checkerboard; } if (StringsMatch(S, CSz("TerrainGenType_SinCos"))) { return TerrainGenType_SinCos; } if (StringsMatch(S, CSz("TerrainGenType_Voronoi"))) { return TerrainGenType_Voronoi; } diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 88ff974f5..06e109ffc 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -6,7 +6,7 @@ ToStringPrefixless(tone_mapping_type Type) counted_string Result = {}; switch (Type) { - case ToneMappingType_None: { Result = CSz("None"); } break; + case ToneMappingType_None: { Result = CSz("None"); } break; case ToneMappingType_Reinhard: { Result = CSz("Reinhard"); } break; case ToneMappingType_Exposure: { Result = CSz("Exposure"); } break; case ToneMappingType_AGX: { Result = CSz("AGX"); } break; @@ -25,7 +25,7 @@ ToString(tone_mapping_type Type) counted_string Result = {}; switch (Type) { - case ToneMappingType_None: { Result = CSz("ToneMappingType_None"); } break; + case ToneMappingType_None: { Result = CSz("ToneMappingType_None"); } break; case ToneMappingType_Reinhard: { Result = CSz("ToneMappingType_Reinhard"); } break; case ToneMappingType_Exposure: { Result = CSz("ToneMappingType_Exposure"); } break; case ToneMappingType_AGX: { Result = CSz("ToneMappingType_AGX"); } break; @@ -43,7 +43,7 @@ ToneMappingType(counted_string S) { tone_mapping_type Result = {}; - if (StringsMatch(S, CSz("ToneMappingType_None"))) { return ToneMappingType_None; } + if (StringsMatch(S, CSz("ToneMappingType_None"))) { return ToneMappingType_None; } if (StringsMatch(S, CSz("ToneMappingType_Reinhard"))) { return ToneMappingType_Reinhard; } if (StringsMatch(S, CSz("ToneMappingType_Exposure"))) { return ToneMappingType_Exposure; } if (StringsMatch(S, CSz("ToneMappingType_AGX"))) { return ToneMappingType_AGX; } diff --git a/jesse.make.sh b/jesse.make.sh index 80e120b7a..dadaa4e2f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -16,9 +16,9 @@ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ -# BuildSingleExample examples/tools/voxel_synthesis_rule_baker \ -# BuildSingleExample examples/turn_based \ -# BuildSingleExample examples/the_wanderer \ + # BuildSingleExample examples/tools/voxel_synthesis_rule_baker \ + # BuildSingleExample examples/turn_based \ + # BuildSingleExample examples/the_wanderer \ # ./make.sh BundleRelease diff --git a/make.sh b/make.sh index 512e5d368..2375a3b21 100755 --- a/make.sh +++ b/make.sh @@ -298,20 +298,13 @@ function RunPoofHelper { # -I "C:/Program Files (x86)/Windows Kits/10/include/10.0.18362.0/um" \ # -I "C:/Program Files (x86)/Windows Kits/10/include/10.0.18362.0/winrt" \ - which poof > /dev/null 2>&1 if [ $? -eq 0 ]; then - poof \ - $COLOR_FLAG \ - -D POOF_PREPROCESSOR \ - -D BONSAI_PREPROCESSOR \ - -I src/ \ - -I external/ \ - $PLATFORM_DEFINES \ - $BONSAI_INTERNAL \ - -o generated \ - $1 + cmd="poof -d $COLOR_FLAG -D POOF_PREPROCESSOR -D BONSAI_PREPROCESSOR -I src/ -I external/ $PLATFORM_DEFINES $BONSAI_INTERNAL -o generated $1 " + + echo "$cmd" + $cmd else echo "poof not found, skipping." diff --git a/src/engine/editor.h b/src/engine/editor.h index a12be3ff5..a6b490df3 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1162,6 +1162,7 @@ struct world_edit typedef world_edit* world_edit_ptr; poof(block_array(world_edit_ptr, {128})) +#include struct level_editor From 1d7d88b46780991507737fef02eabf32619e9b72 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 8 Feb 2025 12:42:34 -0700 Subject: [PATCH 146/421] Pull updates to poof block_array and fix API breakage --- external/bonsai_stdlib | 2 +- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_octree_node.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/block_array_bitmap_688853862.h | 77 +++++++++++---- .../block_array_c_asset_thumbnail_688856411.h | 9 +- generated/block_array_c_gpu_timer_688735882.h | 9 +- .../block_array_c_shader_ptr_688853971.h | 15 ++- generated/block_array_c_texture_688856411.h | 9 +- generated/block_array_c_u32_688856411.h | 9 +- generated/block_array_c_u8_cursor_688856411.h | 9 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 77 +++++++++++---- generated/block_array_entity_688856407.h | 77 +++++++++++---- generated/block_array_entity_ptr_688856411.h | 95 ++++++++++++------ ...lock_array_file_traversal_node_688853862.h | 77 +++++++++++---- ...lock_array_gpu_readback_buffer_688853862.h | 77 +++++++++++---- .../block_array_h_asset_thumbnail_688856411.h | 70 ++++++++++--- .../block_array_h_gpu_timer_688735882_0.h | 68 ++++++++++--- .../block_array_h_shader_ptr_688853971_0.h | 80 +++++++++++---- generated/block_array_h_texture_688856411.h | 80 +++++++++++---- generated/block_array_h_texture_688856411_0.h | 68 ++++++++++--- generated/block_array_h_u32_688856411.h | 68 ++++++++++--- generated/block_array_h_u8_cursor_688856411.h | 68 ++++++++++--- ...lock_array_h_world_chunk_ptr_688853862_0.h | 80 +++++++++++---- generated/block_array_member_info_688856411.h | 77 +++++++++++---- generated/block_array_model_688856411.h | 77 +++++++++++---- .../block_array_octree_node_ptr_688853862.h | 97 +++++++++++++------ ...block_array_picked_octree_node_688853862.h | 79 +++++++++++---- .../block_array_standing_spot_688853862.h | 77 +++++++++++---- generated/block_array_texture_ptr_688856411.h | 15 ++- generated/block_array_vox_data_688856411.h | 77 +++++++++++---- ...lock_array_voxel_stack_element_688853862.h | 77 +++++++++++---- .../block_array_world_chunk_ptr_688853862.h | 15 ++- .../block_array_world_edit_ptr_688735882.h | 97 +++++++++++++------ generated/buffer_octree_node_ptr.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_layered_brush_0.h | 2 +- generated/default_marshal_layered_brush_1.h | 2 +- generated/default_marshal_layered_brush_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 2 +- .../do_editor_ui_for_compound_type_ray.h | 2 +- .../do_editor_ui_for_compound_type_rect3.h | 2 +- .../do_editor_ui_for_compound_type_rect3cp.h | 2 +- .../do_editor_ui_for_compound_type_rect3i.h | 2 +- ...or_ui_for_compound_type_world_edit_brush.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...editor_ui_for_radio_enum_world_edit_mode.h | 2 +- ..._for_radio_enum_world_edit_mode_modifier.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 8 ++ generated/for_datatypes_fkubhsYl.h | 8 ++ generated/for_datatypes_kv3WBTai.h | 8 ++ generated/freelist_allocator_octree_node.h | 2 +- generated/freelist_allocator_world_chunk.h | 2 +- generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- .../string_and_value_tables_world_edit_mode.h | 2 +- ...nd_value_tables_world_edit_mode_modifier.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ..._value_tables_world_update_op_shape_type.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- jesse.make.sh | 2 +- make.sh | 2 +- src/engine/debug.h | 2 + src/engine/editor.cpp | 30 +++--- src/engine/editor.h | 4 + src/engine/engine.h | 6 +- src/engine/entity.cpp | 4 +- src/engine/entity.h | 2 +- src/engine/render.cpp | 3 +- src/engine/resources.cpp | 1 + src/engine/world.h | 1 + src/engine/world_update.cpp | 2 +- 96 files changed, 1463 insertions(+), 532 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 236793d4c..329aa5266 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 236793d4c3266d333a2ec77dc65852540911e70c +Subproject commit 329aa5266a79d58caffb28e6b2f8cdcfb16c8f5d diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 60ecaba22..5b88d6ce2 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:930:0 +// src/engine/editor.h:932:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index 28267b749..9a0363327 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:43:0 +// src/engine/world.h:44:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index f136ed07a..73d4d0e51 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:674:0 +// src/engine/editor.h:676:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index 051965e01..8a35439fc 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -1,5 +1,9 @@ // external/bonsai_stdlib/src/bitmap.cpp:182:0 + + + + struct bitmap_block { u32 Index; @@ -23,10 +27,34 @@ struct bitmap_block_array }; +link_internal b32 +AreEqual(bitmap_block_array_index *Thing1, bitmap_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( bitmap_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(bitmap_block_array_index Thing1, bitmap_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( bitmap_block_array_index ) ); + + return Result; +} + + typedef bitmap_block_array bitmap_paged_list; link_internal bitmap_block_array_index -operator++(bitmap_block_array_index &I0) +operator++( bitmap_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(bitmap_block_array_index &I0) } link_internal b32 -operator<(bitmap_block_array_index I0, bitmap_block_array_index I1) +operator<( bitmap_block_array_index I0, bitmap_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(bitmap_block_array_index *Index) +GetIndex( bitmap_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal bitmap_block_array_index -ZerothIndex(bitmap_block_array *Arr) +ZerothIndex( bitmap_block_array *Arr) { bitmap_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(bitmap_block_array *Arr) +TotalElements( bitmap_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(bitmap_block_array *Arr) } link_internal bitmap_block_array_index -LastIndex(bitmap_block_array *Arr) +LastIndex( bitmap_block_array *Arr) { bitmap_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(bitmap_block_array *Arr) } link_internal bitmap_block_array_index -AtElements(bitmap_block_array *Arr) +AtElements( bitmap_block_array *Arr) { bitmap_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(bitmap_block_array *Arr) } link_internal umm -Count(bitmap_block_array *Arr) +Count( bitmap_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal bitmap * +Set( bitmap_block_array *Arr, + bitmap *Element, + bitmap_block_array_index Index ) +{ + bitmap *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal bitmap * GetPtr(bitmap_block_array *Arr, bitmap_block_array_index Index) { bitmap *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal bitmap * GetPtr(bitmap_block *Block, umm Index) { - bitmap *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + bitmap *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(bitmap_block_array *Arr, umm Index) Block = Block->Next; } - bitmap *Result = Block->Elements+ElementIndex; + bitmap *Result = (Block->Elements+ElementIndex); return Result; } @@ -204,7 +246,7 @@ RemoveUnordered( bitmap_block_array *Array, bitmap_block_array_index Index) bitmap *Element = GetPtr(Array, Index); bitmap *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -246,7 +288,7 @@ Find( bitmap_block_array *Array, bitmap *Query) bitmap_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( bitmap_block_array *Array, bitmap *Query) link_internal b32 IsValid(bitmap_block_array_index *Index) { - NotImplemented; bitmap_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 81a4d5da7..a8f7535d0 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -34,7 +34,7 @@ RemoveUnordered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array asset_thumbnail *Element = GetPtr(Array, Index); asset_thumbnail *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -76,7 +76,7 @@ Find( asset_thumbnail_block_array *Array, asset_thumbnail *Query) asset_thumbnail_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -88,10 +88,9 @@ Find( asset_thumbnail_block_array *Array, asset_thumbnail *Query) link_internal b32 IsValid(asset_thumbnail_block_array_index *Index) { - NotImplemented; asset_thumbnail_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index 7a6e61367..6a020276f 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -34,7 +34,7 @@ RemoveUnordered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index gpu_timer *Element = GetPtr(Array, Index); gpu_timer *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -76,7 +76,7 @@ Find( gpu_timer_block_array *Array, gpu_timer *Query) gpu_timer_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -88,10 +88,9 @@ Find( gpu_timer_block_array *Array, gpu_timer *Query) link_internal b32 IsValid(gpu_timer_block_array_index *Index) { - NotImplemented; gpu_timer_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index fcc6327e8..f1a331e69 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -31,10 +31,10 @@ RemoveUnordered( shader_ptr_block_array *Array, shader_ptr_block_array_index Ind { shader_ptr_block_array_index LastI = LastIndex(Array); - shader_ptr *Element = GetPtr(Array, Index); - shader_ptr *LastElement = GetPtr(Array, LastI); + shader_ptr Element = GetPtr(Array, Index); + shader_ptr LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -71,12 +71,12 @@ RemoveUnordered( shader_ptr_block_array *Array, shader_ptr_block_array_index Ind } link_internal shader_ptr_block_array_index -Find( shader_ptr_block_array *Array, shader_ptr *Query) +Find( shader_ptr_block_array *Array, shader_ptr Query) { shader_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -88,10 +88,9 @@ Find( shader_ptr_block_array *Array, shader_ptr *Query) link_internal b32 IsValid(shader_ptr_block_array_index *Index) { - NotImplemented; shader_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index c47009b64..b5f8e7f67 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -34,7 +34,7 @@ RemoveUnordered( texture_block_array *Array, texture_block_array_index Index) texture *Element = GetPtr(Array, Index); texture *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -76,7 +76,7 @@ Find( texture_block_array *Array, texture *Query) texture_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -88,10 +88,9 @@ Find( texture_block_array *Array, texture *Query) link_internal b32 IsValid(texture_block_array_index *Index) { - NotImplemented; texture_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index 800a0efeb..afe912d14 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -34,7 +34,7 @@ RemoveUnordered( u32_block_array *Array, u32_block_array_index Index) u32 *Element = GetPtr(Array, Index); u32 *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -76,7 +76,7 @@ Find( u32_block_array *Array, u32 *Query) u32_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -88,10 +88,9 @@ Find( u32_block_array *Array, u32 *Query) link_internal b32 IsValid(u32_block_array_index *Index) { - NotImplemented; u32_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index 9cca779a1..b862e6ebd 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -34,7 +34,7 @@ RemoveUnordered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index u8_cursor *Element = GetPtr(Array, Index); u8_cursor *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -76,7 +76,7 @@ Find( u8_cursor_block_array *Array, u8_cursor *Query) u8_cursor_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -88,10 +88,9 @@ Find( u8_cursor_block_array *Array, u8_cursor *Query) link_internal b32 IsValid(u8_cursor_block_array_index *Index) { - NotImplemented; u8_cursor_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 9e7d59736..f0b085e02 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,5 +1,9 @@ // src/engine/graphics.h:65:0 + + + + struct dummy_work_queue_entry_build_chunk_mesh_block { u32 Index; @@ -23,10 +27,34 @@ struct dummy_work_queue_entry_build_chunk_mesh_block_array }; +link_internal b32 +AreEqual(dummy_work_queue_entry_build_chunk_mesh_block_array_index *Thing1, dummy_work_queue_entry_build_chunk_mesh_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( dummy_work_queue_entry_build_chunk_mesh_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(dummy_work_queue_entry_build_chunk_mesh_block_array_index Thing1, dummy_work_queue_entry_build_chunk_mesh_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( dummy_work_queue_entry_build_chunk_mesh_block_array_index ) ); + + return Result; +} + + typedef dummy_work_queue_entry_build_chunk_mesh_block_array dummy_work_queue_entry_build_chunk_mesh_paged_list; link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index -operator++(dummy_work_queue_entry_build_chunk_mesh_block_array_index &I0) +operator++( dummy_work_queue_entry_build_chunk_mesh_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(dummy_work_queue_entry_build_chunk_mesh_block_array_index &I0) } link_internal b32 -operator<(dummy_work_queue_entry_build_chunk_mesh_block_array_index I0, dummy_work_queue_entry_build_chunk_mesh_block_array_index I1) +operator<( dummy_work_queue_entry_build_chunk_mesh_block_array_index I0, dummy_work_queue_entry_build_chunk_mesh_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(dummy_work_queue_entry_build_chunk_mesh_block_array_index *Index) +GetIndex( dummy_work_queue_entry_build_chunk_mesh_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index -ZerothIndex(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +ZerothIndex( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) { dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +TotalElements( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) } link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index -LastIndex(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +LastIndex( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) { dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) } link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index -AtElements(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +AtElements( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) { dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) } link_internal umm -Count(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +Count( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal dummy_work_queue_entry_build_chunk_mesh * +Set( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, + dummy_work_queue_entry_build_chunk_mesh *Element, + dummy_work_queue_entry_build_chunk_mesh_block_array_index Index ) +{ + dummy_work_queue_entry_build_chunk_mesh *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal dummy_work_queue_entry_build_chunk_mesh * GetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) { dummy_work_queue_entry_build_chunk_mesh *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal dummy_work_queue_entry_build_chunk_mesh * GetPtr(dummy_work_queue_entry_build_chunk_mesh_block *Block, umm Index) { - dummy_work_queue_entry_build_chunk_mesh *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + dummy_work_queue_entry_build_chunk_mesh *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) Block = Block->Next; } - dummy_work_queue_entry_build_chunk_mesh *Result = Block->Elements+ElementIndex; + dummy_work_queue_entry_build_chunk_mesh *Result = (Block->Elements+ElementIndex); return Result; } @@ -204,7 +246,7 @@ RemoveUnordered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dum dummy_work_queue_entry_build_chunk_mesh *Element = GetPtr(Array, Index); dummy_work_queue_entry_build_chunk_mesh *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -246,7 +288,7 @@ Find( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_que dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_que link_internal b32 IsValid(dummy_work_queue_entry_build_chunk_mesh_block_array_index *Index) { - NotImplemented; dummy_work_queue_entry_build_chunk_mesh_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index d6c8f3955..2a2f2dc1e 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -1,5 +1,9 @@ // src/engine/serdes.cpp:369:0 + + + + struct entity_block { u32 Index; @@ -23,10 +27,34 @@ struct entity_block_array }; +link_internal b32 +AreEqual(entity_block_array_index *Thing1, entity_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( entity_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(entity_block_array_index Thing1, entity_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( entity_block_array_index ) ); + + return Result; +} + + typedef entity_block_array entity_paged_list; link_internal entity_block_array_index -operator++(entity_block_array_index &I0) +operator++( entity_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(entity_block_array_index &I0) } link_internal b32 -operator<(entity_block_array_index I0, entity_block_array_index I1) +operator<( entity_block_array_index I0, entity_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(entity_block_array_index *Index) +GetIndex( entity_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal entity_block_array_index -ZerothIndex(entity_block_array *Arr) +ZerothIndex( entity_block_array *Arr) { entity_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(entity_block_array *Arr) +TotalElements( entity_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(entity_block_array *Arr) } link_internal entity_block_array_index -LastIndex(entity_block_array *Arr) +LastIndex( entity_block_array *Arr) { entity_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(entity_block_array *Arr) } link_internal entity_block_array_index -AtElements(entity_block_array *Arr) +AtElements( entity_block_array *Arr) { entity_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(entity_block_array *Arr) } link_internal umm -Count(entity_block_array *Arr) +Count( entity_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal entity * +Set( entity_block_array *Arr, + entity *Element, + entity_block_array_index Index ) +{ + entity *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal entity * GetPtr(entity_block_array *Arr, entity_block_array_index Index) { entity *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal entity * GetPtr(entity_block *Block, umm Index) { - entity *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + entity *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(entity_block_array *Arr, umm Index) Block = Block->Next; } - entity *Result = Block->Elements+ElementIndex; + entity *Result = (Block->Elements+ElementIndex); return Result; } @@ -204,7 +246,7 @@ RemoveUnordered( entity_block_array *Array, entity_block_array_index Index) entity *Element = GetPtr(Array, Index); entity *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -246,7 +288,7 @@ Find( entity_block_array *Array, entity *Query) entity_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( entity_block_array *Array, entity *Query) link_internal b32 IsValid(entity_block_array_index *Index) { - NotImplemented; entity_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h index 9b587fe7c..fcae2338d 100644 --- a/generated/block_array_entity_ptr_688856411.h +++ b/generated/block_array_entity_ptr_688856411.h @@ -1,5 +1,9 @@ // src/engine/world_chunk.h:308:0 + + + + struct entity_ptr_block { u32 Index; @@ -23,10 +27,34 @@ struct entity_ptr_block_array }; +link_internal b32 +AreEqual(entity_ptr_block_array_index *Thing1, entity_ptr_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( entity_ptr_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(entity_ptr_block_array_index Thing1, entity_ptr_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( entity_ptr_block_array_index ) ); + + return Result; +} + + typedef entity_ptr_block_array entity_ptr_paged_list; link_internal entity_ptr_block_array_index -operator++(entity_ptr_block_array_index &I0) +operator++( entity_ptr_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(entity_ptr_block_array_index &I0) } link_internal b32 -operator<(entity_ptr_block_array_index I0, entity_ptr_block_array_index I1) +operator<( entity_ptr_block_array_index I0, entity_ptr_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(entity_ptr_block_array_index *Index) +GetIndex( entity_ptr_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal entity_ptr_block_array_index -ZerothIndex(entity_ptr_block_array *Arr) +ZerothIndex( entity_ptr_block_array *Arr) { entity_ptr_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(entity_ptr_block_array *Arr) +TotalElements( entity_ptr_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(entity_ptr_block_array *Arr) } link_internal entity_ptr_block_array_index -LastIndex(entity_ptr_block_array *Arr) +LastIndex( entity_ptr_block_array *Arr) { entity_ptr_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(entity_ptr_block_array *Arr) } link_internal entity_ptr_block_array_index -AtElements(entity_ptr_block_array *Arr) +AtElements( entity_ptr_block_array *Arr) { entity_ptr_block_array_index Result = {}; if (Arr->Current) @@ -111,30 +138,45 @@ AtElements(entity_ptr_block_array *Arr) } link_internal umm -Count(entity_ptr_block_array *Arr) +Count( entity_ptr_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } -link_internal entity_ptr * +link_internal entity_ptr +Set( entity_ptr_block_array *Arr, + entity_ptr Element, + entity_ptr_block_array_index Index ) +{ + entity_ptr Result = {}; + if (Index.Block) + { + Result = Index.Block->Elements[Index.ElementIndex]; + Result = Element; + } + + return Result; +} + +link_internal entity_ptr GetPtr(entity_ptr_block_array *Arr, entity_ptr_block_array_index Index) { - entity_ptr *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + entity_ptr Result = {}; + if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } return Result; } -link_internal entity_ptr * +link_internal entity_ptr GetPtr(entity_ptr_block *Block, umm Index) { - entity_ptr *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + entity_ptr Result = {}; + if (Index < Block->At) { Result = *(Block->Elements + Index); } return Result; } -link_internal entity_ptr * +link_internal entity_ptr GetPtr(entity_ptr_block_array *Arr, umm Index) { umm BlockIndex = Index / 8; @@ -147,11 +189,11 @@ GetPtr(entity_ptr_block_array *Arr, umm Index) Block = Block->Next; } - entity_ptr *Result = Block->Elements+ElementIndex; + entity_ptr Result = *(Block->Elements+ElementIndex); return Result; } -link_internal entity_ptr * +link_internal entity_ptr TryGetPtr(entity_ptr_block_array *Arr, umm Index) { umm BlockIndex = Index / 8; @@ -159,7 +201,7 @@ TryGetPtr(entity_ptr_block_array *Arr, umm Index) auto AtE = AtElements(Arr); umm Total = GetIndex(&AtE); - entity_ptr *Result = {}; + entity_ptr Result = {}; if (Index < Total) { Result = GetPtr(Arr, Index); } return Result; } @@ -201,10 +243,10 @@ RemoveUnordered( entity_ptr_block_array *Array, entity_ptr_block_array_index Ind { entity_ptr_block_array_index LastI = LastIndex(Array); - entity_ptr *Element = GetPtr(Array, Index); - entity_ptr *LastElement = GetPtr(Array, LastI); + entity_ptr Element = GetPtr(Array, Index); + entity_ptr LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -241,12 +283,12 @@ RemoveUnordered( entity_ptr_block_array *Array, entity_ptr_block_array_index Ind } link_internal entity_ptr_block_array_index -Find( entity_ptr_block_array *Array, entity_ptr *Query) +Find( entity_ptr_block_array *Array, entity_ptr Query) { entity_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( entity_ptr_block_array *Array, entity_ptr *Query) link_internal b32 IsValid(entity_ptr_block_array_index *Index) { - NotImplemented; entity_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index a73426309..ce1d2efb5 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -1,5 +1,9 @@ // external/bonsai_stdlib/src/file.cpp:6:0 + + + + struct file_traversal_node_block { u32 Index; @@ -23,10 +27,34 @@ struct file_traversal_node_block_array }; +link_internal b32 +AreEqual(file_traversal_node_block_array_index *Thing1, file_traversal_node_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( file_traversal_node_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(file_traversal_node_block_array_index Thing1, file_traversal_node_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( file_traversal_node_block_array_index ) ); + + return Result; +} + + typedef file_traversal_node_block_array file_traversal_node_paged_list; link_internal file_traversal_node_block_array_index -operator++(file_traversal_node_block_array_index &I0) +operator++( file_traversal_node_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(file_traversal_node_block_array_index &I0) } link_internal b32 -operator<(file_traversal_node_block_array_index I0, file_traversal_node_block_array_index I1) +operator<( file_traversal_node_block_array_index I0, file_traversal_node_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(file_traversal_node_block_array_index *Index) +GetIndex( file_traversal_node_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal file_traversal_node_block_array_index -ZerothIndex(file_traversal_node_block_array *Arr) +ZerothIndex( file_traversal_node_block_array *Arr) { file_traversal_node_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(file_traversal_node_block_array *Arr) +TotalElements( file_traversal_node_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(file_traversal_node_block_array *Arr) } link_internal file_traversal_node_block_array_index -LastIndex(file_traversal_node_block_array *Arr) +LastIndex( file_traversal_node_block_array *Arr) { file_traversal_node_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(file_traversal_node_block_array *Arr) } link_internal file_traversal_node_block_array_index -AtElements(file_traversal_node_block_array *Arr) +AtElements( file_traversal_node_block_array *Arr) { file_traversal_node_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(file_traversal_node_block_array *Arr) } link_internal umm -Count(file_traversal_node_block_array *Arr) +Count( file_traversal_node_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal file_traversal_node * +Set( file_traversal_node_block_array *Arr, + file_traversal_node *Element, + file_traversal_node_block_array_index Index ) +{ + file_traversal_node *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal file_traversal_node * GetPtr(file_traversal_node_block_array *Arr, file_traversal_node_block_array_index Index) { file_traversal_node *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal file_traversal_node * GetPtr(file_traversal_node_block *Block, umm Index) { - file_traversal_node *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + file_traversal_node *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(file_traversal_node_block_array *Arr, umm Index) Block = Block->Next; } - file_traversal_node *Result = Block->Elements+ElementIndex; + file_traversal_node *Result = (Block->Elements+ElementIndex); return Result; } @@ -204,7 +246,7 @@ RemoveUnordered( file_traversal_node_block_array *Array, file_traversal_node_blo file_traversal_node *Element = GetPtr(Array, Index); file_traversal_node *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -246,7 +288,7 @@ Find( file_traversal_node_block_array *Array, file_traversal_node *Query) file_traversal_node_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( file_traversal_node_block_array *Array, file_traversal_node *Query) link_internal b32 IsValid(file_traversal_node_block_array_index *Index) { - NotImplemented; file_traversal_node_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 7525cc314..ba7cb924e 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,5 +1,9 @@ // src/engine/graphics.h:54:0 + + + + struct gpu_readback_buffer_block { u32 Index; @@ -23,10 +27,34 @@ struct gpu_readback_buffer_block_array }; +link_internal b32 +AreEqual(gpu_readback_buffer_block_array_index *Thing1, gpu_readback_buffer_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( gpu_readback_buffer_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(gpu_readback_buffer_block_array_index Thing1, gpu_readback_buffer_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( gpu_readback_buffer_block_array_index ) ); + + return Result; +} + + typedef gpu_readback_buffer_block_array gpu_readback_buffer_paged_list; link_internal gpu_readback_buffer_block_array_index -operator++(gpu_readback_buffer_block_array_index &I0) +operator++( gpu_readback_buffer_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(gpu_readback_buffer_block_array_index &I0) } link_internal b32 -operator<(gpu_readback_buffer_block_array_index I0, gpu_readback_buffer_block_array_index I1) +operator<( gpu_readback_buffer_block_array_index I0, gpu_readback_buffer_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(gpu_readback_buffer_block_array_index *Index) +GetIndex( gpu_readback_buffer_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal gpu_readback_buffer_block_array_index -ZerothIndex(gpu_readback_buffer_block_array *Arr) +ZerothIndex( gpu_readback_buffer_block_array *Arr) { gpu_readback_buffer_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(gpu_readback_buffer_block_array *Arr) +TotalElements( gpu_readback_buffer_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(gpu_readback_buffer_block_array *Arr) } link_internal gpu_readback_buffer_block_array_index -LastIndex(gpu_readback_buffer_block_array *Arr) +LastIndex( gpu_readback_buffer_block_array *Arr) { gpu_readback_buffer_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(gpu_readback_buffer_block_array *Arr) } link_internal gpu_readback_buffer_block_array_index -AtElements(gpu_readback_buffer_block_array *Arr) +AtElements( gpu_readback_buffer_block_array *Arr) { gpu_readback_buffer_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(gpu_readback_buffer_block_array *Arr) } link_internal umm -Count(gpu_readback_buffer_block_array *Arr) +Count( gpu_readback_buffer_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal gpu_readback_buffer * +Set( gpu_readback_buffer_block_array *Arr, + gpu_readback_buffer *Element, + gpu_readback_buffer_block_array_index Index ) +{ + gpu_readback_buffer *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal gpu_readback_buffer * GetPtr(gpu_readback_buffer_block_array *Arr, gpu_readback_buffer_block_array_index Index) { gpu_readback_buffer *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal gpu_readback_buffer * GetPtr(gpu_readback_buffer_block *Block, umm Index) { - gpu_readback_buffer *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + gpu_readback_buffer *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(gpu_readback_buffer_block_array *Arr, umm Index) Block = Block->Next; } - gpu_readback_buffer *Result = Block->Elements+ElementIndex; + gpu_readback_buffer *Result = (Block->Elements+ElementIndex); return Result; } @@ -204,7 +246,7 @@ RemoveUnordered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_blo gpu_readback_buffer *Element = GetPtr(Array, Index); gpu_readback_buffer *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -246,7 +288,7 @@ Find( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Query) gpu_readback_buffer_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Query) link_internal b32 IsValid(gpu_readback_buffer_block_array_index *Index) { - NotImplemented; gpu_readback_buffer_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 57113164e..206419285 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,8 @@ -// src/engine/editor.h:529:0 +// src/engine/editor.h:531:0 + + + + struct asset_thumbnail_block { @@ -23,10 +27,34 @@ struct asset_thumbnail_block_array }; +link_internal b32 +AreEqual(asset_thumbnail_block_array_index *Thing1, asset_thumbnail_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( asset_thumbnail_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(asset_thumbnail_block_array_index Thing1, asset_thumbnail_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( asset_thumbnail_block_array_index ) ); + + return Result; +} + + typedef asset_thumbnail_block_array asset_thumbnail_paged_list; link_internal asset_thumbnail_block_array_index -operator++(asset_thumbnail_block_array_index &I0) +operator++( asset_thumbnail_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(asset_thumbnail_block_array_index &I0) } link_internal b32 -operator<(asset_thumbnail_block_array_index I0, asset_thumbnail_block_array_index I1) +operator<( asset_thumbnail_block_array_index I0, asset_thumbnail_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(asset_thumbnail_block_array_index *Index) +GetIndex( asset_thumbnail_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal asset_thumbnail_block_array_index -ZerothIndex(asset_thumbnail_block_array *Arr) +ZerothIndex( asset_thumbnail_block_array *Arr) { asset_thumbnail_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(asset_thumbnail_block_array *Arr) +TotalElements( asset_thumbnail_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(asset_thumbnail_block_array *Arr) } link_internal asset_thumbnail_block_array_index -LastIndex(asset_thumbnail_block_array *Arr) +LastIndex( asset_thumbnail_block_array *Arr) { asset_thumbnail_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(asset_thumbnail_block_array *Arr) } link_internal asset_thumbnail_block_array_index -AtElements(asset_thumbnail_block_array *Arr) +AtElements( asset_thumbnail_block_array *Arr) { asset_thumbnail_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(asset_thumbnail_block_array *Arr) } link_internal umm -Count(asset_thumbnail_block_array *Arr) +Count( asset_thumbnail_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal asset_thumbnail * +Set( asset_thumbnail_block_array *Arr, + asset_thumbnail *Element, + asset_thumbnail_block_array_index Index ) +{ + asset_thumbnail *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal asset_thumbnail * GetPtr(asset_thumbnail_block_array *Arr, asset_thumbnail_block_array_index Index) { asset_thumbnail *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal asset_thumbnail * GetPtr(asset_thumbnail_block *Block, umm Index) { - asset_thumbnail *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + asset_thumbnail *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(asset_thumbnail_block_array *Arr, umm Index) Block = Block->Next; } - asset_thumbnail *Result = Block->Elements+ElementIndex; + asset_thumbnail *Result = (Block->Elements+ElementIndex); return Result; } diff --git a/generated/block_array_h_gpu_timer_688735882_0.h b/generated/block_array_h_gpu_timer_688735882_0.h index c0d5d2519..fe19f610a 100644 --- a/generated/block_array_h_gpu_timer_688735882_0.h +++ b/generated/block_array_h_gpu_timer_688735882_0.h @@ -1,5 +1,9 @@ // src/engine/render/gpu_timer.h:9:0 + + + + struct gpu_timer_block { u32 Index; @@ -23,10 +27,34 @@ struct gpu_timer_block_array }; +link_internal b32 +AreEqual(gpu_timer_block_array_index *Thing1, gpu_timer_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( gpu_timer_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(gpu_timer_block_array_index Thing1, gpu_timer_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( gpu_timer_block_array_index ) ); + + return Result; +} + + typedef gpu_timer_block_array gpu_timer_paged_list; link_internal gpu_timer_block_array_index -operator++(gpu_timer_block_array_index &I0) +operator++( gpu_timer_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(gpu_timer_block_array_index &I0) } link_internal b32 -operator<(gpu_timer_block_array_index I0, gpu_timer_block_array_index I1) +operator<( gpu_timer_block_array_index I0, gpu_timer_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(gpu_timer_block_array_index *Index) +GetIndex( gpu_timer_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*128); return Result; } link_internal gpu_timer_block_array_index -ZerothIndex(gpu_timer_block_array *Arr) +ZerothIndex( gpu_timer_block_array *Arr) { gpu_timer_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(gpu_timer_block_array *Arr) +TotalElements( gpu_timer_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(gpu_timer_block_array *Arr) } link_internal gpu_timer_block_array_index -LastIndex(gpu_timer_block_array *Arr) +LastIndex( gpu_timer_block_array *Arr) { gpu_timer_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(gpu_timer_block_array *Arr) } link_internal gpu_timer_block_array_index -AtElements(gpu_timer_block_array *Arr) +AtElements( gpu_timer_block_array *Arr) { gpu_timer_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(gpu_timer_block_array *Arr) } link_internal umm -Count(gpu_timer_block_array *Arr) +Count( gpu_timer_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal gpu_timer * +Set( gpu_timer_block_array *Arr, + gpu_timer *Element, + gpu_timer_block_array_index Index ) +{ + gpu_timer *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal gpu_timer * GetPtr(gpu_timer_block_array *Arr, gpu_timer_block_array_index Index) { gpu_timer *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal gpu_timer * GetPtr(gpu_timer_block *Block, umm Index) { - gpu_timer *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + gpu_timer *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(gpu_timer_block_array *Arr, umm Index) Block = Block->Next; } - gpu_timer *Result = Block->Elements+ElementIndex; + gpu_timer *Result = (Block->Elements+ElementIndex); return Result; } diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 0b2c9fc58..14c3ce239 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,5 +1,9 @@ // external/bonsai_stdlib/src/shader.h:130:0 + + + + struct shader_ptr_block { u32 Index; @@ -23,10 +27,34 @@ struct shader_ptr_block_array }; +link_internal b32 +AreEqual(shader_ptr_block_array_index *Thing1, shader_ptr_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( shader_ptr_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(shader_ptr_block_array_index Thing1, shader_ptr_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( shader_ptr_block_array_index ) ); + + return Result; +} + + typedef shader_ptr_block_array shader_ptr_paged_list; link_internal shader_ptr_block_array_index -operator++(shader_ptr_block_array_index &I0) +operator++( shader_ptr_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(shader_ptr_block_array_index &I0) } link_internal b32 -operator<(shader_ptr_block_array_index I0, shader_ptr_block_array_index I1) +operator<( shader_ptr_block_array_index I0, shader_ptr_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(shader_ptr_block_array_index *Index) +GetIndex( shader_ptr_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*64); return Result; } link_internal shader_ptr_block_array_index -ZerothIndex(shader_ptr_block_array *Arr) +ZerothIndex( shader_ptr_block_array *Arr) { shader_ptr_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(shader_ptr_block_array *Arr) +TotalElements( shader_ptr_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(shader_ptr_block_array *Arr) } link_internal shader_ptr_block_array_index -LastIndex(shader_ptr_block_array *Arr) +LastIndex( shader_ptr_block_array *Arr) { shader_ptr_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(shader_ptr_block_array *Arr) } link_internal shader_ptr_block_array_index -AtElements(shader_ptr_block_array *Arr) +AtElements( shader_ptr_block_array *Arr) { shader_ptr_block_array_index Result = {}; if (Arr->Current) @@ -111,30 +138,45 @@ AtElements(shader_ptr_block_array *Arr) } link_internal umm -Count(shader_ptr_block_array *Arr) +Count( shader_ptr_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } -link_internal shader_ptr * +link_internal shader_ptr +Set( shader_ptr_block_array *Arr, + shader_ptr Element, + shader_ptr_block_array_index Index ) +{ + shader_ptr Result = {}; + if (Index.Block) + { + Result = Index.Block->Elements[Index.ElementIndex]; + Result = Element; + } + + return Result; +} + +link_internal shader_ptr GetPtr(shader_ptr_block_array *Arr, shader_ptr_block_array_index Index) { - shader_ptr *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + shader_ptr Result = {}; + if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } return Result; } -link_internal shader_ptr * +link_internal shader_ptr GetPtr(shader_ptr_block *Block, umm Index) { - shader_ptr *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + shader_ptr Result = {}; + if (Index < Block->At) { Result = *(Block->Elements + Index); } return Result; } -link_internal shader_ptr * +link_internal shader_ptr GetPtr(shader_ptr_block_array *Arr, umm Index) { umm BlockIndex = Index / 64; @@ -147,11 +189,11 @@ GetPtr(shader_ptr_block_array *Arr, umm Index) Block = Block->Next; } - shader_ptr *Result = Block->Elements+ElementIndex; + shader_ptr Result = *(Block->Elements+ElementIndex); return Result; } -link_internal shader_ptr * +link_internal shader_ptr TryGetPtr(shader_ptr_block_array *Arr, umm Index) { umm BlockIndex = Index / 64; @@ -159,7 +201,7 @@ TryGetPtr(shader_ptr_block_array *Arr, umm Index) auto AtE = AtElements(Arr); umm Total = GetIndex(&AtE); - shader_ptr *Result = {}; + shader_ptr Result = {}; if (Index < Total) { Result = GetPtr(Arr, Index); } return Result; } diff --git a/generated/block_array_h_texture_688856411.h b/generated/block_array_h_texture_688856411.h index f1b0d3a1e..2afc4c763 100644 --- a/generated/block_array_h_texture_688856411.h +++ b/generated/block_array_h_texture_688856411.h @@ -1,5 +1,9 @@ // external/bonsai_stdlib/src/texture.h:47:0 + + + + struct texture_ptr_block { u32 Index; @@ -23,10 +27,34 @@ struct texture_ptr_block_array }; +link_internal b32 +AreEqual(texture_ptr_block_array_index *Thing1, texture_ptr_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( texture_ptr_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(texture_ptr_block_array_index Thing1, texture_ptr_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( texture_ptr_block_array_index ) ); + + return Result; +} + + typedef texture_ptr_block_array texture_ptr_paged_list; link_internal texture_ptr_block_array_index -operator++(texture_ptr_block_array_index &I0) +operator++( texture_ptr_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(texture_ptr_block_array_index &I0) } link_internal b32 -operator<(texture_ptr_block_array_index I0, texture_ptr_block_array_index I1) +operator<( texture_ptr_block_array_index I0, texture_ptr_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(texture_ptr_block_array_index *Index) +GetIndex( texture_ptr_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal texture_ptr_block_array_index -ZerothIndex(texture_ptr_block_array *Arr) +ZerothIndex( texture_ptr_block_array *Arr) { texture_ptr_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(texture_ptr_block_array *Arr) +TotalElements( texture_ptr_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(texture_ptr_block_array *Arr) } link_internal texture_ptr_block_array_index -LastIndex(texture_ptr_block_array *Arr) +LastIndex( texture_ptr_block_array *Arr) { texture_ptr_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(texture_ptr_block_array *Arr) } link_internal texture_ptr_block_array_index -AtElements(texture_ptr_block_array *Arr) +AtElements( texture_ptr_block_array *Arr) { texture_ptr_block_array_index Result = {}; if (Arr->Current) @@ -111,30 +138,45 @@ AtElements(texture_ptr_block_array *Arr) } link_internal umm -Count(texture_ptr_block_array *Arr) +Count( texture_ptr_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } -link_internal texture_ptr * +link_internal texture_ptr +Set( texture_ptr_block_array *Arr, + texture_ptr Element, + texture_ptr_block_array_index Index ) +{ + texture_ptr Result = {}; + if (Index.Block) + { + Result = Index.Block->Elements[Index.ElementIndex]; + Result = Element; + } + + return Result; +} + +link_internal texture_ptr GetPtr(texture_ptr_block_array *Arr, texture_ptr_block_array_index Index) { - texture_ptr *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + texture_ptr Result = {}; + if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } return Result; } -link_internal texture_ptr * +link_internal texture_ptr GetPtr(texture_ptr_block *Block, umm Index) { - texture_ptr *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + texture_ptr Result = {}; + if (Index < Block->At) { Result = *(Block->Elements + Index); } return Result; } -link_internal texture_ptr * +link_internal texture_ptr GetPtr(texture_ptr_block_array *Arr, umm Index) { umm BlockIndex = Index / 8; @@ -147,11 +189,11 @@ GetPtr(texture_ptr_block_array *Arr, umm Index) Block = Block->Next; } - texture_ptr *Result = Block->Elements+ElementIndex; + texture_ptr Result = *(Block->Elements+ElementIndex); return Result; } -link_internal texture_ptr * +link_internal texture_ptr TryGetPtr(texture_ptr_block_array *Arr, umm Index) { umm BlockIndex = Index / 8; @@ -159,7 +201,7 @@ TryGetPtr(texture_ptr_block_array *Arr, umm Index) auto AtE = AtElements(Arr); umm Total = GetIndex(&AtE); - texture_ptr *Result = {}; + texture_ptr Result = {}; if (Index < Total) { Result = GetPtr(Arr, Index); } return Result; } diff --git a/generated/block_array_h_texture_688856411_0.h b/generated/block_array_h_texture_688856411_0.h index 3d040122d..a43c95b23 100644 --- a/generated/block_array_h_texture_688856411_0.h +++ b/generated/block_array_h_texture_688856411_0.h @@ -1,5 +1,9 @@ // external/bonsai_stdlib/src/texture.h:44:0 + + + + struct texture_block { u32 Index; @@ -23,10 +27,34 @@ struct texture_block_array }; +link_internal b32 +AreEqual(texture_block_array_index *Thing1, texture_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( texture_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(texture_block_array_index Thing1, texture_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( texture_block_array_index ) ); + + return Result; +} + + typedef texture_block_array texture_paged_list; link_internal texture_block_array_index -operator++(texture_block_array_index &I0) +operator++( texture_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(texture_block_array_index &I0) } link_internal b32 -operator<(texture_block_array_index I0, texture_block_array_index I1) +operator<( texture_block_array_index I0, texture_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(texture_block_array_index *Index) +GetIndex( texture_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal texture_block_array_index -ZerothIndex(texture_block_array *Arr) +ZerothIndex( texture_block_array *Arr) { texture_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(texture_block_array *Arr) +TotalElements( texture_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(texture_block_array *Arr) } link_internal texture_block_array_index -LastIndex(texture_block_array *Arr) +LastIndex( texture_block_array *Arr) { texture_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(texture_block_array *Arr) } link_internal texture_block_array_index -AtElements(texture_block_array *Arr) +AtElements( texture_block_array *Arr) { texture_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(texture_block_array *Arr) } link_internal umm -Count(texture_block_array *Arr) +Count( texture_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal texture * +Set( texture_block_array *Arr, + texture *Element, + texture_block_array_index Index ) +{ + texture *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal texture * GetPtr(texture_block_array *Arr, texture_block_array_index Index) { texture *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal texture * GetPtr(texture_block *Block, umm Index) { - texture *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + texture *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(texture_block_array *Arr, umm Index) Block = Block->Next; } - texture *Result = Block->Elements+ElementIndex; + texture *Result = (Block->Elements+ElementIndex); return Result; } diff --git a/generated/block_array_h_u32_688856411.h b/generated/block_array_h_u32_688856411.h index dc65aaade..c80369e7e 100644 --- a/generated/block_array_h_u32_688856411.h +++ b/generated/block_array_h_u32_688856411.h @@ -1,5 +1,9 @@ // external/bonsai_stdlib/src/primitive_containers.h:2:0 + + + + struct u32_block { u32 Index; @@ -23,10 +27,34 @@ struct u32_block_array }; +link_internal b32 +AreEqual(u32_block_array_index *Thing1, u32_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( u32_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(u32_block_array_index Thing1, u32_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( u32_block_array_index ) ); + + return Result; +} + + typedef u32_block_array u32_paged_list; link_internal u32_block_array_index -operator++(u32_block_array_index &I0) +operator++( u32_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(u32_block_array_index &I0) } link_internal b32 -operator<(u32_block_array_index I0, u32_block_array_index I1) +operator<( u32_block_array_index I0, u32_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(u32_block_array_index *Index) +GetIndex( u32_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal u32_block_array_index -ZerothIndex(u32_block_array *Arr) +ZerothIndex( u32_block_array *Arr) { u32_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(u32_block_array *Arr) +TotalElements( u32_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(u32_block_array *Arr) } link_internal u32_block_array_index -LastIndex(u32_block_array *Arr) +LastIndex( u32_block_array *Arr) { u32_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(u32_block_array *Arr) } link_internal u32_block_array_index -AtElements(u32_block_array *Arr) +AtElements( u32_block_array *Arr) { u32_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(u32_block_array *Arr) } link_internal umm -Count(u32_block_array *Arr) +Count( u32_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal u32 * +Set( u32_block_array *Arr, + u32 *Element, + u32_block_array_index Index ) +{ + u32 *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal u32 * GetPtr(u32_block_array *Arr, u32_block_array_index Index) { u32 *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal u32 * GetPtr(u32_block *Block, umm Index) { - u32 *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + u32 *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(u32_block_array *Arr, umm Index) Block = Block->Next; } - u32 *Result = Block->Elements+ElementIndex; + u32 *Result = (Block->Elements+ElementIndex); return Result; } diff --git a/generated/block_array_h_u8_cursor_688856411.h b/generated/block_array_h_u8_cursor_688856411.h index 4485d7132..78eb5a24c 100644 --- a/generated/block_array_h_u8_cursor_688856411.h +++ b/generated/block_array_h_u8_cursor_688856411.h @@ -1,5 +1,9 @@ // external/bonsai_stdlib/src/ansi_stream.h:6:0 + + + + struct u8_cursor_block { u32 Index; @@ -23,10 +27,34 @@ struct u8_cursor_block_array u64 BlockSize; }; +link_internal b32 +AreEqual(u8_cursor_block_array_index *Thing1, u8_cursor_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( u8_cursor_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(u8_cursor_block_array_index Thing1, u8_cursor_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( u8_cursor_block_array_index ) ); + + return Result; +} + + typedef u8_cursor_block_array u8_cursor_paged_list; link_internal u8_cursor_block_array_index -operator++(u8_cursor_block_array_index &I0) +operator++( u8_cursor_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(u8_cursor_block_array_index &I0) } link_internal b32 -operator<(u8_cursor_block_array_index I0, u8_cursor_block_array_index I1) +operator<( u8_cursor_block_array_index I0, u8_cursor_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(u8_cursor_block_array_index *Index) +GetIndex( u8_cursor_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal u8_cursor_block_array_index -ZerothIndex(u8_cursor_block_array *Arr) +ZerothIndex( u8_cursor_block_array *Arr) { u8_cursor_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(u8_cursor_block_array *Arr) +TotalElements( u8_cursor_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(u8_cursor_block_array *Arr) } link_internal u8_cursor_block_array_index -LastIndex(u8_cursor_block_array *Arr) +LastIndex( u8_cursor_block_array *Arr) { u8_cursor_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(u8_cursor_block_array *Arr) } link_internal u8_cursor_block_array_index -AtElements(u8_cursor_block_array *Arr) +AtElements( u8_cursor_block_array *Arr) { u8_cursor_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(u8_cursor_block_array *Arr) } link_internal umm -Count(u8_cursor_block_array *Arr) +Count( u8_cursor_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal u8_cursor * +Set( u8_cursor_block_array *Arr, + u8_cursor *Element, + u8_cursor_block_array_index Index ) +{ + u8_cursor *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal u8_cursor * GetPtr(u8_cursor_block_array *Arr, u8_cursor_block_array_index Index) { u8_cursor *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal u8_cursor * GetPtr(u8_cursor_block *Block, umm Index) { - u8_cursor *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + u8_cursor *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(u8_cursor_block_array *Arr, umm Index) Block = Block->Next; } - u8_cursor *Result = Block->Elements+ElementIndex; + u8_cursor *Result = (Block->Elements+ElementIndex); return Result; } diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index ab75cbfba..423c3dd1e 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,5 +1,9 @@ // src/engine/world_chunk.h:451:0 + + + + struct world_chunk_ptr_block { u32 Index; @@ -23,10 +27,34 @@ struct world_chunk_ptr_block_array }; +link_internal b32 +AreEqual(world_chunk_ptr_block_array_index *Thing1, world_chunk_ptr_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( world_chunk_ptr_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(world_chunk_ptr_block_array_index Thing1, world_chunk_ptr_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( world_chunk_ptr_block_array_index ) ); + + return Result; +} + + typedef world_chunk_ptr_block_array world_chunk_ptr_paged_list; link_internal world_chunk_ptr_block_array_index -operator++(world_chunk_ptr_block_array_index &I0) +operator++( world_chunk_ptr_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(world_chunk_ptr_block_array_index &I0) } link_internal b32 -operator<(world_chunk_ptr_block_array_index I0, world_chunk_ptr_block_array_index I1) +operator<( world_chunk_ptr_block_array_index I0, world_chunk_ptr_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(world_chunk_ptr_block_array_index *Index) +GetIndex( world_chunk_ptr_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*32); return Result; } link_internal world_chunk_ptr_block_array_index -ZerothIndex(world_chunk_ptr_block_array *Arr) +ZerothIndex( world_chunk_ptr_block_array *Arr) { world_chunk_ptr_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(world_chunk_ptr_block_array *Arr) +TotalElements( world_chunk_ptr_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(world_chunk_ptr_block_array *Arr) } link_internal world_chunk_ptr_block_array_index -LastIndex(world_chunk_ptr_block_array *Arr) +LastIndex( world_chunk_ptr_block_array *Arr) { world_chunk_ptr_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(world_chunk_ptr_block_array *Arr) } link_internal world_chunk_ptr_block_array_index -AtElements(world_chunk_ptr_block_array *Arr) +AtElements( world_chunk_ptr_block_array *Arr) { world_chunk_ptr_block_array_index Result = {}; if (Arr->Current) @@ -111,30 +138,45 @@ AtElements(world_chunk_ptr_block_array *Arr) } link_internal umm -Count(world_chunk_ptr_block_array *Arr) +Count( world_chunk_ptr_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } -link_internal world_chunk_ptr * +link_internal world_chunk_ptr +Set( world_chunk_ptr_block_array *Arr, + world_chunk_ptr Element, + world_chunk_ptr_block_array_index Index ) +{ + world_chunk_ptr Result = {}; + if (Index.Block) + { + Result = Index.Block->Elements[Index.ElementIndex]; + Result = Element; + } + + return Result; +} + +link_internal world_chunk_ptr GetPtr(world_chunk_ptr_block_array *Arr, world_chunk_ptr_block_array_index Index) { - world_chunk_ptr *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + world_chunk_ptr Result = {}; + if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } return Result; } -link_internal world_chunk_ptr * +link_internal world_chunk_ptr GetPtr(world_chunk_ptr_block *Block, umm Index) { - world_chunk_ptr *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + world_chunk_ptr Result = {}; + if (Index < Block->At) { Result = *(Block->Elements + Index); } return Result; } -link_internal world_chunk_ptr * +link_internal world_chunk_ptr GetPtr(world_chunk_ptr_block_array *Arr, umm Index) { umm BlockIndex = Index / 32; @@ -147,11 +189,11 @@ GetPtr(world_chunk_ptr_block_array *Arr, umm Index) Block = Block->Next; } - world_chunk_ptr *Result = Block->Elements+ElementIndex; + world_chunk_ptr Result = *(Block->Elements+ElementIndex); return Result; } -link_internal world_chunk_ptr * +link_internal world_chunk_ptr TryGetPtr(world_chunk_ptr_block_array *Arr, umm Index) { umm BlockIndex = Index / 32; @@ -159,7 +201,7 @@ TryGetPtr(world_chunk_ptr_block_array *Arr, umm Index) auto AtE = AtElements(Arr); umm Total = GetIndex(&AtE); - world_chunk_ptr *Result = {}; + world_chunk_ptr Result = {}; if (Index < Total) { Result = GetPtr(Arr, Index); } return Result; } diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index f82124602..0e4c0ec91 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -1,5 +1,9 @@ // src/engine/bonsai_type_info.h:11:0 + + + + struct member_info_block { u32 Index; @@ -23,10 +27,34 @@ struct member_info_block_array }; +link_internal b32 +AreEqual(member_info_block_array_index *Thing1, member_info_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( member_info_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(member_info_block_array_index Thing1, member_info_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( member_info_block_array_index ) ); + + return Result; +} + + typedef member_info_block_array member_info_paged_list; link_internal member_info_block_array_index -operator++(member_info_block_array_index &I0) +operator++( member_info_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(member_info_block_array_index &I0) } link_internal b32 -operator<(member_info_block_array_index I0, member_info_block_array_index I1) +operator<( member_info_block_array_index I0, member_info_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(member_info_block_array_index *Index) +GetIndex( member_info_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal member_info_block_array_index -ZerothIndex(member_info_block_array *Arr) +ZerothIndex( member_info_block_array *Arr) { member_info_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(member_info_block_array *Arr) +TotalElements( member_info_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(member_info_block_array *Arr) } link_internal member_info_block_array_index -LastIndex(member_info_block_array *Arr) +LastIndex( member_info_block_array *Arr) { member_info_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(member_info_block_array *Arr) } link_internal member_info_block_array_index -AtElements(member_info_block_array *Arr) +AtElements( member_info_block_array *Arr) { member_info_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(member_info_block_array *Arr) } link_internal umm -Count(member_info_block_array *Arr) +Count( member_info_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal member_info * +Set( member_info_block_array *Arr, + member_info *Element, + member_info_block_array_index Index ) +{ + member_info *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal member_info * GetPtr(member_info_block_array *Arr, member_info_block_array_index Index) { member_info *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal member_info * GetPtr(member_info_block *Block, umm Index) { - member_info *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + member_info *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(member_info_block_array *Arr, umm Index) Block = Block->Next; } - member_info *Result = Block->Elements+ElementIndex; + member_info *Result = (Block->Elements+ElementIndex); return Result; } @@ -204,7 +246,7 @@ RemoveUnordered( member_info_block_array *Array, member_info_block_array_index I member_info *Element = GetPtr(Array, Index); member_info *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -246,7 +288,7 @@ Find( member_info_block_array *Array, member_info *Query) member_info_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( member_info_block_array *Array, member_info *Query) link_internal b32 IsValid(member_info_block_array_index *Index) { - NotImplemented; member_info_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index cf0b4b466..4b04a7c6f 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -1,5 +1,9 @@ // src/engine/model.h:94:0 + + + + struct model_block { u32 Index; @@ -23,10 +27,34 @@ struct model_block_array }; +link_internal b32 +AreEqual(model_block_array_index *Thing1, model_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( model_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(model_block_array_index Thing1, model_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( model_block_array_index ) ); + + return Result; +} + + typedef model_block_array model_paged_list; link_internal model_block_array_index -operator++(model_block_array_index &I0) +operator++( model_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(model_block_array_index &I0) } link_internal b32 -operator<(model_block_array_index I0, model_block_array_index I1) +operator<( model_block_array_index I0, model_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(model_block_array_index *Index) +GetIndex( model_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal model_block_array_index -ZerothIndex(model_block_array *Arr) +ZerothIndex( model_block_array *Arr) { model_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(model_block_array *Arr) +TotalElements( model_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(model_block_array *Arr) } link_internal model_block_array_index -LastIndex(model_block_array *Arr) +LastIndex( model_block_array *Arr) { model_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(model_block_array *Arr) } link_internal model_block_array_index -AtElements(model_block_array *Arr) +AtElements( model_block_array *Arr) { model_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(model_block_array *Arr) } link_internal umm -Count(model_block_array *Arr) +Count( model_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal model * +Set( model_block_array *Arr, + model *Element, + model_block_array_index Index ) +{ + model *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal model * GetPtr(model_block_array *Arr, model_block_array_index Index) { model *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal model * GetPtr(model_block *Block, umm Index) { - model *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + model *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(model_block_array *Arr, umm Index) Block = Block->Next; } - model *Result = Block->Elements+ElementIndex; + model *Result = (Block->Elements+ElementIndex); return Result; } @@ -204,7 +246,7 @@ RemoveUnordered( model_block_array *Array, model_block_array_index Index) model *Element = GetPtr(Array, Index); model *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -246,7 +288,7 @@ Find( model_block_array *Array, model *Query) model_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( model_block_array *Array, model *Query) link_internal b32 IsValid(model_block_array_index *Index) { - NotImplemented; model_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index fc2748551..6af4ebf39 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -1,4 +1,8 @@ -// src/engine/world.h:57:0 +// src/engine/world.h:58:0 + + + + struct octree_node_ptr_block { @@ -23,10 +27,34 @@ struct octree_node_ptr_block_array }; +link_internal b32 +AreEqual(octree_node_ptr_block_array_index *Thing1, octree_node_ptr_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( octree_node_ptr_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(octree_node_ptr_block_array_index Thing1, octree_node_ptr_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( octree_node_ptr_block_array_index ) ); + + return Result; +} + + typedef octree_node_ptr_block_array octree_node_ptr_paged_list; link_internal octree_node_ptr_block_array_index -operator++(octree_node_ptr_block_array_index &I0) +operator++( octree_node_ptr_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(octree_node_ptr_block_array_index &I0) } link_internal b32 -operator<(octree_node_ptr_block_array_index I0, octree_node_ptr_block_array_index I1) +operator<( octree_node_ptr_block_array_index I0, octree_node_ptr_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(octree_node_ptr_block_array_index *Index) +GetIndex( octree_node_ptr_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal octree_node_ptr_block_array_index -ZerothIndex(octree_node_ptr_block_array *Arr) +ZerothIndex( octree_node_ptr_block_array *Arr) { octree_node_ptr_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(octree_node_ptr_block_array *Arr) +TotalElements( octree_node_ptr_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(octree_node_ptr_block_array *Arr) } link_internal octree_node_ptr_block_array_index -LastIndex(octree_node_ptr_block_array *Arr) +LastIndex( octree_node_ptr_block_array *Arr) { octree_node_ptr_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(octree_node_ptr_block_array *Arr) } link_internal octree_node_ptr_block_array_index -AtElements(octree_node_ptr_block_array *Arr) +AtElements( octree_node_ptr_block_array *Arr) { octree_node_ptr_block_array_index Result = {}; if (Arr->Current) @@ -111,30 +138,45 @@ AtElements(octree_node_ptr_block_array *Arr) } link_internal umm -Count(octree_node_ptr_block_array *Arr) +Count( octree_node_ptr_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } -link_internal octree_node_ptr * +link_internal octree_node_ptr +Set( octree_node_ptr_block_array *Arr, + octree_node_ptr Element, + octree_node_ptr_block_array_index Index ) +{ + octree_node_ptr Result = {}; + if (Index.Block) + { + Result = Index.Block->Elements[Index.ElementIndex]; + Result = Element; + } + + return Result; +} + +link_internal octree_node_ptr GetPtr(octree_node_ptr_block_array *Arr, octree_node_ptr_block_array_index Index) { - octree_node_ptr *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + octree_node_ptr Result = {}; + if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } return Result; } -link_internal octree_node_ptr * +link_internal octree_node_ptr GetPtr(octree_node_ptr_block *Block, umm Index) { - octree_node_ptr *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + octree_node_ptr Result = {}; + if (Index < Block->At) { Result = *(Block->Elements + Index); } return Result; } -link_internal octree_node_ptr * +link_internal octree_node_ptr GetPtr(octree_node_ptr_block_array *Arr, umm Index) { umm BlockIndex = Index / 8; @@ -147,11 +189,11 @@ GetPtr(octree_node_ptr_block_array *Arr, umm Index) Block = Block->Next; } - octree_node_ptr *Result = Block->Elements+ElementIndex; + octree_node_ptr Result = *(Block->Elements+ElementIndex); return Result; } -link_internal octree_node_ptr * +link_internal octree_node_ptr TryGetPtr(octree_node_ptr_block_array *Arr, umm Index) { umm BlockIndex = Index / 8; @@ -159,7 +201,7 @@ TryGetPtr(octree_node_ptr_block_array *Arr, umm Index) auto AtE = AtElements(Arr); umm Total = GetIndex(&AtE); - octree_node_ptr *Result = {}; + octree_node_ptr Result = {}; if (Index < Total) { Result = GetPtr(Arr, Index); } return Result; } @@ -201,10 +243,10 @@ RemoveUnordered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array { octree_node_ptr_block_array_index LastI = LastIndex(Array); - octree_node_ptr *Element = GetPtr(Array, Index); - octree_node_ptr *LastElement = GetPtr(Array, LastI); + octree_node_ptr Element = GetPtr(Array, Index); + octree_node_ptr LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -241,12 +283,12 @@ RemoveUnordered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array } link_internal octree_node_ptr_block_array_index -Find( octree_node_ptr_block_array *Array, octree_node_ptr *Query) +Find( octree_node_ptr_block_array *Array, octree_node_ptr Query) { octree_node_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( octree_node_ptr_block_array *Array, octree_node_ptr *Query) link_internal b32 IsValid(octree_node_ptr_block_array_index *Index) { - NotImplemented; octree_node_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 1487ecfe8..9051d296d 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -1,4 +1,8 @@ -// src/engine/world.h:60:0 +// src/engine/world.h:61:0 + + + + struct picked_octree_node_block { @@ -23,10 +27,34 @@ struct picked_octree_node_block_array }; +link_internal b32 +AreEqual(picked_octree_node_block_array_index *Thing1, picked_octree_node_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( picked_octree_node_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(picked_octree_node_block_array_index Thing1, picked_octree_node_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( picked_octree_node_block_array_index ) ); + + return Result; +} + + typedef picked_octree_node_block_array picked_octree_node_paged_list; link_internal picked_octree_node_block_array_index -operator++(picked_octree_node_block_array_index &I0) +operator++( picked_octree_node_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(picked_octree_node_block_array_index &I0) } link_internal b32 -operator<(picked_octree_node_block_array_index I0, picked_octree_node_block_array_index I1) +operator<( picked_octree_node_block_array_index I0, picked_octree_node_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(picked_octree_node_block_array_index *Index) +GetIndex( picked_octree_node_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal picked_octree_node_block_array_index -ZerothIndex(picked_octree_node_block_array *Arr) +ZerothIndex( picked_octree_node_block_array *Arr) { picked_octree_node_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(picked_octree_node_block_array *Arr) +TotalElements( picked_octree_node_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(picked_octree_node_block_array *Arr) } link_internal picked_octree_node_block_array_index -LastIndex(picked_octree_node_block_array *Arr) +LastIndex( picked_octree_node_block_array *Arr) { picked_octree_node_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(picked_octree_node_block_array *Arr) } link_internal picked_octree_node_block_array_index -AtElements(picked_octree_node_block_array *Arr) +AtElements( picked_octree_node_block_array *Arr) { picked_octree_node_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(picked_octree_node_block_array *Arr) } link_internal umm -Count(picked_octree_node_block_array *Arr) +Count( picked_octree_node_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal picked_octree_node * +Set( picked_octree_node_block_array *Arr, + picked_octree_node *Element, + picked_octree_node_block_array_index Index ) +{ + picked_octree_node *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal picked_octree_node * GetPtr(picked_octree_node_block_array *Arr, picked_octree_node_block_array_index Index) { picked_octree_node *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal picked_octree_node * GetPtr(picked_octree_node_block *Block, umm Index) { - picked_octree_node *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + picked_octree_node *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(picked_octree_node_block_array *Arr, umm Index) Block = Block->Next; } - picked_octree_node *Result = Block->Elements+ElementIndex; + picked_octree_node *Result = (Block->Elements+ElementIndex); return Result; } @@ -204,7 +246,7 @@ RemoveUnordered( picked_octree_node_block_array *Array, picked_octree_node_block picked_octree_node *Element = GetPtr(Array, Index); picked_octree_node *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -246,7 +288,7 @@ Find( picked_octree_node_block_array *Array, picked_octree_node *Query) picked_octree_node_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( picked_octree_node_block_array *Array, picked_octree_node *Query) link_internal b32 IsValid(picked_octree_node_block_array_index *Index) { - NotImplemented; picked_octree_node_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 3e6b85d04..be1503675 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,5 +1,9 @@ // src/engine/world_chunk.h:492:0 + + + + struct standing_spot_block { u32 Index; @@ -23,10 +27,34 @@ struct standing_spot_block_array }; +link_internal b32 +AreEqual(standing_spot_block_array_index *Thing1, standing_spot_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( standing_spot_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(standing_spot_block_array_index Thing1, standing_spot_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( standing_spot_block_array_index ) ); + + return Result; +} + + typedef standing_spot_block_array standing_spot_paged_list; link_internal standing_spot_block_array_index -operator++(standing_spot_block_array_index &I0) +operator++( standing_spot_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(standing_spot_block_array_index &I0) } link_internal b32 -operator<(standing_spot_block_array_index I0, standing_spot_block_array_index I1) +operator<( standing_spot_block_array_index I0, standing_spot_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(standing_spot_block_array_index *Index) +GetIndex( standing_spot_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal standing_spot_block_array_index -ZerothIndex(standing_spot_block_array *Arr) +ZerothIndex( standing_spot_block_array *Arr) { standing_spot_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(standing_spot_block_array *Arr) +TotalElements( standing_spot_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(standing_spot_block_array *Arr) } link_internal standing_spot_block_array_index -LastIndex(standing_spot_block_array *Arr) +LastIndex( standing_spot_block_array *Arr) { standing_spot_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(standing_spot_block_array *Arr) } link_internal standing_spot_block_array_index -AtElements(standing_spot_block_array *Arr) +AtElements( standing_spot_block_array *Arr) { standing_spot_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(standing_spot_block_array *Arr) } link_internal umm -Count(standing_spot_block_array *Arr) +Count( standing_spot_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal standing_spot * +Set( standing_spot_block_array *Arr, + standing_spot *Element, + standing_spot_block_array_index Index ) +{ + standing_spot *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal standing_spot * GetPtr(standing_spot_block_array *Arr, standing_spot_block_array_index Index) { standing_spot *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal standing_spot * GetPtr(standing_spot_block *Block, umm Index) { - standing_spot *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + standing_spot *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(standing_spot_block_array *Arr, umm Index) Block = Block->Next; } - standing_spot *Result = Block->Elements+ElementIndex; + standing_spot *Result = (Block->Elements+ElementIndex); return Result; } @@ -204,7 +246,7 @@ RemoveUnordered( standing_spot_block_array *Array, standing_spot_block_array_ind standing_spot *Element = GetPtr(Array, Index); standing_spot *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -246,7 +288,7 @@ Find( standing_spot_block_array *Array, standing_spot *Query) standing_spot_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( standing_spot_block_array *Array, standing_spot *Query) link_internal b32 IsValid(standing_spot_block_array_index *Index) { - NotImplemented; standing_spot_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index d3ee87004..d3192c38b 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -31,10 +31,10 @@ RemoveUnordered( texture_ptr_block_array *Array, texture_ptr_block_array_index I { texture_ptr_block_array_index LastI = LastIndex(Array); - texture_ptr *Element = GetPtr(Array, Index); - texture_ptr *LastElement = GetPtr(Array, LastI); + texture_ptr Element = GetPtr(Array, Index); + texture_ptr LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -71,12 +71,12 @@ RemoveUnordered( texture_ptr_block_array *Array, texture_ptr_block_array_index I } link_internal texture_ptr_block_array_index -Find( texture_ptr_block_array *Array, texture_ptr *Query) +Find( texture_ptr_block_array *Array, texture_ptr Query) { texture_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -88,10 +88,9 @@ Find( texture_ptr_block_array *Array, texture_ptr *Query) link_internal b32 IsValid(texture_ptr_block_array_index *Index) { - NotImplemented; texture_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index 0d1b27341..bb3e6e770 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -1,5 +1,9 @@ // src/engine/model.h:88:0 + + + + struct vox_data_block { u32 Index; @@ -23,10 +27,34 @@ struct vox_data_block_array }; +link_internal b32 +AreEqual(vox_data_block_array_index *Thing1, vox_data_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( vox_data_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(vox_data_block_array_index Thing1, vox_data_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( vox_data_block_array_index ) ); + + return Result; +} + + typedef vox_data_block_array vox_data_paged_list; link_internal vox_data_block_array_index -operator++(vox_data_block_array_index &I0) +operator++( vox_data_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(vox_data_block_array_index &I0) } link_internal b32 -operator<(vox_data_block_array_index I0, vox_data_block_array_index I1) +operator<( vox_data_block_array_index I0, vox_data_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(vox_data_block_array_index *Index) +GetIndex( vox_data_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal vox_data_block_array_index -ZerothIndex(vox_data_block_array *Arr) +ZerothIndex( vox_data_block_array *Arr) { vox_data_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(vox_data_block_array *Arr) +TotalElements( vox_data_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(vox_data_block_array *Arr) } link_internal vox_data_block_array_index -LastIndex(vox_data_block_array *Arr) +LastIndex( vox_data_block_array *Arr) { vox_data_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(vox_data_block_array *Arr) } link_internal vox_data_block_array_index -AtElements(vox_data_block_array *Arr) +AtElements( vox_data_block_array *Arr) { vox_data_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(vox_data_block_array *Arr) } link_internal umm -Count(vox_data_block_array *Arr) +Count( vox_data_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal vox_data * +Set( vox_data_block_array *Arr, + vox_data *Element, + vox_data_block_array_index Index ) +{ + vox_data *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal vox_data * GetPtr(vox_data_block_array *Arr, vox_data_block_array_index Index) { vox_data *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal vox_data * GetPtr(vox_data_block *Block, umm Index) { - vox_data *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + vox_data *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(vox_data_block_array *Arr, umm Index) Block = Block->Next; } - vox_data *Result = Block->Elements+ElementIndex; + vox_data *Result = (Block->Elements+ElementIndex); return Result; } @@ -204,7 +246,7 @@ RemoveUnordered( vox_data_block_array *Array, vox_data_block_array_index Index) vox_data *Element = GetPtr(Array, Index); vox_data *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -246,7 +288,7 @@ Find( vox_data_block_array *Array, vox_data *Query) vox_data_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( vox_data_block_array *Array, vox_data *Query) link_internal b32 IsValid(vox_data_block_array_index *Index) { - NotImplemented; vox_data_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index 8c3800287..99dc4b56c 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -1,5 +1,9 @@ // src/engine/world_update.h:35:0 + + + + struct voxel_stack_element_block { u32 Index; @@ -23,10 +27,34 @@ struct voxel_stack_element_block_array }; +link_internal b32 +AreEqual(voxel_stack_element_block_array_index *Thing1, voxel_stack_element_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( voxel_stack_element_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(voxel_stack_element_block_array_index Thing1, voxel_stack_element_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( voxel_stack_element_block_array_index ) ); + + return Result; +} + + typedef voxel_stack_element_block_array voxel_stack_element_paged_list; link_internal voxel_stack_element_block_array_index -operator++(voxel_stack_element_block_array_index &I0) +operator++( voxel_stack_element_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(voxel_stack_element_block_array_index &I0) } link_internal b32 -operator<(voxel_stack_element_block_array_index I0, voxel_stack_element_block_array_index I1) +operator<( voxel_stack_element_block_array_index I0, voxel_stack_element_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(voxel_stack_element_block_array_index *Index) +GetIndex( voxel_stack_element_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal voxel_stack_element_block_array_index -ZerothIndex(voxel_stack_element_block_array *Arr) +ZerothIndex( voxel_stack_element_block_array *Arr) { voxel_stack_element_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(voxel_stack_element_block_array *Arr) +TotalElements( voxel_stack_element_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(voxel_stack_element_block_array *Arr) } link_internal voxel_stack_element_block_array_index -LastIndex(voxel_stack_element_block_array *Arr) +LastIndex( voxel_stack_element_block_array *Arr) { voxel_stack_element_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(voxel_stack_element_block_array *Arr) } link_internal voxel_stack_element_block_array_index -AtElements(voxel_stack_element_block_array *Arr) +AtElements( voxel_stack_element_block_array *Arr) { voxel_stack_element_block_array_index Result = {}; if (Arr->Current) @@ -111,26 +138,41 @@ AtElements(voxel_stack_element_block_array *Arr) } link_internal umm -Count(voxel_stack_element_block_array *Arr) +Count( voxel_stack_element_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } +link_internal voxel_stack_element * +Set( voxel_stack_element_block_array *Arr, + voxel_stack_element *Element, + voxel_stack_element_block_array_index Index ) +{ + voxel_stack_element *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + link_internal voxel_stack_element * GetPtr(voxel_stack_element_block_array *Arr, voxel_stack_element_block_array_index Index) { voxel_stack_element *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } return Result; } link_internal voxel_stack_element * GetPtr(voxel_stack_element_block *Block, umm Index) { - voxel_stack_element *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + voxel_stack_element *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } return Result; } @@ -147,7 +189,7 @@ GetPtr(voxel_stack_element_block_array *Arr, umm Index) Block = Block->Next; } - voxel_stack_element *Result = Block->Elements+ElementIndex; + voxel_stack_element *Result = (Block->Elements+ElementIndex); return Result; } @@ -204,7 +246,7 @@ RemoveUnordered( voxel_stack_element_block_array *Array, voxel_stack_element_blo voxel_stack_element *Element = GetPtr(Array, Index); voxel_stack_element *LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -246,7 +288,7 @@ Find( voxel_stack_element_block_array *Array, voxel_stack_element *Query) voxel_stack_element_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( voxel_stack_element_block_array *Array, voxel_stack_element *Query) link_internal b32 IsValid(voxel_stack_element_block_array_index *Index) { - NotImplemented; voxel_stack_element_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index 0a0254a84..c8ac362bb 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -31,10 +31,10 @@ RemoveUnordered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array { world_chunk_ptr_block_array_index LastI = LastIndex(Array); - world_chunk_ptr *Element = GetPtr(Array, Index); - world_chunk_ptr *LastElement = GetPtr(Array, LastI); + world_chunk_ptr Element = GetPtr(Array, Index); + world_chunk_ptr LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -71,12 +71,12 @@ RemoveUnordered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array } link_internal world_chunk_ptr_block_array_index -Find( world_chunk_ptr_block_array *Array, world_chunk_ptr *Query) +Find( world_chunk_ptr_block_array *Array, world_chunk_ptr Query) { world_chunk_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -88,10 +88,9 @@ Find( world_chunk_ptr_block_array *Array, world_chunk_ptr *Query) link_internal b32 IsValid(world_chunk_ptr_block_array_index *Index) { - NotImplemented; world_chunk_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 823f34882..814823d54 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,8 @@ -// src/engine/editor.h:1164:0 +// src/engine/editor.h:1168:0 + + + + struct world_edit_ptr_block { @@ -23,10 +27,34 @@ struct world_edit_ptr_block_array }; +link_internal b32 +AreEqual(world_edit_ptr_block_array_index *Thing1, world_edit_ptr_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( world_edit_ptr_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(world_edit_ptr_block_array_index Thing1, world_edit_ptr_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( world_edit_ptr_block_array_index ) ); + + return Result; +} + + typedef world_edit_ptr_block_array world_edit_ptr_paged_list; link_internal world_edit_ptr_block_array_index -operator++(world_edit_ptr_block_array_index &I0) +operator++( world_edit_ptr_block_array_index &I0 ) { if (I0.Block) { @@ -49,30 +77,29 @@ operator++(world_edit_ptr_block_array_index &I0) } link_internal b32 -operator<(world_edit_ptr_block_array_index I0, world_edit_ptr_block_array_index I1) +operator<( world_edit_ptr_block_array_index I0, world_edit_ptr_block_array_index I1 ) { b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); return Result; } link_inline umm -GetIndex(world_edit_ptr_block_array_index *Index) +GetIndex( world_edit_ptr_block_array_index *Index) { umm Result = Index->ElementIndex + (Index->BlockIndex*8); return Result; } link_internal world_edit_ptr_block_array_index -ZerothIndex(world_edit_ptr_block_array *Arr) +ZerothIndex( world_edit_ptr_block_array *Arr) { world_edit_ptr_block_array_index Result = {}; Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ return Result; } link_internal umm -TotalElements(world_edit_ptr_block_array *Arr) +TotalElements( world_edit_ptr_block_array *Arr) { umm Result = 0; if (Arr->Current) @@ -83,7 +110,7 @@ TotalElements(world_edit_ptr_block_array *Arr) } link_internal world_edit_ptr_block_array_index -LastIndex(world_edit_ptr_block_array *Arr) +LastIndex( world_edit_ptr_block_array *Arr) { world_edit_ptr_block_array_index Result = {}; if (Arr->Current) @@ -98,7 +125,7 @@ LastIndex(world_edit_ptr_block_array *Arr) } link_internal world_edit_ptr_block_array_index -AtElements(world_edit_ptr_block_array *Arr) +AtElements( world_edit_ptr_block_array *Arr) { world_edit_ptr_block_array_index Result = {}; if (Arr->Current) @@ -111,30 +138,45 @@ AtElements(world_edit_ptr_block_array *Arr) } link_internal umm -Count(world_edit_ptr_block_array *Arr) +Count( world_edit_ptr_block_array *Arr) { auto Index = AtElements(Arr); umm Result = GetIndex(&Index); return Result; } -link_internal world_edit_ptr * +link_internal world_edit_ptr +Set( world_edit_ptr_block_array *Arr, + world_edit_ptr Element, + world_edit_ptr_block_array_index Index ) +{ + world_edit_ptr Result = {}; + if (Index.Block) + { + Result = Index.Block->Elements[Index.ElementIndex]; + Result = Element; + } + + return Result; +} + +link_internal world_edit_ptr GetPtr(world_edit_ptr_block_array *Arr, world_edit_ptr_block_array_index Index) { - world_edit_ptr *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } + world_edit_ptr Result = {}; + if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } return Result; } -link_internal world_edit_ptr * +link_internal world_edit_ptr GetPtr(world_edit_ptr_block *Block, umm Index) { - world_edit_ptr *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } + world_edit_ptr Result = {}; + if (Index < Block->At) { Result = *(Block->Elements + Index); } return Result; } -link_internal world_edit_ptr * +link_internal world_edit_ptr GetPtr(world_edit_ptr_block_array *Arr, umm Index) { umm BlockIndex = Index / 8; @@ -147,11 +189,11 @@ GetPtr(world_edit_ptr_block_array *Arr, umm Index) Block = Block->Next; } - world_edit_ptr *Result = Block->Elements+ElementIndex; + world_edit_ptr Result = *(Block->Elements+ElementIndex); return Result; } -link_internal world_edit_ptr * +link_internal world_edit_ptr TryGetPtr(world_edit_ptr_block_array *Arr, umm Index) { umm BlockIndex = Index / 8; @@ -159,7 +201,7 @@ TryGetPtr(world_edit_ptr_block_array *Arr, umm Index) auto AtE = AtElements(Arr); umm Total = GetIndex(&AtE); - world_edit_ptr *Result = {}; + world_edit_ptr Result = {}; if (Index < Total) { Result = GetPtr(Arr, Index); } return Result; } @@ -201,10 +243,10 @@ RemoveUnordered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_i { world_edit_ptr_block_array_index LastI = LastIndex(Array); - world_edit_ptr *Element = GetPtr(Array, Index); - world_edit_ptr *LastElement = GetPtr(Array, LastI); + world_edit_ptr Element = GetPtr(Array, Index); + world_edit_ptr LastElement = GetPtr(Array, LastI); - *Element = *LastElement; + Set(Array, LastElement, Index); Assert(Array->Current->At); Array->Current->At -= 1; @@ -241,12 +283,12 @@ RemoveUnordered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_i } link_internal world_edit_ptr_block_array_index -Find( world_edit_ptr_block_array *Array, world_edit_ptr *Query) +Find( world_edit_ptr_block_array *Array, world_edit_ptr Query) { world_edit_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; IterateOver(Array, E, Index) { - if (E == Query) + if ( E == Query) { Result = Index; break; @@ -258,10 +300,9 @@ Find( world_edit_ptr_block_array *Array, world_edit_ptr *Query) link_internal b32 IsValid(world_edit_ptr_block_array_index *Index) { - NotImplemented; world_edit_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - /* b32 Result = AreEqual(*Index, Test); */ - b32 Result = False; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ return Result; } diff --git a/generated/buffer_octree_node_ptr.h b/generated/buffer_octree_node_ptr.h index aa082c8e6..203f86bde 100644 --- a/generated/buffer_octree_node_ptr.h +++ b/generated/buffer_octree_node_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world.h:34:0 +// src/engine/world.h:35:0 struct octree_node_ptr_buffer { diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 974d03c23..04d0c83ae 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:995:0 +// src/engine/editor.h:997:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index 66bdde115..e31de93a4 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:988:0 +// src/engine/editor.h:990:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index a0608f02d..f83d8dc15 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:981:0 +// src/engine/editor.h:983:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_layered_brush_0.h b/generated/default_marshal_layered_brush_0.h index 9c7b2870c..0ffff0860 100644 --- a/generated/default_marshal_layered_brush_0.h +++ b/generated/default_marshal_layered_brush_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1093:0 +// src/engine/editor.h:1095:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_layered_brush_1.h b/generated/default_marshal_layered_brush_1.h index 7f9b4b065..8958a6ef7 100644 --- a/generated/default_marshal_layered_brush_1.h +++ b/generated/default_marshal_layered_brush_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1086:0 +// src/engine/editor.h:1088:0 RangeIterator(Index, (256)) { diff --git a/generated/default_marshal_layered_brush_2.h b/generated/default_marshal_layered_brush_2.h index 504e7ae60..4c6180d6f 100644 --- a/generated/default_marshal_layered_brush_2.h +++ b/generated/default_marshal_layered_brush_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1079:0 +// src/engine/editor.h:1081:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index b1700a422..b445bd58b 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:859:0 +// src/engine/editor.h:861:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index da47d5a57..190c2809d 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:535:0 +// src/engine/editor.h:537:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index d8ff63b6b..60402e204 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:532:0 +// src/engine/editor.h:534:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index 554047f7b..d8bb86216 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:520:0 +// src/engine/editor.h:522:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index e9c9cdbb9..aea143120 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:526:0 +// src/engine/editor.h:528:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 826c65f1b..f913ffc1b 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:523:0 +// src/engine/editor.h:525:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_world_edit_brush.h index 5c8034a6c..fd1a130d1 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:796:0 +// src/engine/editor.h:798:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 4614447c2..2007e36b1 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:517:0 +// src/engine/editor.h:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index a82c13d03..51a4b244d 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:512:0 +// src/engine/editor.h:514:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 41db6bc39..cd91f87ea 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:564:0 +// src/engine/editor.h:566:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 8d08c9bd4..c2cfd56ea 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:700:0 +// src/engine/editor.h:702:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 93780d181..9e03fb4a4 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:873:0 +// src/engine/editor.h:875:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 15368f8e8..df2afbc87 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:714:0 +// src/engine/editor.h:716:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_mode.h index 15567b7c9..5bfe959bd 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:708:0 +// src/engine/editor.h:710:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h index cebb317e0..a933775b1 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:687:0 +// src/engine/editor.h:689:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_mode_modifier Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index b866be386..5db1ca939 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:711:0 +// src/engine/editor.h:713:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index 859a4c24e..b2bd1a286 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:387:0 +// src/engine/editor.h:389:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index 4de56d340..f5977f198 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:499:0 +// src/engine/editor.h:501:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index d5501a1ce..4c96961c5 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -212,6 +212,10 @@ + + + + @@ -722,6 +726,10 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 47bedf4e4..abe1bacaf 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -212,6 +212,10 @@ + + + + @@ -712,6 +716,10 @@ render_to_texture_async_params render_to_texture_async_params; + + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index aba8c0840..3c756f314 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -212,6 +212,10 @@ + + + + @@ -712,6 +716,10 @@ type_render_to_texture_async_params, + + + + diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index 944a16797..9f88ccb4b 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:48:0 +// src/engine/world.h:49:0 struct octree_node_freelist { diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h index 501e30fd6..cb1b13ab8 100644 --- a/generated/freelist_allocator_world_chunk.h +++ b/generated/freelist_allocator_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/world.h:51:0 +// src/engine/world.h:52:0 struct world_chunk_freelist { diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index d56e7c0e0..a05f53469 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:249:0 +// external/bonsai_stdlib/src/shader.cpp:248:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, m4 *Value) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index d5e18ac23..23e67f3fe 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:264:0 +// external/bonsai_stdlib/src/shader.cpp:263:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, r32 *Value) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index d7c4ca5b5..5520fa80e 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:261:0 +// external/bonsai_stdlib/src/shader.cpp:260:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, s32 *Value) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index 75e4a9150..9cf099052 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:246:0 +// external/bonsai_stdlib/src/shader.cpp:245:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, texture *Value) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index fde28c3bf..4c5f123cc 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:258:0 +// external/bonsai_stdlib/src/shader.cpp:257:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, u32 *Value) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index 8c1c55e32..85f84ab50 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:252:0 +// external/bonsai_stdlib/src/shader.cpp:251:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, v2 *Value) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index f26492a9c..cc2d1f256 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:255:0 +// external/bonsai_stdlib/src/shader.cpp:254:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, v3 *Value) diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index ee2a2c565..98de096d4 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:54:0 +// src/engine/world.h:55:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index 1081f28f2..b70da45e0 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:45:0 +// src/engine/world.h:46:0 struct octree_node_ptr_stack { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 3326b04f3..19cede94b 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:550:0 +// src/engine/editor.h:552:0 link_internal ui_toggle_button_group RadioButtonGroup_level_editor_flags( renderer_2d *Ui, diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 99e3d273a..9f7d65558 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:562:0 +// src/engine/editor.h:564:0 link_internal ui_toggle_button_group RadioButtonGroup_ui_noise_type( renderer_2d *Ui, diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 27081c46c..0e042f16f 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:515:0 +// src/engine/editor.h:517:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index 8f93653fe..5c2b7b87c 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:510:0 +// src/engine/editor.h:512:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index fe7f8421e..536d8d93f 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:823:0 +// src/engine/editor.h:825:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index e77ba9e6f..9ae3a64ff 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:560:0 +// src/engine/editor.h:562:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_mode.h b/generated/string_and_value_tables_world_edit_mode.h index 26d06e379..1d7d7cd37 100644 --- a/generated/string_and_value_tables_world_edit_mode.h +++ b/generated/string_and_value_tables_world_edit_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:703:0 +// src/engine/editor.h:705:0 link_internal counted_string ToStringPrefixless(world_edit_mode Type) diff --git a/generated/string_and_value_tables_world_edit_mode_modifier.h b/generated/string_and_value_tables_world_edit_mode_modifier.h index 90c8271e7..aae2b13b4 100644 --- a/generated/string_and_value_tables_world_edit_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:690:0 +// src/engine/editor.h:692:0 link_internal counted_string ToStringPrefixless(world_edit_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 71de4c200..e4d0ee797 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:594:0 +// src/engine/editor.h:596:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/string_and_value_tables_world_update_op_shape_type.h b/generated/string_and_value_tables_world_update_op_shape_type.h index c40c879b0..d1023235e 100644 --- a/generated/string_and_value_tables_world_update_op_shape_type.h +++ b/generated/string_and_value_tables_world_update_op_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:736:0 +// src/engine/editor.h:738:0 link_internal counted_string ToStringPrefixless(world_update_op_shape_type Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 1a06cbeb6..04f35ac32 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:695:0 +// src/engine/editor.h:697:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/jesse.make.sh b/jesse.make.sh index dadaa4e2f..81197b57f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,7 +11,7 @@ ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ - # BuildExecutables \ + BuildExecutables \ # BuildTests \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ diff --git a/make.sh b/make.sh index 2375a3b21..0152d21cf 100755 --- a/make.sh +++ b/make.sh @@ -301,7 +301,7 @@ function RunPoofHelper { which poof > /dev/null 2>&1 if [ $? -eq 0 ]; then - cmd="poof -d $COLOR_FLAG -D POOF_PREPROCESSOR -D BONSAI_PREPROCESSOR -I src/ -I external/ $PLATFORM_DEFINES $BONSAI_INTERNAL -o generated $1 " + cmd="poof $COLOR_FLAG -D POOF_PREPROCESSOR -D BONSAI_PREPROCESSOR -I src/ -I external/ $PLATFORM_DEFINES $BONSAI_INTERNAL -o generated $1 " echo "$cmd" $cmd diff --git a/src/engine/debug.h b/src/engine/debug.h index 99981c829..5d9229516 100644 --- a/src/engine/debug.h +++ b/src/engine/debug.h @@ -40,6 +40,8 @@ enum engine_debug_view_mode poof(@bitfield) EngineDebugViewMode_EngineDebug = (1 << 7), }; +struct octree_node; + struct engine_debug { memory_arena *Memory; diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 1c743f471..d72cbba3a 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2237,18 +2237,17 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo { UNPACK_ENGINE_RESOURCES(Engine); + // First, gather the currently edited nodes and remove the edit { octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Edit->Region, &Nodes); - IterateOver(&Nodes, N, NodeIndex) + IterateOver(&Nodes, Node, NodeIndex) { - octree_node *Node = *N; - - auto Index = Find(Node->Edits, Edit); - Assert(IsValid(Index)); // There shouldn't be a node that doesn't contain the edit - RemoveUnordered(Node->Edits, Index); + auto Index = Find(&Node->Edits, Edit); + Assert(IsValid(&Index)); // There shouldn't be a node that doesn't contain the edit + RemoveUnordered(&Node->Edits, Index); } } @@ -2262,24 +2261,23 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Region, &Nodes); - IterateOver(&Nodes, N, NodeIndex) + IterateOver(&Nodes, Node, NodeIndex) { - octree_node *Node = *N; /* auto EditAABB = GetSimSpaceAABB(World, Node); */ /* random_series S = {u64(Node)}; */ /* v3 BaseColor = RandomV3Unilateral(&S); */ /* DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, 1.f); */ - // Shouldn't have this edit already attached .. - Assert( IsValid(Find(Node->Edits, Node)) == False ); + { + // Shouldn't have this edit already attached .. + world_edit_ptr_block_array_index Index = Find(&Node->Edits, Edit); + Assert( IsValid(&Index) == False ); + } - Push(&Node->Edits, Edit); + Push(&Node->Edits, &Edit); + QueueChunkForInit(&Plat->WorldUpdateQ, Node->Chunk, MeshBit_None); } } - - QueueChunkForInit(Plat->WorldUpdateQ, Node->Chunk, MeshBit_None); - - VaporizeArena(Nodes.Memory); } link_internal void @@ -2712,7 +2710,7 @@ DoWorldEditor(engine_resources *Engine) { if (Editor->CurrentEdit) { - UpdateWorldEdit(Engine, Editor->CurrentEdit, Editor->Selection.Region); + UpdateWorldEdit(Engine, Editor->CurrentEdit, Editor->Selection.Region, GetTranArena()); } } diff --git a/src/engine/editor.h b/src/engine/editor.h index a6b490df3..d3b8351b0 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1,3 +1,5 @@ +struct world; + #define EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS r32 MinValue = 0.f, r32 MaxValue = 1.f #define EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES MinValue, MaxValue @@ -1161,6 +1163,8 @@ struct world_edit typedef world_edit* world_edit_ptr; +poof(block_array(world_edit, {128})) +#include poof(block_array(world_edit_ptr, {128})) #include diff --git a/src/engine/engine.h b/src/engine/engine.h index 66640e223..215858e57 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -33,18 +33,18 @@ link_internal engine_resources *GetEngineResources(); #include #include +#include #include #include #include #include +#include +#include #include -#include #include -#include -#include #include #include #include diff --git a/src/engine/entity.cpp b/src/engine/entity.cpp index b3ab4e65d..274a74e25 100644 --- a/src/engine/entity.cpp +++ b/src/engine/entity.cpp @@ -95,9 +95,9 @@ GetCollision_Entities( world *World, entity *ThisEntity, cp TestP, v3 CollisionD { IterateOver(&(*Chunk)->Entities, Entity, EntityIndex) { - if (*Entity == ThisEntity) continue; + if (Entity == ThisEntity) continue; - Hit = GetCollision(World, *Entity, AABBMinDim(SimP, CollisionDim)); + Hit = GetCollision(World, Entity, AABBMinDim(SimP, CollisionDim)); if (Hit) break; } if (Hit) break; diff --git a/src/engine/entity.h b/src/engine/entity.h index a72562d60..d65119df0 100644 --- a/src/engine/entity.h +++ b/src/engine/entity.h @@ -247,7 +247,7 @@ DropEntityFromPreviouslyOccupiedChunks(world *World, entity *Entity, memory_aren b32 Got = False; IterateOver(&Chunk->Entities, TestEntity, TestEntityIndex) { - if (*TestEntity == Entity) + if (TestEntity == Entity) { RemoveUnordered(&Chunk->Entities, TestEntityIndex); Got = True; diff --git a/src/engine/render.cpp b/src/engine/render.cpp index 3fb38766d..e2bfbffac 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1540,9 +1540,8 @@ link_internal void RenderDrawList(engine_resources *Engine, world_chunk_ptr_paged_list *DrawList, shader *Shader) { UNPACK_ENGINE_RESOURCES(Engine); - IterateOver(DrawList, ChunkPtrPtr, ChunkIndex) + IterateOver(DrawList, Chunk, ChunkIndex) { - world_chunk *Chunk = *ChunkPtrPtr; // In case gpu meshes got deallocated after the chunk was added to the draw list if (HasGpuMesh(&Chunk->Mesh)) diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index c96d25ac1..e48f8bab8 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -547,6 +547,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TIMED_NAMED_BLOCK(CheckReadbackJobs); IterateOver(&Graphics->NoiseReadbackJobs, PBOJob, JobIndex) { + /* Info("0x%x 0x%x", PBOJob->PBOBuf.PBO, PBOJob->PBOBuf.Fence); */ u32 SyncStatus = GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); AssertNoGlErrors; switch(SyncStatus) diff --git a/src/engine/world.h b/src/engine/world.h index 0ed4ebe69..3c3cd48ba 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -7,6 +7,7 @@ enum octree_node_type OctreeNodeType_Leaf, // .. leaf }; +struct world_edit_ptr_block_array; struct octree_node { octree_node_type Type; diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 66af6dee3..459a363ec 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -68,7 +68,7 @@ WorldUpdateThread_Main(void *ThreadStartupParams) IterateOver(&UpdatedChunks, Chunk, ChunkIndex) { - QueueChunkForMeshRebuild(&Plat->LowPriority, *Chunk); + QueueChunkForMeshRebuild(&Plat->LowPriority, Chunk); } // NOTE(Jesse): This is intentionally after all the updates have completed From 105ad226099bb4922a8826484c06e5ae47a16d01 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 8 Feb 2025 12:58:18 -0700 Subject: [PATCH 147/421] Update stdlib --- external/bonsai_stdlib | 2 +- ...nonymous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- generated/anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/block_array_bitmap_688853862.h | 2 +- .../block_array_c_asset_thumbnail_688856411.h | 2 +- generated/block_array_c_gpu_timer_688735882.h | 2 +- generated/block_array_c_shader_ptr_688853971.h | 2 +- generated/block_array_c_texture_688856411.h | 2 +- generated/block_array_c_u32_688856411.h | 2 +- generated/block_array_c_u8_cursor_688856411.h | 2 +- ..._work_queue_entry_build_chunk_mesh_688853862.h | 2 +- generated/block_array_entity_688856407.h | 2 +- generated/block_array_entity_ptr_688856411.h | 2 +- .../block_array_file_traversal_node_688853862.h | 2 +- .../block_array_gpu_readback_buffer_688853862.h | 2 +- generated/block_array_member_info_688856411.h | 2 +- generated/block_array_model_688856411.h | 2 +- generated/block_array_octree_node_ptr_688853862.h | 2 +- .../block_array_picked_octree_node_688853862.h | 2 +- generated/block_array_standing_spot_688853862.h | 2 +- generated/block_array_texture_ptr_688856411.h | 2 +- generated/block_array_vox_data_688856411.h | 2 +- .../block_array_voxel_stack_element_688853862.h | 2 +- generated/block_array_world_chunk_ptr_688853862.h | 2 +- generated/block_array_world_edit_ptr_688735882.h | 2 +- generated/d_union_ui_render_command.h | 2 +- generated/generate_cursor_parser.h | 2 +- generated/generate_stream_c_token_buffer.h | 13 +++++++++---- generated/generate_stream_parser.h | 15 ++++++++++----- generated/generate_stream_standing_spot.h | 13 +++++++++---- ...generate_stream_tagged_counted_string_stream.h | 13 +++++++++---- generated/generate_stream_tuple_cs_cs.h | 13 +++++++++---- generated/generate_stream_u64.h | 13 +++++++++---- generated/generate_stream_v3i.h | 13 +++++++++---- .../generate_string_table_parse_error_code.h | 4 +++- generated/stream_and_cursor_counted_string.h | 13 +++++++++---- generated/stream_and_cursor_s32.h | 13 +++++++++---- generated/stream_and_cursor_u32.h | 13 +++++++++---- generated/to_hex_64_272205387.h | 2 +- 40 files changed, 123 insertions(+), 71 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 329aa5266..b7fd73dd7 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 329aa5266a79d58caffb28e6b2f8cdcfb16c8f5d +Subproject commit b7fd73dd76241ed9f300b5607202e27b566d3d8f diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index b3cb0d1fe..4911cf4e1 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2317:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2315:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 67c3681e0..5685963d5 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3297:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3295:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 086f3bdf6..4f656d7d2 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2270:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2268:0 case type_ui_render_command_window_start: { diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index 8a35439fc..da69bb202 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -309,7 +309,7 @@ IsValid(bitmap_block_array_index *Index) link_internal bitmap * Push( bitmap_block_array *Array, bitmap *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_bitmap_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index a8f7535d0..09b8a10cf 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -97,7 +97,7 @@ IsValid(asset_thumbnail_block_array_index *Index) link_internal asset_thumbnail * Push( asset_thumbnail_block_array *Array, asset_thumbnail *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_asset_thumbnail_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index 6a020276f..5ddab30b9 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -97,7 +97,7 @@ IsValid(gpu_timer_block_array_index *Index) link_internal gpu_timer * Push( gpu_timer_block_array *Array, gpu_timer *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_gpu_timer_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index f1a331e69..eae8c7b9e 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -97,7 +97,7 @@ IsValid(shader_ptr_block_array_index *Index) link_internal shader_ptr * Push( shader_ptr_block_array *Array, shader_ptr *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_shader_ptr_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index b5f8e7f67..db1a31247 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -97,7 +97,7 @@ IsValid(texture_block_array_index *Index) link_internal texture * Push( texture_block_array *Array, texture *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_texture_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index afe912d14..cb8935561 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -97,7 +97,7 @@ IsValid(u32_block_array_index *Index) link_internal u32 * Push( u32_block_array *Array, u32 *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_u32_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index b862e6ebd..0a69483ad 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -97,7 +97,7 @@ IsValid(u8_cursor_block_array_index *Index) link_internal u8_cursor * Push( u8_cursor_block_array *Array, u8_cursor *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_u8_cursor_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index f0b085e02..b7ea668d2 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -309,7 +309,7 @@ IsValid(dummy_work_queue_entry_build_chunk_mesh_block_array_index *Index) link_internal dummy_work_queue_entry_build_chunk_mesh * Push( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_dummy_work_queue_entry_build_chunk_mesh_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index 2a2f2dc1e..85067a663 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -309,7 +309,7 @@ IsValid(entity_block_array_index *Index) link_internal entity * Push( entity_block_array *Array, entity *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_entity_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h index fcae2338d..91f375cb2 100644 --- a/generated/block_array_entity_ptr_688856411.h +++ b/generated/block_array_entity_ptr_688856411.h @@ -309,7 +309,7 @@ IsValid(entity_ptr_block_array_index *Index) link_internal entity_ptr * Push( entity_ptr_block_array *Array, entity_ptr *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_entity_ptr_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index ce1d2efb5..8ff1194f7 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -309,7 +309,7 @@ IsValid(file_traversal_node_block_array_index *Index) link_internal file_traversal_node * Push( file_traversal_node_block_array *Array, file_traversal_node *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_file_traversal_node_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index ba7cb924e..94cc3e3a6 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -309,7 +309,7 @@ IsValid(gpu_readback_buffer_block_array_index *Index) link_internal gpu_readback_buffer * Push( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_gpu_readback_buffer_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index 0e4c0ec91..c1a946f6a 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -309,7 +309,7 @@ IsValid(member_info_block_array_index *Index) link_internal member_info * Push( member_info_block_array *Array, member_info *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_member_info_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 4b04a7c6f..c7debcbbe 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -309,7 +309,7 @@ IsValid(model_block_array_index *Index) link_internal model * Push( model_block_array *Array, model *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_model_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 6af4ebf39..87745fc2a 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -309,7 +309,7 @@ IsValid(octree_node_ptr_block_array_index *Index) link_internal octree_node_ptr * Push( octree_node_ptr_block_array *Array, octree_node_ptr *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_octree_node_ptr_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 9051d296d..c30cd42d9 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -309,7 +309,7 @@ IsValid(picked_octree_node_block_array_index *Index) link_internal picked_octree_node * Push( picked_octree_node_block_array *Array, picked_octree_node *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_picked_octree_node_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index be1503675..fb2c50d40 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -309,7 +309,7 @@ IsValid(standing_spot_block_array_index *Index) link_internal standing_spot * Push( standing_spot_block_array *Array, standing_spot *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_standing_spot_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index d3192c38b..6b1beaee4 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -97,7 +97,7 @@ IsValid(texture_ptr_block_array_index *Index) link_internal texture_ptr * Push( texture_ptr_block_array *Array, texture_ptr *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_texture_ptr_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index bb3e6e770..4bd128c3a 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -309,7 +309,7 @@ IsValid(vox_data_block_array_index *Index) link_internal vox_data * Push( vox_data_block_array *Array, vox_data *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_vox_data_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index 99dc4b56c..539fef8f2 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -309,7 +309,7 @@ IsValid(voxel_stack_element_block_array_index *Index) link_internal voxel_stack_element * Push( voxel_stack_element_block_array *Array, voxel_stack_element *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_voxel_stack_element_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index c8ac362bb..cdc014a5e 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -97,7 +97,7 @@ IsValid(world_chunk_ptr_block_array_index *Index) link_internal world_chunk_ptr * Push( world_chunk_ptr_block_array *Array, world_chunk_ptr *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_world_chunk_ptr_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 814823d54..ae0f6c07f 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -309,7 +309,7 @@ IsValid(world_edit_ptr_block_array_index *Index) link_internal world_edit_ptr * Push( world_edit_ptr_block_array *Array, world_edit_ptr *Element) { - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } + Assert(Array->Memory); if (Array->First == 0) { Array->First = Allocate_world_edit_ptr_block(Array->Memory); Array->Current = Array->First; } diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 144039931..4f68b4047 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:810:0 +// external/bonsai_stdlib/src/ui/ui.h:814:0 enum ui_render_command_type { diff --git a/generated/generate_cursor_parser.h b/generated/generate_cursor_parser.h index 9282fb69e..76c0366de 100644 --- a/generated/generate_cursor_parser.h +++ b/generated/generate_cursor_parser.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/c_parser.h:92:0 +// external/bonsai_stdlib/src/c_parser.h:93:0 struct parser_cursor { diff --git a/generated/generate_stream_c_token_buffer.h b/generated/generate_stream_c_token_buffer.h index d3d1f35ef..520ed3c62 100644 --- a/generated/generate_stream_c_token_buffer.h +++ b/generated/generate_stream_c_token_buffer.h @@ -14,6 +14,14 @@ struct c_token_buffer_stream umm ChunkCount; }; +link_internal c_token_buffer_stream +CTokenBufferStream(memory_arena *Memory) +{ + c_token_buffer_stream Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal void Deallocate(c_token_buffer_stream *Stream) { @@ -62,10 +70,7 @@ IsLastElement(c_token_buffer_iterator* Iter) link_internal c_token_buffer * Push(c_token_buffer_stream* Stream, c_token_buffer Element) { - if (Stream->Memory == 0) - { - Stream->Memory = AllocateArena(); - } + Assert(Stream->Memory); /* (Type.name)_stream_chunk* NextChunk = AllocateProtection((Type.name)_stream_chunk*), Stream->Memory, 1, False) */ c_token_buffer_stream_chunk* NextChunk = (c_token_buffer_stream_chunk*)PushStruct(Stream->Memory, sizeof(c_token_buffer_stream_chunk), 1, 0); diff --git a/generated/generate_stream_parser.h b/generated/generate_stream_parser.h index 841246bb2..1f5c7e075 100644 --- a/generated/generate_stream_parser.h +++ b/generated/generate_stream_parser.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/c_parser.h:95:0 +// external/bonsai_stdlib/src/c_parser.h:96:0 struct parser_stream_chunk { @@ -14,6 +14,14 @@ struct parser_stream umm ChunkCount; }; +link_internal parser_stream +ParserStream(memory_arena *Memory) +{ + parser_stream Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal void Deallocate(parser_stream *Stream) { @@ -62,10 +70,7 @@ IsLastElement(parser_iterator* Iter) link_internal parser * Push(parser_stream* Stream, parser Element) { - if (Stream->Memory == 0) - { - Stream->Memory = AllocateArena(); - } + Assert(Stream->Memory); /* (Type.name)_stream_chunk* NextChunk = AllocateProtection((Type.name)_stream_chunk*), Stream->Memory, 1, False) */ parser_stream_chunk* NextChunk = (parser_stream_chunk*)PushStruct(Stream->Memory, sizeof(parser_stream_chunk), 1, 0); diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index 90e2b5b52..0a26f5da5 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -14,6 +14,14 @@ struct standing_spot_stream umm ChunkCount; }; +link_internal standing_spot_stream +StandingSpotStream(memory_arena *Memory) +{ + standing_spot_stream Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal void Deallocate(standing_spot_stream *Stream) { @@ -62,10 +70,7 @@ IsLastElement(standing_spot_iterator* Iter) link_internal standing_spot * Push(standing_spot_stream* Stream, standing_spot Element) { - if (Stream->Memory == 0) - { - Stream->Memory = AllocateArena(); - } + Assert(Stream->Memory); /* (Type.name)_stream_chunk* NextChunk = AllocateProtection((Type.name)_stream_chunk*), Stream->Memory, 1, False) */ standing_spot_stream_chunk* NextChunk = (standing_spot_stream_chunk*)PushStruct(Stream->Memory, sizeof(standing_spot_stream_chunk), 1, 0); diff --git a/generated/generate_stream_tagged_counted_string_stream.h b/generated/generate_stream_tagged_counted_string_stream.h index 4d7864a70..f0f20395d 100644 --- a/generated/generate_stream_tagged_counted_string_stream.h +++ b/generated/generate_stream_tagged_counted_string_stream.h @@ -14,6 +14,14 @@ struct tagged_counted_string_stream_stream umm ChunkCount; }; +link_internal tagged_counted_string_stream_stream +TaggedCountedStringStreamStream(memory_arena *Memory) +{ + tagged_counted_string_stream_stream Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal void Deallocate(tagged_counted_string_stream_stream *Stream) { @@ -62,10 +70,7 @@ IsLastElement(tagged_counted_string_stream_iterator* Iter) link_internal tagged_counted_string_stream * Push(tagged_counted_string_stream_stream* Stream, tagged_counted_string_stream Element) { - if (Stream->Memory == 0) - { - Stream->Memory = AllocateArena(); - } + Assert(Stream->Memory); /* (Type.name)_stream_chunk* NextChunk = AllocateProtection((Type.name)_stream_chunk*), Stream->Memory, 1, False) */ tagged_counted_string_stream_stream_chunk* NextChunk = (tagged_counted_string_stream_stream_chunk*)PushStruct(Stream->Memory, sizeof(tagged_counted_string_stream_stream_chunk), 1, 0); diff --git a/generated/generate_stream_tuple_cs_cs.h b/generated/generate_stream_tuple_cs_cs.h index 0875886c9..6c9e7418c 100644 --- a/generated/generate_stream_tuple_cs_cs.h +++ b/generated/generate_stream_tuple_cs_cs.h @@ -14,6 +14,14 @@ struct tuple_cs_cs_stream umm ChunkCount; }; +link_internal tuple_cs_cs_stream +TupleCsCsStream(memory_arena *Memory) +{ + tuple_cs_cs_stream Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal void Deallocate(tuple_cs_cs_stream *Stream) { @@ -62,10 +70,7 @@ IsLastElement(tuple_cs_cs_iterator* Iter) link_internal tuple_cs_cs * Push(tuple_cs_cs_stream* Stream, tuple_cs_cs Element) { - if (Stream->Memory == 0) - { - Stream->Memory = AllocateArena(); - } + Assert(Stream->Memory); /* (Type.name)_stream_chunk* NextChunk = AllocateProtection((Type.name)_stream_chunk*), Stream->Memory, 1, False) */ tuple_cs_cs_stream_chunk* NextChunk = (tuple_cs_cs_stream_chunk*)PushStruct(Stream->Memory, sizeof(tuple_cs_cs_stream_chunk), 1, 0); diff --git a/generated/generate_stream_u64.h b/generated/generate_stream_u64.h index 9181e3859..3ec7e9405 100644 --- a/generated/generate_stream_u64.h +++ b/generated/generate_stream_u64.h @@ -14,6 +14,14 @@ struct u64_stream umm ChunkCount; }; +link_internal u64_stream +U64Stream(memory_arena *Memory) +{ + u64_stream Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal void Deallocate(u64_stream *Stream) { @@ -62,10 +70,7 @@ IsLastElement(u64_iterator* Iter) link_internal u64 * Push(u64_stream* Stream, u64 Element) { - if (Stream->Memory == 0) - { - Stream->Memory = AllocateArena(); - } + Assert(Stream->Memory); /* (Type.name)_stream_chunk* NextChunk = AllocateProtection((Type.name)_stream_chunk*), Stream->Memory, 1, False) */ u64_stream_chunk* NextChunk = (u64_stream_chunk*)PushStruct(Stream->Memory, sizeof(u64_stream_chunk), 1, 0); diff --git a/generated/generate_stream_v3i.h b/generated/generate_stream_v3i.h index 5296dc8a8..3a892ecb0 100644 --- a/generated/generate_stream_v3i.h +++ b/generated/generate_stream_v3i.h @@ -14,6 +14,14 @@ struct v3i_stream umm ChunkCount; }; +link_internal v3i_stream +V3iStream(memory_arena *Memory) +{ + v3i_stream Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal void Deallocate(v3i_stream *Stream) { @@ -62,10 +70,7 @@ IsLastElement(v3i_iterator* Iter) link_internal v3i * Push(v3i_stream* Stream, v3i Element) { - if (Stream->Memory == 0) - { - Stream->Memory = AllocateArena(); - } + Assert(Stream->Memory); /* (Type.name)_stream_chunk* NextChunk = AllocateProtection((Type.name)_stream_chunk*), Stream->Memory, 1, False) */ v3i_stream_chunk* NextChunk = (v3i_stream_chunk*)PushStruct(Stream->Memory, sizeof(v3i_stream_chunk), 1, 0); diff --git a/generated/generate_string_table_parse_error_code.h b/generated/generate_string_table_parse_error_code.h index 144f4b826..2fa8062ff 100644 --- a/generated/generate_string_table_parse_error_code.h +++ b/generated/generate_string_table_parse_error_code.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/c_parser.h:61:0 +// external/bonsai_stdlib/src/c_parser.h:62:0 link_internal counted_string ToStringPrefixless(parse_error_code Type) @@ -16,6 +16,7 @@ ToStringPrefixless(parse_error_code Type) case ParseErrorCode_PoofTypeError: { Result = CSz("PoofTypeError"); } break; case ParseErrorCode_DUnionParse: { Result = CSz("DUnionParse"); } break; case ParseErrorCode_UndefinedDatatype: { Result = CSz("UndefinedDatatype"); } break; + case ParseErrorCode_InvalidKeyword: { Result = CSz("InvalidKeyword"); } break; case ParseErrorCode_InvalidDirective: { Result = CSz("InvalidDirective"); } break; case ParseErrorCode_InvalidOperator: { Result = CSz("InvalidOperator"); } break; case ParseErrorCode_InvalidMetaTransformOp: { Result = CSz("InvalidMetaTransformOp"); } break; @@ -54,6 +55,7 @@ ToString(parse_error_code Type) case ParseErrorCode_PoofTypeError: { Result = CSz("ParseErrorCode_PoofTypeError"); } break; case ParseErrorCode_DUnionParse: { Result = CSz("ParseErrorCode_DUnionParse"); } break; case ParseErrorCode_UndefinedDatatype: { Result = CSz("ParseErrorCode_UndefinedDatatype"); } break; + case ParseErrorCode_InvalidKeyword: { Result = CSz("ParseErrorCode_InvalidKeyword"); } break; case ParseErrorCode_InvalidDirective: { Result = CSz("ParseErrorCode_InvalidDirective"); } break; case ParseErrorCode_InvalidOperator: { Result = CSz("ParseErrorCode_InvalidOperator"); } break; case ParseErrorCode_InvalidMetaTransformOp: { Result = CSz("ParseErrorCode_InvalidMetaTransformOp"); } break; diff --git a/generated/stream_and_cursor_counted_string.h b/generated/stream_and_cursor_counted_string.h index 4d98cb99e..4a312b801 100644 --- a/generated/stream_and_cursor_counted_string.h +++ b/generated/stream_and_cursor_counted_string.h @@ -192,6 +192,14 @@ struct counted_string_stream umm ChunkCount; }; +link_internal counted_string_stream +CountedStringStream(memory_arena *Memory) +{ + counted_string_stream Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal void Deallocate(counted_string_stream *Stream) { @@ -240,10 +248,7 @@ IsLastElement(counted_string_iterator* Iter) link_internal counted_string * Push(counted_string_stream* Stream, counted_string Element) { - if (Stream->Memory == 0) - { - Stream->Memory = AllocateArena(); - } + Assert(Stream->Memory); /* (Type.name)_stream_chunk* NextChunk = AllocateProtection((Type.name)_stream_chunk*), Stream->Memory, 1, False) */ counted_string_stream_chunk* NextChunk = (counted_string_stream_chunk*)PushStruct(Stream->Memory, sizeof(counted_string_stream_chunk), 1, 0); diff --git a/generated/stream_and_cursor_s32.h b/generated/stream_and_cursor_s32.h index eabe5cf7c..5346b0e1b 100644 --- a/generated/stream_and_cursor_s32.h +++ b/generated/stream_and_cursor_s32.h @@ -192,6 +192,14 @@ struct s32_stream umm ChunkCount; }; +link_internal s32_stream +S32Stream(memory_arena *Memory) +{ + s32_stream Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal void Deallocate(s32_stream *Stream) { @@ -240,10 +248,7 @@ IsLastElement(s32_iterator* Iter) link_internal s32 * Push(s32_stream* Stream, s32 Element) { - if (Stream->Memory == 0) - { - Stream->Memory = AllocateArena(); - } + Assert(Stream->Memory); /* (Type.name)_stream_chunk* NextChunk = AllocateProtection((Type.name)_stream_chunk*), Stream->Memory, 1, False) */ s32_stream_chunk* NextChunk = (s32_stream_chunk*)PushStruct(Stream->Memory, sizeof(s32_stream_chunk), 1, 0); diff --git a/generated/stream_and_cursor_u32.h b/generated/stream_and_cursor_u32.h index 0302adb66..6089546d8 100644 --- a/generated/stream_and_cursor_u32.h +++ b/generated/stream_and_cursor_u32.h @@ -192,6 +192,14 @@ struct u32_stream umm ChunkCount; }; +link_internal u32_stream +U32Stream(memory_arena *Memory) +{ + u32_stream Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal void Deallocate(u32_stream *Stream) { @@ -240,10 +248,7 @@ IsLastElement(u32_iterator* Iter) link_internal u32 * Push(u32_stream* Stream, u32 Element) { - if (Stream->Memory == 0) - { - Stream->Memory = AllocateArena(); - } + Assert(Stream->Memory); /* (Type.name)_stream_chunk* NextChunk = AllocateProtection((Type.name)_stream_chunk*), Stream->Memory, 1, False) */ u32_stream_chunk* NextChunk = (u32_stream_chunk*)PushStruct(Stream->Memory, sizeof(u32_stream_chunk), 1, 0); diff --git a/generated/to_hex_64_272205387.h b/generated/to_hex_64_272205387.h index 15a05c9c5..9aaee6312 100644 --- a/generated/to_hex_64_272205387.h +++ b/generated/to_hex_64_272205387.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:825:0 +// external/bonsai_stdlib/src/counted_string.cpp:841:0 link_internal cs ToHex( s64 Value ) From 8d51dcaa8a2a6439cc571ba599dfffedb3e20846 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 8 Feb 2025 13:10:23 -0700 Subject: [PATCH 148/421] Quick SSE update for stdlib --- external/bonsai_stdlib | 2 +- src/engine/terrain.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index b7fd73dd7..dd6ddc4d9 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit b7fd73dd76241ed9f300b5607202e27b566d3d8f +Subproject commit dd6ddc4d937f98a9d94fe70d147bd3e24103d42c diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 6a265a1fd..7d2320974 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -1471,7 +1471,7 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N u32_8x AddMask = Diff > 0.f; - v3_8x AddVal = Select(AddMask, V3_8X(dx,dy,dz)*Diff.Sse, V3_8X(0.f)); + v3_8x AddVal = Select(AddMask, V3_8X(dx,dy,dz)*Diff, V3_8X(0.f)); Normal.avx.x = Normal.avx.x + AddVal.avx.x; Normal.avx.y = Normal.avx.y + AddVal.avx.y; @@ -1487,7 +1487,7 @@ ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *N } } - v3_8x Result = Normalize(Normal) * F32_8X(-1.f).Sse; + v3_8x Result = Normalize(Normal) * F32_8X(-1.f); /* v3_8x Result = V3_8X(x/64.f, y/64.f, z/64.f); */ From 3e3d6e2b10602282d51a7ac8a66af37e15eb2c2f Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 8 Feb 2025 13:10:38 -0700 Subject: [PATCH 149/421] Add missing generated file --- generated/block_array_struct_688735882.h | 340 +++++++++++++++++++++++ 1 file changed, 340 insertions(+) create mode 100644 generated/block_array_struct_688735882.h diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h new file mode 100644 index 000000000..4a68e8f11 --- /dev/null +++ b/generated/block_array_struct_688735882.h @@ -0,0 +1,340 @@ +// src/engine/editor.h:1166:0 + + + + + +struct world_edit_block +{ + u32 Index; + u32 At; + world_edit *Elements; + world_edit_block *Next; +}; + +struct world_edit_block_array_index +{ + world_edit_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct world_edit_block_array +{ + world_edit_block *First; + world_edit_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +link_internal b32 +AreEqual(world_edit_block_array_index *Thing1, world_edit_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( world_edit_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(world_edit_block_array_index Thing1, world_edit_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( world_edit_block_array_index ) ); + + return Result; +} + + +typedef world_edit_block_array world_edit_paged_list; + +link_internal world_edit_block_array_index +operator++( world_edit_block_array_index &I0 ) +{ + if (I0.Block) + { + if (I0.ElementIndex == 8-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<( world_edit_block_array_index I0, world_edit_block_array_index I1 ) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex( world_edit_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*8); + return Result; +} + +link_internal world_edit_block_array_index +ZerothIndex( world_edit_block_array *Arr) +{ + world_edit_block_array_index Result = {}; + Result.Block = Arr->First; + return Result; +} + +link_internal umm +TotalElements( world_edit_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 8) + Arr->Current->At; + } + return Result; +} + +link_internal world_edit_block_array_index +LastIndex( world_edit_block_array *Arr) +{ + world_edit_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal world_edit_block_array_index +AtElements( world_edit_block_array *Arr) +{ + world_edit_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal umm +Count( world_edit_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + +link_internal world_edit * +Set( world_edit_block_array *Arr, + world_edit *Element, + world_edit_block_array_index Index ) +{ + world_edit *Result = {}; + if (Index.Block) + { + Result = &Index.Block->Elements[Index.ElementIndex]; + *Result = *Element; + } + + return Result; +} + +link_internal world_edit * +GetPtr(world_edit_block_array *Arr, world_edit_block_array_index Index) +{ + world_edit *Result = {}; + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } + return Result; +} + +link_internal world_edit * +GetPtr(world_edit_block *Block, umm Index) +{ + world_edit *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } + return Result; +} + +link_internal world_edit * +GetPtr(world_edit_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + umm AtBlock = 0; + world_edit_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + world_edit *Result = (Block->Elements+ElementIndex); + return Result; +} + +link_internal world_edit * +TryGetPtr(world_edit_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + world_edit *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(world_edit_block *Block) +{ + return Block->At; +} + + + + + +link_internal world_edit_block_array +WorldEditBlockArray(memory_arena *Memory) +{ + world_edit_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal world_edit_block * +Allocate_world_edit_block(memory_arena *Memory) +{ + world_edit_block *Result = Allocate( world_edit_block, Memory, 1); + Result->Elements = Allocate( world_edit, Memory, 8); + return Result; +} + +link_internal cs +CS( world_edit_block_array_index Index ) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal void +RemoveUnordered( world_edit_block_array *Array, world_edit_block_array_index Index) +{ + world_edit_block_array_index LastI = LastIndex(Array); + + world_edit *Element = GetPtr(Array, Index); + world_edit *LastElement = GetPtr(Array, LastI); + + Set(Array, LastElement, Index); + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + world_edit_block *Current = Array->First; + world_edit_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal world_edit_block_array_index +Find( world_edit_block_array *Array, world_edit *Query) +{ + world_edit_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if ( E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(world_edit_block_array_index *Index) +{ + world_edit_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + b32 Result = AreEqual(Index, &Test); + /* b32 Result = False; */ + return Result; +} + +link_internal world_edit * +Push( world_edit_block_array *Array, world_edit *Element) +{ + Assert(Array->Memory); + + if (Array->First == 0) { Array->First = Allocate_world_edit_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 8) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + world_edit_block *Next = Allocate_world_edit_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + world_edit *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + + From d62382bb4984f1133aed072cf1ecb70ff38e283e Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 8 Feb 2025 14:57:06 -0700 Subject: [PATCH 150/421] Fix minor init issue --- external/bonsai_stdlib | 2 +- generated/to_hex_64_272205387.h | 2 +- src/engine/render/render_init.cpp | 2 ++ src/engine/resources.cpp | 8 ++++---- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index dd6ddc4d9..301ac9413 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit dd6ddc4d937f98a9d94fe70d147bd3e24103d42c +Subproject commit 301ac941390c2ad734e334df6253577d9025e8e0 diff --git a/generated/to_hex_64_272205387.h b/generated/to_hex_64_272205387.h index 9aaee6312..242bb19ec 100644 --- a/generated/to_hex_64_272205387.h +++ b/generated/to_hex_64_272205387.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:841:0 +// external/bonsai_stdlib/src/counted_string.cpp:851:0 link_internal cs ToHex( s64 Value ) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index f087c183b..0b3e044ee 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -567,6 +567,8 @@ InitTransparencyRenderGroup(render_settings *Settings, transparency_render_group link_internal b32 GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *GraphicsMemory) { + Assert(Result->Initialized == False); + Init_Global_QuadVertexBuffer(); Result->Memory = GraphicsMemory; diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index e48f8bab8..da4f7ed62 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -600,7 +600,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) link_export THREAD_MAIN_RETURN RenderThread_Main(void *ThreadStartupParams) { - b32 InitResult = True; thread_startup_params *ThreadParams = Cast(thread_startup_params*, ThreadStartupParams); Global_EngineResources = (engine_resources*)ThreadParams->EngineResources; @@ -619,11 +618,12 @@ RenderThread_Main(void *ThreadStartupParams) PlatformMakeRenderContextCurrent(Os); + // NOTE(Jesse): This now happens in stdlib startup /* s32 VSyncFrames = 0; */ /* InitResult &= OpenAndInitializeWindow(Os, Plat, VSyncFrames); */ + /* if (InitResult) { InitResult &= InitializeOpenglFunctions(); } */ - if (InitResult) { InitResult &= InitializeOpenglFunctions(); } - + b32 InitResult = True; if (InitResult) { InitResult &= GraphicsInit(&Engine->Graphics, &Engine->Settings, AllocateArena()); } if (InitResult) @@ -648,7 +648,7 @@ RenderThread_Main(void *ThreadStartupParams) } else { - SoftError("Render thread initiailization failed."); + Error("Render thread initiailization failed."); } THREAD_MAIN_RETURN Result = ReinterpretCast(THREAD_MAIN_RETURN, InitResult); From 69f314561076e3864b5e50ced350d18685f71164 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 10 Feb 2025 14:34:54 -0700 Subject: [PATCH 151/421] Move OffsetOfWorldCenterToGrid from graphics_settings into graphics - This was necessary because it got modified every frame, which caused the settings to get written to disk, every frame, instead of just when settings changed. Fixes in user code for block_array now needing to be initialized with an arena --- external/bonsai_stdlib | 2 +- .../anonymous_render_settings_0_wwLVyABc.h | 2 +- .../anonymous_render_settings_1_pFpWPpyN.h | 2 +- generated/block_array_bitmap_688853862.h | 19 +- .../block_array_c_asset_thumbnail_688856411.h | 13 +- generated/block_array_c_gpu_timer_688735882.h | 11 +- .../block_array_c_shader_ptr_688853971.h | 11 +- generated/block_array_c_texture_688856411.h | 11 +- generated/block_array_c_u32_688856411.h | 11 +- generated/block_array_c_u8_cursor_688856411.h | 11 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 19 +- generated/block_array_entity_688856407.h | 19 +- generated/block_array_entity_ptr_688856411.h | 19 +- ...lock_array_file_traversal_node_688853862.h | 19 +- ...lock_array_gpu_readback_buffer_688853862.h | 19 +- .../block_array_h_asset_thumbnail_688856411.h | 8 + .../block_array_h_gpu_timer_688735882_0.h | 8 + .../block_array_h_shader_ptr_688853971_0.h | 8 + generated/block_array_h_texture_688856411.h | 8 + generated/block_array_h_texture_688856411_0.h | 8 + generated/block_array_h_u32_688856411.h | 8 + generated/block_array_h_u8_cursor_688856411.h | 8 + ...lock_array_h_world_chunk_ptr_688853862_0.h | 8 + generated/block_array_member_info_688856411.h | 19 +- generated/block_array_model_688856411.h | 19 +- .../block_array_octree_node_ptr_688853862.h | 19 +- ...block_array_picked_octree_node_688853862.h | 19 +- .../block_array_standing_spot_688853862.h | 19 +- generated/block_array_struct_688735882.h | 19 +- generated/block_array_texture_ptr_688856411.h | 11 +- generated/block_array_vox_data_688856411.h | 19 +- ...lock_array_voxel_stack_element_688853862.h | 19 +- .../block_array_world_chunk_ptr_688853862.h | 11 +- .../block_array_world_edit_ptr_688735882.h | 19 +- .../deserialize_struct_render_settings_1.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 17 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- generated/serdes_struct_render_settings.h | 4 +- .../serialize_struct_render_settings_0.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- src/engine/api.cpp | 2 +- src/engine/editor.cpp | 10 +- src/engine/engine.cpp | 1 + src/engine/graphics.h | 6 +- src/engine/render/render_init.cpp | 2 +- src/engine/render_loop.cpp | 600 +++++++++++++++++ src/engine/render_settings.h | 14 +- src/engine/resources.cpp | 602 ------------------ 133 files changed, 940 insertions(+), 941 deletions(-) create mode 100644 src/engine/render_loop.cpp diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 301ac9413..a4a0563fa 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 301ac941390c2ad734e334df6253577d9025e8e0 +Subproject commit a4a0563fa33e73d9e1aed97d944afd3de4d9a6a1 diff --git a/generated/anonymous_render_settings_0_wwLVyABc.h b/generated/anonymous_render_settings_0_wwLVyABc.h index e258c4e35..bc82f8588 100644 --- a/generated/anonymous_render_settings_0_wwLVyABc.h +++ b/generated/anonymous_render_settings_0_wwLVyABc.h @@ -8,7 +8,7 @@ E1->BravoilMcGuireOIT = E0->BravoilMcGuireOIT; E1->DrawMajorGrid = E0->DrawMajorGrid; E1->DrawMinorGrid = E0->DrawMinorGrid; E1->MajorGridDim = E0->MajorGridDim; -E1->OffsetOfWorldCenterToGrid = E0->OffsetOfWorldCenterToGrid; +E1->Ignored = E0->Ignored; E1->Headless = E0->Headless; E1->ToneMappingType = E0->ToneMappingType; E1->Lighting = E0->Lighting; diff --git a/generated/anonymous_render_settings_1_pFpWPpyN.h b/generated/anonymous_render_settings_1_pFpWPpyN.h index c42f2e289..5035ba97d 100644 --- a/generated/anonymous_render_settings_1_pFpWPpyN.h +++ b/generated/anonymous_render_settings_1_pFpWPpyN.h @@ -8,7 +8,7 @@ E1->BravoilMcGuireOIT = E0->BravoilMcGuireOIT; E1->DrawMajorGrid = E0->DrawMajorGrid; E1->DrawMinorGrid = E0->DrawMinorGrid; E1->MajorGridDim = E0->MajorGridDim; -E1->OffsetOfWorldCenterToGrid = E0->OffsetOfWorldCenterToGrid; +E1->Ignored = E0->Ignored; E1->Headless = E0->Headless; E1->ToneMappingType = E0->ToneMappingType; E1->Lighting = E0->Lighting; diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index da69bb202..b4a629b58 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -27,6 +27,14 @@ struct bitmap_block_array }; +link_internal bitmap_block_array +BitmapBlockArray(memory_arena *Memory) +{ + bitmap_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(bitmap_block_array_index *Thing1, bitmap_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(bitmap_block *Block) -link_internal bitmap_block_array -BitmapBlockArray(memory_arena *Memory) -{ - bitmap_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal bitmap_block * Allocate_bitmap_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(bitmap_block_array_index *Index) { bitmap_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 09b8a10cf..139b1e1c9 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,17 +1,9 @@ -// src/engine/editor.cpp:80:0 +// src/engine/editor.cpp:81:0 -link_internal asset_thumbnail_block_array -AssetThumbnailBlockArray(memory_arena *Memory) -{ - asset_thumbnail_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal asset_thumbnail_block * Allocate_asset_thumbnail_block(memory_arena *Memory) { @@ -89,8 +81,7 @@ link_internal b32 IsValid(asset_thumbnail_block_array_index *Index) { asset_thumbnail_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index 5ddab30b9..38d7a4b71 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -4,14 +4,6 @@ -link_internal gpu_timer_block_array -GpuTimerBlockArray(memory_arena *Memory) -{ - gpu_timer_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal gpu_timer_block * Allocate_gpu_timer_block(memory_arena *Memory) { @@ -89,8 +81,7 @@ link_internal b32 IsValid(gpu_timer_block_array_index *Index) { gpu_timer_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index eae8c7b9e..e07a9a54d 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -4,14 +4,6 @@ -link_internal shader_ptr_block_array -ShaderPtrBlockArray(memory_arena *Memory) -{ - shader_ptr_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal shader_ptr_block * Allocate_shader_ptr_block(memory_arena *Memory) { @@ -89,8 +81,7 @@ link_internal b32 IsValid(shader_ptr_block_array_index *Index) { shader_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index db1a31247..feb1dd59e 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -4,14 +4,6 @@ -link_internal texture_block_array -TextureBlockArray(memory_arena *Memory) -{ - texture_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal texture_block * Allocate_texture_block(memory_arena *Memory) { @@ -89,8 +81,7 @@ link_internal b32 IsValid(texture_block_array_index *Index) { texture_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index cb8935561..d1df71986 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -4,14 +4,6 @@ -link_internal u32_block_array -U32BlockArray(memory_arena *Memory) -{ - u32_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal u32_block * Allocate_u32_block(memory_arena *Memory) { @@ -89,8 +81,7 @@ link_internal b32 IsValid(u32_block_array_index *Index) { u32_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index 0a69483ad..4e0482eff 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -4,14 +4,6 @@ -link_internal u8_cursor_block_array -U8CursorBlockArray(memory_arena *Memory) -{ - u8_cursor_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal u8_cursor_block * Allocate_u8_cursor_block(memory_arena *Memory) { @@ -89,8 +81,7 @@ link_internal b32 IsValid(u8_cursor_block_array_index *Index) { u8_cursor_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index b7ea668d2..9d968bec2 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -27,6 +27,14 @@ struct dummy_work_queue_entry_build_chunk_mesh_block_array }; +link_internal dummy_work_queue_entry_build_chunk_mesh_block_array +DummyWorkQueueEntryBuildChunkMeshBlockArray(memory_arena *Memory) +{ + dummy_work_queue_entry_build_chunk_mesh_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(dummy_work_queue_entry_build_chunk_mesh_block_array_index *Thing1, dummy_work_queue_entry_build_chunk_mesh_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(dummy_work_queue_entry_build_chunk_mesh_block *Block) -link_internal dummy_work_queue_entry_build_chunk_mesh_block_array -DummyWorkQueueEntryBuildChunkMeshBlockArray(memory_arena *Memory) -{ - dummy_work_queue_entry_build_chunk_mesh_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal dummy_work_queue_entry_build_chunk_mesh_block * Allocate_dummy_work_queue_entry_build_chunk_mesh_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(dummy_work_queue_entry_build_chunk_mesh_block_array_index *Index) { dummy_work_queue_entry_build_chunk_mesh_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index 85067a663..f8d20ff13 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -27,6 +27,14 @@ struct entity_block_array }; +link_internal entity_block_array +EntityBlockArray(memory_arena *Memory) +{ + entity_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(entity_block_array_index *Thing1, entity_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(entity_block *Block) -link_internal entity_block_array -EntityBlockArray(memory_arena *Memory) -{ - entity_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal entity_block * Allocate_entity_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(entity_block_array_index *Index) { entity_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h index 91f375cb2..d14017018 100644 --- a/generated/block_array_entity_ptr_688856411.h +++ b/generated/block_array_entity_ptr_688856411.h @@ -27,6 +27,14 @@ struct entity_ptr_block_array }; +link_internal entity_ptr_block_array +EntityPtrBlockArray(memory_arena *Memory) +{ + entity_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(entity_ptr_block_array_index *Thing1, entity_ptr_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(entity_ptr_block *Block) -link_internal entity_ptr_block_array -EntityPtrBlockArray(memory_arena *Memory) -{ - entity_ptr_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal entity_ptr_block * Allocate_entity_ptr_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(entity_ptr_block_array_index *Index) { entity_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index 8ff1194f7..ab10c87db 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -27,6 +27,14 @@ struct file_traversal_node_block_array }; +link_internal file_traversal_node_block_array +FileTraversalNodeBlockArray(memory_arena *Memory) +{ + file_traversal_node_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(file_traversal_node_block_array_index *Thing1, file_traversal_node_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(file_traversal_node_block *Block) -link_internal file_traversal_node_block_array -FileTraversalNodeBlockArray(memory_arena *Memory) -{ - file_traversal_node_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal file_traversal_node_block * Allocate_file_traversal_node_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(file_traversal_node_block_array_index *Index) { file_traversal_node_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 94cc3e3a6..23835a3bf 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -27,6 +27,14 @@ struct gpu_readback_buffer_block_array }; +link_internal gpu_readback_buffer_block_array +GpuReadbackBufferBlockArray(memory_arena *Memory) +{ + gpu_readback_buffer_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(gpu_readback_buffer_block_array_index *Thing1, gpu_readback_buffer_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(gpu_readback_buffer_block *Block) -link_internal gpu_readback_buffer_block_array -GpuReadbackBufferBlockArray(memory_arena *Memory) -{ - gpu_readback_buffer_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal gpu_readback_buffer_block * Allocate_gpu_readback_buffer_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(gpu_readback_buffer_block_array_index *Index) { gpu_readback_buffer_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 206419285..da9c68e80 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -27,6 +27,14 @@ struct asset_thumbnail_block_array }; +link_internal asset_thumbnail_block_array +AssetThumbnailBlockArray(memory_arena *Memory) +{ + asset_thumbnail_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(asset_thumbnail_block_array_index *Thing1, asset_thumbnail_block_array_index *Thing2) { diff --git a/generated/block_array_h_gpu_timer_688735882_0.h b/generated/block_array_h_gpu_timer_688735882_0.h index fe19f610a..8245e081f 100644 --- a/generated/block_array_h_gpu_timer_688735882_0.h +++ b/generated/block_array_h_gpu_timer_688735882_0.h @@ -27,6 +27,14 @@ struct gpu_timer_block_array }; +link_internal gpu_timer_block_array +GpuTimerBlockArray(memory_arena *Memory) +{ + gpu_timer_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(gpu_timer_block_array_index *Thing1, gpu_timer_block_array_index *Thing2) { diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 14c3ce239..8c524b938 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -27,6 +27,14 @@ struct shader_ptr_block_array }; +link_internal shader_ptr_block_array +ShaderPtrBlockArray(memory_arena *Memory) +{ + shader_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(shader_ptr_block_array_index *Thing1, shader_ptr_block_array_index *Thing2) { diff --git a/generated/block_array_h_texture_688856411.h b/generated/block_array_h_texture_688856411.h index 2afc4c763..bc769ef98 100644 --- a/generated/block_array_h_texture_688856411.h +++ b/generated/block_array_h_texture_688856411.h @@ -27,6 +27,14 @@ struct texture_ptr_block_array }; +link_internal texture_ptr_block_array +TexturePtrBlockArray(memory_arena *Memory) +{ + texture_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(texture_ptr_block_array_index *Thing1, texture_ptr_block_array_index *Thing2) { diff --git a/generated/block_array_h_texture_688856411_0.h b/generated/block_array_h_texture_688856411_0.h index a43c95b23..c6b40acfa 100644 --- a/generated/block_array_h_texture_688856411_0.h +++ b/generated/block_array_h_texture_688856411_0.h @@ -27,6 +27,14 @@ struct texture_block_array }; +link_internal texture_block_array +TextureBlockArray(memory_arena *Memory) +{ + texture_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(texture_block_array_index *Thing1, texture_block_array_index *Thing2) { diff --git a/generated/block_array_h_u32_688856411.h b/generated/block_array_h_u32_688856411.h index c80369e7e..45489fea6 100644 --- a/generated/block_array_h_u32_688856411.h +++ b/generated/block_array_h_u32_688856411.h @@ -27,6 +27,14 @@ struct u32_block_array }; +link_internal u32_block_array +U32BlockArray(memory_arena *Memory) +{ + u32_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(u32_block_array_index *Thing1, u32_block_array_index *Thing2) { diff --git a/generated/block_array_h_u8_cursor_688856411.h b/generated/block_array_h_u8_cursor_688856411.h index 78eb5a24c..483ec6c4d 100644 --- a/generated/block_array_h_u8_cursor_688856411.h +++ b/generated/block_array_h_u8_cursor_688856411.h @@ -27,6 +27,14 @@ struct u8_cursor_block_array u64 BlockSize; }; +link_internal u8_cursor_block_array +U8CursorBlockArray(memory_arena *Memory) +{ + u8_cursor_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(u8_cursor_block_array_index *Thing1, u8_cursor_block_array_index *Thing2) { diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index 423c3dd1e..0a9905c2a 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -27,6 +27,14 @@ struct world_chunk_ptr_block_array }; +link_internal world_chunk_ptr_block_array +WorldChunkPtrBlockArray(memory_arena *Memory) +{ + world_chunk_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(world_chunk_ptr_block_array_index *Thing1, world_chunk_ptr_block_array_index *Thing2) { diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index c1a946f6a..d8da5199b 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -27,6 +27,14 @@ struct member_info_block_array }; +link_internal member_info_block_array +MemberInfoBlockArray(memory_arena *Memory) +{ + member_info_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(member_info_block_array_index *Thing1, member_info_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(member_info_block *Block) -link_internal member_info_block_array -MemberInfoBlockArray(memory_arena *Memory) -{ - member_info_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal member_info_block * Allocate_member_info_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(member_info_block_array_index *Index) { member_info_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index c7debcbbe..df191736c 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -27,6 +27,14 @@ struct model_block_array }; +link_internal model_block_array +ModelBlockArray(memory_arena *Memory) +{ + model_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(model_block_array_index *Thing1, model_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(model_block *Block) -link_internal model_block_array -ModelBlockArray(memory_arena *Memory) -{ - model_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal model_block * Allocate_model_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(model_block_array_index *Index) { model_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 87745fc2a..ae14efda5 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -27,6 +27,14 @@ struct octree_node_ptr_block_array }; +link_internal octree_node_ptr_block_array +OctreeNodePtrBlockArray(memory_arena *Memory) +{ + octree_node_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(octree_node_ptr_block_array_index *Thing1, octree_node_ptr_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(octree_node_ptr_block *Block) -link_internal octree_node_ptr_block_array -OctreeNodePtrBlockArray(memory_arena *Memory) -{ - octree_node_ptr_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal octree_node_ptr_block * Allocate_octree_node_ptr_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(octree_node_ptr_block_array_index *Index) { octree_node_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index c30cd42d9..11ed1617d 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -27,6 +27,14 @@ struct picked_octree_node_block_array }; +link_internal picked_octree_node_block_array +PickedOctreeNodeBlockArray(memory_arena *Memory) +{ + picked_octree_node_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(picked_octree_node_block_array_index *Thing1, picked_octree_node_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(picked_octree_node_block *Block) -link_internal picked_octree_node_block_array -PickedOctreeNodeBlockArray(memory_arena *Memory) -{ - picked_octree_node_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal picked_octree_node_block * Allocate_picked_octree_node_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(picked_octree_node_block_array_index *Index) { picked_octree_node_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index fb2c50d40..f21e47b21 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -27,6 +27,14 @@ struct standing_spot_block_array }; +link_internal standing_spot_block_array +StandingSpotBlockArray(memory_arena *Memory) +{ + standing_spot_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(standing_spot_block_array_index *Thing1, standing_spot_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(standing_spot_block *Block) -link_internal standing_spot_block_array -StandingSpotBlockArray(memory_arena *Memory) -{ - standing_spot_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal standing_spot_block * Allocate_standing_spot_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(standing_spot_block_array_index *Index) { standing_spot_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index 4a68e8f11..0d94eaec0 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -27,6 +27,14 @@ struct world_edit_block_array }; +link_internal world_edit_block_array +WorldEditBlockArray(memory_arena *Memory) +{ + world_edit_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(world_edit_block_array_index *Thing1, world_edit_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(world_edit_block *Block) -link_internal world_edit_block_array -WorldEditBlockArray(memory_arena *Memory) -{ - world_edit_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal world_edit_block * Allocate_world_edit_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(world_edit_block_array_index *Index) { world_edit_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index 6b1beaee4..785a9dd09 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -4,14 +4,6 @@ -link_internal texture_ptr_block_array -TexturePtrBlockArray(memory_arena *Memory) -{ - texture_ptr_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal texture_ptr_block * Allocate_texture_ptr_block(memory_arena *Memory) { @@ -89,8 +81,7 @@ link_internal b32 IsValid(texture_ptr_block_array_index *Index) { texture_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index 4bd128c3a..9f61b8e38 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -27,6 +27,14 @@ struct vox_data_block_array }; +link_internal vox_data_block_array +VoxDataBlockArray(memory_arena *Memory) +{ + vox_data_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(vox_data_block_array_index *Thing1, vox_data_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(vox_data_block *Block) -link_internal vox_data_block_array -VoxDataBlockArray(memory_arena *Memory) -{ - vox_data_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal vox_data_block * Allocate_vox_data_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(vox_data_block_array_index *Index) { vox_data_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index 539fef8f2..5bb6f6c7e 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -27,6 +27,14 @@ struct voxel_stack_element_block_array }; +link_internal voxel_stack_element_block_array +VoxelStackElementBlockArray(memory_arena *Memory) +{ + voxel_stack_element_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(voxel_stack_element_block_array_index *Thing1, voxel_stack_element_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(voxel_stack_element_block *Block) -link_internal voxel_stack_element_block_array -VoxelStackElementBlockArray(memory_arena *Memory) -{ - voxel_stack_element_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal voxel_stack_element_block * Allocate_voxel_stack_element_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(voxel_stack_element_block_array_index *Index) { voxel_stack_element_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index cdc014a5e..682f95ca7 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -4,14 +4,6 @@ -link_internal world_chunk_ptr_block_array -WorldChunkPtrBlockArray(memory_arena *Memory) -{ - world_chunk_ptr_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal world_chunk_ptr_block * Allocate_world_chunk_ptr_block(memory_arena *Memory) { @@ -89,8 +81,7 @@ link_internal b32 IsValid(world_chunk_ptr_block_array_index *Index) { world_chunk_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index ae0f6c07f..ce7d0ebca 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -27,6 +27,14 @@ struct world_edit_ptr_block_array }; +link_internal world_edit_ptr_block_array +WorldEditPtrBlockArray(memory_arena *Memory) +{ + world_edit_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + link_internal b32 AreEqual(world_edit_ptr_block_array_index *Thing1, world_edit_ptr_block_array_index *Thing2) { @@ -216,14 +224,6 @@ AtElements(world_edit_ptr_block *Block) -link_internal world_edit_ptr_block_array -WorldEditPtrBlockArray(memory_arena *Memory) -{ - world_edit_ptr_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - link_internal world_edit_ptr_block * Allocate_world_edit_ptr_block(memory_arena *Memory) { @@ -301,8 +301,7 @@ link_internal b32 IsValid(world_edit_ptr_block_array_index *Index) { world_edit_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = AreEqual(Index, &Test); - /* b32 Result = False; */ + b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/deserialize_struct_render_settings_1.h b/generated/deserialize_struct_render_settings_1.h index a01dc738e..186d49a3d 100644 --- a/generated/deserialize_struct_render_settings_1.h +++ b/generated/deserialize_struct_render_settings_1.h @@ -79,7 +79,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_a // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->OffsetOfWorldCenterToGrid, Memory); + Result &= Deserialize(Bytes, &Element->Ignored, Memory); diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index eb231bf4e..61d43ee04 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:215:0 +// src/engine/editor.cpp:216:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 2e2aa4ec6..e51df9808 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:319:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 818f5d5ed..3a86292e1 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:310:0 +// src/engine/editor.cpp:311:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 9c4079daa..6e7fa7d2e 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:340:0 +// src/engine/editor.cpp:341:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 0ee301331..a56621590 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:221:0 +// src/engine/editor.cpp:222:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index e7ea669f6..cb9e5e52c 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:154:0 +// src/engine/editor.cpp:155:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 055caa664..8cd0de24b 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:349:0 +// src/engine/editor.cpp:350:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 5a1e7e5a3..04d9ffb53 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:109:0 +// src/engine/editor.cpp:110:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index bc4ac474c..d1def08a1 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:334:0 +// src/engine/editor.cpp:335:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 46ae61f61..37b209b68 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:251:0 +// src/engine/editor.cpp:252:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 301ac1777..77b488f2b 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:343:0 +// src/engine/editor.cpp:344:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index ac527abe6..c0957e589 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:321:0 +// src/engine/editor.cpp:322:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index f2c2a4e07..f1c44f3c6 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:150:0 +// src/engine/editor.cpp:151:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 67cfc770d..ca9abbe22 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:424:0 +// src/engine/editor.cpp:425:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index f30c3163e..4d988a349 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:446:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index f45e755ce..d735dca0a 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:442:0 +// src/engine/editor.cpp:443:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index bf63d56a7..7eb2e56b2 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:290:0 +// src/engine/editor.cpp:291:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 684cbae56..83b9adbfc 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:287:0 +// src/engine/editor.cpp:288:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 7800f3309..9f1e7f64d 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:324:0 +// src/engine/editor.cpp:325:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index d0955eb3e..a038c6cf0 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:275:0 +// src/engine/editor.cpp:276:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 89f44a9ce..f10720a56 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:331:0 +// src/engine/editor.cpp:332:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 6fb3ffd15..b93dc45c0 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:412:0 +// src/engine/editor.cpp:413:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 464303728..ed1e7b414 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:407:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index e91f25e90..e4229223b 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:257:0 +// src/engine/editor.cpp:258:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index fffebc570..7b221d49b 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:260:0 +// src/engine/editor.cpp:261:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index ccae0eee8..599ccf8bb 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:415:0 +// src/engine/editor.cpp:416:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -82,6 +82,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->OffsetOfWorldCenterToGrid), + CSz("OffsetOfWorldCenterToGrid"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index be0d5d833..48b90c123 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:439:0 +// src/engine/editor.cpp:440:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index a3099ffa8..0dd1a26e1 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:143:0 +// src/engine/editor.cpp:144:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index a77ff674f..f6ea55eaa 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:140:0 +// src/engine/editor.cpp:141:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 074e60a49..8636afe33 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:212:0 +// src/engine/editor.cpp:213:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 7e225446b..13a0ff5c0 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:352:0 +// src/engine/editor.cpp:353:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index a754adf46..ce27ca872 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:430:0 +// src/engine/editor.cpp:431:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index a88631405..ab164f863 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:410:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 18358f4a6..d7ba36317 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:191:0 +// src/engine/editor.cpp:192:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 58acdbcf7..dd3f4ab6b 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:263:0 +// src/engine/editor.cpp:264:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 82ec29a47..769af9888 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:266:0 +// src/engine/editor.cpp:267:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index a69b0735b..ad88271c7 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:346:0 +// src/engine/editor.cpp:347:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 7075447fd..d2e02cc2c 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:300:0 +// src/engine/editor.cpp:301:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index e0a00f470..29bba4e81 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:206:0 +// src/engine/editor.cpp:207:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index f94af908e..3f5455e80 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:209:0 +// src/engine/editor.cpp:210:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 5b6d0df66..62213a547 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:95:0 +// src/engine/editor.cpp:96:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 1bf84e243..03ce3467d 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:197:0 +// src/engine/editor.cpp:198:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index bdfea0b20..6e11a36a3 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:328:0 +// src/engine/editor.cpp:329:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index fa9671101..764bd70ea 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:146:0 +// src/engine/editor.cpp:147:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 3d337f469..a27012679 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:200:0 +// src/engine/editor.cpp:201:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index ed4a886cd..1985130de 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:400:0 +// src/engine/editor.cpp:401:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 5b5a47ab5..8c2b2e845 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:418:0 +// src/engine/editor.cpp:419:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index d5784a301..b009295ad 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:194:0 +// src/engine/editor.cpp:195:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 5f2d87cdb..302ffadaf 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:403:0 +// src/engine/editor.cpp:404:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index bca72ef97..9402cfc77 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:397:0 +// src/engine/editor.cpp:398:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index ae98e3ecc..6be700bc6 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:107:0 +// src/engine/editor.cpp:108:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 2995adc6e..3313afe3e 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:337:0 +// src/engine/editor.cpp:338:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index be1a7bd68..b7886aaf6 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:421:0 +// src/engine/editor.cpp:422:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 8a63e8a7d..155198d54 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:116:0 +// src/engine/editor.cpp:117:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 92464dbc5..4a456af38 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:119:0 +// src/engine/editor.cpp:120:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index b5e758d91..af589b3c8 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:224:0 +// src/engine/editor.cpp:225:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 50c30425d..7461d3af7 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:218:0 +// src/engine/editor.cpp:219:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index d0636545e..cdf49c220 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:98:0 +// src/engine/editor.cpp:99:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 5cc1fb14c..6fa5ced7c 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:254:0 +// src/engine/editor.cpp:255:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 6352d0c34..b06d34111 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:245:0 +// src/engine/editor.cpp:246:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 9e29e10e1..e668abd01 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:248:0 +// src/engine/editor.cpp:249:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 74e4601b1..6536e373f 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:92:0 +// src/engine/editor.cpp:93:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index f7c57dc19..a0ef026f6 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:137:0 +// src/engine/editor.cpp:138:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index dd7daa880..932a30199 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:134:0 +// src/engine/editor.cpp:135:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 10385f7ec..2b940128a 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:303:0 +// src/engine/editor.cpp:304:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index faa1c25aa..7256b23fa 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:297:0 +// src/engine/editor.cpp:298:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 34a29bd1c..6ad5fb5ec 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:103:0 +// src/engine/editor.cpp:104:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index dff3c4637..8795fece4 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:101:0 +// src/engine/editor.cpp:102:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index ce636bd7a..c21a31bd0 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:294:0 +// src/engine/editor.cpp:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 6b885eebe..792661d54 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:269:0 +// src/engine/editor.cpp:270:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 0c2e83a2a..d2cf954d2 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:128:0 +// src/engine/editor.cpp:129:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 1b5525ae2..14ea8646f 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:113:0 +// src/engine/editor.cpp:114:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 6e5f8235e..bc5bee664 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:315:0 +// src/engine/editor.cpp:316:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index af2d5e1bc..0908975ed 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:242:0 +// src/engine/editor.cpp:243:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 2ca8a7544..ac2f751b9 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:427:0 +// src/engine/editor.cpp:428:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 8fea27923..a67512f59 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:182:0 +// src/engine/editor.cpp:183:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 39969ae72..b510e157e 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:179:0 +// src/engine/editor.cpp:180:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 7fa3b1e39..1be8d81f3 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:272:0 +// src/engine/editor.cpp:273:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index df170ea2c..a92c0f618 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:203:0 +// src/engine/editor.cpp:204:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 877f5ba95..e95b4dc96 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:433:0 +// src/engine/editor.cpp:434:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 473beaa35..6dc95e5e7 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:436:0 +// src/engine/editor.cpp:437:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index e2ec54123..925c18a91 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:105:0 +// src/engine/editor.cpp:106:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index e83995368..de61c619e 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:185:0 +// src/engine/editor.cpp:186:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/serdes_struct_render_settings.h b/generated/serdes_struct_render_settings.h index 6aa9b5b7e..afed57ad0 100644 --- a/generated/serdes_struct_render_settings.h +++ b/generated/serdes_struct_render_settings.h @@ -107,7 +107,7 @@ Serialize(u8_cursor_block_array *Bytes, render_settings *BaseElement, umm Count - Result &= Serialize(Bytes, &Element->OffsetOfWorldCenterToGrid); // default + Result &= Serialize(Bytes, &Element->Ignored); // default @@ -308,7 +308,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->OffsetOfWorldCenterToGrid, Memory); + Result &= Deserialize(Bytes, &Element->Ignored, Memory); diff --git a/generated/serialize_struct_render_settings_0.h b/generated/serialize_struct_render_settings_0.h index 3e38fc72a..995dbf42c 100644 --- a/generated/serialize_struct_render_settings_0.h +++ b/generated/serialize_struct_render_settings_0.h @@ -79,7 +79,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_a // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->OffsetOfWorldCenterToGrid, Memory); + Result &= Deserialize(Bytes, &Element->Ignored, Memory); diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index de1ffd9dd..2d1222569 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:313:0 +// src/engine/editor.cpp:314:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 9032cfb4b..bb650ca1a 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:175:0 +// src/engine/editor.cpp:176:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 7042806dc..394fee471 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:169:0 +// src/engine/editor.cpp:170:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index aa541fc46..d1ac4489c 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:166:0 +// src/engine/editor.cpp:167:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 06e109ffc..f9e50b0ce 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:172:0 +// src/engine/editor.cpp:173:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 8188d0afc..0c4d0cee8 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -42,7 +42,7 @@ SimulateCameraGhost_AndSet_OffsetWorldCenterToGrid(engine_resources *Engine) SimulateEntity(Engine, CameraGhost, Plat->dt, World->VisibleRegion, &GpuMap->Buffer, &Graphics->Transparency.GpuBuffer.Buffer, &Plat->HighPriority); v3 CameraTargetSimP = GetSimSpaceP(World, CameraGhost); - Graphics->Settings.OffsetOfWorldCenterToGrid = (CameraTargetSimP % V3(Graphics->Settings.MajorGridDim)); + Graphics->OffsetOfWorldCenterToGrid = (CameraTargetSimP % V3(Graphics->Settings.MajorGridDim)); } } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index d72cbba3a..b2fafe757 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -28,7 +28,8 @@ InitEditor(level_editor *Editor) b32 Result = True; Editor->Memory = AllocateArena(); - Editor->AssetThumbnails.Memory = Editor->Memory; + Editor->WorldEdits = WorldEditBlockArray(Editor->Memory); + Editor->AssetThumbnails = AssetThumbnailBlockArray(Editor->Memory); /* RangeIterator(LayerIndex, MAX_BRUSH_LAYERS) */ /* { */ @@ -2274,8 +2275,13 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo Assert( IsValid(&Index) == False ); } + if (Node->Edits.Memory == 0) + { + Node->Edits = WorldEditPtrBlockArray(Editor->Memory); + } + Push(&Node->Edits, &Edit); - QueueChunkForInit(&Plat->WorldUpdateQ, Node->Chunk, MeshBit_None); + QueueChunkForInit(&Plat->RenderQ, Node->Chunk, MeshBit_None); } } } diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index aef3a762c..eccc2cd7b 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -36,6 +36,7 @@ #include #include // TODO(Jesse): Probably time to split this up? #include +#include #include #include diff --git a/src/engine/graphics.h b/src/engine/graphics.h index d81f6a9a3..5e09c8615 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -74,6 +74,8 @@ struct graphics render_settings Settings; render_settings PrevSettings; + v3 OffsetOfWorldCenterToGrid; + v3 SunBasis; r32 FogPower; @@ -128,12 +130,12 @@ struct graphics // tracks this third stage. // volatile u32 NoiseFinalizeJobsPending; - dummy_work_queue_entry_build_chunk_mesh_block_array NoiseReadbackJobs; + dummy_work_queue_entry_build_chunk_mesh_block_array NoiseReadbackJobs = DummyWorkQueueEntryBuildChunkMeshBlockArray(&Global_PermMemory); gpu_mapped_element_buffer GpuBuffers[2]; u32 GpuBufferWriteIndex; - gpu_timer_block_array GpuTimers; + gpu_timer_block_array GpuTimers = GpuTimerBlockArray(&Global_PermMemory); memory_arena *Memory; }; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 0b3e044ee..a87ac9ffe 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -370,7 +370,7 @@ CreateGbufferShader(graphics *Graphics, memory_arena *GraphicsMemory, v3 *MinCli *Current = GetUniform(GraphicsMemory, &Shader, &Camera->RenderSpacePosition, "CameraToWorld"); Current = &(*Current)->Next; - *Current = GetUniform(GraphicsMemory, &Shader, &Graphics->Settings.OffsetOfWorldCenterToGrid, "OffsetOfWorldCenterToGrid"); + *Current = GetUniform(GraphicsMemory, &Shader, &Graphics->OffsetOfWorldCenterToGrid, "OffsetOfWorldCenterToGrid"); Current = &(*Current)->Next; *Current = GetUniform(GraphicsMemory, &Shader, &Graphics->Settings.MajorGridDim, "MajorGridDim"); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp new file mode 100644 index 000000000..ba72a30d4 --- /dev/null +++ b/src/engine/render_loop.cpp @@ -0,0 +1,600 @@ +link_internal void +RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) +{ + // Map immediate GPU buffers for first frame + MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.GpuBuffers[0]); + MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.Transparency.GpuBuffer); + + auto LowPriorityQ = &Engine->Stdlib.Plat.LowPriority; + + os *Os = &Engine->Stdlib.Os; + /* platform *Plat = &Engine->Stdlib.Plat; */ + while ( FutexNotSignaled(ThreadParams->WorkerThreadsExitFutex) ) + { + UNPACK_ENGINE_RESOURCES(Engine); + + WORKER_THREAD_ADVANCE_DEBUG_SYSTEM(); + WorkerThread_BeforeJobStart(ThreadParams); + + while (work_queue_entry *Job = PopWorkQueueEntry(RenderQ)) + { + /* TIMED_NAMED_BLOCK(RENDER_LOOP); */ + tswitch(Job) + { + case type_work_queue_entry_noop: + case type_work_queue_entry_init_world_chunk: + case type_work_queue_entry_copy_buffer_set: + case type_work_queue_entry_copy_buffer_ref: + case type_work_queue_entry_init_asset: + case type_work_queue_entry_update_world_region: + case type_work_queue_entry_rebuild_mesh: + case type_work_queue_entry_finalize_noise_values: + case type_work_queue_entry_build_chunk_mesh: + case type_work_queue_entry_sim_particle_system: + case type_work_queue_entry__align_to_cache_line_helper: + { + InvalidCodePath(); + } break; + + + { tmatch(work_queue_entry_async_function_call, Job, RPC) + TIMED_NAMED_BLOCK(work_queue_entry_async_function_call); + DispatchAsyncFunctionCall(RPC); + } break; + + { tmatch(work_queue_entry__bonsai_render_command, Job, RC) + tswitch(RC) + { + InvalidCase(type_work_queue_entry__bonsai_render_command_noop); + + { case type_bonsai_render_command_cancel_all_noise_readback_jobs: + TIMED_NAMED_BLOCK(CancelReadbackJobs); + + IterateOver(&Graphics->NoiseReadbackJobs, PBOJob, JobIndex) + { + b32 Done = False; + while (!Done) + { + u32 SyncStatus = GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); + switch(SyncStatus) + { + case GL_ALREADY_SIGNALED: + case GL_CONDITION_SATISFIED: + { + AtomicDecrement(&Graphics->NoiseFinalizeJobsPending); + TIMED_NAMED_BLOCK(MapBuffer); + AssertNoGlErrors; + GL.DeleteBuffers(1, &PBOJob->PBOBuf.PBO); + GL.DeleteSync(PBOJob->PBOBuf.Fence); + AssertNoGlErrors; + /* RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); */ + Done = True; + } break; + + case GL_WAIT_FAILED: + { + /* RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); */ + SoftError("Error waiting on gl sync object"); + } break; + + case GL_TIMEOUT_EXPIRED: + { + SleepMs(1); + } break; + } + } + AssertNoGlErrors; + } + + // Clear the jobs + umm C = Count(&Graphics->NoiseReadbackJobs); + auto Z = ZerothIndex(&Graphics->NoiseReadbackJobs); + RangeIterator_t(umm, Index, C) { RemoveUnordered(&Graphics->NoiseReadbackJobs, Z); } + Assert(Count(&Graphics->NoiseReadbackJobs) == 0); + + /* Assert(Graphics->NoiseFinalizeJobsPending == 0); */ + } break; + + { tmatch(bonsai_render_command_allocate_and_map_gpu_element_buffer, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_allocate_and_map_gpu_element_buffer); + + Assert(HasGpuMesh(Command->Dest) == 0); + Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 0); + Command->Dest[0] = AllocateAndMapGpuBuffer(Command->Type, Command->ElementCount); + Assert(HasGpuMesh(Command->Dest) == 1); + Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 1); + + auto Next = WorkQueueEntry(WorkQueueEntryBuildWorldChunkMesh(Command->SynChunk, Command->DestChunk)); + PushWorkQueueEntry(LowPriorityQ, &Next); + } break; + + { tmatch(bonsai_render_command_unmap_gpu_element_buffer, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_unmap_gpu_element_buffer); + FlushBuffersToCard(Command->Buf); + + FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*, Command->Chunk))); + } break; + + { tmatch(bonsai_render_command_unmap_and_deallocate_buffer, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_unmap_and_deallocate_buffer); + + gpu_readback_buffer PBOBuf = Command->PBOBuf; + GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOBuf.PBO); + AssertNoGlErrors; + GL.UnmapBuffer(GL_PIXEL_PACK_BUFFER); + AssertNoGlErrors; + GL.DeleteBuffers(1, &PBOBuf.PBO); + GL.DeleteSync(PBOBuf.Fence); + AssertNoGlErrors; + } break; + + { tmatch(bonsai_render_command_allocate_texture, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_allocate_texture); + + texture *Texture = Command->Texture; + switch (Texture->Channels) + { + case 3: + { + *Texture = MakeTexture_RGB(Texture->Dim, (const v3*)Command->Data, Texture->DebugName, Texture->Slices, Texture->Format); + } break; + + case 4: + { + *Texture = MakeTexture_RGBA(Texture->Dim, Cast(u32*, Command->Data), Texture->DebugName, Texture->Slices, Texture->Format); + } break; + + InvalidDefaultCase; + } + + } break; + + + { tmatch(bonsai_render_command_deallocate_texture, RC, Command) + NotImplemented; + } break; + + + { tmatch(bonsai_render_command_allocate_buffers, RC, Command) + NotImplemented; + } break; + + { tmatch(bonsai_render_command_reallocate_buffers, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_reallocate_buffers); + auto *Handles = Command->Handles; + auto *Mesh = Command->Mesh; + + ReallocateAndSyncGpuBuffers(Handles, Mesh); + DeallocateMesh(Mesh, &Engine->geo_u3d_MeshFreelist); + } break; + + + { tmatch(bonsai_render_command_deallocate_buffers, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_deallocate_buffers); + if (*Command->Buffers) { GL.DeleteBuffers(Command->Count, Command->Buffers); } + RangeIterator(Index, Command->Count) { Command->Buffers[Index] = 0; } + } break; + + + { tmatch(bonsai_render_command_deallocate_world_chunk, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_deallocate_world_chunk); + world_chunk *Chunk = Command->Chunk; + FreeWorldChunk(Engine, Chunk); + } break; + + + { tmatch(bonsai_render_command_clear_all_framebuffers, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_clear_all_framebuffers); + ClearFramebuffers(Graphics, &Engine->RTTGroup); + } break; + + + + + { tmatch(bonsai_render_command_setup_shader, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_setup_shader); + switch (Command->ShaderId) + { + InvalidCase(BonsaiRenderCommand_ShaderId_noop); + + case BonsaiRenderCommand_ShaderId_gBuffer: + { + SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), Editor->MaskSelection); + } break; + + case BonsaiRenderCommand_ShaderId_ShadowMap: + { + SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), Editor->MaskSelection); + } break; + } + } break; + + { tmatch(bonsai_render_command_teardown_shader, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_teardown_shader); + switch (Command->ShaderId) + { + InvalidCase(BonsaiRenderCommand_ShaderId_noop); + + case BonsaiRenderCommand_ShaderId_gBuffer: + { + TeardownGBufferShader(Graphics); + } break; + + case BonsaiRenderCommand_ShaderId_ShadowMap: + { + TeardownShadowMapShader(Graphics); + } break; + } + } break; + + { tmatch(bonsai_render_command_set_shader_uniform, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_set_shader_uniform); + shader *Shader = Command->Shader; + shader_uniform *Uniform = &Command->Uniform; + if (Uniform->ID >= 0) + { + BindUnifromById(Uniform, &Command->TextureUnit); + } + else + { + BindUniformByName(Shader, Uniform, &Command->TextureUnit); + } + } break; + + { tmatch(bonsai_render_command_draw_world_chunk_draw_list, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_draw_world_chunk_draw_list); + RenderDrawList(Engine, Command->DrawList, Command->Shader); + } break; + + { tmatch(bonsai_render_command_draw_all_entities, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_draw_all_entities); + DrawEntities(Command->Shader, EntityTable, &GpuMap->Buffer, 0, Graphics, World, Plat->dt); + } break; + + + { tmatch(bonsai_render_command_initialize_noise_buffer, RC, _Command) + TIMED_NAMED_BLOCK(bonsai_render_command_initialize_noise_buffer); + /* Command = 0; */ + + AtomicIncrement(&Graphics->NoiseFinalizeJobsPending); + + bonsai_render_command_initialize_noise_buffer C = RC->bonsai_render_command_initialize_noise_buffer; + + world_chunk **Chunk2 = &C.Chunk; + world_chunk *Chunk1 = C.Chunk; + world_chunk *Chunk = Chunk1; + + Assert(s64(Chunk) == s64(Chunk1)); + + auto *Shader = &Graphics->GpuNoise.TerrainShader; + + v3i Apron = V3i(2, 2, 2); + v3 NoiseDim = V3(Shader->ChunkDim); + Assert(V3(Chunk1->Dim+Apron) == NoiseDim); + + Shader->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); + Shader->ChunkResolution = V3(Chunk->DimInChunks); + v2i ViewportSize = V2i(s32(NoiseDim.x), s32(NoiseDim.y*NoiseDim.z)); + + { + TIMED_NAMED_BLOCK(Draw); + GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->GpuNoise.FBO.ID); + + SetViewport(ViewportSize); + UseShader(Shader); + + gpu_timer NoiseShaderTimer = StartGpuTimer(); + RenderQuad(); + EndGpuTimer(&NoiseShaderTimer); + + Push(&Graphics->GpuTimers, &NoiseShaderTimer); + + AssertNoGlErrors; + } + + Assert(Chunk1->Dim == V3i(64)); + Assert(NoiseDim == V3(66)); + + s32 NoiseElementCount = s32(Volume(NoiseDim)); + r32 *NoiseValues; + s32 NoiseByteCount = NoiseElementCount*s32(sizeof(u16)); + + { + TIMED_NAMED_BLOCK(GenPboAndInitTransfer); + u32 PBO; + GL.GenBuffers(1, &PBO); + AssertNoGlErrors; + GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); + GL.BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); + AssertNoGlErrors; + GL.ReadPixels(0, 0, ViewportSize.x, ViewportSize.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); + AssertNoGlErrors; + GL.BindBuffer(GL_PIXEL_PACK_BUFFER, 0); + + gl_fence Fence = GL.FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + + dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, V3i(NoiseDim), Chunk}; + Push(&Graphics->NoiseReadbackJobs, &Readback); + } + + } break; + + + { tmatch(bonsai_render_command_do_stuff, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_do_stuff); + + // + // Render begin + // + + ao_render_group *AoGroup = Graphics->AoGroup; + shadow_render_group *SG = Graphics->SG; + + EngineDebug->Render.BytesSolidGeoLastFrame = GpuMap->Buffer.At; + EngineDebug->Render.BytesTransGeoLastFrame = Graphics->Transparency.GpuBuffer.Buffer.At; + + // TODO(Jesse): Make a render frame begin event to stuff this kinda thing onto? + // + // Update color texture, if necessary + // + s32 ColorCount = s32(AtElements(&Graphics->ColorPalette)); + if (ColorCount != Graphics->ColorPaletteTexture.Dim.x) + { + if (Graphics->ColorPaletteTexture.ID) { DeleteTexture(&Graphics->ColorPaletteTexture); } + Graphics->ColorPaletteTexture = + MakeTexture_RGB( V2i(ColorCount, 1), Graphics->ColorPalette.Start, CSz("ColorPalette")); + } + // + // Editor preview + /* DrawStuffToGBufferTextures(Engine, GetApplicationResolution(&Engine->Settings)); */ + { + v3i Radius = World->VisibleRegion/2; + v3i Min = World->Center - Radius; + v3i Max = World->Center + Radius; + + SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), False); + shader *Shader = &Graphics->gBuffer->gBufferShader; + DrawEditorPreview(Engine, Shader); + TeardownGBufferShader(Graphics); + + SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), False); + Shader = &Graphics->SG->Shader.Program; + DrawEditorPreview(Engine, Shader); + TeardownShadowMapShader(Graphics); + } + + /* DrawWorldAndEntitiesToShadowMap(GetShadowMapResolution(&Engine->Settings), Engine); */ + + // TODO(Jesse): Move into engine debug + DebugHighlightWorldChunkBasedOnState(Graphics, EngineDebug->PickedChunk, &GpuMap->Buffer); + + AssertNoGlErrors; + + if (Graphics->Settings.DrawCameraGhost) + { + untextured_3d_geometry_buffer Mesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); + DrawVoxel(&Mesh, {}, V3(0.7f), V3(1)*(Graphics->GameCamera.DistanceFromTarget/1000.f*Graphics->Settings.CameraGhostSize)); + } + + Ensure( FlushBuffersToCard(GpuMap) ); // Unmaps buffer + if (GpuMap->Buffer.At) + { + RenderImmediateGeometryToGBuffer(GetApplicationResolution(&Engine->Settings), GpuMap, Graphics); + /* RenderImmediateGeometryToShadowMap(GpuMap, Graphics); */ + } + Clear(&GpuMap->Buffer); + + + // NOTE(Jesse): I observed the AO lagging a frame behind if this is re-ordered + // after the transparency/luminance textures. I have literally 0 ideas as to + // why that would be, but here we are. + if (Graphics->Settings.UseSsao) { RenderAoTexture(GetApplicationResolution(&Engine->Settings), AoGroup); } + + { + RenderTransparencyBuffers(GetApplicationResolution(&Engine->Settings), &Graphics->Settings, &Graphics->Transparency); + RenderLuminanceTexture(GetApplicationResolution(&Engine->Settings), GpuMap, Lighting, Graphics); + } + + if (Graphics->Settings.UseLightingBloom) { RunBloomRenderPass(Graphics); } + /* if (Graphics->Settings.UseLightingBloom) { GaussianBlurTexture(&Graphics->Gaussian, &Graphics->Lighting.BloomTex, &Graphics->Lighting.BloomFBO); } */ + + CompositeGameTexturesAndDisplay(Plat, Graphics); + + + UiFrameEnd(&Engine->Ui); + + + BonsaiSwapBuffers(&Engine->Stdlib.Os); + + + HotReloadShaders(GetStdlib()); + + + /* GpuMap = GetNextGpuMap(Graphics); */ + + // Map immediate GPU buffers for next frame + MapGpuBuffer_untextured_3d_geometry_buffer(GpuMap); + MapGpuBuffer_untextured_3d_geometry_buffer(&Graphics->Transparency.GpuBuffer); + Assert(GpuMap->Buffer.At == 0); + + Graphics->RenderGate = False; + + IterateOver(&Graphics->GpuTimers, Timer, TimerIndex) + { + if (Timer->Ns == 0) + { + if (QueryGpuTimer(Timer)) + { +#if BONSAI_DEBUG_SYSTEM_API + GetDebugState()->PushHistogramDataPoint(Timer->Ns); + // NOTE(Jesse): This skips the next timer, but it'll get + // hit on the next frame, so no worries .. + RemoveUnordered(&Graphics->GpuTimers, TimerIndex); +#endif + } + } + } + + + } break; + + { tmatch(bonsai_render_command_gl_timer_init, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_init); + AssertNoGlErrors; + GL.GenQueries(1, Command->GlTimerObject); + AssertNoGlErrors; + } break; + + { tmatch(bonsai_render_command_gl_timer_start, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_start); + AssertNoGlErrors; + GL.BeginQuery(GL_TIME_ELAPSED, Command->GlTimerObject); + AssertNoGlErrors; + } break; + + { tmatch(bonsai_render_command_gl_timer_end, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_end); + AssertNoGlErrors; + GL.EndQuery(GL_TIME_ELAPSED); + AssertNoGlErrors; + } break; + + { tmatch(bonsai_render_command_gl_timer_read_value_and_histogram, RC, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_read_value_and_histogram); +#if 0 + AssertNoGlErrors; + u64 TimerNs = 0; + + s32 Available = False; + while (!Available) + { + GL.GetQueryObjectiv(Command->GlTimerObject, GL_QUERY_RESULT_AVAILABLE, &Available); + /* if (Available == False) { Info("Waiting for query object to become available"); } */ + } + + + GL.GetQueryObjectui64v(Command->GlTimerObject, GL_QUERY_RESULT, &TimerNs); + /* Info("GL reported time of (%.2f)ms", f64(TimerNs)/1000000.0); */ + /* GetDebugState()->PushHistogramDataPoint(TimerNs); */ + AssertNoGlErrors; +#endif + } break; + + } + } break; + } + + RewindArena(GetTranArena()); + } + + { + TIMED_NAMED_BLOCK(CheckReadbackJobs); + IterateOver(&Graphics->NoiseReadbackJobs, PBOJob, JobIndex) + { + /* Info("0x%x 0x%x", PBOJob->PBOBuf.PBO, PBOJob->PBOBuf.Fence); */ + u32 SyncStatus = GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); + AssertNoGlErrors; + switch(SyncStatus) + { + case GL_ALREADY_SIGNALED: + case GL_CONDITION_SATISFIED: + { + TIMED_NAMED_BLOCK(MapBuffer); + AssertNoGlErrors; + GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOJob->PBOBuf.PBO); + AssertNoGlErrors; + u16 *NoiseValues = Cast(u16*, GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); + AssertNoGlErrors; + + auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->Chunk)); + PushWorkQueueEntry(&Plat->LowPriority, &BuildMeshJob); + + // TODO(Jesse): This actually makes the loop skip a job because we + // shorten the array, but never update the index we're looking at. + // + // It doesn't matter in this case because this runs every frame, so + // the skipped job is just a frame late. But, it would be nice if + // this was better. + RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); + } break; + + case GL_TIMEOUT_EXPIRED: + { + } break; + + case GL_WAIT_FAILED: + { + SoftError("Error waiting on gl sync object"); + } break; + } + } + } + + if (FutexIsSignaled(ThreadParams->WorkerThreadsExitFutex)) break; + + if (FutexIsSignaled(ThreadParams->WorkerThreadsSuspendFutex)) { WaitOnFutex(ThreadParams->WorkerThreadsSuspendFutex); } + + SleepMs(1); + } + + Info("Exiting Render Thread (%d)", ThreadParams->ThreadIndex); + WaitOnFutex(ThreadParams->WorkerThreadsExitFutex); +} + +link_export THREAD_MAIN_RETURN +RenderThread_Main(void *ThreadStartupParams) +{ + thread_startup_params *ThreadParams = Cast(thread_startup_params*, ThreadStartupParams); + + Global_EngineResources = (engine_resources*)ThreadParams->EngineResources; + Global_ThreadStates = Global_EngineResources->Stdlib.ThreadStates; + Assert(Global_EngineResources); + Assert(Global_ThreadStates); + + WorkerThread_BeforeJobStart(ThreadParams); + + /* Assert(ThreadParams->ThreadIndex > 0); */ + /* SetThreadLocal_ThreadIndex(ThreadParams->ThreadIndex); */ + + engine_resources *Engine = GetEngineResources(); + os *Os = &Engine->Stdlib.Os; + platform *Plat = &Engine->Stdlib.Plat; + + PlatformMakeRenderContextCurrent(Os); + + // NOTE(Jesse): This now happens in stdlib startup + /* s32 VSyncFrames = 0; */ + /* InitResult &= OpenAndInitializeWindow(Os, Plat, VSyncFrames); */ + /* if (InitResult) { InitResult &= InitializeOpenglFunctions(); } */ + + b32 InitResult = True; + if (InitResult) { InitResult &= GraphicsInit(&Engine->Graphics, &Engine->Settings, AllocateArena()); } + + if (InitResult) + { + memory_arena *UiMemory = AllocateArena(); + InitRenderer2D(&Engine->Ui, &Engine->Heap, UiMemory, &Plat->MouseP, &Plat->MouseDP, &Plat->ScreenDim, &Plat->Input); + + bitmap_block_array Bitmaps = {}; + Bitmaps.Memory = GetTranArena(); + LoadBitmapsFromFolderOrdered(CSz("assets/mystic_rpg_icon_pack/Sprites/300%/64x64_sprites"), &Bitmaps, GetTranArena(), GetTranArena()); + LoadBitmapsFromFolderOrdered(CSz("assets/mystic_rpg_icon_pack/Sprites/300%/44x44_sprites"), &Bitmaps, GetTranArena(), GetTranArena()); + Engine->Ui.SpriteTextureArray = CreateTextureArrayFromBitmapBlockArray(&Bitmaps, V2i(64,64)); + } + + FullBarrier; + + Engine->Graphics.Initialized = True; + + if (InitResult) + { + RenderLoop(ThreadParams, Engine); + } + else + { + Error("Render thread initiailization failed."); + } + + THREAD_MAIN_RETURN Result = ReinterpretCast(THREAD_MAIN_RETURN, InitResult); + return Result; +} diff --git a/src/engine/render_settings.h b/src/engine/render_settings.h index 9d7678e30..61608c7fa 100644 --- a/src/engine/render_settings.h +++ b/src/engine/render_settings.h @@ -67,14 +67,14 @@ struct render_settings poof(@version(2)) b32 DrawMajorGrid; b32 DrawMinorGrid; - r32 MajorGridDim; poof(@ui_value_range(0, 32)) + r32 MajorGridDim; poof(@ui_value_range(0, 32)) b32 DrawCameraGhost; r32 CameraGhostSize = 1.f; poof(@ui_value_range(1, 100)) - v3 OffsetOfWorldCenterToGrid; poof(@ui_skip) - b32 Headless; poof(@ui_skip) - + // Moved OffsetOfWorldCenterToGrid to graphics + v3 Ignored; poof(@ui_skip) + b32 Headless; poof(@ui_skip) tone_mapping_type ToneMappingType; @@ -109,8 +109,8 @@ struct render_settings_1 b32 DrawMinorGrid; r32 MajorGridDim; poof(@ui_value_range(0, 32)) - v3 OffsetOfWorldCenterToGrid; poof(@ui_skip) - b32 Headless; poof(@ui_skip) + v3 Ignored; poof(@ui_skip) + b32 Headless; poof(@ui_skip) tone_mapping_type ToneMappingType; @@ -141,7 +141,7 @@ struct render_settings_0 b32 DrawMinorGrid; r32 MajorGridDim; poof(@ui_value_range(0, 32)) - v3 OffsetOfWorldCenterToGrid; poof(@ui_skip) + v3 Ignored; poof(@ui_skip) b32 Headless; poof(@ui_skip) tone_mapping_type ToneMappingType; diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index da4f7ed62..e8a727f46 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -53,608 +53,6 @@ RenderOctree(engine_resources *Engine, shader *Shader) } } - -link_internal void -RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) -{ - // Map immediate GPU buffers for first frame - MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.GpuBuffers[0]); - MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.Transparency.GpuBuffer); - - auto LowPriorityQ = &Engine->Stdlib.Plat.LowPriority; - - os *Os = &Engine->Stdlib.Os; - /* platform *Plat = &Engine->Stdlib.Plat; */ - while ( FutexNotSignaled(ThreadParams->WorkerThreadsExitFutex) ) - { - UNPACK_ENGINE_RESOURCES(Engine); - - WORKER_THREAD_ADVANCE_DEBUG_SYSTEM(); - WorkerThread_BeforeJobStart(ThreadParams); - - while (work_queue_entry *Job = PopWorkQueueEntry(RenderQ)) - { - /* TIMED_NAMED_BLOCK(RENDER_LOOP); */ - tswitch(Job) - { - case type_work_queue_entry_noop: - case type_work_queue_entry_init_world_chunk: - case type_work_queue_entry_copy_buffer_set: - case type_work_queue_entry_copy_buffer_ref: - case type_work_queue_entry_init_asset: - case type_work_queue_entry_update_world_region: - case type_work_queue_entry_rebuild_mesh: - case type_work_queue_entry_finalize_noise_values: - case type_work_queue_entry_build_chunk_mesh: - case type_work_queue_entry_sim_particle_system: - case type_work_queue_entry__align_to_cache_line_helper: - { - InvalidCodePath(); - } break; - - - { tmatch(work_queue_entry_async_function_call, Job, RPC) - TIMED_NAMED_BLOCK(work_queue_entry_async_function_call); - DispatchAsyncFunctionCall(RPC); - } break; - - { tmatch(work_queue_entry__bonsai_render_command, Job, RC) - tswitch(RC) - { - InvalidCase(type_work_queue_entry__bonsai_render_command_noop); - - { case type_bonsai_render_command_cancel_all_noise_readback_jobs: - TIMED_NAMED_BLOCK(CancelReadbackJobs); - - IterateOver(&Graphics->NoiseReadbackJobs, PBOJob, JobIndex) - { - b32 Done = False; - while (!Done) - { - u32 SyncStatus = GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); - switch(SyncStatus) - { - case GL_ALREADY_SIGNALED: - case GL_CONDITION_SATISFIED: - { - AtomicDecrement(&Graphics->NoiseFinalizeJobsPending); - TIMED_NAMED_BLOCK(MapBuffer); - AssertNoGlErrors; - GL.DeleteBuffers(1, &PBOJob->PBOBuf.PBO); - GL.DeleteSync(PBOJob->PBOBuf.Fence); - AssertNoGlErrors; - /* RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); */ - Done = True; - } break; - - case GL_WAIT_FAILED: - { - /* RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); */ - SoftError("Error waiting on gl sync object"); - } break; - - case GL_TIMEOUT_EXPIRED: - { - SleepMs(1); - } break; - } - } - AssertNoGlErrors; - } - - // Clear the jobs - umm C = Count(&Graphics->NoiseReadbackJobs); - auto Z = ZerothIndex(&Graphics->NoiseReadbackJobs); - RangeIterator_t(umm, Index, C) { RemoveUnordered(&Graphics->NoiseReadbackJobs, Z); } - Assert(Count(&Graphics->NoiseReadbackJobs) == 0); - - /* Assert(Graphics->NoiseFinalizeJobsPending == 0); */ - } break; - - { tmatch(bonsai_render_command_allocate_and_map_gpu_element_buffer, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_allocate_and_map_gpu_element_buffer); - - Assert(HasGpuMesh(Command->Dest) == 0); - Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 0); - Command->Dest[0] = AllocateAndMapGpuBuffer(Command->Type, Command->ElementCount); - Assert(HasGpuMesh(Command->Dest) == 1); - Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 1); - - auto Next = WorkQueueEntry(WorkQueueEntryBuildWorldChunkMesh(Command->SynChunk, Command->DestChunk)); - PushWorkQueueEntry(LowPriorityQ, &Next); - } break; - - { tmatch(bonsai_render_command_unmap_gpu_element_buffer, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_unmap_gpu_element_buffer); - FlushBuffersToCard(Command->Buf); - - FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*, Command->Chunk))); - } break; - - { tmatch(bonsai_render_command_unmap_and_deallocate_buffer, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_unmap_and_deallocate_buffer); - - gpu_readback_buffer PBOBuf = Command->PBOBuf; - GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOBuf.PBO); - AssertNoGlErrors; - GL.UnmapBuffer(GL_PIXEL_PACK_BUFFER); - AssertNoGlErrors; - GL.DeleteBuffers(1, &PBOBuf.PBO); - GL.DeleteSync(PBOBuf.Fence); - AssertNoGlErrors; - } break; - - { tmatch(bonsai_render_command_allocate_texture, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_allocate_texture); - - texture *Texture = Command->Texture; - switch (Texture->Channels) - { - case 3: - { - *Texture = MakeTexture_RGB(Texture->Dim, (const v3*)Command->Data, Texture->DebugName, Texture->Slices, Texture->Format); - } break; - - case 4: - { - *Texture = MakeTexture_RGBA(Texture->Dim, Cast(u32*, Command->Data), Texture->DebugName, Texture->Slices, Texture->Format); - } break; - - InvalidDefaultCase; - } - - } break; - - - { tmatch(bonsai_render_command_deallocate_texture, RC, Command) - NotImplemented; - } break; - - - { tmatch(bonsai_render_command_allocate_buffers, RC, Command) - NotImplemented; - } break; - - { tmatch(bonsai_render_command_reallocate_buffers, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_reallocate_buffers); - auto *Handles = Command->Handles; - auto *Mesh = Command->Mesh; - - ReallocateAndSyncGpuBuffers(Handles, Mesh); - DeallocateMesh(Mesh, &Engine->geo_u3d_MeshFreelist); - } break; - - - { tmatch(bonsai_render_command_deallocate_buffers, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_deallocate_buffers); - if (*Command->Buffers) { GL.DeleteBuffers(Command->Count, Command->Buffers); } - RangeIterator(Index, Command->Count) { Command->Buffers[Index] = 0; } - } break; - - - { tmatch(bonsai_render_command_deallocate_world_chunk, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_deallocate_world_chunk); - world_chunk *Chunk = Command->Chunk; - FreeWorldChunk(Engine, Chunk); - } break; - - - { tmatch(bonsai_render_command_clear_all_framebuffers, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_clear_all_framebuffers); - ClearFramebuffers(Graphics, &Engine->RTTGroup); - } break; - - - - - { tmatch(bonsai_render_command_setup_shader, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_setup_shader); - switch (Command->ShaderId) - { - InvalidCase(BonsaiRenderCommand_ShaderId_noop); - - case BonsaiRenderCommand_ShaderId_gBuffer: - { - SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), Editor->MaskSelection); - } break; - - case BonsaiRenderCommand_ShaderId_ShadowMap: - { - SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), Editor->MaskSelection); - } break; - } - } break; - - { tmatch(bonsai_render_command_teardown_shader, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_teardown_shader); - switch (Command->ShaderId) - { - InvalidCase(BonsaiRenderCommand_ShaderId_noop); - - case BonsaiRenderCommand_ShaderId_gBuffer: - { - TeardownGBufferShader(Graphics); - } break; - - case BonsaiRenderCommand_ShaderId_ShadowMap: - { - TeardownShadowMapShader(Graphics); - } break; - } - } break; - - { tmatch(bonsai_render_command_set_shader_uniform, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_set_shader_uniform); - shader *Shader = Command->Shader; - shader_uniform *Uniform = &Command->Uniform; - if (Uniform->ID >= 0) - { - BindUnifromById(Uniform, &Command->TextureUnit); - } - else - { - BindUniformByName(Shader, Uniform, &Command->TextureUnit); - } - } break; - - { tmatch(bonsai_render_command_draw_world_chunk_draw_list, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_draw_world_chunk_draw_list); - RenderDrawList(Engine, Command->DrawList, Command->Shader); - } break; - - { tmatch(bonsai_render_command_draw_all_entities, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_draw_all_entities); - DrawEntities(Command->Shader, EntityTable, &GpuMap->Buffer, 0, Graphics, World, Plat->dt); - } break; - - - { tmatch(bonsai_render_command_initialize_noise_buffer, RC, _Command) - TIMED_NAMED_BLOCK(bonsai_render_command_initialize_noise_buffer); - /* Command = 0; */ - - AtomicIncrement(&Graphics->NoiseFinalizeJobsPending); - - bonsai_render_command_initialize_noise_buffer C = RC->bonsai_render_command_initialize_noise_buffer; - - world_chunk **Chunk2 = &C.Chunk; - world_chunk *Chunk1 = C.Chunk; - world_chunk *Chunk = Chunk1; - - Assert(s64(Chunk) == s64(Chunk1)); - - auto *Shader = &Graphics->GpuNoise.TerrainShader; - - v3i Apron = V3i(2, 2, 2); - v3 NoiseDim = V3(Shader->ChunkDim); - Assert(V3(Chunk1->Dim+Apron) == NoiseDim); - - Shader->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); - Shader->ChunkResolution = V3(Chunk->DimInChunks); - v2i ViewportSize = V2i(s32(NoiseDim.x), s32(NoiseDim.y*NoiseDim.z)); - - { - TIMED_NAMED_BLOCK(Draw); - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->GpuNoise.FBO.ID); - - SetViewport(ViewportSize); - UseShader(Shader); - - gpu_timer NoiseShaderTimer = StartGpuTimer(); - RenderQuad(); - EndGpuTimer(&NoiseShaderTimer); - - Push(&Graphics->GpuTimers, &NoiseShaderTimer); - - AssertNoGlErrors; - } - - Assert(Chunk1->Dim == V3i(64)); - Assert(NoiseDim == V3(66)); - - s32 NoiseElementCount = s32(Volume(NoiseDim)); - r32 *NoiseValues; - s32 NoiseByteCount = NoiseElementCount*s32(sizeof(u16)); - - { - TIMED_NAMED_BLOCK(GenPboAndInitTransfer); - u32 PBO; - GL.GenBuffers(1, &PBO); - AssertNoGlErrors; - GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); - GL.BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); - AssertNoGlErrors; - GL.ReadPixels(0, 0, ViewportSize.x, ViewportSize.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); - AssertNoGlErrors; - GL.BindBuffer(GL_PIXEL_PACK_BUFFER, 0); - - gl_fence Fence = GL.FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - - dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, V3i(NoiseDim), Chunk}; - Push(&Graphics->NoiseReadbackJobs, &Readback); - } - - } break; - - - { tmatch(bonsai_render_command_do_stuff, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_do_stuff); - - // - // Render begin - // - - ao_render_group *AoGroup = Graphics->AoGroup; - shadow_render_group *SG = Graphics->SG; - - EngineDebug->Render.BytesSolidGeoLastFrame = GpuMap->Buffer.At; - EngineDebug->Render.BytesTransGeoLastFrame = Graphics->Transparency.GpuBuffer.Buffer.At; - - // TODO(Jesse): Make a render frame begin event to stuff this kinda thing onto? - // - // Update color texture, if necessary - // - s32 ColorCount = s32(AtElements(&Graphics->ColorPalette)); - if (ColorCount != Graphics->ColorPaletteTexture.Dim.x) - { - if (Graphics->ColorPaletteTexture.ID) { DeleteTexture(&Graphics->ColorPaletteTexture); } - Graphics->ColorPaletteTexture = - MakeTexture_RGB( V2i(ColorCount, 1), Graphics->ColorPalette.Start, CSz("ColorPalette")); - } - // - // Editor preview - /* DrawStuffToGBufferTextures(Engine, GetApplicationResolution(&Engine->Settings)); */ - { - v3i Radius = World->VisibleRegion/2; - v3i Min = World->Center - Radius; - v3i Max = World->Center + Radius; - - SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), False); - shader *Shader = &Graphics->gBuffer->gBufferShader; - DrawEditorPreview(Engine, Shader); - TeardownGBufferShader(Graphics); - - SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), False); - Shader = &Graphics->SG->Shader.Program; - DrawEditorPreview(Engine, Shader); - TeardownShadowMapShader(Graphics); - } - - /* DrawWorldAndEntitiesToShadowMap(GetShadowMapResolution(&Engine->Settings), Engine); */ - - // TODO(Jesse): Move into engine debug - DebugHighlightWorldChunkBasedOnState(Graphics, EngineDebug->PickedChunk, &GpuMap->Buffer); - - AssertNoGlErrors; - - if (Graphics->Settings.DrawCameraGhost) - { - untextured_3d_geometry_buffer Mesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); - DrawVoxel(&Mesh, {}, V3(0.7f), V3(1)*(Graphics->GameCamera.DistanceFromTarget/1000.f*Graphics->Settings.CameraGhostSize)); - } - - Ensure( FlushBuffersToCard(GpuMap) ); // Unmaps buffer - if (GpuMap->Buffer.At) - { - RenderImmediateGeometryToGBuffer(GetApplicationResolution(&Engine->Settings), GpuMap, Graphics); - /* RenderImmediateGeometryToShadowMap(GpuMap, Graphics); */ - } - Clear(&GpuMap->Buffer); - - - // NOTE(Jesse): I observed the AO lagging a frame behind if this is re-ordered - // after the transparency/luminance textures. I have literally 0 ideas as to - // why that would be, but here we are. - if (Graphics->Settings.UseSsao) { RenderAoTexture(GetApplicationResolution(&Engine->Settings), AoGroup); } - - { - RenderTransparencyBuffers(GetApplicationResolution(&Engine->Settings), &Graphics->Settings, &Graphics->Transparency); - RenderLuminanceTexture(GetApplicationResolution(&Engine->Settings), GpuMap, Lighting, Graphics); - } - - if (Graphics->Settings.UseLightingBloom) { RunBloomRenderPass(Graphics); } - /* if (Graphics->Settings.UseLightingBloom) { GaussianBlurTexture(&Graphics->Gaussian, &Graphics->Lighting.BloomTex, &Graphics->Lighting.BloomFBO); } */ - - CompositeGameTexturesAndDisplay(Plat, Graphics); - - - UiFrameEnd(&Engine->Ui); - - - BonsaiSwapBuffers(&Engine->Stdlib.Os); - - - HotReloadShaders(GetStdlib()); - - - /* GpuMap = GetNextGpuMap(Graphics); */ - - // Map immediate GPU buffers for next frame - MapGpuBuffer_untextured_3d_geometry_buffer(GpuMap); - MapGpuBuffer_untextured_3d_geometry_buffer(&Graphics->Transparency.GpuBuffer); - Assert(GpuMap->Buffer.At == 0); - - Graphics->RenderGate = False; - - IterateOver(&Graphics->GpuTimers, Timer, TimerIndex) - { - if (Timer->Ns == 0) - { - if (QueryGpuTimer(Timer)) - { -#if BONSAI_DEBUG_SYSTEM_API - GetDebugState()->PushHistogramDataPoint(Timer->Ns); - // NOTE(Jesse): This skips the next timer, but it'll get - // hit on the next frame, so no worries .. - RemoveUnordered(&Graphics->GpuTimers, TimerIndex); -#endif - } - } - } - - - } break; - - { tmatch(bonsai_render_command_gl_timer_init, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_init); - AssertNoGlErrors; - GL.GenQueries(1, Command->GlTimerObject); - AssertNoGlErrors; - } break; - - { tmatch(bonsai_render_command_gl_timer_start, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_start); - AssertNoGlErrors; - GL.BeginQuery(GL_TIME_ELAPSED, Command->GlTimerObject); - AssertNoGlErrors; - } break; - - { tmatch(bonsai_render_command_gl_timer_end, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_end); - AssertNoGlErrors; - GL.EndQuery(GL_TIME_ELAPSED); - AssertNoGlErrors; - } break; - - { tmatch(bonsai_render_command_gl_timer_read_value_and_histogram, RC, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_read_value_and_histogram); -#if 0 - AssertNoGlErrors; - u64 TimerNs = 0; - - s32 Available = False; - while (!Available) - { - GL.GetQueryObjectiv(Command->GlTimerObject, GL_QUERY_RESULT_AVAILABLE, &Available); - /* if (Available == False) { Info("Waiting for query object to become available"); } */ - } - - - GL.GetQueryObjectui64v(Command->GlTimerObject, GL_QUERY_RESULT, &TimerNs); - /* Info("GL reported time of (%.2f)ms", f64(TimerNs)/1000000.0); */ - /* GetDebugState()->PushHistogramDataPoint(TimerNs); */ - AssertNoGlErrors; -#endif - } break; - - } - } break; - } - - RewindArena(GetTranArena()); - } - - { - TIMED_NAMED_BLOCK(CheckReadbackJobs); - IterateOver(&Graphics->NoiseReadbackJobs, PBOJob, JobIndex) - { - /* Info("0x%x 0x%x", PBOJob->PBOBuf.PBO, PBOJob->PBOBuf.Fence); */ - u32 SyncStatus = GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); - AssertNoGlErrors; - switch(SyncStatus) - { - case GL_ALREADY_SIGNALED: - case GL_CONDITION_SATISFIED: - { - TIMED_NAMED_BLOCK(MapBuffer); - AssertNoGlErrors; - GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOJob->PBOBuf.PBO); - AssertNoGlErrors; - u16 *NoiseValues = Cast(u16*, GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); - AssertNoGlErrors; - - auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->Chunk)); - PushWorkQueueEntry(&Plat->LowPriority, &BuildMeshJob); - - // TODO(Jesse): This actually makes the loop skip a job because we - // shorten the array, but never update the index we're looking at. - // - // It doesn't matter in this case because this runs every frame, so - // the skipped job is just a frame late. But, it would be nice if - // this was better. - RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); - } break; - - case GL_TIMEOUT_EXPIRED: - { - } break; - - case GL_WAIT_FAILED: - { - SoftError("Error waiting on gl sync object"); - } break; - } - } - } - - if (FutexIsSignaled(ThreadParams->WorkerThreadsExitFutex)) break; - - if (FutexIsSignaled(ThreadParams->WorkerThreadsSuspendFutex)) { WaitOnFutex(ThreadParams->WorkerThreadsSuspendFutex); } - - SleepMs(1); - } - - Info("Exiting Render Thread (%d)", ThreadParams->ThreadIndex); - WaitOnFutex(ThreadParams->WorkerThreadsExitFutex); -} - -link_export THREAD_MAIN_RETURN -RenderThread_Main(void *ThreadStartupParams) -{ - thread_startup_params *ThreadParams = Cast(thread_startup_params*, ThreadStartupParams); - - Global_EngineResources = (engine_resources*)ThreadParams->EngineResources; - Global_ThreadStates = Global_EngineResources->Stdlib.ThreadStates; - Assert(Global_EngineResources); - Assert(Global_ThreadStates); - - WorkerThread_BeforeJobStart(ThreadParams); - - /* Assert(ThreadParams->ThreadIndex > 0); */ - /* SetThreadLocal_ThreadIndex(ThreadParams->ThreadIndex); */ - - engine_resources *Engine = GetEngineResources(); - os *Os = &Engine->Stdlib.Os; - platform *Plat = &Engine->Stdlib.Plat; - - PlatformMakeRenderContextCurrent(Os); - - // NOTE(Jesse): This now happens in stdlib startup - /* s32 VSyncFrames = 0; */ - /* InitResult &= OpenAndInitializeWindow(Os, Plat, VSyncFrames); */ - /* if (InitResult) { InitResult &= InitializeOpenglFunctions(); } */ - - b32 InitResult = True; - if (InitResult) { InitResult &= GraphicsInit(&Engine->Graphics, &Engine->Settings, AllocateArena()); } - - if (InitResult) - { - memory_arena *UiMemory = AllocateArena(); - InitRenderer2D(&Engine->Ui, &Engine->Heap, UiMemory, &Plat->MouseP, &Plat->MouseDP, &Plat->ScreenDim, &Plat->Input); - - bitmap_block_array Bitmaps = {}; - Bitmaps.Memory = GetTranArena(); - LoadBitmapsFromFolderOrdered(CSz("assets/mystic_rpg_icon_pack/Sprites/300%/64x64_sprites"), &Bitmaps, GetTranArena(), GetTranArena()); - LoadBitmapsFromFolderOrdered(CSz("assets/mystic_rpg_icon_pack/Sprites/300%/44x44_sprites"), &Bitmaps, GetTranArena(), GetTranArena()); - Engine->Ui.SpriteTextureArray = CreateTextureArrayFromBitmapBlockArray(&Bitmaps, V2i(64,64)); - } - - FullBarrier; - - Engine->Graphics.Initialized = True; - - if (InitResult) - { - RenderLoop(ThreadParams, Engine); - } - else - { - Error("Render thread initiailization failed."); - } - - THREAD_MAIN_RETURN Result = ReinterpretCast(THREAD_MAIN_RETURN, InitResult); - return Result; -} - link_internal b32 InitEngineResources(engine_resources *Engine) { From 6b77db1363460b83de9980f95e9dcf65abdcf006 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 11 Feb 2025 13:38:19 -0700 Subject: [PATCH 152/421] Re-initialize octree nodes when a new selection region overlaps them --- ..._work_queue_entry__bonsai_render_command.h | 6 ++-- ..._work_queue_entry__bonsai_render_command.h | 2 +- ..._work_queue_entry__bonsai_render_command.h | 4 +-- src/engine/editor.cpp | 12 ++++++- src/engine/graphics.h | 2 +- src/engine/render_command.h | 5 +-- src/engine/render_loop.cpp | 4 +-- src/engine/world.cpp | 36 +++++++++---------- src/engine/world.h | 2 +- src/engine/world_chunk.cpp | 11 +++--- 10 files changed, 48 insertions(+), 36 deletions(-) diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index 221f887a7..5c51e9b99 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:218:0 +// src/engine/render_command.h:219:0 link_internal work_queue_entry__bonsai_render_command @@ -291,10 +291,10 @@ WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_cancel_all_noise_readba link_internal bonsai_render_command_initialize_noise_buffer -BonsaiRenderCommandInitializeNoiseBuffer( world_chunk * Chunk ) +BonsaiRenderCommandInitializeNoiseBuffer( octree_node * Node ) { bonsai_render_command_initialize_noise_buffer Reuslt = { - .Chunk = Chunk + .Node = Node }; diff --git a/generated/d_union_work_queue_entry__bonsai_render_command.h b/generated/d_union_work_queue_entry__bonsai_render_command.h index 67ed96697..417235092 100644 --- a/generated/d_union_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:177:0 +// src/engine/render_command.h:178:0 enum work_queue_entry__bonsai_render_command_type { diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index e65a96ece..293873196 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -3,11 +3,11 @@ link_internal void PushBonsaiRenderCommandInitializeNoiseBuffer( work_queue *RenderQueue - , world_chunk* Chunk + , octree_node* Node ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandInitializeNoiseBuffer( Chunk ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandInitializeNoiseBuffer( Node ))); PushWorkQueueEntry(RenderQueue, &Work); } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index b2fafe757..49111acdb 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2281,7 +2281,17 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo } Push(&Node->Edits, &Edit); - QueueChunkForInit(&Plat->RenderQ, Node->Chunk, MeshBit_None); + + if (Node->Chunk) + { + Assert(Node->Type == OctreeNodeType_Leaf); + + world_chunk *Chunk = Node->Chunk; + + DeallocateAndClearWorldChunk(Engine, Chunk); + Chunk->DimInChunks = Node->Resolution; + Chunk->WorldP = Node->WorldP; + } } } } diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 5e09c8615..33502232d 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -8,7 +8,7 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader shader_uniform Uniforms[3]; texture ChunkTexture; - v3 ChunkDim; poof(@uniform) + v3 ChunkDim; poof(@uniform) v3 WorldspaceBasis; poof(@uniform) v3 ChunkResolution; poof(@uniform) }; diff --git a/src/engine/render_command.h b/src/engine/render_command.h index 23649f2ba..08b856486 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -110,9 +110,10 @@ struct bonsai_render_command_do_stuff u32 Ignored = 0; }; +struct octree_node; struct bonsai_render_command_initialize_noise_buffer { - world_chunk *Chunk; + octree_node *Node; }; struct bonsai_render_command_gl_timer_init @@ -245,4 +246,4 @@ link_internal void PushBonsaiRenderCommandAllocateTexture(work_queue *, texture *, void *); link_internal void -PushBonsaiRenderCommandInitializeNoiseBuffer( work_queue *RenderQueue , world_chunk* Chunk ); +PushBonsaiRenderCommandInitializeNoiseBuffer( work_queue *, octree_node *); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index ba72a30d4..4ff3ef47b 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -260,8 +260,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) bonsai_render_command_initialize_noise_buffer C = RC->bonsai_render_command_initialize_noise_buffer; - world_chunk **Chunk2 = &C.Chunk; - world_chunk *Chunk1 = C.Chunk; + world_chunk **Chunk2 = &C.Node->Chunk; + world_chunk *Chunk1 = C.Node->Chunk; world_chunk *Chunk = Chunk1; Assert(s64(Chunk) == s64(Chunk1)); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index c5231e88c..d240231a4 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -626,7 +626,7 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio link_internal void -CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) +FreeOctreeNode(engine_resources *Engine, octree_node **Bucket) { octree_node *Node = *Bucket; *Bucket = 0; @@ -641,7 +641,7 @@ CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) case OctreeNodeType_Branch: { - MergeOctreeChildren(Engine, Node); + FreeOctreeChildren(Engine, Node); } break; } @@ -689,7 +689,7 @@ CheckedDeallocateChildNode(engine_resources *Engine, octree_node **Bucket) #if 1 link_internal u32 -MergeOctreeChildren(engine_resources *Engine, octree_node *Node) +FreeOctreeChildren(engine_resources *Engine, octree_node *Node) { UNPACK_ENGINE_RESOURCES(Engine); @@ -697,14 +697,14 @@ MergeOctreeChildren(engine_resources *Engine, octree_node *Node) Assert(Node->Type == OctreeNodeType_Branch); Node->Type = OctreeNodeType_Leaf; - CheckedDeallocateChildNode(Engine, Node->Children+0); - CheckedDeallocateChildNode(Engine, Node->Children+1); - CheckedDeallocateChildNode(Engine, Node->Children+2); - CheckedDeallocateChildNode(Engine, Node->Children+3); - CheckedDeallocateChildNode(Engine, Node->Children+4); - CheckedDeallocateChildNode(Engine, Node->Children+5); - CheckedDeallocateChildNode(Engine, Node->Children+6); - CheckedDeallocateChildNode(Engine, Node->Children+7); + FreeOctreeNode(Engine, Node->Children+0); + FreeOctreeNode(Engine, Node->Children+1); + FreeOctreeNode(Engine, Node->Children+2); + FreeOctreeNode(Engine, Node->Children+3); + FreeOctreeNode(Engine, Node->Children+4); + FreeOctreeNode(Engine, Node->Children+5); + FreeOctreeNode(Engine, Node->Children+6); + FreeOctreeNode(Engine, Node->Children+7); /* QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); */ @@ -774,9 +774,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue { if (OctreeBranchShouldCollapse(Engine, NodeToSplit)) { - octree_node *Tmp = NodeToSplit; - /* CheckedDeallocateChildNode(Engine, &Tmp); */ - MergeOctreeChildren(Engine, NodeToSplit); + FreeOctreeChildren(Engine, NodeToSplit); } else { @@ -1006,9 +1004,11 @@ MaintainWorldOctree(engine_resources *Engine) octree_stats Stats = {}; /* u32 ChunksCurrentlyQueued = u32(Count(&Graphics->NoiseReadbackJobs)); */ - u32 ChunksCurrentlyQueued = u32(Graphics->NoiseFinalizeJobsPending); + s32 ChunksCurrentlyQueued = s32(Graphics->NoiseFinalizeJobsPending); - u32 MaxToQueueThisFrame = Max(0u, MAX_OCTREE_NODES_QUEUED_PER_FRAME - ChunksCurrentlyQueued); + // NOTE(Jesse): Must be signed because we can force queue chunks in different + // ways (editing), which can cause (MAX_OCTREE_NODES_QUEUED_PER_FRAME - ChunksCurrentlyQueued) to be negative + s32 MaxToQueueThisFrame = Max(0, MAX_OCTREE_NODES_QUEUED_PER_FRAME - ChunksCurrentlyQueued); Assert(MaxToQueueThisFrame <= MAX_OCTREE_NODES_QUEUED_PER_FRAME); /* DEBUG_VALUE_u32(u32(ChunksCurrentlyQueued)); */ @@ -1023,7 +1023,7 @@ MaintainWorldOctree(engine_resources *Engine) /* DEBUG_VALUE_u32(ReusedNode); */ /* DEBUG_VALUE_u32(AllocatedNode); */ - u32 NumQueuedThisFrame = 0; + s32 NumQueuedThisFrame = 0; if (MaxToQueueThisFrame) { RangeIterator(ListIndex, OCTREE_PRIORITY_QUEUE_LIST_COUNT) @@ -1053,7 +1053,7 @@ MaintainWorldOctree(engine_resources *Engine) } /* QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); */ - QueueChunkForInit(&Plat->RenderQ, Node->Chunk, MeshBit_Lod0); + QueueChunkForInit(&Plat->RenderQ, Node, MeshBit_Lod0); ++Stats.NewQueues; if (++NumQueuedThisFrame == MaxToQueueThisFrame) goto done_queueing_nodes; } diff --git a/src/engine/world.h b/src/engine/world.h index 3c3cd48ba..2a6952226 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -242,7 +242,7 @@ link_internal b32 OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node); link_internal u32 -MergeOctreeChildren(engine_resources *Engine, octree_node *Node); +FreeOctreeChildren(engine_resources *Engine, octree_node *Node); link_internal world_chunk_ptr_buffer GatherChunksOverlappingArea(world *World, rect3cp Region, memory_arena *Memory); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 8923b8146..80c2416b7 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3476,10 +3476,10 @@ InitializeWorldChunkEmpty(world_chunk *DestChunk) debug_global u32 TotalChunksQueued; inline void -QueueChunkForInit(work_queue *Queue, world_chunk *Chunk, world_chunk_mesh_bitfield MeshBit) +QueueChunkForInit(work_queue *Queue, octree_node *Node, world_chunk_mesh_bitfield MeshBit) { TIMED_FUNCTION(); - Assert( NotSet(Chunk->Flags, Chunk_Queued) ); + Assert( NotSet(Node->Chunk->Flags, Chunk_Queued) ); ++TotalChunksQueued; @@ -3496,11 +3496,11 @@ QueueChunkForInit(work_queue *Queue, world_chunk *Chunk, world_chunk_mesh_bitfie PushWorkQueueEntry(Queue, &Entry); #else - PushBonsaiRenderCommandInitializeNoiseBuffer(Queue, Chunk); + PushBonsaiRenderCommandInitializeNoiseBuffer(Queue, Node); #endif - Assert( NotSet(Chunk->Flags, Chunk_Queued) ); - SetFlag(&Chunk->Flags, Chunk_Queued); + Assert( NotSet(Node->Chunk->Flags, Chunk_Queued) ); + SetFlag(&Node->Chunk->Flags, Chunk_Queued); } #if 1 @@ -4163,6 +4163,7 @@ GetChunksFromMouseP(engine_resources *Engine, picked_world_chunk_static_buffer * link_internal aabb WorldChunkAABB(world_chunk *Chunk, v3 WorldChunkDim) { + NotImplemented; // NOTE(Jesse): Buggy, needs to account for chunk resolution v3 MinP = V3(Chunk->WorldP) * WorldChunkDim; v3 MaxP = MinP + WorldChunkDim; aabb Result = AABBMinMax(MinP, MaxP); From 0c343451ea4c5c96e2bad1f8b880d7304413b7df Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 11 Feb 2025 14:53:46 -0700 Subject: [PATCH 153/421] Make new shader struct for world edits --- brushes/foo.1.brush | Bin 0 -> 553 bytes brushes/foo.brush | Bin 0 -> 553 bytes examples/terrain_gen/game.cpp | 4 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 19 +++++- generated/for_datatypes_0XxWqGSZ.h | 2 +- generated/for_datatypes_fkubhsYl.h | 2 +- generated/for_datatypes_kv3WBTai.h | 2 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- .../shader_magic_struct_terrain_shader.h | 53 +++++++++++++++ .../shader_magic_struct_world_edit_shader.h | 53 +++++++++++++++ generated/shader_magic_terrain_shader.h | 6 +- src/engine/api.cpp | 2 +- src/engine/editor.cpp | 6 +- src/engine/graphics.h | 24 +++++-- src/engine/render/render_init.cpp | 16 ++--- src/engine/render_loop.cpp | 64 ++++++++++++++---- 18 files changed, 216 insertions(+), 43 deletions(-) create mode 100644 brushes/foo.1.brush create mode 100644 brushes/foo.brush create mode 100644 generated/shader_magic_struct_terrain_shader.h create mode 100644 generated/shader_magic_struct_world_edit_shader.h diff --git a/brushes/foo.1.brush b/brushes/foo.1.brush new file mode 100644 index 0000000000000000000000000000000000000000..e7c7218e99a99454eb3a0752759219ee84b9f762 GIT binary patch literal 553 zcmZQ%fBmq;acW6PW?p(ROch9S%^wKlg{sU+tV}IRO^FBVz^0HJ zsxU7mq;acW6PW?p(ROch9S%^wKlg{sU+tV}IRO^FBVz^0HJ zsxU7Name, UiId(&Window, "shader file name", I++))) { // Force engine to reload new shader - Resources->Graphics.GpuNoise.TerrainShader.Program.FragSourceFilename = Concat(FileNode->Dir, CSz("/"), FileNode->Name, GetTranArena()); - Resources->Graphics.GpuNoise.TerrainShader.Program.FragmentTimeModifiedWhenLoaded = 0; + Resources->Graphics.TerrainRenderContext.Program.FragSourceFilename = Concat(FileNode->Dir, CSz("/"), FileNode->Name, GetTranArena()); + Resources->Graphics.TerrainRenderContext.Program.FragmentTimeModifiedWhenLoaded = 0; } PushNewRow(Ui); } diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 9d968bec2..57dd88bbc 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:65:0 +// src/engine/graphics.h:78:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 23835a3bf..9ffe9f7fb 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:54:0 +// src/engine/graphics.h:67:0 diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 599ccf8bb..16c6d872f 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -387,8 +387,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(gpu_noise_render_group*, &Element->GpuNoise), - CSz("GpuNoise"), + Cast(terrain_shader*, &Element->TerrainRenderContext), + CSz("TerrainRenderContext"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_shader*, &Element->WorldEditRenderContext), + CSz("WorldEditRenderContext"), Params ); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 4c96961c5..18bb81aa2 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -218,7 +218,6 @@ - struct render_to_texture_async_params; @@ -733,6 +732,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index abe1bacaf..cb735fdae 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -218,7 +218,6 @@ - render_to_texture_async_params render_to_texture_async_params; @@ -723,6 +722,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 3c756f314..da4a86240 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -218,7 +218,6 @@ - type_render_to_texture_async_params, @@ -723,6 +722,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index 8a6456a6a..c087af66f 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:51:0 +// src/engine/graphics.h:64:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/shader_magic_struct_terrain_shader.h b/generated/shader_magic_struct_terrain_shader.h new file mode 100644 index 000000000..83aa075d1 --- /dev/null +++ b/generated/shader_magic_struct_terrain_shader.h @@ -0,0 +1,53 @@ +// src/engine/graphics.h:17:0 + +link_internal void +InitializeTerrainShader( terrain_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) +{ + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/default.fragmentshader")); + + u32 UniformIndex = 0; + + Struct->ChunkDim = ChunkDim; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkDim, "ChunkDim"); + ++UniformIndex; + + Struct->WorldspaceBasis = WorldspaceBasis; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->WorldspaceBasis, "WorldspaceBasis"); + ++UniformIndex; + + Struct->ChunkResolution = ChunkResolution; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); + ++UniformIndex; + + if (UniformIndex != 3 ) + { + Error("Shader (terrain_shader) had an incorrect number of uniform slots!"); + } + + + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); +} + +link_internal void +UseShader( terrain_shader *Struct ) +{ + GL.UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + if (UniformIndex != 3 ) + { + Error("Shader (terrain_shader) had an incorrect number of uniform slots!"); + } +} + diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h new file mode 100644 index 000000000..5a370439c --- /dev/null +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -0,0 +1,53 @@ +// src/engine/graphics.h:35:0 + +link_internal void +InitializeWorldEditShader( world_edit_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) +{ + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/default.fragmentshader")); + + u32 UniformIndex = 0; + + Struct->ChunkDim = ChunkDim; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkDim, "ChunkDim"); + ++UniformIndex; + + Struct->WorldspaceBasis = WorldspaceBasis; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->WorldspaceBasis, "WorldspaceBasis"); + ++UniformIndex; + + Struct->ChunkResolution = ChunkResolution; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); + ++UniformIndex; + + if (UniformIndex != 3 ) + { + Error("Shader (world_edit_shader) had an incorrect number of uniform slots!"); + } + + + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); +} + +link_internal void +UseShader( world_edit_shader *Struct ) +{ + GL.UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + if (UniformIndex != 3 ) + { + Error("Shader (world_edit_shader) had an incorrect number of uniform slots!"); + } +} + diff --git a/generated/shader_magic_terrain_shader.h b/generated/shader_magic_terrain_shader.h index ed0c82f2d..9691fe7d8 100644 --- a/generated/shader_magic_terrain_shader.h +++ b/generated/shader_magic_terrain_shader.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:16:0 +// src/engine/graphics.h:17:0 link_internal void InitializeTerrainShader( terrain_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) @@ -19,7 +19,7 @@ InitializeTerrainShader( terrain_shader *Struct , v3 ChunkDim , v3 Worlds Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); ++UniformIndex; - if (UniformIndex != 3 ) + if (UniformIndex != ) { Error("Shader (terrain_shader) had an incorrect number of uniform slots!"); } @@ -45,7 +45,7 @@ UseShader( terrain_shader *Struct ) BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - if (UniformIndex != 3 ) + if (UniformIndex != ) { Error("Shader (terrain_shader) had an incorrect number of uniform slots!"); } diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 0c4d0cee8..be3c02e8c 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -87,7 +87,7 @@ Bonsai_FrameBegin(engine_resources *Resources) // Resources->FrameIndex += 1; - if (Resources->Graphics.GpuNoise.TerrainShader.Program.HotReloaded) + if (Resources->Graphics.TerrainRenderContext.Program.HotReloaded) { auto Plat = &Resources->Stdlib.Plat; diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 49111acdb..58c4a3821 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2255,7 +2255,11 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo // // Update the edit // - Editor->CurrentEdit->Region = Region; + + Editor->CurrentEdit->Type = WorldEdit_BrushType_Layered; + NewBrush(&Editor->CurrentEdit->Layered); + + Editor->CurrentEdit->Region = Region; // TODO(Jesse): I feel like this should be happening more automagically, but .. // Gather newly overlapping nodes and add the edit { diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 33502232d..ab1f136b9 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -7,6 +7,7 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader shader Program; shader_uniform Uniforms[3]; texture ChunkTexture; + framebuffer FBO; v3 ChunkDim; poof(@uniform) v3 WorldspaceBasis; poof(@uniform) @@ -14,14 +15,26 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader }; poof(shader_magic(terrain_shader)) -#include +#include -struct gpu_noise_render_group + +struct world_edit_shader +poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") + @frag_source_file("shaders/terrain/default.fragmentshader") ) { - framebuffer FBO; - terrain_shader TerrainShader; + shader Program; + shader_uniform Uniforms[3]; + texture ChunkTexture; + framebuffer FBO; + + v3 ChunkDim; poof(@uniform) + v3 WorldspaceBasis; poof(@uniform) + v3 ChunkResolution; poof(@uniform) }; +poof(shader_magic(world_edit_shader)) +#include + struct composite_render_group { shader Shader; @@ -121,7 +134,8 @@ struct graphics lighting_render_group Lighting; gaussian_render_group Gaussian; composite_render_group CompositeGroup; - gpu_noise_render_group GpuNoise; + terrain_shader TerrainRenderContext; + world_edit_shader WorldEditRenderContext; // NOTE(Jesse): The array NoiseReadbackJobs stores the PBOs, but there's a 3 // step process going on. First, the job is dispatched (copy values into PBO) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index a87ac9ffe..e812a0d1a 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -776,16 +776,16 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr { - terrain_shader *TerrainShader = &Result->GpuNoise.TerrainShader; + terrain_shader *TerrainShader = &Result->TerrainRenderContext; v3 ChunkDim = V3(66, 66, 66); - InitializeTerrainShader(&Result->GpuNoise.TerrainShader, ChunkDim, {}, {}); + InitializeTerrainShader(TerrainShader, ChunkDim, {}, {}); - Result->GpuNoise.FBO = GenFramebuffer(); + Result->TerrainRenderContext.FBO = GenFramebuffer(); - /* GL.GenQueries(1, &Result->GpuNoise.GlTimerObject); */ - /* Assert(Result->GpuNoise.GlTimerObject); */ + /* GL.GenQueries(1, &Result->TerrainRenderContext.GlTimerObject); */ + /* Assert(Result->TerrainRenderContext.GlTimerObject); */ - GL.BindFramebuffer(GL_FRAMEBUFFER, Result->GpuNoise.FBO.ID); + GL.BindFramebuffer(GL_FRAMEBUFFER, Result->TerrainRenderContext.FBO.ID); v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); /* TerrainShader->ChunkTexture = MakeTexture_SingleChannel(TextureDim, CSz("PerlinNoiseTexture"), False); */ @@ -799,8 +799,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr GL.BindTexture(GL_TEXTURE_2D, 0); } - FramebufferTexture(&Result->GpuNoise.FBO, &TerrainShader->ChunkTexture); - SetDrawBuffers(&Result->GpuNoise.FBO); + FramebufferTexture(&Result->TerrainRenderContext.FBO, &TerrainShader->ChunkTexture); + SetDrawBuffers(&Result->TerrainRenderContext.FBO); Ensure(CheckAndClearFramebuffer()); } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 4ff3ef47b..a7c7a125e 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -260,43 +260,77 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) bonsai_render_command_initialize_noise_buffer C = RC->bonsai_render_command_initialize_noise_buffer; + octree_node *Node = C.Node; world_chunk **Chunk2 = &C.Node->Chunk; world_chunk *Chunk1 = C.Node->Chunk; world_chunk *Chunk = Chunk1; Assert(s64(Chunk) == s64(Chunk1)); - auto *Shader = &Graphics->GpuNoise.TerrainShader; - - v3i Apron = V3i(2, 2, 2); - v3 NoiseDim = V3(Shader->ChunkDim); - Assert(V3(Chunk1->Dim+Apron) == NoiseDim); - - Shader->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); - Shader->ChunkResolution = V3(Chunk->DimInChunks); + auto *TerrainShader = &Graphics->TerrainRenderContext; + v3 NoiseDim = V3(TerrainShader->ChunkDim); v2i ViewportSize = V2i(s32(NoiseDim.x), s32(NoiseDim.y*NoiseDim.z)); { - TIMED_NAMED_BLOCK(Draw); - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->GpuNoise.FBO.ID); + + v3i Apron = V3i(2, 2, 2); + Assert(V3(Chunk1->Dim+Apron) == NoiseDim); + + TerrainShader->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); + TerrainShader->ChunkResolution = V3(Chunk->DimInChunks); + + TIMED_NAMED_BLOCK(TerrainDrawCall); + GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->TerrainRenderContext.FBO.ID); SetViewport(ViewportSize); - UseShader(Shader); + UseShader(TerrainShader); - gpu_timer NoiseShaderTimer = StartGpuTimer(); + gpu_timer Timer = StartGpuTimer(); RenderQuad(); - EndGpuTimer(&NoiseShaderTimer); + EndGpuTimer(&Timer); - Push(&Graphics->GpuTimers, &NoiseShaderTimer); + Push(&Graphics->GpuTimers, &Timer); AssertNoGlErrors; } + { + UseShader(&Graphics->WorldEditRenderContext); + IterateOver(&Node->Edits, Edit, EditIndex) + { + Edit->Type = WorldEdit_BrushType_Layered; + switch (Edit->Type) + { + case WorldEdit_BrushType_Disabled: + case WorldEdit_BrushType_Single: + case WorldEdit_BrushType_Asset: + case WorldEdit_BrushType_Entity: + { + NotImplemented; + } break; + + case WorldEdit_BrushType_Layered: + { + TIMED_NAMED_BLOCK(WorldEditDrawCall); + + gpu_timer Timer = StartGpuTimer(); + RenderQuad(); + EndGpuTimer(&Timer); + + Push(&Graphics->GpuTimers, &Timer); + + AssertNoGlErrors; + } break; + + } + } + } + + Assert(Chunk1->Dim == V3i(64)); Assert(NoiseDim == V3(66)); s32 NoiseElementCount = s32(Volume(NoiseDim)); - r32 *NoiseValues; s32 NoiseByteCount = NoiseElementCount*s32(sizeof(u16)); { From ad9c1ace938ce2fc39ac9945cab293fb3c0f7d54 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 12 Feb 2025 14:31:15 -0700 Subject: [PATCH 154/421] Nominally set up world edit shader path --- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- .../shader_magic_struct_world_edit_shader.h | 17 ++++-- shaders/terrain/default.fragmentshader | 3 + src/engine/graphics.h | 7 +-- src/engine/render/render_init.cpp | 14 ++++- src/engine/render_loop.cpp | 57 +++++++++++-------- 8 files changed, 64 insertions(+), 40 deletions(-) diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 57dd88bbc..9e724ba6b 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:78:0 +// src/engine/graphics.h:77:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 9ffe9f7fb..5a789763c 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:67:0 +// src/engine/graphics.h:66:0 diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index c087af66f..59e33fe3c 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:64:0 +// src/engine/graphics.h:63:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index 5a370439c..ca44e497c 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -1,9 +1,9 @@ -// src/engine/graphics.h:35:0 +// src/engine/graphics.h:34:0 link_internal void -InitializeWorldEditShader( world_edit_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) +InitializeWorldEditShader( world_edit_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution , s32 Type ) { - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/default.fragmentshader")); + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); u32 UniformIndex = 0; @@ -19,7 +19,11 @@ InitializeWorldEditShader( world_edit_shader *Struct , v3 ChunkDim , v3 W Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); ++UniformIndex; - if (UniformIndex != 3 ) + Struct->Type = Type; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->Type, "Type"); + ++UniformIndex; + + if (UniformIndex != 4 ) { Error("Shader (world_edit_shader) had an incorrect number of uniform slots!"); } @@ -45,7 +49,10 @@ UseShader( world_edit_shader *Struct ) BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - if (UniformIndex != 3 ) + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + if (UniformIndex != 4 ) { Error("Shader (world_edit_shader) had an incorrect number of uniform slots!"); } diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index 4a634aee6..cdae70c25 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -245,6 +245,7 @@ void main() { v3 xyz = Basis / (Period/Octave); + /* f32 gn = white_noise(Basis); */ v4 gn = value_noise_derivs(xyz+warp); /* v4 gn = gradient_noise_derivs(xyz+warp); */ /* v4 gn = voronoi_noise(xyz+warp, V3(1.f), V3(1.f)); */ @@ -252,8 +253,10 @@ void main() // NOTE(Jesse): yzw is not derivitives for voronoi_noise deriv += gn.yzw; + /* deriv += v3(gn); */ NoiseValue = NoiseValue + (gn.x * (Amplitude/Octave)); + /* NoiseValue = NoiseValue + (gn * (Amplitude/Octave)); */ } deriv = normalize(deriv); diff --git a/src/engine/graphics.h b/src/engine/graphics.h index ab1f136b9..15293190e 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -20,16 +20,15 @@ poof(shader_magic(terrain_shader)) struct world_edit_shader poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") - @frag_source_file("shaders/terrain/default.fragmentshader") ) + @frag_source_file("shaders/terrain/world_edit.fragmentshader") ) { shader Program; - shader_uniform Uniforms[3]; - texture ChunkTexture; - framebuffer FBO; + shader_uniform Uniforms[4]; v3 ChunkDim; poof(@uniform) v3 WorldspaceBasis; poof(@uniform) v3 ChunkResolution; poof(@uniform) + s32 Type; poof(@uniform) }; poof(shader_magic(world_edit_shader)) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index e812a0d1a..d4a46ce05 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -775,7 +775,6 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr { - terrain_shader *TerrainShader = &Result->TerrainRenderContext; v3 ChunkDim = V3(66, 66, 66); InitializeTerrainShader(TerrainShader, ChunkDim, {}, {}); @@ -788,12 +787,13 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr GL.BindFramebuffer(GL_FRAMEBUFFER, Result->TerrainRenderContext.FBO.ID); v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); - /* TerrainShader->ChunkTexture = MakeTexture_SingleChannel(TextureDim, CSz("PerlinNoiseTexture"), False); */ + /* TerrainShader->ChunkTexture = MakeTexture_SingleChannel(TextureDim, CSz("TerrainNoiseTexture"), False); */ u32 Channels = 1; u32 Slices = 1; { - TerrainShader->ChunkTexture = GenTexture(TextureDim, CSz("PerlinNoiseTexture"), TextureStorageFormat_R16I, Channels, Slices, False); + // @shared_terrain_texture + TerrainShader->ChunkTexture = GenTexture(TextureDim, CSz("TerrainNoiseTexture"), TextureStorageFormat_R16I, Channels, Slices, False); GL.TexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, TextureDim.x, TextureDim.y, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); AssertNoGlErrors; GL.BindTexture(GL_TEXTURE_2D, 0); @@ -805,6 +805,14 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Ensure(CheckAndClearFramebuffer()); } + { + world_edit_shader *WorldEditShader = &Result->WorldEditRenderContext; + v3 ChunkDim = V3(66, 66, 66); + InitializeWorldEditShader(WorldEditShader, ChunkDim, {}, {}, {}); + + Ensure(CheckAndClearFramebuffer()); + } + GL.Enable(GL_CULL_FACE); GL.CullFace(GL_BACK); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index a7c7a125e..d35fcadc4 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -285,43 +285,50 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) SetViewport(ViewportSize); UseShader(TerrainShader); - gpu_timer Timer = StartGpuTimer(); + /* gpu_timer Timer = StartGpuTimer(); */ RenderQuad(); - EndGpuTimer(&Timer); - - Push(&Graphics->GpuTimers, &Timer); + /* EndGpuTimer(&Timer); */ + /* Push(&Graphics->GpuTimers, &Timer); */ AssertNoGlErrors; } { - UseShader(&Graphics->WorldEditRenderContext); - IterateOver(&Node->Edits, Edit, EditIndex) + if (TotalElements(&Node->Edits)) { - Edit->Type = WorldEdit_BrushType_Layered; - switch (Edit->Type) + world_edit_shader *EditShader = &Graphics->WorldEditRenderContext; + AssertNoGlErrors; + UseShader(EditShader); + AssertNoGlErrors; + IterateOver(&Node->Edits, Edit, EditIndex) { - case WorldEdit_BrushType_Disabled: - case WorldEdit_BrushType_Single: - case WorldEdit_BrushType_Asset: - case WorldEdit_BrushType_Entity: - { - NotImplemented; - } break; - - case WorldEdit_BrushType_Layered: + Edit->Type = WorldEdit_BrushType_Layered; + switch (Edit->Type) { - TIMED_NAMED_BLOCK(WorldEditDrawCall); - - gpu_timer Timer = StartGpuTimer(); - RenderQuad(); - EndGpuTimer(&Timer); + case WorldEdit_BrushType_Disabled: + case WorldEdit_BrushType_Single: + case WorldEdit_BrushType_Asset: + case WorldEdit_BrushType_Entity: + { + NotImplemented; + } break; + + case WorldEdit_BrushType_Layered: + { + TIMED_NAMED_BLOCK(WorldEditDrawCall); + + BindUniformByName(&EditShader->Program, "Type", Edit->Type); + AssertNoGlErrors; - Push(&Graphics->GpuTimers, &Timer); + /* gpu_timer Timer = StartGpuTimer(); */ + RenderQuad(); + /* EndGpuTimer(&Timer); */ + /* Push(&Graphics->GpuTimers, &Timer); */ - AssertNoGlErrors; - } break; + AssertNoGlErrors; + } break; + } } } } From 2b704ce85ea66097f270ca6132147e68e8edbe89 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 12 Feb 2025 19:29:40 -0700 Subject: [PATCH 155/421] Factor Terrain Gen/Finalize into seperate shader stages --- examples/terrain_gen/game.cpp | 4 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 23 +- generated/for_datatypes_0XxWqGSZ.h | 3 +- generated/for_datatypes_fkubhsYl.h | 3 +- generated/for_datatypes_kv3WBTai.h | 3 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- ...c_struct_terrain_finalize_render_context.h | 43 +++ .../shader_magic_struct_terrain_shader.h | 10 +- .../shader_magic_struct_world_edit_shader.h | 10 +- .../terrain/TerrainFinalize.fragmentshader | 20 ++ shaders/terrain/default.fragmentshader | 13 +- shaders/terrain/world_edit.fragmentshader | 269 ++++++++++++++++++ src/engine/api.cpp | 2 +- src/engine/graphics.h | 36 ++- src/engine/render/render_init.cpp | 50 ++-- src/engine/render_loop.cpp | 33 ++- 18 files changed, 468 insertions(+), 60 deletions(-) create mode 100644 generated/shader_magic_struct_terrain_finalize_render_context.h create mode 100644 shaders/terrain/TerrainFinalize.fragmentshader create mode 100644 shaders/terrain/world_edit.fragmentshader diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index f510b957e..06cfb14e7 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -826,8 +826,8 @@ BONSAI_API_MAIN_THREAD_CALLBACK() if (Button(Ui, FileNode->Name, UiId(&Window, "shader file name", I++))) { // Force engine to reload new shader - Resources->Graphics.TerrainRenderContext.Program.FragSourceFilename = Concat(FileNode->Dir, CSz("/"), FileNode->Name, GetTranArena()); - Resources->Graphics.TerrainRenderContext.Program.FragmentTimeModifiedWhenLoaded = 0; + Resources->Graphics.TerrainGenRC.Program.FragSourceFilename = Concat(FileNode->Dir, CSz("/"), FileNode->Name, GetTranArena()); + Resources->Graphics.TerrainGenRC.Program.FragmentTimeModifiedWhenLoaded = 0; } PushNewRow(Ui); } diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 9e724ba6b..5134295bc 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:77:0 +// src/engine/graphics.h:95:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 5a789763c..5fbc628a8 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:66:0 +// src/engine/graphics.h:84:0 diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 16c6d872f..9e137c8a1 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -387,8 +387,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(terrain_shader*, &Element->TerrainRenderContext), - CSz("TerrainRenderContext"), + Cast(terrain_gen_render_context*, &Element->TerrainGenRC), + CSz("TerrainGenRC"), Params ); @@ -402,8 +402,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_shader*, &Element->WorldEditRenderContext), - CSz("WorldEditRenderContext"), + Cast(terrain_finalize_render_context*, &Element->TerrainFinalizeRC), + CSz("TerrainFinalizeRC"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_render_context*, &Element->WorldEditRC), + CSz("WorldEditRC"), Params ); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 18bb81aa2..70b597f5d 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -217,6 +217,8 @@ + + @@ -732,7 +734,6 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) - struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index cb735fdae..af783c280 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -220,9 +220,10 @@ -render_to_texture_async_params render_to_texture_async_params; +render_to_texture_async_params render_to_texture_async_params; + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index da4a86240..62fa773b8 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -220,9 +220,10 @@ -type_render_to_texture_async_params, +type_render_to_texture_async_params, + diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index 59e33fe3c..97f6cf602 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:63:0 +// src/engine/graphics.h:81:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h new file mode 100644 index 000000000..f2b2fee5e --- /dev/null +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -0,0 +1,43 @@ +// src/engine/graphics.h:51:0 + +link_internal void +InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct , texture *InputTex ) +{ + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/TerrainFinalize.fragmentshader")); + + u32 UniformIndex = 0; + + Struct->InputTex = InputTex; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->InputTex, "InputTex"); + ++UniformIndex; + + + + if (UniformIndex != 1 ) + { + Error("Shader (terrain_finalize_render_context) had an incorrect number of uniform slots!"); + } + + + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); +} + +link_internal void +UseShader( terrain_finalize_render_context *Struct ) +{ + GL.UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + + + if (UniformIndex != 1 ) + { + Error("Shader (terrain_finalize_render_context) had an incorrect number of uniform slots!"); + } +} + diff --git a/generated/shader_magic_struct_terrain_shader.h b/generated/shader_magic_struct_terrain_shader.h index 83aa075d1..7d6164e96 100644 --- a/generated/shader_magic_struct_terrain_shader.h +++ b/generated/shader_magic_struct_terrain_shader.h @@ -1,7 +1,7 @@ -// src/engine/graphics.h:17:0 +// src/engine/graphics.h:19:0 link_internal void -InitializeTerrainShader( terrain_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) +InitializeTerrainGenRenderContext( terrain_gen_render_context *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) { Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/default.fragmentshader")); @@ -21,7 +21,7 @@ InitializeTerrainShader( terrain_shader *Struct , v3 ChunkDim , v3 Worlds if (UniformIndex != 3 ) { - Error("Shader (terrain_shader) had an incorrect number of uniform slots!"); + Error("Shader (terrain_gen_render_context) had an incorrect number of uniform slots!"); } @@ -30,7 +30,7 @@ InitializeTerrainShader( terrain_shader *Struct , v3 ChunkDim , v3 Worlds } link_internal void -UseShader( terrain_shader *Struct ) +UseShader( terrain_gen_render_context *Struct ) { GL.UseProgram(Struct->Program.ID); @@ -47,7 +47,7 @@ UseShader( terrain_shader *Struct ) if (UniformIndex != 3 ) { - Error("Shader (terrain_shader) had an incorrect number of uniform slots!"); + Error("Shader (terrain_gen_render_context) had an incorrect number of uniform slots!"); } } diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index ca44e497c..693d6b9aa 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -1,7 +1,7 @@ -// src/engine/graphics.h:34:0 +// src/engine/graphics.h:36:0 link_internal void -InitializeWorldEditShader( world_edit_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution , s32 Type ) +InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution , s32 Type ) { Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); @@ -25,7 +25,7 @@ InitializeWorldEditShader( world_edit_shader *Struct , v3 ChunkDim , v3 W if (UniformIndex != 4 ) { - Error("Shader (world_edit_shader) had an incorrect number of uniform slots!"); + Error("Shader (world_edit_render_context) had an incorrect number of uniform slots!"); } @@ -34,7 +34,7 @@ InitializeWorldEditShader( world_edit_shader *Struct , v3 ChunkDim , v3 W } link_internal void -UseShader( world_edit_shader *Struct ) +UseShader( world_edit_render_context *Struct ) { GL.UseProgram(Struct->Program.ID); @@ -54,7 +54,7 @@ UseShader( world_edit_shader *Struct ) if (UniformIndex != 4 ) { - Error("Shader (world_edit_shader) had an incorrect number of uniform slots!"); + Error("Shader (world_edit_render_context) had an incorrect number of uniform slots!"); } } diff --git a/shaders/terrain/TerrainFinalize.fragmentshader b/shaders/terrain/TerrainFinalize.fragmentshader new file mode 100644 index 000000000..5d9e2803a --- /dev/null +++ b/shaders/terrain/TerrainFinalize.fragmentshader @@ -0,0 +1,20 @@ +uniform sampler2D InputTex; + +in vec2 UV; +out layout(location = 0) uint Output; + + +void main() +{ + v4 TexLookup = texture(InputTex, UV); + + f32 NoiseValue = TexLookup.a; + v3 ColorValue = TexLookup.rgb; + + uint SolidBit = NoiseValue > 0.f ? 1u : 0u; + uint PackedColor = PackRGB(ColorValue); + /* uint PackedColor = 3543u; */ + + Output = (SolidBit << 15) | PackedColor; + /* Output = uint(white_noise(v3(gl_FragCoord.xy, 1.f))*100000.f); */ +} diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index cdae70c25..4edcfa49f 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -2,7 +2,7 @@ uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; in vec2 UV; -out uint Output; +out v4 Output; /* layout (location = 0) out float Output; */ @@ -272,9 +272,12 @@ void main() // -- end user code -- // - uint SolidBit = NoiseValue > 0.f ? 1u : 0u; - uint PackedColor = PackRGB(ColorValue); - /* uint PackedColor = 3543u; */ + Output.rgb = ColorValue; + Output.a = NoiseValue; - Output = (SolidBit << 15) | PackedColor; + /* uint SolidBit = NoiseValue > 0.f ? 1u : 0u; */ + /* uint PackedColor = PackRGB(ColorValue); */ + /* /1* uint PackedColor = 3543u; *1/ */ + + /* Output = (SolidBit << 15) | PackedColor; */ } diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader new file mode 100644 index 000000000..c56e3f065 --- /dev/null +++ b/shaders/terrain/world_edit.fragmentshader @@ -0,0 +1,269 @@ +uniform v3 WorldspaceBasis; +uniform v3 ChunkResolution; +uniform int Type; + +in vec2 UV; +out uint Output; +/* layout (location = 0) out float Output; */ + + +// https://www.shadertoy.com/view/4dffRH +// +// +// +// The MIT License +// Copyright © 2017 Inigo Quilez +// 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. +// +// https://www.youtube.com/c/InigoQuilez +// https://iquilezles.org/ + +// Computes the analytic derivatives of a 3D Gradient Noise. This can be used for example to compute normals to a +// 3d rocks based on Gradient Noise without approximating the gradient by having to take central differences. +// +// More info here: https://iquilezles.org/articles/gradientnoise + +// All noise functions here: +// +// https://www.shadertoy.com/playlist/fXlXzf&from=0&num=12 + + +// 0: integer hash +// 1: float hash (aliasing based) +#define METHOD 1 + +// 0: cubic +// 1: quintic +#define INTERPOLANT 1 + + +#if METHOD==0 +vec3 hash( ivec3 p ) // this hash is not production ready, please +{ // replace this by something better + ivec3 n = ivec3( p.x*127 + p.y*311 + p.z*74, + p.x*269 + p.y*183 + p.z*246, + p.x*113 + p.y*271 + p.z*124); + + // 1D hash by Hugo Elias + n = (n << 13) ^ n; + n = n * (n * n * 15731 + 789221) + 1376312589; + return -1.0+2.0*vec3( n & ivec3(0x0fffffff))/float(0x0fffffff); +} + +#else +vec3 hash( vec3 p ) // this hash is not production ready, please +{ // replace this by something better + p = vec3( dot(p,vec3(127.1,311.7, 74.7)), + dot(p,vec3(269.5,183.3,246.1)), + dot(p,vec3(113.5,271.9,124.6))); + + return -1.0 + 2.0*fract(sin(p)*43758.5453123); +} +#endif + +vec4 gradient_noise_derivs( in vec3 x ) +{ + // grid + #if METHOD==0 + ivec3 i = ivec3(floor(x)); + #else + vec3 i = floor(x); + #endif + vec3 f = fract(x); + + #if INTERPOLANT==1 + // quintic interpolant + vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); + vec3 du = 30.0*f*f*(f*(f-2.0)+1.0); + #else + // cubic interpolant + vec3 u = f*f*(3.0-2.0*f); + vec3 du = 6.0*f*(1.0-f); + #endif + + // gradients + #if METHOD==0 + vec3 ga = hash( i+ivec3(0,0,0) ); + vec3 gb = hash( i+ivec3(1,0,0) ); + vec3 gc = hash( i+ivec3(0,1,0) ); + vec3 gd = hash( i+ivec3(1,1,0) ); + vec3 ge = hash( i+ivec3(0,0,1) ); + vec3 gf = hash( i+ivec3(1,0,1) ); + vec3 gg = hash( i+ivec3(0,1,1) ); + vec3 gh = hash( i+ivec3(1,1,1) ); + #else + vec3 ga = hash( i+vec3(0.0,0.0,0.0) ); + vec3 gb = hash( i+vec3(1.0,0.0,0.0) ); + vec3 gc = hash( i+vec3(0.0,1.0,0.0) ); + vec3 gd = hash( i+vec3(1.0,1.0,0.0) ); + vec3 ge = hash( i+vec3(0.0,0.0,1.0) ); + vec3 gf = hash( i+vec3(1.0,0.0,1.0) ); + vec3 gg = hash( i+vec3(0.0,1.0,1.0) ); + vec3 gh = hash( i+vec3(1.0,1.0,1.0) ); + #endif + + // projections + float va = dot( ga, f-vec3(0.0,0.0,0.0) ); + float vb = dot( gb, f-vec3(1.0,0.0,0.0) ); + float vc = dot( gc, f-vec3(0.0,1.0,0.0) ); + float vd = dot( gd, f-vec3(1.0,1.0,0.0) ); + float ve = dot( ge, f-vec3(0.0,0.0,1.0) ); + float vf = dot( gf, f-vec3(1.0,0.0,1.0) ); + float vg = dot( gg, f-vec3(0.0,1.0,1.0) ); + float vh = dot( gh, f-vec3(1.0,1.0,1.0) ); + + // interpolations + return vec4( va + u.x*(vb-va) + u.y*(vc-va) + u.z*(ve-va) + u.x*u.y*(va-vb-vc+vd) + u.y*u.z*(va-vc-ve+vg) + u.z*u.x*(va-vb-ve+vf) + (-va+vb+vc-vd+ve-vf-vg+vh)*u.x*u.y*u.z, // value + ga + u.x*(gb-ga) + u.y*(gc-ga) + u.z*(ge-ga) + u.x*u.y*(ga-gb-gc+gd) + u.y*u.z*(ga-gc-ge+gg) + u.z*u.x*(ga-gb-ge+gf) + (-ga+gb+gc-gd+ge-gf-gg+gh)*u.x*u.y*u.z + // derivatives + du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); +} + +// Doesn't support integer hashing +#if METHOD == 1 +float gradient_noise( in vec3 p ) +{ + vec3 i = floor( p ); + vec3 f = fract( p ); + + #if INTERPOLANT==1 + // quintic interpolant + vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); + #else + // cubic interpolant + vec3 u = f*f*(3.0-2.0*f); + #endif + + return mix( mix( mix( dot( hash( i + vec3(0.0,0.0,0.0) ), f - vec3(0.0,0.0,0.0) ), + dot( hash( i + vec3(1.0,0.0,0.0) ), f - vec3(1.0,0.0,0.0) ), u.x), + mix( dot( hash( i + vec3(0.0,1.0,0.0) ), f - vec3(0.0,1.0,0.0) ), + dot( hash( i + vec3(1.0,1.0,0.0) ), f - vec3(1.0,1.0,0.0) ), u.x), u.y), + mix( mix( dot( hash( i + vec3(0.0,0.0,1.0) ), f - vec3(0.0,0.0,1.0) ), + dot( hash( i + vec3(1.0,0.0,1.0) ), f - vec3(1.0,0.0,1.0) ), u.x), + mix( dot( hash( i + vec3(0.0,1.0,1.0) ), f - vec3(0.0,1.0,1.0) ), + dot( hash( i + vec3(1.0,1.0,1.0) ), f - vec3(1.0,1.0,1.0) ), u.x), u.y), u.z ); +} +#endif + +vec3 vhash(vec3 UV, vec3 offset) +{ + mat3 m = mat3(127.1,311.7, 74.7,269.5,183.3,246.1,113.5,271.9,124.6); + UV = fract(sin(UV* m) * 46839.32); + return vec3(sin(UV.z * +offset.x) * 0.5 + 0.5, cos(UV.x* offset.y) * 0.5 + 0.5,tan(UV.y * offset.z) * 0.5 + 0.5); +} + +vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) +{ + vec3 g = floor(p * CellDensity); + vec3 f = fract(p * CellDensity); + float res = 8.0; + float md=8.0; + vec3 mr; + vec4 Out; + for( int z=-1; z<=1; z++ ) + for( int y=-1; y<=1; y++ ) + for( int x=-1; x<=1; x++ ) + { + vec3 lattice = vec3(x,y,z); + vec3 offset=vhash(lattice + g ,AngleOffset); + vec3 r = lattice +offset -f; + float d = dot( r, r ); + if (d < res) + { + res=d; + mr=r; + } + } + + res = 8.0; + for( int z=-1; z<=1; z++ ) + for( int y=-1; y<=1; y++ ) + for( int x=-1; x<=1; x++ ) + { + vec3 lattice = vec3(x,y,z); + vec3 offset=vhash(lattice + g ,AngleOffset); + vec3 r = lattice +offset -f; + float d = dot( r, r ); + if( d < res ) + { + res = d; + Out.x= offset.x; + Out.y = d; + } + if( dot(mr-r,mr-r)>0.00001) + { + md = min( md, dot( 0.5*(mr+r), normalize(r-mr) ) ); + } + } + Out.z = mix(1.0, 0.0, smoothstep( 0.0, 0.1, md )); + Out.w = 1.0-smoothstep( 0.0, 0.1, res); + return Out; +} + + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); + + v3 Offset = V3(-1, -1, -1); + v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + + NoiseValue = white_noise(Basis); + /* switch (Type) */ + /* { */ + /* case 4: // WorldEdit_BrushType_Layered */ + /* { */ + /* v3 Period = V3(100.f); */ + /* float Amplitude = 200.f; */ + /* s32 Octaves = 1; */ + + /* v3 deriv = v3(0.f); */ + /* f32 warp = 0.f; */ + + /* for (s32 Octave = 1; Octave <= Octaves; ++Octave) */ + /* { */ + /* v3 xyz = Basis / (Period/Octave); */ + /* f32 gn = gradient_noise(xyz+warp); */ + /* NoiseValue = NoiseValue + (gn * (Amplitude/Octave)); */ + /* } */ + + /* break; */ + /* } */ + + /* default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; */ + /* } */ + } + + // + // -- end user code -- + // + + uint SolidBit = NoiseValue > 0.f ? 1u : 0u; + uint PackedColor = PackRGB(ColorValue); + /* uint PackedColor = 3543u; */ + + Output = (SolidBit << 15) | PackedColor; +} diff --git a/src/engine/api.cpp b/src/engine/api.cpp index be3c02e8c..6abbce898 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -87,7 +87,7 @@ Bonsai_FrameBegin(engine_resources *Resources) // Resources->FrameIndex += 1; - if (Resources->Graphics.TerrainRenderContext.Program.HotReloaded) + if (Resources->Graphics.TerrainGenRC.Program.HotReloaded) { auto Plat = &Resources->Stdlib.Plat; diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 15293190e..f740b34e7 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -1,12 +1,12 @@ -struct terrain_shader +struct terrain_gen_render_context poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") @frag_source_file("shaders/terrain/default.fragmentshader") ) { shader Program; shader_uniform Uniforms[3]; - texture ChunkTexture; + texture NoiseTexture; framebuffer FBO; v3 ChunkDim; poof(@uniform) @@ -14,11 +14,13 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader v3 ChunkResolution; poof(@uniform) }; -poof(shader_magic(terrain_shader)) + + +poof(shader_magic(terrain_gen_render_context)) #include -struct world_edit_shader +struct world_edit_render_context poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") @frag_source_file("shaders/terrain/world_edit.fragmentshader") ) { @@ -28,12 +30,28 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader v3 ChunkDim; poof(@uniform) v3 WorldspaceBasis; poof(@uniform) v3 ChunkResolution; poof(@uniform) - s32 Type; poof(@uniform) + s32 Type; poof(@uniform) }; -poof(shader_magic(world_edit_shader)) +poof(shader_magic(world_edit_render_context)) #include +struct terrain_finalize_render_context +poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") + @frag_source_file("shaders/terrain/TerrainFinalize.fragmentshader") ) +{ + shader Program; + shader_uniform Uniforms[1]; + texture DestTexture; + framebuffer FBO; + + texture *InputTex; poof(@uniform) +}; + +poof(shader_magic(terrain_finalize_render_context)) +#include + + struct composite_render_group { shader Shader; @@ -133,8 +151,10 @@ struct graphics lighting_render_group Lighting; gaussian_render_group Gaussian; composite_render_group CompositeGroup; - terrain_shader TerrainRenderContext; - world_edit_shader WorldEditRenderContext; + + terrain_gen_render_context TerrainGenRC; + terrain_finalize_render_context TerrainFinalizeRC; + world_edit_render_context WorldEditRC; // NOTE(Jesse): The array NoiseReadbackJobs stores the PBOs, but there's a 3 // step process going on. First, the job is dispatched (copy values into PBO) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index d4a46ce05..6540d31bd 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -774,41 +774,57 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr } + v3 ChunkDim = V3(66, 66, 66); + + // + // Terrain Gen + // { - terrain_shader *TerrainShader = &Result->TerrainRenderContext; - v3 ChunkDim = V3(66, 66, 66); - InitializeTerrainShader(TerrainShader, ChunkDim, {}, {}); + terrain_gen_render_context *TerrainGenRC = &Result->TerrainGenRC; + InitializeTerrainGenRenderContext(TerrainGenRC, ChunkDim, {}, {}); - Result->TerrainRenderContext.FBO = GenFramebuffer(); + Result->TerrainGenRC.FBO = GenFramebuffer(); + GL.BindFramebuffer(GL_FRAMEBUFFER, Result->TerrainGenRC.FBO.ID); - /* GL.GenQueries(1, &Result->TerrainRenderContext.GlTimerObject); */ - /* Assert(Result->TerrainRenderContext.GlTimerObject); */ + v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); + TerrainGenRC->NoiseTexture = MakeTexture_RGBA(TextureDim, Cast(v4*, 0), CSz("TerrainNoiseTexture"), 1, TextureStorageFormat_RGBA32F); - GL.BindFramebuffer(GL_FRAMEBUFFER, Result->TerrainRenderContext.FBO.ID); + FramebufferTexture(&Result->TerrainGenRC.FBO, &TerrainGenRC->NoiseTexture); + SetDrawBuffers(&Result->TerrainGenRC.FBO); - v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); - /* TerrainShader->ChunkTexture = MakeTexture_SingleChannel(TextureDim, CSz("TerrainNoiseTexture"), False); */ + Ensure(CheckAndClearFramebuffer()); + } - u32 Channels = 1; - u32 Slices = 1; + // + // Terrain Finalize + // + { + terrain_finalize_render_context *TerrainFinalizeRC = &Result->TerrainFinalizeRC; + Result->TerrainFinalizeRC.FBO = GenFramebuffer(); + GL.BindFramebuffer(GL_FRAMEBUFFER, Result->TerrainFinalizeRC.FBO.ID); + + + v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); { + u32 Channels = 1; + u32 Slices = 1; // @shared_terrain_texture - TerrainShader->ChunkTexture = GenTexture(TextureDim, CSz("TerrainNoiseTexture"), TextureStorageFormat_R16I, Channels, Slices, False); + TerrainFinalizeRC->DestTexture = GenTexture(TextureDim, CSz("TerrainFinalizeTexture"), TextureStorageFormat_R16I, Channels, Slices, False); GL.TexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, TextureDim.x, TextureDim.y, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); AssertNoGlErrors; GL.BindTexture(GL_TEXTURE_2D, 0); } + FramebufferTexture(&Result->TerrainFinalizeRC.FBO, &TerrainFinalizeRC->DestTexture); + SetDrawBuffers(&Result->TerrainFinalizeRC.FBO); - FramebufferTexture(&Result->TerrainRenderContext.FBO, &TerrainShader->ChunkTexture); - SetDrawBuffers(&Result->TerrainRenderContext.FBO); + InitializeTerrainFinalizeRenderContext(TerrainFinalizeRC, &Result->TerrainGenRC.NoiseTexture); Ensure(CheckAndClearFramebuffer()); } { - world_edit_shader *WorldEditShader = &Result->WorldEditRenderContext; - v3 ChunkDim = V3(66, 66, 66); - InitializeWorldEditShader(WorldEditShader, ChunkDim, {}, {}, {}); + world_edit_render_context *WorldEditRC = &Result->WorldEditRC; + InitializeWorldEditRenderContext(WorldEditRC, ChunkDim, {}, {}, {}); Ensure(CheckAndClearFramebuffer()); } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index d35fcadc4..f153c5ab3 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -267,23 +267,22 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) Assert(s64(Chunk) == s64(Chunk1)); - auto *TerrainShader = &Graphics->TerrainRenderContext; - v3 NoiseDim = V3(TerrainShader->ChunkDim); + v3 NoiseDim = Graphics->TerrainGenRC.ChunkDim; v2i ViewportSize = V2i(s32(NoiseDim.x), s32(NoiseDim.y*NoiseDim.z)); { - + auto *TerrainGenRC = &Graphics->TerrainGenRC; v3i Apron = V3i(2, 2, 2); Assert(V3(Chunk1->Dim+Apron) == NoiseDim); - TerrainShader->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); - TerrainShader->ChunkResolution = V3(Chunk->DimInChunks); + TerrainGenRC->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); + TerrainGenRC->ChunkResolution = V3(Chunk->DimInChunks); TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->TerrainRenderContext.FBO.ID); + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainGenRC->FBO.ID); SetViewport(ViewportSize); - UseShader(TerrainShader); + UseShader(TerrainGenRC); /* gpu_timer Timer = StartGpuTimer(); */ RenderQuad(); @@ -293,6 +292,25 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; } + // + // Terrain Finalize + // + { + TIMED_NAMED_BLOCK(TerrainFinalizeDrawCall); + GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->TerrainFinalizeRC.FBO.ID); + + SetViewport(ViewportSize); + UseShader(&Graphics->TerrainFinalizeRC); + + /* gpu_timer Timer = StartGpuTimer(); */ + RenderQuad(); + /* EndGpuTimer(&Timer); */ + /* Push(&Graphics->GpuTimers, &Timer); */ + + AssertNoGlErrors; + } + +#if 0 { if (TotalElements(&Node->Edits)) { @@ -332,6 +350,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } } } +#endif Assert(Chunk1->Dim == V3i(64)); From 72b84d7830bdbaaf117762c9a355d4956c298ba7 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 13 Feb 2025 14:06:48 -0700 Subject: [PATCH 156/421] Get world_edit shader nominally working --- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- ...c_struct_terrain_finalize_render_context.h | 2 +- .../shader_magic_struct_world_edit_shader.h | 28 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- shaders/terrain/world_edit.fragmentshader | 293 +++--------------- src/engine/editor.cpp | 19 +- src/engine/graphics.h | 13 +- src/engine/render/render_init.cpp | 46 ++- src/engine/render_loop.cpp | 88 ++++-- src/engine/world_chunk.cpp | 12 + src/engine/world_chunk.h | 5 + 15 files changed, 213 insertions(+), 305 deletions(-) diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 5134295bc..bdc3feb35 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:95:0 +// src/engine/graphics.h:100:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 5fbc628a8..ba0e55c3a 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:84:0 +// src/engine/graphics.h:89:0 diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index 97f6cf602..d2e1a8e22 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:81:0 +// src/engine/graphics.h:86:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 78cd0fa69..752809d1a 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3043:0 +// src/engine/world_chunk.cpp:3055:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index f2b2fee5e..a9978c737 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:51:0 +// src/engine/graphics.h:56:0 link_internal void InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct , texture *InputTex ) diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index 693d6b9aa..4e80556fa 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -1,29 +1,37 @@ -// src/engine/graphics.h:36:0 +// src/engine/graphics.h:41:0 link_internal void -InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution , s32 Type ) +InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *ChunkDim , v3 *WorldspaceBasis , v3 *ChunkResolution , s32 Type , v3 ChunkRelEditMin , v3 ChunkRelEditMax ) { Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); u32 UniformIndex = 0; Struct->ChunkDim = ChunkDim; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkDim, "ChunkDim"); + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->ChunkDim, "ChunkDim"); ++UniformIndex; Struct->WorldspaceBasis = WorldspaceBasis; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->WorldspaceBasis, "WorldspaceBasis"); + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->WorldspaceBasis, "WorldspaceBasis"); ++UniformIndex; Struct->ChunkResolution = ChunkResolution; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->ChunkResolution, "ChunkResolution"); ++UniformIndex; Struct->Type = Type; Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->Type, "Type"); ++UniformIndex; - if (UniformIndex != 4 ) + Struct->ChunkRelEditMin = ChunkRelEditMin; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkRelEditMin, "ChunkRelEditMin"); + ++UniformIndex; + + Struct->ChunkRelEditMax = ChunkRelEditMax; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkRelEditMax, "ChunkRelEditMax"); + ++UniformIndex; + + if (UniformIndex != 6 ) { Error("Shader (world_edit_render_context) had an incorrect number of uniform slots!"); } @@ -52,7 +60,13 @@ UseShader( world_edit_render_context *Struct ) BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - if (UniformIndex != 4 ) + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + if (UniformIndex != 6 ) { Error("Shader (world_edit_render_context) had an incorrect number of uniform slots!"); } diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 37460faa7..8065c7dc2 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2057:0 +// src/engine/world_chunk.cpp:2069:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 1707931b0..16981727a 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2060:0 +// src/engine/world_chunk.cpp:2072:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index c56e3f065..2cf312c9b 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -2,268 +2,77 @@ uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; uniform int Type; -in vec2 UV; -out uint Output; -/* layout (location = 0) out float Output; */ - - -// https://www.shadertoy.com/view/4dffRH -// -// -// -// The MIT License -// Copyright © 2017 Inigo Quilez -// 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. -// -// https://www.youtube.com/c/InigoQuilez -// https://iquilezles.org/ - -// Computes the analytic derivatives of a 3D Gradient Noise. This can be used for example to compute normals to a -// 3d rocks based on Gradient Noise without approximating the gradient by having to take central differences. -// -// More info here: https://iquilezles.org/articles/gradientnoise - -// All noise functions here: -// -// https://www.shadertoy.com/playlist/fXlXzf&from=0&num=12 - - -// 0: integer hash -// 1: float hash (aliasing based) -#define METHOD 1 +uniform v3 ChunkRelEditMin; +uniform v3 ChunkRelEditMax; -// 0: cubic -// 1: quintic -#define INTERPOLANT 1 +uniform sampler2D InputTex; +in vec2 UV; +out layout(location = 0) vec4 Output; -#if METHOD==0 -vec3 hash( ivec3 p ) // this hash is not production ready, please -{ // replace this by something better - ivec3 n = ivec3( p.x*127 + p.y*311 + p.z*74, - p.x*269 + p.y*183 + p.z*246, - p.x*113 + p.y*271 + p.z*124); - - // 1D hash by Hugo Elias - n = (n << 13) ^ n; - n = n * (n * n * 15731 + 789221) + 1376312589; - return -1.0+2.0*vec3( n & ivec3(0x0fffffff))/float(0x0fffffff); -} - -#else -vec3 hash( vec3 p ) // this hash is not production ready, please -{ // replace this by something better - p = vec3( dot(p,vec3(127.1,311.7, 74.7)), - dot(p,vec3(269.5,183.3,246.1)), - dot(p,vec3(113.5,271.9,124.6))); - - return -1.0 + 2.0*fract(sin(p)*43758.5453123); -} -#endif - -vec4 gradient_noise_derivs( in vec3 x ) -{ - // grid - #if METHOD==0 - ivec3 i = ivec3(floor(x)); - #else - vec3 i = floor(x); - #endif - vec3 f = fract(x); - - #if INTERPOLANT==1 - // quintic interpolant - vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); - vec3 du = 30.0*f*f*(f*(f-2.0)+1.0); - #else - // cubic interpolant - vec3 u = f*f*(3.0-2.0*f); - vec3 du = 6.0*f*(1.0-f); - #endif - - // gradients - #if METHOD==0 - vec3 ga = hash( i+ivec3(0,0,0) ); - vec3 gb = hash( i+ivec3(1,0,0) ); - vec3 gc = hash( i+ivec3(0,1,0) ); - vec3 gd = hash( i+ivec3(1,1,0) ); - vec3 ge = hash( i+ivec3(0,0,1) ); - vec3 gf = hash( i+ivec3(1,0,1) ); - vec3 gg = hash( i+ivec3(0,1,1) ); - vec3 gh = hash( i+ivec3(1,1,1) ); - #else - vec3 ga = hash( i+vec3(0.0,0.0,0.0) ); - vec3 gb = hash( i+vec3(1.0,0.0,0.0) ); - vec3 gc = hash( i+vec3(0.0,1.0,0.0) ); - vec3 gd = hash( i+vec3(1.0,1.0,0.0) ); - vec3 ge = hash( i+vec3(0.0,0.0,1.0) ); - vec3 gf = hash( i+vec3(1.0,0.0,1.0) ); - vec3 gg = hash( i+vec3(0.0,1.0,1.0) ); - vec3 gh = hash( i+vec3(1.0,1.0,1.0) ); - #endif - - // projections - float va = dot( ga, f-vec3(0.0,0.0,0.0) ); - float vb = dot( gb, f-vec3(1.0,0.0,0.0) ); - float vc = dot( gc, f-vec3(0.0,1.0,0.0) ); - float vd = dot( gd, f-vec3(1.0,1.0,0.0) ); - float ve = dot( ge, f-vec3(0.0,0.0,1.0) ); - float vf = dot( gf, f-vec3(1.0,0.0,1.0) ); - float vg = dot( gg, f-vec3(0.0,1.0,1.0) ); - float vh = dot( gh, f-vec3(1.0,1.0,1.0) ); - - // interpolations - return vec4( va + u.x*(vb-va) + u.y*(vc-va) + u.z*(ve-va) + u.x*u.y*(va-vb-vc+vd) + u.y*u.z*(va-vc-ve+vg) + u.z*u.x*(va-vb-ve+vf) + (-va+vb+vc-vd+ve-vf-vg+vh)*u.x*u.y*u.z, // value - ga + u.x*(gb-ga) + u.y*(gc-ga) + u.z*(ge-ga) + u.x*u.y*(ga-gb-gc+gd) + u.y*u.z*(ga-gc-ge+gg) + u.z*u.x*(ga-gb-ge+gf) + (-ga+gb+gc-gd+ge-gf-gg+gh)*u.x*u.y*u.z + // derivatives - du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); -} - -// Doesn't support integer hashing -#if METHOD == 1 -float gradient_noise( in vec3 p ) -{ - vec3 i = floor( p ); - vec3 f = fract( p ); - - #if INTERPOLANT==1 - // quintic interpolant - vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); - #else - // cubic interpolant - vec3 u = f*f*(3.0-2.0*f); - #endif - - return mix( mix( mix( dot( hash( i + vec3(0.0,0.0,0.0) ), f - vec3(0.0,0.0,0.0) ), - dot( hash( i + vec3(1.0,0.0,0.0) ), f - vec3(1.0,0.0,0.0) ), u.x), - mix( dot( hash( i + vec3(0.0,1.0,0.0) ), f - vec3(0.0,1.0,0.0) ), - dot( hash( i + vec3(1.0,1.0,0.0) ), f - vec3(1.0,1.0,0.0) ), u.x), u.y), - mix( mix( dot( hash( i + vec3(0.0,0.0,1.0) ), f - vec3(0.0,0.0,1.0) ), - dot( hash( i + vec3(1.0,0.0,1.0) ), f - vec3(1.0,0.0,1.0) ), u.x), - mix( dot( hash( i + vec3(0.0,1.0,1.0) ), f - vec3(0.0,1.0,1.0) ), - dot( hash( i + vec3(1.0,1.0,1.0) ), f - vec3(1.0,1.0,1.0) ), u.x), u.y), u.z ); -} -#endif - -vec3 vhash(vec3 UV, vec3 offset) -{ - mat3 m = mat3(127.1,311.7, 74.7,269.5,183.3,246.1,113.5,271.9,124.6); - UV = fract(sin(UV* m) * 46839.32); - return vec3(sin(UV.z * +offset.x) * 0.5 + 0.5, cos(UV.x* offset.y) * 0.5 + 0.5,tan(UV.y * offset.z) * 0.5 + 0.5); -} - -vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) +void main() { - vec3 g = floor(p * CellDensity); - vec3 f = fract(p * CellDensity); - float res = 8.0; - float md=8.0; - vec3 mr; - vec4 Out; - for( int z=-1; z<=1; z++ ) - for( int y=-1; y<=1; y++ ) - for( int x=-1; x<=1; x++ ) - { - vec3 lattice = vec3(x,y,z); - vec3 offset=vhash(lattice + g ,AngleOffset); - vec3 r = lattice +offset -f; - float d = dot( r, r ); - if (d < res) - { - res=d; - mr=r; - } - } - - res = 8.0; - for( int z=-1; z<=1; z++ ) - for( int y=-1; y<=1; y++ ) - for( int x=-1; x<=1; x++ ) - { - vec3 lattice = vec3(x,y,z); - vec3 offset=vhash(lattice + g ,AngleOffset); - vec3 r = lattice +offset -f; - float d = dot( r, r ); - if( d < res ) - { - res = d; - Out.x= offset.x; - Out.y = d; - } - if( dot(mr-r,mr-r)>0.00001) - { - md = min( md, dot( 0.5*(mr+r), normalize(r-mr) ) ); - } - } - Out.z = mix(1.0, 0.0, smoothstep( 0.0, 0.1, md )); - Out.w = 1.0-smoothstep( 0.0, 0.1, res); - return Out; -} + v4 TexLookup = texture(InputTex, UV); + // NOTE(Jesse): Set these in the -- user code -- section + vec3 ColorValue = TexLookup.rgb; + f32 NoiseValue = TexLookup.a; -void main() -{ f32 x = floor(gl_FragCoord.x); f32 z = floor(gl_FragCoord.y / 66); f32 y = floor(gl_FragCoord.y - (z*66)); - v3 Offset = V3(-1, -1, -1); - v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + v3 xyz = V3(x,y,z) * ChunkResolution; - // NOTE(Jesse): Set these in the -- user code -- section - v3 ColorValue = V3(0.f); - f32 NoiseValue = 0.f; + if ( + xyz.x >= ChunkRelEditMin.x && + xyz.y >= ChunkRelEditMin.y && + xyz.z >= ChunkRelEditMin.z && - // - // -- user code -- - // + xyz.x <= ChunkRelEditMax.x && + xyz.y <= ChunkRelEditMax.y && + xyz.z <= ChunkRelEditMax.z ) { + v3 Offset = V3(-1, -1, -1); + v3 Basis = Offset + WorldspaceBasis + xyz; - NoiseValue = white_noise(Basis); - /* switch (Type) */ - /* { */ - /* case 4: // WorldEdit_BrushType_Layered */ - /* { */ - /* v3 Period = V3(100.f); */ - /* float Amplitude = 200.f; */ - /* s32 Octaves = 1; */ - - /* v3 deriv = v3(0.f); */ - /* f32 warp = 0.f; */ - /* for (s32 Octave = 1; Octave <= Octaves; ++Octave) */ - /* { */ - /* v3 xyz = Basis / (Period/Octave); */ - /* f32 gn = gradient_noise(xyz+warp); */ - /* NoiseValue = NoiseValue + (gn * (Amplitude/Octave)); */ - /* } */ + // + // -- user code -- + // + { - /* break; */ - /* } */ + /* NoiseValue += white_noise(Basis)*100.f; */ + /* switch (Type) */ + /* { */ + /* case 4: // WorldEdit_BrushType_Layered */ + /* { */ + v3 Period = V3(10.f); + float Amplitude = 20.f; + s32 Octaves = 1; + + v3 deriv = v3(0.f); + f32 warp = 0.f; + + for (s32 Octave = 1; Octave <= Octaves; ++Octave) + { + v3 xyz = Basis / (Period/Octave); + f32 gn = value_noise_derivs(xyz+warp+10.f).x; + NoiseValue = NoiseValue + (gn * (Amplitude/Octave)); + } + + /* break; */ + /* } */ + + /* default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; */ + /* } */ + } - /* default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; */ - /* } */ } - // // -- end user code -- // - uint SolidBit = NoiseValue > 0.f ? 1u : 0u; - uint PackedColor = PackRGB(ColorValue); - /* uint PackedColor = 3543u; */ - - Output = (SolidBit << 15) | PackedColor; + Output.rgb = ColorValue; + Output.a = NoiseValue; } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 58c4a3821..1ebbb3f33 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2249,6 +2249,10 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo auto Index = Find(&Node->Edits, Edit); Assert(IsValid(&Index)); // There shouldn't be a node that doesn't contain the edit RemoveUnordered(&Node->Edits, Index); + + // Need to reinitialize chunks that no longer have the edit so that it + // doesn't stay intact in chunks that lose it entirely + ForceOctreeNodeReinitialization(Engine, Node); } } @@ -2286,15 +2290,14 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo Push(&Node->Edits, &Edit); - if (Node->Chunk) - { - Assert(Node->Type == OctreeNodeType_Leaf); - - world_chunk *Chunk = Node->Chunk; + Assert(Node->Type == OctreeNodeType_Leaf); - DeallocateAndClearWorldChunk(Engine, Chunk); - Chunk->DimInChunks = Node->Resolution; - Chunk->WorldP = Node->WorldP; + // We need to call ForceOctreeNodeReinitialization on nodes that don't + // have a chunk because they could now contain geometry from the edit. + // And only call it on chunks that haven't already had it called (it asserts otherwise) + if (Node->Chunk == 0 || Node->Chunk->Flags) + { + ForceOctreeNodeReinitialization(Engine, Node); } } } diff --git a/src/engine/graphics.h b/src/engine/graphics.h index f740b34e7..03d39148e 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -25,12 +25,17 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader @frag_source_file("shaders/terrain/world_edit.fragmentshader") ) { shader Program; - shader_uniform Uniforms[4]; + shader_uniform Uniforms[6]; + framebuffer PingPongFBOs[2]; + texture PingPongTextures[2]; + + v3 *ChunkDim; poof(@uniform) + v3 *WorldspaceBasis; poof(@uniform) + v3 *ChunkResolution; poof(@uniform) - v3 ChunkDim; poof(@uniform) - v3 WorldspaceBasis; poof(@uniform) - v3 ChunkResolution; poof(@uniform) s32 Type; poof(@uniform) + v3 ChunkRelEditMin; poof(@uniform) + v3 ChunkRelEditMax; poof(@uniform) }; poof(shader_magic(world_edit_render_context)) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 6540d31bd..8fe5722b1 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -777,26 +777,53 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr v3 ChunkDim = V3(66, 66, 66); // - // Terrain Gen + // Terrain Gen RC // { terrain_gen_render_context *TerrainGenRC = &Result->TerrainGenRC; InitializeTerrainGenRenderContext(TerrainGenRC, ChunkDim, {}, {}); - Result->TerrainGenRC.FBO = GenFramebuffer(); - GL.BindFramebuffer(GL_FRAMEBUFFER, Result->TerrainGenRC.FBO.ID); + TerrainGenRC->FBO = GenFramebuffer(); + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainGenRC->FBO.ID); v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); TerrainGenRC->NoiseTexture = MakeTexture_RGBA(TextureDim, Cast(v4*, 0), CSz("TerrainNoiseTexture"), 1, TextureStorageFormat_RGBA32F); - FramebufferTexture(&Result->TerrainGenRC.FBO, &TerrainGenRC->NoiseTexture); - SetDrawBuffers(&Result->TerrainGenRC.FBO); + FramebufferTexture(&TerrainGenRC->FBO, &TerrainGenRC->NoiseTexture); + SetDrawBuffers(&TerrainGenRC->FBO); Ensure(CheckAndClearFramebuffer()); } // - // Terrain Finalize + // World Edit RC + // + { + world_edit_render_context *WorldEditRC = &Result->WorldEditRC; + + { + terrain_gen_render_context *TerrainGenRC = &Result->TerrainGenRC; + InitializeWorldEditRenderContext(WorldEditRC, &TerrainGenRC->ChunkDim, &TerrainGenRC->WorldspaceBasis, &TerrainGenRC->ChunkResolution, {}, {}, {}); + } + + RangeIterator(Index, 2) + { + WorldEditRC->PingPongFBOs[Index] = GenFramebuffer(); + GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[Index].ID); + + v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); + WorldEditRC->PingPongTextures[Index] = MakeTexture_RGBA(TextureDim, Cast(v4*, 0), CSz("PingPongTexture"), 1, TextureStorageFormat_RGBA32F); + + FramebufferTexture(&WorldEditRC->PingPongFBOs[Index], &WorldEditRC->PingPongTextures[Index]); + SetDrawBuffers(&WorldEditRC->PingPongFBOs[Index]); + + Ensure(CheckAndClearFramebuffer()); + } + } + + + // + // Terrain Finalize RC // { terrain_finalize_render_context *TerrainFinalizeRC = &Result->TerrainFinalizeRC; @@ -822,13 +849,6 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Ensure(CheckAndClearFramebuffer()); } - { - world_edit_render_context *WorldEditRC = &Result->WorldEditRC; - InitializeWorldEditRenderContext(WorldEditRC, ChunkDim, {}, {}, {}); - - Ensure(CheckAndClearFramebuffer()); - } - GL.Enable(GL_CULL_FACE); GL.CullFace(GL_BACK); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index f153c5ab3..d061158e6 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -292,32 +292,19 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; } - // - // Terrain Finalize - // - { - TIMED_NAMED_BLOCK(TerrainFinalizeDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->TerrainFinalizeRC.FBO.ID); - SetViewport(ViewportSize); - UseShader(&Graphics->TerrainFinalizeRC); - - /* gpu_timer Timer = StartGpuTimer(); */ - RenderQuad(); - /* EndGpuTimer(&Timer); */ - /* Push(&Graphics->GpuTimers, &Timer); */ - - AssertNoGlErrors; - } - -#if 0 + texture *InputTex = &Graphics->TerrainGenRC.NoiseTexture; +#if 1 { + s32 PingPongIndex = 0; if (TotalElements(&Node->Edits)) { - world_edit_shader *EditShader = &Graphics->WorldEditRenderContext; - AssertNoGlErrors; - UseShader(EditShader); - AssertNoGlErrors; + world_edit_render_context *WorldEditRC = &Graphics->WorldEditRC; + AssertNoGlErrors; + + UseShader(WorldEditRC); + AssertNoGlErrors; + IterateOver(&Node->Edits, Edit, EditIndex) { Edit->Type = WorldEdit_BrushType_Layered; @@ -335,8 +322,38 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { TIMED_NAMED_BLOCK(WorldEditDrawCall); - BindUniformByName(&EditShader->Program, "Type", Edit->Type); - AssertNoGlErrors; + GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[PingPongIndex].ID); + + BindUniformByName(&WorldEditRC->Program, "Type", Edit->Type); + BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 0); + + + /* v3 Mn = V3(4); */ + /* BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &Mn); */ + + /* v3 Mx = V3(40); */ + /* BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); */ + + + rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); + v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); + + /* WorldEditRC->ChunkRelEditMin = SimEditRect.Min - SimChunkMin; */ + /* WorldEditRC->ChunkRelEditMax = SimEditRect.Max - SimChunkMin; */ + + // NOTE(Jesse): Must call bind explicitly because the driver doesn't cache + // these values otherwise .. it just reads then whenever it wants through + // the pointer.. + v3 Mn = SimEditRect.Min - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &Mn); + + v3 Mx = SimEditRect.Max - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); + + + InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; + + AssertNoGlErrors; /* gpu_timer Timer = StartGpuTimer(); */ RenderQuad(); @@ -347,12 +364,35 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; } + + PingPongIndex = (PingPongIndex + 1) & 1; } } } #endif + // + // Terrain Finalize + // + { + TIMED_NAMED_BLOCK(TerrainFinalizeDrawCall); + GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->TerrainFinalizeRC.FBO.ID); + + SetViewport(ViewportSize); + UseShader(&Graphics->TerrainFinalizeRC); + + BindUniformByName(&Graphics->TerrainFinalizeRC.Program, "InputTex", InputTex, 0); + + /* gpu_timer Timer = StartGpuTimer(); */ + RenderQuad(); + /* EndGpuTimer(&Timer); */ + /* Push(&Graphics->GpuTimers, &Timer); */ + + AssertNoGlErrors; + } + + Assert(Chunk1->Dim == V3i(64)); Assert(NoiseDim == V3(66)); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 80c2416b7..658f02014 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -450,6 +450,18 @@ FreeWorldChunk(engine_resources *Engine, world_chunk *Chunk) ReleaseFutex(&World->ChunkFreelistFutex); } +link_internal void +ForceOctreeNodeReinitialization(engine_resources *Engine, octree_node *Node) +{ + Node->HadNoVisibleSurface = False; + if (Node->Chunk) + { + DeallocateAndClearWorldChunk(Engine, Node->Chunk); + Node->Chunk->DimInChunks = Node->Resolution; + Node->Chunk->WorldP = Node->WorldP; + } +} + link_internal world_chunk* GetWorldChunkFromHashtable(world *World, world_position P) { diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 39b8e070a..e71132587 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -649,9 +649,14 @@ MarshalMagicaVoxelEncodedColors(voxel *Src, voxel *Dest, v3i Dim) } } +struct octree_node; + link_internal void DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk); +link_internal void +ForceOctreeNodeReinitialization(engine_resources *Engine, octree_node *Node); + link_internal s32 MarkBoundaryVoxels_MakeExteriorFaces(u64 *Occupancy, voxel *Voxels, chunk_dimension SrcChunkDim, chunk_dimension SrcChunkMin, chunk_dimension SrcChunkMax ); From d559f4990bfa72da68e8eca1a7f28ddc9e9b5396 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 13 Feb 2025 17:05:10 -0700 Subject: [PATCH 157/421] WIP editor changes --- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- ...c_struct_terrain_finalize_render_context.h | 2 +- .../shader_magic_struct_world_edit_shader.h | 22 ++++------------- shaders/terrain/world_edit.fragmentshader | 20 ++++++++-------- src/engine/editor.cpp | 24 ++++++++++++++++++- src/engine/graphics.h | 4 +--- src/engine/render/render_init.cpp | 2 +- src/engine/render_loop.cpp | 18 +++----------- 10 files changed, 46 insertions(+), 52 deletions(-) diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index bdc3feb35..89f112724 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:100:0 +// src/engine/graphics.h:98:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index ba0e55c3a..b435f0ac0 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:89:0 +// src/engine/graphics.h:87:0 diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index d2e1a8e22..1408e9270 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:86:0 +// src/engine/graphics.h:84:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index a9978c737..d861b4e1a 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:56:0 +// src/engine/graphics.h:54:0 link_internal void InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct , texture *InputTex ) diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index 4e80556fa..2407cdd24 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -1,7 +1,7 @@ -// src/engine/graphics.h:41:0 +// src/engine/graphics.h:39:0 link_internal void -InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *ChunkDim , v3 *WorldspaceBasis , v3 *ChunkResolution , s32 Type , v3 ChunkRelEditMin , v3 ChunkRelEditMax ) +InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *ChunkDim , v3 *WorldspaceBasis , v3 *ChunkResolution , s32 Type ) { Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); @@ -23,15 +23,7 @@ InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *Chu Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->Type, "Type"); ++UniformIndex; - Struct->ChunkRelEditMin = ChunkRelEditMin; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkRelEditMin, "ChunkRelEditMin"); - ++UniformIndex; - - Struct->ChunkRelEditMax = ChunkRelEditMax; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkRelEditMax, "ChunkRelEditMax"); - ++UniformIndex; - - if (UniformIndex != 6 ) + if (UniformIndex != 4 ) { Error("Shader (world_edit_render_context) had an incorrect number of uniform slots!"); } @@ -60,13 +52,7 @@ UseShader( world_edit_render_context *Struct ) BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; - - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; - - if (UniformIndex != 6 ) + if (UniformIndex != 4 ) { Error("Shader (world_edit_render_context) had an incorrect number of uniform slots!"); } diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 2cf312c9b..937caf1a0 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -12,7 +12,7 @@ out layout(location = 0) vec4 Output; void main() { - v4 TexLookup = texture(InputTex, UV); + v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); // NOTE(Jesse): Set these in the -- user code -- section vec3 ColorValue = TexLookup.rgb; f32 NoiseValue = TexLookup.a; @@ -43,10 +43,10 @@ void main() { /* NoiseValue += white_noise(Basis)*100.f; */ - /* switch (Type) */ - /* { */ - /* case 4: // WorldEdit_BrushType_Layered */ - /* { */ + switch (Type) + { + case 4: // WorldEdit_BrushType_Layered + { v3 Period = V3(10.f); float Amplitude = 20.f; s32 Octaves = 1; @@ -57,15 +57,15 @@ void main() for (s32 Octave = 1; Octave <= Octaves; ++Octave) { v3 xyz = Basis / (Period/Octave); - f32 gn = value_noise_derivs(xyz+warp+10.f).x; + f32 gn = max(0.f, value_noise_derivs(xyz+warp+10.f).x); NoiseValue = NoiseValue + (gn * (Amplitude/Octave)); } - /* break; */ - /* } */ + break; + } - /* default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; */ - /* } */ + default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; + } } } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 1ebbb3f33..894b794a5 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2378,6 +2378,7 @@ DoWorldEditor(engine_resources *Engine) } } + // // // Edit tool interactions in the world @@ -2573,6 +2574,7 @@ DoWorldEditor(engine_resources *Engine) } } + } break; case WorldEdit_Tool_Eyedropper: @@ -2661,7 +2663,7 @@ DoWorldEditor(engine_resources *Engine) // the Select tool is active, doesn't update any of the brush stuff, then // the preview gets drawn because we pop back to the Layered brush tool and // there's a frame of lag. - DoBrushSettingsWindow(Engine, Editor->Tool, Editor->Brush.Type); + /* DoBrushSettingsWindow(Engine, Editor->Tool, Editor->Brush.Type); */ IterateOver(&Editor->WorldEdits, Edit, EditIndex) { @@ -2738,6 +2740,26 @@ DoWorldEditor(engine_resources *Engine) } + { + if (Editor->CurrentEdit) + { + switch (Editor->CurrentEdit->Type) + { + case WorldEdit_BrushType_Disabled: + case WorldEdit_BrushType_Single: + case WorldEdit_BrushType_Asset: + case WorldEdit_BrushType_Entity: { } break; + + case WorldEdit_BrushType_Layered: + { + local_persist window_layout BrushSettingsWindow = WindowLayout("Brush Settings", WindowLayoutFlag_Align_Right); + BrushSettingsForLayeredBrush(Engine, &Editor->CurrentEdit->Layered, &BrushSettingsWindow); + } break; + } + } + } + + #if VOXEL_DEBUG_COLOR { diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 03d39148e..7d7d63956 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -25,7 +25,7 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader @frag_source_file("shaders/terrain/world_edit.fragmentshader") ) { shader Program; - shader_uniform Uniforms[6]; + shader_uniform Uniforms[4]; framebuffer PingPongFBOs[2]; texture PingPongTextures[2]; @@ -34,8 +34,6 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader v3 *ChunkResolution; poof(@uniform) s32 Type; poof(@uniform) - v3 ChunkRelEditMin; poof(@uniform) - v3 ChunkRelEditMax; poof(@uniform) }; poof(shader_magic(world_edit_render_context)) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 8fe5722b1..3fdd5c202 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -803,7 +803,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr { terrain_gen_render_context *TerrainGenRC = &Result->TerrainGenRC; - InitializeWorldEditRenderContext(WorldEditRC, &TerrainGenRC->ChunkDim, &TerrainGenRC->WorldspaceBasis, &TerrainGenRC->ChunkResolution, {}, {}, {}); + InitializeWorldEditRenderContext(WorldEditRC, &TerrainGenRC->ChunkDim, &TerrainGenRC->WorldspaceBasis, &TerrainGenRC->ChunkResolution, {}); } RangeIterator(Index, 2) diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index d061158e6..00bd3863b 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -327,32 +327,18 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "Type", Edit->Type); BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 0); - - /* v3 Mn = V3(4); */ - /* BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &Mn); */ - - /* v3 Mx = V3(40); */ - /* BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); */ - - rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); - /* WorldEditRC->ChunkRelEditMin = SimEditRect.Min - SimChunkMin; */ - /* WorldEditRC->ChunkRelEditMax = SimEditRect.Max - SimChunkMin; */ - // NOTE(Jesse): Must call bind explicitly because the driver doesn't cache // these values otherwise .. it just reads then whenever it wants through // the pointer.. v3 Mn = SimEditRect.Min - SimChunkMin; BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &Mn); + AssertNoGlErrors; v3 Mx = SimEditRect.Max - SimChunkMin; BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); - - - InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; - AssertNoGlErrors; /* gpu_timer Timer = StartGpuTimer(); */ @@ -360,6 +346,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) /* EndGpuTimer(&Timer); */ /* Push(&Graphics->GpuTimers, &Timer); */ + InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; + AssertNoGlErrors; } break; From 52bcdef294c0dfda27dbeb01b736c5d2ad7405e2 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 13 Feb 2025 17:19:52 -0700 Subject: [PATCH 158/421] Fix holes due to bilinear texture call vs needing texelFetch --- shaders/terrain/TerrainFinalize.fragmentshader | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shaders/terrain/TerrainFinalize.fragmentshader b/shaders/terrain/TerrainFinalize.fragmentshader index 5d9e2803a..712db1d94 100644 --- a/shaders/terrain/TerrainFinalize.fragmentshader +++ b/shaders/terrain/TerrainFinalize.fragmentshader @@ -6,7 +6,7 @@ out layout(location = 0) uint Output; void main() { - v4 TexLookup = texture(InputTex, UV); + v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); f32 NoiseValue = TexLookup.a; v3 ColorValue = TexLookup.rgb; From 290f6fcfe6903552fe7deed03f3605d0583a98a1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 13 Feb 2025 20:38:41 -0700 Subject: [PATCH 159/421] Detect brush settings changes and dispatch jobs to update world --- generated/are_equal_octree_node.h | 2 +- .../block_array_octree_node_ptr_688853862.h | 2 +- ...block_array_picked_octree_node_688853862.h | 2 +- generated/buffer_octree_node_ptr.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 15 +++ generated/freelist_allocator_octree_node.h | 2 +- generated/freelist_allocator_world_chunk.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- jesse.make.sh | 2 +- shaders/terrain/world_edit.fragmentshader | 16 ++- src/engine/editor.cpp | 73 +++++++++++-- src/engine/editor.h | 6 ++ src/engine/render_loop.cpp | 100 +++++++++++++----- src/engine/world.h | 2 + src/engine/world_chunk.cpp | 11 +- 19 files changed, 195 insertions(+), 52 deletions(-) diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index 9a0363327..8702cd364 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:44:0 +// src/engine/world.h:46:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index ae14efda5..88c36617b 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:58:0 +// src/engine/world.h:60:0 diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 11ed1617d..5ff71964f 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:61:0 +// src/engine/world.h:63:0 diff --git a/generated/buffer_octree_node_ptr.h b/generated/buffer_octree_node_ptr.h index 203f86bde..d9d82a920 100644 --- a/generated/buffer_octree_node_ptr.h +++ b/generated/buffer_octree_node_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world.h:35:0 +// src/engine/world.h:37:0 struct octree_node_ptr_buffer { diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index d2e02cc2c..966cbaeea 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -138,6 +138,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name CSz("Edits"), Params ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bonsai_futex*, &Element->Lock), + CSz("Lock"), + Params + ); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index 9f88ccb4b..98c59bf04 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:49:0 +// src/engine/world.h:51:0 struct octree_node_freelist { diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h index cb1b13ab8..6047332b2 100644 --- a/generated/freelist_allocator_world_chunk.h +++ b/generated/freelist_allocator_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/world.h:52:0 +// src/engine/world.h:54:0 struct world_chunk_freelist { diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index 98de096d4..4c0d1351e 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:55:0 +// src/engine/world.h:57:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index b70da45e0..f7ebc0ad7 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:46:0 +// src/engine/world.h:48:0 struct octree_node_ptr_stack { diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 752809d1a..97074c2ba 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3055:0 +// src/engine/world_chunk.cpp:3060:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 8065c7dc2..3b0e8869f 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2069:0 +// src/engine/world_chunk.cpp:2074:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 16981727a..dcf8c4900 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2072:0 +// src/engine/world_chunk.cpp:2077:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/jesse.make.sh b/jesse.make.sh index 81197b57f..4a47e50e2 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 937caf1a0..71faf405a 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -1,10 +1,19 @@ uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; -uniform int Type; +uniform int BrushType; +// +// Clipping params +// uniform v3 ChunkRelEditMin; uniform v3 ChunkRelEditMax; +// +// Noise params +// +uniform v3 Period; +uniform f32 Amplitude; + uniform sampler2D InputTex; in vec2 UV; @@ -13,6 +22,7 @@ out layout(location = 0) vec4 Output; void main() { v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); + // NOTE(Jesse): Set these in the -- user code -- section vec3 ColorValue = TexLookup.rgb; f32 NoiseValue = TexLookup.a; @@ -43,12 +53,10 @@ void main() { /* NoiseValue += white_noise(Basis)*100.f; */ - switch (Type) + switch (BrushType) { case 4: // WorldEdit_BrushType_Layered { - v3 Period = V3(10.f); - float Amplitude = 20.f; s32 Octaves = 1; v3 deriv = v3(0.f); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 894b794a5..28469ea6f 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1000,6 +1000,9 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br { UNPACK_ENGINE_RESOURCES(Engine); + // Leaving this function here as a reference for what used to happen, but migrating the functionality + NotImplemented; + brush_settings *Settings = &Layer->Settings; brush_settings *PrevSettings = &Layer->PrevSettings; @@ -1423,6 +1426,9 @@ NewBrush(layered_brush *LayeredBrush) brush_layer *Layer = Layers + LayerIndex; Layer->Settings = {}; } + + // Initialize PrevSettings so we don't fire a changed event straight away.. + CheckSettingsChanged(LayeredBrush); } link_internal void @@ -2232,13 +2238,49 @@ ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowC } } +link_internal b32 +CheckSettingsChanged(layered_brush *Brush) +{ + // Seed true if we have layers, false otherwise + b32 Result = Brush->LayerCount > 0; + RangeIterator(LayerIndex, Brush->LayerCount) + { + brush_layer *Layer = Brush->Layers + LayerIndex; + Result &= !AreEqual(&Layer->Settings, &Layer->PrevSettings); + Layer->PrevSettings = Layer->Settings; + } + return Result; +} + +link_internal b32 +CheckSettingsChanged(world_edit *Edit) +{ + b32 Result = False; + + switch (Edit->Type) + { + case WorldEdit_BrushType_Disabled: + case WorldEdit_BrushType_Single: + case WorldEdit_BrushType_Asset: + case WorldEdit_BrushType_Entity: + { + NotImplemented; + } break; + + case WorldEdit_BrushType_Layered: + { + Result = CheckSettingsChanged(&Edit->Layered); + } break; + } + + return Result; +} link_internal void UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memory_arena *TempMemory) { UNPACK_ENGINE_RESOURCES(Engine); - // First, gather the currently edited nodes and remove the edit { octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); @@ -2246,6 +2288,7 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo IterateOver(&Nodes, Node, NodeIndex) { + AcquireFutex(&Node->Lock); auto Index = Find(&Node->Edits, Edit); Assert(IsValid(&Index)); // There shouldn't be a node that doesn't contain the edit RemoveUnordered(&Node->Edits, Index); @@ -2253,6 +2296,7 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo // Need to reinitialize chunks that no longer have the edit so that it // doesn't stay intact in chunks that lose it entirely ForceOctreeNodeReinitialization(Engine, Node); + ReleaseFutex(&Node->Lock); } } @@ -2260,8 +2304,8 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo // Update the edit // - Editor->CurrentEdit->Type = WorldEdit_BrushType_Layered; - NewBrush(&Editor->CurrentEdit->Layered); + /* Editor->CurrentEdit->Type = WorldEdit_BrushType_Layered; */ + /* NewBrush(&Editor->CurrentEdit->Layered); */ Editor->CurrentEdit->Region = Region; // TODO(Jesse): I feel like this should be happening more automagically, but .. @@ -2272,6 +2316,7 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo IterateOver(&Nodes, Node, NodeIndex) { + AcquireFutex(&Node->Lock); /* auto EditAABB = GetSimSpaceAABB(World, Node); */ /* random_series S = {u64(Node)}; */ /* v3 BaseColor = RandomV3Unilateral(&S); */ @@ -2299,6 +2344,7 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo { ForceOctreeNodeReinitialization(Engine, Node); } + ReleaseFutex(&Node->Lock); } } } @@ -2697,6 +2743,9 @@ DoWorldEditor(engine_resources *Engine) world_edit E = {}; Editor->CurrentEdit = Push(&Editor->WorldEdits, &E); + + Editor->CurrentEdit->Type = WorldEdit_BrushType_Layered; + NewBrush(&Editor->CurrentEdit->Layered); } if (Editor->Selection.Clicks == 2) @@ -2731,15 +2780,27 @@ DoWorldEditor(engine_resources *Engine) } } - if (Editor->Selection.Changed) + /* brush_settings *Settings = &Layer->Settings; */ + /* brush_settings *PrevSettings = &Layer->PrevSettings; */ + + /* v3i SelectionDim = GetSelectionDim(World, Editor); */ + /* v3i RequiredLayerDim = GetRequiredDimForLayer(SelectionDim, Layer); */ + + /* b32 ReallocChunk = Editor->Selection.Changed || Preview->Chunk.Dim != RequiredLayerDim; */ + /* b32 SettingsChanged = !AreEqual(Settings, PrevSettings); */ + /* b32 UpdateVoxels = ReallocChunk || SettingsChanged; */ + + /* *PrevSettings = *Settings; */ + + if (SelectionComplete(Editor->Selection.Clicks) && Editor->CurrentEdit) { - if (Editor->CurrentEdit) + b32 SettingsChanged = CheckSettingsChanged(Editor->CurrentEdit); + if (SettingsChanged || Editor->Selection.Changed) { UpdateWorldEdit(Engine, Editor->CurrentEdit, Editor->Selection.Region, GetTranArena()); } } - { if (Editor->CurrentEdit) { diff --git a/src/engine/editor.h b/src/engine/editor.h index d3b8351b0..281fc5956 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1256,6 +1256,12 @@ GetSelectionDim(world *World, level_editor *Editor) } +link_internal b32 +CheckSettingsChanged(layered_brush *); + +link_internal b32 +CheckSettingsChanged(world_edit *); + link_internal b32 HardResetEditor(level_editor *Editor); link_internal v3 diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 00bd3863b..46049c50c 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -296,6 +296,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) texture *InputTex = &Graphics->TerrainGenRC.NoiseTexture; #if 1 { + AcquireFutex(&Node->Lock); s32 PingPongIndex = 0; if (TotalElements(&Node->Edits)) { @@ -305,9 +306,12 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) UseShader(WorldEditRC); AssertNoGlErrors; + IterateOver(&Node->Edits, Edit, EditIndex) { Edit->Type = WorldEdit_BrushType_Layered; + BindUniformByName(&WorldEditRC->Program, "BrushType", Edit->Type); + switch (Edit->Type) { case WorldEdit_BrushType_Disabled: @@ -316,46 +320,88 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case WorldEdit_BrushType_Entity: { NotImplemented; + + // NOTE(Jesse): Can't do this globally for each path because + // the layered brush updates the texture every time it does a layer.. + InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; + PingPongIndex = (PingPongIndex + 1) & 1; } break; case WorldEdit_BrushType_Layered: { TIMED_NAMED_BLOCK(WorldEditDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[PingPongIndex].ID); - - BindUniformByName(&WorldEditRC->Program, "Type", Edit->Type); - BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 0); - - rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); - v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); - - // NOTE(Jesse): Must call bind explicitly because the driver doesn't cache - // these values otherwise .. it just reads then whenever it wants through - // the pointer.. - v3 Mn = SimEditRect.Min - SimChunkMin; - BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &Mn); - AssertNoGlErrors; - - v3 Mx = SimEditRect.Max - SimChunkMin; - BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); - AssertNoGlErrors; - - /* gpu_timer Timer = StartGpuTimer(); */ - RenderQuad(); - /* EndGpuTimer(&Timer); */ - /* Push(&Graphics->GpuTimers, &Timer); */ - - InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; + layered_brush *Brush = &Edit->Layered; + RangeIterator(LayerIndex, Brush->LayerCount) + { + GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[PingPongIndex].ID); + + BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 0); + + brush_layer *Layer = Brush->Layers + LayerIndex; + + switch (Layer->Settings.Type) + { + case BrushLayerType_Noise: + { + noise_layer *Noise = &Layer->Settings.Noise; + + switch (Noise->Type) + { + case NoiseType_Perlin: + { + perlin_noise_params *Perlin = &Noise->Perlin; + BindUniformByName(&WorldEditRC->Program, "Threshold", Perlin->Threshold); + BindUniformByName(&WorldEditRC->Program, "Period", &Perlin->Period); + BindUniformByName(&WorldEditRC->Program, "Amplitude", Perlin->Amplitude); + } break; + + case NoiseType_Voronoi: + {} break; + + case NoiseType_White: + {} break; + } + + } break; + + case BrushLayerType_Shape: + { + /* shape_layer *Shape = &Layer->Shape; */ + } break; + } + + rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); + v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); + + // NOTE(Jesse): Must call bind explicitly because the driver doesn't cache + // these values otherwise .. it just reads then whenever it wants through + // the pointer.. + v3 Mn = SimEditRect.Min - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &Mn); + AssertNoGlErrors; + + v3 Mx = SimEditRect.Max - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); + AssertNoGlErrors; + + /* gpu_timer Timer = StartGpuTimer(); */ + RenderQuad(); + /* EndGpuTimer(&Timer); */ + /* Push(&Graphics->GpuTimers, &Timer); */ + + InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; + PingPongIndex = (PingPongIndex + 1) & 1; + } AssertNoGlErrors; } break; - } + } // switch - PingPongIndex = (PingPongIndex + 1) & 1; } } + ReleaseFutex(&Node->Lock); } #endif diff --git a/src/engine/world.h b/src/engine/world.h index 2a6952226..524560159 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -28,6 +28,8 @@ struct octree_node /* }; */ world_edit_ptr_block_array Edits; + + bonsai_futex Lock; }; typedef octree_node* octree_node_ptr; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 658f02014..8d2ad58cc 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -453,12 +453,17 @@ FreeWorldChunk(engine_resources *Engine, world_chunk *Chunk) link_internal void ForceOctreeNodeReinitialization(engine_resources *Engine, octree_node *Node) { + Assert(FutexIsSignaled(&Node->Lock)); + Node->HadNoVisibleSurface = False; if (Node->Chunk) { - DeallocateAndClearWorldChunk(Engine, Node->Chunk); - Node->Chunk->DimInChunks = Node->Resolution; - Node->Chunk->WorldP = Node->WorldP; + if (Node->Chunk->Flags && (Node->Chunk->Flags & Chunk_Queued) == 0) + { + DeallocateAndClearWorldChunk(Engine, Node->Chunk); + Node->Chunk->DimInChunks = Node->Resolution; + Node->Chunk->WorldP = Node->WorldP; + } } } From 13740d731fe70a8cc0c270da67a1eae016759d3c Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 13 Feb 2025 21:16:00 -0700 Subject: [PATCH 160/421] Fix multiple layers breaking change detection --- jesse.make.sh | 2 +- src/engine/editor.cpp | 43 ++++++++++++++----------------------------- 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/jesse.make.sh b/jesse.make.sh index 4a47e50e2..81197b57f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 28469ea6f..b07ef58c0 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2241,12 +2241,11 @@ ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowC link_internal b32 CheckSettingsChanged(layered_brush *Brush) { - // Seed true if we have layers, false otherwise - b32 Result = Brush->LayerCount > 0; + b32 Result = False; RangeIterator(LayerIndex, Brush->LayerCount) { brush_layer *Layer = Brush->Layers + LayerIndex; - Result &= !AreEqual(&Layer->Settings, &Layer->PrevSettings); + Result |= !AreEqual(&Layer->Settings, &Layer->PrevSettings); Layer->PrevSettings = Layer->Settings; } return Result; @@ -2304,9 +2303,6 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo // Update the edit // - /* Editor->CurrentEdit->Type = WorldEdit_BrushType_Layered; */ - /* NewBrush(&Editor->CurrentEdit->Layered); */ - Editor->CurrentEdit->Region = Region; // TODO(Jesse): I feel like this should be happening more automagically, but .. // Gather newly overlapping nodes and add the edit @@ -2743,9 +2739,7 @@ DoWorldEditor(engine_resources *Engine) world_edit E = {}; Editor->CurrentEdit = Push(&Editor->WorldEdits, &E); - Editor->CurrentEdit->Type = WorldEdit_BrushType_Layered; - NewBrush(&Editor->CurrentEdit->Layered); } if (Editor->Selection.Clicks == 2) @@ -2780,27 +2774,6 @@ DoWorldEditor(engine_resources *Engine) } } - /* brush_settings *Settings = &Layer->Settings; */ - /* brush_settings *PrevSettings = &Layer->PrevSettings; */ - - /* v3i SelectionDim = GetSelectionDim(World, Editor); */ - /* v3i RequiredLayerDim = GetRequiredDimForLayer(SelectionDim, Layer); */ - - /* b32 ReallocChunk = Editor->Selection.Changed || Preview->Chunk.Dim != RequiredLayerDim; */ - /* b32 SettingsChanged = !AreEqual(Settings, PrevSettings); */ - /* b32 UpdateVoxels = ReallocChunk || SettingsChanged; */ - - /* *PrevSettings = *Settings; */ - - if (SelectionComplete(Editor->Selection.Clicks) && Editor->CurrentEdit) - { - b32 SettingsChanged = CheckSettingsChanged(Editor->CurrentEdit); - if (SettingsChanged || Editor->Selection.Changed) - { - UpdateWorldEdit(Engine, Editor->CurrentEdit, Editor->Selection.Region, GetTranArena()); - } - } - { if (Editor->CurrentEdit) { @@ -2818,6 +2791,18 @@ DoWorldEditor(engine_resources *Engine) } break; } } + + // NOTE(Jesse): Must come after the settings window draws because the + // settings window detects and initializes new brushes + if (SelectionComplete(Editor->Selection.Clicks) && Editor->CurrentEdit) + { + b32 SettingsChanged = CheckSettingsChanged(Editor->CurrentEdit); + if (SettingsChanged || Editor->Selection.Changed) + { + UpdateWorldEdit(Engine, Editor->CurrentEdit, Editor->Selection.Region, GetTranArena()); + } + } + } From a6af98b3bc1b2aaacd67b64ea28b33fd2b8108af Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 13 Feb 2025 21:58:40 -0700 Subject: [PATCH 161/421] Respect color --- shaders/terrain/world_edit.fragmentshader | 14 ++++++++++++-- src/engine/render_loop.cpp | 3 +++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 71faf405a..fb4009343 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -11,9 +11,12 @@ uniform v3 ChunkRelEditMax; // // Noise params // +uniform v3 RGBColor; uniform v3 Period; uniform f32 Amplitude; + + uniform sampler2D InputTex; in vec2 UV; @@ -65,8 +68,15 @@ void main() for (s32 Octave = 1; Octave <= Octaves; ++Octave) { v3 xyz = Basis / (Period/Octave); - f32 gn = max(0.f, value_noise_derivs(xyz+warp+10.f).x); - NoiseValue = NoiseValue + (gn * (Amplitude/Octave)); + f32 gn = max(0.f, value_noise_derivs(xyz+warp+10.f).x) * (Amplitude/Octave); + + if (NoiseValue < 0.f && gn+NoiseValue > 0.f) + { + ColorValue = RGBColor; + } + + NoiseValue = NoiseValue + gn; + } break; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 46049c50c..89a3d74cb 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -339,6 +339,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 0); brush_layer *Layer = Brush->Layers + LayerIndex; + v3 RGBColor = HSVtoRGB(Layer->Settings.HSVColor); + BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); switch (Layer->Settings.Type) { @@ -346,6 +348,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { noise_layer *Noise = &Layer->Settings.Noise; + switch (Noise->Type) { case NoiseType_Perlin: From 3192e64c4986399e80621c427484363c828f85a0 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 13 Feb 2025 22:01:00 -0700 Subject: [PATCH 162/421] Rename world_edit_mode -> world_edit_blend_mode --- ...itor_ui_for_compound_type_brush_settings.h | 4 +- ...ditor_ui_for_compound_type_layered_brush.h | 4 +- ...or_ui_for_compound_type_world_edit_brush.h | 4 +- generated/serdes_struct_brush_settings.h | 4 +- generated/serdes_struct_brush_settings_0.h | 4 +- generated/serdes_struct_brush_settings_1.h | 4 +- generated/serdes_struct_brush_settings_2.h | 4 +- generated/serdes_struct_layered_brush.h | 4 +- src/engine/editor.cpp | 14 ++--- src/engine/editor.h | 62 +++++++++---------- src/engine/world_chunk.cpp | 4 +- src/engine/world_update.cpp | 12 ++-- src/engine/world_update.h | 6 +- 13 files changed, 65 insertions(+), 65 deletions(-) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 04d9ffb53..2840ae6fc 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -74,7 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode*, &Element->Mode), + Cast(world_edit_blend_mode*, &Element->Mode), CSz("Mode"), Params ); @@ -89,7 +89,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode_modifier*, &Element->Modifier), + Cast(world_edit_blend_mode_modifier*, &Element->Modifier), CSz("Modifier"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 13a0ff5c0..73f4d50a5 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -144,7 +144,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode*, &Element->Mode), + Cast(world_edit_blend_mode*, &Element->Mode), CSz("Mode"), Params ); @@ -159,7 +159,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode_modifier*, &Element->Modifier), + Cast(world_edit_blend_mode_modifier*, &Element->Modifier), CSz("Modifier"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_world_edit_brush.h index fd1a130d1..02a6816c1 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_brush.h @@ -44,7 +44,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode*, &Element->Mode), + Cast(world_edit_blend_mode*, &Element->Mode), CSz("Mode"), Params ); @@ -59,7 +59,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode_modifier*, &Element->Modifier), + Cast(world_edit_blend_mode_modifier*, &Element->Modifier), CSz("Modifier"), Params ); diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index c7b5d5d5e..df9428e53 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -172,12 +172,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren - Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); + Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); - Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); + Element->Modifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); diff --git a/generated/serdes_struct_brush_settings_0.h b/generated/serdes_struct_brush_settings_0.h index f9bd3ebff..5b85fb3b1 100644 --- a/generated/serdes_struct_brush_settings_0.h +++ b/generated/serdes_struct_brush_settings_0.h @@ -121,12 +121,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_0 *Element, memory_ar - Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); + Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); - Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); + Element->Modifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); diff --git a/generated/serdes_struct_brush_settings_1.h b/generated/serdes_struct_brush_settings_1.h index 7b7ca2515..109295601 100644 --- a/generated/serdes_struct_brush_settings_1.h +++ b/generated/serdes_struct_brush_settings_1.h @@ -128,12 +128,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_1 *Element, memory_ar - Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); + Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); - Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); + Element->Modifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); diff --git a/generated/serdes_struct_brush_settings_2.h b/generated/serdes_struct_brush_settings_2.h index d3dced3b8..bec862e00 100644 --- a/generated/serdes_struct_brush_settings_2.h +++ b/generated/serdes_struct_brush_settings_2.h @@ -135,12 +135,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings_2 *Element, memory_ar - Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); + Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); - Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); + Element->Modifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 6d3826770..ca73faea0 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -171,12 +171,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena - Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); + Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); - Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); + Element->Modifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index b07ef58c0..0be2ece58 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -523,7 +523,7 @@ GetMax(v3 *SelectionRegion) } link_internal void -ApplyEditToRegion(engine_resources *Engine, rect3 *SelectionAABB, v3 HSVColor, b32 PersistWhitespace, world_edit_mode WorldEditMode, world_edit_mode_modifier Modifier) +ApplyEditToRegion(engine_resources *Engine, rect3 *SelectionAABB, v3 HSVColor, b32 PersistWhitespace, world_edit_blend_mode WorldEditMode, world_edit_blend_mode_modifier Modifier) { world_edit_shape Shape = { .Type = type_world_update_op_shape_params_rect, @@ -865,7 +865,7 @@ InteractWithThumbnailTexture(engine_resources *Engine, renderer_2d *Ui, window_l link_internal v3 -GetHotVoxelForEditMode(engine_resources *Engine, world_edit_mode WorldEditMode) +GetHotVoxelForEditMode(engine_resources *Engine, world_edit_blend_mode WorldEditMode) { picked_voxel_position Pos = PickedVoxel_FirstFilled; @@ -889,7 +889,7 @@ GetHotVoxelForEditMode(engine_resources *Engine, world_edit_mode WorldEditMode) } link_internal v3 -GetHotVoxelForFlood(engine_resources *Engine, world_edit_mode WorldEditMode, world_edit_mode_modifier Modifier) +GetHotVoxelForFlood(engine_resources *Engine, world_edit_blend_mode WorldEditMode, world_edit_blend_mode_modifier Modifier) { v3 Result = {}; picked_voxel_position Pos = {}; @@ -1285,8 +1285,8 @@ ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *P { brush_settings *Settings = &Layer->Settings; - world_edit_mode Mode = Settings->Mode; - world_edit_mode_modifier Modifier = Settings->Modifier; + world_edit_blend_mode Mode = Settings->Mode; + world_edit_blend_mode_modifier Modifier = Settings->Modifier; rect3i UpdateBounds = {{}, DestChunk->Dim}; @@ -2086,11 +2086,11 @@ InputStateIsValidToApplyEdit(input *Input) return Result; } -link_internal world_edit_mode +link_internal world_edit_blend_mode GetEditModeForSelectedTool(level_editor *Editor) { // Default is attach for tools/brushes that don't have a mode in their settings - world_edit_mode Result = WorldEdit_Mode_Attach; + world_edit_blend_mode Result = WorldEdit_Mode_Attach; switch(Editor->Tool) { diff --git a/src/engine/editor.h b/src/engine/editor.h index 281fc5956..df6dadc0c 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -616,7 +616,7 @@ enum world_edit_brush_type }; // TODO(Jesse): Rename to .. something something behavior ? -enum world_edit_mode +enum world_edit_blend_mode { WorldEdit_Mode_Attach, WorldEdit_Mode_Remove, @@ -625,7 +625,7 @@ enum world_edit_mode }; // TODO(Jesse): Rename to reflect that it's the iteration pattern ..? -enum world_edit_mode_modifier +enum world_edit_blend_mode_modifier { WorldEdit_Modifier_Default = 0, WorldEdit_Modifier_Flood = (1<<0), @@ -686,11 +686,11 @@ struct voronoi_noise_params r32 MaskChance; }; -poof(do_editor_ui_for_radio_enum(world_edit_mode_modifier)) -#include +poof(do_editor_ui_for_radio_enum(world_edit_blend_mode_modifier)) +#include -poof(string_and_value_tables(world_edit_mode_modifier)) -#include +poof(string_and_value_tables(world_edit_blend_mode_modifier)) +#include @@ -702,13 +702,13 @@ poof(toggle_button_group_for_enum(engine_debug_view_mode)) poof(do_editor_ui_for_radio_enum(asset_window_view_mode)) #include -poof(string_and_value_tables(world_edit_mode)) -#include -/* poof(radio_button_group_for_bitfield_enum(world_edit_mode)); */ -/* #include */ +poof(string_and_value_tables(world_edit_blend_mode)) +#include +/* poof(radio_button_group_for_bitfield_enum(world_edit_blend_mode)); */ +/* #include */ -poof(do_editor_ui_for_radio_enum(world_edit_mode)) -#include +poof(do_editor_ui_for_radio_enum(world_edit_blend_mode)) +#include poof(do_editor_ui_for_radio_enum(world_edit_tool)) #include @@ -781,8 +781,8 @@ struct world_edit_brush_constraints { world_edit_shape Shape; - world_edit_mode Mode; - world_edit_mode_modifier Modifier; + world_edit_blend_mode Mode; + world_edit_blend_mode_modifier Modifier; // NOTE(Jesse): If Modifier is Flood, this is set to where the flood should start // @@ -885,8 +885,8 @@ struct brush_settings poof(@version(3)) // // Common across brush types // - world_edit_mode Mode; - world_edit_mode_modifier Modifier; + world_edit_blend_mode Mode; + world_edit_blend_mode_modifier Modifier; s32 Iterations = 1; // NOTE(Jesse): How many times to do the filter. // NOTE(Jesse): This is the relative offset from the base selection. @@ -914,8 +914,8 @@ struct brush_settings_2 // // Common across brush types // - world_edit_mode Mode; - world_edit_mode_modifier Modifier; + world_edit_blend_mode Mode; + world_edit_blend_mode_modifier Modifier; s32 Iterations = 1; // NOTE(Jesse): How many times to do the filter. // NOTE(Jesse): This is the relative offset from the base selection. @@ -943,8 +943,8 @@ struct brush_settings_1 // // Common across brush types // - world_edit_mode Mode; - world_edit_mode_modifier Modifier; + world_edit_blend_mode Mode; + world_edit_blend_mode_modifier Modifier; s32 Iterations = 1; // NOTE(Jesse): How many times to do the filter. // NOTE(Jesse): This is the relative offset from the base selection. @@ -966,8 +966,8 @@ struct brush_settings_0 // // Common across brush types // - world_edit_mode Mode; - world_edit_mode_modifier Modifier; + world_edit_blend_mode Mode; + world_edit_blend_mode_modifier Modifier; s32 Iterations = 1; // NOTE(Jesse): How many times to do the filter. // NOTE(Jesse): This is the relative offset from the base selection. @@ -1030,8 +1030,8 @@ struct layered_brush poof(@version(3)) b8 BrushFollowsCursor; // NOTE(Jesse): These are the global settings for the brush when it gets applied to the world. - world_edit_mode Mode; - world_edit_mode_modifier Modifier; + world_edit_blend_mode Mode; + world_edit_blend_mode_modifier Modifier; // NOTE(Jesse): This is actually just using the chunk .. should probably change it chunk_thumbnail Preview; poof(@no_serialize) @@ -1103,14 +1103,14 @@ Marshal(layered_brush_0 *Stored, layered_brush *Live) struct single_brush { - world_edit_mode Mode; + world_edit_blend_mode Mode; }; struct asset_brush { - world_edit_mode Mode; - world_edit_mode_modifier Modifier; + world_edit_blend_mode Mode; + world_edit_blend_mode_modifier Modifier; }; @@ -1147,8 +1147,8 @@ struct world_edit rect3cp Region; world_edit_shape Shape; - world_edit_mode Mode; - world_edit_mode_modifier Modifier; + world_edit_blend_mode Mode; + world_edit_blend_mode_modifier Modifier; u32 Ordinal; // monotonically increasing integer sourced from level_editor::NextEditOrdinal @@ -1265,10 +1265,10 @@ CheckSettingsChanged(world_edit *); link_internal b32 HardResetEditor(level_editor *Editor); link_internal v3 -GetHotVoxelForEditMode(engine_resources *Engine, world_edit_mode WorldEditMode); +GetHotVoxelForEditMode(engine_resources *Engine, world_edit_blend_mode WorldEditMode); link_internal v3 -GetHotVoxelForFlood(engine_resources *Engine, world_edit_mode WorldEditMode, world_edit_mode_modifier Modifier); +GetHotVoxelForFlood(engine_resources *Engine, world_edit_blend_mode WorldEditMode, world_edit_blend_mode_modifier Modifier); link_internal void ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *Preview, world_chunk *DestChunk, v3i SmallestMinOffset); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 8d2ad58cc..0d8d5734c 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3720,8 +3720,8 @@ WorkQueueEntryFinalizeNoiseValues(gpu_readback_buffer PBOBuf, u16 *NoiseData, v3 link_internal work_queue_entry_update_world_region -WorkQueueEntryUpdateWorldRegion(world_edit_mode Mode, - world_edit_mode_modifier Modifier, +WorkQueueEntryUpdateWorldRegion(world_edit_blend_mode Mode, + world_edit_blend_mode_modifier Modifier, v3 SimFloodOrigin, world_edit_shape *Shape, v3 RGBColor, diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 459a363ec..a09720a92 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -93,8 +93,8 @@ WorldUpdateThread_Main(void *ThreadStartupParams) link_internal void QueueWorldUpdateForRegion( engine_resources *Engine, - world_edit_mode Mode, - world_edit_mode_modifier Modifier, + world_edit_blend_mode Mode, + world_edit_blend_mode_modifier Modifier, world_edit_shape *Shape, v3 HSVColor, b32 PersistWhitespace, @@ -896,8 +896,8 @@ ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_re v3i UpdateDim = GetDim(SimSpaceUpdateBounds); s32 TotalVoxels = Volume(UpdateDim); - world_edit_mode Mode = Job->Brush.Mode; - world_edit_mode_modifier Modifier = Job->Brush.Modifier; + world_edit_blend_mode Mode = Job->Brush.Mode; + world_edit_blend_mode_modifier Modifier = Job->Brush.Modifier; world_edit_shape Shape = Job->Brush.Shape; /* v3i FloodOrigin = V3i(Job->Brush.SimFloodOrigin); */ @@ -1047,8 +1047,8 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ { TIMED_FUNCTION(); - world_edit_mode Mode = Job->Brush.Mode; - world_edit_mode_modifier Modifier = Job->Brush.Modifier; + world_edit_blend_mode Mode = Job->Brush.Mode; + world_edit_blend_mode_modifier Modifier = Job->Brush.Modifier; world_edit_shape Shape = Job->Brush.Shape; /* v3i FloodOrigin = V3i(Job->Brush.SimFloodOrigin); */ diff --git a/src/engine/world_update.h b/src/engine/world_update.h index fd0c4ee2b..f84f15ce9 100644 --- a/src/engine/world_update.h +++ b/src/engine/world_update.h @@ -41,7 +41,7 @@ poof(generate_cursor(voxel_stack_element)) struct apply_world_edit_params { - world_edit_mode Mode; + world_edit_blend_mode Mode; rect3i SSRect; rect3i SimSpaceUpdateBounds; world_chunk *CopiedChunk; @@ -53,7 +53,7 @@ struct apply_world_edit_params #define UNPACK_APPLY_WORLD_EDIT_PARAMS(P) \ - world_edit_mode Mode = P->Mode; \ + world_edit_blend_mode Mode = P->Mode; \ rect3i SSRect = P->SSRect; \ rect3i SimSpaceUpdateBounds = P->SimSpaceUpdateBounds; \ world_chunk *CopiedChunk = P->CopiedChunk; \ @@ -78,7 +78,7 @@ ChunkCountForDim(v3i Dim, v3i ChunkDim) struct work_queue_entry_update_world_region; link_internal void -QueueWorldUpdateForRegion( engine_resources *Engine, world_edit_mode Mode, world_edit_mode_modifier Modifier, world_edit_shape *Shape, v3 HSVColor, b32 PersistWhitespace, memory_arena *Memory ); +QueueWorldUpdateForRegion( engine_resources *Engine, world_edit_blend_mode Mode, world_edit_blend_mode_modifier Modifier, world_edit_shape *Shape, v3 HSVColor, b32 PersistWhitespace, memory_arena *Memory ); link_internal void ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_region *Job, rect3i SimSpaceUpdateBounds, world_chunk *CopiedChunk, b32 Invert = False, b32 PersistWhitespace = False); From 9572362f6625f3fdb9de691d6c5245ee6726403b Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 13 Feb 2025 23:07:24 -0700 Subject: [PATCH 163/421] Changes to world_edit_blend_mode and world_edit_blend_mode_modifier --- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_layered_brush_0.h | 2 +- generated/default_marshal_layered_brush_1.h | 2 +- generated/default_marshal_layered_brush_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...or_ui_for_compound_type_world_edit_brush.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 49 +++++++ ...adio_enum_world_edit_blend_mode_modifier.h | 134 ++++++++++++++++++ ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- ...on_pattern_199741702_161749140_632272777.h | 10 +- ..._iteration_pattern_275071431_101859599_0.h | 10 +- ..._iteration_pattern_275071431_785723886_0.h | 10 +- ..._iteration_pattern_846291950_267608728_0.h | 14 +- .../rectalinear_iteration_pattern_398799212.h | 12 +- .../rectalinear_iteration_pattern_416827956.h | 12 +- .../rectalinear_iteration_pattern_428632106.h | 12 +- .../rectalinear_iteration_pattern_530902269.h | 12 +- .../rectalinear_iteration_pattern_631222419.h | 12 +- .../rectalinear_iteration_pattern_643608995.h | 12 +- .../rectalinear_iteration_pattern_812652930.h | 12 +- .../rectalinear_iteration_pattern_920026661.h | 12 +- .../rectalinear_iteration_pattern_992879728.h | 12 +- .../string_and_value_tables_shape_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 47 ++++++ ...ue_tables_world_edit_blend_mode_modifier.h | 92 ++++++++++++ ..._value_tables_world_update_op_shape_type.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- src/engine/editor.cpp | 26 ++-- src/engine/editor.h | 25 ++-- src/engine/game_effects.cpp | 9 +- src/engine/render_loop.cpp | 1 - src/engine/world_update.cpp | 125 ++++++++-------- 41 files changed, 517 insertions(+), 181 deletions(-) create mode 100644 generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h create mode 100644 generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h create mode 100644 generated/string_and_value_tables_world_edit_blend_mode.h create mode 100644 generated/string_and_value_tables_world_edit_blend_mode_modifier.h diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 5b88d6ce2..01e83df5c 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:932:0 +// src/engine/editor.h:937:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 73d4d0e51..8ac91e8ca 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:676:0 +// src/engine/editor.h:680:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index 0d94eaec0..e36ebd3b8 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1166:0 +// src/engine/editor.h:1171:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index ce7d0ebca..907eb14e7 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1168:0 +// src/engine/editor.h:1173:0 diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 04d0c83ae..4145afdff 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:997:0 +// src/engine/editor.h:1002:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index e31de93a4..c240b0237 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:990:0 +// src/engine/editor.h:995:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index f83d8dc15..95e275ee2 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:983:0 +// src/engine/editor.h:988:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_layered_brush_0.h b/generated/default_marshal_layered_brush_0.h index 0ffff0860..bb945aa4d 100644 --- a/generated/default_marshal_layered_brush_0.h +++ b/generated/default_marshal_layered_brush_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1095:0 +// src/engine/editor.h:1100:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_layered_brush_1.h b/generated/default_marshal_layered_brush_1.h index 8958a6ef7..9afc6001c 100644 --- a/generated/default_marshal_layered_brush_1.h +++ b/generated/default_marshal_layered_brush_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1088:0 +// src/engine/editor.h:1093:0 RangeIterator(Index, (256)) { diff --git a/generated/default_marshal_layered_brush_2.h b/generated/default_marshal_layered_brush_2.h index 4c6180d6f..dd9fb13e5 100644 --- a/generated/default_marshal_layered_brush_2.h +++ b/generated/default_marshal_layered_brush_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1081:0 +// src/engine/editor.h:1086:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index b445bd58b..a3c3f0b6d 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:861:0 +// src/engine/editor.h:866:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_world_edit_brush.h index 02a6816c1..8fd4e34c8 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:798:0 +// src/engine/editor.h:803:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index c2cfd56ea..f2b01d96b 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:702:0 +// src/engine/editor.h:707:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 9e03fb4a4..b05f1c159 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:875:0 +// src/engine/editor.h:880:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h new file mode 100644 index 000000000..bb068e5fa --- /dev/null +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -0,0 +1,49 @@ +// src/engine/editor.h:715:0 + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} + +link_internal ui_toggle_button_group +RadioButtonGroup_world_edit_blend_mode( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + world_edit_blend_mode *Element, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_handle ButtonHandles[] = + { + { CSz("Additive"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Additive")), WorldEdit_Mode_Additive }, + { CSz("Subtractive"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Subtractive")), WorldEdit_Mode_Subtractive }, + { CSz("Disabled"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Disabled")), WorldEdit_Mode_Disabled }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_RadioButtons)); + return Result; +} + + + + +link_internal ui_toggle_button_group +DoEditorUi( renderer_2d *Ui, + window_layout *Window, + world_edit_blend_mode *Element, + cs GroupName, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_group RadioGroup = RadioButtonGroup_world_edit_blend_mode(Ui, Window, GroupName, Element, Params, ExtraFlags); + return RadioGroup; +} + diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h new file mode 100644 index 000000000..b054b49d6 --- /dev/null +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -0,0 +1,134 @@ +// src/engine/editor.h:696:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + { + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Default"), UiId(Window, "enum WorldEdit_Modifier_Default", Element), Params)) + { + if (WorldEdit_Modifier_Default == world_edit_blend_mode_modifier(0)) + { + *Element = world_edit_blend_mode_modifier(0); + } + else + { + if ((*Element & WorldEdit_Modifier_Default) == WorldEdit_Modifier_Default) + { + *Element = world_edit_blend_mode_modifier(*Element&~WorldEdit_Modifier_Default); + } + else + { + *Element = world_edit_blend_mode_modifier(*Element|WorldEdit_Modifier_Default); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Surface"), UiId(Window, "enum WorldEdit_ValueModifier_Surface", Element), Params)) + { + if (WorldEdit_ValueModifier_Surface == world_edit_blend_mode_modifier(0)) + { + *Element = world_edit_blend_mode_modifier(0); + } + else + { + if ((*Element & WorldEdit_ValueModifier_Surface) == WorldEdit_ValueModifier_Surface) + { + *Element = world_edit_blend_mode_modifier(*Element&~WorldEdit_ValueModifier_Surface); + } + else + { + *Element = world_edit_blend_mode_modifier(*Element|WorldEdit_ValueModifier_Surface); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("ClampPos"), UiId(Window, "enum WorldEdit_ValueModifier_ClampPos", Element), Params)) + { + if (WorldEdit_ValueModifier_ClampPos == world_edit_blend_mode_modifier(0)) + { + *Element = world_edit_blend_mode_modifier(0); + } + else + { + if ((*Element & WorldEdit_ValueModifier_ClampPos) == WorldEdit_ValueModifier_ClampPos) + { + *Element = world_edit_blend_mode_modifier(*Element&~WorldEdit_ValueModifier_ClampPos); + } + else + { + *Element = world_edit_blend_mode_modifier(*Element|WorldEdit_ValueModifier_ClampPos); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("ClampNeg"), UiId(Window, "enum WorldEdit_ValueModifier_ClampNeg", Element), Params)) + { + if (WorldEdit_ValueModifier_ClampNeg == world_edit_blend_mode_modifier(0)) + { + *Element = world_edit_blend_mode_modifier(0); + } + else + { + if ((*Element & WorldEdit_ValueModifier_ClampNeg) == WorldEdit_ValueModifier_ClampNeg) + { + *Element = world_edit_blend_mode_modifier(*Element&~WorldEdit_ValueModifier_ClampNeg); + } + else + { + *Element = world_edit_blend_mode_modifier(*Element|WorldEdit_ValueModifier_ClampNeg); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Discard"), UiId(Window, "enum WorldEdit_ColorModifier_Discard", Element), Params)) + { + if (WorldEdit_ColorModifier_Discard == world_edit_blend_mode_modifier(0)) + { + *Element = world_edit_blend_mode_modifier(0); + } + else + { + if ((*Element & WorldEdit_ColorModifier_Discard) == WorldEdit_ColorModifier_Discard) + { + *Element = world_edit_blend_mode_modifier(*Element&~WorldEdit_ColorModifier_Discard); + } + else + { + *Element = world_edit_blend_mode_modifier(*Element|WorldEdit_ColorModifier_Discard); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + } + else + { + PushNewRow(Ui); + } +} + diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index df2afbc87..509caa9ce 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:716:0 +// src/engine/editor.h:721:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 5db1ca939..7c5bb506e 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:713:0 +// src/engine/editor.h:718:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index 65a01c503..5487902ec 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -55,11 +55,11 @@ while (AtElements(&Stack)) if ( ((OverwriteVoxel == True) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True)) ) { - if (Mode == WorldEdit_Mode_Paint) - { - V->Color = NewVoxelValue->Color; - } - else + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { *V = *NewVoxelValue; } diff --git a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h index 619236a1e..50fc63925 100644 --- a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h @@ -56,11 +56,11 @@ while (AtElements(&Stack)) if ( ((OverwriteVoxel == True) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True)) ) { - if (Mode == WorldEdit_Mode_Paint) - { - V->Color = NewVoxelValue->Color; - } - else + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { *V = *NewVoxelValue; } diff --git a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h index af7776cee..d1eb532d7 100644 --- a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h @@ -56,11 +56,11 @@ while (AtElements(&Stack)) if ( ((OverwriteVoxel == True) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True)) ) { - if (Mode == WorldEdit_Mode_Paint) - { - V->Color = NewVoxelValue->Color; - } - else + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { *V = *NewVoxelValue; } diff --git a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h index 45f691ef6..5c9eb7410 100644 --- a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h +++ b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h @@ -28,7 +28,7 @@ while (AtElements(&Stack)) NotImplemented; - /* { if ( (V->Flags&Voxel_Filled) == (Voxel_Filled*(Mode==WorldEdit_Mode_Attach)) ) }, */ + /* { if ( (V->Flags&Voxel_Filled) == (Voxel_Filled*(Mode==WorldEdit_Mode_Additive)) ) }, */ { NotImplemented; @@ -45,7 +45,7 @@ while (AtElements(&Stack)) NotImplemented; - /* if ( Mode == WorldEdit_Mode_Attach && (V->Flags&Voxel_Filled) ) */ + /* if ( Mode == WorldEdit_Mode_Additive && (V->Flags&Voxel_Filled) ) */ /* { } */ /* else */ { @@ -59,11 +59,11 @@ while (AtElements(&Stack)) if ( ((OverwriteVoxel == True) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True)) ) { - if (Mode == WorldEdit_Mode_Paint) - { - V->Color = NewVoxelValue->Color; - } - else + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { *V = *NewVoxelValue; } diff --git a/generated/rectalinear_iteration_pattern_398799212.h b/generated/rectalinear_iteration_pattern_398799212.h index ed715e325..edd9ab105 100644 --- a/generated/rectalinear_iteration_pattern_398799212.h +++ b/generated/rectalinear_iteration_pattern_398799212.h @@ -29,13 +29,13 @@ DimIterator(x, y, z, UpdateDim) if ( ((OverwriteVoxel == True ) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True )) ) { - if (Mode == WorldEdit_Mode_Paint) + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { - V->Color = NewVoxelValue->Color; - } - else - { - if (Mode == WorldEdit_Mode_Remove) { *V = {}; } + if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } else { *V = *NewVoxelValue; } } diff --git a/generated/rectalinear_iteration_pattern_416827956.h b/generated/rectalinear_iteration_pattern_416827956.h index c32946362..9d4609326 100644 --- a/generated/rectalinear_iteration_pattern_416827956.h +++ b/generated/rectalinear_iteration_pattern_416827956.h @@ -17,13 +17,13 @@ DimIterator(x, y, z, UpdateDim) if ( ((OverwriteVoxel == True ) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True )) ) { - if (Mode == WorldEdit_Mode_Paint) + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { - V->Color = NewVoxelValue->Color; - } - else - { - if (Mode == WorldEdit_Mode_Remove) { *V = {}; } + if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } else { *V = *NewVoxelValue; } } diff --git a/generated/rectalinear_iteration_pattern_428632106.h b/generated/rectalinear_iteration_pattern_428632106.h index f82d59a4f..67228006d 100644 --- a/generated/rectalinear_iteration_pattern_428632106.h +++ b/generated/rectalinear_iteration_pattern_428632106.h @@ -25,13 +25,13 @@ DimIterator(x, y, z, UpdateDim) if ( ((OverwriteVoxel == True ) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True )) ) { - if (Mode == WorldEdit_Mode_Paint) + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { - V->Color = NewVoxelValue->Color; - } - else - { - if (Mode == WorldEdit_Mode_Remove) { *V = {}; } + if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } else { *V = *NewVoxelValue; } } diff --git a/generated/rectalinear_iteration_pattern_530902269.h b/generated/rectalinear_iteration_pattern_530902269.h index b1c1e1b21..d75d10eb4 100644 --- a/generated/rectalinear_iteration_pattern_530902269.h +++ b/generated/rectalinear_iteration_pattern_530902269.h @@ -21,13 +21,13 @@ DimIterator(x, y, z, UpdateDim) if ( ((OverwriteVoxel == True ) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True )) ) { - if (Mode == WorldEdit_Mode_Paint) + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { - V->Color = NewVoxelValue->Color; - } - else - { - if (Mode == WorldEdit_Mode_Remove) { *V = {}; } + if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } else { *V = *NewVoxelValue; } } diff --git a/generated/rectalinear_iteration_pattern_631222419.h b/generated/rectalinear_iteration_pattern_631222419.h index 2aa43a6ae..e6f32f9f9 100644 --- a/generated/rectalinear_iteration_pattern_631222419.h +++ b/generated/rectalinear_iteration_pattern_631222419.h @@ -30,13 +30,13 @@ DimIterator(x, y, z, UpdateDim) if ( ((OverwriteVoxel == True ) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True )) ) { - if (Mode == WorldEdit_Mode_Paint) + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { - V->Color = NewVoxelValue->Color; - } - else - { - if (Mode == WorldEdit_Mode_Remove) { *V = {}; } + if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } else { *V = *NewVoxelValue; } } diff --git a/generated/rectalinear_iteration_pattern_643608995.h b/generated/rectalinear_iteration_pattern_643608995.h index 838e05131..f5c9fa5b4 100644 --- a/generated/rectalinear_iteration_pattern_643608995.h +++ b/generated/rectalinear_iteration_pattern_643608995.h @@ -29,13 +29,13 @@ DimIterator(x, y, z, UpdateDim) if ( ((OverwriteVoxel == True ) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True )) ) { - if (Mode == WorldEdit_Mode_Paint) + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { - V->Color = NewVoxelValue->Color; - } - else - { - if (Mode == WorldEdit_Mode_Remove) { *V = {}; } + if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } else { *V = *NewVoxelValue; } } diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index c0fe44201..557914a55 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -21,13 +21,13 @@ DimIterator(x, y, z, UpdateDim) if ( ((OverwriteVoxel == True ) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True )) ) { - if (Mode == WorldEdit_Mode_Paint) + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { - V->Color = NewVoxelValue->Color; - } - else - { - if (Mode == WorldEdit_Mode_Remove) { *V = {}; } + if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } else { *V = *NewVoxelValue; } } diff --git a/generated/rectalinear_iteration_pattern_920026661.h b/generated/rectalinear_iteration_pattern_920026661.h index e97e79a4e..58e7fa1cb 100644 --- a/generated/rectalinear_iteration_pattern_920026661.h +++ b/generated/rectalinear_iteration_pattern_920026661.h @@ -22,13 +22,13 @@ DimIterator(x, y, z, UpdateDim) if ( ((OverwriteVoxel == True ) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True )) ) { - if (Mode == WorldEdit_Mode_Paint) + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { - V->Color = NewVoxelValue->Color; - } - else - { - if (Mode == WorldEdit_Mode_Remove) { *V = {}; } + if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } else { *V = *NewVoxelValue; } } diff --git a/generated/rectalinear_iteration_pattern_992879728.h b/generated/rectalinear_iteration_pattern_992879728.h index 520fdd30d..96915fb18 100644 --- a/generated/rectalinear_iteration_pattern_992879728.h +++ b/generated/rectalinear_iteration_pattern_992879728.h @@ -26,13 +26,13 @@ DimIterator(x, y, z, UpdateDim) if ( ((OverwriteVoxel == True ) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True )) ) { - if (Mode == WorldEdit_Mode_Paint) + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { - V->Color = NewVoxelValue->Color; - } - else - { - if (Mode == WorldEdit_Mode_Remove) { *V = {}; } + if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } else { *V = *NewVoxelValue; } } diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 536d8d93f..e718813ad 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:825:0 +// src/engine/editor.h:830:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h new file mode 100644 index 000000000..bad932c34 --- /dev/null +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -0,0 +1,47 @@ +// src/engine/editor.h:710:0 + +link_internal counted_string +ToStringPrefixless(world_edit_blend_mode Type) +{ + counted_string Result = {}; + switch (Type) + { + case WorldEdit_Mode_Additive: { Result = CSz("Additive"); } break; + case WorldEdit_Mode_Subtractive: { Result = CSz("Subtractive"); } break; + case WorldEdit_Mode_Disabled: { Result = CSz("Disabled"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(world_edit_blend_mode Type) +{ + counted_string Result = {}; + switch (Type) + { + case WorldEdit_Mode_Additive: { Result = CSz("WorldEdit_Mode_Additive"); } break; + case WorldEdit_Mode_Subtractive: { Result = CSz("WorldEdit_Mode_Subtractive"); } break; + case WorldEdit_Mode_Disabled: { Result = CSz("WorldEdit_Mode_Disabled"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal world_edit_blend_mode +WorldEditBlendMode(counted_string S) +{ + world_edit_blend_mode Result = {}; + + if (StringsMatch(S, CSz("WorldEdit_Mode_Additive"))) { return WorldEdit_Mode_Additive; } + if (StringsMatch(S, CSz("WorldEdit_Mode_Subtractive"))) { return WorldEdit_Mode_Subtractive; } + if (StringsMatch(S, CSz("WorldEdit_Mode_Disabled"))) { return WorldEdit_Mode_Disabled; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h new file mode 100644 index 000000000..d8cda412a --- /dev/null +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -0,0 +1,92 @@ +// src/engine/editor.h:693:0 + +link_internal counted_string +ToStringPrefixless(world_edit_blend_mode_modifier Type) +{ + counted_string Result = {}; + switch (Type) + { + case WorldEdit_Modifier_Default: { Result = CSz("Default"); } break; + case WorldEdit_ValueModifier_Surface: { Result = CSz("Surface"); } break; + case WorldEdit_ValueModifier_ClampPos: { Result = CSz("ClampPos"); } break; + case WorldEdit_ValueModifier_ClampNeg: { Result = CSz("ClampNeg"); } break; + case WorldEdit_ColorModifier_Discard: { Result = CSz("Discard"); } break; + + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, + // but the metaprogram might have to be a bit fancier.. + default: + { + u32 CurrentFlags = u32(Type); + + if (CountBitsSet_Kernighan(CurrentFlags) == 1) + { + Result = FSz("(invalid value for world_edit_blend_mode_modifier (%d))", CurrentFlags); + } + else + { + u32 FirstValue = UnsetLeastSignificantSetBit(&CurrentFlags); + Result = ToStringPrefixless(world_edit_blend_mode_modifier(FirstValue)); + + while (CurrentFlags) + { + u32 Value = UnsetLeastSignificantSetBit(&CurrentFlags); + cs Next = ToStringPrefixless(world_edit_blend_mode_modifier(Value)); + Result = FSz("%S | %S", Result, Next); + } + } + } break; + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(world_edit_blend_mode_modifier Type) +{ + counted_string Result = {}; + switch (Type) + { + case WorldEdit_Modifier_Default: { Result = CSz("WorldEdit_Modifier_Default"); } break; + case WorldEdit_ValueModifier_Surface: { Result = CSz("WorldEdit_ValueModifier_Surface"); } break; + case WorldEdit_ValueModifier_ClampPos: { Result = CSz("WorldEdit_ValueModifier_ClampPos"); } break; + case WorldEdit_ValueModifier_ClampNeg: { Result = CSz("WorldEdit_ValueModifier_ClampNeg"); } break; + case WorldEdit_ColorModifier_Discard: { Result = CSz("WorldEdit_ColorModifier_Discard"); } break; + + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, + // but the metaprogram might have to be a bit fancier.. + default: + { + u32 CurrentFlags = u32(Type); + + u32 FirstValue = UnsetLeastSignificantSetBit(&CurrentFlags); + Result = ToString(world_edit_blend_mode_modifier(FirstValue)); + + while (CurrentFlags) + { + u32 Value = UnsetLeastSignificantSetBit(&CurrentFlags); + cs Next = ToString(world_edit_blend_mode_modifier(Value)); + Result = FSz("%S | %S", Result, Next); + } + } break; + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal world_edit_blend_mode_modifier +WorldEditBlendModeModifier(counted_string S) +{ + world_edit_blend_mode_modifier Result = {}; + + if (StringsMatch(S, CSz("WorldEdit_Modifier_Default"))) { return WorldEdit_Modifier_Default; } + if (StringsMatch(S, CSz("WorldEdit_ValueModifier_Surface"))) { return WorldEdit_ValueModifier_Surface; } + if (StringsMatch(S, CSz("WorldEdit_ValueModifier_ClampPos"))) { return WorldEdit_ValueModifier_ClampPos; } + if (StringsMatch(S, CSz("WorldEdit_ValueModifier_ClampNeg"))) { return WorldEdit_ValueModifier_ClampNeg; } + if (StringsMatch(S, CSz("WorldEdit_ColorModifier_Discard"))) { return WorldEdit_ColorModifier_Discard; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_world_update_op_shape_type.h b/generated/string_and_value_tables_world_update_op_shape_type.h index d1023235e..8c0cf976a 100644 --- a/generated/string_and_value_tables_world_update_op_shape_type.h +++ b/generated/string_and_value_tables_world_update_op_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:738:0 +// src/engine/editor.h:743:0 link_internal counted_string ToStringPrefixless(world_update_op_shape_type Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 04f35ac32..715f641a2 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:697:0 +// src/engine/editor.h:702:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 0be2ece58..f09757ae5 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -872,13 +872,13 @@ GetHotVoxelForEditMode(engine_resources *Engine, world_edit_blend_mode WorldEdit switch (WorldEditMode) { case WorldEdit_Mode_Disabled: {} break; - case WorldEdit_Mode_Attach: + case WorldEdit_Mode_Additive: { Pos = PickedVoxel_LastEmpty; } break; - case WorldEdit_Mode_Paint: - case WorldEdit_Mode_Remove: + /* case WorldEdit_Mode_Paint: */ + case WorldEdit_Mode_Subtractive: { Pos = PickedVoxel_FirstFilled; } break; @@ -894,18 +894,21 @@ GetHotVoxelForFlood(engine_resources *Engine, world_edit_blend_mode WorldEditMod v3 Result = {}; picked_voxel_position Pos = {}; + NotImplemented; + +#if 0 if (Modifier == WorldEdit_Modifier_Flood) { switch (WorldEditMode) { case WorldEdit_Mode_Disabled: {} break; - case WorldEdit_Mode_Attach: + case WorldEdit_Mode_Additive: { Pos = PickedVoxel_FirstFilled; } break; - case WorldEdit_Mode_Paint: - case WorldEdit_Mode_Remove: + /* case WorldEdit_Mode_Paint: */ + case WorldEdit_Mode_Subtractive: { Pos = PickedVoxel_LastEmpty; } break; @@ -913,6 +916,7 @@ GetHotVoxelForFlood(engine_resources *Engine, world_edit_blend_mode WorldEditMod Result = Floor(GetSimSpaceP(Engine->World, &Engine->MousedOverVoxel.Value, Pos)); } +#endif return Result; } @@ -1235,7 +1239,7 @@ DoSettingsForBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thum // TODO(Jesse): do enum selector for Mode/Modifier/iterations DoEditorUi(Ui, Window, &Settings->Mode, CSz("Mode")); DoEditorUi(Ui, Window, &Settings->Modifier, CSz("Modifier")); - if (Settings->Modifier == WorldEdit_Modifier_Surface || Settings->Modifier == WorldEdit_Modifier_Flood) + if (Settings->Modifier == WorldEdit_ValueModifier_Surface) // || Settings->Modifier == WorldEdit_Modifier_Flood) { DoEditorUi(Ui, Window, &Settings->Iterations, CSz("Iterations")); PushNewRow(Ui); // Primitives require a new row.. I forget why, but there's a good reason. @@ -2090,7 +2094,7 @@ link_internal world_edit_blend_mode GetEditModeForSelectedTool(level_editor *Editor) { // Default is attach for tools/brushes that don't have a mode in their settings - world_edit_blend_mode Result = WorldEdit_Mode_Attach; + world_edit_blend_mode Result = WorldEdit_Mode_Additive; switch(Editor->Tool) { @@ -2671,7 +2675,7 @@ DoWorldEditor(engine_resources *Engine) type_world_update_op_shape_params_asset, .world_update_op_shape_params_asset = AssetUpdateShape, }; - QueueWorldUpdateForRegion(Engine, WorldEdit_Mode_Attach, WorldEdit_Modifier_Default, &Shape, {}, {}, Engine->WorldUpdateMemory); + QueueWorldUpdateForRegion(Engine, WorldEdit_Mode_Additive, WorldEdit_Modifier_Default, &Shape, {}, {}, Engine->WorldUpdateMemory); #endif } } @@ -2744,7 +2748,7 @@ DoWorldEditor(engine_resources *Engine) if (Editor->Selection.Clicks == 2) { - if (Input->Ctrl.Pressed && Input->D.Clicked) { ApplyEditToRegion(Engine, &SelectionAABB, {}, {}, WorldEdit_Mode_Remove, WorldEdit_Modifier_Default); } + if (Input->Ctrl.Pressed && Input->D.Clicked) { ApplyEditToRegion(Engine, &SelectionAABB, {}, {}, WorldEdit_Mode_Subtractive, WorldEdit_Modifier_Default); } if (Input->Ctrl.Pressed && Input->C.Clicked) { Editor->CopyRegion = Editor->Selection.Region; } @@ -2770,7 +2774,7 @@ DoWorldEditor(engine_resources *Engine) type_world_update_op_shape_params_chunk_data, .world_update_op_shape_params_chunk_data = ChunkDataShape, }; - QueueWorldUpdateForRegion(Engine, WorldEdit_Mode_Attach, WorldEdit_Modifier_Default, &Shape, {}, {}, Engine->WorldUpdateMemory); + QueueWorldUpdateForRegion(Engine, WorldEdit_Mode_Additive, WorldEdit_Modifier_Default, &Shape, {}, {}, Engine->WorldUpdateMemory); } } diff --git a/src/engine/editor.h b/src/engine/editor.h index df6dadc0c..1ffecce12 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -618,18 +618,22 @@ enum world_edit_brush_type // TODO(Jesse): Rename to .. something something behavior ? enum world_edit_blend_mode { - WorldEdit_Mode_Attach, - WorldEdit_Mode_Remove, - WorldEdit_Mode_Paint, + WorldEdit_Mode_Additive, + WorldEdit_Mode_Subtractive, + WorldEdit_Mode_Disabled, // Useful for turning the layer off }; -// TODO(Jesse): Rename to reflect that it's the iteration pattern ..? -enum world_edit_blend_mode_modifier +enum world_edit_blend_mode_modifier poof(@bitfield) { WorldEdit_Modifier_Default = 0, - WorldEdit_Modifier_Flood = (1<<0), - WorldEdit_Modifier_Surface = (1<<1), + WorldEdit_ValueModifier_Surface = (1<<0), + WorldEdit_ValueModifier_ClampPos = (1<<1), + WorldEdit_ValueModifier_ClampNeg = (1<<2), + + WorldEdit_ColorModifier_Discard = (1<<3), + // NOTE(Jesse): Unsupported for now, unclear if it will be again .. + // WorldEdit_Modifier_Flood = xxxx, }; @@ -686,12 +690,13 @@ struct voronoi_noise_params r32 MaskChance; }; -poof(do_editor_ui_for_radio_enum(world_edit_blend_mode_modifier)) -#include - poof(string_and_value_tables(world_edit_blend_mode_modifier)) #include +poof(do_editor_ui_for_enum(world_edit_blend_mode_modifier)) +#include + + poof(toggle_button_group_for_enum(engine_debug_view_mode)) diff --git a/src/engine/game_effects.cpp b/src/engine/game_effects.cpp index cb4aa7bd3..6e4d6f6b3 100644 --- a/src/engine/game_effects.cpp +++ b/src/engine/game_effects.cpp @@ -299,7 +299,8 @@ DoDig( engine_resources *Resources, canonical_position PickCP, f32 Radius, f32 D .Type = type_world_update_op_shape_params_rect, .world_update_op_shape_params_rect.Region = RectMinMax(MinP,MaxP), }; - QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Remove, WorldEdit_Modifier_Default, &Shape, {}, {}, Resources->WorldUpdateMemory); + NotImplemented; + /* QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Remove, WorldEdit_Modifier_Default, &Shape, {}, {}, Resources->WorldUpdateMemory); */ } link_internal void @@ -314,7 +315,8 @@ DoIceBlock( engine_resources *Resources, canonical_position PickCP, f32 Radius, .Type = type_world_update_op_shape_params_rect, .world_update_op_shape_params_rect.Region = RectMinMax(MinP,MaxP), }; - QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Attach, WorldEdit_Modifier_Default, &Shape, HSV_ICE_BLUE, {}, Resources->WorldUpdateMemory); + NotImplemented; + /* QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Attach, WorldEdit_Modifier_Default, &Shape, HSV_ICE_BLUE, {}, Resources->WorldUpdateMemory); */ } link_internal void @@ -327,7 +329,8 @@ DoSplotion( engine_resources *Resources, cp PickCP, f32 Radius, random_series *E .world_update_op_shape_params_sphere.Radius = Radius, .world_update_op_shape_params_sphere.Location = PickCP, }; - QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Remove, WorldEdit_Modifier_Flood, &Shape, HSV_DARK_GREY, {}, Resources->WorldUpdateMemory); + NotImplemented; + /* QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Remove, WorldEdit_Modifier_Flood, &Shape, HSV_DARK_GREY, {}, Resources->WorldUpdateMemory); */ /* QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Remove, WorldUpdateModeModifier_None, &Shape, DARK_GREY, Resources->WorldUpdateMemory); */ /* QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Attach, WorldUpdateModeModifier_None, &Shape, DARK_GREY, Resources->WorldUpdateMemory); */ /* QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Attach, WorldUpdatenModeModifier_Flood, &Shape, DARK_GREY, Resources->WorldUpdateMemory); */ diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 89a3d74cb..cb7761d87 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -348,7 +348,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { noise_layer *Noise = &Layer->Settings.Noise; - switch (Noise->Type) { case NoiseType_Perlin: diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index a09720a92..2e9eda013 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -345,11 +345,11 @@ poof( if ( ((OverwriteVoxel == True) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True)) ) { - if (Mode == WorldEdit_Mode_Paint) - { - V->Color = NewVoxelValue->Color; - } - else + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { *V = *NewVoxelValue; } @@ -412,13 +412,13 @@ poof( if ( ((OverwriteVoxel == True ) && (Invert == False)) || ((OverwriteVoxel == False) && (Invert == True )) ) { - if (Mode == WorldEdit_Mode_Paint) - { - V->Color = NewVoxelValue->Color; - } - else + /* if (Mode == WorldEdit_Mode_Paint) */ + /* { */ + /* V->Color = NewVoxelValue->Color; */ + /* } */ + /* else */ { - if (Mode == WorldEdit_Mode_Remove) { *V = {}; } + if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } else { *V = *NewVoxelValue; } } @@ -523,7 +523,7 @@ WorldEdit_shape_sphere_Surface(apply_world_edit_params *Params, r32 RadiusSquare { case WorldEdit_Mode_Disabled: {} break; - case WorldEdit_Mode_Attach: + case WorldEdit_Mode_Additive: { poof(rectalinear_iteration_pattern({ @@ -543,8 +543,8 @@ WorldEdit_shape_sphere_Surface(apply_world_edit_params *Params, r32 RadiusSquare #include } break; - case WorldEdit_Mode_Paint: - case WorldEdit_Mode_Remove: + /* case WorldEdit_Mode_Paint: */ + case WorldEdit_Mode_Subtractive: { poof(rectalinear_iteration_pattern({ v3i CenterToVoxP = SimVoxP - EditCenterP; @@ -565,7 +565,7 @@ WorldEdit_shape_sphere_Flood(apply_world_edit_params *Params, thread_local_state UNPACK_APPLY_WORLD_EDIT_PARAMS(Params); s32 TotalVoxels = Volume(UpdateDim); - Assert(Params->Mode == WorldEdit_Mode_Remove); + Assert(Params->Mode == WorldEdit_Mode_Subtractive); poof(flood_fill_iteration_pattern( { @@ -628,7 +628,7 @@ WorldEdit_shape_rect_Surface(apply_world_edit_params *Params, voxel *NewVoxelVal { case WorldEdit_Mode_Disabled: {} break; - case WorldEdit_Mode_Attach: + case WorldEdit_Mode_Additive: { poof(rectalinear_iteration_pattern({ @@ -648,8 +648,8 @@ WorldEdit_shape_rect_Surface(apply_world_edit_params *Params, voxel *NewVoxelVal #include } break; - case WorldEdit_Mode_Paint: - case WorldEdit_Mode_Remove: + /* case WorldEdit_Mode_Paint: */ + case WorldEdit_Mode_Subtractive: { poof(rectalinear_iteration_pattern({ NotImplemented; @@ -673,18 +673,18 @@ WorldEdit_shape_rect_Flood( apply_world_edit_params *Params, thread_local_state { case WorldEdit_Mode_Disabled: {} break; - case WorldEdit_Mode_Paint: - case WorldEdit_Mode_Attach: - case WorldEdit_Mode_Remove: + /* case WorldEdit_Mode_Paint: */ + case WorldEdit_Mode_Additive: + case WorldEdit_Mode_Subtractive: { poof(flood_fill_iteration_pattern( { NotImplemented; - /* { if ( (V->Flags&Voxel_Filled) == (Voxel_Filled*(Mode==WorldEdit_Mode_Attach)) ) }, */ + /* { if ( (V->Flags&Voxel_Filled) == (Voxel_Filled*(Mode==WorldEdit_Mode_Additive)) ) }, */ }, { NotImplemented; - /* if ( Mode == WorldEdit_Mode_Attach && (V->Flags&Voxel_Filled) ) */ + /* if ( Mode == WorldEdit_Mode_Additive && (V->Flags&Voxel_Filled) ) */ /* { } */ /* else */ { @@ -705,8 +705,8 @@ WorldEdit_shape_rect_Default(apply_world_edit_params *Params, voxel *NewVoxelVal switch (Mode) { case WorldEdit_Mode_Disabled: {} break; - case WorldEdit_Mode_Attach: - case WorldEdit_Mode_Remove: + case WorldEdit_Mode_Additive: + case WorldEdit_Mode_Subtractive: { poof(rectalinear_iteration_pattern({ OverwriteVoxel = True; @@ -714,17 +714,17 @@ WorldEdit_shape_rect_Default(apply_world_edit_params *Params, voxel *NewVoxelVal #include } break; - case WorldEdit_Mode_Paint: - { - poof(rectalinear_iteration_pattern({ - NotImplemented; - /* if (V->Flags & Voxel_Filled) */ - { - OverwriteVoxel = True; - } - })) -#include - } break; + /* case WorldEdit_Mode_Paint: */ + /* { */ + /* poof(rectalinear_iteration_pattern({ */ + /* NotImplemented; */ + /* /1* if (V->Flags & Voxel_Filled) *1/ */ + /* { */ + /* OverwriteVoxel = True; */ + /* } */ + /* })) */ +/* #include */ + /* } break; */ } } @@ -748,7 +748,7 @@ WorldEdit_shape_chunk_data_Surface(apply_world_edit_params *Params, v3 SimOrigin { case WorldEdit_Mode_Disabled: {} break; - case WorldEdit_Mode_Attach: + case WorldEdit_Mode_Additive: { poof(rectalinear_iteration_pattern({ @@ -769,8 +769,8 @@ WorldEdit_shape_chunk_data_Surface(apply_world_edit_params *Params, v3 SimOrigin #include } break; - case WorldEdit_Mode_Paint: - case WorldEdit_Mode_Remove: + /* case WorldEdit_Mode_Paint: */ + case WorldEdit_Mode_Subtractive: { poof(rectalinear_iteration_pattern({ v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; @@ -802,7 +802,7 @@ WorldEdit_shape_chunk_data_Flood( switch (Mode) { case WorldEdit_Mode_Disabled: {} break; - case WorldEdit_Mode_Attach: + case WorldEdit_Mode_Additive: { poof(flood_fill_iteration_pattern( { @@ -820,7 +820,7 @@ WorldEdit_shape_chunk_data_Flood( #include } break; - case WorldEdit_Mode_Remove: + case WorldEdit_Mode_Subtractive: { poof(flood_fill_iteration_pattern( { @@ -838,16 +838,16 @@ WorldEdit_shape_chunk_data_Flood( #include } break; - case WorldEdit_Mode_Paint: - { - poof(rectalinear_iteration_pattern({ - v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; - voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - NotImplemented; - /* if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { V->Color = NewVoxelValue->Color; } */ - })) -#include - } break; + /* case WorldEdit_Mode_Paint: */ + /* { */ + /* poof(rectalinear_iteration_pattern({ */ + /* v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; */ + /* voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); */ + /* NotImplemented; */ + /* /1* if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { V->Color = NewVoxelValue->Color; } *1/ */ + /* })) */ +/* #include */ + /* } break; */ } } @@ -863,9 +863,9 @@ WorldEdit_shape_chunk_data_Default(apply_world_edit_params *Params, v3 SimOrigin { case WorldEdit_Mode_Disabled: {} break; - case WorldEdit_Mode_Paint: - case WorldEdit_Mode_Attach: - case WorldEdit_Mode_Remove: + /* case WorldEdit_Mode_Paint: */ + case WorldEdit_Mode_Additive: + case WorldEdit_Mode_Subtractive: { poof(rectalinear_iteration_pattern({ v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; @@ -890,6 +890,8 @@ link_internal void ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_region *Job, rect3i SimSpaceUpdateBounds, world_chunk *CopiedChunk, b32 Invert /* = False */, b32 PersistWhitespace /* = False */ ) { world *World = GetWorld(); + NotImplemented; +#if 0 random_series ColorEntropy = {4654376543246}; @@ -907,7 +909,7 @@ ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_re voxel _NewVoxelValue = {}; voxel *NewVoxelValue = &_NewVoxelValue; - if (Mode == WorldEdit_Mode_Attach || Mode == WorldEdit_Mode_Paint) + if (Mode == WorldEdit_Mode_Additive) // || Mode == WorldEdit_Mode_Paint) { _NewVoxelValue = { NewTransparency, NewColor}; } @@ -940,16 +942,16 @@ ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_re WorldEdit_shape_sphere_Default(&Params, RadiusSquared, EditCenterP, NewVoxelValue); } break; - case WorldEdit_Modifier_Surface: + case WorldEdit_ValueModifier_Surface: { WorldEdit_shape_sphere_Surface(&Params, RadiusSquared, EditCenterP, NewVoxelValue); } break; - case WorldEdit_Modifier_Flood: - { - v3i FloodOrigin = EditCenterP; - WorldEdit_shape_sphere_Flood(&Params, Thread, RadiusSquared, EditCenterP, FloodOrigin, NewVoxelValue); - } break; + /* case WorldEdit_Modifier_Flood: */ + /* { */ + /* v3i FloodOrigin = EditCenterP; */ + /* WorldEdit_shape_sphere_Flood(&Params, Thread, RadiusSquared, EditCenterP, FloodOrigin, NewVoxelValue); */ + /* } break; */ } } break; @@ -1040,6 +1042,7 @@ ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_re } } +#endif } link_internal void From 24148cfa12ea15d5ef2e8f6459d4e0ccf7dad39d Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 14 Feb 2025 00:05:09 -0700 Subject: [PATCH 164/421] Add a blend mode for color --- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_layered_brush_0.h | 2 +- generated/default_marshal_layered_brush_1.h | 2 +- generated/default_marshal_layered_brush_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 15 +++++ ...or_ui_for_compound_type_world_edit_brush.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 46 ++++++++++++++ ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- generated/serdes_struct_brush_settings.h | 10 +++ .../string_and_value_tables_shape_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 47 ++++++++++++++ ..._value_tables_world_update_op_shape_type.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- shaders/terrain/world_edit.fragmentshader | 63 ++++++++++++++----- src/engine/editor.cpp | 1 + src/engine/editor.h | 19 +++++- src/engine/render_loop.cpp | 11 +++- src/engine/world_chunk.cpp | 1 - 32 files changed, 213 insertions(+), 46 deletions(-) create mode 100644 generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h create mode 100644 generated/string_and_value_tables_world_edit_color_blend_mode.h diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 01e83df5c..7f4f5b928 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:937:0 +// src/engine/editor.h:950:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 8ac91e8ca..01011c54a 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:680:0 +// src/engine/editor.h:687:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index e36ebd3b8..5893852f3 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1171:0 +// src/engine/editor.h:1184:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 907eb14e7..77d14e146 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1173:0 +// src/engine/editor.h:1186:0 diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 4145afdff..6b4d3ed3e 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1002:0 +// src/engine/editor.h:1015:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index c240b0237..bc5664343 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:995:0 +// src/engine/editor.h:1008:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index 95e275ee2..720c1ca78 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:988:0 +// src/engine/editor.h:1001:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_layered_brush_0.h b/generated/default_marshal_layered_brush_0.h index bb945aa4d..fc470ccbf 100644 --- a/generated/default_marshal_layered_brush_0.h +++ b/generated/default_marshal_layered_brush_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1100:0 +// src/engine/editor.h:1113:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_layered_brush_1.h b/generated/default_marshal_layered_brush_1.h index 9afc6001c..4a601944d 100644 --- a/generated/default_marshal_layered_brush_1.h +++ b/generated/default_marshal_layered_brush_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1093:0 +// src/engine/editor.h:1106:0 RangeIterator(Index, (256)) { diff --git a/generated/default_marshal_layered_brush_2.h b/generated/default_marshal_layered_brush_2.h index dd9fb13e5..0ed94b4f2 100644 --- a/generated/default_marshal_layered_brush_2.h +++ b/generated/default_marshal_layered_brush_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1086:0 +// src/engine/editor.h:1099:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index a3c3f0b6d..30c8b851d 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:866:0 +// src/engine/editor.h:878:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 2840ae6fc..85851e11f 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -101,6 +101,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_color_blend_mode*, &Element->ColorMode), + CSz("ColorMode"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_compound_type_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_world_edit_brush.h index 8fd4e34c8..7066c0b32 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:803:0 +// src/engine/editor.h:815:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index f2b01d96b..e985db6e5 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:707:0 +// src/engine/editor.h:715:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index b05f1c159..e4f2dbc49 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:880:0 +// src/engine/editor.h:892:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index bb068e5fa..960f219d9 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:715:0 +// src/engine/editor.h:721:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index b054b49d6..973061355 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:696:0 +// src/engine/editor.h:704:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 509caa9ce..b03d20919 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:721:0 +// src/engine/editor.h:733:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h new file mode 100644 index 000000000..922142fd7 --- /dev/null +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -0,0 +1,46 @@ +// src/engine/editor.h:726:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + { + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Additive"), UiId(Window, "enum WorldEdit_ColorBlendMode_Additive", Element), Params)) + { + *Element = WorldEdit_ColorBlendMode_Additive; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Subtractive"), UiId(Window, "enum WorldEdit_ColorBlendMode_Subtractive", Element), Params)) + { + *Element = WorldEdit_ColorBlendMode_Subtractive; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Disabled"), UiId(Window, "enum WorldEdit_ColorBlendMode_Disabled", Element), Params)) + { + *Element = WorldEdit_ColorBlendMode_Disabled; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + } + else + { + PushNewRow(Ui); + } +} + diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 7c5bb506e..02279cc68 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:718:0 +// src/engine/editor.h:730:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index df9428e53..83ac372b3 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -66,6 +66,11 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings *BaseElement, umm Count = + Result &= Serialize(Bytes, (u32*)&Element->ColorMode); // enum + + + + Result &= Serialize(Bytes, &Element->Iterations); // default @@ -182,6 +187,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren + Element->ColorMode = Cast(world_edit_color_blend_mode, Read_u32(Bytes)); + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Iterations, Memory); diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index e718813ad..90d82864b 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:830:0 +// src/engine/editor.h:842:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index bad932c34..7842dcdaa 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:710:0 +// src/engine/editor.h:718:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index d8cda412a..896f61093 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:693:0 +// src/engine/editor.h:701:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h new file mode 100644 index 000000000..6ffe791f2 --- /dev/null +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -0,0 +1,47 @@ +// src/engine/editor.h:724:0 + +link_internal counted_string +ToStringPrefixless(world_edit_color_blend_mode Type) +{ + counted_string Result = {}; + switch (Type) + { + case WorldEdit_ColorBlendMode_Additive: { Result = CSz("Additive"); } break; + case WorldEdit_ColorBlendMode_Subtractive: { Result = CSz("Subtractive"); } break; + case WorldEdit_ColorBlendMode_Disabled: { Result = CSz("Disabled"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(world_edit_color_blend_mode Type) +{ + counted_string Result = {}; + switch (Type) + { + case WorldEdit_ColorBlendMode_Additive: { Result = CSz("WorldEdit_ColorBlendMode_Additive"); } break; + case WorldEdit_ColorBlendMode_Subtractive: { Result = CSz("WorldEdit_ColorBlendMode_Subtractive"); } break; + case WorldEdit_ColorBlendMode_Disabled: { Result = CSz("WorldEdit_ColorBlendMode_Disabled"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal world_edit_color_blend_mode +WorldEditColorBlendMode(counted_string S) +{ + world_edit_color_blend_mode Result = {}; + + if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Additive"))) { return WorldEdit_ColorBlendMode_Additive; } + if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Subtractive"))) { return WorldEdit_ColorBlendMode_Subtractive; } + if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Disabled"))) { return WorldEdit_ColorBlendMode_Disabled; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_world_update_op_shape_type.h b/generated/string_and_value_tables_world_update_op_shape_type.h index 8c0cf976a..40fe574b1 100644 --- a/generated/string_and_value_tables_world_update_op_shape_type.h +++ b/generated/string_and_value_tables_world_update_op_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:743:0 +// src/engine/editor.h:755:0 link_internal counted_string ToStringPrefixless(world_update_op_shape_type Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 715f641a2..4952105f8 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:702:0 +// src/engine/editor.h:710:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index fb4009343..59ac06eee 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -1,6 +1,10 @@ uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; + uniform int BrushType; +uniform int BlendMode; +uniform int ColorMode; +uniform int Modifiers; // // Clipping params @@ -50,12 +54,8 @@ void main() v3 Basis = Offset + WorldspaceBasis + xyz; - // - // -- user code -- - // { - - /* NoiseValue += white_noise(Basis)*100.f; */ + f32 NoiseSample = 0.f; switch (BrushType) { case 4: // WorldEdit_BrushType_Layered @@ -68,15 +68,7 @@ void main() for (s32 Octave = 1; Octave <= Octaves; ++Octave) { v3 xyz = Basis / (Period/Octave); - f32 gn = max(0.f, value_noise_derivs(xyz+warp+10.f).x) * (Amplitude/Octave); - - if (NoiseValue < 0.f && gn+NoiseValue > 0.f) - { - ColorValue = RGBColor; - } - - NoiseValue = NoiseValue + gn; - + NoiseSample = value_noise_derivs(xyz+warp+10.f).x * (Amplitude/Octave); } break; @@ -84,12 +76,49 @@ void main() default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; } + + /* WorldEdit_ValueModifier_Surface = (1<<0), */ + /* WorldEdit_ValueModifier_ClampPos = (1<<1), */ + /* WorldEdit_ValueModifier_ClampNeg = (1<<2), */ + /* WorldEdit_ColorModifier_ColorDiscard = (1<<3), */ + + if ( (Modifiers & (1<<0)) > 0) // WorldEdit_ValueModifier_Surface + { + // TODO(Jesse): Check if it's a surface voxel here + } + + if ( (Modifiers & (1<<1)) > 0) // WorldEdit_ValueModifier_ClampPos + { + NoiseSample = max(0.f, NoiseSample); + } + + if ( (Modifiers & (1<<2)) > 0) // WorldEdit_ValueModifier_ClampNeg + { + NoiseSample = min(0.f, NoiseSample); + } + + + switch (BlendMode) + { + case 0: // Addative + { NoiseValue = NoiseValue + NoiseSample; } break; + + case 1: // Subtractive + { NoiseValue = NoiseValue - NoiseSample; } break; + } + + switch (ColorMode) + { + case 0: // Addative + { if (NoiseSample > 0.f) { ColorValue = ColorValue + RGBColor; } } break; + + case 1: // Subtractive + { if (NoiseSample < 0.f) { ColorValue = ColorValue - RGBColor; } } break; + } + } } - // - // -- end user code -- - // Output.rgb = ColorValue; Output.a = NoiseValue; diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index f09757ae5..4efc483fb 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1239,6 +1239,7 @@ DoSettingsForBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thum // TODO(Jesse): do enum selector for Mode/Modifier/iterations DoEditorUi(Ui, Window, &Settings->Mode, CSz("Mode")); DoEditorUi(Ui, Window, &Settings->Modifier, CSz("Modifier")); + DoEditorUi(Ui, Window, &Settings->ColorMode, CSz("ColorMode")); if (Settings->Modifier == WorldEdit_ValueModifier_Surface) // || Settings->Modifier == WorldEdit_Modifier_Flood) { DoEditorUi(Ui, Window, &Settings->Iterations, CSz("Iterations")); diff --git a/src/engine/editor.h b/src/engine/editor.h index 1ffecce12..2fd23034e 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -615,7 +615,6 @@ enum world_edit_brush_type WorldEdit_BrushType_Layered, }; -// TODO(Jesse): Rename to .. something something behavior ? enum world_edit_blend_mode { WorldEdit_Mode_Additive, @@ -624,6 +623,14 @@ enum world_edit_blend_mode WorldEdit_Mode_Disabled, // Useful for turning the layer off }; +enum world_edit_color_blend_mode +{ + WorldEdit_ColorBlendMode_Additive, + WorldEdit_ColorBlendMode_Subtractive, + + WorldEdit_ColorBlendMode_Disabled, // Useful for turning the layer off +}; + enum world_edit_blend_mode_modifier poof(@bitfield) { WorldEdit_Modifier_Default = 0, @@ -690,6 +697,7 @@ struct voronoi_noise_params r32 MaskChance; }; + poof(string_and_value_tables(world_edit_blend_mode_modifier)) #include @@ -709,12 +717,16 @@ poof(do_editor_ui_for_radio_enum(asset_window_view_mode)) poof(string_and_value_tables(world_edit_blend_mode)) #include -/* poof(radio_button_group_for_bitfield_enum(world_edit_blend_mode)); */ -/* #include */ poof(do_editor_ui_for_radio_enum(world_edit_blend_mode)) #include +poof(string_and_value_tables(world_edit_color_blend_mode)) +#include +poof(do_editor_ui_for_enum(world_edit_color_blend_mode)) +#include + + poof(do_editor_ui_for_radio_enum(world_edit_tool)) #include @@ -892,6 +904,7 @@ struct brush_settings poof(@version(3)) // world_edit_blend_mode Mode; world_edit_blend_mode_modifier Modifier; + world_edit_color_blend_mode ColorMode; s32 Iterations = 1; // NOTE(Jesse): How many times to do the filter. // NOTE(Jesse): This is the relative offset from the base selection. diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index cb7761d87..a8998b733 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -339,8 +339,15 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 0); brush_layer *Layer = Brush->Layers + LayerIndex; - v3 RGBColor = HSVtoRGB(Layer->Settings.HSVColor); - BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); + + { + v3 RGBColor = HSVtoRGB(Layer->Settings.HSVColor); + BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); + } + + BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.Mode); + BindUniformByName(&WorldEditRC->Program, "Modifiers", Layer->Settings.Modifier); + BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); switch (Layer->Settings.Type) { diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 0d8d5734c..112d3b3e6 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3737,7 +3737,6 @@ WorkQueueEntryUpdateWorldRegion(world_edit_blend_mode Mode, *Shape, Mode, Modifier, - /* SimFloodOrigin, */ }, RGBColor, {}, From 605e248fd2037e30ed606f5b7c2d306828698911 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 14 Feb 2025 11:41:48 -0700 Subject: [PATCH 165/421] Surface nominally working; add more color blending modes --- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_layered_brush_0.h | 2 +- generated/default_marshal_layered_brush_1.h | 2 +- generated/default_marshal_layered_brush_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...or_ui_for_compound_type_world_edit_brush.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 47 ++++++++++++- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 23 +++++-- ..._value_tables_world_update_op_shape_type.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- shaders/terrain/world_edit.fragmentshader | 66 ++++++++++++++++--- src/engine/editor.h | 7 ++ 27 files changed, 151 insertions(+), 38 deletions(-) diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 7f4f5b928..39d2af15b 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:950:0 +// src/engine/editor.h:957:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 01011c54a..b78650fc0 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:687:0 +// src/engine/editor.h:694:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index 5893852f3..dccf0cd9b 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1184:0 +// src/engine/editor.h:1191:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 77d14e146..3cfcf0d4b 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1186:0 +// src/engine/editor.h:1193:0 diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 6b4d3ed3e..fabf75d06 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1015:0 +// src/engine/editor.h:1022:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index bc5664343..692b285bd 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1008:0 +// src/engine/editor.h:1015:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index 720c1ca78..662aa5210 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1001:0 +// src/engine/editor.h:1008:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_layered_brush_0.h b/generated/default_marshal_layered_brush_0.h index fc470ccbf..1a204f9b9 100644 --- a/generated/default_marshal_layered_brush_0.h +++ b/generated/default_marshal_layered_brush_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1113:0 +// src/engine/editor.h:1120:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_layered_brush_1.h b/generated/default_marshal_layered_brush_1.h index 4a601944d..8936c332f 100644 --- a/generated/default_marshal_layered_brush_1.h +++ b/generated/default_marshal_layered_brush_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1106:0 +// src/engine/editor.h:1113:0 RangeIterator(Index, (256)) { diff --git a/generated/default_marshal_layered_brush_2.h b/generated/default_marshal_layered_brush_2.h index 0ed94b4f2..ec96605e0 100644 --- a/generated/default_marshal_layered_brush_2.h +++ b/generated/default_marshal_layered_brush_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1099:0 +// src/engine/editor.h:1106:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 30c8b851d..96c652a35 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:878:0 +// src/engine/editor.h:885:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_world_edit_brush.h index 7066c0b32..58f354b67 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:815:0 +// src/engine/editor.h:822:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index e985db6e5..55d22f8df 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:715:0 +// src/engine/editor.h:722:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index e4f2dbc49..e99a4c055 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:892:0 +// src/engine/editor.h:899:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 960f219d9..c1fa8b6c1 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:721:0 +// src/engine/editor.h:728:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 973061355..38f849f48 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:704:0 +// src/engine/editor.h:711:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index b03d20919..c89d5466f 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:733:0 +// src/engine/editor.h:740:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 922142fd7..266b8adc0 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:726:0 +// src/engine/editor.h:733:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) @@ -11,6 +11,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode * { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("ThresholdPositive"), UiId(Window, "enum WorldEdit_ColorBlendMode_ThresholdPositive", Element), Params)) + { + *Element = WorldEdit_ColorBlendMode_ThresholdPositive; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("ThresholdNegative"), UiId(Window, "enum WorldEdit_ColorBlendMode_ThresholdNegative", Element), Params)) + { + *Element = WorldEdit_ColorBlendMode_ThresholdNegative; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Additive"), UiId(Window, "enum WorldEdit_ColorBlendMode_Additive", Element), Params)) { *Element = WorldEdit_ColorBlendMode_Additive; @@ -25,6 +43,33 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode * *Element = WorldEdit_ColorBlendMode_Subtractive; + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Multiply"), UiId(Window, "enum WorldEdit_ColorBlendMode_Multiply", Element), Params)) + { + *Element = WorldEdit_ColorBlendMode_Multiply; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Divide"), UiId(Window, "enum WorldEdit_ColorBlendMode_Divide", Element), Params)) + { + *Element = WorldEdit_ColorBlendMode_Divide; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Average"), UiId(Window, "enum WorldEdit_ColorBlendMode_Average", Element), Params)) + { + *Element = WorldEdit_ColorBlendMode_Average; + + SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 02279cc68..289b37f5f 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:730:0 +// src/engine/editor.h:737:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 90d82864b..335b51fe5 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:842:0 +// src/engine/editor.h:849:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 7842dcdaa..76ac064d6 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:718:0 +// src/engine/editor.h:725:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 896f61093..60e95910e 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:701:0 +// src/engine/editor.h:708:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 6ffe791f2..8c1cc82d3 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:724:0 +// src/engine/editor.h:731:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) @@ -6,8 +6,13 @@ ToStringPrefixless(world_edit_color_blend_mode Type) counted_string Result = {}; switch (Type) { - case WorldEdit_ColorBlendMode_Additive: { Result = CSz("Additive"); } break; + case WorldEdit_ColorBlendMode_ThresholdPositive: { Result = CSz("ThresholdPositive"); } break; + case WorldEdit_ColorBlendMode_ThresholdNegative: { Result = CSz("ThresholdNegative"); } break; + case WorldEdit_ColorBlendMode_Additive: { Result = CSz("Additive"); } break; case WorldEdit_ColorBlendMode_Subtractive: { Result = CSz("Subtractive"); } break; + case WorldEdit_ColorBlendMode_Multiply: { Result = CSz("Multiply"); } break; + case WorldEdit_ColorBlendMode_Divide: { Result = CSz("Divide"); } break; + case WorldEdit_ColorBlendMode_Average: { Result = CSz("Average"); } break; case WorldEdit_ColorBlendMode_Disabled: { Result = CSz("Disabled"); } break; @@ -22,8 +27,13 @@ ToString(world_edit_color_blend_mode Type) counted_string Result = {}; switch (Type) { - case WorldEdit_ColorBlendMode_Additive: { Result = CSz("WorldEdit_ColorBlendMode_Additive"); } break; + case WorldEdit_ColorBlendMode_ThresholdPositive: { Result = CSz("WorldEdit_ColorBlendMode_ThresholdPositive"); } break; + case WorldEdit_ColorBlendMode_ThresholdNegative: { Result = CSz("WorldEdit_ColorBlendMode_ThresholdNegative"); } break; + case WorldEdit_ColorBlendMode_Additive: { Result = CSz("WorldEdit_ColorBlendMode_Additive"); } break; case WorldEdit_ColorBlendMode_Subtractive: { Result = CSz("WorldEdit_ColorBlendMode_Subtractive"); } break; + case WorldEdit_ColorBlendMode_Multiply: { Result = CSz("WorldEdit_ColorBlendMode_Multiply"); } break; + case WorldEdit_ColorBlendMode_Divide: { Result = CSz("WorldEdit_ColorBlendMode_Divide"); } break; + case WorldEdit_ColorBlendMode_Average: { Result = CSz("WorldEdit_ColorBlendMode_Average"); } break; case WorldEdit_ColorBlendMode_Disabled: { Result = CSz("WorldEdit_ColorBlendMode_Disabled"); } break; @@ -37,8 +47,13 @@ WorldEditColorBlendMode(counted_string S) { world_edit_color_blend_mode Result = {}; - if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Additive"))) { return WorldEdit_ColorBlendMode_Additive; } + if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_ThresholdPositive"))) { return WorldEdit_ColorBlendMode_ThresholdPositive; } + if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_ThresholdNegative"))) { return WorldEdit_ColorBlendMode_ThresholdNegative; } + if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Additive"))) { return WorldEdit_ColorBlendMode_Additive; } if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Subtractive"))) { return WorldEdit_ColorBlendMode_Subtractive; } + if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Multiply"))) { return WorldEdit_ColorBlendMode_Multiply; } + if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Divide"))) { return WorldEdit_ColorBlendMode_Divide; } + if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Average"))) { return WorldEdit_ColorBlendMode_Average; } if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Disabled"))) { return WorldEdit_ColorBlendMode_Disabled; } return Result; diff --git a/generated/string_and_value_tables_world_update_op_shape_type.h b/generated/string_and_value_tables_world_update_op_shape_type.h index 40fe574b1..3ad5039ab 100644 --- a/generated/string_and_value_tables_world_update_op_shape_type.h +++ b/generated/string_and_value_tables_world_update_op_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:755:0 +// src/engine/editor.h:762:0 link_internal counted_string ToStringPrefixless(world_update_op_shape_type Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 4952105f8..c0ddb23e5 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:710:0 +// src/engine/editor.h:717:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 59ac06eee..12015d6cf 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -55,6 +55,7 @@ void main() { + v3 ColorSample = RGBColor; f32 NoiseSample = 0.f; switch (BrushType) { @@ -77,14 +78,42 @@ void main() default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; } - /* WorldEdit_ValueModifier_Surface = (1<<0), */ - /* WorldEdit_ValueModifier_ClampPos = (1<<1), */ - /* WorldEdit_ValueModifier_ClampNeg = (1<<2), */ - /* WorldEdit_ColorModifier_ColorDiscard = (1<<3), */ - + // TODO(Jesse): This is buggy; it generates extra geometry on the edges + // of chunks for some reason. At the moment it's a non-issue because the + // additional geometry is always below the ground, and doesn't cause + // visible artifacts. At the moment I just want anything 'working', but + // this should definitely be improved in the future. + // if ( (Modifiers & (1<<0)) > 0) // WorldEdit_ValueModifier_Surface { - // TODO(Jesse): Check if it's a surface voxel here + if (x > 0 && x < 65 && + y > 0 && y < 65 && + z > 0 && z < 65) + { + f32 ThisCell = sign(TexLookup.a); + if (ThisCell < 0.f) + { + // only consider cells that are air + s32 IsSurface = s32(ThisCell < sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(1, 0), 0).a)); + IsSurface |= s32(ThisCell < sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(1, 0), 0).a)); + + IsSurface |= s32(ThisCell < sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 1), 0).a)); + IsSurface |= s32(ThisCell < sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 1), 0).a)); + + IsSurface |= s32(ThisCell < sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 66), 0).a)); + IsSurface |= s32(ThisCell < sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 66), 0).a)); + + if (IsSurface == 0) { NoiseSample = 0.f; ColorSample = V3(0,0,0); } + } + else + { + NoiseSample = 0.f; ColorSample = V3(0,0,0); + } + } + else + { + NoiseSample = 0.f; ColorSample = V3(0,0,0); + } } if ( (Modifiers & (1<<1)) > 0) // WorldEdit_ValueModifier_ClampPos @@ -107,13 +136,30 @@ void main() { NoiseValue = NoiseValue - NoiseSample; } break; } + switch (ColorMode) { - case 0: // Addative - { if (NoiseSample > 0.f) { ColorValue = ColorValue + RGBColor; } } break; + case 0: // ThresholdPositive + { if (NoiseSample > 0.f) { ColorValue = ColorSample; } } break; - case 1: // Subtractive - { if (NoiseSample < 0.f) { ColorValue = ColorValue - RGBColor; } } break; + case 1: // ThresholdNegative + { if (NoiseSample < 0.f) { ColorValue = ColorSample; } } break; + + case 2: // Addative + { ColorValue = ColorValue + ColorSample; } break; + + case 3: // Subtractive + { ColorValue = ColorValue - ColorSample; } break; + + case 4: // Multiply + { ColorValue = ColorValue - ColorSample; } break; + + case 5: // Divide + { ColorValue = ColorValue - ColorSample; } break; + + case 6: // Average + { f32 StartingIntensity = length(ColorValue); + ColorValue = (ColorValue + ColorSample)/StartingIntensity; } break; } } diff --git a/src/engine/editor.h b/src/engine/editor.h index 2fd23034e..65018bfe9 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -625,8 +625,15 @@ enum world_edit_blend_mode enum world_edit_color_blend_mode { + WorldEdit_ColorBlendMode_ThresholdPositive, + WorldEdit_ColorBlendMode_ThresholdNegative, + WorldEdit_ColorBlendMode_Additive, WorldEdit_ColorBlendMode_Subtractive, + WorldEdit_ColorBlendMode_Multiply, + WorldEdit_ColorBlendMode_Divide, + + WorldEdit_ColorBlendMode_Average, WorldEdit_ColorBlendMode_Disabled, // Useful for turning the layer off }; From 39509b784d012f73335b1840a9d7b5eaca1361b6 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 14 Feb 2025 12:13:33 -0700 Subject: [PATCH 166/421] Apply edits at all LoDs --- generated/are_equal_octree_node.h | 2 +- .../block_array_octree_node_ptr_688853862.h | 2 +- ...block_array_picked_octree_node_688853862.h | 2 +- generated/buffer_octree_node_ptr.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 13 ++++++++ generated/freelist_allocator_octree_node.h | 2 +- generated/freelist_allocator_world_chunk.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/editor.cpp | 12 ++----- src/engine/render_loop.cpp | 1 + src/engine/world.cpp | 33 ++++++++++++++----- src/engine/world.h | 1 + src/engine/world_chunk.cpp | 2 ++ 17 files changed, 55 insertions(+), 29 deletions(-) diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index 8702cd364..a01b374ee 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:46:0 +// src/engine/world.h:47:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 88c36617b..f4ce972e8 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:60:0 +// src/engine/world.h:61:0 diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 5ff71964f..2c6230d1e 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:63:0 +// src/engine/world.h:64:0 diff --git a/generated/buffer_octree_node_ptr.h b/generated/buffer_octree_node_ptr.h index d9d82a920..8da1f9900 100644 --- a/generated/buffer_octree_node_ptr.h +++ b/generated/buffer_octree_node_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world.h:37:0 +// src/engine/world.h:38:0 struct octree_node_ptr_buffer { diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 966cbaeea..364a9fa2c 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -52,6 +52,19 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Dirty), + CSz("Dirty"), + &DefaultUiRenderParams_Checkbox + ); + + + + + PushNewRow(Ui); DoEditorUi(Ui, diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index 98c59bf04..d8b6017f7 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:51:0 +// src/engine/world.h:52:0 struct octree_node_freelist { diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h index 6047332b2..52552c609 100644 --- a/generated/freelist_allocator_world_chunk.h +++ b/generated/freelist_allocator_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/world.h:54:0 +// src/engine/world.h:55:0 struct world_chunk_freelist { diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index 4c0d1351e..fb6e89c11 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:57:0 +// src/engine/world.h:58:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index f7ebc0ad7..91b1db74c 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:48:0 +// src/engine/world.h:49:0 struct octree_node_ptr_stack { diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 97074c2ba..c92b53f43 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3060:0 +// src/engine/world_chunk.cpp:3062:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 3b0e8869f..41e61f2f4 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2074:0 +// src/engine/world_chunk.cpp:2076:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index dcf8c4900..178233be3 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2077:0 +// src/engine/world_chunk.cpp:2079:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 4efc483fb..e50681383 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2299,7 +2299,7 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo // Need to reinitialize chunks that no longer have the edit so that it // doesn't stay intact in chunks that lose it entirely - ForceOctreeNodeReinitialization(Engine, Node); + Node->Dirty = True;; ReleaseFutex(&Node->Lock); } } @@ -2336,15 +2336,9 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo Push(&Node->Edits, &Edit); - Assert(Node->Type == OctreeNodeType_Leaf); + /* Assert(Node->Type == OctreeNodeType_Leaf); */ - // We need to call ForceOctreeNodeReinitialization on nodes that don't - // have a chunk because they could now contain geometry from the edit. - // And only call it on chunks that haven't already had it called (it asserts otherwise) - if (Node->Chunk == 0 || Node->Chunk->Flags) - { - ForceOctreeNodeReinitialization(Engine, Node); - } + Node->Dirty = True;; ReleaseFutex(&Node->Lock); } } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index a8998b733..563716e21 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -256,6 +256,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TIMED_NAMED_BLOCK(bonsai_render_command_initialize_noise_buffer); /* Command = 0; */ + AtomicIncrement(&Graphics->NoiseFinalizeJobsPending); bonsai_render_command_initialize_noise_buffer C = RC->bonsai_render_command_initialize_noise_buffer; diff --git a/src/engine/world.cpp b/src/engine/world.cpp index d240231a4..c500367d1 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -877,11 +877,9 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt DrawOctreeRecursive(Engine, Node->Children[7], MainDrawList, ShadowMapDrawList, Depth+1); } else - { - + { // Draw ourselves; the mesh composed of the children has a hole. if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) { - // Draw ourselves; the mesh composed of the children has a hole. if (Chunk) { if (ContainsCameraGhost(World, EntityTable, Node, GameCamera)) @@ -896,8 +894,17 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt if (HasGpuMesh(&Chunk->Mesh)) { - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); + if (Node->Dirty) + { + AcquireFutex(&Node->Lock); + ForceOctreeNodeReinitialization(Engine, Node); + ReleaseFutex(&Node->Lock); + } + else + { + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); + } } } } @@ -922,9 +929,17 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt if (HasGpuMesh(&Chunk->Mesh)) { - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); - /* Assert(Chunk->FilledCount); */ + if (Node->Dirty) + { + AcquireFutex(&Node->Lock); + ForceOctreeNodeReinitialization(Engine, Node); + ReleaseFutex(&Node->Lock); + } + else + { + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); + } } } } @@ -1127,13 +1142,13 @@ GatherOctreeNodesOverlapping_Recursive(world *World, octree_node *Current, rect3 rect3cp Box = GetBoundingBox(World, Current); if (Intersect(World, &Box, Region)) { + Push(Result, &Current); switch(Current->Type) { InvalidCase(OctreeNodeType_Undefined); case OctreeNodeType_Leaf: { - Push(Result, &Current); } break; case OctreeNodeType_Branch: diff --git a/src/engine/world.h b/src/engine/world.h index 524560159..80310b9dc 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -14,6 +14,7 @@ struct octree_node // TODO(Jesse): Pack into something else b32 HadNoVisibleSurface; + b32 Dirty; v3i WorldP; v3i Resolution; // in world-chunk space. Resolution of V3i(2) means the chunk occupies 2x2x2 chunks in world-space diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 112d3b3e6..161dcfbe0 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -465,6 +465,8 @@ ForceOctreeNodeReinitialization(engine_resources *Engine, octree_node *Node) Node->Chunk->WorldP = Node->WorldP; } } + + Node->Dirty = 0; } link_internal world_chunk* From 2f8b2f7e250a8cdec595a78349117b67c944679d Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 14 Feb 2025 14:24:04 -0700 Subject: [PATCH 167/421] Formatting --- examples/terrain_gen/game_constants.h | 4 ++-- generated/generate_stream_compact_v3i.h | 2 +- ...d_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h | 2 +- ...hunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/world.cpp | 5 +++-- src/engine/world_chunk.cpp | 3 ++- src/engine/world_chunk.h | 5 +---- 7 files changed, 11 insertions(+), 12 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index b4fec95ad..3cde4bfd3 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -16,12 +16,12 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ -/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ +g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ -g_VisibleRegion = Chunk_Dimension(16, 16, 16); +/* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ /* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index c92b53f43..4f73b169d 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3062:0 +// src/engine/world_chunk.cpp:3063:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 41e61f2f4..f37d8a78a 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2076:0 +// src/engine/world_chunk.cpp:2077:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 178233be3..bc3741cd0 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2079:0 +// src/engine/world_chunk.cpp:2080:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/src/engine/world.cpp b/src/engine/world.cpp index c500367d1..6d9c8becc 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -601,14 +601,15 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio } s32 IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, - Node->Resolution.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); + 2*Node->Resolution.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); + // Flip such that the larger a node was in world space, the higher it is in the priority list IdealListIndex = (OCTREE_PRIORITY_QUEUE_LIST_COUNT-1)-IdealListIndex; // Penalize nodes not in the frustum if (IsInFrustum(World, GameCamera, Node) == False) { - IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, IdealListIndex+5); + IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, IdealListIndex+15); } // Prefer chunks who have a higher chance of having geometry diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 161dcfbe0..09887fa7a 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -458,7 +458,8 @@ ForceOctreeNodeReinitialization(engine_resources *Engine, octree_node *Node) Node->HadNoVisibleSurface = False; if (Node->Chunk) { - if (Node->Chunk->Flags && (Node->Chunk->Flags & Chunk_Queued) == 0) + if ( Node->Chunk->Flags && + (Node->Chunk->Flags & Chunk_Queued) == 0) { DeallocateAndClearWorldChunk(Engine, Node->Chunk); Node->Chunk->DimInChunks = Node->Resolution; diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index e71132587..cf375d729 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -66,11 +66,8 @@ enum chunk_flag poof(@bitfield) Chunk_Queued = 1 << 0, Chunk_VoxelsInitialized = 1 << 1, - /* Chunk_MeshUploadedToGpu = 1 << 2, */ - /* Chunk_MeshDirty = 1 << 3, // Re-upload the */ - // This is an optimization to tell the thread queue to not initialize chunks - // we've already moved away from. + // This is an optimization to tell the thread queue to not initialize chunks we've already moved away from. Chunk_Garbage = 1 << 3, // Threads can set this to mark a chunk as ready to deallocate From b8229d155ae62542e6911232e3e74467bf2de8eb Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 14 Feb 2025 15:42:04 -0700 Subject: [PATCH 168/421] Shuffle some data around on the world_edit and related structs --- examples/terrain_gen/game_constants.h | 4 +- generated/are_equal_struct.h | 25 +++ generated/block_array_entity_ptr_688856411.h | 2 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- generated/default_marshal_layered_brush_0.h | 2 +- generated/default_marshal_layered_brush_1.h | 4 +- generated/default_marshal_layered_brush_2.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 67 +------ ...editor_ui_for_compound_type_level_editor.h | 49 +++-- ...editor_ui_for_radio_enum_world_edit_tool.h | 1 - generated/for_datatypes_0XxWqGSZ.h | 4 + generated/for_datatypes_fkubhsYl.h | 4 + generated/for_datatypes_kv3WBTai.h | 4 + generated/gen_constructor_voxel_lighting.h | 2 +- .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- ...e_string_table_world_chunk_mesh_bitfield.h | 2 +- ...rate_string_table_world_chunk_mesh_index.h | 2 +- generated/hashtable_struct.h | 181 ++++++++++++++++++ generated/maybe_chunk_data.h | 2 +- generated/maybe_standing_spot.h | 2 +- generated/serdes_dunion_struct.h | 3 + generated/serdes_primitive_592771169.h | 2 +- generated/serdes_struct_layered_brush.h | 70 +------ generated/serdes_struct_layered_brush_1.h | 4 +- generated/serdes_struct_struct.h | 135 +++++++++++++ generated/serdes_struct_world_edit.h | 118 ++++++++++++ generated/serdes_struct_world_edit_brush.h | 135 +++++++++++++ generated/serdes_struct_world_edit_shape.h | 4 + generated/serdes_world_edit_shape.h | 16 ++ .../string_and_value_tables_chunk_flag.h | 2 +- shaders/terrain/world_edit.fragmentshader | 8 +- src/engine/editor.cpp | 173 ++++++++--------- src/engine/editor.h | 126 +++++------- src/engine/render_loop.cpp | 142 ++++++-------- src/engine/serdes.cpp | 17 +- src/engine/serdes.h | 14 +- 42 files changed, 904 insertions(+), 440 deletions(-) create mode 100644 generated/are_equal_struct.h create mode 100644 generated/hashtable_struct.h create mode 100644 generated/serdes_dunion_struct.h create mode 100644 generated/serdes_struct_struct.h create mode 100644 generated/serdes_struct_world_edit.h create mode 100644 generated/serdes_struct_world_edit_brush.h create mode 100644 generated/serdes_struct_world_edit_shape.h create mode 100644 generated/serdes_world_edit_shape.h diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 3cde4bfd3..b4fec95ad 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -16,12 +16,12 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ -g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km +/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ -/* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ +g_VisibleRegion = Chunk_Dimension(16, 16, 16); /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ /* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h new file mode 100644 index 000000000..aad33857d --- /dev/null +++ b/generated/are_equal_struct.h @@ -0,0 +1,25 @@ +// src/engine/editor.h:1136:0 + +link_internal b32 +AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( world_edit_brush ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(world_edit_brush Thing1, world_edit_brush Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( world_edit_brush ) ); + + return Result; +} + diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h index d14017018..5c0377a1c 100644 --- a/generated/block_array_entity_ptr_688856411.h +++ b/generated/block_array_entity_ptr_688856411.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:308:0 +// src/engine/world_chunk.h:305:0 diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index 0a9905c2a..bfc0a070b 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:451:0 +// src/engine/world_chunk.h:448:0 diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index f21e47b21..41a228667 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:492:0 +// src/engine/world_chunk.h:489:0 diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index dccf0cd9b..746458fd4 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1191:0 +// src/engine/editor.h:1150:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 3cfcf0d4b..b378fe1c8 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1193:0 +// src/engine/editor.h:1152:0 diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 4c4febb16..9d1113997 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:519:0 +// src/engine/world_chunk.h:516:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index 606ea199b..6c6ee4bfe 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:448:0 +// src/engine/world_chunk.h:445:0 struct world_chunk_ptr_buffer { diff --git a/generated/default_marshal_layered_brush_0.h b/generated/default_marshal_layered_brush_0.h index 1a204f9b9..7c1bb9925 100644 --- a/generated/default_marshal_layered_brush_0.h +++ b/generated/default_marshal_layered_brush_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1120:0 +// src/engine/editor.h:1115:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/default_marshal_layered_brush_1.h b/generated/default_marshal_layered_brush_1.h index 8936c332f..38876154c 100644 --- a/generated/default_marshal_layered_brush_1.h +++ b/generated/default_marshal_layered_brush_1.h @@ -1,6 +1,6 @@ -// src/engine/editor.h:1113:0 +// src/engine/editor.h:1108:0 -RangeIterator(Index, (256)) +RangeIterator(Index, NameBuf_Len) { Live->NameBuf[Index] = Stored->NameBuf[Index]; diff --git a/generated/default_marshal_layered_brush_2.h b/generated/default_marshal_layered_brush_2.h index ec96605e0..3ac2da7c1 100644 --- a/generated/default_marshal_layered_brush_2.h +++ b/generated/default_marshal_layered_brush_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1106:0 +// src/engine/editor.h:1101:0 Live->LayerCount = Stored->LayerCount; diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 73f4d50a5..a6205b79b 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -26,25 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - if (ToggleButton(Ui, CSz("v NameBuf[(256) + 1]"), CSz("> NameBuf[(256) + 1]"), UiId(Window, "toggle layered_brush char NameBuf", Element->NameBuf), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, (256) + 1) - { - DoEditorUi(Ui, Window, Element->NameBuf+ArrayIndex, FSz("NameBuf[%d]", ArrayIndex), Params); - - PushNewRow(Ui); - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); - - - - PushNewRow(Ui); - - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->LayerCount), @@ -77,38 +59,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - if (ToggleButton(Ui, CSz("v LayerPreviews[16]"), CSz("> LayerPreviews[16]"), UiId(Window, "toggle layered_brush chunk_thumbnail LayerPreviews", Element->LayerPreviews), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 16) - { - DoEditorUi(Ui, Window, Element->LayerPreviews+ArrayIndex, FSz("LayerPreviews[%d]", ArrayIndex), Params); - - - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(chunk_thumbnail*, &Element->SeedLayer), - CSz("SeedLayer"), - Params - ); - - - - - - - - DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there @@ -163,21 +113,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na CSz("Modifier"), Params ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(chunk_thumbnail*, &Element->Preview), - CSz("Preview"), - Params - ); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index ce27ca872..f779cee49 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -71,21 +71,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit*, &Element->Brush), - CSz("Brush"), - Params - ); - - - - - - - - DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there @@ -267,6 +252,36 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam PushNewRow(Ui); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_block_array*, &Element->WorldEdits), + CSz("WorldEdits"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_brush_hashtable*, &Element->LoadedBrushes), + CSz("LoadedBrushes"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there @@ -285,8 +300,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_block_array*, &Element->WorldEdits), - CSz("WorldEdits"), + Cast(world_edit_brush*, Element->CurrentBrush), + CSz("CurrentBrush"), Params ); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 289b37f5f..dc2135bbb 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -20,7 +20,6 @@ RadioButtonGroup_world_edit_tool( renderer_2d *Ui, { { CSz("Disabled"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Disabled")), WorldEdit_Tool_Disabled }, { CSz("Select"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Select")), WorldEdit_Tool_Select }, - { CSz("Brush"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Brush")), WorldEdit_Tool_Brush }, { CSz("Eyedropper"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Eyedropper")), WorldEdit_Tool_Eyedropper }, { CSz("BlitEntity"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_BlitEntity")), WorldEdit_Tool_BlitEntity }, }; diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 70b597f5d..be354b76e 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -731,6 +731,10 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index af783c280..f46e34080 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -721,6 +721,10 @@ render_to_texture_async_params render_to_texture_async_params; + + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 62fa773b8..0a663432b 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -721,6 +721,10 @@ type_render_to_texture_async_params, + + + + diff --git a/generated/gen_constructor_voxel_lighting.h b/generated/gen_constructor_voxel_lighting.h index 714f441f9..f82f4a5de 100644 --- a/generated/gen_constructor_voxel_lighting.h +++ b/generated/gen_constructor_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:125:0 +// src/engine/world_chunk.h:122:0 link_internal voxel_lighting VoxelLighting( u8 Emission ) diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 01be67154..9ab495e5c 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:525:0 +// src/engine/world_chunk.h:522:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index 0a26f5da5..338e3511b 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:522:0 +// src/engine/world_chunk.h:519:0 struct standing_spot_stream_chunk { diff --git a/generated/generate_string_table_world_chunk_mesh_bitfield.h b/generated/generate_string_table_world_chunk_mesh_bitfield.h index b23965b5e..5264178d0 100644 --- a/generated/generate_string_table_world_chunk_mesh_bitfield.h +++ b/generated/generate_string_table_world_chunk_mesh_bitfield.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:217:0 +// src/engine/world_chunk.h:214:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_bitfield Type) diff --git a/generated/generate_string_table_world_chunk_mesh_index.h b/generated/generate_string_table_world_chunk_mesh_index.h index b907dba67..89fcbae72 100644 --- a/generated/generate_string_table_world_chunk_mesh_index.h +++ b/generated/generate_string_table_world_chunk_mesh_index.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:220:0 +// src/engine/world_chunk.h:217:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_index Type) diff --git a/generated/hashtable_struct.h b/generated/hashtable_struct.h new file mode 100644 index 000000000..b61246013 --- /dev/null +++ b/generated/hashtable_struct.h @@ -0,0 +1,181 @@ +// src/engine/editor.h:1139:0 + +struct world_edit_brush_linked_list_node +{ + b32 Tombstoned; + world_edit_brush Element; + world_edit_brush_linked_list_node *Next; +}; + +struct world_edit_brush_hashtable +{ + umm Size; + world_edit_brush_linked_list_node **Elements; + /* OWNED_BY_THREAD_MEMBER() */ +}; +link_internal b32 AreEqual(world_edit_brush_linked_list_node *Node1, world_edit_brush_linked_list_node *Node2 ); + +link_internal world_edit_brush_linked_list_node * +Allocate_world_edit_brush_linked_list_node(memory_arena *Memory) +{ + world_edit_brush_linked_list_node *Result = Allocate( world_edit_brush_linked_list_node, Memory, 1); + return Result; +} + +link_internal world_edit_brush_hashtable +Allocate_world_edit_brush_hashtable(umm ElementCount, memory_arena *Memory) +{ + world_edit_brush_hashtable Result = { + .Elements = Allocate( world_edit_brush_linked_list_node*, Memory, ElementCount), + .Size = ElementCount, + /* OWNED_BY_THREAD_MEMBER_INIT() */ + }; + return Result; +} + +link_internal world_edit_brush_linked_list_node * +GetHashBucket(umm HashValue, world_edit_brush_hashtable *Table) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + Assert(Table->Size); + world_edit_brush_linked_list_node *Result = Table->Elements[HashValue % Table->Size]; + return Result; +} + +link_internal world_edit_brush * +GetFirstAtBucket(umm HashValue, world_edit_brush_hashtable *Table) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + world_edit_brush_linked_list_node *Bucket = GetHashBucket(HashValue, Table); + world_edit_brush *Result = &Bucket->Element; + return Result; +} + +link_internal world_edit_brush_linked_list_node** +GetMatchingBucket(world_edit_brush Element, world_edit_brush_hashtable *Table, memory_arena *Memory) +{ + umm HashValue = Hash(&Element) % Table->Size; + world_edit_brush_linked_list_node **Bucket = Table->Elements + HashValue; + while (*Bucket) + { + if (AreEqual(&Bucket[0]->Element, &Element)) { break; } + Bucket = &(*Bucket)->Next; + } + return Bucket; +} + +link_internal world_edit_brush * +Insert(world_edit_brush_linked_list_node *Node, world_edit_brush_hashtable *Table) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + Assert(Table->Size); + umm HashValue = Hash(&Node->Element) % Table->Size; + world_edit_brush_linked_list_node **Bucket = Table->Elements + HashValue; + while (*Bucket) + { + /* Assert(!AreEqual(*Bucket, Node)); */ + Bucket = &(*Bucket)->Next; + } + *Bucket = Node; + return &Bucket[0]->Element; +} + +link_internal world_edit_brush* +Insert(world_edit_brush Element, world_edit_brush_hashtable *Table, memory_arena *Memory) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + world_edit_brush_linked_list_node *Bucket = Allocate_world_edit_brush_linked_list_node(Memory); + Bucket->Element = Element; + Insert(Bucket, Table); + return &Bucket->Element; +} + +link_internal world_edit_brush* +Upsert(world_edit_brush Element, world_edit_brush_hashtable *Table, memory_arena *Memory) +{ + umm HashValue = Hash(&Element) % Table->Size; + world_edit_brush_linked_list_node **Bucket = Table->Elements + HashValue; + while (*Bucket) + { + if (AreEqual(&Bucket[0]->Element, &Element)) { break; } + Bucket = &(*Bucket)->Next; + } + + if (*Bucket && Bucket[0]->Tombstoned == False) + { + Bucket[0]->Element = Element; + } + else + { + Insert(Element, Table, Memory); + } + + return &Bucket[0]->Element; +} + + +// +// Iterator impl. +// + +struct world_edit_brush_hashtable_iterator +{ + umm HashIndex; + world_edit_brush_hashtable *Table; + world_edit_brush_linked_list_node *Node; +}; + +link_internal world_edit_brush_hashtable_iterator +operator++( world_edit_brush_hashtable_iterator &Iterator ) +{ + if (Iterator.Node) + { + Iterator.Node = Iterator.Node->Next; + } + else + { + Assert (Iterator.HashIndex < Iterator.Table->Size ); + Iterator.Node = Iterator.Table->Elements[++Iterator.HashIndex]; + } + + return Iterator; +} + +link_internal b32 +operator<( world_edit_brush_hashtable_iterator I0, world_edit_brush_hashtable_iterator I1) +{ + b32 Result = I0.HashIndex < I1.HashIndex; + return Result; +} + +link_inline world_edit_brush_hashtable_iterator +ZerothIndex(world_edit_brush_hashtable *Hashtable) +{ + world_edit_brush_hashtable_iterator Iterator = {}; + Iterator.Table = Hashtable; + Iterator.Node = Hashtable->Elements[0]; + return Iterator; +} + +link_inline world_edit_brush_hashtable_iterator +AtElements(world_edit_brush_hashtable *Hashtable) +{ + world_edit_brush_hashtable_iterator Result = { Hashtable->Size, 0, 0 }; + return Result; +} + +link_inline world_edit_brush * +GetPtr(world_edit_brush_hashtable *Hashtable, world_edit_brush_hashtable_iterator Iterator) +{ + world_edit_brush *Result = {}; + if (Iterator.Node) + { + Result = &Iterator.Node->Element; + } + return Result; +} + diff --git a/generated/maybe_chunk_data.h b/generated/maybe_chunk_data.h index 61fe27efe..e470bac98 100644 --- a/generated/maybe_chunk_data.h +++ b/generated/maybe_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:181:0 +// src/engine/world_chunk.h:178:0 struct maybe_chunk_data { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index d9aa4c4df..a9bb56d59 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:489:0 +// src/engine/world_chunk.h:486:0 struct maybe_standing_spot { diff --git a/generated/serdes_dunion_struct.h b/generated/serdes_dunion_struct.h new file mode 100644 index 000000000..325bf0048 --- /dev/null +++ b/generated/serdes_dunion_struct.h @@ -0,0 +1,3 @@ +// src/engine/serdes.cpp:569:0 + + diff --git a/generated/serdes_primitive_592771169.h b/generated/serdes_primitive_592771169.h index b19cab56e..f05719caa 100644 --- a/generated/serdes_primitive_592771169.h +++ b/generated/serdes_primitive_592771169.h @@ -1,4 +1,4 @@ -// src/engine/serdes.h:503:0 +// src/engine/serdes.h:515:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, u8 *Element, umm Count = 1) diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index ca73faea0..195139ad0 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:575:0 +// src/engine/serdes.cpp:572:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) @@ -6,7 +6,7 @@ TypeInfo(layered_brush *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("layered_brush"); - Result.Version = 3 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -29,10 +29,7 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush *BaseElement, umm Count = b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber = 3; - Serialize(Bytes, &VersionNumber); - + RangeIterator_t(umm, ElementIndex, Count) { @@ -76,11 +73,6 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush *BaseElement, umm Count = Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum - - - - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -96,40 +88,6 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena *Memory); -link_internal b32 -DeserializeVersioned(u8_cursor *Bytes, layered_brush *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) -{ - Assert(TypeInfo->Version <= 3); - - b32 Result = True; - - if (TypeInfo->Version == 0) - { - layered_brush_0 T0 = {}; - Result &= Deserialize(Bytes, &T0, Memory); - Marshal(&T0, Element); - } - if (TypeInfo->Version == 1) - { - layered_brush_1 T1 = {}; - Result &= Deserialize(Bytes, &T1, Memory); - Marshal(&T1, Element); - } - if (TypeInfo->Version == 2) - { - layered_brush_2 T2 = {}; - Result &= Deserialize(Bytes, &T2, Memory); - Marshal(&T2, Element); - } - - - if (TypeInfo->Version == 3) - { - Result &= DeserializeCurrentVersion(Bytes, Element, Memory); - } - - return Result; -} link_internal b32 @@ -178,11 +136,6 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena Element->Modifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); - - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); @@ -197,22 +150,7 @@ Deserialize(u8_cursor *Bytes, layered_brush *Element, memory_arena *Memory, umm b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("layered_brush")); - - if (MaybeSerializedType.Tag) - { - u64 OldIgnoredVersionNumber; - if (MaybeSerializedType.Value.Version > 0) - { - Deserialize(Bytes, &OldIgnoredVersionNumber, Memory); - } - Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &MaybeSerializedType.Value, Memory); - } - else - { - bonsai_type_info T0TypeInfo = {}; - Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &T0TypeInfo, Memory); - } + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_layered_brush_1.h b/generated/serdes_struct_layered_brush_1.h index 2416f478d..05d6b5292 100644 --- a/generated/serdes_struct_layered_brush_1.h +++ b/generated/serdes_struct_layered_brush_1.h @@ -35,7 +35,7 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush_1 *BaseElement, umm Count { layered_brush_1 *Element = BaseElement + ElementIndex; { - umm ThisCount = (256); + umm ThisCount = NameBuf_Len; Result &= Serialize(Bytes, Element->NameBuf, ThisCount); } @@ -100,7 +100,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_1 *Element, memory_are { b32 Result = True; { - umm Count = (256); + umm Count = NameBuf_Len; Result &= Deserialize(Bytes, Element->NameBuf, Memory, Count); } diff --git a/generated/serdes_struct_struct.h b/generated/serdes_struct_struct.h new file mode 100644 index 000000000..d5571fce8 --- /dev/null +++ b/generated/serdes_struct_struct.h @@ -0,0 +1,135 @@ +// src/engine/serdes.cpp:572:0 + +link_internal bonsai_type_info +TypeInfo(world_edit_brush *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("world_edit_brush"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_edit_brush *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + world_edit_brush *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->Shape); // default + + + + + + + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum + + + + + Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum + + + + + Result &= Serialize(Bytes, &Element->Ordinal); // default + + + + + + + Result &= Serialize(Bytes, &Element->Layered); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Shape, Memory); + + + + + + Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); + + + + + Element->Modifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Ordinal, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Layered, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h new file mode 100644 index 000000000..b256fa778 --- /dev/null +++ b/generated/serdes_struct_world_edit.h @@ -0,0 +1,118 @@ +// src/engine/serdes.cpp:578:0 + +link_internal bonsai_type_info +TypeInfo(world_edit *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("world_edit"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_edit *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + world_edit *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->Region); // default + + + + + + + if (Element->Brush) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } + else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } + + if (Element->Brush) { Result &= Serialize(Bytes, Element->Brush); } + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_edit *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_edit *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_edit *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Region, Memory); + + + + + + b64 HadBrushPointer = Read_u64(Bytes); + Assert(HadBrushPointer < 2); // Should be 0 or 1 + + if (HadBrushPointer) + { + umm Count = 1; + + + if (Element->Brush == 0) + { + Element->Brush = Allocate(world_edit_brush, Memory, Count); + } + + Result &= Deserialize(Bytes, Element->Brush, Memory, Count); + } + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_edit *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h new file mode 100644 index 000000000..f8aa2c128 --- /dev/null +++ b/generated/serdes_struct_world_edit_brush.h @@ -0,0 +1,135 @@ +// src/engine/serdes.cpp:575:0 + +link_internal bonsai_type_info +TypeInfo(world_edit_brush *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("world_edit_brush"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_edit_brush *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + world_edit_brush *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->Shape); // default + + + + + + + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum + + + + + Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum + + + + + Result &= Serialize(Bytes, &Element->Ordinal); // default + + + + + + + Result &= Serialize(Bytes, &Element->Layered); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Shape, Memory); + + + + + + Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); + + + + + Element->Modifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Ordinal, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Layered, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serdes_struct_world_edit_shape.h b/generated/serdes_struct_world_edit_shape.h new file mode 100644 index 000000000..e6d7e2a73 --- /dev/null +++ b/generated/serdes_struct_world_edit_shape.h @@ -0,0 +1,4 @@ +// src/engine/serdes.cpp:569:0 + +serialize_dunionworld_edit_shape + diff --git a/generated/serdes_world_edit_shape.h b/generated/serdes_world_edit_shape.h new file mode 100644 index 000000000..7eba6384e --- /dev/null +++ b/generated/serdes_world_edit_shape.h @@ -0,0 +1,16 @@ +// src/engine/serdes.cpp:569:0 + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_edit_shape *BaseElement, umm Count = 1) +{ + NotImplemented; + return False; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_edit_shape *Element, memory_arena *Memory, umm Count = 1) +{ + NotImplemented; + return False; +} + diff --git a/generated/string_and_value_tables_chunk_flag.h b/generated/string_and_value_tables_chunk_flag.h index 34e486b59..958007ab9 100644 --- a/generated/string_and_value_tables_chunk_flag.h +++ b/generated/string_and_value_tables_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:83:0 +// src/engine/world_chunk.h:80:0 link_internal counted_string ToStringPrefixless(chunk_flag Type) diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 12015d6cf..fb266cdc9 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -57,9 +57,9 @@ void main() { v3 ColorSample = RGBColor; f32 NoiseSample = 0.f; - switch (BrushType) + /* switch (BrushType) */ { - case 4: // WorldEdit_BrushType_Layered + /* case 4: // WorldEdit_BrushType_Layered */ { s32 Octaves = 1; @@ -72,10 +72,10 @@ void main() NoiseSample = value_noise_derivs(xyz+warp+10.f).x * (Amplitude/Octave); } - break; + /* break; */ } - default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; + /* default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; */ } // TODO(Jesse): This is buggy; it generates extra geometry on the edges diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index e50681383..c21cceb73 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1173,7 +1173,7 @@ BrushSettingsForShapeBrush(engine_resources *Engine, window_layout *Window, shap } link_internal void -BrushSettingsForNoiseBrush(engine_resources *Engine, window_layout *Window, noise_layer *Layer, chunk_thumbnail *Preview) +BrushSettingsForNoiseBrush(engine_resources *Engine, window_layout *Window, noise_layer *Layer) { UNPACK_ENGINE_RESOURCES(Engine); @@ -1210,7 +1210,7 @@ BrushSettingsForNoiseBrush(engine_resources *Engine, window_layout *Window, nois } link_internal void -DoSettingsForBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *Preview, window_layout *Window) +DoSettingsForBrushLayer(engine_resources *Engine, brush_layer *Layer, window_layout *Window) { UNPACK_ENGINE_RESOURCES(Engine); @@ -1226,7 +1226,7 @@ DoSettingsForBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thum { case BrushLayerType_Noise: { - BrushSettingsForNoiseBrush(Engine, Window, &Settings->Noise, Preview); + BrushSettingsForNoiseBrush(Engine, Window, &Settings->Noise); } break; case BrushLayerType_Shape: @@ -1394,19 +1394,19 @@ GetFilenameForBrush(cs Name, s32 Version = 0) } link_internal void -SaveBrush(layered_brush *LayeredBrush, const char *FilenameZ) +SaveBrush(world_edit_brush *Brush, const char *FilenameZ) { u8_cursor_block_array OutputStream = BeginSerialization(); - Serialize(&OutputStream, LayeredBrush); + Serialize(&OutputStream, Brush); if (FinalizeSerialization(&OutputStream, FilenameZ) == False) { - SoftError("Unable to serialize brush (%s) to file (%s).", LayeredBrush->NameBuf, FilenameZ); + SoftError("Unable to serialize brush (%s) to file (%s).", Brush->NameBuf, FilenameZ); } else { - ZeroMemory(LayeredBrush->NameBuf, NameBuf_Len); - cs BrushNameBuf = CS(LayeredBrush->NameBuf, NameBuf_Len); + ZeroMemory(Brush->NameBuf, NameBuf_Len); + cs BrushNameBuf = CS(Brush->NameBuf, NameBuf_Len); cs BrushBasename = Basename(CS(FilenameZ)); CopyString(&BrushBasename, &BrushNameBuf); @@ -1415,44 +1415,43 @@ SaveBrush(layered_brush *LayeredBrush, const char *FilenameZ) link_internal void -NewBrush(layered_brush *LayeredBrush) +NewBrush(world_edit_brush *Brush) { - cs BrushNameBuf = CS(LayeredBrush->NameBuf, NameBuf_Len); - brush_layer *Layers = LayeredBrush->Layers; + cs BrushNameBuf = CS(Brush->NameBuf, NameBuf_Len); - ZeroMemory(LayeredBrush->NameBuf, NameBuf_Len); + ZeroMemory(Brush->NameBuf, NameBuf_Len); cs Src = CSz("_untitled.brush"); CopyString(&Src, &BrushNameBuf); - LayeredBrush->LayerCount = 1; + brush_layer *Layers = Brush->Layered.Layers; RangeIterator(LayerIndex, MAX_BRUSH_LAYERS) { brush_layer *Layer = Layers + LayerIndex; Layer->Settings = {}; } + Brush->Layered.LayerCount = 1; + // Initialize PrevSettings so we don't fire a changed event straight away.. - CheckSettingsChanged(LayeredBrush); + CheckSettingsChanged(&Brush->Layered); } link_internal void -BrushSettingsForLayeredBrush(engine_resources *Engine, layered_brush *LayeredBrush, window_layout *BrushSettingsWindow) +DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_layout *BrushSettingsWindow) { UNPACK_ENGINE_RESOURCES(Engine); - /* layered_brush *LayeredBrush = &Editor->LayeredBrush; */ - brush_layer *Layers = LayeredBrush->Layers; - chunk_thumbnail *Previews = LayeredBrush->LayerPreviews; - - cs BrushNameBuf = CS(LayeredBrush->NameBuf, NameBuf_Len); - + layered_brush *LayeredBrush = &Brush->Layered; +#if 1 + cs BrushNameBuf = CS(Brush->NameBuf, NameBuf_Len); b32 IsNewBrush = False; - if (LayeredBrush->NameBuf[0] == 0 && LayeredBrush->LayerCount == 0) + if (Brush->NameBuf[0] == 0 && Brush->Layered.LayerCount == 0) { - NewBrush(LayeredBrush); + NewBrush(Brush); IsNewBrush = True; } +#endif // // Brush toolbar buttons @@ -1466,13 +1465,13 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, layered_brush *LayeredBru { if (Button(Ui, CSz("Save"), UiId(BrushSettingsWindow, "brush save", 0u))) { - cs BrushFilepath = GetFilenameForBrush(CS(LayeredBrush->NameBuf)); - SaveBrush(LayeredBrush, BrushFilepath.Start); + cs BrushFilepath = GetFilenameForBrush(CS(Brush->NameBuf)); + SaveBrush(Brush, BrushFilepath.Start); } if (Button(Ui, CSz("Duplicate"), UiId(BrushSettingsWindow, "brush dup", 0u))) { - cs_buffer Pieces = Split( CS(LayeredBrush->NameBuf), '.', Tran); + cs_buffer Pieces = Split( CS(Brush->NameBuf), '.', Tran); if (Pieces.Count > 2) { @@ -1489,13 +1488,13 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, layered_brush *LayeredBru BrushFilepath = GetFilenameForBrush(BrushNameString, VersionNumber); } - SaveBrush(LayeredBrush, BrushFilepath.Start); + SaveBrush(Brush, BrushFilepath.Start); } } else { - cs BrushFilepath = GetFilenameForBrush(CS(LayeredBrush->NameBuf), 1); - SaveBrush(LayeredBrush, BrushFilepath.Start); + cs BrushFilepath = GetFilenameForBrush(CS(Brush->NameBuf), 1); + SaveBrush(Brush, BrushFilepath.Start); } } } @@ -1512,7 +1511,7 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, layered_brush *LayeredBru if (ClickedFileNode.Tag) { cs Filename = Concat(ClickedFileNode.Value.Dir, CSz("/"), ClickedFileNode.Value.Name, Tran); -#if 0 +#if 1 NotImplemented; #else Assert(Editor->Brush.Type == WorldEdit_BrushType_Layered); @@ -1527,7 +1526,7 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, layered_brush *LayeredBru // NOTE(Jesse): This has to happen after deserialization cause some // brushes got saved out with a name, which gets read back in.. - ZeroMemory(LayeredBrush->NameBuf, NameBuf_Len); + ZeroMemory(Brush->NameBuf, NameBuf_Len); CopyString(&ClickedFileNode.Value.Name, &BrushNameBuf); SetToggleButton(Ui, ImportToggleId, False); @@ -1537,7 +1536,7 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, layered_brush *LayeredBru { if (Button(Ui, CSz("New"), UiId(BrushSettingsWindow, "brush new", 0u))) { - NewBrush(LayeredBrush); + NewBrush(Brush); IsNewBrush = True; } @@ -1547,8 +1546,8 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, layered_brush *LayeredBru PushNewRow(Ui); { - ui_id TextBoxId = UiId(BrushSettingsWindow, "name_buf_textbox", LayeredBrush->NameBuf); - cs NameBuf = CS(LayeredBrush->NameBuf); + ui_id TextBoxId = UiId(BrushSettingsWindow, "name_buf_textbox", Brush->NameBuf); + cs NameBuf = CS(Brush->NameBuf); TextBox(Ui, CSz("BrushName"), NameBuf, NameBuf_Len, TextBoxId); PushNewRow(Ui); @@ -1585,10 +1584,11 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, layered_brush *LayeredBru b32 Delete = False; s32 EditLayerIndex = 0; PushTableStart(Ui); + + brush_layer *Layers = Brush->Layered.Layers; RangeIterator(LayerIndex, LayeredBrush->LayerCount) { brush_layer *Layer = Layers + LayerIndex; - chunk_thumbnail *Preview = Previews + LayerIndex; ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", Layer); if (ToggleButton(Ui, FSz("v Layer %d", LayerIndex), FSz("> Layer %d", LayerIndex), ToggleId)) @@ -1617,7 +1617,7 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, layered_brush *LayeredBru EditLayerIndex = LayerIndex; } - DoSettingsForBrushLayer(Engine, Layer, Preview, BrushSettingsWindow); + DoSettingsForBrushLayer(Engine, Layer, BrushSettingsWindow); } if (IsNewBrush && LayerIndex == 0) @@ -1869,8 +1869,9 @@ BrushSettingsForLayeredBrush(engine_resources *Engine, layered_brush *LayeredBru } } +#if 0 link_internal void -DoBrushSettingsWindow(engine_resources *Engine, world_edit_tool WorldEditTool, world_edit_brush_type WorldEditBrushType) +DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_tool WorldEditTool, world_edit_brush_type WorldEditBrushType) { UNPACK_ENGINE_RESOURCES(Engine); @@ -1895,26 +1896,28 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_tool WorldEditTool, w case WorldEdit_BrushType_Layered: { - BrushSettingsForLayeredBrush(Engine, &Engine->Editor.Brush.Layered, &Window); + DoWorldEditSettingsWindow(Engine, &Engine->Editor.Brush.Layered, &Window); } break; } } break; } } +#endif link_internal b32 CurrentToolIs(level_editor *Editor, world_edit_tool Tool, world_edit_brush_type BrushType) { b32 Result = False; - if (Editor->Tool == Tool) - { - Result = True; - if (Editor->Tool == WorldEdit_Tool_Brush) - { - Result = (Editor->Brush.Type == BrushType); - } - } + NotImplemented; + /* if (Editor->Tool == Tool) */ + /* { */ + /* Result = True; */ + /* if (Editor->Tool == WorldEdit_Tool_Brush) */ + /* { */ + /* Result = (Editor->Brush.Type == BrushType); */ + /* } */ + /* } */ return Result; } @@ -1947,6 +1950,7 @@ EditWorldSelection(engine_resources *Engine) Thickness = 0.20f; } +#if 0 if (CurrentToolIs(Editor, WorldEdit_Tool_Brush, WorldEdit_BrushType_Layered)) { layered_brush *Brush = &Editor->Brush.Layered; @@ -1971,6 +1975,7 @@ EditWorldSelection(engine_resources *Engine) } } } +#endif aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); { @@ -2091,6 +2096,7 @@ InputStateIsValidToApplyEdit(input *Input) return Result; } +#if 0 link_internal world_edit_blend_mode GetEditModeForSelectedTool(level_editor *Editor) { @@ -2119,6 +2125,7 @@ GetEditModeForSelectedTool(level_editor *Editor) return Result; } +#endif link_internal v3 ColorIndexToV3(u16 ColorIndex) @@ -2259,24 +2266,7 @@ CheckSettingsChanged(layered_brush *Brush) link_internal b32 CheckSettingsChanged(world_edit *Edit) { - b32 Result = False; - - switch (Edit->Type) - { - case WorldEdit_BrushType_Disabled: - case WorldEdit_BrushType_Single: - case WorldEdit_BrushType_Asset: - case WorldEdit_BrushType_Entity: - { - NotImplemented; - } break; - - case WorldEdit_BrushType_Layered: - { - Result = CheckSettingsChanged(&Edit->Layered); - } break; - } - + b32 Result = CheckSettingsChanged(&Edit->Brush->Layered); return Result; } @@ -2373,6 +2363,7 @@ DoWorldEditor(engine_resources *Engine) CurrentRef = WorldEditToolButtonGroup.UiRef; } +#if 0 if (Editor->Tool == WorldEdit_Tool_Brush) { Params.RelativePosition.Position = Position_RightOf; @@ -2380,6 +2371,7 @@ DoWorldEditor(engine_resources *Engine) WorldEditBrushTypeButtonGroup = DoEditorUi(Ui, &Window, &Editor->Brush.Type, CSz("Brush Type"), &Params, ToggleButtonGroupFlags_DrawVertical); CurrentRef = WorldEditBrushTypeButtonGroup.UiRef; } +#endif PushTableEnd(Ui); @@ -2406,7 +2398,7 @@ DoWorldEditor(engine_resources *Engine) switch (Editor->Tool) { case WorldEdit_Tool_Disabled: - case WorldEdit_Tool_Brush: + /* case WorldEdit_Tool_Brush: */ case WorldEdit_Tool_Eyedropper: case WorldEdit_Tool_BlitEntity: /* case WorldEdit_Tool_StandingSpots: */ @@ -2433,6 +2425,7 @@ DoWorldEditor(engine_resources *Engine) { case WorldEdit_Tool_Disabled: +#if 0 case WorldEdit_Tool_Brush: { switch (Editor->Brush.Type) @@ -2585,6 +2578,7 @@ DoWorldEditor(engine_resources *Engine) } } break; +#endif case WorldEdit_Tool_Select: { @@ -2704,7 +2698,7 @@ DoWorldEditor(engine_resources *Engine) // the Select tool is active, doesn't update any of the brush stuff, then // the preview gets drawn because we pop back to the Layered brush tool and // there's a frame of lag. - /* DoBrushSettingsWindow(Engine, Editor->Tool, Editor->Brush.Type); */ + /* DoWorldEditSettingsWindow(Engine, Editor->Tool, Editor->Brush.Type); */ IterateOver(&Editor->WorldEdits, Edit, EditIndex) { @@ -2738,7 +2732,7 @@ DoWorldEditor(engine_resources *Engine) world_edit E = {}; Editor->CurrentEdit = Push(&Editor->WorldEdits, &E); - Editor->CurrentEdit->Type = WorldEdit_BrushType_Layered; + Editor->CurrentEdit->Brush = Editor->CurrentBrush; } if (Editor->Selection.Clicks == 2) @@ -2774,31 +2768,31 @@ DoWorldEditor(engine_resources *Engine) } { - if (Editor->CurrentEdit) + if (Editor->CurrentEdit && Editor->CurrentEdit->Brush) { - switch (Editor->CurrentEdit->Type) - { - case WorldEdit_BrushType_Disabled: - case WorldEdit_BrushType_Single: - case WorldEdit_BrushType_Asset: - case WorldEdit_BrushType_Entity: { } break; + /* switch (Editor->CurrentEdit->Type) */ + /* { */ + /* case WorldEdit_BrushType_Disabled: */ + /* case WorldEdit_BrushType_Single: */ + /* case WorldEdit_BrushType_Asset: */ + /* case WorldEdit_BrushType_Entity: { } break; */ - case WorldEdit_BrushType_Layered: - { + /* case WorldEdit_BrushType_Layered: */ + /* { */ local_persist window_layout BrushSettingsWindow = WindowLayout("Brush Settings", WindowLayoutFlag_Align_Right); - BrushSettingsForLayeredBrush(Engine, &Editor->CurrentEdit->Layered, &BrushSettingsWindow); - } break; - } - } + DoWorldEditSettingsWindow(Engine, Editor->CurrentEdit->Brush, &BrushSettingsWindow); + /* } break; */ + /* } */ - // NOTE(Jesse): Must come after the settings window draws because the - // settings window detects and initializes new brushes - if (SelectionComplete(Editor->Selection.Clicks) && Editor->CurrentEdit) - { - b32 SettingsChanged = CheckSettingsChanged(Editor->CurrentEdit); - if (SettingsChanged || Editor->Selection.Changed) + // NOTE(Jesse): Must come after the settings window draws because the + // settings window detects and initializes new brushes + if (SelectionComplete(Editor->Selection.Clicks)) { - UpdateWorldEdit(Engine, Editor->CurrentEdit, Editor->Selection.Region, GetTranArena()); + b32 SettingsChanged = CheckSettingsChanged(Editor->CurrentEdit); + if (SettingsChanged || Editor->Selection.Changed) + { + UpdateWorldEdit(Engine, Editor->CurrentEdit, Editor->Selection.Region, GetTranArena()); + } } } @@ -2824,7 +2818,8 @@ DoWorldEditor(engine_resources *Engine) if (Engine->MousedOverVoxel.Tag) { - v3 HotVoxel = GetHotVoxelForEditMode(Engine, GetEditModeForSelectedTool(Editor) ); + /* v3 HotVoxel = GetHotVoxelForEditMode(Engine, GetEditModeForSelectedTool(Editor) ); */ + v3 HotVoxel = GetHotVoxelForEditMode(Engine, WorldEdit_Mode_Additive ); DEBUG_HighlightVoxel( Engine, HotVoxel, RGB_RED, 0.075f); } } @@ -2832,6 +2827,7 @@ DoWorldEditor(engine_resources *Engine) link_internal void DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Mesh, r32 DistanceSquared, v3 Basis, Quaternion Rotation, v3 Scale ); +#if 0 link_internal void DrawEditorPreview(engine_resources *Engine, shader *Shader) { @@ -2866,4 +2862,5 @@ DrawEditorPreview(engine_resources *Engine, shader *Shader) DrawLod(Engine, Shader, &Chunk->Mesh, 0.f, Basis, Quaternion(), V3(1.f)); } } +#endif diff --git a/src/engine/editor.h b/src/engine/editor.h index 65018bfe9..d91691647 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -600,7 +600,7 @@ enum world_edit_tool { WorldEdit_Tool_Disabled, // poof(@ui_skip) WorldEdit_Tool_Select, // world_edit_selection_mode - WorldEdit_Tool_Brush, // world_edit_brush_type + /* WorldEdit_Tool_Brush, // world_edit_brush_type */ WorldEdit_Tool_Eyedropper, WorldEdit_Tool_BlitEntity, /* WorldEdit_Tool_StandingSpots, // Recomputes standing spots for an area */ @@ -1032,24 +1032,19 @@ struct brush_layer -#define NameBuf_Len (256) // TODO(Jesse): Make this dynamic .. probably .. #define MAX_BRUSH_LAYERS 16 #define BRUSH_PREVIEW_TEXTURE_DIM 256 -struct layered_brush poof(@version(3)) +struct layered_brush { - // NOTE(Jesse): This is so we can just copy the name of the brush in here and - // not fuck around with allocating a single string when we load these in. - char NameBuf[NameBuf_Len+1]; poof(@no_serialize @ui_text_box) - // NOTE(Jesse): The layer previews have to be seperate from the brush_layer // because the deserialization code isn't smart enough to not stomp on the // texture handles when it marshals old types to the current one. s32 LayerCount; brush_layer Layers [MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount)) - chunk_thumbnail LayerPreviews[MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount) @no_serialize) - chunk_thumbnail SeedLayer; poof(@no_serialize) // NOTE(Jesse): Special layer that acts as the seed value + /* chunk_thumbnail LayerPreviews[MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount) @no_serialize) */ + /* chunk_thumbnail SeedLayer; poof(@no_serialize) // NOTE(Jesse): Special layer that acts as the seed value */ b8 SeedBrushWithSelection; b8 BrushFollowsCursor; @@ -1059,68 +1054,9 @@ struct layered_brush poof(@version(3)) world_edit_blend_mode_modifier Modifier; // NOTE(Jesse): This is actually just using the chunk .. should probably change it - chunk_thumbnail Preview; poof(@no_serialize) + /* chunk_thumbnail Preview; poof(@no_serialize) */ }; -struct layered_brush_2 -{ - // NOTE(Jesse): This is so we can just copy the name of the brush in here and - // not fuck around with allocating a single string when we load these in. - char NameBuf[NameBuf_Len+1]; poof(@no_serialize @ui_text_box) - - s32 LayerCount; - brush_layer Layers[MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount)) - - b8 SeedBrushWithSelection; - b8 BrushFollowsCursor; - - chunk_thumbnail Preview; poof(@no_serialize) -}; - - -struct layered_brush_1 -{ - char NameBuf[NameBuf_Len]; - - s32 LayerCount = 1; - brush_layer Layers[MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount)) - - b8 SeedBrushWithSelection; - b8 BrushFollowsCursor; - - chunk_thumbnail Preview; poof(@no_serialize) -}; - -struct layered_brush_0 -{ - s32 LayerCount = 1; - brush_layer Layers[MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount)) - - chunk_thumbnail Preview; poof(@no_serialize) - b8 SeedBrushWithSelection; poof(@no_serialize) -}; - -link_internal void -Marshal(layered_brush_2 *Stored, layered_brush *Live) -{ - poof(default_marshal(layered_brush_2)) -#include -} - -link_internal void -Marshal(layered_brush_1 *Stored, layered_brush *Live) -{ - poof(default_marshal(layered_brush_1)) -#include -} - -link_internal void -Marshal(layered_brush_0 *Stored, layered_brush *Live) -{ - poof(default_marshal(layered_brush_0)) -#include -} - @@ -1167,23 +1103,46 @@ struct selection_region -struct world_edit +struct world_edit_brush { - rect3cp Region; + // NOTE(Jesse): This is so we can just copy the name of the brush in here and + // not fuck around with allocating a single string when we load these in. +#define NameBuf_Len (256) + char NameBuf[NameBuf_Len+1]; poof(@no_serialize @ui_text_box) - world_edit_shape Shape; + world_edit_shape Shape; world_edit_blend_mode Mode; world_edit_blend_mode_modifier Modifier; u32 Ordinal; // monotonically increasing integer sourced from level_editor::NextEditOrdinal - world_edit_brush_type Type; - union - { - single_brush Single; - asset_brush Asset; + /* world_edit_brush_type Type; */ + /* union */ + /* { */ + /* single_brush Single; */ + /* asset_brush Asset; */ layered_brush Layered; - }; + /* }; */ +}; + +link_internal umm +Hash(world_edit_brush *Brush) +{ + umm Result = Hash(CS(Brush->NameBuf)); + return Result; +} + + +poof(are_equal(world_edit_brush)) +#include + +poof(hashtable(world_edit_brush)) +#include + +struct world_edit +{ + rect3cp Region; + world_edit_brush *Brush; }; typedef world_edit* world_edit_ptr; @@ -1201,8 +1160,6 @@ struct level_editor world_edit_tool Tool; world_edit_tool PreviousTool; // So we can 'pop' back to the last tool on select/eyedropper - world_edit Brush; - b8 SelectionFollowsCursor; b32 RootChunkNeedsNewMesh; @@ -1227,8 +1184,11 @@ struct level_editor b32 MaskSelection; u32 NextEditOrdinal; - world_edit *CurrentEdit; world_edit_block_array WorldEdits; + world_edit_brush_hashtable LoadedBrushes; + + world_edit *CurrentEdit; + world_edit_brush *CurrentBrush; }; @@ -1301,8 +1261,8 @@ ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *P link_internal v3i GetSmallestMinOffset(layered_brush *LayeredBrush, v3i *LargestLayerDim = 0); -link_internal void -DrawEditorPreview(engine_resources *Engine, shader *Shader); +/* link_internal void */ +/* DrawEditorPreview(engine_resources *Engine, shader *Shader); */ link_internal void ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowColorSwatch = True); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 563716e21..af1205504 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -310,105 +310,83 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) IterateOver(&Node->Edits, Edit, EditIndex) { - Edit->Type = WorldEdit_BrushType_Layered; - BindUniformByName(&WorldEditRC->Program, "BrushType", Edit->Type); + /* Edit->Type = WorldEdit_BrushType_Layered; */ + /* BindUniformByName(&WorldEditRC->Program, "BrushType", Edit->Type); */ + TIMED_NAMED_BLOCK(WorldEditDrawCall); - switch (Edit->Type) + layered_brush *Brush = &Edit->Brush->Layered; + RangeIterator(LayerIndex, Brush->LayerCount) { - case WorldEdit_BrushType_Disabled: - case WorldEdit_BrushType_Single: - case WorldEdit_BrushType_Asset: - case WorldEdit_BrushType_Entity: - { - NotImplemented; - - // NOTE(Jesse): Can't do this globally for each path because - // the layered brush updates the texture every time it does a layer.. - InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; - PingPongIndex = (PingPongIndex + 1) & 1; - } break; + GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[PingPongIndex].ID); - case WorldEdit_BrushType_Layered: - { - TIMED_NAMED_BLOCK(WorldEditDrawCall); + BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 0); - layered_brush *Brush = &Edit->Layered; - RangeIterator(LayerIndex, Brush->LayerCount) - { - GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[PingPongIndex].ID); + brush_layer *Layer = Brush->Layers + LayerIndex; - BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 0); + { + v3 RGBColor = HSVtoRGB(Layer->Settings.HSVColor); + BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); + } - brush_layer *Layer = Brush->Layers + LayerIndex; + BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.Mode); + BindUniformByName(&WorldEditRC->Program, "Modifiers", Layer->Settings.Modifier); + BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); - { - v3 RGBColor = HSVtoRGB(Layer->Settings.HSVColor); - BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); - } - - BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.Mode); - BindUniformByName(&WorldEditRC->Program, "Modifiers", Layer->Settings.Modifier); - BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); + switch (Layer->Settings.Type) + { + case BrushLayerType_Noise: + { + noise_layer *Noise = &Layer->Settings.Noise; - switch (Layer->Settings.Type) + switch (Noise->Type) { - case BrushLayerType_Noise: - { - noise_layer *Noise = &Layer->Settings.Noise; - - switch (Noise->Type) - { - case NoiseType_Perlin: - { - perlin_noise_params *Perlin = &Noise->Perlin; - BindUniformByName(&WorldEditRC->Program, "Threshold", Perlin->Threshold); - BindUniformByName(&WorldEditRC->Program, "Period", &Perlin->Period); - BindUniformByName(&WorldEditRC->Program, "Amplitude", Perlin->Amplitude); - } break; - - case NoiseType_Voronoi: - {} break; - - case NoiseType_White: - {} break; - } - - } break; - - case BrushLayerType_Shape: + case NoiseType_Perlin: { - /* shape_layer *Shape = &Layer->Shape; */ + perlin_noise_params *Perlin = &Noise->Perlin; + BindUniformByName(&WorldEditRC->Program, "Threshold", Perlin->Threshold); + BindUniformByName(&WorldEditRC->Program, "Period", &Perlin->Period); + BindUniformByName(&WorldEditRC->Program, "Amplitude", Perlin->Amplitude); } break; - } - rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); - v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); + case NoiseType_Voronoi: + {} break; - // NOTE(Jesse): Must call bind explicitly because the driver doesn't cache - // these values otherwise .. it just reads then whenever it wants through - // the pointer.. - v3 Mn = SimEditRect.Min - SimChunkMin; - BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &Mn); - AssertNoGlErrors; + case NoiseType_White: + {} break; + } - v3 Mx = SimEditRect.Max - SimChunkMin; - BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); - AssertNoGlErrors; + } break; - /* gpu_timer Timer = StartGpuTimer(); */ - RenderQuad(); - /* EndGpuTimer(&Timer); */ - /* Push(&Graphics->GpuTimers, &Timer); */ + case BrushLayerType_Shape: + { + NotImplemented; + } break; + } + + rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); + v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); + + // NOTE(Jesse): Must call bind explicitly because the driver doesn't cache + // these values otherwise .. it just reads then whenever it wants through + // the pointer.. + v3 Mn = SimEditRect.Min - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &Mn); + AssertNoGlErrors; - InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; - PingPongIndex = (PingPongIndex + 1) & 1; - } + v3 Mx = SimEditRect.Max - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); + AssertNoGlErrors; - AssertNoGlErrors; - } break; + /* gpu_timer Timer = StartGpuTimer(); */ + RenderQuad(); + /* EndGpuTimer(&Timer); */ + /* Push(&Graphics->GpuTimers, &Timer); */ - } // switch + InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; + PingPongIndex = (PingPongIndex + 1) & 1; + } + AssertNoGlErrors; } } ReleaseFutex(&Node->Lock); @@ -488,6 +466,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) Graphics->ColorPaletteTexture = MakeTexture_RGB( V2i(ColorCount, 1), Graphics->ColorPalette.Start, CSz("ColorPalette")); } + + +#if 0 // // Editor preview /* DrawStuffToGBufferTextures(Engine, GetApplicationResolution(&Engine->Settings)); */ @@ -506,6 +487,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) DrawEditorPreview(Engine, Shader); TeardownShadowMapShader(Graphics); } +#endif /* DrawWorldAndEntitiesToShadowMap(GetShadowMapResolution(&Engine->Settings), Engine); */ diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index fb38a46ac..c6b8e37e0 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -566,17 +566,14 @@ poof(serdes_struct(brush_settings)) poof(serdes_struct(brush_layer)) #include -poof(serdes_struct(layered_brush_0)) -#include -poof(serdes_struct(layered_brush_1)) -#include -poof(serdes_struct(layered_brush_2)) -#include +poof(serdes_dunion(world_edit_shape)) +#include + poof(serdes_struct(layered_brush)) #include -/* poof(serdes_dunion(world_edit_shape)) */ -/* #include */ +poof(serdes_struct(world_edit_brush)) +#include -/* poof(serdes_struct(world_edit)) */ -/* #include */ +poof(serdes_struct(world_edit)) +#include diff --git a/src/engine/serdes.h b/src/engine/serdes.h index ebd52b7c7..416fc70ac 100644 --- a/src/engine/serdes.h +++ b/src/engine/serdes.h @@ -469,7 +469,19 @@ poof( poof( func serdes_dunion(type) { - serialize_dunion(type) + link_internal b32 + Serialize(u8_cursor_block_array *Bytes, (type.name) *BaseElement, umm Count = 1) + { + NotImplemented; + return False; + } + + link_internal b32 + Deserialize(u8_cursor *Bytes, (type.name) *Element, memory_arena *Memory, umm Count = 1) + { + NotImplemented; + return False; + } } ) From a2dc140335ae0ad2c9980a681d1e548441466b6f Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 14 Feb 2025 16:16:05 -0700 Subject: [PATCH 169/421] Add AllBrushes window --- src/engine/editor.cpp | 65 ++++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index c21cceb73..424215352 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2266,7 +2266,11 @@ CheckSettingsChanged(layered_brush *Brush) link_internal b32 CheckSettingsChanged(world_edit *Edit) { - b32 Result = CheckSettingsChanged(&Edit->Brush->Layered); + b32 Result = False; + if (Edit->Brush) + { + Result = CheckSettingsChanged(&Edit->Brush->Layered); + } return Result; } @@ -2768,25 +2772,52 @@ DoWorldEditor(engine_resources *Engine) } { - if (Editor->CurrentEdit && Editor->CurrentEdit->Brush) - { - /* switch (Editor->CurrentEdit->Type) */ - /* { */ - /* case WorldEdit_BrushType_Disabled: */ - /* case WorldEdit_BrushType_Single: */ - /* case WorldEdit_BrushType_Asset: */ - /* case WorldEdit_BrushType_Entity: { } break; */ - - /* case WorldEdit_BrushType_Layered: */ - /* { */ - local_persist window_layout BrushSettingsWindow = WindowLayout("Brush Settings", WindowLayoutFlag_Align_Right); - DoWorldEditSettingsWindow(Engine, Editor->CurrentEdit->Brush, &BrushSettingsWindow); - /* } break; */ - /* } */ + local_persist window_layout BrushSettingsWindow = WindowLayout("All Brushes", WindowLayoutFlag_Align_BottomRight); + PushWindowStart(Ui, &BrushSettingsWindow); + + if (Editor->LoadedBrushes.Elements == 0) + { + Editor->LoadedBrushes = Allocate_world_edit_brush_hashtable(128, Editor->Memory); + } + + if (Button(Ui, CSz("New"), UiId(&BrushSettingsWindow, "brush new", 0u))) + { + world_edit_brush Brush = {}; + NewBrush(&Brush); + Editor->CurrentBrush = Insert(Brush, &Editor->LoadedBrushes, Editor->Memory); + } + PushNewRow(Ui); + + IterateOver(&Editor->LoadedBrushes, Brush, BrushIndex) + { + if (Brush) + { + if (Brush == Editor->CurrentBrush) + { + PushColumn(Ui, CSz("*"), &DefaultSelectedStyle); + } + else + { + PushColumn(Ui, CSz(" "), &DefaultSelectedStyle); + } + + if (Button(Ui, CS(Brush->NameBuf), UiId(&BrushSettingsWindow, "brush select", Brush))) + { + Editor->CurrentBrush = Brush; + } + PushNewRow(Ui); + } + } + PushWindowEnd(Ui, &BrushSettingsWindow); + + if (Editor->CurrentBrush) + { + local_persist window_layout BrushSettingsWindow = WindowLayout("Brush Settings", WindowLayoutFlag_Align_Right); + DoWorldEditSettingsWindow(Engine, Editor->CurrentBrush, &BrushSettingsWindow); // NOTE(Jesse): Must come after the settings window draws because the // settings window detects and initializes new brushes - if (SelectionComplete(Editor->Selection.Clicks)) + if (SelectionComplete(Editor->Selection.Clicks) && Editor->CurrentEdit) { b32 SettingsChanged = CheckSettingsChanged(Editor->CurrentEdit); if (SettingsChanged || Editor->Selection.Changed) From c5ed902b517ac119958d9e637317aac6d32fbb1a Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 14 Feb 2025 16:41:42 -0700 Subject: [PATCH 170/421] Add an AllEdits window --- src/engine/editor.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 424215352..f891570a5 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2829,6 +2829,44 @@ DoWorldEditor(engine_resources *Engine) } + { + local_persist window_layout AllEditsWindow = WindowLayout("All Edits", WindowLayoutFlag_Align_Bottom); + PushWindowStart(Ui, &AllEditsWindow); + IterateOver(&Editor->WorldEdits, Edit, BrushIndex) + { + umm I = GetIndex(&BrushIndex); + const char *NameBuf = Edit->Brush ? Edit->Brush->NameBuf : "no brush"; + + if (Edit == Editor->CurrentEdit) + { + PushColumn(Ui, CSz("*"), &DefaultSelectedStyle); + } + else + { + PushColumn(Ui, CSz(" "), &DefaultSelectedStyle); + } + + if (Button(Ui, FSz("(%d) (%s)", I, NameBuf), UiId(&AllEditsWindow, "edit select", Edit))) + { + Editor->CurrentEdit = Edit; + if (Edit->Brush) + { + Editor->CurrentBrush = Edit->Brush; + } + } + + if (Button(Ui, FSz("(UpdateBrush)", I, NameBuf), UiId(&AllEditsWindow, "edit brush select", Edit))) + { + Edit->Brush = Editor->CurrentBrush; + } + + PushNewRow(Ui); + + } + PushWindowEnd(Ui, &AllEditsWindow); + + } + #if VOXEL_DEBUG_COLOR From c8edf8f431b38133a7fce91c8fdceef99f2b2568 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 14 Feb 2025 21:22:58 -0700 Subject: [PATCH 171/421] Fix brush serialization --- brushes/black_castle_wall.brush | Bin 1236 -> 0 bytes brushes/black_castle_wall_broken.brush | Bin 1236 -> 0 bytes brushes/black_castle_wall_rough.brush | Bin 1236 -> 0 bytes brushes/dirt_path.brush | Bin 542 -> 0 bytes brushes/eraser.brush | Bin 542 -> 0 bytes brushes/foliage.brush | Bin 2289 -> 0 bytes brushes/foo.1.brush | Bin 553 -> 0 bytes brushes/foo.brush | Bin 553 -> 528 bytes brushes/granite_wall.brush | Bin 1587 -> 0 bytes brushes/granite_wall_paint.brush | Bin 1938 -> 0 bytes brushes/grass.brush | Bin 885 -> 0 bytes brushes/small_gravel.brush | Bin 885 -> 0 bytes brushes/spackled_base.1.brush | Bin 1587 -> 0 bytes brushes/spackled_base.brush | Bin 1587 -> 0 bytes brushes/spackled_stone.1.brush | Bin 1587 -> 0 bytes brushes/spackled_stone.brush | Bin 1587 -> 0 bytes brushes/spackled_stone_green.1.brush | Bin 1587 -> 0 bytes brushes/spackled_stone_green.brush | Bin 1587 -> 0 bytes brushes/spackled_stone_green2.brush | Bin 1938 -> 0 bytes brushes/stone_path.brush | Bin 1938 -> 0 bytes brushes/test.brush | Bin 542 -> 0 bytes brushes/vines.brush | Bin 534 -> 0 bytes brushes/wood_horizontal.brush | Bin 885 -> 0 bytes brushes/wood_horizontal.brushdw.brush | Bin 885 -> 0 bytes brushes/wood_vertical.1.brush | Bin 885 -> 0 bytes brushes/wood_vertical.brush | Bin 885 -> 0 bytes brushes/wooden_door.1.brush | Bin 885 -> 0 bytes brushes/wooden_door.brush | Bin 885 -> 0 bytes ...rate_stream_tagged_counted_string_stream.h | 2 +- generated/parse_integer_136174807.h | 2 +- generated/serdes_primitive_592771169.h | 2 +- generated/serdes_struct_brush_layer.h | 2 +- generated/serdes_struct_brush_settings.h | 2 +- generated/serdes_struct_brush_settings_0.h | 2 +- generated/serdes_struct_brush_settings_1.h | 2 +- generated/serdes_struct_brush_settings_2.h | 2 +- generated/serdes_struct_layered_brush.h | 2 +- generated/serdes_struct_shape_layer.h | 2 +- generated/serdes_struct_struct.h | 61 ++-------- generated/serdes_struct_world_edit.h | 2 +- generated/serdes_struct_world_edit_brush.h | 21 +--- ...truct_world_update_op_shape_params_asset.h | 115 ++++++++++++++++++ ..._world_update_op_shape_params_chunk_data.h | 100 +++++++++++++++ generated/serdes_world_edit_shape.h | 27 +++- generated/stream_and_cursor_counted_string.h | 2 +- src/engine/editor.cpp | 19 +-- src/engine/editor.h | 6 +- src/engine/serdes.cpp | 5 + src/engine/serdes.h | 20 ++- src/engine/serialize.cpp | 4 +- 50 files changed, 307 insertions(+), 95 deletions(-) delete mode 100644 brushes/black_castle_wall.brush delete mode 100644 brushes/black_castle_wall_broken.brush delete mode 100644 brushes/black_castle_wall_rough.brush delete mode 100644 brushes/dirt_path.brush delete mode 100644 brushes/eraser.brush delete mode 100644 brushes/foliage.brush delete mode 100644 brushes/foo.1.brush delete mode 100644 brushes/granite_wall.brush delete mode 100644 brushes/granite_wall_paint.brush delete mode 100644 brushes/grass.brush delete mode 100644 brushes/small_gravel.brush delete mode 100644 brushes/spackled_base.1.brush delete mode 100644 brushes/spackled_base.brush delete mode 100644 brushes/spackled_stone.1.brush delete mode 100644 brushes/spackled_stone.brush delete mode 100644 brushes/spackled_stone_green.1.brush delete mode 100644 brushes/spackled_stone_green.brush delete mode 100644 brushes/spackled_stone_green2.brush delete mode 100644 brushes/stone_path.brush delete mode 100644 brushes/test.brush delete mode 100644 brushes/vines.brush delete mode 100644 brushes/wood_horizontal.brush delete mode 100644 brushes/wood_horizontal.brushdw.brush delete mode 100644 brushes/wood_vertical.1.brush delete mode 100644 brushes/wood_vertical.brush delete mode 100644 brushes/wooden_door.1.brush delete mode 100644 brushes/wooden_door.brush create mode 100644 generated/serdes_struct_world_update_op_shape_params_asset.h create mode 100644 generated/serdes_struct_world_update_op_shape_params_chunk_data.h diff --git a/brushes/black_castle_wall.brush b/brushes/black_castle_wall.brush deleted file mode 100644 index 4fb42bf2bfb741814c57420fa4030a4abd20efae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1236 zcmbVLOHKnZ4E4|@5^Oj?PeL;{;06Pz5sZXdG&3x^<0vdxas{Lwfn}FHNK3I3zp)hx z5~OmU^ZfjY)mD_xM6pslQ@rh-`unDj!_Y47`V(aZ-gfzOq1?mGDt2++}`kkdhc5J=+ z>|(v?S6Fj3|2*gawBD=w_3`~u#z9Y@_K{FJ;BglO2b6z@`KJ7hL##w(|8EXt+l-&) HqLndU1bhlQ diff --git a/brushes/black_castle_wall_broken.brush b/brushes/black_castle_wall_broken.brush deleted file mode 100644 index ba8aaa0f4492db77b028802fd05dae619a14d17b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1236 zcmdUtO-{o=424}-RzfU#08T=a8*qb&s-qIAYEcpv>^KZdu23n*=v9yqbe#C>SYcqt z0$0{^p8wsM$tahGGs7#xRrAz7RBh%6TroJrYDWL;mYn;!CpG)FJibCYY^jIeT+S&b5Q2?vwu48UHSTWxb-z1aKE(|lnE5l{`)IC(4>-%PP-_49w*nW-A!nnt~XV<#A8Y5iY^y@aI zzcl@7-E^)Rq9_`tB|Ry$L44K4G5$42FH#gDFLpl4z|SN9Jr}tyIYA?y8x0Pe)Z34b zUJ)&*`GX&ne{tMRk!bBBKIncTg9C|Gg!>FGRBF98_GG=ono6H79xw8bt@pNk+w5-Q zHmGfN^lC78-WB1%bFDX3GsT5I!Y$nQVY{jITHp!meJw~Wa%{c-_wUuutMe=JqpHtL R>T}>gf3-I_uf+ue^9xtU{vZGV diff --git a/brushes/dirt_path.brush b/brushes/dirt_path.brush deleted file mode 100644 index cc2be09f6b7285ce5cdff7436f5cbd1b07a42659..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 542 zcmaJ+K?=e!5Zvfd@ZGEXHqb&{|U0gg;Tm3=x^Wp;A?82q34DpCa8eE_H z)+1vFJyGAwJfJF1L+#%k(OER5DxZB~t#gz_|K{_KhNS;L`x?aQsY9%?-AVTd@uSF!xS0gG01RsP~o`@}N8 U?9cD`&r8+1SN8cD@%Bb#0pF>|OaK4? diff --git a/brushes/foliage.brush b/brushes/foliage.brush deleted file mode 100644 index d4602f0e8b54134dee9b8d6340b44127232cffa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2289 zcmdUvK~BRk5Jer3*dVdu0PNUugSsb)K#d?0YNaGB*s+;J6#dDc?-|cm7VMp8HRTK*qRd5*PFI)>TwrMby><&;vyu8MW^?K&jottymxM!-@@;_iWkn^EO`s>0v8t? zX!_;x(F>vlrGANv@(@SPBD;?}2fND|ze`A~DSJ~pWAA8_Sf$5P@ot~Jo`cX6JZ`M{ z?4>_w&&jtSX9k6neYYwXzDa}FD^k;DE_;`u^tk8=#(sApA76O%f^eW{OI(zPIC2)5 z7o-|Gz6IgHsa)kM(jfMV+_W+FPF)WAPu~0Y2K(ZoCusWR5zq^w1?RpTWPa^|?kO>g z{vf;{+*b*qbZIlLvDf=}2fwSoXX~ls-09gX^UC~Y?rc{`<;9#}PJ{q1)FA}_Z||G3 S^tA02i{`ZV^RK<-y7&dwcAkI$ diff --git a/brushes/foo.1.brush b/brushes/foo.1.brush deleted file mode 100644 index e7c7218e99a99454eb3a0752759219ee84b9f762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 553 zcmZQ%fBmq;acW6PW?p(ROch9S%^wKlg{sU+tV}IRO^FBVz^0HJ zsxU7V!Z delta 52 ycmbQhvXX_9kpTjjCvsYf@h=`Z2GIrYTns^)#{`UOvO`GICFM&qY-%^AJ%i z%Vu4T>Cd8mwJz%-@1nRgO-p)Goa!OI*QYVMU7#0nPWKsRykzFTE<|Rk31)m3r=iv! zXW?$AF~Q(Far}b=z1DnjD(lR+t80;4wYOf!*%0FuUEfpPVCZ&j+hTAau^!=e=0f?D zti$8oIuUPHw#d69kI3)GJGieelX^UoAM~Hkd{Z9cI2$6-zK+z;>2&)A2NHXs4&0Zy zP-EkbZ6EP^x5?ON+0A^eFMI#)zcgOPmDV}NF}Ja^kNphyNS}?(+1e zT2`~EkEmwz)zz{~zaR9At9e~bT@*$0w4^7+o^IlsK9AAI5qgob)aNmlco`@Ec_cDW zjkm9~nn<+uksCUl zZd`C6v4`rweI^&GYrNsujq$o$IM!_W@iIRj?>Za%V0dkJ~4s~qHEqdbF5DxsU z@pjeh;!+=J7w)~??$3_*ZX)uac08e^$gRB+x8T749^SXhSc?VpWs=l#_*rpSGTDay8Prt~Y(S9NJk-dAC0 z*cR>4f)P3E!W#FQKu?sWKFHxcQ~s7}{z!T diff --git a/brushes/small_gravel.brush b/brushes/small_gravel.brush deleted file mode 100644 index 3a54757f7b95a68dfd0a7b8e517743815ba59687..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885 zcmbV|K@P$o5Jf?kCayd{Z_@T8jiyAKm^LYO;cYyChwxsykP)6#WK|mS;Lo2KI$HU) z4%C6$z{7a4r^cFT>iVNy1yyi=`EM7r^Zsf^(>6ZCwB0m}IsYd3`=PU@`DD>_UY7Ed z5ONkDIe{g9rK-w>Yj)IC9nX(ashji3F6O$s`-Kr*&z?4cj1)F<@FV@iu1d*W4y zP>~RVjhyk$j@P@6Gawy9!-3(M;cfX;-RD)T>tc3Sofs>y-05>++{5HKmT{VEM4T4& zyzJATntnDfs+c!XNSbbo?Xks(7vYOOjp6ASdZG|`p23`_%>B)n=#n*R&Np!!>es`X z<_;XA2EGy73mj0i?k_l}nsYDL%mt!ttHW9skw@;G8gz$bfCC~{5Zt@Fp!A9=mJ~9K z`={mIb9qN>t6wkg?zr-5k-Ocy2-+2I?XihA0iTKeZ+9;~r{!zA0CPd?50t;deOG?P zVXcdZPCHk8=#u6=fCD1-JkcN7y>{&%>fW2|^>KYA$HCEnf2q7ES9;Dq4rlLM+kd{I FGaoT8tknPj diff --git a/brushes/spackled_base.brush b/brushes/spackled_base.brush deleted file mode 100644 index 324a1ab6d11dadbdf726d1c222aedf2f7938597e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1587 zcmc&!OHKnZ40WM9B-n5OPC_%BfE$cJjbJ3yqM7M}-JF3lblC+LKJ77W_ZxC)UJoK zSlh8C8t_2YKfvIHYjMXl#Vj|UUlBdCb*X>w`yO@V-noId&lWIvXvG8jun?j9JtN`nKoGbtb) zWh#@&dgJXJzX-Os)Hc!9ArHsDe!ciQQPXk(8TKpx9pCXxIn+W25AJ`)d&WtS?}x8f ouiYE(UtjNav3`8Ll&hc(_(PAk|Lcu$qd)A&dLKJ`A70UrFTpRXasU7T diff --git a/brushes/spackled_stone.1.brush b/brushes/spackled_stone.1.brush deleted file mode 100644 index caadc3122c73da70a37be231c88716cd4452142e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1587 zcmdT@y-veG40fO!5-`BdleCvkj2+k`P)`sEwI~S#TX`2ogm?j@J_Zj1E%u$i_;gUj z&jMGupYz>k`|Ml_ifdc3P~25KYp&ais`Xu0&(7N|Wd-hE;_pDY%hMa*_-Pd*{Iu@o z%}4qj)z9X2>#GojqG?*BM~VS&!WVrS!;d5AiJar-5@tM=<}XJ?N34lve2C*vYY%&| zw&R#+;DcEIzyU>T{(@^pGwx(eG~t~4V{n@gbqaP;gMOVXa6rTgf_pU=6vituDIrU^ za|UysGWS;_q6^ljIp4%_sF#O5 z%^f&K4SXZEKX5?Nx%-csP3}(bJm^%sx7Q|G1-vHqzdgNpotCei0z3=ie4uLzfKi790?6cuiVwyjc@#!fH&cbK8@kW5%fgP@pB0?o=WqVBcdbLL^D3baj3P2 zy;$3EOf>L8tbgEuqBVcPHKQ5Vjfsvq=iwOKCPbZroz$RTCkq@9v4Y@U%>{+=icCt# z67J;oUMcC1*?9 kOZ-jaJuUC%PeW-1#{m9?@yhl3**T=6xX{n)eT&At0YQbVHUIzs diff --git a/brushes/spackled_stone_green.brush b/brushes/spackled_stone_green.brush deleted file mode 100644 index caadc3122c73da70a37be231c88716cd4452142e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1587 zcmdT@y-veG40fO!5-`BdleCvkj2+k`P)`sEwI~S#TX`2ogm?j@J_Zj1E%u$i_;gUj z&jMGupYz>k`|Ml_ifdc3P~25KYp&ais`Xu0&(7N|Wd-hE;_pDY%hMa*_-Pd*{Iu@o z%}4qj)z9X2>#GojqG?*BM~VS&!WVrS!;d5AiJar-5@tM=<}XJ?N34lve2C*vYY%&| zw&R#+;DcEIzyU>T{(@^pGwx(eG~t~4V{n@gbqaP;gMOVXa6rTgf_pU=6vituDIrU^ z#}ZARAV4*Gdh{ECb3^}9uumRU3n%Tk^a%d&~D@nMcUwum<-j^#PQJZ}>3k6OlT zN{ltnmwA%v$79d-jwQz$d>QQi;6RP_{!n^a^W3)7Q#)wGeTDRi#0ib~NwDBRauwk| zybFcA8m29DDfj%a`%mQ^w~bj6yRBXWv(}N>Luu6~E>L#@2dYjixEr4eMGFl@UYAyr zcNoh}5qqkRZOka9j`+X6y|sSTSgwBw)CcwJ@V<}yj$^NmWdB9pH7P>fAKqR!c1_;$ zBTuASI9}j4%e%F+pIn{Y?dd2S1Dq#$^?WSO$Fm|F*t9pE4r{u-v&eh7ao>1*UmjoM Ud6rk_pXD`c4u<4!)AD-e6Fx9QtpET3 diff --git a/brushes/stone_path.brush b/brushes/stone_path.brush deleted file mode 100644 index 7c06944d3a28a4b8a67b96d0bf7c57329d3344a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1938 zcmd6nTTa6;5JepxUr2nh0CrNBjYObE5DB#?DIaX1Yhe*x3QJ%CAn?R(f=U8O7X5JTE|o9DZeQ#I*|AvTI{R^ u;lLqVG4J-OG;6Q-@sIwJ-dJzp#%}M@?OpEUKwCjtW;MagZSTM-u-Pw-<{Wka diff --git a/brushes/test.brush b/brushes/test.brush deleted file mode 100644 index 451df64e45bc7c77f91f6600c6207cb30286ac91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 542 zcmZ`!Ne;p=40M4T5+@$OPnz~45vUPFs#+-t2W~uwNAzJF$l}2fOQUG)@pz_bsC;Y2 zhH=Mua#w%R-h^PMvtKcr;PEVH&)j&t8D|DvHq2nd?BH7Kx2&IL>y6G^2(4wXhegsL zKGpS3Y+LAwl!|?aD?D{lFD=m_YRVNp@5NPl9%jhS!)lH`A+*5cFSRHut|z)HqD>F( XA0q$b-S13s|Med-h5z_16KjZGwp+!Y diff --git a/brushes/vines.brush b/brushes/vines.brush deleted file mode 100644 index 73d2b46a7d6eeeb3bab32c2e07ddf409e2529489..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534 zcmZQ%fBmq;acW6PW?p(R6I2vLt@#6iB2clM#LCp7)RcILj?|RQ zlKdiU>barn^YSx`Q{%z9V3r~q3o{;O1V{~x4N?cw1EuX@>KPau9Dve}FpLmqa73^V z*aOu8)qwB?B=HL%eP94n3!@of5@_YKr;OukLbOsEvzQ-!%F5eA&h*x`%>qA)?FSrC zYdK~mbG@o}%ZYlYLoP(PgMGVeKwje~ub&%UWwBQyXcHXophiCB_vzA&O?39+-;X!w h=eFRD{BHaJY0XLti;1I2tc>+c^TXO&a diff --git a/brushes/wood_horizontal.brushdw.brush b/brushes/wood_horizontal.brushdw.brush deleted file mode 100644 index 64834fe021dd4a6550109f6c94dd7edf8abfdfe0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885 zcmbVJOAdlC5FK!*i7VZE6FwJdG&D+LAOT#sV@*7S2k;Ocz;k#C7q+yo)6`F*kn)B% z@6Alxh|Dvw7+IWK+%$)FCtBHcWwmW%%WAkh%)7AMetndUEQE2$qU`GCoqlHZRb94H zj4m|w%c49=Xhf{_zDNBg&=aMp`p>YKr;OukLbOsEvzQ-!%F5eA&h*x`%>qA)?FSrC zYdK~mbG@o}%ZYlYLoP(PgMGVeKwje~ub&%UWwBQyXcHXophiCB_vzA&O?39+-;X!w h=eFRD{BHaJY0XLti;1I2tc>+c^TXO&a diff --git a/brushes/wood_vertical.1.brush b/brushes/wood_vertical.1.brush deleted file mode 100644 index fa534ab21ae654a02883df92a3ac2c406535f70b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885 zcmbVJOAdlC5FK!7;>rVX6FwJdG&D+LAfdQ$$C^`k01n{+Jdz7r+Sh4{E)+7n;mvz9 z{Ul_cjl;y@&f&4Ys}oWZev1|4F}f`nGG76pIT( z!?tLT76y?Uedy7@IrKzDq5n$+^Hg&F$cZwovBCV}(^lRdYIe5iZ3Fxwb{}v+qvf2H z%#FI=vmzS34z(EJj`r=Z0d<4lykTux%hI4nG$uaYLQ8c_6-E)={T7IRKi+7b-$Jk? d&+*JGxKdVfea)d3Bb5KG18zQ3!6`;D^9EEHS>ONw diff --git a/brushes/wood_vertical.brush b/brushes/wood_vertical.brush deleted file mode 100644 index fa534ab21ae654a02883df92a3ac2c406535f70b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885 zcmbVJOAdlC5FK!7;>rVX6FwJdG&D+LAfdQ$$C^`k01n{+Jdz7r+Sh4{E)+7n;mvz9 z{Ul_cjl;y@&f&4Ys}oWZev1|4F}f`nGG76pIT( z!?tLT76y?Uedy7@IrKzDq5n$+^Hg&F$cZwovBCV}(^lRdYIe5iZ3Fxwb{}v+qvf2H z%#FI=vmzS34z(EJj`r=Z0d<4lykTux%hI4nG$uaYLQ8c_6-E)={T7IRKi+7b-$Jk? d&+*JGxKdVfea)d3Bb5KG18zQ3!6`;D^9EEHS>ONw diff --git a/brushes/wooden_door.1.brush b/brushes/wooden_door.1.brush deleted file mode 100644 index fa534ab21ae654a02883df92a3ac2c406535f70b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885 zcmbVJOAdlC5FK!7;>rVX6FwJdG&D+LAfdQ$$C^`k01n{+Jdz7r+Sh4{E)+7n;mvz9 z{Ul_cjl;y@&f&4Ys}oWZev1|4F}f`nGG76pIT( z!?tLT76y?Uedy7@IrKzDq5n$+^Hg&F$cZwovBCV}(^lRdYIe5iZ3Fxwb{}v+qvf2H z%#FI=vmzS34z(EJj`r=Z0d<4lykTux%hI4nG$uaYLQ8c_6-E)={T7IRKi+7b-$Jk? d&+*JGxKdVfea)d3Bb5KG18zQ3!6`;D^9EEHS>ONw diff --git a/brushes/wooden_door.brush b/brushes/wooden_door.brush deleted file mode 100644 index 0ec8443e7bf08d1faf6d35842026c31a3edbc0b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885 zcmbVJOAdlC5FK!7;>rVX6FwJdG&DkDAfdSM3Y@|NxZnsL%!MuO>of%y3Yos?n>RC^ zHX-}%93~DA4$s3)HA2a8Y`cp}9c$qEw*S#_*VA1NvKBT&*6r92Tl&4zcYUj*ShCPG zEQ|6eVGzF2hdFwiLr+u`dSAkrr;`0wPLyelHRhK*oyy}OW_z33*1#`fw}1m0E&Hrw zuBnI~y5?Mg`-aGl=JwBkxWTx_R%}|!(m)rriLbZNQf-qzwiyF$iGIJ{sGlDpIFjeM bPZm5WD>=UA5Q`DY|IUGIzEi<2S~2qhFY;N= diff --git a/generated/generate_stream_tagged_counted_string_stream.h b/generated/generate_stream_tagged_counted_string_stream.h index f0f20395d..53fcd1cbc 100644 --- a/generated/generate_stream_tagged_counted_string_stream.h +++ b/generated/generate_stream_tagged_counted_string_stream.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.h:124:0 +// external/bonsai_stdlib/src/counted_string.h:131:0 struct tagged_counted_string_stream_stream_chunk { diff --git a/generated/parse_integer_136174807.h b/generated/parse_integer_136174807.h index dfedf3330..bc3bdbaf8 100644 --- a/generated/parse_integer_136174807.h +++ b/generated/parse_integer_136174807.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.h:855:0 +// external/bonsai_stdlib/src/counted_string.h:862:0 link_internal b32 ParseInteger(cs String, u32 *Out) diff --git a/generated/serdes_primitive_592771169.h b/generated/serdes_primitive_592771169.h index f05719caa..40b97e019 100644 --- a/generated/serdes_primitive_592771169.h +++ b/generated/serdes_primitive_592771169.h @@ -1,4 +1,4 @@ -// src/engine/serdes.h:515:0 +// src/engine/serdes.h:533:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, u8 *Element, umm Count = 1) diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index ac44dd5c4..2473532f1 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:566:0 +// src/engine/serdes.cpp:571:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index 83ac372b3..cded28880 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:563:0 +// src/engine/serdes.cpp:568:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) diff --git a/generated/serdes_struct_brush_settings_0.h b/generated/serdes_struct_brush_settings_0.h index 5b85fb3b1..5676bad7a 100644 --- a/generated/serdes_struct_brush_settings_0.h +++ b/generated/serdes_struct_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:557:0 +// src/engine/serdes.cpp:562:0 link_internal bonsai_type_info TypeInfo(brush_settings_0 *Ignored) diff --git a/generated/serdes_struct_brush_settings_1.h b/generated/serdes_struct_brush_settings_1.h index 109295601..0175a559c 100644 --- a/generated/serdes_struct_brush_settings_1.h +++ b/generated/serdes_struct_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:559:0 +// src/engine/serdes.cpp:564:0 link_internal bonsai_type_info TypeInfo(brush_settings_1 *Ignored) diff --git a/generated/serdes_struct_brush_settings_2.h b/generated/serdes_struct_brush_settings_2.h index bec862e00..9c4fb03fa 100644 --- a/generated/serdes_struct_brush_settings_2.h +++ b/generated/serdes_struct_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:561:0 +// src/engine/serdes.cpp:566:0 link_internal bonsai_type_info TypeInfo(brush_settings_2 *Ignored) diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 195139ad0..770153de3 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:572:0 +// src/engine/serdes.cpp:577:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index bf6899b0f..8d76e10d3 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:554:0 +// src/engine/serdes.cpp:559:0 link_internal bonsai_type_info TypeInfo(shape_layer *Ignored) diff --git a/generated/serdes_struct_struct.h b/generated/serdes_struct_struct.h index d5571fce8..f511ac2f7 100644 --- a/generated/serdes_struct_struct.h +++ b/generated/serdes_struct_struct.h @@ -1,11 +1,11 @@ -// src/engine/serdes.cpp:572:0 +// src/engine/serdes.cpp:555:0 link_internal bonsai_type_info -TypeInfo(world_edit_brush *Ignored) +TypeInfo(world_update_op_shape_params_chunk_data *Ignored) { bonsai_type_info Result = {}; - Result.Name = CSz("world_edit_brush"); + Result.Name = CSz("world_update_op_shape_params_chunk_data"); Result.Version = 0 ; /* type.map(member) */ @@ -20,7 +20,7 @@ TypeInfo(world_edit_brush *Ignored) } link_internal b32 -Serialize(u8_cursor_block_array *Bytes, world_edit_brush *BaseElement, umm Count = 1) +Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_chunk_data *BaseElement, umm Count = 1) { Assert(Count > 0); @@ -33,32 +33,15 @@ Serialize(u8_cursor_block_array *Bytes, world_edit_brush *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { - world_edit_brush *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Shape); // default + world_update_op_shape_params_chunk_data *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->Data); // default - Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum - - - - - Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum - - - - - Result &= Serialize(Bytes, &Element->Ordinal); // default - - - - - - - Result &= Serialize(Bytes, &Element->Layered); // default + Result &= Serialize(Bytes, &Element->SimSpaceOrigin); // default @@ -69,39 +52,21 @@ Serialize(u8_cursor_block_array *Bytes, world_edit_brush *BaseElement, umm Count } link_internal b32 -Deserialize(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory, umm Count = 1); +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_chunk_data *Element, memory_arena *Memory, umm Count = 1); link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory); +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_chunk_data *Element, memory_arena *Memory); link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory) +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_chunk_data *Element, memory_arena *Memory) { b32 Result = True; // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Shape, Memory); - - - - - - Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); - - - - - Element->Modifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Ordinal, Memory); + Result &= Deserialize(Bytes, &Element->Data, Memory); @@ -109,7 +74,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_brush *Element, memory_ar // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Layered, Memory); + Result &= Deserialize(Bytes, &Element->SimSpaceOrigin, Memory); @@ -118,7 +83,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_brush *Element, memory_ar } link_internal b32 -Deserialize(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory, umm Count) +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_chunk_data *Element, memory_arena *Memory, umm Count) { Assert(Count > 0); diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index b256fa778..d10612716 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:578:0 +// src/engine/serdes.cpp:583:0 link_internal bonsai_type_info TypeInfo(world_edit *Ignored) diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index f8aa2c128..b8cfabaab 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:575:0 +// src/engine/serdes.cpp:580:0 link_internal bonsai_type_info TypeInfo(world_edit_brush *Ignored) @@ -34,14 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, world_edit_brush *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { world_edit_brush *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Shape); // default - - - - - - - Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum @@ -81,15 +74,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Shape, Memory); - - - - - - Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); + Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); diff --git a/generated/serdes_struct_world_update_op_shape_params_asset.h b/generated/serdes_struct_world_update_op_shape_params_asset.h new file mode 100644 index 000000000..0261b53e1 --- /dev/null +++ b/generated/serdes_struct_world_update_op_shape_params_asset.h @@ -0,0 +1,115 @@ +// src/engine/serdes.cpp:554:0 + +link_internal bonsai_type_info +TypeInfo(world_update_op_shape_params_asset *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("world_update_op_shape_params_asset"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_asset *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + world_update_op_shape_params_asset *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->AssetId); // default + + + + + + + Result &= Serialize(Bytes, &Element->ModelIndex); // default + + + + + + + Result &= Serialize(Bytes, &Element->Origin); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_asset *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_asset *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_asset *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->AssetId, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->ModelIndex, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Origin, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_asset *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h new file mode 100644 index 000000000..ee0f48d74 --- /dev/null +++ b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h @@ -0,0 +1,100 @@ +// src/engine/serdes.cpp:556:0 + +link_internal bonsai_type_info +TypeInfo(world_update_op_shape_params_chunk_data *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("world_update_op_shape_params_chunk_data"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_chunk_data *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + world_update_op_shape_params_chunk_data *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->Data); // default + + + + + + + Result &= Serialize(Bytes, &Element->SimSpaceOrigin); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_chunk_data *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_chunk_data *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_chunk_data *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Data, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->SimSpaceOrigin, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_chunk_data *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serdes_world_edit_shape.h b/generated/serdes_world_edit_shape.h index 7eba6384e..8b3b2af61 100644 --- a/generated/serdes_world_edit_shape.h +++ b/generated/serdes_world_edit_shape.h @@ -1,9 +1,32 @@ -// src/engine/serdes.cpp:569:0 +// src/engine/serdes.cpp:574:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, world_edit_shape *BaseElement, umm Count = 1) { - NotImplemented; + switch (BaseElement->Type) + { + case type_world_update_op_shape_params_sphere: + { + Serialize(Bytes, &BaseElement->world_update_op_shape_params_sphere); + } break; + case type_world_update_op_shape_params_rect: + { + Serialize(Bytes, &BaseElement->world_update_op_shape_params_rect); + } break; + case type_world_update_op_shape_params_asset: + { + Serialize(Bytes, &BaseElement->world_update_op_shape_params_asset); + } break; + case type_world_update_op_shape_params_chunk_data: + { + Serialize(Bytes, &BaseElement->world_update_op_shape_params_chunk_data); + } break; + + + + InvalidDefaultCase; + } + return False; } diff --git a/generated/stream_and_cursor_counted_string.h b/generated/stream_and_cursor_counted_string.h index 4a312b801..1a657f8fd 100644 --- a/generated/stream_and_cursor_counted_string.h +++ b/generated/stream_and_cursor_counted_string.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.h:116:0 +// external/bonsai_stdlib/src/counted_string.h:123:0 struct counted_string_cursor { diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index f891570a5..cdd7efaec 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1511,23 +1511,24 @@ DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, win if (ClickedFileNode.Tag) { cs Filename = Concat(ClickedFileNode.Value.Dir, CSz("/"), ClickedFileNode.Value.Name, Tran); -#if 1 - NotImplemented; -#else - Assert(Editor->Brush.Type == WorldEdit_BrushType_Layered); + u8_cursor Bytes = BeginDeserialization(Filename, Tran); - if (Deserialize(&Bytes, &Editor->Brush.Layered, Tran) == False) + + world_edit_brush B = {}; + CopyString( ClickedFileNode.Value.Name.Start, B.NameBuf, Min(umm(ClickedFileNode.Value.Name.Count), umm(NameBuf_Len))); + Editor->CurrentBrush = Upsert(B, &Editor->LoadedBrushes, &Global_PermMemory); + + if (Deserialize(&Bytes, Editor->CurrentBrush, Tran) == False) { SoftError("While deserializing brush (%S).", Filename); - Editor->Brush = {}; + *Editor->CurrentBrush = {}; } FinalizeDeserialization(&Bytes); -#endif // NOTE(Jesse): This has to happen after deserialization cause some // brushes got saved out with a name, which gets read back in.. - ZeroMemory(Brush->NameBuf, NameBuf_Len); - CopyString(&ClickedFileNode.Value.Name, &BrushNameBuf); + /* ZeroMemory(Brush->NameBuf, NameBuf_Len); */ + /* CopyString(&ClickedFileNode.Value.Name, &BrushNameBuf); */ SetToggleButton(Ui, ImportToggleId, False); } diff --git a/src/engine/editor.h b/src/engine/editor.h index d91691647..0dfd83979 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -792,8 +792,8 @@ struct world_update_op_shape_params_sphere struct world_edit_shape { world_update_op_shape_type Type; - - union { + union poof(@d_union_type_target) + { world_update_op_shape_params_sphere world_update_op_shape_params_sphere; world_update_op_shape_params_rect world_update_op_shape_params_rect; world_update_op_shape_params_asset world_update_op_shape_params_asset; @@ -1110,7 +1110,7 @@ struct world_edit_brush #define NameBuf_Len (256) char NameBuf[NameBuf_Len+1]; poof(@no_serialize @ui_text_box) - world_edit_shape Shape; + /* world_edit_shape Shape; */ world_edit_blend_mode Mode; world_edit_blend_mode_modifier Modifier; diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index c6b8e37e0..a638d4434 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -551,6 +551,11 @@ poof(serdes_struct(world_update_op_shape_params_rect)) #include poof(serdes_struct(world_update_op_shape_params_sphere)) #include +poof(serdes_struct(world_update_op_shape_params_asset)) +#include +poof(serdes_struct(world_update_op_shape_params_chunk_data)) +#include + poof(serdes_struct(shape_layer)) #include diff --git a/src/engine/serdes.h b/src/engine/serdes.h index 416fc70ac..165b2251f 100644 --- a/src/engine/serdes.h +++ b/src/engine/serdes.h @@ -472,7 +472,25 @@ poof( link_internal b32 Serialize(u8_cursor_block_array *Bytes, (type.name) *BaseElement, umm Count = 1) { - NotImplemented; + switch (BaseElement->Type) + { + type.map_members(union_member) + { + union_member.has_tag(d_union_type_target)? + { + union_member.map(variant) + { + case type_(variant.name): + { + Serialize(Bytes, &BaseElement->(variant.name)); + } break; + } + } + } + + InvalidDefaultCase; + } + return False; } diff --git a/src/engine/serialize.cpp b/src/engine/serialize.cpp index d452bc341..5fca99099 100644 --- a/src/engine/serialize.cpp +++ b/src/engine/serialize.cpp @@ -6,7 +6,7 @@ BeginSerialization() Global_SerializeTypeTableArena = AllocateArena(); Global_SerializeTypeTable = Allocate_bonsai_type_info_hashtable(64, Global_SerializeTypeTableArena); - u8_cursor_block_array Blocks = {}; + u8_cursor_block_array Blocks = U8CursorBlockArray(Global_SerializeTypeTableArena); { Blocks.BlockSize = Megabytes(32); u8_cursor First = U8Cursor(Blocks.BlockSize, Global_SerializeTypeTableArena); @@ -19,7 +19,7 @@ BeginSerialization() link_internal b32 FinalizeSerialization(u8_cursor_block_array *Blocks, const char *Filename) { - u8_cursor_block_array TypeBufferOutputStream = {}; + u8_cursor_block_array TypeBufferOutputStream = U8CursorBlockArray(Global_SerializeTypeTableArena); { TypeBufferOutputStream.BlockSize = Megabytes(32); From bbaa636dfc4e8c8c440d790e8b7f899281d4c90e Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 16 Feb 2025 14:02:41 -0700 Subject: [PATCH 172/421] Move DoLevelWindow from debug.cpp to editor.cpp --- src/engine/debug.cpp | 233 --------------------------------------- src/engine/editor.cpp | 250 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 240 insertions(+), 243 deletions(-) diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index ec3dac231..9848a6eab 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -1,237 +1,4 @@ -link_internal void -DoLevelWindow(engine_resources *Engine) -{ - UNPACK_ENGINE_RESOURCES(Engine); - - local_persist window_layout Window = WindowLayout("Level"); - - thread_local_state *Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); - - PushWindowStart(Ui, &Window); - PushTableStart(Ui); - if (Button(Ui, CSz("Export Level"), UiId(&Window, "export_level_button", 0ull))) - { - u8_cursor_block_array OutputStream = BeginSerialization(); - - - u32 ChunkCount = 0; - NotImplemented; -#if 0 - RangeIterator(HashIndex, s32(World->HashSize)) - { - if (World->ChunkHash[HashIndex]) - { - ++ChunkCount; - } - } -#endif - - level_header Header = {}; - Header.ChunkCount = ChunkCount; - - Header.WorldFlags = Cast(u32, World->Flags); - Header.WorldCenter = World->Center; - Header.VisibleRegion = World->VisibleRegion; - Header.Camera = *Camera; - - Header.RenderSettings = Graphics->Settings; - - u32 EntityCount = 0; - RangeIterator(EntityIndex, TOTAL_ENTITY_COUNT) - { - entity *E = EntityTable[EntityIndex]; - if (Spawned(E)) { ++EntityCount; } - } - Header.EntityCount = EntityCount; - - - Serialize(&OutputStream, &Header); - - u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; - - NotImplemented; -#if 0 - RangeIterator(HashIndex, s32(World->HashSize)) - { - if (world_chunk *Chunk = World->ChunkHash[HashIndex]) - { - SerializeChunk(Chunk, &OutputStream); - } - } -#endif - - Ensure(Serialize(&OutputStream, &Delimeter)); - - RangeIterator(EntityIndex, TOTAL_ENTITY_COUNT) - { - entity *E = EntityTable[EntityIndex]; - if (Spawned(E)) - { - Serialize(&OutputStream, E); - } - } - - v3_cursor *Palette = GetColorPalette(); - Serialize(&OutputStream, Palette); - - const char *Filename = "../bonsai_levels/test.level"; - if (FinalizeSerialization(&OutputStream, Filename) == False) - { - SoftError("Could not serialize (%s).", Filename); - } - } - PushTableEnd(Ui); - PushNewRow(Ui); - - PushTableStart(Ui); - maybe_file_traversal_node ClickedNode = PlatformTraverseDirectoryTreeUnordered(CSz("../bonsai_levels"), EngineDrawFileNodesHelper, Cast(u64, &Window)); - PushTableEnd(Ui); - PushNewRow(Ui); - - // Import - if (ClickedNode.Tag) - { - cs Filename = Concat(ClickedNode.Value.Dir, CSz("/"), ClickedNode.Value.Name, GetTranArena()); - - u8_cursor LevelBytes = BeginDeserialization(Filename, GetTranArena()); - if (LevelBytes.Start) - { - level_header LevelHeader = {}; - - - if (Deserialize(&LevelBytes, &LevelHeader, Thread->PermMemory)) - { - { - engine_settings *EngineSettings = &GetEngineResources()->Settings; - LevelHeader.RenderSettings.ApplicationResolution = V2(GetApplicationResolution(EngineSettings)); - LevelHeader.RenderSettings.ShadowMapResolution = V2(GetShadowMapResolution(EngineSettings)); - LevelHeader.RenderSettings.LuminanceMapResolution = V2(GetLuminanceMapResolution(EngineSettings)); - - LevelHeader.RenderSettings.iApplicationResolution = GetApplicationResolution(EngineSettings); - LevelHeader.RenderSettings.iShadowMapResolution = GetShadowMapResolution(EngineSettings); - LevelHeader.RenderSettings.iLuminanceMapResolution = GetLuminanceMapResolution(EngineSettings); - } - - SignalAndWaitForWorkers(&Plat->WorkerThreadsSuspendFutex); - - SoftResetEngine(Engine); - - /* World->Flags = Cast(world_flag, LevelHeader.WorldFlags); */ - World->Center = LevelHeader.WorldCenter; - - maybe_bonsai_type_info MaybeLevelHeaderTypeInfo = GetByName(&Global_SerializeTypeTable, CSz("level_header")); - if (MaybeLevelHeaderTypeInfo.Tag) - { - if (MaybeLevelHeaderTypeInfo.Value.Version > 2) - { - Graphics->Settings = LevelHeader.RenderSettings; - } - } - - *Graphics->Camera = LevelHeader.Camera; - /* World->VisibleRegion = LevelHeader.VisibleRegion; */ - - s32 ChunkCount = Cast(s32, LevelHeader.ChunkCount); - /* Info("ChunksFreed (%u) ChunksLoaded (%u)", ChunksFreed, ChunkCount); */ - - RangeIterator(ChunkIndex, ChunkCount) - { - world_chunk *Chunk = GetFreeWorldChunk(World); - DeserializeChunk(&LevelBytes, Chunk, World->ChunkMemory); - - if (IsInsideVisibleRegion(World, Chunk->WorldP)) - { -#if 0 - if (Editor->Flags & LevelEditorFlags_RecomputeStandingSpotsOnLevelLoad) - { - Chunk->StandingSpots.At = Chunk->StandingSpots.Start; - Flags = ChunkInitFlag_ComputeStandingSpots; - } -#endif - - InsertChunkIntoWorld(World, Chunk); - } - } - - u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; - Ensure(Read_u64(&LevelBytes) == Delimeter); - -#if 1 - - b32 Error = False; - u32 EntityCount = LevelHeader.EntityCount; - RangeIterator_t(u32, EntityIndex, EntityCount) - { - entity *E = EntityTable[EntityIndex]; - if (Deserialize(&LevelBytes, E, Thread->PermMemory) == False) - { - SoftError("Could not deserialize entity (%d), bailing.", EntityIndex); - Error = True; - break; - } - E->Id.Index = EntityIndex; // NOTE(Jesse): Hack.. entities got saved out with 0 indexes.. - } - - if (Error == False) - { - v3_cursor *Palette = GetColorPalette(); - Palette->At = Palette->Start; - Deserialize(&LevelBytes, Palette, Thread->PermMemory); - Assert(LevelBytes.At == LevelBytes.End); - - b32 NormalizePalette = False; - RangeIterator_t(umm, ColorIndex, (umm)(Palette->At-Palette->Start)) - { - v3 *C = Palette->Start+ColorIndex; - - // If any components are > 1.f we must have loaded a palette with values in the 0-255 range - if (C->E[0] > 1.f || C->E[1] > 1.f || C->E[2] > 1.f) { NormalizePalette = True; break; } - } - - if (NormalizePalette) - { - RangeIterator_t(umm, ColorIndex, (umm)(Palette->At-Palette->Start)) - { - v3 *C = Palette->Start+ColorIndex; - *C /= 255.f; - Assert (C->E[0] <= 1.f && C->E[1] <= 1.f && C->E[2] <= 1.f); - } - } - } - - - NotImplemented; -#if 0 - RangeIterator_t(u32, ChunkIndex, World->HashSize) - { - if (world_chunk *Chunk = World->ChunkHash[ChunkIndex]) - { - if (MaybeLevelHeaderTypeInfo.Value.Version < 4) - { - MarshalMagicaVoxelEncodedColors(Chunk->Voxels, Chunk->Voxels, Chunk->Dim); - } - - chunk_init_flags Flags = ChunkInitFlag_Noop; - QueueChunkForMeshRebuild(&GetEngineResources()->Stdlib.Plat.LowPriority, Chunk, Flags); - } - } -#endif - -#endif - - Assert(ThreadLocal_ThreadIndex == 0); - if (Engine->GameApi.OnLibraryLoad) { Engine->GameApi.OnLibraryLoad(Engine, GetThreadLocalState(ThreadLocal_ThreadIndex)); } - - UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); - } - } - FinalizeDeserialization(&LevelBytes); - - } - PushWindowEnd(Ui, &Window); -} - link_internal void DoEntityWindow(engine_resources *Engine) { diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index cdd7efaec..47d732b27 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1443,13 +1443,15 @@ DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, win UNPACK_ENGINE_RESOURCES(Engine); layered_brush *LayeredBrush = &Brush->Layered; -#if 1 - cs BrushNameBuf = CS(Brush->NameBuf, NameBuf_Len); b32 IsNewBrush = False; - if (Brush->NameBuf[0] == 0 && Brush->Layered.LayerCount == 0) +#if 1 { - NewBrush(Brush); - IsNewBrush = True; + cs BrushNameBuf = CS(Brush->NameBuf, NameBuf_Len); + if (Brush->NameBuf[0] == 0 && Brush->Layered.LayerCount == 0) + { + NewBrush(Brush); + IsNewBrush = True; + } } #endif @@ -1525,11 +1527,6 @@ DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, win } FinalizeDeserialization(&Bytes); - // NOTE(Jesse): This has to happen after deserialization cause some - // brushes got saved out with a name, which gets read back in.. - /* ZeroMemory(Brush->NameBuf, NameBuf_Len); */ - /* CopyString(&ClickedFileNode.Value.Name, &BrushNameBuf); */ - SetToggleButton(Ui, ImportToggleId, False); } } @@ -2934,3 +2931,236 @@ DrawEditorPreview(engine_resources *Engine, shader *Shader) } #endif +link_internal void +DoLevelWindow(engine_resources *Engine) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + local_persist window_layout Window = WindowLayout("Level"); + + thread_local_state *Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); + + PushWindowStart(Ui, &Window); + PushTableStart(Ui); + if (Button(Ui, CSz("Export Level"), UiId(&Window, "export_level_button", 0ull))) + { + u8_cursor_block_array OutputStream = BeginSerialization(); + + + u32 ChunkCount = 0; + NotImplemented; +#if 0 + RangeIterator(HashIndex, s32(World->HashSize)) + { + if (World->ChunkHash[HashIndex]) + { + ++ChunkCount; + } + } +#endif + + level_header Header = {}; + Header.ChunkCount = ChunkCount; + + Header.WorldFlags = Cast(u32, World->Flags); + Header.WorldCenter = World->Center; + Header.VisibleRegion = World->VisibleRegion; + Header.Camera = *Camera; + + Header.RenderSettings = Graphics->Settings; + + u32 EntityCount = 0; + RangeIterator(EntityIndex, TOTAL_ENTITY_COUNT) + { + entity *E = EntityTable[EntityIndex]; + if (Spawned(E)) { ++EntityCount; } + } + Header.EntityCount = EntityCount; + + + Serialize(&OutputStream, &Header); + + u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; + + NotImplemented; +#if 0 + RangeIterator(HashIndex, s32(World->HashSize)) + { + if (world_chunk *Chunk = World->ChunkHash[HashIndex]) + { + SerializeChunk(Chunk, &OutputStream); + } + } +#endif + + Ensure(Serialize(&OutputStream, &Delimeter)); + + RangeIterator(EntityIndex, TOTAL_ENTITY_COUNT) + { + entity *E = EntityTable[EntityIndex]; + if (Spawned(E)) + { + Serialize(&OutputStream, E); + } + } + + v3_cursor *Palette = GetColorPalette(); + Serialize(&OutputStream, Palette); + + const char *Filename = "../bonsai_levels/test.level"; + if (FinalizeSerialization(&OutputStream, Filename) == False) + { + SoftError("Could not serialize (%s).", Filename); + } + } + PushTableEnd(Ui); + PushNewRow(Ui); + + PushTableStart(Ui); + maybe_file_traversal_node ClickedNode = PlatformTraverseDirectoryTreeUnordered(CSz("../bonsai_levels"), EngineDrawFileNodesHelper, Cast(u64, &Window)); + PushTableEnd(Ui); + PushNewRow(Ui); + + // Import + if (ClickedNode.Tag) + { + cs Filename = Concat(ClickedNode.Value.Dir, CSz("/"), ClickedNode.Value.Name, GetTranArena()); + + u8_cursor LevelBytes = BeginDeserialization(Filename, GetTranArena()); + if (LevelBytes.Start) + { + level_header LevelHeader = {}; + + + if (Deserialize(&LevelBytes, &LevelHeader, Thread->PermMemory)) + { + { + engine_settings *EngineSettings = &GetEngineResources()->Settings; + LevelHeader.RenderSettings.ApplicationResolution = V2(GetApplicationResolution(EngineSettings)); + LevelHeader.RenderSettings.ShadowMapResolution = V2(GetShadowMapResolution(EngineSettings)); + LevelHeader.RenderSettings.LuminanceMapResolution = V2(GetLuminanceMapResolution(EngineSettings)); + + LevelHeader.RenderSettings.iApplicationResolution = GetApplicationResolution(EngineSettings); + LevelHeader.RenderSettings.iShadowMapResolution = GetShadowMapResolution(EngineSettings); + LevelHeader.RenderSettings.iLuminanceMapResolution = GetLuminanceMapResolution(EngineSettings); + } + + SignalAndWaitForWorkers(&Plat->WorkerThreadsSuspendFutex); + + SoftResetEngine(Engine); + + /* World->Flags = Cast(world_flag, LevelHeader.WorldFlags); */ + World->Center = LevelHeader.WorldCenter; + + maybe_bonsai_type_info MaybeLevelHeaderTypeInfo = GetByName(&Global_SerializeTypeTable, CSz("level_header")); + if (MaybeLevelHeaderTypeInfo.Tag) + { + if (MaybeLevelHeaderTypeInfo.Value.Version > 2) + { + Graphics->Settings = LevelHeader.RenderSettings; + } + } + + *Graphics->Camera = LevelHeader.Camera; + /* World->VisibleRegion = LevelHeader.VisibleRegion; */ + + s32 ChunkCount = Cast(s32, LevelHeader.ChunkCount); + /* Info("ChunksFreed (%u) ChunksLoaded (%u)", ChunksFreed, ChunkCount); */ + + RangeIterator(ChunkIndex, ChunkCount) + { + world_chunk *Chunk = GetFreeWorldChunk(World); + DeserializeChunk(&LevelBytes, Chunk, World->ChunkMemory); + + if (IsInsideVisibleRegion(World, Chunk->WorldP)) + { +#if 0 + if (Editor->Flags & LevelEditorFlags_RecomputeStandingSpotsOnLevelLoad) + { + Chunk->StandingSpots.At = Chunk->StandingSpots.Start; + Flags = ChunkInitFlag_ComputeStandingSpots; + } +#endif + + InsertChunkIntoWorld(World, Chunk); + } + } + + u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; + Ensure(Read_u64(&LevelBytes) == Delimeter); + +#if 1 + + b32 Error = False; + u32 EntityCount = LevelHeader.EntityCount; + RangeIterator_t(u32, EntityIndex, EntityCount) + { + entity *E = EntityTable[EntityIndex]; + if (Deserialize(&LevelBytes, E, Thread->PermMemory) == False) + { + SoftError("Could not deserialize entity (%d), bailing.", EntityIndex); + Error = True; + break; + } + E->Id.Index = EntityIndex; // NOTE(Jesse): Hack.. entities got saved out with 0 indexes.. + } + + if (Error == False) + { + v3_cursor *Palette = GetColorPalette(); + Palette->At = Palette->Start; + Deserialize(&LevelBytes, Palette, Thread->PermMemory); + Assert(LevelBytes.At == LevelBytes.End); + + b32 NormalizePalette = False; + RangeIterator_t(umm, ColorIndex, (umm)(Palette->At-Palette->Start)) + { + v3 *C = Palette->Start+ColorIndex; + + // If any components are > 1.f we must have loaded a palette with values in the 0-255 range + if (C->E[0] > 1.f || C->E[1] > 1.f || C->E[2] > 1.f) { NormalizePalette = True; break; } + } + + if (NormalizePalette) + { + RangeIterator_t(umm, ColorIndex, (umm)(Palette->At-Palette->Start)) + { + v3 *C = Palette->Start+ColorIndex; + *C /= 255.f; + Assert (C->E[0] <= 1.f && C->E[1] <= 1.f && C->E[2] <= 1.f); + } + } + } + + + NotImplemented; +#if 0 + RangeIterator_t(u32, ChunkIndex, World->HashSize) + { + if (world_chunk *Chunk = World->ChunkHash[ChunkIndex]) + { + if (MaybeLevelHeaderTypeInfo.Value.Version < 4) + { + MarshalMagicaVoxelEncodedColors(Chunk->Voxels, Chunk->Voxels, Chunk->Dim); + } + + chunk_init_flags Flags = ChunkInitFlag_Noop; + QueueChunkForMeshRebuild(&GetEngineResources()->Stdlib.Plat.LowPriority, Chunk, Flags); + } + } +#endif + +#endif + + Assert(ThreadLocal_ThreadIndex == 0); + if (Engine->GameApi.OnLibraryLoad) { Engine->GameApi.OnLibraryLoad(Engine, GetThreadLocalState(ThreadLocal_ThreadIndex)); } + + UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); + } + } + FinalizeDeserialization(&LevelBytes); + + } + PushWindowEnd(Ui, &Window); +} + From fccfc36aa90429900cd19dbacb85a68b5fea4454 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 16 Feb 2025 14:07:51 -0700 Subject: [PATCH 173/421] Remove some now-defunct datatypes and ser/des code --- generated/are_equal_render_settings.h | 2 +- generated/deserialize_struct_level_header.h | 67 +-------- generated/for_datatypes_0XxWqGSZ.h | 7 - generated/for_datatypes_fkubhsYl.h | 7 - generated/for_datatypes_kv3WBTai.h | 7 - generated/serdes_struct_bonsai_type_info.h | 2 +- .../serdes_struct_bonsai_type_info_buffer.h | 2 +- generated/serdes_struct_brush_layer.h | 2 +- generated/serdes_struct_brush_settings.h | 2 +- generated/serdes_struct_brush_settings_0.h | 2 +- generated/serdes_struct_brush_settings_1.h | 2 +- generated/serdes_struct_brush_settings_2.h | 2 +- generated/serdes_struct_layered_brush.h | 2 +- generated/serdes_struct_lighting_settings.h | 48 +------ generated/serdes_struct_noise_layer.h | 2 +- generated/serdes_struct_noise_layer_0.h | 2 +- generated/serdes_struct_perlin_noise_params.h | 2 +- generated/serdes_struct_render_settings.h | 54 +------ generated/serdes_struct_shape_layer.h | 2 +- .../serdes_struct_voronoi_noise_params.h | 2 +- generated/serdes_struct_white_noise_params.h | 2 +- generated/serdes_struct_world_edit.h | 2 +- generated/serdes_struct_world_edit_brush.h | 2 +- ...truct_world_update_op_shape_params_asset.h | 2 +- ..._world_update_op_shape_params_chunk_data.h | 2 +- ...struct_world_update_op_shape_params_rect.h | 2 +- ...ruct_world_update_op_shape_params_sphere.h | 2 +- generated/serdes_world_edit_shape.h | 2 +- generated/serialize_struct_level_header.h | 18 +-- src/engine/editor.cpp | 18 +-- src/engine/level.h | 69 +-------- src/engine/render_settings.h | 81 +---------- src/engine/serdes.cpp | 136 ------------------ 33 files changed, 42 insertions(+), 514 deletions(-) diff --git a/generated/are_equal_render_settings.h b/generated/are_equal_render_settings.h index b8f89c4b2..225d83922 100644 --- a/generated/are_equal_render_settings.h +++ b/generated/are_equal_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/render_settings.h:94:0 +// src/engine/render_settings.h:72:0 link_internal b32 AreEqual(render_settings *Thing1, render_settings *Thing2) diff --git a/generated/deserialize_struct_level_header.h b/generated/deserialize_struct_level_header.h index 40405f0fa..c05cc2672 100644 --- a/generated/deserialize_struct_level_header.h +++ b/generated/deserialize_struct_level_header.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:519:0 +// src/engine/serdes.cpp:383:0 link_internal b32 Deserialize(u8_cursor *Bytes, level_header *Element, memory_arena *Memory, umm Count = 1); @@ -7,46 +7,6 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena *Memory); -link_internal b32 -DeserializeVersioned(u8_cursor *Bytes, level_header *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) -{ - Assert(TypeInfo->Version <= 4); - - b32 Result = True; - - if (TypeInfo->Version == 0) - { - level_header_0 T0 = {}; - Result &= Deserialize(Bytes, &T0, Memory); - Marshal(&T0, Element); - } - if (TypeInfo->Version == 1) - { - level_header_1 T1 = {}; - Result &= Deserialize(Bytes, &T1, Memory); - Marshal(&T1, Element); - } - if (TypeInfo->Version == 2) - { - level_header_2 T2 = {}; - Result &= Deserialize(Bytes, &T2, Memory); - Marshal(&T2, Element); - } - if (TypeInfo->Version == 3) - { - level_header_3 T3 = {}; - Result &= Deserialize(Bytes, &T3, Memory); - Marshal(&T3, Element); - } - - - if (TypeInfo->Version == 4) - { - Result &= DeserializeCurrentVersion(Bytes, Element, Memory); - } - - return Result; -} link_internal b32 @@ -55,14 +15,6 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena b32 Result = True; // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->ChunkCount, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EntityCount, Memory); @@ -119,22 +71,7 @@ Deserialize(u8_cursor *Bytes, level_header *Element, memory_arena *Memory, umm C b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("level_header")); - - if (MaybeSerializedType.Tag) - { - u64 OldIgnoredVersionNumber; - if (MaybeSerializedType.Value.Version > 0) - { - Deserialize(Bytes, &OldIgnoredVersionNumber, Memory); - } - Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &MaybeSerializedType.Value, Memory); - } - else - { - bonsai_type_info T0TypeInfo = {}; - Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &T0TypeInfo, Memory); - } + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index be354b76e..9dc8a65d6 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -725,13 +725,6 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) - - - - - - - diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index f46e34080..eee0a3374 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -715,13 +715,6 @@ render_to_texture_async_params render_to_texture_async_params; - - - - - - - diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 0a663432b..99b4cc292 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -715,13 +715,6 @@ type_render_to_texture_async_params, - - - - - - - diff --git a/generated/serdes_struct_bonsai_type_info.h b/generated/serdes_struct_bonsai_type_info.h index 08236aedf..346733f8d 100644 --- a/generated/serdes_struct_bonsai_type_info.h +++ b/generated/serdes_struct_bonsai_type_info.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:452:0 +// src/engine/serdes.cpp:378:0 link_internal bonsai_type_info TypeInfo(bonsai_type_info *Ignored) diff --git a/generated/serdes_struct_bonsai_type_info_buffer.h b/generated/serdes_struct_bonsai_type_info_buffer.h index 52904ad80..a6e5a8df4 100644 --- a/generated/serdes_struct_bonsai_type_info_buffer.h +++ b/generated/serdes_struct_bonsai_type_info_buffer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:454:0 +// src/engine/serdes.cpp:380:0 link_internal bonsai_type_info TypeInfo(bonsai_type_info_buffer *Ignored) diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index 2473532f1..5796e3b88 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:571:0 +// src/engine/serdes.cpp:435:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index cded28880..411d8d348 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:568:0 +// src/engine/serdes.cpp:432:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) diff --git a/generated/serdes_struct_brush_settings_0.h b/generated/serdes_struct_brush_settings_0.h index 5676bad7a..772869a04 100644 --- a/generated/serdes_struct_brush_settings_0.h +++ b/generated/serdes_struct_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:562:0 +// src/engine/serdes.cpp:426:0 link_internal bonsai_type_info TypeInfo(brush_settings_0 *Ignored) diff --git a/generated/serdes_struct_brush_settings_1.h b/generated/serdes_struct_brush_settings_1.h index 0175a559c..f213dcc4c 100644 --- a/generated/serdes_struct_brush_settings_1.h +++ b/generated/serdes_struct_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:564:0 +// src/engine/serdes.cpp:428:0 link_internal bonsai_type_info TypeInfo(brush_settings_1 *Ignored) diff --git a/generated/serdes_struct_brush_settings_2.h b/generated/serdes_struct_brush_settings_2.h index 9c4fb03fa..1f9ef1c1c 100644 --- a/generated/serdes_struct_brush_settings_2.h +++ b/generated/serdes_struct_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:566:0 +// src/engine/serdes.cpp:430:0 link_internal bonsai_type_info TypeInfo(brush_settings_2 *Ignored) diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 770153de3..5fe5a232e 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:577:0 +// src/engine/serdes.cpp:441:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) diff --git a/generated/serdes_struct_lighting_settings.h b/generated/serdes_struct_lighting_settings.h index 7cb4e5954..6cde59377 100644 --- a/generated/serdes_struct_lighting_settings.h +++ b/generated/serdes_struct_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:406:0 +// src/engine/serdes.cpp:372:0 link_internal bonsai_type_info TypeInfo(lighting_settings *Ignored) @@ -6,7 +6,7 @@ TypeInfo(lighting_settings *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("lighting_settings"); - Result.Version = 1 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -29,10 +29,7 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings *BaseElement, umm Coun b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber = 1; - Serialize(Bytes, &VersionNumber); - + RangeIterator_t(umm, ElementIndex, Count) { @@ -131,28 +128,6 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_arena *Memory); -link_internal b32 -DeserializeVersioned(u8_cursor *Bytes, lighting_settings *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) -{ - Assert(TypeInfo->Version <= 1); - - b32 Result = True; - - if (TypeInfo->Version == 0) - { - lighting_settings_0 T0 = {}; - Result &= Deserialize(Bytes, &T0, Memory); - Marshal(&T0, Element); - } - - - if (TypeInfo->Version == 1) - { - Result &= DeserializeCurrentVersion(Bytes, Element, Memory); - } - - return Result; -} link_internal b32 @@ -265,22 +240,7 @@ Deserialize(u8_cursor *Bytes, lighting_settings *Element, memory_arena *Memory, b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("lighting_settings")); - - if (MaybeSerializedType.Tag) - { - u64 OldIgnoredVersionNumber; - if (MaybeSerializedType.Value.Version > 0) - { - Deserialize(Bytes, &OldIgnoredVersionNumber, Memory); - } - Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &MaybeSerializedType.Value, Memory); - } - else - { - bonsai_type_info T0TypeInfo = {}; - Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &T0TypeInfo, Memory); - } + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_noise_layer.h b/generated/serdes_struct_noise_layer.h index e8e32b754..23aef03d8 100644 --- a/generated/serdes_struct_noise_layer.h +++ b/generated/serdes_struct_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:548:0 +// src/engine/serdes.cpp:412:0 link_internal bonsai_type_info TypeInfo(noise_layer *Ignored) diff --git a/generated/serdes_struct_noise_layer_0.h b/generated/serdes_struct_noise_layer_0.h index b8c4d926b..5cf4fe761 100644 --- a/generated/serdes_struct_noise_layer_0.h +++ b/generated/serdes_struct_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:546:0 +// src/engine/serdes.cpp:410:0 link_internal bonsai_type_info TypeInfo(noise_layer_0 *Ignored) diff --git a/generated/serdes_struct_perlin_noise_params.h b/generated/serdes_struct_perlin_noise_params.h index 48b18d1c9..896b1e450 100644 --- a/generated/serdes_struct_perlin_noise_params.h +++ b/generated/serdes_struct_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:542:0 +// src/engine/serdes.cpp:406:0 link_internal bonsai_type_info TypeInfo(perlin_noise_params *Ignored) diff --git a/generated/serdes_struct_render_settings.h b/generated/serdes_struct_render_settings.h index afed57ad0..9cf0b3895 100644 --- a/generated/serdes_struct_render_settings.h +++ b/generated/serdes_struct_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:443:0 +// src/engine/serdes.cpp:375:0 link_internal bonsai_type_info TypeInfo(render_settings *Ignored) @@ -6,7 +6,7 @@ TypeInfo(render_settings *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("render_settings"); - Result.Version = 2 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -29,10 +29,7 @@ Serialize(u8_cursor_block_array *Bytes, render_settings *BaseElement, umm Count b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber = 2; - Serialize(Bytes, &VersionNumber); - + RangeIterator_t(umm, ElementIndex, Count) { @@ -192,34 +189,6 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_arena *Memory); -link_internal b32 -DeserializeVersioned(u8_cursor *Bytes, render_settings *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) -{ - Assert(TypeInfo->Version <= 2); - - b32 Result = True; - - if (TypeInfo->Version == 0) - { - render_settings_0 T0 = {}; - Result &= Deserialize(Bytes, &T0, Memory); - Marshal(&T0, Element); - } - if (TypeInfo->Version == 1) - { - render_settings_1 T1 = {}; - Result &= Deserialize(Bytes, &T1, Memory); - Marshal(&T1, Element); - } - - - if (TypeInfo->Version == 2) - { - Result &= DeserializeCurrentVersion(Bytes, Element, Memory); - } - - return Result; -} link_internal b32 @@ -401,22 +370,7 @@ Deserialize(u8_cursor *Bytes, render_settings *Element, memory_arena *Memory, um b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("render_settings")); - - if (MaybeSerializedType.Tag) - { - u64 OldIgnoredVersionNumber; - if (MaybeSerializedType.Value.Version > 0) - { - Deserialize(Bytes, &OldIgnoredVersionNumber, Memory); - } - Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &MaybeSerializedType.Value, Memory); - } - else - { - bonsai_type_info T0TypeInfo = {}; - Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &T0TypeInfo, Memory); - } + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index 8d76e10d3..44f7238f4 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:559:0 +// src/engine/serdes.cpp:423:0 link_internal bonsai_type_info TypeInfo(shape_layer *Ignored) diff --git a/generated/serdes_struct_voronoi_noise_params.h b/generated/serdes_struct_voronoi_noise_params.h index 61b221139..7fe856bfe 100644 --- a/generated/serdes_struct_voronoi_noise_params.h +++ b/generated/serdes_struct_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:544:0 +// src/engine/serdes.cpp:408:0 link_internal bonsai_type_info TypeInfo(voronoi_noise_params *Ignored) diff --git a/generated/serdes_struct_white_noise_params.h b/generated/serdes_struct_white_noise_params.h index 265f006d5..49772a175 100644 --- a/generated/serdes_struct_white_noise_params.h +++ b/generated/serdes_struct_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:540:0 +// src/engine/serdes.cpp:404:0 link_internal bonsai_type_info TypeInfo(white_noise_params *Ignored) diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index d10612716..6bb68269d 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:583:0 +// src/engine/serdes.cpp:447:0 link_internal bonsai_type_info TypeInfo(world_edit *Ignored) diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index b8cfabaab..296bf0448 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:580:0 +// src/engine/serdes.cpp:444:0 link_internal bonsai_type_info TypeInfo(world_edit_brush *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_asset.h b/generated/serdes_struct_world_update_op_shape_params_asset.h index 0261b53e1..cbbee95b9 100644 --- a/generated/serdes_struct_world_update_op_shape_params_asset.h +++ b/generated/serdes_struct_world_update_op_shape_params_asset.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:554:0 +// src/engine/serdes.cpp:418:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_asset *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h index ee0f48d74..43367e3c2 100644 --- a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h +++ b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:556:0 +// src/engine/serdes.cpp:420:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_chunk_data *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_rect.h b/generated/serdes_struct_world_update_op_shape_params_rect.h index 9ef43049a..b97f678d7 100644 --- a/generated/serdes_struct_world_update_op_shape_params_rect.h +++ b/generated/serdes_struct_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:550:0 +// src/engine/serdes.cpp:414:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_rect *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_sphere.h b/generated/serdes_struct_world_update_op_shape_params_sphere.h index 99804ca63..7a31d5818 100644 --- a/generated/serdes_struct_world_update_op_shape_params_sphere.h +++ b/generated/serdes_struct_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:552:0 +// src/engine/serdes.cpp:416:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_sphere *Ignored) diff --git a/generated/serdes_world_edit_shape.h b/generated/serdes_world_edit_shape.h index 8b3b2af61..189c4af31 100644 --- a/generated/serdes_world_edit_shape.h +++ b/generated/serdes_world_edit_shape.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:574:0 +// src/engine/serdes.cpp:438:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, world_edit_shape *BaseElement, umm Count = 1) diff --git a/generated/serialize_struct_level_header.h b/generated/serialize_struct_level_header.h index 281c1632d..3705d4a3f 100644 --- a/generated/serialize_struct_level_header.h +++ b/generated/serialize_struct_level_header.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:522:0 +// src/engine/serdes.cpp:386:0 link_internal bonsai_type_info TypeInfo(level_header *Ignored) @@ -6,7 +6,7 @@ TypeInfo(level_header *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("level_header"); - Result.Version = 4 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -29,22 +29,12 @@ Serialize(u8_cursor_block_array *Bytes, level_header *BaseElement, umm Count = 1 b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber = 4; - Serialize(Bytes, &VersionNumber); - + RangeIterator_t(umm, ElementIndex, Count) { level_header *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->ChunkCount); // default - - - - - - - Result &= Serialize(Bytes, &Element->EntityCount); // default + Result &= Serialize(Bytes, &Element->EntityCount); // default diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 47d732b27..be36ab866 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2946,21 +2946,7 @@ DoLevelWindow(engine_resources *Engine) { u8_cursor_block_array OutputStream = BeginSerialization(); - - u32 ChunkCount = 0; - NotImplemented; -#if 0 - RangeIterator(HashIndex, s32(World->HashSize)) - { - if (World->ChunkHash[HashIndex]) - { - ++ChunkCount; - } - } -#endif - level_header Header = {}; - Header.ChunkCount = ChunkCount; Header.WorldFlags = Cast(u32, World->Flags); Header.WorldCenter = World->Center; @@ -3064,7 +3050,9 @@ DoLevelWindow(engine_resources *Engine) *Graphics->Camera = LevelHeader.Camera; /* World->VisibleRegion = LevelHeader.VisibleRegion; */ - s32 ChunkCount = Cast(s32, LevelHeader.ChunkCount); + /* s32 ChunkCount = Cast(s32, LevelHeader.ChunkCount); */ + s32 ChunkCount = 0; + NotImplemented; /* Info("ChunksFreed (%u) ChunksLoaded (%u)", ChunksFreed, ChunkCount); */ RangeIterator(ChunkIndex, ChunkCount) diff --git a/src/engine/level.h b/src/engine/level.h index 1298dced4..5f0ca610a 100644 --- a/src/engine/level.h +++ b/src/engine/level.h @@ -1,8 +1,7 @@ #define LEVEL_FILE_FORMAT_VERSION_NUMBER (1) -struct level_header poof(@version(4)) +struct level_header { - u32 ChunkCount; u32 EntityCount; // World Params @@ -14,69 +13,3 @@ struct level_header poof(@version(4)) render_settings RenderSettings; }; - -// NOTE(Jesse): This version and previous versions had chunks with magicavoxel encoded colors. -struct level_header_3 -{ - u32 ChunkCount; - u32 EntityCount; - - // World Params - u32 WorldFlags; // world_flag - v3i WorldCenter; - v3i VisibleRegion; - - camera Camera; - - render_settings RenderSettings; -}; - -struct level_header_2 -{ - bonsai_type_info_hashtable TypeInfoHashtable; poof(@no_serialize) - - u32 ChunkCount; - u32 EntityCount; - - // World Params - u32 WorldFlags; // world_flag - v3i WorldCenter; - v3i VisibleRegion; - - camera Camera; - cp CameraTarget; -}; - - -struct level_header_1 -{ - /* u64 Version; */ - bonsai_type_info_hashtable TypeInfoHashtable; poof(@no_serialize) - - u32 ChunkCount; - u32 EntityCount; - - // World Params - u32 WorldFlags; // world_flag - v3i WorldCenter; - v3i VisibleRegion; - - camera Camera; - cp CameraTarget; -}; - - -struct level_header_0 -{ - /* u64 Version; */ - u32 ChunkCount; - u32 EntityCount; - - // World Params - u32 WorldFlags; // world_flag - v3i WorldCenter; - v3i VisibleRegion; - - camera Camera; - cp CameraTarget; -}; diff --git a/src/engine/render_settings.h b/src/engine/render_settings.h index 61608c7fa..1aea180bc 100644 --- a/src/engine/render_settings.h +++ b/src/engine/render_settings.h @@ -8,7 +8,7 @@ enum tone_mapping_type ToneMappingType_AGX_Punchy, }; -struct lighting_settings poof(@version(1)) +struct lighting_settings { b8 AutoDayNightCycle; @@ -32,29 +32,7 @@ struct lighting_settings poof(@version(1)) v3 CurrentSunColor; }; -struct lighting_settings_0 -{ - b8 AutoDayNightCycle; - - r32 tDay; poof(@ui_value_range(-PI32, PI32)) - - v3 SunP; poof(@ui_value_range(-1.f, 1.f)) - - v3 DawnColor; - v3 SunColor; - v3 DuskColor; - v3 MoonColor; - - f32 SunIntensity; poof(@ui_value_range(0.f, 3.f)) - f32 MoonIntensity; poof(@ui_value_range(0.f, 3.f)) - f32 DawnIntensity; poof(@ui_value_range(0.f, 3.f)) - f32 DuskIntensity; poof(@ui_value_range(0.f, 3.f)) - - // Computed from the above parameters and passed to the shader - v3 CurrentSunColor; -}; - -struct render_settings poof(@version(2)) +struct render_settings { // NOTE(Jesse): These have to be 32bit because they get passed to shaders // and the shader system is too dumb to handle 8-bit or 1-bit values @@ -93,58 +71,3 @@ struct render_settings poof(@version(2)) poof(are_equal(render_settings)) #include - -struct render_settings_1 -{ - // NOTE(Jesse): These have to be 32bit because they get passed to shaders - // and the shader system is too dumb to handle 8-bit or 1-bit values - b32 UseSsao; - b32 UseShadowMapping; - b32 UseLightingBloom; - - b32 BravoilMyersOIT; - b32 BravoilMcGuireOIT; - - b32 DrawMajorGrid; - b32 DrawMinorGrid; - r32 MajorGridDim; poof(@ui_value_range(0, 32)) - - v3 Ignored; poof(@ui_skip) - b32 Headless; poof(@ui_skip) - - - tone_mapping_type ToneMappingType; - - lighting_settings Lighting; - - v2 ApplicationResolution; - v2 ShadowMapResolution; - v2 LuminanceMapResolution; - - v2i iApplicationResolution; - v2i iShadowMapResolution; - v2i iLuminanceMapResolution; -}; - -struct render_settings_0 -{ - // NOTE(Jesse): These have to be 32bit because they get passed to shaders - // and the shader system is too dumb to handle 8-bit or 1-bit values - b32 UseSsao; - b32 UseShadowMapping; - b32 UseLightingBloom; - - b32 BravoilMyersOIT; - b32 BravoilMcGuireOIT; - - b32 DrawMajorGrid; - b32 DrawMinorGrid; - r32 MajorGridDim; poof(@ui_value_range(0, 32)) - - v3 Ignored; poof(@ui_skip) - b32 Headless; poof(@ui_skip) - - tone_mapping_type ToneMappingType; - - lighting_settings Lighting; -}; diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index a638d4434..5ec6aaae6 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -369,153 +369,17 @@ poof(serialize_struct(entity)) poof( block_array(entity, {4}) ) #include - - - -#if 0 -link_internal void -Marshal(entity_1 *E0, entity_2 *E1) -{ - E1->Id = E0->Id; - E1->P = E0->P; - E1->EulerAngles = E0->EulerAngles.xyz; - E1->Scale = E0->Scale; - E1->_CollisionVolumeRadius = E0->_CollisionVolumeRadius; - E1->Physics = E0->Physics; - - E1->AssetId = E0->AssetId; - E1->AssetId.Index = INVALID_ASSET_INDEX; - - E1->Emitter = E0->Emitter; - E1->State = E0->State; - E1->Behavior = E0->Behavior; - E1->UserType = E0->UserType; - E1->UserData = E0->UserData; -} -#endif - -link_internal void -Marshal(lighting_settings_0 *E0, lighting_settings *E1) -{ - NotImplemented; -} - -poof(serdes_struct(lighting_settings_0)) -#include - poof(serdes_struct(lighting_settings)) #include - - - - - -link_internal void -Marshal(render_settings_1 *E0, render_settings *E1) -{ - poof(func (render_settings_1 settings_t) { - settings_t.map(member) { - E1->(member.name) = E0->(member.name); - } - }) -#include -} - - -link_internal void -Marshal(render_settings_0 *E0, render_settings *E1) -{ - poof(func (render_settings_0 settings_t) { - settings_t.map(member) { - E1->(member.name) = E0->(member.name); - } - }) -#include -} - -poof(deserialize_struct(render_settings_1)) -#include - -poof(deserialize_struct(render_settings_0)) -#include - poof(serdes_struct(render_settings)) #include -/* poof(serdes_struct(member_info)) */ -/* #include */ -/* poof(serdes_struct(member_info_block)) */ -/* #include */ -/* poof(serdes_struct(member_info_block_array)) */ -/* #include */ poof(serdes_struct(bonsai_type_info)) #include poof(serdes_struct(bonsai_type_info_buffer)) #include -/* poof(serdes_struct(bonsai_type_info_linked_list_node)) */ -/* #include */ -/* poof(serdes_struct(bonsai_type_info_hashtable)) */ -/* #include */ - -/* poof(serdes_struct(level_header)) */ -/* #include */ - - -link_internal void -Marshal(level_header_0 *E0, level_header *E1) -{ - E1->ChunkCount = E0->ChunkCount; - E1->EntityCount = E0->EntityCount; - E1->WorldFlags = E0->WorldFlags; - E1->WorldCenter = E0->WorldCenter; - E1->VisibleRegion = E0->VisibleRegion; - E1->Camera = E0->Camera; -} - -link_internal void -Marshal(level_header_1 *E0, level_header *E1) -{ - E1->ChunkCount = E0->ChunkCount; - E1->EntityCount = E0->EntityCount; - E1->WorldFlags = E0->WorldFlags; - E1->WorldCenter = E0->WorldCenter; - E1->VisibleRegion = E0->VisibleRegion; - E1->Camera = E0->Camera; -} - -link_internal void -Marshal(level_header_2 *E0, level_header *E1) -{ - E1->ChunkCount = E0->ChunkCount; - E1->EntityCount = E0->EntityCount; - E1->WorldFlags = E0->WorldFlags; - E1->WorldCenter = E0->WorldCenter; - E1->VisibleRegion = E0->VisibleRegion; - E1->Camera = E0->Camera; -} - -link_internal void -Marshal(level_header_3 *Stored, level_header *Live) -{ - poof(default_marshal(level_header_3)) -#include -} - - -poof(deserialize_struct(level_header_0)) -#include - -poof(deserialize_struct(level_header_1)) -#include - -poof(deserialize_struct(level_header_2)) -#include - -poof(deserialize_struct(level_header_3)) -#include - poof(deserialize_struct(level_header)) #include From 8cb0aaf7151578e5c8f6b8fb100ce7398d91626d Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 17 Feb 2025 17:09:49 -0700 Subject: [PATCH 174/421] Level import/export nominally working --- brushes/foo.brush | Bin 528 -> 0 bytes .../block_array_c_asset_thumbnail_688856411.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/deserialize_struct_level_header.h | 4 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- generated/maybe_standing_spot.h | 2 +- generated/serdes_struct_world_edit_brush.h | 24 ++- generated/serialize_struct_level_header.h | 4 +- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- src/engine/api.cpp | 12 +- src/engine/editor.cpp | 186 +++++++----------- src/engine/editor.h | 2 +- src/engine/level.h | 2 +- src/engine/render/render_init.cpp | 85 ++++---- src/engine/render_loop.cpp | 113 +++++------ src/engine/resources.cpp | 18 +- src/engine/world.cpp | 1 + src/engine/world.h | 1 - src/engine/world_chunk.h | 6 - 108 files changed, 304 insertions(+), 342 deletions(-) delete mode 100644 brushes/foo.brush diff --git a/brushes/foo.brush b/brushes/foo.brush deleted file mode 100644 index f2f00a9db0f94b93d6dfeb0767e9366e13b111c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 zcmZQ%fB+^a%?PFWpmb7EX>mq;acW6PW?p(RGgK5rt@#6i+)%N+{LJFi_?*Pb)FPN6 z$jV^Kp{l_YNFB0~$oha%_6R)=4nV#m3?sxD91-jT_6!UPKs6AI5C`i6YDG91CWmGp z+)H4^Py(hFMuW^pun{WpiNWO1X@qVD2J+m3Fac&ZPy`qbAl!fmKbRzp#?%Ir0RUzX B!&?9V diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 139b1e1c9..08a5475a1 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:81:0 +// src/engine/editor.cpp:83:0 diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 41a228667..5981317f4 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:489:0 +// src/engine/world_chunk.h:483:0 diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 9d1113997..dd298bd06 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:516:0 +// src/engine/world_chunk.h:510:0 struct standing_spot_buffer { diff --git a/generated/deserialize_struct_level_header.h b/generated/deserialize_struct_level_header.h index c05cc2672..e46d1cba9 100644 --- a/generated/deserialize_struct_level_header.h +++ b/generated/deserialize_struct_level_header.h @@ -15,7 +15,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena b32 Result = True; // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->EntityCount, Memory); + Result &= Deserialize(Bytes, &Element->EditCount, Memory); @@ -23,7 +23,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->WorldFlags, Memory); + Result &= Deserialize(Bytes, &Element->EntityCount, Memory); diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 61d43ee04..73ffc69dd 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:216:0 +// src/engine/editor.cpp:218:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index e51df9808..1dbd4354d 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:319:0 +// src/engine/editor.cpp:321:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 3a86292e1..e34c9c8d8 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:311:0 +// src/engine/editor.cpp:313:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 6e7fa7d2e..dab2f5f1d 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:341:0 +// src/engine/editor.cpp:343:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index a56621590..71962a4e0 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:222:0 +// src/engine/editor.cpp:224:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index cb9e5e52c..b473bfbab 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:155:0 +// src/engine/editor.cpp:157:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 8cd0de24b..7c3e3e7d2 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:350:0 +// src/engine/editor.cpp:352:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 85851e11f..fd14bc9bb 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:110:0 +// src/engine/editor.cpp:112:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index d1def08a1..5ff9bec0b 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:335:0 +// src/engine/editor.cpp:337:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 37b209b68..b4d05aaad 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:252:0 +// src/engine/editor.cpp:254:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 77b488f2b..f47c9ce2c 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:344:0 +// src/engine/editor.cpp:346:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index c0957e589..e0cdd03c7 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:322:0 +// src/engine/editor.cpp:324:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index f1c44f3c6..62b770056 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:151:0 +// src/engine/editor.cpp:153:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index ca9abbe22..5b8e13efe 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:425:0 +// src/engine/editor.cpp:427:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 4d988a349..00e2ca735 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:449:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index d735dca0a..bd886bf57 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:443:0 +// src/engine/editor.cpp:445:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 7eb2e56b2..a5aadde32 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:291:0 +// src/engine/editor.cpp:293:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 83b9adbfc..4faae65c4 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:288:0 +// src/engine/editor.cpp:290:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 9f1e7f64d..f8cbcfcda 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:325:0 +// src/engine/editor.cpp:327:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index a038c6cf0..19e5c5d62 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:276:0 +// src/engine/editor.cpp:278:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index f10720a56..d45c1e3d0 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:332:0 +// src/engine/editor.cpp:334:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index b93dc45c0..6e2921179 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:413:0 +// src/engine/editor.cpp:415:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index ed1e7b414..b8272b693 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:407:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index e4229223b..f426f5367 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:258:0 +// src/engine/editor.cpp:260:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 7b221d49b..3cca3b3ac 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:261:0 +// src/engine/editor.cpp:263:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 9e137c8a1..406cafa0e 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:416:0 +// src/engine/editor.cpp:418:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 48b90c123..81f8f6eed 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:440:0 +// src/engine/editor.cpp:442:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 0dd1a26e1..3e0e894a1 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:144:0 +// src/engine/editor.cpp:146:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index f6ea55eaa..974e834bb 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:141:0 +// src/engine/editor.cpp:143:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 8636afe33..42e8d72df 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:213:0 +// src/engine/editor.cpp:215:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index a6205b79b..6c75a5d3e 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:353:0 +// src/engine/editor.cpp:355:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index f779cee49..11be66365 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:431:0 +// src/engine/editor.cpp:433:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index ab164f863..68b4a9665 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:410:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index d7ba36317..c7d0e3c29 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:192:0 +// src/engine/editor.cpp:194:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index dd3f4ab6b..b4f4a9404 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:264:0 +// src/engine/editor.cpp:266:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 769af9888..ad5ae6c02 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:267:0 +// src/engine/editor.cpp:269:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index ad88271c7..4c273d6e3 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:347:0 +// src/engine/editor.cpp:349:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 364a9fa2c..4d17192e2 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:301:0 +// src/engine/editor.cpp:303:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 29bba4e81..e4b396dba 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:207:0 +// src/engine/editor.cpp:209:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 3f5455e80..3c5044056 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:210:0 +// src/engine/editor.cpp:212:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 62213a547..5e4ac20df 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:96:0 +// src/engine/editor.cpp:98:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 03ce3467d..638adb97a 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:198:0 +// src/engine/editor.cpp:200:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 6e11a36a3..1ff0e65ec 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:329:0 +// src/engine/editor.cpp:331:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 764bd70ea..c28b7c9e3 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:147:0 +// src/engine/editor.cpp:149:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index a27012679..85211d4e9 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:201:0 +// src/engine/editor.cpp:203:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 1985130de..5e2e39eee 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:401:0 +// src/engine/editor.cpp:403:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 8c2b2e845..208f4b437 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:419:0 +// src/engine/editor.cpp:421:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index b009295ad..030fa123d 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:195:0 +// src/engine/editor.cpp:197:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 302ffadaf..d8ddebbce 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:404:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 9402cfc77..70e8bc264 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:398:0 +// src/engine/editor.cpp:400:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 6be700bc6..909b47ce2 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:108:0 +// src/engine/editor.cpp:110:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 3313afe3e..9c8831fa7 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:338:0 +// src/engine/editor.cpp:340:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index b7886aaf6..12ee474c9 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:422:0 +// src/engine/editor.cpp:424:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 155198d54..47ff49d20 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:117:0 +// src/engine/editor.cpp:119:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 4a456af38..c49b27beb 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:120:0 +// src/engine/editor.cpp:122:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index af589b3c8..e370dd691 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:225:0 +// src/engine/editor.cpp:227:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 7461d3af7..3007d62ec 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:219:0 +// src/engine/editor.cpp:221:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index cdf49c220..a0b473a28 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:99:0 +// src/engine/editor.cpp:101:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 6fa5ced7c..1e7f399ad 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:255:0 +// src/engine/editor.cpp:257:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index b06d34111..65966c37e 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:246:0 +// src/engine/editor.cpp:248:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index e668abd01..62c68af44 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:249:0 +// src/engine/editor.cpp:251:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 6536e373f..b999b0876 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:93:0 +// src/engine/editor.cpp:95:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index a0ef026f6..704370a49 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:138:0 +// src/engine/editor.cpp:140:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 932a30199..9d722d6df 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:135:0 +// src/engine/editor.cpp:137:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 2b940128a..db7740af2 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:304:0 +// src/engine/editor.cpp:306:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 7256b23fa..edb91e499 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:298:0 +// src/engine/editor.cpp:300:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 6ad5fb5ec..98d8bc620 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:104:0 +// src/engine/editor.cpp:106:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 8795fece4..28c8fc409 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:102:0 +// src/engine/editor.cpp:104:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index c21a31bd0..97e3cbf7f 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:295:0 +// src/engine/editor.cpp:297:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 792661d54..cd9a50c3b 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:270:0 +// src/engine/editor.cpp:272:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index d2cf954d2..389f960ad 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:129:0 +// src/engine/editor.cpp:131:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 14ea8646f..f47d52497 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:114:0 +// src/engine/editor.cpp:116:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index bc5bee664..0531cb61b 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:316:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 0908975ed..733db8fac 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:243:0 +// src/engine/editor.cpp:245:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index ac2f751b9..c6c111219 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:428:0 +// src/engine/editor.cpp:430:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index a67512f59..f495e8d08 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:183:0 +// src/engine/editor.cpp:185:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index b510e157e..4a8b72b28 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:180:0 +// src/engine/editor.cpp:182:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 1be8d81f3..e925c7ae1 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:273:0 +// src/engine/editor.cpp:275:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index a92c0f618..6337eb303 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:204:0 +// src/engine/editor.cpp:206:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index e95b4dc96..30b5fb815 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:434:0 +// src/engine/editor.cpp:436:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 6dc95e5e7..5c65c91ae 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:437:0 +// src/engine/editor.cpp:439:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 925c18a91..ed22b8fc7 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:106:0 +// src/engine/editor.cpp:108:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index de61c619e..4815eeaaf 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:186:0 +// src/engine/editor.cpp:188:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 9ab495e5c..ebe3e59de 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:522:0 +// src/engine/world_chunk.h:516:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index 338e3511b..9526125d8 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:519:0 +// src/engine/world_chunk.h:513:0 struct standing_spot_stream_chunk { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index a9bb56d59..9849e0d8d 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:486:0 +// src/engine/world_chunk.h:480:0 struct maybe_standing_spot { diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index 296bf0448..4b3b3a786 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -34,7 +34,17 @@ Serialize(u8_cursor_block_array *Bytes, world_edit_brush *BaseElement, umm Count RangeIterator_t(umm, ElementIndex, Count) { world_edit_brush *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum + { + umm ThisCount = (256) + 1; + + Result &= Serialize(Bytes, Element->NameBuf, ThisCount); + } + + + + + + Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum @@ -74,7 +84,17 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_brush *Element, memory_arena *Memory) { b32 Result = True; - Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); + { + umm Count = (256) + 1; + + Result &= Deserialize(Bytes, Element->NameBuf, Memory, Count); + } + + + + + + Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); diff --git a/generated/serialize_struct_level_header.h b/generated/serialize_struct_level_header.h index 3705d4a3f..2752474e7 100644 --- a/generated/serialize_struct_level_header.h +++ b/generated/serialize_struct_level_header.h @@ -34,14 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, level_header *BaseElement, umm Count = 1 RangeIterator_t(umm, ElementIndex, Count) { level_header *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->EntityCount); // default + Result &= Serialize(Bytes, &Element->EditCount); // default - Result &= Serialize(Bytes, &Element->WorldFlags); // default + Result &= Serialize(Bytes, &Element->EntityCount); // default diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 2d1222569..0077ac70b 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:314:0 +// src/engine/editor.cpp:316:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index bb650ca1a..aae3d6faa 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:176:0 +// src/engine/editor.cpp:178:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 394fee471..150b06a6a 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:170:0 +// src/engine/editor.cpp:172:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index d1ac4489c..e725c158a 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:167:0 +// src/engine/editor.cpp:169:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index f9e50b0ce..59b92dbc8 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:173:0 +// src/engine/editor.cpp:175:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 6abbce898..8720cd22a 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -184,13 +184,13 @@ Bonsai_FrameBegin(engine_resources *Resources) ray *Ray = &Resources->MaybeMouseRay.Ray; - DEBUG_VALUE_r32(Ray->Origin.x); - DEBUG_VALUE_r32(Ray->Origin.y); - DEBUG_VALUE_r32(Ray->Origin.z); + /* DEBUG_VALUE_r32(Ray->Origin.x); */ + /* DEBUG_VALUE_r32(Ray->Origin.y); */ + /* DEBUG_VALUE_r32(Ray->Origin.z); */ - DEBUG_VALUE_r32(Ray->Dir.x); - DEBUG_VALUE_r32(Ray->Dir.y); - DEBUG_VALUE_r32(Ray->Dir.z); + /* DEBUG_VALUE_r32(Ray->Dir.x); */ + /* DEBUG_VALUE_r32(Ray->Dir.y); */ + /* DEBUG_VALUE_r32(Ray->Dir.z); */ Resources->MousedOverVoxel = MousePickVoxel(Resources, Ray); Resources->HoverEntity = GetClosestEntityIntersectingRay(World, EntityTable, &Resources->MaybeMouseRay.Ray); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index be36ab866..028d4896c 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -31,6 +31,8 @@ InitEditor(level_editor *Editor) Editor->WorldEdits = WorldEditBlockArray(Editor->Memory); Editor->AssetThumbnails = AssetThumbnailBlockArray(Editor->Memory); + Editor->LoadedBrushes = Allocate_world_edit_brush_hashtable(128, Editor->Memory); + /* RangeIterator(LayerIndex, MAX_BRUSH_LAYERS) */ /* { */ /* Editor->LayeredBrush.LayerPreviews[LayerIndex].Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); */ @@ -2273,39 +2275,13 @@ CheckSettingsChanged(world_edit *Edit) } link_internal void -UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memory_arena *TempMemory) +ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *TempMemory) { UNPACK_ENGINE_RESOURCES(Engine); - - // First, gather the currently edited nodes and remove the edit - { - octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); - GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Edit->Region, &Nodes); - - IterateOver(&Nodes, Node, NodeIndex) - { - AcquireFutex(&Node->Lock); - auto Index = Find(&Node->Edits, Edit); - Assert(IsValid(&Index)); // There shouldn't be a node that doesn't contain the edit - RemoveUnordered(&Node->Edits, Index); - - // Need to reinitialize chunks that no longer have the edit so that it - // doesn't stay intact in chunks that lose it entirely - Node->Dirty = True;; - ReleaseFutex(&Node->Lock); - } - } - - // - // Update the edit - // - - Editor->CurrentEdit->Region = Region; // TODO(Jesse): I feel like this should be happening more automagically, but .. - // Gather newly overlapping nodes and add the edit { octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); - GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Region, &Nodes); + GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Edit->Region, &Nodes); IterateOver(&Nodes, Node, NodeIndex) { @@ -2336,6 +2312,39 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo } } +link_internal void +UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memory_arena *TempMemory) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + // First, gather the currently edited nodes and remove the edit + { + octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); + GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Edit->Region, &Nodes); + + IterateOver(&Nodes, Node, NodeIndex) + { + AcquireFutex(&Node->Lock); + auto Index = Find(&Node->Edits, Edit); + Assert(IsValid(&Index)); // There shouldn't be a node that doesn't contain the edit + RemoveUnordered(&Node->Edits, Index); + + // Need to reinitialize chunks that no longer have the edit so that it + // doesn't stay intact in chunks that lose it entirely + Node->Dirty = True;; + ReleaseFutex(&Node->Lock); + } + } + + // + // Update the edit + // + + Editor->CurrentEdit->Region = Region; // TODO(Jesse): I feel like this should be happening more automagically, but .. + + ApplyEditToOctree(Engine, Edit, TempMemory); +} + link_internal void DoWorldEditor(engine_resources *Engine) { @@ -2773,11 +2782,6 @@ DoWorldEditor(engine_resources *Engine) local_persist window_layout BrushSettingsWindow = WindowLayout("All Brushes", WindowLayoutFlag_Align_BottomRight); PushWindowStart(Ui, &BrushSettingsWindow); - if (Editor->LoadedBrushes.Elements == 0) - { - Editor->LoadedBrushes = Allocate_world_edit_brush_hashtable(128, Editor->Memory); - } - if (Button(Ui, CSz("New"), UiId(&BrushSettingsWindow, "brush new", 0u))) { world_edit_brush Brush = {}; @@ -2856,6 +2860,7 @@ DoWorldEditor(engine_resources *Engine) if (Button(Ui, FSz("(UpdateBrush)", I, NameBuf), UiId(&AllEditsWindow, "edit brush select", Edit))) { Edit->Brush = Editor->CurrentBrush; + UpdateWorldEdit(Engine, Edit, Edit->Region, GetTranArena()); } PushNewRow(Ui); @@ -2946,30 +2951,32 @@ DoLevelWindow(engine_resources *Engine) { u8_cursor_block_array OutputStream = BeginSerialization(); - level_header Header = {}; - - Header.WorldFlags = Cast(u32, World->Flags); - Header.WorldCenter = World->Center; - Header.VisibleRegion = World->VisibleRegion; - Header.Camera = *Camera; - - Header.RenderSettings = Graphics->Settings; - u32 EntityCount = 0; RangeIterator(EntityIndex, TOTAL_ENTITY_COUNT) { entity *E = EntityTable[EntityIndex]; if (Spawned(E)) { ++EntityCount; } } - Header.EntityCount = EntityCount; + level_header Header = {}; + Header.WorldCenter = World->Center; + Header.VisibleRegion = World->VisibleRegion; + Header.Camera = *Camera; + Header.RenderSettings = Graphics->Settings; + Header.EntityCount = EntityCount; + Header.EditCount = u32(TotalElements(&Editor->WorldEdits)); Serialize(&OutputStream, &Header); u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; + Ensure(Serialize(&OutputStream, &Delimeter)); - NotImplemented; -#if 0 +#if 1 + IterateOver(&Editor->WorldEdits, Edit, EditIndex) + { + Serialize(&OutputStream, Edit); + } +#else RangeIterator(HashIndex, s32(World->HashSize)) { if (world_chunk *Chunk = World->ChunkHash[HashIndex]) @@ -2990,8 +2997,7 @@ DoLevelWindow(engine_resources *Engine) } } - v3_cursor *Palette = GetColorPalette(); - Serialize(&OutputStream, Palette); + Ensure(Serialize(&OutputStream, &Delimeter)); const char *Filename = "../bonsai_levels/test.level"; if (FinalizeSerialization(&OutputStream, Filename) == False) @@ -3020,6 +3026,9 @@ DoLevelWindow(engine_resources *Engine) if (Deserialize(&LevelBytes, &LevelHeader, Thread->PermMemory)) { + u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; + Ensure(Read_u64(&LevelBytes) == Delimeter); + { engine_settings *EngineSettings = &GetEngineResources()->Settings; LevelHeader.RenderSettings.ApplicationResolution = V2(GetApplicationResolution(EngineSettings)); @@ -3035,50 +3044,32 @@ DoLevelWindow(engine_resources *Engine) SoftResetEngine(Engine); - /* World->Flags = Cast(world_flag, LevelHeader.WorldFlags); */ World->Center = LevelHeader.WorldCenter; - maybe_bonsai_type_info MaybeLevelHeaderTypeInfo = GetByName(&Global_SerializeTypeTable, CSz("level_header")); - if (MaybeLevelHeaderTypeInfo.Tag) - { - if (MaybeLevelHeaderTypeInfo.Value.Version > 2) - { - Graphics->Settings = LevelHeader.RenderSettings; - } - } - + Graphics->Settings = LevelHeader.RenderSettings; *Graphics->Camera = LevelHeader.Camera; /* World->VisibleRegion = LevelHeader.VisibleRegion; */ /* s32 ChunkCount = Cast(s32, LevelHeader.ChunkCount); */ s32 ChunkCount = 0; - NotImplemented; /* Info("ChunksFreed (%u) ChunksLoaded (%u)", ChunksFreed, ChunkCount); */ - RangeIterator(ChunkIndex, ChunkCount) + RangeIterator_t(u32, EditIndex, LevelHeader.EditCount) { - world_chunk *Chunk = GetFreeWorldChunk(World); - DeserializeChunk(&LevelBytes, Chunk, World->ChunkMemory); + world_edit DeserEdit = {}; // TODO(Jesse): Do we actually have to clear this? + Deserialize(&LevelBytes, &DeserEdit, GetTranArena()); - if (IsInsideVisibleRegion(World, Chunk->WorldP)) - { -#if 0 - if (Editor->Flags & LevelEditorFlags_RecomputeStandingSpotsOnLevelLoad) - { - Chunk->StandingSpots.At = Chunk->StandingSpots.Start; - Flags = ChunkInitFlag_ComputeStandingSpots; - } -#endif + world_edit *FinalEdit = Push(&Editor->WorldEdits, &DeserEdit); - InsertChunkIntoWorld(World, Chunk); + if (FinalEdit->Brush) + { + FinalEdit->Brush = Upsert(*FinalEdit->Brush, &Editor->LoadedBrushes, Editor->Memory); } + ApplyEditToOctree(Engine, FinalEdit, GetTranArena()); } - u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; Ensure(Read_u64(&LevelBytes) == Delimeter); -#if 1 - b32 Error = False; u32 EntityCount = LevelHeader.EntityCount; RangeIterator_t(u32, EntityIndex, EntityCount) @@ -3093,52 +3084,7 @@ DoLevelWindow(engine_resources *Engine) E->Id.Index = EntityIndex; // NOTE(Jesse): Hack.. entities got saved out with 0 indexes.. } - if (Error == False) - { - v3_cursor *Palette = GetColorPalette(); - Palette->At = Palette->Start; - Deserialize(&LevelBytes, Palette, Thread->PermMemory); - Assert(LevelBytes.At == LevelBytes.End); - - b32 NormalizePalette = False; - RangeIterator_t(umm, ColorIndex, (umm)(Palette->At-Palette->Start)) - { - v3 *C = Palette->Start+ColorIndex; - - // If any components are > 1.f we must have loaded a palette with values in the 0-255 range - if (C->E[0] > 1.f || C->E[1] > 1.f || C->E[2] > 1.f) { NormalizePalette = True; break; } - } - - if (NormalizePalette) - { - RangeIterator_t(umm, ColorIndex, (umm)(Palette->At-Palette->Start)) - { - v3 *C = Palette->Start+ColorIndex; - *C /= 255.f; - Assert (C->E[0] <= 1.f && C->E[1] <= 1.f && C->E[2] <= 1.f); - } - } - } - - - NotImplemented; -#if 0 - RangeIterator_t(u32, ChunkIndex, World->HashSize) - { - if (world_chunk *Chunk = World->ChunkHash[ChunkIndex]) - { - if (MaybeLevelHeaderTypeInfo.Value.Version < 4) - { - MarshalMagicaVoxelEncodedColors(Chunk->Voxels, Chunk->Voxels, Chunk->Dim); - } - - chunk_init_flags Flags = ChunkInitFlag_Noop; - QueueChunkForMeshRebuild(&GetEngineResources()->Stdlib.Plat.LowPriority, Chunk, Flags); - } - } -#endif - -#endif + Ensure(Read_u64(&LevelBytes) == Delimeter); Assert(ThreadLocal_ThreadIndex == 0); if (Engine->GameApi.OnLibraryLoad) { Engine->GameApi.OnLibraryLoad(Engine, GetThreadLocalState(ThreadLocal_ThreadIndex)); } diff --git a/src/engine/editor.h b/src/engine/editor.h index 0dfd83979..f2d3b5386 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1108,7 +1108,7 @@ struct world_edit_brush // NOTE(Jesse): This is so we can just copy the name of the brush in here and // not fuck around with allocating a single string when we load these in. #define NameBuf_Len (256) - char NameBuf[NameBuf_Len+1]; poof(@no_serialize @ui_text_box) + char NameBuf[NameBuf_Len+1]; poof(@ui_text_box) /* world_edit_shape Shape; */ world_edit_blend_mode Mode; diff --git a/src/engine/level.h b/src/engine/level.h index 5f0ca610a..f66cf5a90 100644 --- a/src/engine/level.h +++ b/src/engine/level.h @@ -2,10 +2,10 @@ struct level_header { + u32 EditCount; u32 EntityCount; // World Params - u32 WorldFlags; // world_flag v3i WorldCenter; v3i VisibleRegion; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 3fdd5c202..3f0257d0c 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -564,53 +564,35 @@ InitTransparencyRenderGroup(render_settings *Settings, transparency_render_group #define RUNTIME_SETTINGS__GRAPHICS_SETTINGS_PATH "runtime_settings/graphics_settings.bin" -link_internal b32 -GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *GraphicsMemory) +link_internal void +DefaultRenderSettings(render_settings *Settings, engine_settings *EngineSettings, r32 GameCameraFOV) { - Assert(Result->Initialized == False); - - Init_Global_QuadVertexBuffer(); - - Result->Memory = GraphicsMemory; - - StandardCamera(&Result->GameCamera, 100000.f, 500.f); - StandardCamera(&Result->DebugCamera, 100000.f, 500.f); - Result->Camera = &Result->GameCamera; + Settings->ToneMappingType = ToneMappingType_Exposure; - if (FileExists(RUNTIME_SETTINGS__GRAPHICS_SETTINGS_PATH)) - { - u8_cursor Bytes = BeginDeserialization(CSz(RUNTIME_SETTINGS__GRAPHICS_SETTINGS_PATH), GetTranArena()); - Deserialize(&Bytes, &Result->Settings, GetTranArena()); - FinalizeDeserialization(&Bytes); - } - else - { - Result->Settings.ToneMappingType = ToneMappingType_Exposure; - - Result->Settings.UseSsao = True; + Settings->UseSsao = True; - Result->Settings.BravoilMyersOIT = True; - Result->Settings.BravoilMcGuireOIT = True; + Settings->BravoilMyersOIT = True; + Settings->BravoilMcGuireOIT = True; - /* Result->Settings.UseShadowMapping = True; */ - Result->Settings.UseLightingBloom = True; + /* Settings->UseShadowMapping = True; */ + Settings->UseLightingBloom = True; - /* Result->Settings.DrawMajorGrid = True; */ - /* Result->Settings.DrawMinorGrid = True; */ - Result->Settings.MajorGridDim = 16.f; + /* Settings->DrawMajorGrid = True; */ + /* Settings->DrawMinorGrid = True; */ + Settings->MajorGridDim = 16.f; - Result->Settings.ApplicationResolution = V2(GetApplicationResolution(EngineSettings)); - Result->Settings.ShadowMapResolution = V2(GetShadowMapResolution(EngineSettings)); - Result->Settings.LuminanceMapResolution = V2(GetLuminanceMapResolution(EngineSettings)); + Settings->ApplicationResolution = V2(GetApplicationResolution(EngineSettings)); + Settings->ShadowMapResolution = V2(GetShadowMapResolution(EngineSettings)); + Settings->LuminanceMapResolution = V2(GetLuminanceMapResolution(EngineSettings)); - Result->Settings.iApplicationResolution = GetApplicationResolution(EngineSettings); - Result->Settings.iShadowMapResolution = GetShadowMapResolution(EngineSettings); - Result->Settings.iLuminanceMapResolution = GetLuminanceMapResolution(EngineSettings); + Settings->iApplicationResolution = GetApplicationResolution(EngineSettings); + Settings->iShadowMapResolution = GetShadowMapResolution(EngineSettings); + Settings->iLuminanceMapResolution = GetLuminanceMapResolution(EngineSettings); - Result->Settings.GameCameraFOV = Result->GameCamera.Frust.FOV; + Settings->GameCameraFOV = GameCameraFOV; { - lighting_settings *Lighting = &Result->Settings.Lighting; + lighting_settings *Lighting = &Settings->Lighting; Lighting->tDay = 0.75f; @@ -626,6 +608,35 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Lighting->DawnIntensity = 0.70f; Lighting->DuskIntensity = 0.50f; } +} + +link_internal b32 +GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *GraphicsMemory) +{ + Assert(Result->Initialized == False); + + Init_Global_QuadVertexBuffer(); + + Result->Memory = GraphicsMemory; + + StandardCamera(&Result->GameCamera, 100000.f, 500.f); + StandardCamera(&Result->DebugCamera, 100000.f, 500.f); + Result->Camera = &Result->GameCamera; + + if (FileExists(RUNTIME_SETTINGS__GRAPHICS_SETTINGS_PATH)) + { + u8_cursor Bytes = BeginDeserialization(CSz(RUNTIME_SETTINGS__GRAPHICS_SETTINGS_PATH), GetTranArena()); + if (Deserialize(&Bytes, &Result->Settings, GetTranArena()) == False) + { + Result->Settings = {}; + Remove(CSz(RUNTIME_SETTINGS__GRAPHICS_SETTINGS_PATH)); + DefaultRenderSettings(&Result->Settings, EngineSettings, Result->Camera->Frust.FOV); + } + FinalizeDeserialization(&Bytes); + } + else + { + DefaultRenderSettings(&Result->Settings, EngineSettings, Result->Camera->Frust.FOV); } Result->PrevSettings = Result->Settings; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index af1205504..df4589fdb 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -315,75 +315,78 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TIMED_NAMED_BLOCK(WorldEditDrawCall); layered_brush *Brush = &Edit->Brush->Layered; - RangeIterator(LayerIndex, Brush->LayerCount) + if (Brush) // NOTE(Jesse): Don't necessarily have to have a brush if we created the edit before we created a brush. { - GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[PingPongIndex].ID); + RangeIterator(LayerIndex, Brush->LayerCount) + { + GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[PingPongIndex].ID); - BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 0); + BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 0); - brush_layer *Layer = Brush->Layers + LayerIndex; + brush_layer *Layer = Brush->Layers + LayerIndex; - { - v3 RGBColor = HSVtoRGB(Layer->Settings.HSVColor); - BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); - } + { + v3 RGBColor = HSVtoRGB(Layer->Settings.HSVColor); + BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); + } - BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.Mode); - BindUniformByName(&WorldEditRC->Program, "Modifiers", Layer->Settings.Modifier); - BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); + BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.Mode); + BindUniformByName(&WorldEditRC->Program, "Modifiers", Layer->Settings.Modifier); + BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); - switch (Layer->Settings.Type) - { - case BrushLayerType_Noise: + switch (Layer->Settings.Type) { - noise_layer *Noise = &Layer->Settings.Noise; - - switch (Noise->Type) + case BrushLayerType_Noise: { - case NoiseType_Perlin: + noise_layer *Noise = &Layer->Settings.Noise; + + switch (Noise->Type) { - perlin_noise_params *Perlin = &Noise->Perlin; - BindUniformByName(&WorldEditRC->Program, "Threshold", Perlin->Threshold); - BindUniformByName(&WorldEditRC->Program, "Period", &Perlin->Period); - BindUniformByName(&WorldEditRC->Program, "Amplitude", Perlin->Amplitude); - } break; + case NoiseType_Perlin: + { + perlin_noise_params *Perlin = &Noise->Perlin; + BindUniformByName(&WorldEditRC->Program, "Threshold", Perlin->Threshold); + BindUniformByName(&WorldEditRC->Program, "Period", &Perlin->Period); + BindUniformByName(&WorldEditRC->Program, "Amplitude", Perlin->Amplitude); + } break; - case NoiseType_Voronoi: - {} break; + case NoiseType_Voronoi: + {} break; - case NoiseType_White: - {} break; - } + case NoiseType_White: + {} break; + } - } break; + } break; - case BrushLayerType_Shape: - { - NotImplemented; - } break; + case BrushLayerType_Shape: + { + NotImplemented; + } break; + } + + rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); + v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); + + // NOTE(Jesse): Must call bind explicitly because the driver doesn't cache + // these values otherwise .. it just reads then whenever it wants through + // the pointer.. + v3 Mn = SimEditRect.Min - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &Mn); + AssertNoGlErrors; + + v3 Mx = SimEditRect.Max - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); + AssertNoGlErrors; + + /* gpu_timer Timer = StartGpuTimer(); */ + RenderQuad(); + /* EndGpuTimer(&Timer); */ + /* Push(&Graphics->GpuTimers, &Timer); */ + + InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; + PingPongIndex = (PingPongIndex + 1) & 1; } - - rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); - v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); - - // NOTE(Jesse): Must call bind explicitly because the driver doesn't cache - // these values otherwise .. it just reads then whenever it wants through - // the pointer.. - v3 Mn = SimEditRect.Min - SimChunkMin; - BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &Mn); - AssertNoGlErrors; - - v3 Mx = SimEditRect.Max - SimChunkMin; - BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); - AssertNoGlErrors; - - /* gpu_timer Timer = StartGpuTimer(); */ - RenderQuad(); - /* EndGpuTimer(&Timer); */ - /* Push(&Graphics->GpuTimers, &Timer); */ - - InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; - PingPongIndex = (PingPongIndex + 1) & 1; } AssertNoGlErrors; diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index e8a727f46..533621701 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -156,21 +156,9 @@ SoftResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag CancelAllWorkQueueJobs(Engine); - // TODO(Jesse): Free octree here. - NotImplemented; -#if 0 - u32 ChunksFreed = 0; - RangeIterator(HashIndex, s32(World->HashSize)) - { - if (world_chunk *Chunk = World->ChunkHash[HashIndex]) - { - Chunk->Flags = Chunk_VoxelsInitialized; - FreeWorldChunk(Engine, Chunk); - World->ChunkHash[HashIndex] = 0; - ++ChunksFreed; - } - } -#endif + FreeOctreeChildren(Engine, &World->Root); + if (World->Root.Chunk) { FreeWorldChunk(Engine, World->Root.Chunk); } + InitOctreeNode(World, &World->Root, {}, World->VisibleRegion); RangeIterator_t(u32, EntityIndex, TOTAL_ENTITY_COUNT) { diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 6d9c8becc..5c20871c6 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -329,6 +329,7 @@ ContainsCameraGhost(world *World, entity **EntityTable, octree_node *Node, camer link_internal void InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks) { + *Node = {}; Node->Type = OctreeNodeType_Leaf; Node->WorldP = WorldP; Node->Resolution = DimInChunks; diff --git a/src/engine/world.h b/src/engine/world.h index 80310b9dc..d73793f61 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -86,7 +86,6 @@ struct world v3i ChunkDim; poof(@ui_skip) memory_arena *ChunkMemory; poof(@ui_skip) - world_flag Flags; poof(@ui_skip) }; diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index cf375d729..4e8f7aea2 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -471,12 +471,6 @@ Volume(world_chunk* Chunk) return Result; } -enum world_flag -{ - WorldFlag_noop, - /* WorldFlag_WorldCenterFollowsCameraTarget = (1 << 0), */ -}; - struct standing_spot { b32 CanStand; From ef17288441a1ff6e112636e614e5fd130cecf11d Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 18 Feb 2025 17:20:12 -0700 Subject: [PATCH 175/421] Remove SoftResetEngine in favor of HardResetEngine and fix NoiseReadbackJobs not getting cleared --- jesse.make.sh | 2 +- src/engine/editor.cpp | 5 +++-- src/engine/editor.h | 2 +- src/engine/resources.cpp | 39 ++++++++++++++++++++++++++++++++------ src/engine/world.cpp | 31 ++++++++++++++++++++++-------- src/engine/world.h | 2 +- src/engine/world_chunk.cpp | 17 ++++++++++++++++- 7 files changed, 78 insertions(+), 20 deletions(-) diff --git a/jesse.make.sh b/jesse.make.sh index 81197b57f..4a47e50e2 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 028d4896c..86aaee5b1 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -73,8 +73,8 @@ HardResetEditor(level_editor *Editor) VaporizeArena(Editor->Memory); // NOTE(Jesse): There are some default values in noise params that we want to reset to - *Editor = {}; /* Clear(Editor); */ + *Editor = {}; b32 Result = InitEditor(Editor); return Result; @@ -3042,7 +3042,8 @@ DoLevelWindow(engine_resources *Engine) SignalAndWaitForWorkers(&Plat->WorkerThreadsSuspendFutex); - SoftResetEngine(Engine); + /* SoftResetEngine(Engine); */ + HardResetEngine(Engine); World->Center = LevelHeader.WorldCenter; diff --git a/src/engine/editor.h b/src/engine/editor.h index f2d3b5386..9668c0c6f 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1141,7 +1141,7 @@ poof(hashtable(world_edit_brush)) struct world_edit { - rect3cp Region; + rect3cp Region; // TODO(Jesse): Rename to bounds world_edit_brush *Brush; }; diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 533621701..cf20372dd 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -125,12 +125,18 @@ CancelAllWorkQueueJobs(engine_resources *Engine) CancelAllWorkQueueJobs(Plat, &Plat->HighPriority); CancelAllWorkQueueJobs(Plat, &Plat->LowPriority); + CancelAllWorkQueueJobs(Plat, &Plat->WorldUpdateQ); - // NOTE(Jesse): The RendeQ flushes before it suspends, and at the time of this - // writing the application depends on this behavior. Some render queue jobs - // have knowledge of who to call next (because we don't have a way of specifying - // the next next job when we submit one). This makes it difficult to + // NOTE(Jesse): The RendeQ flushes before it suspends, and at the time of + // this writing the application depends on this behavior. Some render queue + // jobs have knowledge of who to call next (because we don't have a way of + // specifying the next next job when we submit one). This makes it difficult + // to free resources that are only known to the jobs.. CancelAllWorkQueueJobs(Plat, &Plat->RenderQ); + + Assert(QueueIsEmpty(&Plat->HighPriority)); + Assert(QueueIsEmpty(&Plat->LowPriority)); + Assert(QueueIsEmpty(&Plat->WorldUpdateQ)); Assert(QueueIsEmpty(&Plat->RenderQ)); } @@ -149,6 +155,7 @@ HardResetAssets(engine_resources *Engine) // NOTE(Jesse): This function soft-resets the engine to a state similar to that // at which it was when the game init routine was called. This is useful when // resetting the game state. For a more invasive +#if 0 link_internal void SoftResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag_None) { @@ -158,7 +165,7 @@ SoftResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag FreeOctreeChildren(Engine, &World->Root); if (World->Root.Chunk) { FreeWorldChunk(Engine, World->Root.Chunk); } - InitOctreeNode(World, &World->Root, {}, World->VisibleRegion); + InitOctreeNode(World, &World->Root, {}, World->VisibleRegion, {}); RangeIterator_t(u32, EntityIndex, TOTAL_ENTITY_COUNT) { @@ -168,6 +175,7 @@ SoftResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag HardResetAssets(Engine); } +#endif @@ -193,6 +201,11 @@ link_internal void HardResetWorld(engine_resources *Engine) { world *World = Engine->World; + + /* FreeOctreeChildren(Engine, &World->Root); */ + /* if (World->Root.Chunk) { FreeWorldChunk(Engine, World->Root.Chunk); } */ + /* InitOctreeNode(World, &World->Root, {}, World->VisibleRegion, {}); */ + VaporizeArena(World->ChunkMemory); VaporizeArena(World->OctreeMemory); @@ -205,13 +218,17 @@ HardResetWorld(engine_resources *Engine) } link_internal void -HardResetEngine(engine_resources *Engine) +HardResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag_None) { UNPACK_ENGINE_RESOURCES(Engine); + + Info("Hard Reset Begin"); + CancelAllWorkQueueJobs(Engine); RangeIterator_t(u32, EntityIndex, TOTAL_ENTITY_COUNT) { + if ( (Flags&HardResetFlag_NoResetCamera) && Graphics->GameCamera.GhostId.Index == EntityIndex ) { continue; } Unspawn(EntityTable[EntityIndex]); } @@ -223,10 +240,20 @@ HardResetEngine(engine_resources *Engine) HardResetWorld(Engine); // TODO(Jesse)(leak): This leaks the texture handles; make a HardResetEngineDebug() + Leak("?"); VaporizeArena(Engine->EngineDebug.Memory); Engine->EngineDebug = {}; Engine->EngineDebug.Memory = AllocateArena(); HardResetAssets(Engine); + + umm ReadbackJobCount = TotalElements(&Graphics->NoiseReadbackJobs); + RangeIterator_t(umm, JobIndex, ReadbackJobCount) + { + dummy_work_queue_entry_build_chunk_mesh_block_array_index I = ZerothIndex(&Graphics->NoiseReadbackJobs); + RemoveUnordered(&Graphics->NoiseReadbackJobs, I); + } + + Info("Hard Reset End"); } diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 5c20871c6..8b6a7d885 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -13,7 +13,7 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) memory_arena *OctreeMemory = AllocateArena(Megabytes(8)); World->OctreeMemory = OctreeMemory; - DEBUG_REGISTER_ARENA(World->ChunkMemory, 0); + DEBUG_REGISTER_ARENA(World->OctreeMemory, 0); /* World->HashSize = (u32)(Volume(VisibleRegion)*4); */ /* World->HashSize = WorldHashSize; */ @@ -30,20 +30,20 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) Assert(WorldChunkDim.y == WorldChunkDim.z); - InitOctreeNode(World, &World->Root, {}, VisibleRegion); - World->Root.Chunk = AllocateWorldChunk( {}, WorldChunkDim, VisibleRegion, World->ChunkMemory); - auto Engine = GetEngineResources(); - World->OctreeNodeFreelist.Memory = World->OctreeMemory; World->ChunkDim = WorldChunkDim; World->VisibleRegion = VisibleRegion; World->Center = Center; + // NOTE(Jesse): Has to come after World->ChunkDim is set + InitOctreeNode(World, &World->Root, {}, VisibleRegion, {}); + World->Root.Chunk = AllocateWorldChunk( {}, WorldChunkDim, VisibleRegion, World->ChunkMemory); + // NOTE(Jesse): We can use an unallocated queue here because we're not actually // gonna do anything with the results.. we just want to initialize the tree octree_node_priority_queue Queue = {}; - SplitOctreeNode_Recursive(Engine, &Queue, &World->Root, 0, World->OctreeMemory); + SplitOctreeNode_Recursive(GetEngineResources(), &Queue, &World->Root, 0, World->OctreeMemory); return World; } @@ -327,13 +327,27 @@ ContainsCameraGhost(world *World, entity **EntityTable, octree_node *Node, camer link_internal void -InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks) +InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks, world_edit_ptr_paged_list *PotentialEdits) { *Node = {}; Node->Type = OctreeNodeType_Leaf; Node->WorldP = WorldP; Node->Resolution = DimInChunks; + rect3cp NodeBounds = GetBoundingBox(World, Node); + + if (PotentialEdits) + { + Node->Edits.Memory = PotentialEdits->Memory; + IterateOver(PotentialEdits, Edit, EditIndex) + { + if (Intersect(World, &NodeBounds, &Edit->Region)) + { + Push(&Node->Edits, &Edit); + } + } + } + Assert(DimInChunks > V3i(0)); } @@ -812,7 +826,8 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue octree_node *Child = GetOrAllocate(&World->OctreeNodeFreelist); NodeToSplit->Children[Index] = Child; - InitOctreeNode(World, Child, NodeToSplit->WorldP + RelWorldP, ChildDimInChunks); + + InitOctreeNode(World, Child, NodeToSplit->WorldP + RelWorldP, ChildDimInChunks, &NodeToSplit->Edits); } } diff --git a/src/engine/world.h b/src/engine/world.h index d73793f61..778a0fe0e 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -250,7 +250,7 @@ link_internal world_chunk_ptr_buffer GatherChunksOverlappingArea(world *World, rect3cp Region, memory_arena *Memory); link_internal void -InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks); +InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks, world_edit_ptr_paged_list *PotentialEdits); link_internal world * AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 09887fa7a..b4574e649 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3499,11 +3499,26 @@ inline void QueueChunkForInit(work_queue *Queue, octree_node *Node, world_chunk_mesh_bitfield MeshBit) { TIMED_FUNCTION(); + + Assert(Node->Chunk); + Assert(Node->Chunk->Dim.x); Assert( NotSet(Node->Chunk->Flags, Chunk_Queued) ); ++TotalChunksQueued; -/* DebugLine("Queuing Chunk (%p)(%d, %d, %d)", Chunk, Chunk->WorldP.x, Chunk->WorldP.y, Chunk->WorldP.z); */ + { + Assert(Node->Chunk->Dim.x == 64); + DebugLine("Queuing Chunk (%p)(%d) WorldP(%d, %d, %d) DimInChunks(%d, %d, %d) Dim(%d, %d, %d)", Node->Chunk, Node->Chunk->Flags, + Node->Chunk->WorldP.x, + Node->Chunk->WorldP.y, + Node->Chunk->WorldP.z, + Node->Chunk->DimInChunks.x, + Node->Chunk->DimInChunks.y, + Node->Chunk->DimInChunks.z, + Node->Chunk->Dim.x, + Node->Chunk->Dim.y, + Node->Chunk->Dim.z); + } #if 0 work_queue_entry Entry = {}; From 144dc974cbe67fa4be8f0b77c9f731cdab0741a3 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 18 Feb 2025 18:55:55 -0700 Subject: [PATCH 176/421] Move a couple helper functions into util.h --- .../block_array_c_asset_thumbnail_688856411.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- .../do_editor_ui_for_compound_type_struct.h | 117 ++++++++++++++++++ ...r_ui_for_compound_type_struct_world_edit.h | 68 ++++++++++ ...or_compound_type_struct_world_edit_brush.h | 117 ++++++++++++++++++ .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- jesse.make.sh | 2 +- src/engine/editor.cpp | 32 ++--- src/engine/engine.h | 1 + src/engine/util.h | 22 ++++ 96 files changed, 423 insertions(+), 114 deletions(-) create mode 100644 generated/do_editor_ui_for_compound_type_struct.h create mode 100644 generated/do_editor_ui_for_compound_type_struct_world_edit.h create mode 100644 generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h create mode 100644 src/engine/util.h diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 08a5475a1..019662c03 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:83:0 +// src/engine/editor.cpp:60:0 diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 73ffc69dd..8f04be50e 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:218:0 +// src/engine/editor.cpp:195:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 1dbd4354d..e6d9b86ff 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:321:0 +// src/engine/editor.cpp:298:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index e34c9c8d8..bea8bc85f 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:313:0 +// src/engine/editor.cpp:290:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index dab2f5f1d..d97141ff1 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:343:0 +// src/engine/editor.cpp:320:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 71962a4e0..cd73e365c 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:224:0 +// src/engine/editor.cpp:201:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index b473bfbab..25cbcd26f 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:157:0 +// src/engine/editor.cpp:134:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 7c3e3e7d2..a1002862d 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:352:0 +// src/engine/editor.cpp:329:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index fd14bc9bb..d2f64067e 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:112:0 +// src/engine/editor.cpp:89:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 5ff9bec0b..340b1786b 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:337:0 +// src/engine/editor.cpp:314:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index b4d05aaad..d23fdcf0c 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:254:0 +// src/engine/editor.cpp:231:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index f47c9ce2c..27c8b5973 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:346:0 +// src/engine/editor.cpp:323:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index e0cdd03c7..60b0bee22 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:324:0 +// src/engine/editor.cpp:301:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 62b770056..45849b6a7 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:153:0 +// src/engine/editor.cpp:130:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 5b8e13efe..1e9704438 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:427:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 00e2ca735..c6cc15879 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:449:0 +// src/engine/editor.cpp:431:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index bd886bf57..08560f744 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:445:0 +// src/engine/editor.cpp:427:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index a5aadde32..3ce666f3d 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:293:0 +// src/engine/editor.cpp:270:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 4faae65c4..571b75347 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:290:0 +// src/engine/editor.cpp:267:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index f8cbcfcda..3683411c9 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:327:0 +// src/engine/editor.cpp:304:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 19e5c5d62..8b3371f50 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:278:0 +// src/engine/editor.cpp:255:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index d45c1e3d0..e47a53660 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:334:0 +// src/engine/editor.cpp:311:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 6e2921179..a03308f1f 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:415:0 +// src/engine/editor.cpp:397:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index b8272b693..33dabe036 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:391:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index f426f5367..0d80b3791 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:260:0 +// src/engine/editor.cpp:237:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 3cca3b3ac..c0060e06e 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:263:0 +// src/engine/editor.cpp:240:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 406cafa0e..4c4879abf 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:418:0 +// src/engine/editor.cpp:400:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 81f8f6eed..3de6eb6d9 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:442:0 +// src/engine/editor.cpp:424:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 3e0e894a1..2cee38651 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:146:0 +// src/engine/editor.cpp:123:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 974e834bb..979a6fecb 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:143:0 +// src/engine/editor.cpp:120:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 42e8d72df..e09f07d3f 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:215:0 +// src/engine/editor.cpp:192:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 6c75a5d3e..cf40ff0ea 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:355:0 +// src/engine/editor.cpp:332:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 11be66365..52867c32d 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:433:0 +// src/engine/editor.cpp:415:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 68b4a9665..f1f272a81 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:412:0 +// src/engine/editor.cpp:394:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index c7d0e3c29..53e08d225 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:194:0 +// src/engine/editor.cpp:171:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index b4f4a9404..9ed93283a 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:266:0 +// src/engine/editor.cpp:243:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index ad5ae6c02..9e972f3ea 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:269:0 +// src/engine/editor.cpp:246:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 4c273d6e3..805eb8e4c 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:349:0 +// src/engine/editor.cpp:326:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 4d17192e2..86eb259e8 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:303:0 +// src/engine/editor.cpp:280:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index e4b396dba..fd969f392 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:209:0 +// src/engine/editor.cpp:186:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 3c5044056..fca421c1c 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:212:0 +// src/engine/editor.cpp:189:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 5e4ac20df..6dfc79099 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:98:0 +// src/engine/editor.cpp:75:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 638adb97a..b7beefd3b 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:200:0 +// src/engine/editor.cpp:177:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 1ff0e65ec..2e709d258 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:331:0 +// src/engine/editor.cpp:308:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index c28b7c9e3..5b793a9cf 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:149:0 +// src/engine/editor.cpp:126:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 85211d4e9..e35cbfc50 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:203:0 +// src/engine/editor.cpp:180:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 5e2e39eee..e2f2fdeed 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:403:0 +// src/engine/editor.cpp:385:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 208f4b437..2c6033aa4 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:421:0 +// src/engine/editor.cpp:403:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 030fa123d..0cb8f3152 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:197:0 +// src/engine/editor.cpp:174:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index d8ddebbce..25141ee87 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:388:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 70e8bc264..ddbb31b66 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:400:0 +// src/engine/editor.cpp:382:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 909b47ce2..d7e651149 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:110:0 +// src/engine/editor.cpp:87:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct.h b/generated/do_editor_ui_for_compound_type_struct.h new file mode 100644 index 000000000..7c731ebb2 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_struct.h @@ -0,0 +1,117 @@ +// src/engine/editor.cpp:360:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_brush", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + if (ToggleButton(Ui, CSz("v NameBuf[(256) + 1]"), CSz("> NameBuf[(256) + 1]"), UiId(Window, "toggle world_edit_brush char NameBuf", Element->NameBuf), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, (256) + 1) + { + DoEditorUi(Ui, Window, Element->NameBuf+ArrayIndex, FSz("NameBuf[%d]", ArrayIndex), Params); + + PushNewRow(Ui); + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_blend_mode*, &Element->Mode), + CSz("Mode"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_blend_mode_modifier*, &Element->Modifier), + CSz("Modifier"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->Ordinal), + CSz("Ordinal"), + Params + ); + + + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(layered_brush*, &Element->Layered), + CSz("Layered"), + Params + ); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h new file mode 100644 index 000000000..43309f76d --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -0,0 +1,68 @@ +// src/engine/editor.cpp:338:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(rect3cp*, &Element->Region), + CSz("Region"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_brush*, Element->Brush), + CSz("Brush"), + Params + ); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h new file mode 100644 index 000000000..c5ab3a54f --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -0,0 +1,117 @@ +// src/engine/editor.cpp:335:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_brush", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + if (ToggleButton(Ui, CSz("v NameBuf[(256) + 1]"), CSz("> NameBuf[(256) + 1]"), UiId(Window, "toggle world_edit_brush char NameBuf", Element->NameBuf), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, (256) + 1) + { + DoEditorUi(Ui, Window, Element->NameBuf+ArrayIndex, FSz("NameBuf[%d]", ArrayIndex), Params); + + PushNewRow(Ui); + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_blend_mode*, &Element->Mode), + CSz("Mode"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_blend_mode_modifier*, &Element->Modifier), + CSz("Modifier"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->Ordinal), + CSz("Ordinal"), + Params + ); + + + + + + + + PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(layered_brush*, &Element->Layered), + CSz("Layered"), + Params + ); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 9c8831fa7..17ecdb193 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:340:0 +// src/engine/editor.cpp:317:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 12ee474c9..8493ab0e8 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:424:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 47ff49d20..f3a1dd59a 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:119:0 +// src/engine/editor.cpp:96:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index c49b27beb..79c9f60e7 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:122:0 +// src/engine/editor.cpp:99:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index e370dd691..ba11bc906 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:227:0 +// src/engine/editor.cpp:204:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 3007d62ec..d8ca52d55 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:221:0 +// src/engine/editor.cpp:198:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index a0b473a28..066f183ba 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:101:0 +// src/engine/editor.cpp:78:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 1e7f399ad..24836ec9a 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:257:0 +// src/engine/editor.cpp:234:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 65966c37e..962366de0 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:248:0 +// src/engine/editor.cpp:225:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 62c68af44..48ebdfe10 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:251:0 +// src/engine/editor.cpp:228:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index b999b0876..1eed15c80 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:95:0 +// src/engine/editor.cpp:72:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 704370a49..38e58cbdf 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:140:0 +// src/engine/editor.cpp:117:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 9d722d6df..8b4b6bf7f 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:137:0 +// src/engine/editor.cpp:114:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index db7740af2..d2d0f4f79 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:306:0 +// src/engine/editor.cpp:283:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index edb91e499..994c98627 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:300:0 +// src/engine/editor.cpp:277:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 98d8bc620..f70355844 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:106:0 +// src/engine/editor.cpp:83:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 28c8fc409..b2fa83b69 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:104:0 +// src/engine/editor.cpp:81:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 97e3cbf7f..48511683a 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:297:0 +// src/engine/editor.cpp:274:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index cd9a50c3b..258942ff2 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:272:0 +// src/engine/editor.cpp:249:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 389f960ad..6f1173cb5 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:131:0 +// src/engine/editor.cpp:108:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index f47d52497..5ae87d777 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:116:0 +// src/engine/editor.cpp:93:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 0531cb61b..9af8c9843 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 733db8fac..faafa1fe4 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:245:0 +// src/engine/editor.cpp:222:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index c6c111219..f4c2a4583 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:430:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index f495e8d08..651ecff37 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:185:0 +// src/engine/editor.cpp:162:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 4a8b72b28..98f39f99c 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:182:0 +// src/engine/editor.cpp:159:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index e925c7ae1..f2d60051a 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:275:0 +// src/engine/editor.cpp:252:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 6337eb303..74113021a 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:206:0 +// src/engine/editor.cpp:183:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 30b5fb815..2070d3393 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:436:0 +// src/engine/editor.cpp:418:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 5c65c91ae..fad31fb1e 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:439:0 +// src/engine/editor.cpp:421:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index ed22b8fc7..3b73d7b74 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:108:0 +// src/engine/editor.cpp:85:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 4815eeaaf..9c154e253 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:188:0 +// src/engine/editor.cpp:165:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 0077ac70b..ebf46c5ef 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:316:0 +// src/engine/editor.cpp:293:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index aae3d6faa..b20a3065f 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:178:0 +// src/engine/editor.cpp:155:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 150b06a6a..490f6443c 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:172:0 +// src/engine/editor.cpp:149:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index e725c158a..9f5cce61f 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:169:0 +// src/engine/editor.cpp:146:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 59b92dbc8..2092dce1d 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:175:0 +// src/engine/editor.cpp:152:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/jesse.make.sh b/jesse.make.sh index 4a47e50e2..81197b57f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 86aaee5b1..f464f98b4 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1,26 +1,3 @@ -// TODO(Jesse): Should these live somewhere else? @engine_draw_file_nodes_helpers -link_internal maybe_file_traversal_node -EngineDrawFileNodesFilteredHelper(file_traversal_node Node, u64 Params) -{ - engine_resources *Engine = GetEngineResources(); - filtered_file_traversal_helper_params *HelperParams = ReinterpretCast(filtered_file_traversal_helper_params*, Params); - maybe_file_traversal_node Result = DrawFileNodes(&Engine->Ui, Node, HelperParams); - return Result; -} - -// @engine_draw_file_nodes_helpers -link_internal b32 DefaultFileFilter(file_traversal_node *Node) { return True; } - -// @engine_draw_file_nodes_helpers -link_internal maybe_file_traversal_node -EngineDrawFileNodesHelper(file_traversal_node Node, u64 Window) -{ - engine_resources *Engine = GetEngineResources(); - filtered_file_traversal_helper_params HelperParams = {(window_layout*)Window, DefaultFileFilter}; - maybe_file_traversal_node Result = DrawFileNodes(&Engine->Ui, Node, &HelperParams); - return Result; -} - link_internal b32 InitEditor(level_editor *Editor) @@ -355,6 +332,11 @@ poof(do_editor_ui_for_compound_type(brush_layer)) poof(do_editor_ui_for_compound_type(layered_brush)) #include +poof(do_editor_ui_for_compound_type(world_edit_brush)) +#include + +poof(do_editor_ui_for_compound_type(world_edit)) +#include link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) @@ -2862,10 +2844,12 @@ DoWorldEditor(engine_resources *Engine) Edit->Brush = Editor->CurrentBrush; UpdateWorldEdit(Engine, Edit, Edit->Region, GetTranArena()); } - PushNewRow(Ui); + DoEditorUi(Ui, &AllEditsWindow, Edit, {}); + PushNewRow(Ui); } + PushWindowEnd(Ui, &AllEditsWindow); } diff --git a/src/engine/engine.h b/src/engine/engine.h index 215858e57..38da0a9ff 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -62,3 +62,4 @@ link_internal engine_resources *GetEngineResources(); #include #include +#include diff --git a/src/engine/util.h b/src/engine/util.h new file mode 100644 index 000000000..9ec52bd2c --- /dev/null +++ b/src/engine/util.h @@ -0,0 +1,22 @@ + + +link_internal maybe_file_traversal_node +EngineDrawFileNodesFilteredHelper(file_traversal_node Node, u64 Params) +{ + engine_resources *Engine = GetEngineResources(); + filtered_file_traversal_helper_params *HelperParams = ReinterpretCast(filtered_file_traversal_helper_params*, Params); + maybe_file_traversal_node Result = DrawFileNodes(&Engine->Ui, Node, HelperParams); + return Result; +} + +link_internal b32 DefaultFileFilter(file_traversal_node *Node) { return True; } + +link_internal maybe_file_traversal_node +EngineDrawFileNodesHelper(file_traversal_node Node, u64 Window) +{ + engine_resources *Engine = GetEngineResources(); + filtered_file_traversal_helper_params HelperParams = {(window_layout*)Window, DefaultFileFilter}; + maybe_file_traversal_node Result = DrawFileNodes(&Engine->Ui, Node, &HelperParams); + return Result; +} + From e979a77a96f7c191837693fc8be9089cab0f5626 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 19 Feb 2025 09:13:58 -0700 Subject: [PATCH 177/421] Fix a block_array bug when contained type is a pointer --- external/bonsai_stdlib | 2 +- generated/block_array_bitmap_688853862.h | 32 +-- .../block_array_c_asset_thumbnail_688856411.h | 17 ++ ...ntity_ptr_688856411_struct_struct_struct.h | 135 ++++++++++++ generated/block_array_c_gpu_timer_688735882.h | 17 ++ .../block_array_c_shader_ptr_688853971.h | 17 ++ generated/block_array_c_texture_688856411.h | 17 ++ generated/block_array_c_u32_688856411.h | 17 ++ generated/block_array_c_u8_cursor_688856411.h | 17 ++ ...k_queue_entry_build_chunk_mesh_688853862.h | 32 +-- generated/block_array_entity_688856407.h | 32 +-- generated/block_array_entity_ptr_688856411.h | 2 +- .../block_array_entity_ptr_688856411_h.h | 207 ++++++++++++++++++ ...lock_array_file_traversal_node_688853862.h | 32 +-- ...lock_array_gpu_readback_buffer_688853862.h | 32 +-- .../block_array_h_asset_thumbnail_688856411.h | 15 -- .../block_array_h_gpu_timer_688735882_0.h | 15 -- .../block_array_h_shader_ptr_688853971_0.h | 15 -- generated/block_array_h_texture_688856411.h | 15 -- generated/block_array_h_texture_688856411_0.h | 15 -- generated/block_array_h_u32_688856411.h | 15 -- generated/block_array_h_u8_cursor_688856411.h | 15 -- ...lock_array_h_world_chunk_ptr_688853862_0.h | 15 -- generated/block_array_member_info_688856411.h | 32 +-- generated/block_array_model_688856411.h | 32 +-- .../block_array_octree_node_ptr_688853862.h | 32 +-- ...block_array_picked_octree_node_688853862.h | 32 +-- .../block_array_standing_spot_688853862.h | 32 +-- generated/block_array_struct_688735882.h | 32 +-- generated/block_array_texture_ptr_688856411.h | 17 ++ generated/block_array_vox_data_688856411.h | 32 +-- ...lock_array_voxel_stack_element_688853862.h | 32 +-- .../block_array_world_chunk_ptr_688853862.h | 19 +- .../block_array_world_edit_ptr_688735882.h | 32 +-- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- jesse.bonsai.rdbg | Bin 15259 -> 16384 bytes jesse.tests.rdbg | Bin 7576 -> 7429 bytes src/engine/editor.cpp | 17 +- src/engine/entity.cpp | 68 ++++++ src/engine/entity.h | 74 +------ src/engine/world_chunk.cpp | 2 + src/engine/world_chunk.h | 4 +- src/tests/containers/block_array.cpp | 24 +- 45 files changed, 835 insertions(+), 412 deletions(-) create mode 100644 generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h create mode 100644 generated/block_array_entity_ptr_688856411_h.h diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index a4a0563fa..72b276067 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit a4a0563fa33e73d9e1aed97d944afd3de4d9a6a1 +Subproject commit 72b276067d1e8b70d515894bb3958e6f729ab2c4 diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index b4a629b58..285709f80 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -153,21 +153,6 @@ Count( bitmap_block_array *Arr) return Result; } -link_internal bitmap * -Set( bitmap_block_array *Arr, - bitmap *Element, - bitmap_block_array_index Index ) -{ - bitmap *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal bitmap * GetPtr(bitmap_block_array *Arr, bitmap_block_array_index Index) { @@ -238,6 +223,23 @@ CS( bitmap_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal bitmap * +Set( bitmap_block_array *Arr, + bitmap *Element, + bitmap_block_array_index Index ) +{ + bitmap *Result = {}; + if (Index.Block) + { + bitmap *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( bitmap_block_array *Array, bitmap_block_array_index Index) { diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 019662c03..551808565 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -18,6 +18,23 @@ CS( asset_thumbnail_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal asset_thumbnail * +Set( asset_thumbnail_block_array *Arr, + asset_thumbnail *Element, + asset_thumbnail_block_array_index Index ) +{ + asset_thumbnail *Result = {}; + if (Index.Block) + { + asset_thumbnail *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index) { diff --git a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h new file mode 100644 index 000000000..f646cce67 --- /dev/null +++ b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h @@ -0,0 +1,135 @@ +// src/engine/world_chunk.cpp:1:0 + + + + + +link_internal entity_ptr_block * +Allocate_entity_ptr_block(memory_arena *Memory) +{ + entity_ptr_block *Result = Allocate( entity_ptr_block, Memory, 1); + Result->Elements = Allocate( entity_ptr, Memory, 8); + return Result; +} + +link_internal cs +CS( entity_ptr_block_array_index Index ) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal entity_ptr +Set( entity_ptr_block_array *Arr, + entity_ptr Element, + entity_ptr_block_array_index Index ) +{ + entity_ptr Result = {}; + if (Index.Block) + { + entity_ptr *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = Element; + + Result = *Slot; + } + + return Result; +} + +link_internal void +RemoveUnordered( entity_ptr_block_array *Array, entity_ptr_block_array_index Index) +{ + entity_ptr_block_array_index LastI = LastIndex(Array); + + entity_ptr Element = GetPtr(Array, Index); + entity_ptr LastElement = GetPtr(Array, LastI); + + Set(Array, LastElement, Index); + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + entity_ptr_block *Current = Array->First; + entity_ptr_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal entity_ptr_block_array_index +Find( entity_ptr_block_array *Array, entity_ptr Query) +{ + entity_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if ( E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(entity_ptr_block_array_index *Index) +{ + entity_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + b32 Result = (AreEqual(Index, &Test) == False); + return Result; +} + +link_internal entity_ptr * +Push( entity_ptr_block_array *Array, entity_ptr *Element) +{ + Assert(Array->Memory); + + if (Array->First == 0) { Array->First = Allocate_entity_ptr_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 8) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + entity_ptr_block *Next = Allocate_entity_ptr_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + entity_ptr *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index 38d7a4b71..d3d5bdb62 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -18,6 +18,23 @@ CS( gpu_timer_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal gpu_timer * +Set( gpu_timer_block_array *Arr, + gpu_timer *Element, + gpu_timer_block_array_index Index ) +{ + gpu_timer *Result = {}; + if (Index.Block) + { + gpu_timer *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index) { diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index e07a9a54d..123bd64cd 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -18,6 +18,23 @@ CS( shader_ptr_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal shader_ptr +Set( shader_ptr_block_array *Arr, + shader_ptr Element, + shader_ptr_block_array_index Index ) +{ + shader_ptr Result = {}; + if (Index.Block) + { + shader_ptr *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = Element; + + Result = *Slot; + } + + return Result; +} + link_internal void RemoveUnordered( shader_ptr_block_array *Array, shader_ptr_block_array_index Index) { diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index feb1dd59e..a835912c7 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -18,6 +18,23 @@ CS( texture_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal texture * +Set( texture_block_array *Arr, + texture *Element, + texture_block_array_index Index ) +{ + texture *Result = {}; + if (Index.Block) + { + texture *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( texture_block_array *Array, texture_block_array_index Index) { diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index d1df71986..fe25cc14e 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -18,6 +18,23 @@ CS( u32_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal u32 * +Set( u32_block_array *Arr, + u32 *Element, + u32_block_array_index Index ) +{ + u32 *Result = {}; + if (Index.Block) + { + u32 *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( u32_block_array *Array, u32_block_array_index Index) { diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index 4e0482eff..b84d0e482 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -18,6 +18,23 @@ CS( u8_cursor_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal u8_cursor * +Set( u8_cursor_block_array *Arr, + u8_cursor *Element, + u8_cursor_block_array_index Index ) +{ + u8_cursor *Result = {}; + if (Index.Block) + { + u8_cursor *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index) { diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 89f112724..8cb31601c 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -153,21 +153,6 @@ Count( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) return Result; } -link_internal dummy_work_queue_entry_build_chunk_mesh * -Set( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, - dummy_work_queue_entry_build_chunk_mesh *Element, - dummy_work_queue_entry_build_chunk_mesh_block_array_index Index ) -{ - dummy_work_queue_entry_build_chunk_mesh *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal dummy_work_queue_entry_build_chunk_mesh * GetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) { @@ -238,6 +223,23 @@ CS( dummy_work_queue_entry_build_chunk_mesh_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal dummy_work_queue_entry_build_chunk_mesh * +Set( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, + dummy_work_queue_entry_build_chunk_mesh *Element, + dummy_work_queue_entry_build_chunk_mesh_block_array_index Index ) +{ + dummy_work_queue_entry_build_chunk_mesh *Result = {}; + if (Index.Block) + { + dummy_work_queue_entry_build_chunk_mesh *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) { diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index f8d20ff13..da2a14013 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -153,21 +153,6 @@ Count( entity_block_array *Arr) return Result; } -link_internal entity * -Set( entity_block_array *Arr, - entity *Element, - entity_block_array_index Index ) -{ - entity *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal entity * GetPtr(entity_block_array *Arr, entity_block_array_index Index) { @@ -238,6 +223,23 @@ CS( entity_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal entity * +Set( entity_block_array *Arr, + entity *Element, + entity_block_array_index Index ) +{ + entity *Result = {}; + if (Index.Block) + { + entity *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( entity_block_array *Array, entity_block_array_index Index) { diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h index 5c0377a1c..e242dfe74 100644 --- a/generated/block_array_entity_ptr_688856411.h +++ b/generated/block_array_entity_ptr_688856411.h @@ -162,7 +162,7 @@ Set( entity_ptr_block_array *Arr, if (Index.Block) { Result = Index.Block->Elements[Index.ElementIndex]; - Result = Element; + *Result = *Element; } return Result; diff --git a/generated/block_array_entity_ptr_688856411_h.h b/generated/block_array_entity_ptr_688856411_h.h new file mode 100644 index 000000000..1ffac669d --- /dev/null +++ b/generated/block_array_entity_ptr_688856411_h.h @@ -0,0 +1,207 @@ +// src/engine/world_chunk.h:305:0 + + + + + +struct entity_ptr_block +{ + u32 Index; + u32 At; + entity_ptr *Elements; + entity_ptr_block *Next; +}; + +struct entity_ptr_block_array_index +{ + entity_ptr_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct entity_ptr_block_array +{ + entity_ptr_block *First; + entity_ptr_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +link_internal entity_ptr_block_array +EntityPtrBlockArray(memory_arena *Memory) +{ + entity_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal b32 +AreEqual(entity_ptr_block_array_index *Thing1, entity_ptr_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( entity_ptr_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(entity_ptr_block_array_index Thing1, entity_ptr_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( entity_ptr_block_array_index ) ); + + return Result; +} + + +typedef entity_ptr_block_array entity_ptr_paged_list; + +link_internal entity_ptr_block_array_index +operator++( entity_ptr_block_array_index &I0 ) +{ + if (I0.Block) + { + if (I0.ElementIndex == 8-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<( entity_ptr_block_array_index I0, entity_ptr_block_array_index I1 ) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex( entity_ptr_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*8); + return Result; +} + +link_internal entity_ptr_block_array_index +ZerothIndex( entity_ptr_block_array *Arr) +{ + entity_ptr_block_array_index Result = {}; + Result.Block = Arr->First; + return Result; +} + +link_internal umm +TotalElements( entity_ptr_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 8) + Arr->Current->At; + } + return Result; +} + +link_internal entity_ptr_block_array_index +LastIndex( entity_ptr_block_array *Arr) +{ + entity_ptr_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal entity_ptr_block_array_index +AtElements( entity_ptr_block_array *Arr) +{ + entity_ptr_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal umm +Count( entity_ptr_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + +link_internal entity_ptr +GetPtr(entity_ptr_block_array *Arr, entity_ptr_block_array_index Index) +{ + entity_ptr Result = {}; + if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } + return Result; +} + +link_internal entity_ptr +GetPtr(entity_ptr_block *Block, umm Index) +{ + entity_ptr Result = {}; + if (Index < Block->At) { Result = *(Block->Elements + Index); } + return Result; +} + +link_internal entity_ptr +GetPtr(entity_ptr_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + umm AtBlock = 0; + entity_ptr_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + entity_ptr Result = *(Block->Elements+ElementIndex); + return Result; +} + +link_internal entity_ptr +TryGetPtr(entity_ptr_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + entity_ptr Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(entity_ptr_block *Block) +{ + return Block->At; +} + diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index ab10c87db..10b978472 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -153,21 +153,6 @@ Count( file_traversal_node_block_array *Arr) return Result; } -link_internal file_traversal_node * -Set( file_traversal_node_block_array *Arr, - file_traversal_node *Element, - file_traversal_node_block_array_index Index ) -{ - file_traversal_node *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal file_traversal_node * GetPtr(file_traversal_node_block_array *Arr, file_traversal_node_block_array_index Index) { @@ -238,6 +223,23 @@ CS( file_traversal_node_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal file_traversal_node * +Set( file_traversal_node_block_array *Arr, + file_traversal_node *Element, + file_traversal_node_block_array_index Index ) +{ + file_traversal_node *Result = {}; + if (Index.Block) + { + file_traversal_node *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index) { diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index b435f0ac0..7583583c4 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -153,21 +153,6 @@ Count( gpu_readback_buffer_block_array *Arr) return Result; } -link_internal gpu_readback_buffer * -Set( gpu_readback_buffer_block_array *Arr, - gpu_readback_buffer *Element, - gpu_readback_buffer_block_array_index Index ) -{ - gpu_readback_buffer *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal gpu_readback_buffer * GetPtr(gpu_readback_buffer_block_array *Arr, gpu_readback_buffer_block_array_index Index) { @@ -238,6 +223,23 @@ CS( gpu_readback_buffer_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal gpu_readback_buffer * +Set( gpu_readback_buffer_block_array *Arr, + gpu_readback_buffer *Element, + gpu_readback_buffer_block_array_index Index ) +{ + gpu_readback_buffer *Result = {}; + if (Index.Block) + { + gpu_readback_buffer *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) { diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index da9c68e80..9c1d79122 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -153,21 +153,6 @@ Count( asset_thumbnail_block_array *Arr) return Result; } -link_internal asset_thumbnail * -Set( asset_thumbnail_block_array *Arr, - asset_thumbnail *Element, - asset_thumbnail_block_array_index Index ) -{ - asset_thumbnail *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal asset_thumbnail * GetPtr(asset_thumbnail_block_array *Arr, asset_thumbnail_block_array_index Index) { diff --git a/generated/block_array_h_gpu_timer_688735882_0.h b/generated/block_array_h_gpu_timer_688735882_0.h index 8245e081f..c0086333d 100644 --- a/generated/block_array_h_gpu_timer_688735882_0.h +++ b/generated/block_array_h_gpu_timer_688735882_0.h @@ -153,21 +153,6 @@ Count( gpu_timer_block_array *Arr) return Result; } -link_internal gpu_timer * -Set( gpu_timer_block_array *Arr, - gpu_timer *Element, - gpu_timer_block_array_index Index ) -{ - gpu_timer *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal gpu_timer * GetPtr(gpu_timer_block_array *Arr, gpu_timer_block_array_index Index) { diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 8c524b938..b84f0e3e6 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -153,21 +153,6 @@ Count( shader_ptr_block_array *Arr) return Result; } -link_internal shader_ptr -Set( shader_ptr_block_array *Arr, - shader_ptr Element, - shader_ptr_block_array_index Index ) -{ - shader_ptr Result = {}; - if (Index.Block) - { - Result = Index.Block->Elements[Index.ElementIndex]; - Result = Element; - } - - return Result; -} - link_internal shader_ptr GetPtr(shader_ptr_block_array *Arr, shader_ptr_block_array_index Index) { diff --git a/generated/block_array_h_texture_688856411.h b/generated/block_array_h_texture_688856411.h index bc769ef98..c5c886be4 100644 --- a/generated/block_array_h_texture_688856411.h +++ b/generated/block_array_h_texture_688856411.h @@ -153,21 +153,6 @@ Count( texture_ptr_block_array *Arr) return Result; } -link_internal texture_ptr -Set( texture_ptr_block_array *Arr, - texture_ptr Element, - texture_ptr_block_array_index Index ) -{ - texture_ptr Result = {}; - if (Index.Block) - { - Result = Index.Block->Elements[Index.ElementIndex]; - Result = Element; - } - - return Result; -} - link_internal texture_ptr GetPtr(texture_ptr_block_array *Arr, texture_ptr_block_array_index Index) { diff --git a/generated/block_array_h_texture_688856411_0.h b/generated/block_array_h_texture_688856411_0.h index c6b40acfa..b7edfb8c3 100644 --- a/generated/block_array_h_texture_688856411_0.h +++ b/generated/block_array_h_texture_688856411_0.h @@ -153,21 +153,6 @@ Count( texture_block_array *Arr) return Result; } -link_internal texture * -Set( texture_block_array *Arr, - texture *Element, - texture_block_array_index Index ) -{ - texture *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal texture * GetPtr(texture_block_array *Arr, texture_block_array_index Index) { diff --git a/generated/block_array_h_u32_688856411.h b/generated/block_array_h_u32_688856411.h index 45489fea6..540b3da2a 100644 --- a/generated/block_array_h_u32_688856411.h +++ b/generated/block_array_h_u32_688856411.h @@ -153,21 +153,6 @@ Count( u32_block_array *Arr) return Result; } -link_internal u32 * -Set( u32_block_array *Arr, - u32 *Element, - u32_block_array_index Index ) -{ - u32 *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal u32 * GetPtr(u32_block_array *Arr, u32_block_array_index Index) { diff --git a/generated/block_array_h_u8_cursor_688856411.h b/generated/block_array_h_u8_cursor_688856411.h index 483ec6c4d..851cd8858 100644 --- a/generated/block_array_h_u8_cursor_688856411.h +++ b/generated/block_array_h_u8_cursor_688856411.h @@ -153,21 +153,6 @@ Count( u8_cursor_block_array *Arr) return Result; } -link_internal u8_cursor * -Set( u8_cursor_block_array *Arr, - u8_cursor *Element, - u8_cursor_block_array_index Index ) -{ - u8_cursor *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal u8_cursor * GetPtr(u8_cursor_block_array *Arr, u8_cursor_block_array_index Index) { diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index bfc0a070b..170c5a7c9 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -153,21 +153,6 @@ Count( world_chunk_ptr_block_array *Arr) return Result; } -link_internal world_chunk_ptr -Set( world_chunk_ptr_block_array *Arr, - world_chunk_ptr Element, - world_chunk_ptr_block_array_index Index ) -{ - world_chunk_ptr Result = {}; - if (Index.Block) - { - Result = Index.Block->Elements[Index.ElementIndex]; - Result = Element; - } - - return Result; -} - link_internal world_chunk_ptr GetPtr(world_chunk_ptr_block_array *Arr, world_chunk_ptr_block_array_index Index) { diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index d8da5199b..1abe7bd99 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -153,21 +153,6 @@ Count( member_info_block_array *Arr) return Result; } -link_internal member_info * -Set( member_info_block_array *Arr, - member_info *Element, - member_info_block_array_index Index ) -{ - member_info *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal member_info * GetPtr(member_info_block_array *Arr, member_info_block_array_index Index) { @@ -238,6 +223,23 @@ CS( member_info_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal member_info * +Set( member_info_block_array *Arr, + member_info *Element, + member_info_block_array_index Index ) +{ + member_info *Result = {}; + if (Index.Block) + { + member_info *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( member_info_block_array *Array, member_info_block_array_index Index) { diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index df191736c..42a87d641 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -153,21 +153,6 @@ Count( model_block_array *Arr) return Result; } -link_internal model * -Set( model_block_array *Arr, - model *Element, - model_block_array_index Index ) -{ - model *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal model * GetPtr(model_block_array *Arr, model_block_array_index Index) { @@ -238,6 +223,23 @@ CS( model_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal model * +Set( model_block_array *Arr, + model *Element, + model_block_array_index Index ) +{ + model *Result = {}; + if (Index.Block) + { + model *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( model_block_array *Array, model_block_array_index Index) { diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index f4ce972e8..f9a8f386a 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -153,21 +153,6 @@ Count( octree_node_ptr_block_array *Arr) return Result; } -link_internal octree_node_ptr -Set( octree_node_ptr_block_array *Arr, - octree_node_ptr Element, - octree_node_ptr_block_array_index Index ) -{ - octree_node_ptr Result = {}; - if (Index.Block) - { - Result = Index.Block->Elements[Index.ElementIndex]; - Result = Element; - } - - return Result; -} - link_internal octree_node_ptr GetPtr(octree_node_ptr_block_array *Arr, octree_node_ptr_block_array_index Index) { @@ -238,6 +223,23 @@ CS( octree_node_ptr_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal octree_node_ptr +Set( octree_node_ptr_block_array *Arr, + octree_node_ptr Element, + octree_node_ptr_block_array_index Index ) +{ + octree_node_ptr Result = {}; + if (Index.Block) + { + octree_node_ptr *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = Element; + + Result = *Slot; + } + + return Result; +} + link_internal void RemoveUnordered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) { diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 2c6230d1e..0f946c9ab 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -153,21 +153,6 @@ Count( picked_octree_node_block_array *Arr) return Result; } -link_internal picked_octree_node * -Set( picked_octree_node_block_array *Arr, - picked_octree_node *Element, - picked_octree_node_block_array_index Index ) -{ - picked_octree_node *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal picked_octree_node * GetPtr(picked_octree_node_block_array *Arr, picked_octree_node_block_array_index Index) { @@ -238,6 +223,23 @@ CS( picked_octree_node_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal picked_octree_node * +Set( picked_octree_node_block_array *Arr, + picked_octree_node *Element, + picked_octree_node_block_array_index Index ) +{ + picked_octree_node *Result = {}; + if (Index.Block) + { + picked_octree_node *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 5981317f4..dd42056ff 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -153,21 +153,6 @@ Count( standing_spot_block_array *Arr) return Result; } -link_internal standing_spot * -Set( standing_spot_block_array *Arr, - standing_spot *Element, - standing_spot_block_array_index Index ) -{ - standing_spot *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal standing_spot * GetPtr(standing_spot_block_array *Arr, standing_spot_block_array_index Index) { @@ -238,6 +223,23 @@ CS( standing_spot_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal standing_spot * +Set( standing_spot_block_array *Arr, + standing_spot *Element, + standing_spot_block_array_index Index ) +{ + standing_spot *Result = {}; + if (Index.Block) + { + standing_spot *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( standing_spot_block_array *Array, standing_spot_block_array_index Index) { diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index 746458fd4..e80795425 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -153,21 +153,6 @@ Count( world_edit_block_array *Arr) return Result; } -link_internal world_edit * -Set( world_edit_block_array *Arr, - world_edit *Element, - world_edit_block_array_index Index ) -{ - world_edit *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal world_edit * GetPtr(world_edit_block_array *Arr, world_edit_block_array_index Index) { @@ -238,6 +223,23 @@ CS( world_edit_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal world_edit * +Set( world_edit_block_array *Arr, + world_edit *Element, + world_edit_block_array_index Index ) +{ + world_edit *Result = {}; + if (Index.Block) + { + world_edit *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( world_edit_block_array *Array, world_edit_block_array_index Index) { diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index 785a9dd09..d4d82f4a3 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -18,6 +18,23 @@ CS( texture_ptr_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal texture_ptr +Set( texture_ptr_block_array *Arr, + texture_ptr Element, + texture_ptr_block_array_index Index ) +{ + texture_ptr Result = {}; + if (Index.Block) + { + texture_ptr *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = Element; + + Result = *Slot; + } + + return Result; +} + link_internal void RemoveUnordered( texture_ptr_block_array *Array, texture_ptr_block_array_index Index) { diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index 9f61b8e38..ae257c0d2 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -153,21 +153,6 @@ Count( vox_data_block_array *Arr) return Result; } -link_internal vox_data * -Set( vox_data_block_array *Arr, - vox_data *Element, - vox_data_block_array_index Index ) -{ - vox_data *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal vox_data * GetPtr(vox_data_block_array *Arr, vox_data_block_array_index Index) { @@ -238,6 +223,23 @@ CS( vox_data_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal vox_data * +Set( vox_data_block_array *Arr, + vox_data *Element, + vox_data_block_array_index Index ) +{ + vox_data *Result = {}; + if (Index.Block) + { + vox_data *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( vox_data_block_array *Array, vox_data_block_array_index Index) { diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index 5bb6f6c7e..175598954 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -153,21 +153,6 @@ Count( voxel_stack_element_block_array *Arr) return Result; } -link_internal voxel_stack_element * -Set( voxel_stack_element_block_array *Arr, - voxel_stack_element *Element, - voxel_stack_element_block_array_index Index ) -{ - voxel_stack_element *Result = {}; - if (Index.Block) - { - Result = &Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - link_internal voxel_stack_element * GetPtr(voxel_stack_element_block_array *Arr, voxel_stack_element_block_array_index Index) { @@ -238,6 +223,23 @@ CS( voxel_stack_element_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal voxel_stack_element * +Set( voxel_stack_element_block_array *Arr, + voxel_stack_element *Element, + voxel_stack_element_block_array_index Index ) +{ + voxel_stack_element *Result = {}; + if (Index.Block) + { + voxel_stack_element *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + link_internal void RemoveUnordered( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index) { diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index 682f95ca7..dd9432d53 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2:0 +// src/engine/world_chunk.cpp:4:0 @@ -18,6 +18,23 @@ CS( world_chunk_ptr_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal world_chunk_ptr +Set( world_chunk_ptr_block_array *Arr, + world_chunk_ptr Element, + world_chunk_ptr_block_array_index Index ) +{ + world_chunk_ptr Result = {}; + if (Index.Block) + { + world_chunk_ptr *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = Element; + + Result = *Slot; + } + + return Result; +} + link_internal void RemoveUnordered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index) { diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index b378fe1c8..f6b482b07 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -153,21 +153,6 @@ Count( world_edit_ptr_block_array *Arr) return Result; } -link_internal world_edit_ptr -Set( world_edit_ptr_block_array *Arr, - world_edit_ptr Element, - world_edit_ptr_block_array_index Index ) -{ - world_edit_ptr Result = {}; - if (Index.Block) - { - Result = Index.Block->Elements[Index.ElementIndex]; - Result = Element; - } - - return Result; -} - link_internal world_edit_ptr GetPtr(world_edit_ptr_block_array *Arr, world_edit_ptr_block_array_index Index) { @@ -238,6 +223,23 @@ CS( world_edit_ptr_block_array_index Index ) return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); } +link_internal world_edit_ptr +Set( world_edit_ptr_block_array *Arr, + world_edit_ptr Element, + world_edit_ptr_block_array_index Index ) +{ + world_edit_ptr Result = {}; + if (Index.Block) + { + world_edit_ptr *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = Element; + + Result = *Slot; + } + + return Result; +} + link_internal void RemoveUnordered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index Index) { diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 4f73b169d..1afccdebb 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3063:0 +// src/engine/world_chunk.cpp:3065:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index f37d8a78a..0a5856c42 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2077:0 +// src/engine/world_chunk.cpp:2079:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index bc3741cd0..b0f018068 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2080:0 +// src/engine/world_chunk.cpp:2082:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 13f0e662b90513a7d99b76af72e8d3f34271b157..e91792c3f3cc993b3fc4e6af4380fb684b8130ef 100644 GIT binary patch delta 2605 zcmY*bTWniN8SW&GkMDNuI7w|MzBNtkILA&LJC3()+-$?PG!5G=?Jl>TIQB`8sU15$ zc6KXnEep~<6x!}5o_1F%EJA1zyC5#Fdyx=}KqwVO@InEtppPx|2_Y!|jP0Zx>FCUv z`RAYc|Nr~Gnb%&tdX?QgIq>@f2M(;_nso|qM{I$5snt|fWvgCRl}4+nWOKP(CY{U9 z$y&K*G+%DlYFCsO>&?r`c3W+$in`TmUQssMm1H zR&RlYbS9Uh1(wJrYu_K2wPm~?T(oVFX{%W&UDjm{+x{Rzb_*UF9PXyNRaTpduC`j0 ztxGhT!K^2ScY>0kTCX>-HW}^Ny7t{F8_l+^;k}7zaw0uBplij3inHcvo{G_u(#|QR zc2lo+(~zB?ot3o(9*IjU>RPL~QB@Va)ohnq2u6LlIiE4_sHIlDDQj!ElbOX^3nBIi zYOPAO;^wBTo#E}iOI19!`B2E_@Y}2r%sxu(W7y5Sz|L_4D@9x@Hsn&HAtpo5V68k*2L^3{ZAhV0~a~!)K3w|0NM#(dZ-8mm#Pup-eyNun#PWHL3MG)I2 z?jVD=<{a!ePq109)XGY6=cPG>eTjjc`b%mR*9>749Fcxc@7X`+BLvrpr9saZsQ z(*~XLjtiELb8DG%bRRP{JkQFSWUE+ zW=`O{@(g}FbChj$drnb=9F=zxD|p$kfY%as_O$4^Z*$^&B8OzZ5vGKfZHV62r;nmA zoyNC4!B>5D1g%CKnhvm{82ows2zv_Kp#;7VceC?6YD!&@EsN1V#>N0=46no{5se+e zM^gp1NH!t-aw@<+)%7rj8&e~DUYv%stfd9s{xfN3^SotgX-&0Q){C1eVebr5p7?;k z9sWEO#b2yem?wF4lDr~R2ae@RY4YRPVH35NXO?qt9=nmV>=_Zx z+mQ&)MdtSCG#?4Fqas26QKwN)6CF>}BJv)l?q)|3>WiQp9uaYs>eYG^V~%5Z5Hg_= zT47m{jP;P~)le4i1q*DU%f><0;pI-yN$KMZT?l&FoM`=O+=?QT@f-Sv9eE?MNiEhW zlrYc79-9)}SmL50Yp29Eug82+McLUa!qkWj&qb!8jF~8~IA-X3m!PPONf>t=HE&j` zDks!xH!2st7#Qr-!ecQO8;>$jXSTc*h9$aQiV#g0A+=zhejIZXdHl@lVy7syMQC0RQ6Mi} zs`9v&MBlHoW(tEw2ild-wkt>uEfOmQXe}h0B*Wa6$hSs;9i!#a1T^j}=ozF<#PKJ$ z36HG&E8(Ff!mDemskJ(t8%5G_qA3Xur@)Nc!cK~*kG)Q;dm>%pc<^rUDXB^F%5%i2 zJUr;3jL;$`u_sykw1Bqm%HSjCB}(73`yynj(TP^=))+tVTLoC&2^#SaYl2P;BSj?R z8xD@bLt& zn~UM1#ZOeC;}SC#6CDX1D1B&_iTtYq2KQ za637OA=40fd7iY6i}tz{eM0q|(g-0rjt`7yaLqVE$5oyztcV*2JL$*00f`{A@A=k% zXHSGy2E0PHv-q#UMSDL%AmjV48HVvUH=kpL*AQkMDZSTkCqQ<36^k1;%(i}6TNmX{ z_b=et)HC>ZpOy9yL%?bS`og%_*NI`dFF**J#$#sgYSDFO=ZB-vW?W~E?zywfLO9`! z-FkGG)50PyEIh?MWwhP8Hf-;sYY~4Ky(vL9LavLfOlHw92KH_>UwPts(Y-eHZZ-cR zbBSIny=w%*nPV$-_t69Y|0{p2($rh>N>#1VWlB%X8M@>A%O`Lb-BIpowWznczy0*< zIo@pY9jh|?L#yz$bG-eNRPI8bmAClIn1oyTFmC7FxSBT&nnWKH4{z^}-p)I5KmQ{e IpVfQ*2RrO3`v3p{ delta 2227 zcmYjTOKcn071fi(&u}OXNl7FvisFcrWRsGIABhynD3s$U{zj@)CvMWXkVoRkGc_s7 zBo)U+(<*6KLE<<*n|y#mMq6YR!$rFZ&;pKuY=Qz&g08xVlP^qj^k?qg6Ni?I~mk`ws4B(d{i?N_BK_LLYsTT0wAUB;b(1Xcy@!xSDmdGXmRU#!qOy>;gX1^7u5Pg84X7Z-32b z=%_2x6i^tkR6DpI^|{cO@v{u4$Gv0TXj+?1ZF6U5N$~J;daQeNKkGm_Jxq~^$Yo=@ zWwmasr!`aK#`dPss2EM$pP4xv9+%3vl#+3veIFNC0{pW3nim&xCH!pKgP&_2it7nq z5yvzIzdQaoF)3KGZ`P~zMibvol%*Y`QMI-;Qy_$TT;{2qN%s*(+?vVa^Pn(+qRPGI zdBGt0w$*$)Nx%5?59FL;=A;C3v5o5>*kZ@XMi+OZam zVt-V|J41uL<{1I@!%0Ql-T{l$q@!Oj#v?hK@ZiBrQZ_19tKQ&D3U;tMf0XARZy)pF z!9>!gH=9NaW3jlXiYrykJV(woq@!MZaa8FrF^U0)gzsjOSUoBehizOB3D=iXCwi|` zacOD^gHy}wlt6YiF~E_uCm&7{(`jMhvbL?3rB|(=7{uu*(Lx$tpUATuHAs%z6v%;! zg^4gEB9uqGFWI0>xCI-0zS3*QLEOt87nSkB5r5zAY!+&K5sWzEo${a9Q96ABmt$GM z8(%vgE67*$nz3H3>lLGchf{Gn>%m{g1IR?U9Ul+&Y9`joA?$?x4t>YsymjYQ>x$W; z{Z~fC@!R7Pdy>%R1~%&3P2E~=wklO?1Iy}SyURP3*{))q6Gio~lVnlCCsCP@mGL=c zSdC`z?}?JMWmOG+Rw#tLNmv_tH*ZqSXqw%by}e6PFoUs@9qO2agkTxXNScB0sJ+1g=?;c{qzy6+T8-aP&k9PXy` z8jaV~c1dv2xSEyvG;>)L*q{AQd=)sxp6hz~O<;%w^W0${yRPk$ayPcE`ZiLL@lJjC zS(auC_L|;mSTEszmT$PIwWG)l4^m2Vs5&LKAVmJ1p@3+y>-9#pf`1Gy<6p(3(lRM8 zm8QNWl0Az%@oC%}lyQ=(O7%thXEpOskt5IsgNVhW*il{hi+_k5Qyn>K`qq|a7RWS( zb-%k)_Z}QXMjY$Ah4mL_EgS@=@xT|s3E%US@I|I~R6c^gd84G~{B?Ob?ZlpUl-f{_ zC7soJy~ZmHd+r3jP`C&#QGtJ^Wl1b;*iZ`Mp@}F1?8m~{9nVv2TZ~ekv)CWlVztg} z$+lb2%=Tlb45;LBiy5@HX(xEvBXxw=?Z7R$(0TjR$J}Vjk?u>F=(e6vsYk7en;LSCn2#^l~8C5&%*g&JBV)S z03$TI3rH|BfOXXTcXOCb5;y?l`nFNA+5x zYP%*|?dH_32TrhKvhA=?CYwAM%M^(~qPLu_mSeJcUL7?Qc$Q9+c|KS3?Crp07OpG6 z39Mcg+aAUfGU9>hq@@PTvny2?>0c!RU(BvLK|>r89P}X($k<36VxsDSrlJMM~?KfK9w(XnjJYO0SAmOJVYzST^sDL=HAdqE&>R2KT zSK}6J_4mP*_!_FxA*W$APGPLy0veA)iylR`hkBSzX);>1ueWY;a!sxjWv%)xo)rbb z`Mv}x9bo)wq{&%PUzb(G->C=8_8r7G-&I2eW+cf%$YPGH9dv$-jiVb1fPL^d)<=Xe zi?NeLFfPTi@GDZF*Bf=ef-+d0-3fr`S=fvw;5S|RkEU-FX`+kbXq-3=uF*kqO6;Ga zS~uF)H8RuF@`Fyv67o}o2YL$ehm0Q%#Zp6Opn7GrP@D)e^))@G<^;|i&OIlwq*j`U zYn6xaBB_F*rFvY_8;)!D%vpdDRpo+&{@hS?;Z$DM$ZVHVLt@K4a8DwmWKz^O)QH5& zTt|8bJ%%35@3R zop!PFC)IgZ?7T@u4&kFfIX^O-!{`ED*d24J<$1`idC9eF`1U7fUc32{3~z^ZqQI-+ T35-N3c)4K7^6&Th_w_u_&;F?P z#f6)Dq&d8C6dRK=J}e!<>!n3pDw$+;c;hsl7N5sM=P=Aw(mlTy;2r%08vGHS+M(s*{NyWSiN2jRcI=L`>1=O1tthlw{XXs&mT)^$ z6FN@lTJACnLcd^=#n@Ud=;T6d{hcq+*a|+*XR(=IL0d1=4pUMX1&-aZ+&Z1h!Ums} zc4_TiV7X^l-l*V>wsE&t{!8lWs~s@H$@P?K%wS_k0b$sj)h|(~Z37I_?>(W$ z(DpXNsO@`OBm8B`x+eQh(BIr$u-vmT+*Ly$hn8jtwB<3ZD*}GgCn@kIS)m1I=!u98 zJ&#A)Mf{-65BFFl8DDGFTbux26Vb}dVoocPYl&2Us4viD#_>1m1X+JpW?el^C0@gA zrGa0JGWH9m5?=2{t`m9`SalRQg}<^Z_%(L|Pl|%%4!Z9$3{3agOxxKS?2Lq;5+j$& z(jHM#&uSFHBL0yj%*!>r#p@~ea!krTU%~@v19zkb#Su%2uOun4<$?G1z++9$vnER5 zguOw~Vq`bsd@4BhMVVZoUKK;JfPq@ZRYk@nF;APGV=Ix_@hvx=Qntg;iCDc?pQV2( zn7GVUM5pb=dxM)fs$T5e%GTk_YHHj}9sy&kdyKzEYILkQ=zNYYaf9;R!12r)c{Abr zae9%o66b&`<4(FfR)Zc$higK=t8vt+@p{p1%EnvT=R`Ia`katX*bpKo2yCyLkk0p= zz^CrL!bzqNK1((6MoOU*)x`HZK101kzh|}8^L@K*`#rnu1b9!i@Hv@4!CCurrentEdit->Region; // NOTE(Jesse): Debug Editor->CurrentEdit->Region = Region; // TODO(Jesse): I feel like this should be happening more automagically, but .. ApplyEditToOctree(Engine, Edit, TempMemory); @@ -2699,7 +2700,13 @@ DoWorldEditor(engine_resources *Engine) random_series S = {u64(Edit)}; v3 BaseColor = RandomV3Unilateral(&S); - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, 1.f); + f32 Size = 1.f; + if (Edit == Editor->CurrentEdit) + { + Size = 3.f; + } + + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); } @@ -2728,6 +2735,7 @@ DoWorldEditor(engine_resources *Engine) Editor->CurrentEdit->Brush = Editor->CurrentBrush; } +#if 0 if (Editor->Selection.Clicks == 2) { if (Input->Ctrl.Pressed && Input->D.Clicked) { ApplyEditToRegion(Engine, &SelectionAABB, {}, {}, WorldEdit_Mode_Subtractive, WorldEdit_Modifier_Default); } @@ -2759,8 +2767,9 @@ DoWorldEditor(engine_resources *Engine) QueueWorldUpdateForRegion(Engine, WorldEdit_Mode_Additive, WorldEdit_Modifier_Default, &Shape, {}, {}, Engine->WorldUpdateMemory); } } +#endif - { + { // All Brushes Window local_persist window_layout BrushSettingsWindow = WindowLayout("All Brushes", WindowLayoutFlag_Align_BottomRight); PushWindowStart(Ui, &BrushSettingsWindow); @@ -2832,7 +2841,11 @@ DoWorldEditor(engine_resources *Engine) if (Button(Ui, FSz("(%d) (%s)", I, NameBuf), UiId(&AllEditsWindow, "edit select", Edit))) { + Editor->Selection.Clicks = 2; + Editor->Selection.Region = Edit->Region; + Editor->CurrentEdit = Edit; + if (Edit->Brush) { Editor->CurrentBrush = Edit->Brush; diff --git a/src/engine/entity.cpp b/src/engine/entity.cpp index 274a74e25..07a956f89 100644 --- a/src/engine/entity.cpp +++ b/src/engine/entity.cpp @@ -1658,3 +1658,71 @@ AStarPathfind(world *World, standing_spot_buffer *Spots, cp CurrentP, cp TargetP } +link_internal void +DropEntityFromPreviouslyOccupiedChunks(world *World, entity *Entity, memory_arena *TempMemory) +{ + // nocheckin + /* Assert(Entity->Behavior & EntityBehaviorFlags_EntityCollision); */ + + Assert(ThreadLocal_ThreadIndex == 0); + + rect3cp EntityArea = RectMinMax(Entity->LastResolvedPosInfo.P, Canonicalize(World->ChunkDim, Entity->LastResolvedPosInfo.P + Entity->LastResolvedPosInfo._CollisionVolumeRadius*2.f)); + world_chunk_ptr_buffer Chunks = GatherChunksOverlappingArea(World, EntityArea, TempMemory); + + if (Chunks.Count) + { + /* Info("Attempting to drop Entity(%p) from (%d) Chunks", Entity, Chunks.Count); */ + RangeIterator_t(umm, ChunkIndex, Chunks.Count) + { + world_chunk *Chunk = Chunks.Start[ChunkIndex]; + /* Info("Attempting to drop Entity(%p) from Chunk(%p)", Entity, Chunk); */ + + b32 Got = False; + IterateOver(&Chunk->Entities, TestEntity, TestEntityIndex) + { + if (TestEntity == Entity) + { + RemoveUnordered(&Chunk->Entities, TestEntityIndex); + Got = True; + break; + } + } + // NOTE(Jesse): This is a bit sketch. For it to work 100% correctly we + // cannot ever have entities that overlap uninitialized bits of the world. + // + // Currently it cannot be in, because an entity can be spawned outside + // the world just fine, then when the visible region moves to enclose the + // entity chunks will get initialized, but the entity will never have + // been added to the freshly minted chunks. + // + // We'd have to do some nonsense like check every entity for every chunk + // if it overlaps when we insert, which is not a thing. + /* Assert(Got); */ + } + } +} + +link_internal void +InsertEntityIntoChunks(world *World, entity *Entity, memory_arena *TempMemory) +{ + // nocheckin + /* Assert(Entity->Behavior & EntityBehaviorFlags_EntityCollision); */ + + auto MinP = Entity->LastResolvedPosInfo.P; + auto MaxP = Canonicalize(World->ChunkDim, Entity->LastResolvedPosInfo.P + Entity->LastResolvedPosInfo._CollisionVolumeRadius*2.f); + + rect3cp EntityArea = RectMinMax(MinP, MaxP); + world_chunk_ptr_buffer Chunks = GatherChunksOverlappingArea(World, EntityArea, TempMemory); + if (Chunks.Count) + { + /* Info("Attempting to insert Entity(%p) into (%d) Chunks", Entity, Chunks.Count); */ + RangeIterator_t(umm, ChunkIndex, Chunks.Count) + { + world_chunk *Chunk = Chunks.Start[ChunkIndex]; + /* Info("Attempting to insert Entity(%p) into Chunk(%p)", Entity, Chunk); */ + + Push(&Chunk->Entities, &Entity); + } + } +} + diff --git a/src/engine/entity.h b/src/engine/entity.h index d65119df0..f78e69ac1 100644 --- a/src/engine/entity.h +++ b/src/engine/entity.h @@ -225,74 +225,6 @@ FinalizeEntityUpdate(entity *Entity) } -link_internal void -DropEntityFromPreviouslyOccupiedChunks(world *World, entity *Entity, memory_arena *TempMemory) -{ - // nocheckin - /* Assert(Entity->Behavior & EntityBehaviorFlags_EntityCollision); */ - - Assert(ThreadLocal_ThreadIndex == 0); - - rect3cp EntityArea = RectMinMax(Entity->LastResolvedPosInfo.P, Canonicalize(World->ChunkDim, Entity->LastResolvedPosInfo.P + Entity->LastResolvedPosInfo._CollisionVolumeRadius*2.f)); - world_chunk_ptr_buffer Chunks = GatherChunksOverlappingArea(World, EntityArea, TempMemory); - - if (Chunks.Count) - { - /* Info("Attempting to drop Entity(%p) from (%d) Chunks", Entity, Chunks.Count); */ - RangeIterator_t(umm, ChunkIndex, Chunks.Count) - { - world_chunk *Chunk = Chunks.Start[ChunkIndex]; - /* Info("Attempting to drop Entity(%p) from Chunk(%p)", Entity, Chunk); */ - - b32 Got = False; - IterateOver(&Chunk->Entities, TestEntity, TestEntityIndex) - { - if (TestEntity == Entity) - { - RemoveUnordered(&Chunk->Entities, TestEntityIndex); - Got = True; - break; - } - } - // NOTE(Jesse): This is a bit sketch. For it to work 100% correctly we - // cannot ever have entities that overlap uninitialized bits of the world. - // - // Currently it cannot be in, because an entity can be spawned outside - // the world just fine, then when the visible region moves to enclose the - // entity chunks will get initialized, but the entity will never have - // been added to the freshly minted chunks. - // - // We'd have to do some nonsense like check every entity for every chunk - // if it overlaps when we insert, which is not a thing. - /* Assert(Got); */ - } - } -} - -link_internal void -InsertEntityIntoChunks(world *World, entity *Entity, memory_arena *TempMemory) -{ - // nocheckin - /* Assert(Entity->Behavior & EntityBehaviorFlags_EntityCollision); */ - - auto MinP = Entity->LastResolvedPosInfo.P; - auto MaxP = Canonicalize(World->ChunkDim, Entity->LastResolvedPosInfo.P + Entity->LastResolvedPosInfo._CollisionVolumeRadius*2.f); - - rect3cp EntityArea = RectMinMax(MinP, MaxP); - world_chunk_ptr_buffer Chunks = GatherChunksOverlappingArea(World, EntityArea, TempMemory); - if (Chunks.Count) - { - /* Info("Attempting to insert Entity(%p) into (%d) Chunks", Entity, Chunks.Count); */ - RangeIterator_t(umm, ChunkIndex, Chunks.Count) - { - world_chunk *Chunk = Chunks.Start[ChunkIndex]; - /* Info("Attempting to insert Entity(%p) into Chunk(%p)", Entity, Chunk); */ - - Push(&Chunk->Entities, &Entity); - } - } -} - link_internal void UpdateCollisionVolumeRadius(world *World, entity *Entity, v3 NewRadius, memory_arena *TempMemory) { @@ -327,3 +259,9 @@ GetEntityCenterP(world *World, entity *Entity) link_internal entity * GetEntity(entity **EntityTable, entity_id Id); + +link_internal void +DropEntityFromPreviouslyOccupiedChunks(world *World, entity *Entity, memory_arena *TempMemory); + +link_internal void +InsertEntityIntoChunks(world *World, entity *Entity, memory_arena *TempMemory); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index b4574e649..fce35d84a 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -1,3 +1,5 @@ +poof( block_array_c(entity_ptr, {8}) ) +#include poof(block_array_c(world_chunk_ptr, {32})) #include diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 4e8f7aea2..6e316f175 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -302,8 +302,8 @@ poof( struct entity; typedef entity* entity_ptr; -poof( block_array(entity_ptr, {8}) ) -#include +poof( block_array_h(entity_ptr, {8}, {}) ) +#include diff --git a/src/tests/containers/block_array.cpp b/src/tests/containers/block_array.cpp index 6fb6c4bf4..1ed551fa6 100644 --- a/src/tests/containers/block_array.cpp +++ b/src/tests/containers/block_array.cpp @@ -3,6 +3,10 @@ #include #include +global_variable memory_arena _Memory; + +global_variable memory_arena *Memory = &_Memory; + link_internal void Print(u32_block_array *Array) @@ -16,7 +20,7 @@ Print(u32_block_array *Array) link_internal u32_block_array MakeOrderedBlockArray(u32 Count) { - u32_block_array Array = {}; + u32_block_array Array = U32BlockArray(Memory); // Insert 8 elements RangeIterator_t(u32, Index, Count) @@ -30,7 +34,7 @@ MakeOrderedBlockArray(u32 Count) link_internal void TrivialAddRemove() { - u32_block_array Array = {}; + u32_block_array Array = U32BlockArray(Memory); u32 Element = 69; @@ -56,7 +60,7 @@ TrivialAddRemove() link_internal void TwoBlocksRemoveFromEnd() { - u32_block_array Array = {}; + u32_block_array Array = U32BlockArray(Memory); // Insert 8 elements RangeIterator_t(u32, Index, 8) @@ -130,7 +134,7 @@ TwoBlocksRemoveFromEnd() link_internal void TwoBlocksRemoveFromFront() { - u32_block_array Array = {}; + u32_block_array Array = U32BlockArray(Memory); // Insert 8 elements RangeIterator_t(u32, Index, 8) @@ -265,6 +269,16 @@ RemoveAllBlocks() } +link_internal void +Remove0thElementInTwoElementList() +{ + auto Array = MakeOrderedBlockArray(2); + + auto Z = ZerothIndex(&Array); + + RemoveUnordered(&Array, Z); +} + s32 main(s32 ArgCount, const char** Args) { @@ -280,6 +294,8 @@ main(s32 ArgCount, const char** Args) RemoveAllBlocks(); + Remove0thElementInTwoElementList(); + TestSuiteEnd(); exit(TestsFailed); } From 8dd8fdf3a686df3f1f20c896c27f947171827194 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 19 Feb 2025 15:08:40 -0700 Subject: [PATCH 178/421] Couple minor bugfixes --- examples/terrain_gen/game_constants.h | 4 +- .../block_array_c_asset_thumbnail_688856411.h | 2 +- generated/deserialize_struct_level_header.h | 10 + ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- .../do_editor_ui_for_compound_type_struct.h | 64 +++++-- ...e_struct_terrain_finalize_render_context.h | 115 ++++++++++++ ...d_type_struct_terrain_gen_render_context.h | 145 +++++++++++++++ ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 172 ++++++++++++++++++ .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- generated/serialize_struct_level_header.h | 11 ++ .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- jesse.make.sh | 2 +- shaders/terrain/cliffy_hills.fragmentshader | 18 +- shaders/terrain/gradient.fragmentshader | 9 +- src/engine/api.cpp | 2 - src/engine/editor.cpp | 58 +++--- src/engine/graphics.h | 6 +- src/engine/level.h | 2 + src/engine/resources.cpp | 4 +- src/engine/serialize.cpp | 2 + src/engine/world.cpp | 1 + src/engine/world_chunk.cpp | 2 + src/game_loader.cpp | 1 + 110 files changed, 652 insertions(+), 158 deletions(-) create mode 100644 generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h create mode 100644 generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h create mode 100644 generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index b4fec95ad..0d4222dd7 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -17,11 +17,11 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ -/* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ +g_VisibleRegion = Chunk_Dimension(256, 256, 256); /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ -g_VisibleRegion = Chunk_Dimension(16, 16, 16); +/* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ /* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 551808565..eb5e4c89d 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:60:0 +// src/engine/editor.cpp:47:0 diff --git a/generated/deserialize_struct_level_header.h b/generated/deserialize_struct_level_header.h index e46d1cba9..8dd581ac1 100644 --- a/generated/deserialize_struct_level_header.h +++ b/generated/deserialize_struct_level_header.h @@ -57,6 +57,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->RenderSettings, Memory); + + + + + { + umm Count = (256); + + Result &= Deserialize(Bytes, Element->TerrainGenShader, Memory, Count); + } + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 8f04be50e..1f8537464 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:195:0 +// src/engine/editor.cpp:182:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index e6d9b86ff..dc076bc32 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:298:0 +// src/engine/editor.cpp:285:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index bea8bc85f..d4125eb01 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:290:0 +// src/engine/editor.cpp:277:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index d97141ff1..d24f32f52 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:320:0 +// src/engine/editor.cpp:307:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index cd73e365c..3b30913b9 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:201:0 +// src/engine/editor.cpp:188:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 25cbcd26f..fae2ad551 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:134:0 +// src/engine/editor.cpp:121:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index a1002862d..876b4a42a 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:329:0 +// src/engine/editor.cpp:316:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index d2f64067e..ae00ad436 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:89:0 +// src/engine/editor.cpp:76:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 340b1786b..73736008f 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:314:0 +// src/engine/editor.cpp:301:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index d23fdcf0c..c6e3560ef 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:231:0 +// src/engine/editor.cpp:218:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 27c8b5973..d78808ecb 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:323:0 +// src/engine/editor.cpp:310:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 60b0bee22..b4b4a7c8f 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:301:0 +// src/engine/editor.cpp:288:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 45849b6a7..f9647e9a1 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:130:0 +// src/engine/editor.cpp:117:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 1e9704438..30ad7ab1f 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:405:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index c6cc15879..cef082364 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:431:0 +// src/engine/editor.cpp:426:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 08560f744..d6157abfa 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:427:0 +// src/engine/editor.cpp:423:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 3ce666f3d..b278112b9 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:270:0 +// src/engine/editor.cpp:257:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 571b75347..e51bcd691 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:267:0 +// src/engine/editor.cpp:254:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 3683411c9..e7887d1fd 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:304:0 +// src/engine/editor.cpp:291:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 8b3371f50..4118fbe82 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:255:0 +// src/engine/editor.cpp:242:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index e47a53660..9218364bb 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:311:0 +// src/engine/editor.cpp:298:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index a03308f1f..4abc6f9dc 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:397:0 +// src/engine/editor.cpp:384:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 33dabe036..d4f6fa3fd 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:391:0 +// src/engine/editor.cpp:378:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 0d80b3791..1ddd52289 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:237:0 +// src/engine/editor.cpp:224:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index c0060e06e..9b76a74bd 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:240:0 +// src/engine/editor.cpp:227:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 4c4879abf..eb27b966f 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:400:0 +// src/engine/editor.cpp:396:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 3de6eb6d9..ac1b68699 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:424:0 +// src/engine/editor.cpp:420:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 2cee38651..8515970a5 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:123:0 +// src/engine/editor.cpp:110:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 979a6fecb..f1d0b3e4d 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:120:0 +// src/engine/editor.cpp:107:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index e09f07d3f..6425b4adb 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:192:0 +// src/engine/editor.cpp:179:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index cf40ff0ea..46e8fa06d 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:332:0 +// src/engine/editor.cpp:319:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 52867c32d..013238e91 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:415:0 +// src/engine/editor.cpp:411:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index f1f272a81..e3cf14150 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:394:0 +// src/engine/editor.cpp:381:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 53e08d225..139ac40e7 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:171:0 +// src/engine/editor.cpp:158:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 9ed93283a..de029078c 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:243:0 +// src/engine/editor.cpp:230:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 9e972f3ea..d843228ec 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:246:0 +// src/engine/editor.cpp:233:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 805eb8e4c..2b3de12ef 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:326:0 +// src/engine/editor.cpp:313:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 86eb259e8..bfbeb411e 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:280:0 +// src/engine/editor.cpp:267:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index fd969f392..9255b96bb 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:186:0 +// src/engine/editor.cpp:173:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index fca421c1c..e4dc1a8d4 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:189:0 +// src/engine/editor.cpp:176:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 6dfc79099..84edd4ded 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:75:0 +// src/engine/editor.cpp:62:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index b7beefd3b..6f139a8ef 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:177:0 +// src/engine/editor.cpp:164:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 2e709d258..9f0c48074 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:308:0 +// src/engine/editor.cpp:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 5b793a9cf..0257596e7 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:126:0 +// src/engine/editor.cpp:113:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index e35cbfc50..de7931aa2 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:180:0 +// src/engine/editor.cpp:167:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index e2f2fdeed..d6310e248 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:385:0 +// src/engine/editor.cpp:372:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 2c6033aa4..e049e7bf7 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:403:0 +// src/engine/editor.cpp:399:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 0cb8f3152..82985eb19 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:174:0 +// src/engine/editor.cpp:161:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 25141ee87..34394677b 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:388:0 +// src/engine/editor.cpp:375:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index ddbb31b66..12df7ada3 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:382:0 +// src/engine/editor.cpp:369:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index d7e651149..5a2588c9f 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:87:0 +// src/engine/editor.cpp:74:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct.h b/generated/do_editor_ui_for_compound_type_struct.h index 7c731ebb2..8aa0180ab 100644 --- a/generated/do_editor_ui_for_compound_type_struct.h +++ b/generated/do_editor_ui_for_compound_type_struct.h @@ -1,7 +1,7 @@ -// src/engine/editor.cpp:360:0 +// src/engine/editor.cpp:430:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) { if (Element) { @@ -11,7 +11,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_brush", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_gen_render_context", Element), Params)) { DidToggle = True; PushNewRow(Ui); @@ -26,15 +26,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - if (ToggleButton(Ui, CSz("v NameBuf[(256) + 1]"), CSz("> NameBuf[(256) + 1]"), UiId(Window, "toggle world_edit_brush char NameBuf", Element->NameBuf), Params )) + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Program), + CSz("Program"), + Params + ); + + + + + + + + + if (ToggleButton(Ui, CSz("v Uniforms[3]"), CSz("> Uniforms[3]"), UiId(Window, "toggle terrain_gen_render_context shader_uniform Uniforms", Element->Uniforms), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, (256) + 1) + RangeIterator(ArrayIndex, 3) { - DoEditorUi(Ui, Window, Element->NameBuf+ArrayIndex, FSz("NameBuf[%d]", ArrayIndex), Params); + DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); - PushNewRow(Ui); + } CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -42,13 +57,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs - PushNewRow(Ui); - + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode*, &Element->Mode), - CSz("Mode"), + Cast(texture*, &Element->NoiseTexture), + CSz("NoiseTexture"), Params ); @@ -62,8 +76,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode_modifier*, &Element->Modifier), - CSz("Modifier"), + Cast(framebuffer*, &Element->FBO), + CSz("FBO"), Params ); @@ -77,8 +91,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->Ordinal), - CSz("Ordinal"), + Cast(v3*, &Element->ChunkDim), + CSz("ChunkDim"), Params ); @@ -88,13 +102,27 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs - PushNewRow(Ui); + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->WorldspaceBasis), + CSz("WorldspaceBasis"), + Params + ); + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(layered_brush*, &Element->Layered), - CSz("Layered"), + Cast(v3*, &Element->ChunkResolution), + CSz("ChunkResolution"), Params ); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h new file mode 100644 index 000000000..6cbf20702 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -0,0 +1,115 @@ +// src/engine/editor.cpp:390:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_finalize_render_context", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Program), + CSz("Program"), + Params + ); + + + + + + + + + if (ToggleButton(Ui, CSz("v Uniforms[1]"), CSz("> Uniforms[1]"), UiId(Window, "toggle terrain_finalize_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 1) + { + DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->DestTexture), + CSz("DestTexture"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(framebuffer*, &Element->FBO), + CSz("FBO"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, Element->InputTex), + CSz("InputTex"), + Params + ); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h new file mode 100644 index 000000000..ea250b81d --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h @@ -0,0 +1,145 @@ +// src/engine/editor.cpp:387:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_gen_render_context", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Program), + CSz("Program"), + Params + ); + + + + + + + + + if (ToggleButton(Ui, CSz("v Uniforms[3]"), CSz("> Uniforms[3]"), UiId(Window, "toggle terrain_gen_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 3) + { + DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->NoiseTexture), + CSz("NoiseTexture"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(framebuffer*, &Element->FBO), + CSz("FBO"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ChunkDim), + CSz("ChunkDim"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->WorldspaceBasis), + CSz("WorldspaceBasis"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ChunkResolution), + CSz("ChunkResolution"), + Params + ); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 43309f76d..bace9809e 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:338:0 +// src/engine/editor.cpp:325:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index c5ab3a54f..96f845d62 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:335:0 +// src/engine/editor.cpp:322:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h new file mode 100644 index 000000000..4421f7c18 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -0,0 +1,172 @@ +// src/engine/editor.cpp:393:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_render_context", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Program), + CSz("Program"), + Params + ); + + + + + + + + + if (ToggleButton(Ui, CSz("v Uniforms[4]"), CSz("> Uniforms[4]"), UiId(Window, "toggle world_edit_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 4) + { + DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + if (ToggleButton(Ui, CSz("v PingPongFBOs[2]"), CSz("> PingPongFBOs[2]"), UiId(Window, "toggle world_edit_render_context framebuffer PingPongFBOs", Element->PingPongFBOs), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 2) + { + DoEditorUi(Ui, Window, Element->PingPongFBOs+ArrayIndex, FSz("PingPongFBOs[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + if (ToggleButton(Ui, CSz("v PingPongTextures[2]"), CSz("> PingPongTextures[2]"), UiId(Window, "toggle world_edit_render_context texture PingPongTextures", Element->PingPongTextures), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 2) + { + DoEditorUi(Ui, Window, Element->PingPongTextures+ArrayIndex, FSz("PingPongTextures[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, Element->ChunkDim), + CSz("ChunkDim"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, Element->WorldspaceBasis), + CSz("WorldspaceBasis"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, Element->ChunkResolution), + CSz("ChunkResolution"), + Params + ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->Type), + CSz("Type"), + Params + ); + + + + + + + + PushNewRow(Ui); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 17ecdb193..27dd5b877 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:317:0 +// src/engine/editor.cpp:304:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 8493ab0e8..e8fab5e45 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:402:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index f3a1dd59a..04543707d 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:96:0 +// src/engine/editor.cpp:83:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 79c9f60e7..e35928cec 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:99:0 +// src/engine/editor.cpp:86:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index ba11bc906..d2327d2fe 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:204:0 +// src/engine/editor.cpp:191:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index d8ca52d55..45d70f699 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:198:0 +// src/engine/editor.cpp:185:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 066f183ba..58cf15ef0 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:78:0 +// src/engine/editor.cpp:65:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 24836ec9a..6ea6df2c7 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:234:0 +// src/engine/editor.cpp:221:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 962366de0..2f52d6b13 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:225:0 +// src/engine/editor.cpp:212:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 48ebdfe10..0d464e133 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:228:0 +// src/engine/editor.cpp:215:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 1eed15c80..323a425cf 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:72:0 +// src/engine/editor.cpp:59:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 38e58cbdf..e1919b1f7 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:117:0 +// src/engine/editor.cpp:104:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 8b4b6bf7f..564d880cb 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:114:0 +// src/engine/editor.cpp:101:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index d2d0f4f79..d2712c393 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:283:0 +// src/engine/editor.cpp:270:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 994c98627..cd42aec6a 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:277:0 +// src/engine/editor.cpp:264:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index f70355844..9784eb11f 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:83:0 +// src/engine/editor.cpp:70:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index b2fa83b69..85c4cfa4b 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:81:0 +// src/engine/editor.cpp:68:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 48511683a..14dafeb98 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:274:0 +// src/engine/editor.cpp:261:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 258942ff2..ea466c0cd 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:249:0 +// src/engine/editor.cpp:236:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 6f1173cb5..144d2f535 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:108:0 +// src/engine/editor.cpp:95:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 5ae87d777..94c2d7a00 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:93:0 +// src/engine/editor.cpp:80:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 9af8c9843..5fb9b7b6d 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:295:0 +// src/engine/editor.cpp:282:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index faafa1fe4..cd1cef206 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:222:0 +// src/engine/editor.cpp:209:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index f4c2a4583..afa103127 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:412:0 +// src/engine/editor.cpp:408:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 651ecff37..485fa9a5a 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:162:0 +// src/engine/editor.cpp:149:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 98f39f99c..91822e91a 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:159:0 +// src/engine/editor.cpp:146:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index f2d60051a..6973eae0c 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:252:0 +// src/engine/editor.cpp:239:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 74113021a..01b2dd96a 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:183:0 +// src/engine/editor.cpp:170:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 2070d3393..c5719c128 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:418:0 +// src/engine/editor.cpp:414:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index fad31fb1e..46cf0e6c8 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:421:0 +// src/engine/editor.cpp:417:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 3b73d7b74..7ee71b0c3 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:85:0 +// src/engine/editor.cpp:72:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 9c154e253..2317cdbad 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:165:0 +// src/engine/editor.cpp:152:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/serialize_struct_level_header.h b/generated/serialize_struct_level_header.h index 2752474e7..b8734b5ac 100644 --- a/generated/serialize_struct_level_header.h +++ b/generated/serialize_struct_level_header.h @@ -71,6 +71,17 @@ Serialize(u8_cursor_block_array *Bytes, level_header *BaseElement, umm Count = 1 Result &= Serialize(Bytes, &Element->RenderSettings); // default + + + + + + { + umm ThisCount = (256); + + Result &= Serialize(Bytes, Element->TerrainGenShader, ThisCount); + } + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index ebf46c5ef..90921b16d 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:293:0 +// src/engine/editor.cpp:280:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index b20a3065f..5f586b19f 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:155:0 +// src/engine/editor.cpp:142:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 490f6443c..118ef4138 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:149:0 +// src/engine/editor.cpp:136:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 9f5cce61f..e85850146 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:146:0 +// src/engine/editor.cpp:133:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 2092dce1d..f365ed3d4 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:152:0 +// src/engine/editor.cpp:139:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/jesse.make.sh b/jesse.make.sh index 81197b57f..4a47e50e2 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/cliffy_hills.fragmentshader b/shaders/terrain/cliffy_hills.fragmentshader index fb27d926d..8cfbcfdd6 100644 --- a/shaders/terrain/cliffy_hills.fragmentshader +++ b/shaders/terrain/cliffy_hills.fragmentshader @@ -2,7 +2,7 @@ uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; in vec2 UV; -out uint Output; +out v4 Output; /// // @@ -680,19 +680,19 @@ void main() NoiseValue += NoiseToTile; } #endif - - - } // // -- end user code -- // - uint SolidBit = NoiseValue > 0.f ? 1u : 0u; - ColorValue = min(ColorValue, v3(1.f)); - uint PackedColor = PackRGB(ColorValue); - /* uint PackedColor = 3543u; */ + Output.rgb = ColorValue; + Output.a = NoiseValue; + + /* uint SolidBit = NoiseValue > 0.f ? 1u : 0u; */ + /* ColorValue = min(ColorValue, v3(1.f)); */ + /* uint PackedColor = PackRGB(ColorValue); */ + /* /1* uint PackedColor = 3543u; *1/ */ - Output = (SolidBit << 15) | PackedColor; + /* Output = (SolidBit << 15) | PackedColor; */ } diff --git a/shaders/terrain/gradient.fragmentshader b/shaders/terrain/gradient.fragmentshader index b79380848..2c558d39b 100644 --- a/shaders/terrain/gradient.fragmentshader +++ b/shaders/terrain/gradient.fragmentshader @@ -2,7 +2,7 @@ uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; in vec2 UV; -out uint Output; +out v4 Output; /* layout (location = 0) out float Output; */ @@ -182,9 +182,6 @@ void main() // -- end user code -- // - uint SolidBit = NoiseValue > 0.f ? 1u : 0u; - uint PackedColor = PackRGB(ColorValue); - /* uint PackedColor = 3543u; */ - - Output = (SolidBit << 15) | PackedColor; + Output.rgb = ColorValue; + Output.a = NoiseValue; } diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 8720cd22a..75528150b 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -98,8 +98,6 @@ Bonsai_FrameBegin(engine_resources *Resources) CancelAllWorkQueueJobs(Resources); Assert(Count(&Resources->Graphics.NoiseReadbackJobs) == 0); - Resources->Graphics.NoiseFinalizeJobsPending = 0; - HardResetWorld(Resources); UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index a5b881860..918ac1e39 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -23,19 +23,6 @@ InitEditor(level_editor *Editor) link_internal b32 HardResetEditor(level_editor *Editor) { - // TODO(Jesse)(leak): Delete textures allocated to visualize layered noise brushes? - // @hard_reset_texture_memory - - /* if (Editor->Shape.Preview.Thumbnail.Texture.ID) */ - /* { */ - /* DeleteTexture(&Editor->Shape.Preview.Thumbnail.Texture); */ - /* } */ - - /* if (Editor->Noise.Preview.Thumbnail.Texture.ID) */ - /* { */ - /* DeleteTexture(&Editor->Noise.Preview.Thumbnail.Texture); */ - /* } */ - IterateOver(&Editor->AssetThumbnails, Thumb, Index) { DeleteTexture(&Thumb->Texture); @@ -397,6 +384,15 @@ poof(do_editor_ui_for_compound_type(lighting_render_group)) poof(do_editor_ui_for_compound_type(g_buffer_render_group)) #include +poof(do_editor_ui_for_compound_type(terrain_gen_render_context)) +#include + +poof(do_editor_ui_for_compound_type(terrain_finalize_render_context)) +#include + +poof(do_editor_ui_for_compound_type(world_edit_render_context)) +#include + poof(do_editor_ui_for_compound_type(graphics)) #include @@ -427,7 +423,6 @@ poof(do_editor_ui_for_compound_type(graphics_settings)) poof(do_editor_ui_for_compound_type(engine_settings)) #include - poof(do_editor_ui_for_compound_type(engine_resources)) #include @@ -2942,6 +2937,9 @@ DoLevelWindow(engine_resources *Engine) thread_local_state *Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); + // + // Level Export + // PushWindowStart(Ui, &Window); PushTableStart(Ui); if (Button(Ui, CSz("Export Level"), UiId(&Window, "export_level_button", 0ull))) @@ -2956,6 +2954,7 @@ DoLevelWindow(engine_resources *Engine) } level_header Header = {}; + Header.WorldCenter = World->Center; Header.VisibleRegion = World->VisibleRegion; Header.Camera = *Camera; @@ -2963,6 +2962,10 @@ DoLevelWindow(engine_resources *Engine) Header.EntityCount = EntityCount; Header.EditCount = u32(TotalElements(&Editor->WorldEdits)); + cs TerrainFragShaderFilename = Engine->Graphics.TerrainGenRC.Program.FragSourceFilename; + cs Dest = CS(Header.TerrainGenShader, NameBuf_Len); + CopyString(&TerrainFragShaderFilename, &Dest); + Serialize(&OutputStream, &Header); u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; @@ -3010,7 +3013,9 @@ DoLevelWindow(engine_resources *Engine) PushTableEnd(Ui); PushNewRow(Ui); - // Import + // + // Level Import + // if (ClickedNode.Tag) { cs Filename = Concat(ClickedNode.Value.Dir, CSz("/"), ClickedNode.Value.Name, GetTranArena()); @@ -3020,7 +3025,7 @@ DoLevelWindow(engine_resources *Engine) { level_header LevelHeader = {}; - + Leak("Leaking level_header because we need to hold the level_header::TerrainGenShader such that we can reload the shader next frame .."); if (Deserialize(&LevelBytes, &LevelHeader, Thread->PermMemory)) { u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; @@ -3039,14 +3044,20 @@ DoLevelWindow(engine_resources *Engine) SignalAndWaitForWorkers(&Plat->WorkerThreadsSuspendFutex); - /* SoftResetEngine(Engine); */ - HardResetEngine(Engine); - World->Center = LevelHeader.WorldCenter; + Graphics->Settings = LevelHeader.RenderSettings; + *Graphics->Camera = LevelHeader.Camera; + World->VisibleRegion = LevelHeader.VisibleRegion; + World->Center = LevelHeader.WorldCenter; + + /* Global_ProjectSwitcherGameLibName = LevelHeader.TerrainGenShader; */ - Graphics->Settings = LevelHeader.RenderSettings; - *Graphics->Camera = LevelHeader.Camera; - /* World->VisibleRegion = LevelHeader.VisibleRegion; */ + Engine->Graphics.TerrainGenRC.Program.FragSourceFilename = CopyString(LevelHeader.TerrainGenShader, Thread->PermMemory); + Engine->Graphics.TerrainGenRC.Program.FragmentTimeModifiedWhenLoaded = 0; + + // Must come after we fill out the VisibleRegion so the root octree node + // gets initialized to the correct size + HardResetEngine(Engine); /* s32 ChunkCount = Cast(s32, LevelHeader.ChunkCount); */ s32 ChunkCount = 0; @@ -3063,9 +3074,10 @@ DoLevelWindow(engine_resources *Engine) { FinalEdit->Brush = Upsert(*FinalEdit->Brush, &Editor->LoadedBrushes, Editor->Memory); } - ApplyEditToOctree(Engine, FinalEdit, GetTranArena()); } + /* ApplyEditBufferToOctree(Engine, &Editor->WorldEdits); */ + Ensure(Read_u64(&LevelBytes) == Delimeter); b32 Error = False; diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 7d7d63956..8aa3f3736 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -134,9 +134,9 @@ struct graphics v3 MaxClipP_worldspace; // TODO(Jesse): None of these need to be pointers.. - g_buffer_render_group *gBuffer; - ao_render_group *AoGroup; - shadow_render_group *SG; + g_buffer_render_group *gBuffer; + ao_render_group *AoGroup; + shadow_render_group *SG; // NOTE(Jesse): This is the CPU-side color palette. It is the source of truth. diff --git a/src/engine/level.h b/src/engine/level.h index f66cf5a90..e81dee24d 100644 --- a/src/engine/level.h +++ b/src/engine/level.h @@ -12,4 +12,6 @@ struct level_header camera Camera; render_settings RenderSettings; + + char TerrainGenShader[NameBuf_Len]; }; diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index cf20372dd..e9852bcb8 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -202,9 +202,7 @@ HardResetWorld(engine_resources *Engine) { world *World = Engine->World; - /* FreeOctreeChildren(Engine, &World->Root); */ - /* if (World->Root.Chunk) { FreeWorldChunk(Engine, World->Root.Chunk); } */ - /* InitOctreeNode(World, &World->Root, {}, World->VisibleRegion, {}); */ + Engine->Graphics.NoiseFinalizeJobsPending = 0; VaporizeArena(World->ChunkMemory); VaporizeArena(World->OctreeMemory); diff --git a/src/engine/serialize.cpp b/src/engine/serialize.cpp index 5fca99099..ac9ffc034 100644 --- a/src/engine/serialize.cpp +++ b/src/engine/serialize.cpp @@ -3,6 +3,8 @@ link_internal u8_cursor_block_array BeginSerialization() { + Assert(Global_SerializeTypeTableArena == 0); + Global_SerializeTypeTableArena = AllocateArena(); Global_SerializeTypeTable = Allocate_bonsai_type_info_hashtable(64, Global_SerializeTypeTableArena); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 8b6a7d885..ef650b20d 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -1042,6 +1042,7 @@ MaintainWorldOctree(engine_resources *Engine) // ways (editing), which can cause (MAX_OCTREE_NODES_QUEUED_PER_FRAME - ChunksCurrentlyQueued) to be negative s32 MaxToQueueThisFrame = Max(0, MAX_OCTREE_NODES_QUEUED_PER_FRAME - ChunksCurrentlyQueued); Assert(MaxToQueueThisFrame <= MAX_OCTREE_NODES_QUEUED_PER_FRAME); + /* DEBUG_VALUE_u32(MaxToQueueThisFrame); */ /* DEBUG_VALUE_u32(u32(ChunksCurrentlyQueued)); */ /* DEBUG_VALUE_u32(u32(MaxToQueueThisFrame)); */ diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index fce35d84a..61fcab50c 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3508,6 +3508,7 @@ QueueChunkForInit(work_queue *Queue, octree_node *Node, world_chunk_mesh_bitfiel ++TotalChunksQueued; +#if 0 { Assert(Node->Chunk->Dim.x == 64); DebugLine("Queuing Chunk (%p)(%d) WorldP(%d, %d, %d) DimInChunks(%d, %d, %d) Dim(%d, %d, %d)", Node->Chunk, Node->Chunk->Flags, @@ -3521,6 +3522,7 @@ QueueChunkForInit(work_queue *Queue, octree_node *Node, world_chunk_mesh_bitfiel Node->Chunk->Dim.y, Node->Chunk->Dim.z); } +#endif #if 0 work_queue_entry Entry = {}; diff --git a/src/game_loader.cpp b/src/game_loader.cpp index 08bc3be86..924f74635 100644 --- a/src/game_loader.cpp +++ b/src/game_loader.cpp @@ -287,6 +287,7 @@ main( s32 ArgCount, const char ** Args ) EngineResources->RequestedGameLibReloadBehavior = game_lib_reload_behavior(EngineResources->RequestedGameLibReloadBehavior & ~GameLibReloadBehavior_FullInitialize); HardResetEngine(EngineResources); + /* ApplyEditBufferToOctree(Engine, &Editor->WorldEdits); */ EngineResources->GameState = GameApi->GameInit(EngineResources, MainThread); if (!EngineResources->GameState) { Error("Initializing Game :( "); return 1; } From c087c3773fba340988acaa9bb4aed8a797f14064 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 19 Feb 2025 15:09:31 -0700 Subject: [PATCH 179/421] Update stdlib --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 72b276067..37f3b6999 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 72b276067d1e8b70d515894bb3958e6f729ab2c4 +Subproject commit 37f3b69998dbf1bb184d9c67be0d160caa7034b1 From 25f0e1370b86c50e60dd3d35e773338e2ffd3fe5 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 27 Feb 2025 12:43:38 -0700 Subject: [PATCH 180/421] Continue implementing world edit shader --- examples/terrain_gen/game_constants.h | 4 +- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- ...or_ui_for_compound_type_world_edit_brush.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 3 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- ...on_pattern_199741702_161749140_632272777.h | 2 +- ..._iteration_pattern_275071431_101859599_0.h | 2 +- ..._iteration_pattern_275071431_785723886_0.h | 2 +- ..._iteration_pattern_846291950_267608728_0.h | 2 +- generated/hashtable_struct.h | 2 +- .../rectalinear_iteration_pattern_416827956.h | 2 +- .../rectalinear_iteration_pattern_428632106.h | 2 +- .../rectalinear_iteration_pattern_631222419.h | 2 +- .../rectalinear_iteration_pattern_812652930.h | 2 +- .../rectalinear_iteration_pattern_992879728.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 5 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ..._value_tables_world_update_op_shape_type.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- jesse.make.sh | 2 +- shaders/terrain/default.fragmentshader | 34 ++-- shaders/terrain/voronoi.fragmentshader | 12 +- shaders/terrain/world_edit.fragmentshader | 174 ++++++++++++++++-- src/engine/api.cpp | 2 + src/engine/editor.cpp | 14 +- src/engine/editor.h | 9 +- src/engine/render_loop.cpp | 18 +- src/engine/world_update.cpp | 14 ++ 45 files changed, 274 insertions(+), 83 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 0d4222dd7..b4fec95ad 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -17,11 +17,11 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ -g_VisibleRegion = Chunk_Dimension(256, 256, 256); +/* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ -/* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ +g_VisibleRegion = Chunk_Dimension(16, 16, 16); /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ /* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 39d2af15b..d197b456a 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:957:0 +// src/engine/editor.h:958:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index b78650fc0..9f7db738c 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:694:0 +// src/engine/editor.h:695:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index aad33857d..d660cb2a6 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1136:0 +// src/engine/editor.h:1137:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index e80795425..65b1a2164 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1150:0 +// src/engine/editor.h:1151:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index f6b482b07..599df4eb2 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1152:0 +// src/engine/editor.h:1153:0 diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index fabf75d06..03901097b 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1022:0 +// src/engine/editor.h:1023:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index 692b285bd..6f0887cde 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1015:0 +// src/engine/editor.h:1016:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index 662aa5210..cff649bb2 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1008:0 +// src/engine/editor.h:1009:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 96c652a35..b77443af4 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:885:0 +// src/engine/editor.h:886:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 84edd4ded..e87e9c4bb 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -32,7 +32,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, Cast(r32*, &Element->Threshold), CSz("Threshold"), Params - , 0.1f, 20.f ); + , 0.f, 1.f ); diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 58cf15ef0..00cce66c7 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -32,7 +32,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element Cast(r32*, &Element->Threshold), CSz("Threshold"), Params - , 0.1f, 20.f ); + , 0.f, 1.f ); diff --git a/generated/do_editor_ui_for_compound_type_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_world_edit_brush.h index 58f354b67..f20fe1823 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:822:0 +// src/engine/editor.h:823:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 55d22f8df..a037c34a9 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:722:0 +// src/engine/editor.h:723:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index e99a4c055..6d8cd1169 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:899:0 +// src/engine/editor.h:900:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index c1fa8b6c1..1b75ab2a8 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:728:0 +// src/engine/editor.h:729:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) @@ -20,6 +20,7 @@ RadioButtonGroup_world_edit_blend_mode( renderer_2d *Ui, { { CSz("Additive"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Additive")), WorldEdit_Mode_Additive }, { CSz("Subtractive"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Subtractive")), WorldEdit_Mode_Subtractive }, + { CSz("Threshold"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Threshold")), WorldEdit_Mode_Threshold }, { CSz("Disabled"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Disabled")), WorldEdit_Mode_Disabled }, }; diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 38f849f48..90ebd3c4c 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:711:0 +// src/engine/editor.h:712:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index c89d5466f..9443775db 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:740:0 +// src/engine/editor.h:741:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 266b8adc0..c83d76d6d 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:733:0 +// src/engine/editor.h:734:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index dc2135bbb..feccca1d9 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:737:0 +// src/engine/editor.h:738:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index 5487902ec..5c1cfeeb1 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:570:0 +// src/engine/world_update.cpp:572:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h index 50fc63925..864665edd 100644 --- a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:825:0 +// src/engine/world_update.cpp:829:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h index d1eb532d7..e7f0a9268 100644 --- a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h +++ b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:807:0 +// src/engine/world_update.cpp:811:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h index 5c9eb7410..159c805f3 100644 --- a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h +++ b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:680:0 +// src/engine/world_update.cpp:684:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/hashtable_struct.h b/generated/hashtable_struct.h index b61246013..3e277e041 100644 --- a/generated/hashtable_struct.h +++ b/generated/hashtable_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1139:0 +// src/engine/editor.h:1140:0 struct world_edit_brush_linked_list_node { diff --git a/generated/rectalinear_iteration_pattern_416827956.h b/generated/rectalinear_iteration_pattern_416827956.h index 9d4609326..59073c234 100644 --- a/generated/rectalinear_iteration_pattern_416827956.h +++ b/generated/rectalinear_iteration_pattern_416827956.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:711:0 +// src/engine/world_update.cpp:715:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_428632106.h b/generated/rectalinear_iteration_pattern_428632106.h index 67228006d..bc0fd9dec 100644 --- a/generated/rectalinear_iteration_pattern_428632106.h +++ b/generated/rectalinear_iteration_pattern_428632106.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:870:0 +// src/engine/world_update.cpp:874:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_631222419.h b/generated/rectalinear_iteration_pattern_631222419.h index e6f32f9f9..a73488034 100644 --- a/generated/rectalinear_iteration_pattern_631222419.h +++ b/generated/rectalinear_iteration_pattern_631222419.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:753:0 +// src/engine/world_update.cpp:757:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index 557914a55..2c332c363 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:605:0 +// src/engine/world_update.cpp:607:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/rectalinear_iteration_pattern_992879728.h b/generated/rectalinear_iteration_pattern_992879728.h index 96915fb18..c94ee455e 100644 --- a/generated/rectalinear_iteration_pattern_992879728.h +++ b/generated/rectalinear_iteration_pattern_992879728.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:775:0 +// src/engine/world_update.cpp:779:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 335b51fe5..b0cdec3e5 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:849:0 +// src/engine/editor.h:850:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 76ac064d6..9656ebf83 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:725:0 +// src/engine/editor.h:726:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) @@ -8,6 +8,7 @@ ToStringPrefixless(world_edit_blend_mode Type) { case WorldEdit_Mode_Additive: { Result = CSz("Additive"); } break; case WorldEdit_Mode_Subtractive: { Result = CSz("Subtractive"); } break; + case WorldEdit_Mode_Threshold: { Result = CSz("Threshold"); } break; case WorldEdit_Mode_Disabled: { Result = CSz("Disabled"); } break; @@ -24,6 +25,7 @@ ToString(world_edit_blend_mode Type) { case WorldEdit_Mode_Additive: { Result = CSz("WorldEdit_Mode_Additive"); } break; case WorldEdit_Mode_Subtractive: { Result = CSz("WorldEdit_Mode_Subtractive"); } break; + case WorldEdit_Mode_Threshold: { Result = CSz("WorldEdit_Mode_Threshold"); } break; case WorldEdit_Mode_Disabled: { Result = CSz("WorldEdit_Mode_Disabled"); } break; @@ -39,6 +41,7 @@ WorldEditBlendMode(counted_string S) if (StringsMatch(S, CSz("WorldEdit_Mode_Additive"))) { return WorldEdit_Mode_Additive; } if (StringsMatch(S, CSz("WorldEdit_Mode_Subtractive"))) { return WorldEdit_Mode_Subtractive; } + if (StringsMatch(S, CSz("WorldEdit_Mode_Threshold"))) { return WorldEdit_Mode_Threshold; } if (StringsMatch(S, CSz("WorldEdit_Mode_Disabled"))) { return WorldEdit_Mode_Disabled; } return Result; diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 60e95910e..aba2a9652 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:708:0 +// src/engine/editor.h:709:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 8c1cc82d3..86982b676 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:731:0 +// src/engine/editor.h:732:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_update_op_shape_type.h b/generated/string_and_value_tables_world_update_op_shape_type.h index 3ad5039ab..4051cede2 100644 --- a/generated/string_and_value_tables_world_update_op_shape_type.h +++ b/generated/string_and_value_tables_world_update_op_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:762:0 +// src/engine/editor.h:763:0 link_internal counted_string ToStringPrefixless(world_update_op_shape_type Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index c0ddb23e5..93636e64b 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:717:0 +// src/engine/editor.h:718:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/jesse.make.sh b/jesse.make.sh index 4a47e50e2..81197b57f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index 4edcfa49f..2f979aa6a 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -230,7 +230,7 @@ void main() // { v3 Period = V3(100.f); - float Amplitude = 200.f; + float Amplitude = 3.f; f32 StartingZDepth = 400.f; s32 Octaves = 1; @@ -238,30 +238,26 @@ void main() v3 deriv = v3(0.f); - /* f32 warp = gradient_noise(Basis*1.001); */ f32 warp = 0.f; - for (s32 Octave = 1; Octave <= Octaves; ++Octave) - { - v3 xyz = Basis / (Period/Octave); + v3 xyz = Basis / Period; - /* f32 gn = white_noise(Basis); */ - v4 gn = value_noise_derivs(xyz+warp); - /* v4 gn = gradient_noise_derivs(xyz+warp); */ - /* v4 gn = voronoi_noise(xyz+warp, V3(1.f), V3(1.f)); */ - /* v4 gn = V4(0); */ + v4 gn = gradient_noise_derivs(xyz+warp); - // NOTE(Jesse): yzw is not derivitives for voronoi_noise - deriv += gn.yzw; - /* deriv += v3(gn); */ + deriv += gn.yzw; + deriv = normalize(deriv); - NoiseValue = NoiseValue + (gn.x * (Amplitude/Octave)); - /* NoiseValue = NoiseValue + (gn * (Amplitude/Octave)); */ - } + NoiseValue = NoiseValue + (gn.x * Amplitude); - deriv = normalize(deriv); - ColorValue = abs(deriv); - /* ColorValue = v3(0.75f); */ + /* ColorValue = abs(deriv); */ + /* f32 Tint = white_noise(xyz); */ + f32 Tint = gradient_noise(xyz*60.f); + ColorValue = v3(0.1f, 0.55f + 0.1f*Tint, 0.1f); + + f32 GrassMask = gradient_noise(xyz*10.f); + f32 Grass = white_noise(V3(xyz.xy,1.f))*3.f; + + NoiseValue += abs(Grass*GrassMask); // Bias noise value to lower values as we get higher in z. // This creates a "plane" of terrain diff --git a/shaders/terrain/voronoi.fragmentshader b/shaders/terrain/voronoi.fragmentshader index d150d0873..1220d9003 100644 --- a/shaders/terrain/voronoi.fragmentshader +++ b/shaders/terrain/voronoi.fragmentshader @@ -2,7 +2,7 @@ uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; in vec2 UV; -out uint Output; +out vec4 Output; vec3 vhash(vec3 UV, vec3 offset) { @@ -11,6 +11,7 @@ vec3 vhash(vec3 UV, vec3 offset) return vec3(sin(UV.z * +offset.x) * 0.5 + 0.5, cos(UV.x* offset.y) * 0.5 + 0.5,tan(UV.y * offset.z) * 0.5 + 0.5); } +#if 0 vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) { vec3 g = floor(p * CellDensity); @@ -58,6 +59,7 @@ vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) Out.w = 1.0-smoothstep( 0.0, 0.1, res); return Out; } +#endif void main() { @@ -103,8 +105,10 @@ void main() // -- end user code -- // - uint SolidBit = NoiseValue > 0.f ? 1u : 0u; - uint PackedColor = PackRGB(ColorValue); + Output.rgb = ColorValue; + Output.a = NoiseValue; + /* uint SolidBit = NoiseValue > 0.f ? 1u : 0u; */ + /* uint PackedColor = PackRGB(ColorValue); */ - Output = (SolidBit << 15) | PackedColor; + /* Output = (SolidBit << 15) | PackedColor; */ } diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index fb266cdc9..c33d21d2d 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -6,6 +6,7 @@ uniform int BlendMode; uniform int ColorMode; uniform int Modifiers; + // // Clipping params // @@ -15,9 +16,17 @@ uniform v3 ChunkRelEditMax; // // Noise params // +uniform int NoiseType; uniform v3 RGBColor; uniform v3 Period; uniform f32 Amplitude; +uniform f32 Threshold; +uniform bool Invert; + +// +// Voronoi Params +// +uniform f32 Squareness; // 0 == not square, 1 == square @@ -26,6 +35,120 @@ uniform sampler2D InputTex; in vec2 UV; out layout(location = 0) vec4 Output; + + + +// https://thebookofshaders.com/10/ +float rand(vec2 st) { + return fract(sin(dot(st.xy, + vec2(12.9898,78.233)))* + 43758.5453123); +} + +float hash(float x) { return fract(x + 1.32154 * 1.2151); } +vec3 RandomV3FromFloat(float x) { return vec3(hash(((x + 0.5283) * 59.3829) * 274.3487), hash(((x + 0.8192) * 83.6621) * 345.3871), hash(((x + 0.2157f) * 36.6521f) * 458.3971f)); } +vec3 RandomV3FromV3(v3 V) { return vec3(rand(V.xy), rand(V.yz), rand(V.xz)); } + + +#define Floor floor +#define Abs abs +#define Clamp01(x) clamp(x, 0.f, 1.f) +#define LengthSq(V) (V.x*V.x + V.y*V.y + V.z*V.z) +#define Normalize normalize +#define Dot dot +#define Min min + +#define True true +#define False false +#define b32 bool + +link_internal f32 +voronoi(v3 Texel) +{ + v3 baseCell = Floor(Texel); + + v3 CellOffsets[27]; + + // first pass to find the closest cell + // + f32 minDistToCellSq = 100; + v3 toClosestCell; + v3 closestCell; + s32 CellIndex = 0; + for( s32 x1 = -1; + x1 <= 1; + ++x1 ) + { + for(s32 y1 = -1; + y1 <= 1; + ++y1 ) + { + for( s32 z1 = -1; + z1 <= 1; + ++z1 ) + { + v3 cell = baseCell + V3(x1, y1, z1); + v3 offset = Clamp01(RandomV3FromV3(cell) - Squareness); + v3 cellPosition = cell + offset; + + v3 toCell = cellPosition - Texel; + f32 distToCellSq = LengthSq(toCell); + if(distToCellSq < minDistToCellSq) + { + minDistToCellSq = distToCellSq; + closestCell = cell; + toClosestCell = toCell; + } + + CellOffsets[CellIndex++] = offset; + } + } + } + // + // TODO(Jesse): This seems like you'd just want to do it in-line in the first + // loop ..? + // + // second pass to find the distance to the closest edge + // + f32 minEdgeDistance = 10; + CellIndex = 0; + for( s32 x2 = -1; + x2 <= 1; + ++x2 ) + { + for(s32 y2 = -1; + y2 <= 1; + ++y2 ) + { + for( s32 z2 = -1; + z2 <= 1; + ++z2 ) + { + /* v3 cell = (baseCell + V3(x2, y2, z2)); */ + v3 cell = baseCell + V3(x2, y2, z2); + v3 offset = CellOffsets[CellIndex++]; + + v3 cellPosition = cell + offset; + v3 toCell = cellPosition - Texel; + + v3 diffToClosestCell = Abs(closestCell - cell); + b32 isClosestCell = diffToClosestCell.x + diffToClosestCell.y + diffToClosestCell.z < 0.1f; + if(isClosestCell == False) + { + v3 toCenter = (toClosestCell + toCell) * 0.5; + v3 cellDifference = Normalize(toCell - toClosestCell); + f32 edgeDistance = Dot(toCenter, cellDifference); + minEdgeDistance = Min(minEdgeDistance, edgeDistance); + } + } + } + } + return minEdgeDistance; + /* return sqrt(minDistToCellSq); */ + /* return closestCell; */ +} + + void main() { v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); @@ -57,25 +180,38 @@ void main() { v3 ColorSample = RGBColor; f32 NoiseSample = 0.f; - /* switch (BrushType) */ + + s32 Octaves = 1; + switch (BrushType) { - /* case 4: // WorldEdit_BrushType_Layered */ + case 0: // BrushLayerType_Noise { - s32 Octaves = 1; - - v3 deriv = v3(0.f); - f32 warp = 0.f; - - for (s32 Octave = 1; Octave <= Octaves; ++Octave) + v3 NoiseBasis = Basis / Period; + switch (NoiseType) { - v3 xyz = Basis / (Period/Octave); - NoiseSample = value_noise_derivs(xyz+warp+10.f).x * (Amplitude/Octave); + case 0: // NoiseType_Perlin: + { + NoiseSample = value_noise_derivs(NoiseBasis).x; + } break; + + case 1: // NoiseType_Voronoi: + { + NoiseSample = voronoi(NoiseBasis); + } break; + + case 2: // NoiseType_White: + { + } break; } - /* break; */ + break; } - /* default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; */ + /* case 1: // BrushLayerType_Shape */ + /* { */ + /* } break; */ + + default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; } // TODO(Jesse): This is buggy; it generates extra geometry on the edges @@ -126,6 +262,17 @@ void main() NoiseSample = min(0.f, NoiseSample); } + if (abs(NoiseSample) < Threshold) + { + NoiseSample = 0.f; + } + + if (Invert) + { + NoiseSample *= -1.f; + } + + NoiseSample *= Amplitude; switch (BlendMode) { @@ -134,6 +281,9 @@ void main() case 1: // Subtractive { NoiseValue = NoiseValue - NoiseSample; } break; + + case 2: // Threshold + { if (NoiseSample > Threshold) NoiseValue = NoiseSample; } break; } diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 75528150b..53c304611 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -99,6 +99,8 @@ Bonsai_FrameBegin(engine_resources *Resources) Assert(Count(&Resources->Graphics.NoiseReadbackJobs) == 0); HardResetWorld(Resources); + HardResetEditor(&Resources->Editor); + UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 918ac1e39..f34083cf7 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -851,6 +851,7 @@ GetHotVoxelForEditMode(engine_resources *Engine, world_edit_blend_mode WorldEdit switch (WorldEditMode) { case WorldEdit_Mode_Disabled: {} break; + case WorldEdit_Mode_Threshold: case WorldEdit_Mode_Additive: { Pos = PickedVoxel_LastEmpty; @@ -2928,6 +2929,15 @@ DrawEditorPreview(engine_resources *Engine, shader *Shader) } #endif +link_internal void +ApplyEditBufferToOctree(engine_resources *Engine, world_edit_paged_list *Edits) +{ + IterateOver(Edits, Edit, EditIndex) + { + ApplyEditToOctree(Engine, Edit, GetTranArena()); + } +} + link_internal void DoLevelWindow(engine_resources *Engine) { @@ -3053,7 +3063,7 @@ DoLevelWindow(engine_resources *Engine) /* Global_ProjectSwitcherGameLibName = LevelHeader.TerrainGenShader; */ Engine->Graphics.TerrainGenRC.Program.FragSourceFilename = CopyString(LevelHeader.TerrainGenShader, Thread->PermMemory); - Engine->Graphics.TerrainGenRC.Program.FragmentTimeModifiedWhenLoaded = 0; + /* Engine->Graphics.TerrainGenRC.Program.FragmentTimeModifiedWhenLoaded = 0; */ // Must come after we fill out the VisibleRegion so the root octree node // gets initialized to the correct size @@ -3074,6 +3084,8 @@ DoLevelWindow(engine_resources *Engine) { FinalEdit->Brush = Upsert(*FinalEdit->Brush, &Editor->LoadedBrushes, Editor->Memory); } + + ApplyEditToOctree(Engine, FinalEdit, GetTranArena()); } /* ApplyEditBufferToOctree(Engine, &Editor->WorldEdits); */ diff --git a/src/engine/editor.h b/src/engine/editor.h index 9668c0c6f..09eacb175 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -617,8 +617,9 @@ enum world_edit_brush_type enum world_edit_blend_mode { - WorldEdit_Mode_Additive, - WorldEdit_Mode_Subtractive, + WorldEdit_Mode_Additive, // Adds layer value to noise value + WorldEdit_Mode_Subtractive, // Subtracts layer value from noise value + WorldEdit_Mode_Threshold, // Sets noise value to layer value if above threshold WorldEdit_Mode_Disabled, // Useful for turning the layer off }; @@ -686,7 +687,7 @@ struct white_noise_params struct perlin_noise_params { - r32 Threshold = 3.f; poof(@ui_value_range(0.1f, 20.f)) + r32 Threshold = 0.f; poof(@ui_value_range(0.f, 1.f)) v3 Period = {{8.f, 8.f, 8.f}}; poof(@ui_value_range(0.1f, 20.f)) r32 Amplitude = 8.f; poof(@ui_value_range(0.1f, 20.f)) }; @@ -696,7 +697,7 @@ poof(are_equal(perlin_noise_params)) struct voronoi_noise_params { - r32 Threshold = 1.5f; poof(@ui_value_range(0.1f, 20.f)) + r32 Threshold = 0.0f; poof(@ui_value_range(0.f, 1.f)) v3 Period = {{10.f, 10.f, 10.f}}; poof(@ui_value_range(0.1f, 20.f)) r32 Amplitude = 8.f; poof(@ui_value_range(0.1f, 20.f)) diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index df4589fdb..c93fca0fb 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -311,12 +311,11 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) IterateOver(&Node->Edits, Edit, EditIndex) { /* Edit->Type = WorldEdit_BrushType_Layered; */ - /* BindUniformByName(&WorldEditRC->Program, "BrushType", Edit->Type); */ TIMED_NAMED_BLOCK(WorldEditDrawCall); - layered_brush *Brush = &Edit->Brush->Layered; - if (Brush) // NOTE(Jesse): Don't necessarily have to have a brush if we created the edit before we created a brush. + if (Edit->Brush) // NOTE(Jesse): Don't necessarily have to have a brush if we created the edit before we created a brush. { + layered_brush *Brush = &Edit->Brush->Layered; RangeIterator(LayerIndex, Brush->LayerCount) { GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[PingPongIndex].ID); @@ -330,28 +329,37 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); } + BindUniformByName(&WorldEditRC->Program, "BrushType", Layer->Settings.Type); BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.Mode); BindUniformByName(&WorldEditRC->Program, "Modifiers", Layer->Settings.Modifier); BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); + BindUniformByName(&WorldEditRC->Program, "Invert", Layer->Settings.Invert); switch (Layer->Settings.Type) { case BrushLayerType_Noise: { noise_layer *Noise = &Layer->Settings.Noise; + BindUniformByName(&WorldEditRC->Program, "NoiseType", Noise->Type); switch (Noise->Type) { case NoiseType_Perlin: { - perlin_noise_params *Perlin = &Noise->Perlin; + auto *Perlin = &Noise->Perlin; BindUniformByName(&WorldEditRC->Program, "Threshold", Perlin->Threshold); BindUniformByName(&WorldEditRC->Program, "Period", &Perlin->Period); BindUniformByName(&WorldEditRC->Program, "Amplitude", Perlin->Amplitude); } break; case NoiseType_Voronoi: - {} break; + { + auto *Voronoi = &Noise->Voronoi; + BindUniformByName(&WorldEditRC->Program, "Squareness", Voronoi->Squareness); + BindUniformByName(&WorldEditRC->Program, "Threshold", Voronoi->Threshold); + BindUniformByName(&WorldEditRC->Program, "Period", &Voronoi->Period); + BindUniformByName(&WorldEditRC->Program, "Amplitude", Voronoi->Amplitude); + } break; case NoiseType_White: {} break; diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 2e9eda013..649544813 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -519,6 +519,7 @@ link_internal void WorldEdit_shape_sphere_Surface(apply_world_edit_params *Params, r32 RadiusSquared, v3i EditCenterP, voxel *NewVoxelValue) { UNPACK_APPLY_WORLD_EDIT_PARAMS(Params); +#if 0 switch (Mode) { case WorldEdit_Mode_Disabled: {} break; @@ -557,6 +558,7 @@ WorldEdit_shape_sphere_Surface(apply_world_edit_params *Params, r32 RadiusSquare #include } break; } +#endif } link_internal void @@ -624,6 +626,7 @@ WorldEdit_shape_rect_Surface(apply_world_edit_params *Params, voxel *NewVoxelVal { UNPACK_APPLY_WORLD_EDIT_PARAMS(Params); +#if 0 switch (Mode) { case WorldEdit_Mode_Disabled: {} break; @@ -661,6 +664,7 @@ WorldEdit_shape_rect_Surface(apply_world_edit_params *Params, voxel *NewVoxelVal #include } break; } +#endif } link_internal void @@ -669,6 +673,7 @@ WorldEdit_shape_rect_Flood( apply_world_edit_params *Params, thread_local_state UNPACK_APPLY_WORLD_EDIT_PARAMS(Params); s32 TotalVoxels = Volume(UpdateDim); +#if 0 switch (Mode) { case WorldEdit_Mode_Disabled: {} break; @@ -696,12 +701,14 @@ WorldEdit_shape_rect_Flood( apply_world_edit_params *Params, thread_local_state #include } break; } +#endif } link_internal void WorldEdit_shape_rect_Default(apply_world_edit_params *Params, voxel *NewVoxelValue) { UNPACK_APPLY_WORLD_EDIT_PARAMS(Params); +#if 0 switch (Mode) { case WorldEdit_Mode_Disabled: {} break; @@ -726,6 +733,7 @@ WorldEdit_shape_rect_Default(apply_world_edit_params *Params, voxel *NewVoxelVal /* #include */ /* } break; */ } +#endif } @@ -744,6 +752,7 @@ WorldEdit_shape_chunk_data_Surface(apply_world_edit_params *Params, v3 SimOrigin { UNPACK_APPLY_WORLD_EDIT_PARAMS(Params); +#if 0 switch (Mode) { case WorldEdit_Mode_Disabled: {} break; @@ -787,6 +796,7 @@ WorldEdit_shape_chunk_data_Surface(apply_world_edit_params *Params, v3 SimOrigin #include } break; } +#endif } link_internal void @@ -799,6 +809,7 @@ WorldEdit_shape_chunk_data_Flood( UNPACK_APPLY_WORLD_EDIT_PARAMS(Params); s32 TotalVoxels = Volume(UpdateDim); +#if 0 switch (Mode) { case WorldEdit_Mode_Disabled: {} break; @@ -850,6 +861,7 @@ WorldEdit_shape_chunk_data_Flood( /* } break; */ } +#endif } link_internal void @@ -859,6 +871,7 @@ WorldEdit_shape_chunk_data_Default(apply_world_edit_params *Params, v3 SimOrigin voxel InvertV = { Params->Transparency, Params->Color }; +#if 0 switch (Mode) { case WorldEdit_Mode_Disabled: {} break; @@ -881,6 +894,7 @@ WorldEdit_shape_chunk_data_Default(apply_world_edit_params *Params, v3 SimOrigin #include } break; } +#endif } From 716caffcd485fb0a78ddde05d7d0a04bab286197 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 27 Feb 2025 13:28:09 -0700 Subject: [PATCH 181/421] Fix some world edits being stale when editing a brush --- external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_struct.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...or_ui_for_compound_type_world_edit_brush.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ...on_pattern_199741702_161749140_632272777.h | 2 +- generated/hashtable_struct.h | 2 +- .../rectalinear_iteration_pattern_812652930.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ..._value_tables_world_update_op_shape_type.h | 5 ++- src/engine/editor.cpp | 42 ++++++++++++------- src/engine/editor.h | 1 + src/engine/world_update.cpp | 3 ++ 22 files changed, 54 insertions(+), 33 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 37f3b6999..378a2643a 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 37f3b69998dbf1bb184d9c67be0d160caa7034b1 +Subproject commit 378a2643ac5ee1b57b3a451922ce9c55c56caf94 diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 4911cf4e1..cdbc06bff 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2315:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2347:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 5685963d5..4b10f6baf 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3295:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3327:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 4f656d7d2..bb83b8616 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2268:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2300:0 case type_ui_render_command_window_start: { diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index d197b456a..4a86cef88 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:958:0 +// src/engine/editor.h:959:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index d660cb2a6..59ac96c10 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1137:0 +// src/engine/editor.h:1138:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index 65b1a2164..c5661862b 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1151:0 +// src/engine/editor.h:1152:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 599df4eb2..1a9ea21de 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1153:0 +// src/engine/editor.h:1154:0 diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 03901097b..d8af806b1 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1023:0 +// src/engine/editor.h:1024:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index 6f0887cde..27e6d98b8 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1016:0 +// src/engine/editor.h:1017:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index cff649bb2..54b5a4d40 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1009:0 +// src/engine/editor.h:1010:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index b77443af4..ce9f2adfe 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:886:0 +// src/engine/editor.h:887:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_world_edit_brush.h index f20fe1823..5cc715019 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:823:0 +// src/engine/editor.h:824:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 6d8cd1169..88e824fc6 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:900:0 +// src/engine/editor.h:901:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index 5c1cfeeb1..12ca38702 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:572:0 +// src/engine/world_update.cpp:575:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/hashtable_struct.h b/generated/hashtable_struct.h index 3e277e041..6b918aac1 100644 --- a/generated/hashtable_struct.h +++ b/generated/hashtable_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1140:0 +// src/engine/editor.h:1141:0 struct world_edit_brush_linked_list_node { diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index 2c332c363..c9c90b04d 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:607:0 +// src/engine/world_update.cpp:610:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index b0cdec3e5..1e57f1e63 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:850:0 +// src/engine/editor.h:851:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_world_update_op_shape_type.h b/generated/string_and_value_tables_world_update_op_shape_type.h index 4051cede2..6ca006786 100644 --- a/generated/string_and_value_tables_world_update_op_shape_type.h +++ b/generated/string_and_value_tables_world_update_op_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:763:0 +// src/engine/editor.h:764:0 link_internal counted_string ToStringPrefixless(world_update_op_shape_type Type) @@ -9,6 +9,7 @@ ToStringPrefixless(world_update_op_shape_type Type) case type_world_update_op_shape_params_noop: { Result = CSz("noop"); } break; case type_world_update_op_shape_params_sphere: { Result = CSz("sphere"); } break; case type_world_update_op_shape_params_rect: { Result = CSz("rect"); } break; + case type_world_update_op_shape_params_cylinder: { Result = CSz("cylinder"); } break; case type_world_update_op_shape_params_asset: { Result = CSz("asset"); } break; case type_world_update_op_shape_params_chunk_data: { Result = CSz("data"); } break; case type_world_update_op_shape_params_count: { Result = CSz("count"); } break; @@ -28,6 +29,7 @@ ToString(world_update_op_shape_type Type) case type_world_update_op_shape_params_noop: { Result = CSz("type_world_update_op_shape_params_noop"); } break; case type_world_update_op_shape_params_sphere: { Result = CSz("type_world_update_op_shape_params_sphere"); } break; case type_world_update_op_shape_params_rect: { Result = CSz("type_world_update_op_shape_params_rect"); } break; + case type_world_update_op_shape_params_cylinder: { Result = CSz("type_world_update_op_shape_params_cylinder"); } break; case type_world_update_op_shape_params_asset: { Result = CSz("type_world_update_op_shape_params_asset"); } break; case type_world_update_op_shape_params_chunk_data: { Result = CSz("type_world_update_op_shape_params_chunk_data"); } break; case type_world_update_op_shape_params_count: { Result = CSz("type_world_update_op_shape_params_count"); } break; @@ -46,6 +48,7 @@ WorldUpdateOpShapeType(counted_string S) if (StringsMatch(S, CSz("type_world_update_op_shape_params_noop"))) { return type_world_update_op_shape_params_noop; } if (StringsMatch(S, CSz("type_world_update_op_shape_params_sphere"))) { return type_world_update_op_shape_params_sphere; } if (StringsMatch(S, CSz("type_world_update_op_shape_params_rect"))) { return type_world_update_op_shape_params_rect; } + if (StringsMatch(S, CSz("type_world_update_op_shape_params_cylinder"))) { return type_world_update_op_shape_params_cylinder; } if (StringsMatch(S, CSz("type_world_update_op_shape_params_asset"))) { return type_world_update_op_shape_params_asset; } if (StringsMatch(S, CSz("type_world_update_op_shape_params_chunk_data"))) { return type_world_update_op_shape_params_chunk_data; } if (StringsMatch(S, CSz("type_world_update_op_shape_params_count"))) { return type_world_update_op_shape_params_count; } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index f34083cf7..5e0957592 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2690,19 +2690,21 @@ DoWorldEditor(engine_resources *Engine) // there's a frame of lag. /* DoWorldEditSettingsWindow(Engine, Editor->Tool, Editor->Brush.Type); */ - IterateOver(&Editor->WorldEdits, Edit, EditIndex) { - auto EditAABB = GetSimSpaceAABB(World, Edit->Region); - random_series S = {u64(Edit)}; - v3 BaseColor = RandomV3Unilateral(&S); - - f32 Size = 1.f; - if (Edit == Editor->CurrentEdit) + IterateOver(&Editor->WorldEdits, Edit, EditIndex) { - Size = 3.f; - } + auto EditAABB = GetSimSpaceAABB(World, Edit->Region); + random_series S = {u64(Edit)}; + v3 BaseColor = RandomV3Unilateral(&S); - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); + f32 Size = DEFAULT_LINE_THICKNESS; + if (Edit == Editor->CurrentEdit) + { + Size = 3.f*DEFAULT_LINE_THICKNESS; + } + + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); + } } @@ -2806,13 +2808,24 @@ DoWorldEditor(engine_resources *Engine) // NOTE(Jesse): Must come after the settings window draws because the // settings window detects and initializes new brushes - if (SelectionComplete(Editor->Selection.Clicks) && Editor->CurrentEdit) + if (SelectionComplete(Editor->Selection.Clicks) && Editor->CurrentBrush) { - b32 SettingsChanged = CheckSettingsChanged(Editor->CurrentEdit); - if (SettingsChanged || Editor->Selection.Changed) + if (Editor->Selection.Changed && Editor->CurrentEdit) { UpdateWorldEdit(Engine, Editor->CurrentEdit, Editor->Selection.Region, GetTranArena()); } + + b32 SettingsChanged = CheckSettingsChanged(&Editor->CurrentBrush->Layered); + if (SettingsChanged) + { + IterateOver(&Editor->WorldEdits, Edit, EditIndex) + { + if (Edit->Brush == Editor->CurrentBrush) + { + UpdateWorldEdit(Engine, Edit, Editor->Selection.Region, GetTranArena()); + } + } + } } } @@ -2835,7 +2848,8 @@ DoWorldEditor(engine_resources *Engine) PushColumn(Ui, CSz(" "), &DefaultSelectedStyle); } - if (Button(Ui, FSz("(%d) (%s)", I, NameBuf), UiId(&AllEditsWindow, "edit select", Edit))) + auto EditSelectButton = PushSimpleButton(Ui, FSz("(%d) (%s)", I, NameBuf), UiId(&AllEditsWindow, "edit select", Edit)); + if (Clicked(Ui, &EditSelectButton)) { Editor->Selection.Clicks = 2; Editor->Selection.Region = Edit->Region; diff --git a/src/engine/editor.h b/src/engine/editor.h index 09eacb175..01003dff3 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -754,6 +754,7 @@ enum world_update_op_shape_type type_world_update_op_shape_params_sphere, type_world_update_op_shape_params_rect, + type_world_update_op_shape_params_cylinder, type_world_update_op_shape_params_asset, type_world_update_op_shape_params_chunk_data, diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 649544813..3de869b04 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -102,6 +102,8 @@ QueueWorldUpdateForRegion( engine_resources *Engine, { TIMED_FUNCTION(); + NotImplemented; +#if 0 // TODO(Jesse): Should we just remove the paramter? Or do we sometimes not pass this? Assert(Memory == Engine->WorldUpdateMemory); @@ -243,6 +245,7 @@ QueueWorldUpdateForRegion( engine_resources *Engine, }; PushWorkQueueEntry(&Plat->WorldUpdateQ, &Entry); } +#endif } link_internal u32 From 3f9a20d509c890af648966ae224f483daf6b2e20 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 27 Feb 2025 14:12:46 -0700 Subject: [PATCH 182/421] Improve brush layer UI with more information --- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_struct.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 15 ++++ ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- generated/hashtable_struct.h | 2 +- src/engine/editor.cpp | 78 ++++++++++++++----- src/engine/editor.h | 4 + src/engine/render.h | 2 +- 13 files changed, 86 insertions(+), 31 deletions(-) diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 4a86cef88..ea1d9bbc6 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:959:0 +// src/engine/editor.h:961:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 59ac96c10..14aac37cb 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1138:0 +// src/engine/editor.h:1140:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index c5661862b..a5b94bb4b 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1152:0 +// src/engine/editor.h:1154:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 1a9ea21de..bb46deb73 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1154:0 +// src/engine/editor.h:1156:0 diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index d8af806b1..d9fc46e65 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1024:0 +// src/engine/editor.h:1026:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index 27e6d98b8..bbc3a4162 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1017:0 +// src/engine/editor.h:1019:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index 54b5a4d40..f894e5dbd 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1010:0 +// src/engine/editor.h:1012:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 013238e91..15945450b 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -297,6 +297,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit*, Element->HotEdit), + CSz("HotEdit"), + Params + ); + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 88e824fc6..85341291d 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:901:0 +// src/engine/editor.h:903:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/hashtable_struct.h b/generated/hashtable_struct.h index 6b918aac1..37d8f692a 100644 --- a/generated/hashtable_struct.h +++ b/generated/hashtable_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1141:0 +// src/engine/editor.h:1143:0 struct world_edit_brush_linked_list_node { diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 5e0957592..d0c8035e4 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1417,6 +1417,28 @@ NewBrush(world_edit_brush *Brush) CheckSettingsChanged(&Brush->Layered); } +link_internal cs +GetLayerUiText(brush_layer *Layer, memory_arena *TempMem) +{ + cs LayerType = ToStringPrefixless(Layer->Settings.Type); + cs SubType = {}; + switch (Layer->Settings.Type) + { + case BrushLayerType_Noise: { SubType = ToStringPrefixless(Layer->Settings.Noise.Type); } break; + case BrushLayerType_Shape: { SubType = ToStringPrefixless(Layer->Settings.Shape.Type); } break; + } + + return FSz("%S(%S)", LayerType, SubType); +} + +link_internal void +DoColorSwatch(renderer_2d *Ui, v2 QuadDim, v3 RGB) +{ + ui_style Style = FlatUiStyle(RGB); + PushUntexturedQuad(Ui, {}, QuadDim, zDepth_Text, &Style, {} ); + PushNewRow(Ui); +} + link_internal void DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_layout *BrushSettingsWindow) { @@ -1569,7 +1591,8 @@ DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, win brush_layer *Layer = Layers + LayerIndex; ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", Layer); - if (ToggleButton(Ui, FSz("v Layer %d", LayerIndex), FSz("> Layer %d", LayerIndex), ToggleId)) + cs LayerDetails = GetLayerUiText(Layer, GetTranArena()); + if (ToggleButton(Ui, FSz("v %d %S", LayerIndex, LayerDetails), FSz("> %d %S", LayerIndex, LayerDetails), ToggleId)) { if (Button(Ui, CSz("Up"), UiId(BrushSettingsWindow, "layer_reorder_up", Layer))) { @@ -1597,6 +1620,10 @@ DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, win DoSettingsForBrushLayer(Engine, Layer, BrushSettingsWindow); } + else + { + DoColorSwatch(Ui, V2(20), HSVtoRGB(Layer->Settings.HSVColor)); + } if (IsNewBrush && LayerIndex == 0) { @@ -2193,9 +2220,7 @@ DoColorPicker(engine_resources *Engine, window_layout *Window, v3 *HSVDest, b32 if (ShowColorSwatch) { v2 QuadDim = V2(ColorPickerSectionDim.x, ColorPickerSectionDim.x); - ui_style Style = FlatUiStyle(RGB); - PushUntexturedQuad(Ui, {}, QuadDim, zDepth_Text, &Style, {} ); - PushNewRow(Ui); + DoColorSwatch(Ui, QuadDim, RGB); } cs HSVColorString = FSz("HSV (%.2V3)", HSVDest); @@ -2690,23 +2715,6 @@ DoWorldEditor(engine_resources *Engine) // there's a frame of lag. /* DoWorldEditSettingsWindow(Engine, Editor->Tool, Editor->Brush.Type); */ - { - IterateOver(&Editor->WorldEdits, Edit, EditIndex) - { - auto EditAABB = GetSimSpaceAABB(World, Edit->Region); - random_series S = {u64(Edit)}; - v3 BaseColor = RandomV3Unilateral(&S); - - f32 Size = DEFAULT_LINE_THICKNESS; - if (Edit == Editor->CurrentEdit) - { - Size = 3.f*DEFAULT_LINE_THICKNESS; - } - - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); - } - } - // @@ -2861,6 +2869,10 @@ DoWorldEditor(engine_resources *Engine) Editor->CurrentBrush = Edit->Brush; } } + if (Hover(Ui, &EditSelectButton)) + { + Editor->HotEdit = Edit; + } if (Button(Ui, FSz("(UpdateBrush)", I, NameBuf), UiId(&AllEditsWindow, "edit brush select", Edit))) { @@ -2901,6 +2913,30 @@ DoWorldEditor(engine_resources *Engine) v3 HotVoxel = GetHotVoxelForEditMode(Engine, WorldEdit_Mode_Additive ); DEBUG_HighlightVoxel( Engine, HotVoxel, RGB_RED, 0.075f); } + + + { + IterateOver(&Editor->WorldEdits, Edit, EditIndex) + { + auto EditAABB = GetSimSpaceAABB(World, Edit->Region); + random_series S = {u64(Edit)}; + v3 BaseColor = RandomV3Unilateral(&S); + + f32 Size = DEFAULT_LINE_THICKNESS; + if (Edit == Editor->CurrentEdit) + { + Size = 3.f*DEFAULT_LINE_THICKNESS; + } + + if (Edit == Editor->HotEdit) + { + Size = 5.f*DEFAULT_LINE_THICKNESS; + } + + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); + } + Editor->HotEdit = 0; + } } link_internal void diff --git a/src/engine/editor.h b/src/engine/editor.h index 01003dff3..08d83731c 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -898,6 +898,8 @@ enum brush_layer_type BrushLayerType_Shape, }; +poof(string_and_value_tables(brush_layer_type)) +#include poof(do_editor_ui_for_radio_enum(brush_layer_type)) #include @@ -1190,6 +1192,8 @@ struct level_editor world_edit_brush_hashtable LoadedBrushes; world_edit *CurrentEdit; + world_edit *HotEdit; + world_edit_brush *CurrentBrush; }; diff --git a/src/engine/render.h b/src/engine/render.h index 78d1fcbed..eff83f0e7 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -10,7 +10,7 @@ struct world_chunk; #define VERTEX_TRANS_EMISS_LAYOUT_LOCATION 3 -#define DEFAULT_LINE_THICKNESS (0.1f) +#define DEFAULT_LINE_THICKNESS (0.3f) #define SSAO_KERNEL_SIZE 32 struct ao_render_group From 9f880607a19c6568c7e07ad8d95fe117132a0e6c Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 27 Feb 2025 14:30:37 -0700 Subject: [PATCH 183/421] Cut out a pile of now-dead code --- examples/blank_project/game.cpp | 2 +- examples/project_and_level_picker/game.cpp | 2 +- examples/transparency/game.cpp | 2 +- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_struct.h | 2 +- .../asyncify_render_function_c_DrawLod.h | 2 +- ...yncify_render_function_c_RenderToTexture.h | 2 +- .../asyncify_render_function_h_DrawLod.h | 2 +- ...yncify_render_function_h_RenderToTexture.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- .../d_union_constructors_work_queue_entry.h | 15 +----- generated/d_union_work_queue_entry.h | 4 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 12 ++--- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ...on_pattern_199741702_161749140_632272777.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 5 +- generated/for_datatypes_fkubhsYl.h | 5 +- generated/for_datatypes_kv3WBTai.h | 5 +- generated/hashtable_struct.h | 2 +- .../rectalinear_iteration_pattern_812652930.h | 2 +- .../string_and_value_tables_shape_type.h | 14 +++--- shaders/terrain/world_edit.fragmentshader | 18 ++++++-- src/engine/api.cpp | 2 +- src/engine/editor.cpp | 29 +++++++----- src/engine/editor.h | 46 ++++++++----------- src/engine/game_effects.cpp | 18 +++++--- src/engine/render_loop.cpp | 2 +- src/engine/serdes.cpp | 4 +- src/engine/work_queue.h | 4 +- src/engine/world_chunk.cpp | 2 + src/engine/world_update.cpp | 10 ++-- src/engine/world_update.h | 14 +++--- 37 files changed, 123 insertions(+), 124 deletions(-) diff --git a/examples/blank_project/game.cpp b/examples/blank_project/game.cpp index 8a4ef94ce..4107a018f 100644 --- a/examples/blank_project/game.cpp +++ b/examples/blank_project/game.cpp @@ -33,7 +33,7 @@ BONSAI_API_WORKER_THREAD_CALLBACK() InvalidCase(type_work_queue_entry__bonsai_render_command); case type_work_queue_entry_async_function_call: - case type_work_queue_entry_update_world_region: + /* case type_work_queue_entry_update_world_region: */ case type_work_queue_entry_rebuild_mesh: case type_work_queue_entry_init_asset: case type_work_queue_entry_init_world_chunk: diff --git a/examples/project_and_level_picker/game.cpp b/examples/project_and_level_picker/game.cpp index 964031ec5..4200d1949 100644 --- a/examples/project_and_level_picker/game.cpp +++ b/examples/project_and_level_picker/game.cpp @@ -18,7 +18,7 @@ BONSAI_API_WORKER_THREAD_CALLBACK() } break; case type_work_queue_entry_async_function_call: - case type_work_queue_entry_update_world_region: + /* case type_work_queue_entry_update_world_region: */ case type_work_queue_entry_rebuild_mesh: case type_work_queue_entry_init_asset: case type_work_queue_entry_copy_buffer_ref: diff --git a/examples/transparency/game.cpp b/examples/transparency/game.cpp index 7b14a6fcb..a244c1c6e 100644 --- a/examples/transparency/game.cpp +++ b/examples/transparency/game.cpp @@ -15,7 +15,7 @@ BONSAI_API_WORKER_THREAD_CALLBACK() InvalidCase(type_work_queue_entry__bonsai_render_command); case type_work_queue_entry_async_function_call: - case type_work_queue_entry_update_world_region: + /* case type_work_queue_entry_update_world_region: */ case type_work_queue_entry_rebuild_mesh: case type_work_queue_entry_init_asset: case type_work_queue_entry_init_world_chunk: diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index ea1d9bbc6..6b182478c 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:961:0 +// src/engine/editor.h:953:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 14aac37cb..cd128a1a1 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1140:0 +// src/engine/editor.h:1132:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/asyncify_render_function_c_DrawLod.h b/generated/asyncify_render_function_c_DrawLod.h index d05fc3394..841d8ac63 100644 --- a/generated/asyncify_render_function_c_DrawLod.h +++ b/generated/asyncify_render_function_c_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:327:0 +// src/engine/work_queue.h:329:0 link_internal void DrawLod_Async(work_queue *Queue, engine_resources *Engine , shader *Shader , gpu_mapped_element_buffer *Meshes , r32 DistanceSquared , v3 Basis , Quaternion Rotation , v3 Scale ) diff --git a/generated/asyncify_render_function_c_RenderToTexture.h b/generated/asyncify_render_function_c_RenderToTexture.h index 97af18895..949363ea0 100644 --- a/generated/asyncify_render_function_c_RenderToTexture.h +++ b/generated/asyncify_render_function_c_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:324:0 +// src/engine/work_queue.h:326:0 link_internal void RenderToTexture_Async(work_queue *Queue, engine_resources *Engine , asset_thumbnail *Thumb , gpu_mapped_element_buffer *Meshes , v3 Offset , camera *Camera ) diff --git a/generated/asyncify_render_function_h_DrawLod.h b/generated/asyncify_render_function_h_DrawLod.h index 52cb30689..94e3d2560 100644 --- a/generated/asyncify_render_function_h_DrawLod.h +++ b/generated/asyncify_render_function_h_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:180:0 +// src/engine/work_queue.h:182:0 struct draw_lod_async_params poof(@async_function_params) { diff --git a/generated/asyncify_render_function_h_RenderToTexture.h b/generated/asyncify_render_function_h_RenderToTexture.h index 87537f42b..456d45154 100644 --- a/generated/asyncify_render_function_h_RenderToTexture.h +++ b/generated/asyncify_render_function_h_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:174:0 +// src/engine/work_queue.h:176:0 struct render_to_texture_async_params poof(@async_function_params) { diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index a5b94bb4b..7a5682c42 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1154:0 +// src/engine/editor.h:1146:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index bb46deb73..2aa206b0a 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1156:0 +// src/engine/editor.h:1148:0 diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 43c5a695f..3df350372 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:268:0 +// src/engine/work_queue.h:270:0 link_internal work_queue_entry @@ -75,19 +75,6 @@ WorkQueueEntry( work_queue_entry_init_asset A ) - }; - return Result; -} - -link_internal work_queue_entry -WorkQueueEntry( work_queue_entry_update_world_region A ) -{ - work_queue_entry Result = { - .Type = type_work_queue_entry_update_world_region, - .work_queue_entry_update_world_region = A, - - - }; return Result; } diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index 504d820f0..efe4895b9 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:237:0 +// src/engine/work_queue.h:239:0 enum work_queue_entry_type { @@ -9,7 +9,6 @@ enum work_queue_entry_type type_work_queue_entry_copy_buffer_set, type_work_queue_entry_copy_buffer_ref, type_work_queue_entry_init_asset, - type_work_queue_entry_update_world_region, type_work_queue_entry_rebuild_mesh, type_work_queue_entry_sim_particle_system, type_work_queue_entry__bonsai_render_command, @@ -29,7 +28,6 @@ struct work_queue_entry struct work_queue_entry_copy_buffer_set work_queue_entry_copy_buffer_set; struct work_queue_entry_copy_buffer_ref work_queue_entry_copy_buffer_ref; struct work_queue_entry_init_asset work_queue_entry_init_asset; - struct work_queue_entry_update_world_region work_queue_entry_update_world_region; struct work_queue_entry_rebuild_mesh work_queue_entry_rebuild_mesh; struct work_queue_entry_sim_particle_system work_queue_entry_sim_particle_system; struct work_queue_entry__bonsai_render_command work_queue_entry__bonsai_render_command; diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index d9fc46e65..9221abeac 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1026:0 +// src/engine/editor.h:1018:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index bbc3a4162..0e401c338 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1019:0 +// src/engine/editor.h:1011:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index f894e5dbd..b0f526148 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1012:0 +// src/engine/editor.h:1004:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index ce9f2adfe..4a9d44135 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:887:0 +// src/engine/editor.h:879:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 7ee71b0c3..ae5b3a21f 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -11,27 +11,27 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("None"), UiId(Window, "enum ShapeType_None", Element), Params)) + if (Button(Ui, CSz("Sphere"), UiId(Window, "enum ShapeType_Sphere", Element), Params)) { - *Element = ShapeType_None; + *Element = ShapeType_Sphere; SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Sphere"), UiId(Window, "enum ShapeType_Sphere", Element), Params)) + if (Button(Ui, CSz("Rect"), UiId(Window, "enum ShapeType_Rect", Element), Params)) { - *Element = ShapeType_Sphere; + *Element = ShapeType_Rect; SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Rect"), UiId(Window, "enum ShapeType_Rect", Element), Params)) + if (Button(Ui, CSz("Cylinder"), UiId(Window, "enum ShapeType_Cylinder", Element), Params)) { - *Element = ShapeType_Rect; + *Element = ShapeType_Cylinder; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 85341291d..3e8902646 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:903:0 +// src/engine/editor.h:895:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index 12ca38702..e78237274 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:575:0 +// src/engine/world_update.cpp:577:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 9dc8a65d6..15180e99b 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,5 +1,4 @@ -// src/engine/work_queue.h:300:0 - +// src/engine/work_queue.h:302:0 @@ -730,7 +729,6 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) - struct draw_lod_async_params; @@ -753,4 +751,3 @@ WorkQueueEntryAsyncFunction( draw_lod_async_params *Params ) - diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index eee0a3374..cd26ab40a 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -1,5 +1,4 @@ -// src/engine/work_queue.h:220:0 - +// src/engine/work_queue.h:222:0 @@ -720,7 +719,6 @@ render_to_texture_async_params render_to_texture_async_params; - draw_lod_async_params draw_lod_async_params; @@ -734,4 +732,3 @@ draw_lod_async_params draw_lod_async_params; - diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 99b4cc292..40f6f7525 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -1,5 +1,4 @@ -// src/engine/work_queue.h:201:0 - +// src/engine/work_queue.h:203:0 @@ -720,7 +719,6 @@ type_render_to_texture_async_params, - type_draw_lod_async_params, @@ -734,4 +732,3 @@ type_draw_lod_async_params, - diff --git a/generated/hashtable_struct.h b/generated/hashtable_struct.h index 37d8f692a..16ae04221 100644 --- a/generated/hashtable_struct.h +++ b/generated/hashtable_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1143:0 +// src/engine/editor.h:1135:0 struct world_edit_brush_linked_list_node { diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index c9c90b04d..b76de185b 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:610:0 +// src/engine/world_update.cpp:612:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 1e57f1e63..1e6d8e15c 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:851:0 +// src/engine/editor.h:843:0 link_internal counted_string ToStringPrefixless(shape_type Type) @@ -6,9 +6,9 @@ ToStringPrefixless(shape_type Type) counted_string Result = {}; switch (Type) { - case ShapeType_None: { Result = CSz("None"); } break; - case ShapeType_Sphere: { Result = CSz("Sphere"); } break; + case ShapeType_Sphere: { Result = CSz("Sphere"); } break; case ShapeType_Rect: { Result = CSz("Rect"); } break; + case ShapeType_Cylinder: { Result = CSz("Cylinder"); } break; } @@ -22,9 +22,9 @@ ToString(shape_type Type) counted_string Result = {}; switch (Type) { - case ShapeType_None: { Result = CSz("ShapeType_None"); } break; - case ShapeType_Sphere: { Result = CSz("ShapeType_Sphere"); } break; + case ShapeType_Sphere: { Result = CSz("ShapeType_Sphere"); } break; case ShapeType_Rect: { Result = CSz("ShapeType_Rect"); } break; + case ShapeType_Cylinder: { Result = CSz("ShapeType_Cylinder"); } break; } @@ -37,9 +37,9 @@ ShapeType(counted_string S) { shape_type Result = {}; - if (StringsMatch(S, CSz("ShapeType_None"))) { return ShapeType_None; } - if (StringsMatch(S, CSz("ShapeType_Sphere"))) { return ShapeType_Sphere; } + if (StringsMatch(S, CSz("ShapeType_Sphere"))) { return ShapeType_Sphere; } if (StringsMatch(S, CSz("ShapeType_Rect"))) { return ShapeType_Rect; } + if (StringsMatch(S, CSz("ShapeType_Cylinder"))) { return ShapeType_Cylinder; } return Result; } diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index c33d21d2d..8fb5fb27d 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -13,6 +13,12 @@ uniform int Modifiers; uniform v3 ChunkRelEditMin; uniform v3 ChunkRelEditMax; +// +// Shape params +// +uniform int ShapeType; + + // // Noise params // @@ -207,9 +213,15 @@ void main() break; } - /* case 1: // BrushLayerType_Shape */ - /* { */ - /* } break; */ + case 1: // BrushLayerType_Shape + { + switch (ShapeType) + { + case 0: { } break; + case 1: { } break; + case 2: { } break; + } + } break; default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; } diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 53c304611..ebef82dac 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -660,7 +660,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ { InvalidCase(type_work_queue_entry_noop); InvalidCase(type_work_queue_entry__align_to_cache_line_helper); - InvalidCase(type_work_queue_entry_update_world_region); + /* InvalidCase(type_work_queue_entry_update_world_region); */ // NOTE(Jesse): Render commands should never end up on a general purpose work queue InvalidCase(type_work_queue_entry__bonsai_render_command); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index d0c8035e4..0478f7e78 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -501,6 +501,7 @@ GetMax(v3 *SelectionRegion) return Result; } +#if 0 link_internal void ApplyEditToRegion(engine_resources *Engine, rect3 *SelectionAABB, v3 HSVColor, b32 PersistWhitespace, world_edit_blend_mode WorldEditMode, world_edit_blend_mode_modifier Modifier) { @@ -511,6 +512,7 @@ ApplyEditToRegion(engine_resources *Engine, rect3 *SelectionAABB, v3 HSVColor, b QueueWorldUpdateForRegion(Engine, WorldEditMode, Modifier, &Shape, HSVColor, PersistWhitespace, Engine->WorldUpdateMemory); } +#endif link_internal v3 @@ -907,7 +909,7 @@ GetShapeDim(shape_layer *Layer) v3i Result = {}; switch (Layer->Type) { - case ShapeType_None: { } break; + case ShapeType_Cylinder: { NotImplemented; } break; case ShapeType_Sphere: { // NOTE(Jesse): This can't have a +1 because that dialates it outside the selection region. @@ -940,7 +942,7 @@ GetRequiredDimForLayer(v3i SelectionDim, brush_layer *Layer) shape_layer *Shape = &Layer->Settings.Shape; switch (Shape->Type) { - case ShapeType_None: { } break; + case ShapeType_Cylinder: { NotImplemented; } break; case ShapeType_Sphere: { Request += V3i(Shape->Sphere.Radius*2.f); @@ -1026,7 +1028,6 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br shape_layer *Shape = &Settings->Shape; switch (Shape->Type) { - case ShapeType_None: {} break; case ShapeType_Rect: { @@ -1045,6 +1046,7 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br } break; + case ShapeType_Cylinder: { NotImplemented; } break; case ShapeType_Sphere: { // NOTE(Jesse): Constrain maximum sphere radius to minimum selection dimension @@ -1057,9 +1059,10 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br if (LengthSq(GetShapeDim(Shape)) > 0) { - ApplyBrushLayer(Engine, Layer, Preview, Chunk, Settings->Offset.Min); - FinalizeChunkInitialization(Chunk); - QueueChunkForMeshRebuild(&Plat->LowPriority, Chunk); + NotImplemented; + /* ApplyBrushLayer(Engine, Layer, Preview, Chunk, Settings->Offset.Min); */ + /* FinalizeChunkInitialization(Chunk); */ + /* QueueChunkForMeshRebuild(&Plat->LowPriority, Chunk); */ } } break; @@ -1137,13 +1140,12 @@ BrushSettingsForShapeBrush(engine_resources *Engine, window_layout *Window, shap v3 SelectionDim = GetDim(GetSelectionRect(World, Editor)); switch (Layer->Type) { - case ShapeType_None: { } break; - case ShapeType_Rect: { DoEditorUi(Ui, Window, &Layer->Rect, CSz("")); } break; + case ShapeType_Cylinder: { NotImplemented; } break; case ShapeType_Sphere: { DoEditorUi(Ui, Window, &Layer->Sphere, CSz("")); @@ -1261,6 +1263,7 @@ DoSettingsForBrushLayer(engine_resources *Engine, brush_layer *Layer, window_lay CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } +#if 0 link_internal void ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *Preview, world_chunk *DestChunk, v3i SmallestMinOffset) { @@ -1285,8 +1288,7 @@ ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *P switch (Settings->Shape.Type) { - case ShapeType_None: { } break; - + case ShapeType_Cylinder: { NotImplemented; } break; case ShapeType_Sphere: { Shape.world_update_op_shape_params_sphere = Settings->Shape.Sphere; @@ -1328,13 +1330,17 @@ ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *P if (Iterations > 1) { Info("%d", Iterations); } RangeIterator(IterIndex, Iterations) { + NotImplemented; +#if 0 work_queue_entry_update_world_region Job = WorkQueueEntryUpdateWorldRegion(Mode, Modifier, SimFloodOrigin, &Shape, HSVtoRGB(Layer->Settings.HSVColor), {}, {}, {}, {}, 0); ApplyUpdateToRegion(GetThreadLocalState(ThreadLocal_ThreadIndex), &Job, UpdateBounds, DestChunk, Layer->Settings.Invert); DestChunk->FilledCount = MarkBoundaryVoxels_MakeExteriorFaces( DestChunk->Occupancy, DestChunk->Voxels, DestChunk->Dim, {{}}, DestChunk->Dim ); +#endif } } } +#endif link_internal v3i GetSmallestMinOffset(layered_brush *LayeredBrush, v3i *LargestLayerDim) @@ -2666,7 +2672,8 @@ DoWorldEditor(engine_resources *Engine) aabb_intersect_result IntersectionResult = Intersect(EntityAABB, Ray); if (Input->LMB.Clicked && IntersectionResult.Face) { -#if 1 + NotImplemented; +#if 0 world_update_op_shape_params_asset AssetUpdateShape = { SelectedEntity->AssetId, diff --git a/src/engine/editor.h b/src/engine/editor.h index 08d83731c..25f790cf4 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -748,21 +748,21 @@ poof(do_editor_ui_for_radio_enum(world_edit_brush_type)) -enum world_update_op_shape_type -{ - type_world_update_op_shape_params_noop, +/* enum world_update_op_shape_type */ +/* { */ +/* type_world_update_op_shape_params_noop, */ - type_world_update_op_shape_params_sphere, - type_world_update_op_shape_params_rect, - type_world_update_op_shape_params_cylinder, - type_world_update_op_shape_params_asset, - type_world_update_op_shape_params_chunk_data, +/* type_world_update_op_shape_params_sphere, */ +/* type_world_update_op_shape_params_rect, */ +/* type_world_update_op_shape_params_cylinder, */ +/* type_world_update_op_shape_params_asset, */ +/* type_world_update_op_shape_params_chunk_data, */ - type_world_update_op_shape_params_count, -}; +/* type_world_update_op_shape_params_count, */ +/* }; */ -poof(string_and_value_tables(world_update_op_shape_type)) -#include +/* poof(string_and_value_tables(world_update_op_shape_type)) */ +/* #include */ struct world_update_op_shape_params_rect @@ -791,6 +791,7 @@ struct world_update_op_shape_params_sphere f32 Radius = 10.f; poof(@ui_disable) }; +#if 0 struct world_edit_shape { world_update_op_shape_type Type; @@ -823,6 +824,7 @@ struct world_edit_brush_constraints poof(do_editor_ui_for_compound_type(world_edit_brush_constraints)) #include +#endif @@ -834,19 +836,9 @@ poof(do_editor_ui_for_compound_type(world_edit_brush_constraints)) enum shape_type { - // NOTE(Jesse): Having this none value is kinda janky; I'd prefer to not for - // this enum, but since we have to overlap with type_world_update_op_shape_params - // we kinda have to have it (so that the none value draws if we accidentally set it to 0. - // - // type_world_update_op_shape_params doesn't strictly require a 0 value, - // but it's really nice to have the assertion in DoWorldUpdate - // - // Once this code matures a bit we can probably take this _None value - // out. It's strictly so we get a visual trigger in the UI. - // - ShapeType_None = type_world_update_op_shape_params_noop, - ShapeType_Sphere = type_world_update_op_shape_params_sphere, - ShapeType_Rect = type_world_update_op_shape_params_rect, + ShapeType_Sphere, + ShapeType_Rect, + ShapeType_Cylinder, }; poof(string_and_value_tables(shape_type)) #include @@ -1261,8 +1253,8 @@ GetHotVoxelForEditMode(engine_resources *Engine, world_edit_blend_mode WorldEdit link_internal v3 GetHotVoxelForFlood(engine_resources *Engine, world_edit_blend_mode WorldEditMode, world_edit_blend_mode_modifier Modifier); -link_internal void -ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *Preview, world_chunk *DestChunk, v3i SmallestMinOffset); +/* link_internal void */ +/* ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *Preview, world_chunk *DestChunk, v3i SmallestMinOffset); */ link_internal v3i GetSmallestMinOffset(layered_brush *LayeredBrush, v3i *LargestLayerDim = 0); diff --git a/src/engine/game_effects.cpp b/src/engine/game_effects.cpp index 6e4d6f6b3..f9b8f4cc7 100644 --- a/src/engine/game_effects.cpp +++ b/src/engine/game_effects.cpp @@ -295,12 +295,14 @@ DoDig( engine_resources *Resources, canonical_position PickCP, f32 Radius, f32 D v3 MinP = SimSpaceMinCenterP - V3(Radius, Radius, Depth); v3 MaxP = SimSpaceMinCenterP + V3(Radius, Radius, Depth); +#if 0 world_edit_shape Shape = { .Type = type_world_update_op_shape_params_rect, .world_update_op_shape_params_rect.Region = RectMinMax(MinP,MaxP), }; + QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Remove, WorldEdit_Modifier_Default, &Shape, {}, {}, Resources->WorldUpdateMemory); +#endif NotImplemented; - /* QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Remove, WorldEdit_Modifier_Default, &Shape, {}, {}, Resources->WorldUpdateMemory); */ } link_internal void @@ -311,12 +313,14 @@ DoIceBlock( engine_resources *Resources, canonical_position PickCP, f32 Radius, v3 MinP = SimSpaceMinCenterP - V3(Radius, Radius, 0.f); v3 MaxP = SimSpaceMinCenterP + V3(Radius, Radius, 3.f*Radius); +#if 0 world_edit_shape Shape = { .Type = type_world_update_op_shape_params_rect, .world_update_op_shape_params_rect.Region = RectMinMax(MinP,MaxP), }; + QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Attach, WorldEdit_Modifier_Default, &Shape, HSV_ICE_BLUE, {}, Resources->WorldUpdateMemory); +#endif NotImplemented; - /* QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Attach, WorldEdit_Modifier_Default, &Shape, HSV_ICE_BLUE, {}, Resources->WorldUpdateMemory); */ } link_internal void @@ -324,11 +328,11 @@ DoSplotion( engine_resources *Resources, cp PickCP, f32 Radius, random_series *E { UNPACK_ENGINE_RESOURCES(Resources); - world_edit_shape Shape = { - .Type = type_world_update_op_shape_params_sphere, - .world_update_op_shape_params_sphere.Radius = Radius, - .world_update_op_shape_params_sphere.Location = PickCP, - }; + /* world_edit_shape Shape = { */ + /* .Type = type_world_update_op_shape_params_sphere, */ + /* .world_update_op_shape_params_sphere.Radius = Radius, */ + /* .world_update_op_shape_params_sphere.Location = PickCP, */ + /* }; */ NotImplemented; /* QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Remove, WorldEdit_Modifier_Flood, &Shape, HSV_DARK_GREY, {}, Resources->WorldUpdateMemory); */ /* QueueWorldUpdateForRegion(Resources, WorldEdit_Mode_Remove, WorldUpdateModeModifier_None, &Shape, DARK_GREY, Resources->WorldUpdateMemory); */ diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index c93fca0fb..1c694101f 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -26,7 +26,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case type_work_queue_entry_copy_buffer_set: case type_work_queue_entry_copy_buffer_ref: case type_work_queue_entry_init_asset: - case type_work_queue_entry_update_world_region: + /* case type_work_queue_entry_update_world_region: */ case type_work_queue_entry_rebuild_mesh: case type_work_queue_entry_finalize_noise_values: case type_work_queue_entry_build_chunk_mesh: diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index 5ec6aaae6..7712b2dee 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -435,8 +435,8 @@ poof(serdes_struct(brush_settings)) poof(serdes_struct(brush_layer)) #include -poof(serdes_dunion(world_edit_shape)) -#include +/* poof(serdes_dunion(world_edit_shape)) */ +/* #include */ poof(serdes_struct(layered_brush)) #include diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index a1b2a131b..c75889fb7 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -89,6 +89,7 @@ struct work_queue_entry_rebuild_mesh +#if 0 struct work_queue_entry_update_world_region { world_edit_brush_constraints Brush; @@ -104,6 +105,7 @@ struct work_queue_entry_update_world_region world_chunk **DestChunkBuffer; u32 ChunkCount; }; +#endif struct asset; struct work_queue_entry_init_asset @@ -243,7 +245,7 @@ poof( work_queue_entry_copy_buffer_set work_queue_entry_copy_buffer_ref work_queue_entry_init_asset - work_queue_entry_update_world_region + /* work_queue_entry_update_world_region */ work_queue_entry_rebuild_mesh work_queue_entry_sim_particle_system diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 61fcab50c..10bf6be71 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3741,6 +3741,7 @@ WorkQueueEntryFinalizeNoiseValues(gpu_readback_buffer PBOBuf, u16 *NoiseData, v3 } +#if 0 link_internal work_queue_entry_update_world_region WorkQueueEntryUpdateWorldRegion(world_edit_blend_mode Mode, world_edit_blend_mode_modifier Modifier, @@ -3770,6 +3771,7 @@ WorkQueueEntryUpdateWorldRegion(world_edit_blend_mode Mode, }; return Result; } +#endif link_internal work_queue_entry_copy_buffer_ref WorkQueueEntryCopyBufferRef(lod_element_buffer *Buf, world_chunk_mesh_bitfield MeshBit, untextured_3d_geometry_buffer* Dest, world_position ChunkP, camera* Camera, chunk_dimension WorldChunkDim) diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 3de869b04..0779e4fa9 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -42,6 +42,7 @@ WorldUpdateThread_Main(void *ThreadStartupParams) InvalidCodePath(); } break; +#if 0 case type_work_queue_entry_update_world_region: { work_queue_entry_update_world_region *Job = SafeAccess(work_queue_entry_update_world_region, Entry); @@ -61,6 +62,7 @@ WorldUpdateThread_Main(void *ThreadStartupParams) } break; +#endif } @@ -95,7 +97,7 @@ link_internal void QueueWorldUpdateForRegion( engine_resources *Engine, world_edit_blend_mode Mode, world_edit_blend_mode_modifier Modifier, - world_edit_shape *Shape, + /* world_edit_shape *Shape, */ v3 HSVColor, b32 PersistWhitespace, memory_arena *Memory ) @@ -903,12 +905,12 @@ WorldEdit_shape_chunk_data_Default(apply_world_edit_params *Params, v3 SimOrigin +#if 0 link_internal void ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_region *Job, rect3i SimSpaceUpdateBounds, world_chunk *CopiedChunk, b32 Invert /* = False */, b32 PersistWhitespace /* = False */ ) { world *World = GetWorld(); NotImplemented; -#if 0 random_series ColorEntropy = {4654376543246}; @@ -1059,9 +1061,10 @@ ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_re } } -#endif } +#endif +#if 0 link_internal void DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_queue_entry_update_world_region *Job) { @@ -1376,4 +1379,5 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ } } } +#endif diff --git a/src/engine/world_update.h b/src/engine/world_update.h index f84f15ce9..81130547d 100644 --- a/src/engine/world_update.h +++ b/src/engine/world_update.h @@ -75,13 +75,13 @@ ChunkCountForDim(v3i Dim, v3i ChunkDim) -struct work_queue_entry_update_world_region; +/* struct work_queue_entry_update_world_region; */ -link_internal void -QueueWorldUpdateForRegion( engine_resources *Engine, world_edit_blend_mode Mode, world_edit_blend_mode_modifier Modifier, world_edit_shape *Shape, v3 HSVColor, b32 PersistWhitespace, memory_arena *Memory ); +/* link_internal void */ +/* QueueWorldUpdateForRegion( engine_resources *Engine, world_edit_blend_mode Mode, world_edit_blend_mode_modifier Modifier, /1* world_edit_shape *Shape, *1/ v3 HSVColor, b32 PersistWhitespace, memory_arena *Memory ); */ -link_internal void -ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_region *Job, rect3i SimSpaceUpdateBounds, world_chunk *CopiedChunk, b32 Invert = False, b32 PersistWhitespace = False); +/* link_internal void */ +/* ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_region *Job, rect3i SimSpaceUpdateBounds, world_chunk *CopiedChunk, b32 Invert = False, b32 PersistWhitespace = False); */ -link_internal void -DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_queue_entry_update_world_region *Job); +/* link_internal void */ +/* DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_queue_entry_update_world_region *Job); */ From 57de5b322d8bdd7ecc918a3b1387c4e3dc268110 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 5 Mar 2025 13:20:29 -0700 Subject: [PATCH 184/421] Implement rect brush in world edit shader --- shaders/terrain/world_edit.fragmentshader | 14 +++++++++++--- src/engine/editor.cpp | 3 +-- src/engine/render_loop.cpp | 9 ++++++++- src/engine/world.cpp | 1 + 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 8fb5fb27d..2b01bc3bd 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -13,6 +13,7 @@ uniform int Modifiers; uniform v3 ChunkRelEditMin; uniform v3 ChunkRelEditMax; + // // Shape params // @@ -217,8 +218,13 @@ void main() { switch (ShapeType) { - case 0: { } break; - case 1: { } break; + // ShapeType_Sphere + case 0: { } break; + + // ShapeType_Rect + case 1: { NoiseSample = 1.f; } break; + + // ShapeType_Cylinder case 2: { } break; } } break; @@ -284,7 +290,9 @@ void main() NoiseSample *= -1.f; } - NoiseSample *= Amplitude; + f32 Amp = max(Amplitude, 1.f); + NoiseSample *= Amp; + /* NoiseSample *= Amplitude; */ switch (BlendMode) { diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 0478f7e78..c6858f80f 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2315,7 +2315,7 @@ ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Temp /* Assert(Node->Type == OctreeNodeType_Leaf); */ - Node->Dirty = True;; + Node->Dirty = True; ReleaseFutex(&Node->Lock); } } @@ -2349,7 +2349,6 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo // Update the edit // - auto OldEditRegion = Editor->CurrentEdit->Region; // NOTE(Jesse): Debug Editor->CurrentEdit->Region = Region; // TODO(Jesse): I feel like this should be happening more automagically, but .. ApplyEditToOctree(Engine, Edit, TempMemory); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 1c694101f..0c2bd310c 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -369,7 +369,14 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case BrushLayerType_Shape: { - NotImplemented; + shape_layer *Shape = &Layer->Settings.Shape; + BindUniformByName(&WorldEditRC->Program, "ShapeType", Shape->Type); + switch(Shape->Type) + { + case ShapeType_Sphere: { } break; + case ShapeType_Rect: { } break; + case ShapeType_Cylinder: { } break; + } } break; } diff --git a/src/engine/world.cpp b/src/engine/world.cpp index ef650b20d..c13165a43 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -1161,6 +1161,7 @@ GatherOctreeNodesOverlapping_Recursive(world *World, octree_node *Current, rect3 if (Intersect(World, &Box, Region)) { Push(Result, &Current); + switch(Current->Type) { InvalidCase(OctreeNodeType_Undefined); From e4f29a9c3315ef68ba99be025c6be19e406da059 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 10:32:13 -0700 Subject: [PATCH 185/421] Fix a few bugs --- generated/generate_stream_compact_v3i.h | 2 +- ..._mesh_functions_untextured_3d_geometry_buffer_v3.h | 2 +- ...sh_functions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/api.cpp | 11 +++++++++-- src/engine/editor.cpp | 4 ++++ src/engine/render.cpp | 10 ++++++++-- src/engine/render_loop.cpp | 10 +++++++--- src/engine/world.cpp | 4 ++-- src/engine/world_chunk.cpp | 11 +++++++---- src/engine/world_chunk.h | 5 ++++- 10 files changed, 44 insertions(+), 17 deletions(-) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 1afccdebb..a096095d2 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3065:0 +// src/engine/world_chunk.cpp:3068:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 0a5856c42..bbff9eb75 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2079:0 +// src/engine/world_chunk.cpp:2082:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index b0f018068..cc8774c28 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2082:0 +// src/engine/world_chunk.cpp:2085:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/src/engine/api.cpp b/src/engine/api.cpp index ebef82dac..c2ed30491 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -727,14 +727,20 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ } else { - Assert(HasGpuMesh(&DestChunk->Mesh) == False); + if (HasGpuMesh(&DestChunk->Mesh)) + { + PushDeallocateBuffersCommand(RenderQ, &DestChunk->Mesh.Handles); + } FinalizeChunkInitialization(DestChunk); FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); } } else { - Assert(HasGpuMesh(&DestChunk->Mesh) == False); + if (HasGpuMesh(&DestChunk->Mesh)) + { + PushDeallocateBuffersCommand(RenderQ, &DestChunk->Mesh.Handles); + } FinalizeChunkInitialization(DestChunk); FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); } @@ -747,6 +753,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ PushBonsaiRenderCommandUnmapAndDeallocateBuffer(RenderQ, Job->PBOBuf); Assert(Graphics->NoiseFinalizeJobsPending); AtomicDecrement(&Graphics->NoiseFinalizeJobsPending); + } break; { tmatch(work_queue_entry_build_chunk_mesh, Entry, Job) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index c6858f80f..71459750a 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1420,6 +1420,7 @@ NewBrush(world_edit_brush *Brush) Brush->Layered.LayerCount = 1; // Initialize PrevSettings so we don't fire a changed event straight away.. + // @prevent_change_event CheckSettingsChanged(&Brush->Layered); } @@ -2809,6 +2810,7 @@ DoWorldEditor(engine_resources *Engine) if (Button(Ui, CS(Brush->NameBuf), UiId(&BrushSettingsWindow, "brush select", Brush))) { Editor->CurrentBrush = Brush; + CheckSettingsChanged(&Brush->Layered); // Prevent firing a change event @prevent_change_event } PushNewRow(Ui); } @@ -2867,12 +2869,14 @@ DoWorldEditor(engine_resources *Engine) { Editor->Selection.Clicks = 2; Editor->Selection.Region = Edit->Region; + Editor->Selection.PrevRegion = Edit->Region; Editor->CurrentEdit = Edit; if (Edit->Brush) { Editor->CurrentBrush = Edit->Brush; + CheckSettingsChanged(&Edit->Brush->Layered); // Prevent firing a change event @prevent_change_event } } if (Hover(Ui, &EditSelectButton)) diff --git a/src/engine/render.cpp b/src/engine/render.cpp index e2bfbffac..cc31df7c5 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1046,7 +1046,7 @@ poof(gpu_buffer(lod_element_buffer, untextured_3d_geometry_buffer)) #include link_internal void -ReallocateAndSyncGpuBuffers(gpu_element_buffer_handles *Handles, untextured_3d_geometry_buffer *Mesh) +ReallocateGpuBuffers(gpu_element_buffer_handles *Handles, data_type Type, u32 ElementCount) { if (Handles->VertexHandle) { @@ -1054,7 +1054,13 @@ ReallocateAndSyncGpuBuffers(gpu_element_buffer_handles *Handles, untextured_3d_g } Clear(Handles); - AllocateGpuElementBuffer(Handles, Mesh->Type, Mesh->At); + AllocateGpuElementBuffer(Handles, Type, ElementCount); +} + +link_internal void +ReallocateAndSyncGpuBuffers(gpu_element_buffer_handles *Handles, untextured_3d_geometry_buffer *Mesh) +{ + ReallocateGpuBuffers(Handles, Mesh->Type, Mesh->At); CopyToGpuBuffer(Mesh, Handles); } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 0c2bd310c..23e1a7bfa 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -98,9 +98,13 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { tmatch(bonsai_render_command_allocate_and_map_gpu_element_buffer, RC, Command) TIMED_NAMED_BLOCK(bonsai_render_command_allocate_and_map_gpu_element_buffer); - Assert(HasGpuMesh(Command->Dest) == 0); - Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 0); - Command->Dest[0] = AllocateAndMapGpuBuffer(Command->Type, Command->ElementCount); + /* Assert(HasGpuMesh(Command->Dest) == 0); */ + /* Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 0); */ + /* Command->Dest[0] = AllocateAndMapGpuBuffer(Command->Type, Command->ElementCount); */ + + ReallocateGpuBuffers(&Command->Dest->Handles, Command->Type, Command->ElementCount); + MapGpuBuffer_untextured_3d_geometry_buffer(Command->Dest); + Assert(HasGpuMesh(Command->Dest) == 1); Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 1); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index c13165a43..18038ae24 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -914,7 +914,7 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt if (Node->Dirty) { AcquireFutex(&Node->Lock); - ForceOctreeNodeReinitialization(Engine, Node); + ReinitializeOctreeNode(Engine, Node); ReleaseFutex(&Node->Lock); } else @@ -949,7 +949,7 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt if (Node->Dirty) { AcquireFutex(&Node->Lock); - ForceOctreeNodeReinitialization(Engine, Node); + ReinitializeOctreeNode(Engine, Node); ReleaseFutex(&Node->Lock); } else diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 10bf6be71..e06974219 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -453,7 +453,7 @@ FreeWorldChunk(engine_resources *Engine, world_chunk *Chunk) } link_internal void -ForceOctreeNodeReinitialization(engine_resources *Engine, octree_node *Node) +ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node) { Assert(FutexIsSignaled(&Node->Lock)); @@ -463,9 +463,12 @@ ForceOctreeNodeReinitialization(engine_resources *Engine, octree_node *Node) if ( Node->Chunk->Flags && (Node->Chunk->Flags & Chunk_Queued) == 0) { - DeallocateAndClearWorldChunk(Engine, Node->Chunk); - Node->Chunk->DimInChunks = Node->Resolution; - Node->Chunk->WorldP = Node->WorldP; + Node->Chunk->FilledCount = {}; + QueueChunkForInit(&Engine->Stdlib.Plat.RenderQ, Node, MeshBit_None); + /* DeallocateAndClearWorldChunk(Engine, Node->Chunk); */ + /* Node->Chunk->DimInChunks = Node->Resolution; */ + /* Node->Chunk->WorldP = Node->WorldP; */ + } } diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 6e316f175..db8209138 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -646,7 +646,7 @@ link_internal void DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk); link_internal void -ForceOctreeNodeReinitialization(engine_resources *Engine, octree_node *Node); +ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node); link_internal s32 MarkBoundaryVoxels_MakeExteriorFaces(u64 *Occupancy, voxel *Voxels, chunk_dimension SrcChunkDim, chunk_dimension SrcChunkMin, chunk_dimension SrcChunkMax ); @@ -669,3 +669,6 @@ struct gpu_readback_buffer; link_internal work_queue_entry_finalize_noise_values WorkQueueEntryBuildChunkMesh(gpu_readback_buffer PBOBuf, f32 *NoiseData, v3i NoiseDim, world_chunk *Chunk); + +inline void +QueueChunkForInit(work_queue *Queue, octree_node *Node, world_chunk_mesh_bitfield MeshBit); From c55ac4f4e4213702d55d0073fb643dcbc3d84116 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 11:24:59 -0700 Subject: [PATCH 186/421] Get rid of an old boolean that was causing problems --- ..._editor_ui_for_compound_type_world_chunk.h | 13 ------ generated/generate_stream_compact_v3i.h | 2 +- generated/string_and_value_tables_enum.h | 44 +++++++++++++++++++ ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/api.cpp | 2 - src/engine/bonsai.h | 1 - src/engine/world.cpp | 35 +++++---------- src/engine/world_chunk.cpp | 27 +++++++----- src/engine/world_chunk.h | 2 +- 10 files changed, 74 insertions(+), 56 deletions(-) create mode 100644 generated/string_and_value_tables_enum.h diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index cd42aec6a..1895e52c5 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -164,19 +164,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->HasMesh), - CSz("HasMesh"), - &DefaultUiRenderParams_Checkbox - ); - - - - - - PushNewRow(Ui); - DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index a096095d2..148fb97d2 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3068:0 +// src/engine/world_chunk.cpp:3071:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/string_and_value_tables_enum.h b/generated/string_and_value_tables_enum.h new file mode 100644 index 000000000..4a0c4a23e --- /dev/null +++ b/generated/string_and_value_tables_enum.h @@ -0,0 +1,44 @@ +// src/engine/editor.h:893:0 + +link_internal counted_string +ToStringPrefixless(brush_layer_type Type) +{ + counted_string Result = {}; + switch (Type) + { + case BrushLayerType_Noise: { Result = CSz("Noise"); } break; + case BrushLayerType_Shape: { Result = CSz("Shape"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(brush_layer_type Type) +{ + counted_string Result = {}; + switch (Type) + { + case BrushLayerType_Noise: { Result = CSz("BrushLayerType_Noise"); } break; + case BrushLayerType_Shape: { Result = CSz("BrushLayerType_Shape"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal brush_layer_type +BrushLayerType(counted_string S) +{ + brush_layer_type Result = {}; + + if (StringsMatch(S, CSz("BrushLayerType_Noise"))) { return BrushLayerType_Noise; } + if (StringsMatch(S, CSz("BrushLayerType_Shape"))) { return BrushLayerType_Shape; } + + return Result; +} + + diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index bbff9eb75..6dfc2bf8f 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2082:0 +// src/engine/world_chunk.cpp:2085:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index cc8774c28..9da505eee 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2085:0 +// src/engine/world_chunk.cpp:2088:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/src/engine/api.cpp b/src/engine/api.cpp index c2ed30491..4309dc104 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -771,8 +771,6 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ Assert(GpuMappedBuf->Buffer.At == GpuMappedBuf->Buffer.End); Assert(HasGpuMesh(&DestChunk->Mesh) == True); - DestChunk->HasMesh = True; - FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); DestChunk->DEBUG_OwnedByThread = 0; diff --git a/src/engine/bonsai.h b/src/engine/bonsai.h index 8d5a3c3fe..7aeac9796 100644 --- a/src/engine/bonsai.h +++ b/src/engine/bonsai.h @@ -256,7 +256,6 @@ ClearWorldChunk( world_chunk *Chunk ) /* Chunk->PointsToLeaveRemaining = {}; */ /* Chunk->TriCount = {}; */ /* Chunk->EdgeBoundaryVoxelCount = {}; */ - Chunk->HasMesh = {}; Chunk->StandingSpots.At = Chunk->StandingSpots.Start; Chunk->Entities = {}; Chunk->Next = {}; diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 18038ae24..fa4c9842d 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -432,7 +432,7 @@ CountsAsDrawableOrUnmeshed(octree_node *Node) // I'm going to say this is true to avoid data races for now b32 NotQueued = (Chunk->Flags&Chunk_Queued) == 0; - Result = ( NotQueued && Chunk->HasMesh && HasGpuMesh(&Chunk->Mesh) ); + Result = ( NotQueued && HasGpuMesh(&Chunk->Mesh) ); } else { @@ -746,7 +746,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue if (Chunk->Flags & Chunk_VoxelsInitialized) { - if (Chunk->HasMesh == False) + if (HasGpuMesh(&Chunk->Mesh) == False) { Assert( (Chunk->Flags & Chunk_Queued) == False); /* if (Chunk->WorldP == V3i(0,0,0)) { RuntimeBreak(); } */ @@ -863,6 +863,11 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt Assert(Node->Chunk->Dim % World->ChunkDim == V3i(0)); } + if (Node->Dirty) + { + ReinitializeOctreeNode(Engine, Node); + } + f32 AABBLineDim = Max(1.f, Node->Resolution.x/12.f); Assert (Node); { @@ -911,17 +916,8 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt if (HasGpuMesh(&Chunk->Mesh)) { - if (Node->Dirty) - { - AcquireFutex(&Node->Lock); - ReinitializeOctreeNode(Engine, Node); - ReleaseFutex(&Node->Lock); - } - else - { - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); - } + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); } } } @@ -946,17 +942,8 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt if (HasGpuMesh(&Chunk->Mesh)) { - if (Node->Dirty) - { - AcquireFutex(&Node->Lock); - ReinitializeOctreeNode(Engine, Node); - ReleaseFutex(&Node->Lock); - } - else - { - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); - } + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); } } } diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index e06974219..338b4d122 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -90,6 +90,7 @@ ChunkIsGarbage(world_chunk* Chunk) link_internal void WorldChunk(world_chunk *Chunk, v3i WorldP, v3i Dim, v3i DimInChunks) { + Chunk->FilledCount = {}; Chunk->WorldP = WorldP; Chunk->Dim = Dim; Chunk->DimInChunks = DimInChunks; @@ -455,24 +456,26 @@ FreeWorldChunk(engine_resources *Engine, world_chunk *Chunk) link_internal void ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node) { - Assert(FutexIsSignaled(&Node->Lock)); + Assert(!FutexIsSignaled(&Node->Lock)); + AcquireFutex(&Node->Lock); - Node->HadNoVisibleSurface = False; if (Node->Chunk) { - if ( Node->Chunk->Flags && - (Node->Chunk->Flags & Chunk_Queued) == 0) - { - Node->Chunk->FilledCount = {}; - QueueChunkForInit(&Engine->Stdlib.Plat.RenderQ, Node, MeshBit_None); - /* DeallocateAndClearWorldChunk(Engine, Node->Chunk); */ - /* Node->Chunk->DimInChunks = Node->Resolution; */ - /* Node->Chunk->WorldP = Node->WorldP; */ - - } + // Skip chunks that are already queued + if (Node->Chunk->Flags & Chunk_Queued) { ReleaseFutex(&Node->Lock); return; } + } + else + { + Node->Chunk = GetFreeWorldChunk(Engine->World); } + Node->HadNoVisibleSurface = False; Node->Dirty = 0; + + WorldChunk(Node->Chunk, Node->WorldP, Engine->World->ChunkDim, Node->Resolution); + QueueChunkForInit(&Engine->Stdlib.Plat.RenderQ, Node, MeshBit_None); + + ReleaseFutex(&Node->Lock); } link_internal world_chunk* diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index db8209138..54efef1bc 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -334,7 +334,7 @@ struct world_chunk poof(@version(1)) gpu_mapped_element_buffer Mesh; poof(@no_serialize) // TODO(Jesse): Pack this into something else.. or ideally remove it entirely. - b32 HasMesh; poof(@no_serialize) + /* b32 HasMesh; poof(@no_serialize) */ /* threadsafe_geometry_buffer TransparentMeshes; */ /* gpu_mapped_element_buffer GpuBuffers[MeshIndex_Count]; */ From 6ff7ba9b7ddd544c698786745734aa613501edab Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 11:30:18 -0700 Subject: [PATCH 187/421] Only re-queue nodes that are going to actually draw --- src/engine/world.cpp | 79 +++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/src/engine/world.cpp b/src/engine/world.cpp index fa4c9842d..cdd110e48 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -428,11 +428,7 @@ CountsAsDrawableOrUnmeshed(octree_node *Node) if (world_chunk *Chunk = Node->Chunk) { - // NOTE(Jesse): Queued nodes don't necessarily mean they can't be drawn, but - // I'm going to say this is true to avoid data races for now - b32 NotQueued = (Chunk->Flags&Chunk_Queued) == 0; - - Result = ( NotQueued && HasGpuMesh(&Chunk->Mesh) ); + Result = HasGpuMesh(&Chunk->Mesh); } else { @@ -863,11 +859,6 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt Assert(Node->Chunk->Dim % World->ChunkDim == V3i(0)); } - if (Node->Dirty) - { - ReinitializeOctreeNode(Engine, Node); - } - f32 AABBLineDim = Max(1.f, Node->Resolution.x/12.f); Assert (Node); { @@ -900,24 +891,32 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt } else { // Draw ourselves; the mesh composed of the children has a hole. - if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) + + if (Node->Dirty) { - if (Chunk) + ReinitializeOctreeNode(Engine, Node); + } + else + { + if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) { - if (ContainsCameraGhost(World, EntityTable, Node, GameCamera)) + if (Chunk) { - EngineDebug->SelectedNode = Node; - } - - if (EngineDebug->DrawNodesWithChunks) - { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); - } - - if (HasGpuMesh(&Chunk->Mesh)) - { - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); + if (ContainsCameraGhost(World, EntityTable, Node, GameCamera)) + { + EngineDebug->SelectedNode = Node; + } + + if (EngineDebug->DrawNodesWithChunks) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + } + + if (HasGpuMesh(&Chunk->Mesh)) + { + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); + } } } } @@ -926,29 +925,35 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt case OctreeNodeType_Leaf: { - if (Chunk) + if (Node->Dirty) { - if (EngineDebug->DrawLeafNodes) - { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); - } - - if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) + ReinitializeOctreeNode(Engine, Node); + } + else + { + if (Chunk) { - if (EngineDebug->DrawNodesWithChunks) + if (EngineDebug->DrawLeafNodes) { DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); } - if (HasGpuMesh(&Chunk->Mesh)) + if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) { - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); + if (EngineDebug->DrawNodesWithChunks) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + } + + if (HasGpuMesh(&Chunk->Mesh)) + { + Push(MainDrawList, &Chunk); + Push(ShadowMapDrawList, &Chunk); + } } } } - } break; } From 74d95f5b40626d95eed49434024a4abef38fbfa3 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 14:19:09 -0700 Subject: [PATCH 188/421] Readme --- readme.md | 13 +++++++------ src/engine/world.cpp | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/readme.md b/readme.md index 33f947d60..462c9e4da 100644 --- a/readme.md +++ b/readme.md @@ -7,9 +7,9 @@ Bonsai is a 3D voxel-based engine built with the intention of writing both fast-paced arcade games and tile/turn-based RPGs Bonsai, and nearly all it's dependencies, are written completely from scratch. -One external dependency is the C runtime library for startup, and a small -handful of trig functions (sin, cos, atan2). I have a back-burner task to -remove the CRT entirely, though it's unclear when/if I'll get around to it. +One external dependency is the C runtime library for program startup. I have a +back-burner task to remove the CRT entirely, though it's unclear when/if I'll +get around to it. The only requirements to build and run Bonsai are an OpenGL 3.3+ driver, C++ compiler, and a few appropriate system headers. @@ -38,14 +38,14 @@ See the docs on the [build process](docs/01_build_process.md). ## Engine Features -* Hot Code Reloading -* MT Job System +* Shader-based Terrain Generation +* Hot Shader & Game-code Reloading +* Async Job System * Entities * Collision * Transparent & Emissive Particles * UI Framework * Asset Loaders -* Terrain Generators * Primitive Physics ![banner](screenshots/profiler.png) @@ -158,3 +158,4 @@ See the docs on the [build process](docs/01_build_process.md). [ ] Improve the ETW layer : https://github.com/bombomby/optick/blob/master/src/optick_core.win.h [ ] GPU Profiling : https://www.khronos.org/opengl/wiki/Query_Object + diff --git a/src/engine/world.cpp b/src/engine/world.cpp index cdd110e48..57d3bd0be 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -424,7 +424,7 @@ GetParentNodeFor(world *World, octree_node *QueryNode) link_internal b32 CountsAsDrawableOrUnmeshed(octree_node *Node) { - b32 Result = True; // Default to true if there's nothing to draw (no chunk) + b32 Result = True; if (world_chunk *Chunk = Node->Chunk) { From 1fff8ab5b9ca4317eaf8fd0aed6f779912f3cc4d Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 14:59:33 -0700 Subject: [PATCH 189/421] Sort and apply edits in order --- src/engine/render_loop.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 23e1a7bfa..1bc65d54c 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -312,11 +312,24 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; + s32 EditCount = s32(TotalElements(&Node->Edits)); + sort_key *Keys = Allocate(sort_key, GetTranArena(), EditCount); + + IterateOver(&Node->Edits, Edit, EditIndex) { - /* Edit->Type = WorldEdit_BrushType_Layered; */ + u64 Ordinal = Edit->Brush ? u64(Edit->Brush->Ordinal) : 0; + u32 KeyIndex = u32(GetIndex(&EditIndex)); + Keys[KeyIndex] = {Ordinal, u64(Edit)}; + } + + BubbleSort_descending(Keys, u32(EditCount)); + + RangeIterator(KeyIndex, EditCount) + { TIMED_NAMED_BLOCK(WorldEditDrawCall); + world_edit *Edit = Cast(world_edit*, Keys[KeyIndex].Value); if (Edit->Brush) // NOTE(Jesse): Don't necessarily have to have a brush if we created the edit before we created a brush. { layered_brush *Brush = &Edit->Brush->Layered; From c3b497895e9435226d460b63e0db1c1df9292a2c Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 15:26:18 -0700 Subject: [PATCH 190/421] Properly sort using ordinal on Edit instead of Brush --- generated/are_equal_struct.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 23 +++++++++++++++++++ ...or_compound_type_struct_world_edit_brush.h | 16 ------------- generated/hashtable_struct.h | 2 +- generated/serdes_struct_world_edit.h | 10 ++++++++ generated/serdes_struct_world_edit_brush.h | 15 ------------ src/engine/editor.cpp | 4 +++- src/engine/editor.h | 3 +-- src/engine/render_loop.cpp | 3 +-- 11 files changed, 42 insertions(+), 40 deletions(-) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index cd128a1a1..e4f9274bf 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1132:0 +// src/engine/editor.h:1130:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index 7a5682c42..0b96eb1d7 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1146:0 +// src/engine/editor.h:1145:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 2aa206b0a..c709dc4de 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1148:0 +// src/engine/editor.h:1147:0 diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index bace9809e..a61f33983 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -48,6 +48,29 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, CSz("Brush"), Params ); + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->Ordinal), + CSz("Ordinal"), + Params + ); + + + + + + + + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 96f845d62..a0cd4b1ec 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -74,22 +74,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->Ordinal), - CSz("Ordinal"), - Params - ); - - - - - - - - PushNewRow(Ui); - DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/hashtable_struct.h b/generated/hashtable_struct.h index 16ae04221..e766125d0 100644 --- a/generated/hashtable_struct.h +++ b/generated/hashtable_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1135:0 +// src/engine/editor.h:1133:0 struct world_edit_brush_linked_list_node { diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index 6bb68269d..66a4b2422 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -44,6 +44,10 @@ Serialize(u8_cursor_block_array *Bytes, world_edit *BaseElement, umm Count = 1) if (Element->Brush) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } + + + Result &= Serialize(Bytes, &Element->Ordinal); // default + if (Element->Brush) { Result &= Serialize(Bytes, Element->Brush); } @@ -80,6 +84,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit *Element, memory_arena *M b64 HadBrushPointer = Read_u64(Bytes); Assert(HadBrushPointer < 2); // Should be 0 or 1 + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Ordinal, Memory); + if (HadBrushPointer) { umm Count = 1; diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index 4b3b3a786..a0275357d 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -54,13 +54,6 @@ Serialize(u8_cursor_block_array *Bytes, world_edit_brush *BaseElement, umm Count - Result &= Serialize(Bytes, &Element->Ordinal); // default - - - - - - Result &= Serialize(Bytes, &Element->Layered); // default @@ -104,14 +97,6 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_brush *Element, memory_ar - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Ordinal, Memory); - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Layered, Memory); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 71459750a..0c2e5a8e9 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2745,6 +2745,8 @@ DoWorldEditor(engine_resources *Engine) world_edit E = {}; Editor->CurrentEdit = Push(&Editor->WorldEdits, &E); + Editor->CurrentEdit->Ordinal = Editor->NextEditOrdinal++; + Editor->CurrentEdit->Brush = Editor->CurrentBrush; } @@ -2889,6 +2891,7 @@ DoWorldEditor(engine_resources *Engine) Edit->Brush = Editor->CurrentBrush; UpdateWorldEdit(Engine, Edit, Edit->Region, GetTranArena()); } + PushNewRow(Ui); DoEditorUi(Ui, &AllEditsWindow, Edit, {}); @@ -3139,7 +3142,6 @@ DoLevelWindow(engine_resources *Engine) Deserialize(&LevelBytes, &DeserEdit, GetTranArena()); world_edit *FinalEdit = Push(&Editor->WorldEdits, &DeserEdit); - if (FinalEdit->Brush) { FinalEdit->Brush = Upsert(*FinalEdit->Brush, &Editor->LoadedBrushes, Editor->Memory); diff --git a/src/engine/editor.h b/src/engine/editor.h index 25f790cf4..026301ad3 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1110,8 +1110,6 @@ struct world_edit_brush world_edit_blend_mode Mode; world_edit_blend_mode_modifier Modifier; - u32 Ordinal; // monotonically increasing integer sourced from level_editor::NextEditOrdinal - /* world_edit_brush_type Type; */ /* union */ /* { */ @@ -1139,6 +1137,7 @@ struct world_edit { rect3cp Region; // TODO(Jesse): Rename to bounds world_edit_brush *Brush; + u32 Ordinal; // monotonically increasing integer sourced from level_editor::NextEditOrdinal }; typedef world_edit* world_edit_ptr; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 1bc65d54c..081ee83e3 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -318,9 +318,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) IterateOver(&Node->Edits, Edit, EditIndex) { - u64 Ordinal = Edit->Brush ? u64(Edit->Brush->Ordinal) : 0; u32 KeyIndex = u32(GetIndex(&EditIndex)); - Keys[KeyIndex] = {Ordinal, u64(Edit)}; + Keys[KeyIndex] = {u64(Edit->Ordinal), u64(Edit)}; } BubbleSort_descending(Keys, u32(EditCount)); From 62e502b1dc7c25393ddb75b611e9ddc9e43966fc Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 16:29:39 -0700 Subject: [PATCH 191/421] No longer hard reset editor on terrain shader reload --- shaders/terrain/default.fragmentshader | 8 +++++--- src/engine/api.cpp | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/default.fragmentshader index 2f979aa6a..534ae6de9 100644 --- a/shaders/terrain/default.fragmentshader +++ b/shaders/terrain/default.fragmentshader @@ -230,7 +230,7 @@ void main() // { v3 Period = V3(100.f); - float Amplitude = 3.f; + float Amplitude = 5.f; f32 StartingZDepth = 400.f; s32 Octaves = 1; @@ -254,8 +254,10 @@ void main() f32 Tint = gradient_noise(xyz*60.f); ColorValue = v3(0.1f, 0.55f + 0.1f*Tint, 0.1f); - f32 GrassMask = gradient_noise(xyz*10.f); - f32 Grass = white_noise(V3(xyz.xy,1.f))*3.f; + f32 GrassMask = clamp(gradient_noise(xyz*5.f), 0.f, 1.f); + f32 GrassSample = white_noise(V3(xyz.xy,1.f)); + + f32 Grass = GrassSample > 0.88f ? GrassSample*9.f : 0.f; NoiseValue += abs(Grass*GrassMask); diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 4309dc104..8b405107d 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -99,7 +99,8 @@ Bonsai_FrameBegin(engine_resources *Resources) Assert(Count(&Resources->Graphics.NoiseReadbackJobs) == 0); HardResetWorld(Resources); - HardResetEditor(&Resources->Editor); + ApplyEditBufferToOctree(Resources, &Resources->Editor.WorldEdits); + /* HardResetEditor(&Resources->Editor); */ UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); } From 1f3bd16788146b3a59935ffc9335c4f3dbef87cb Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 19:36:41 -0700 Subject: [PATCH 192/421] Change world_chunk *PickedChunk -> octree_node *PickedNode --- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- .../block_array_entity_ptr_688856411_h.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 6 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...d_type_struct_terrain_gen_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 26 ++++++ ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/gen_constructor_voxel_lighting.h | 2 +- .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- ...e_string_table_world_chunk_mesh_bitfield.h | 2 +- ...rate_string_table_world_chunk_mesh_index.h | 2 +- generated/hashtable_struct.h | 2 +- generated/maybe_chunk_data.h | 2 +- generated/maybe_standing_spot.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- .../string_and_value_tables_chunk_flag.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- generated/string_and_value_tables_enum.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- shaders/terrain/world_edit.fragmentshader | 6 +- src/engine/debug.cpp | 15 ++-- src/engine/debug.h | 2 +- src/engine/editor.cpp | 82 +++++++++++-------- src/engine/render_loop.cpp | 3 +- src/engine/world_chunk.cpp | 39 +++++---- src/engine/world_chunk.h | 12 +-- 111 files changed, 220 insertions(+), 175 deletions(-) create mode 100644 generated/do_editor_ui_for_compound_type_world_edit_paged_list.h diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 6b182478c..2c67def3b 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:953:0 +// src/engine/editor.h:965:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 9f7db738c..8badc234e 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:695:0 +// src/engine/editor.h:707:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index e4f9274bf..fdb664716 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1130:0 +// src/engine/editor.h:1142:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_entity_ptr_688856411_h.h b/generated/block_array_entity_ptr_688856411_h.h index 1ffac669d..23f5454eb 100644 --- a/generated/block_array_entity_ptr_688856411_h.h +++ b/generated/block_array_entity_ptr_688856411_h.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:305:0 +// src/engine/world_chunk.h:307:0 diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 9c1d79122..a196caed3 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:531:0 +// src/engine/editor.h:543:0 diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index 170c5a7c9..9f87666ef 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:448:0 +// src/engine/world_chunk.h:450:0 diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index dd42056ff..eccb7eafb 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:483:0 +// src/engine/world_chunk.h:485:0 diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index 0b96eb1d7..30f6777db 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1145:0 +// src/engine/editor.h:1157:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index c709dc4de..7e570ac3f 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1147:0 +// src/engine/editor.h:1159:0 diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index dd298bd06..8959cae08 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:510:0 +// src/engine/world_chunk.h:512:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index 6c6ee4bfe..4a39d0dd3 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:445:0 +// src/engine/world_chunk.h:447:0 struct world_chunk_ptr_buffer { diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 9221abeac..e21d8084c 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1018:0 +// src/engine/editor.h:1030:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index 0e401c338..8a7a5dc08 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1011:0 +// src/engine/editor.h:1023:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index b0f526148..b66ea99af 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1004:0 +// src/engine/editor.h:1016:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 4a9d44135..d93c22c51 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:879:0 +// src/engine/editor.h:891:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index dc076bc32..1dbd4354d 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:285:0 +// src/engine/editor.cpp:321:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index d4125eb01..e34c9c8d8 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:277:0 +// src/engine/editor.cpp:313:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index d24f32f52..128909dfb 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:307:0 +// src/engine/editor.cpp:221:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 876b4a42a..3cba3997a 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:316:0 +// src/engine/editor.cpp:230:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 73736008f..b23aa5a38 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:301:0 +// src/engine/editor.cpp:215:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index c6e3560ef..b4d05aaad 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:218:0 +// src/engine/editor.cpp:254:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index d78808ecb..a7609a0a9 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:310:0 +// src/engine/editor.cpp:224:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index b4b4a7c8f..e0cdd03c7 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:288:0 +// src/engine/editor.cpp:324:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 30ad7ab1f..32621bf82 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:405:0 +// src/engine/editor.cpp:408:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -359,8 +359,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_chunk*, Element->PickedChunk), - CSz("PickedChunk"), + Cast(octree_node*, Element->PickedNode), + CSz("PickedNode"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index cef082364..08100d966 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:426:0 +// src/engine/editor.cpp:429:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index d6157abfa..d1bc452d1 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:423:0 +// src/engine/editor.cpp:426:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index b278112b9..a5aadde32 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:257:0 +// src/engine/editor.cpp:293:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index e51bcd691..4faae65c4 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:254:0 +// src/engine/editor.cpp:290:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index e7887d1fd..f8cbcfcda 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:291:0 +// src/engine/editor.cpp:327:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 4118fbe82..19e5c5d62 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:242:0 +// src/engine/editor.cpp:278:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 9218364bb..0b2ed5b3d 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:298:0 +// src/engine/editor.cpp:212:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 4abc6f9dc..9a96a29a7 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:384:0 +// src/engine/editor.cpp:387:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index d4f6fa3fd..1c7e839d7 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:378:0 +// src/engine/editor.cpp:381:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 1ddd52289..f426f5367 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:224:0 +// src/engine/editor.cpp:260:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 9b76a74bd..3cca3b3ac 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:227:0 +// src/engine/editor.cpp:263:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index eb27b966f..b024a2f32 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:396:0 +// src/engine/editor.cpp:399:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index ac1b68699..9cc371890 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:420:0 +// src/engine/editor.cpp:423:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 46e8fa06d..22d0b3b64 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:319:0 +// src/engine/editor.cpp:233:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 15945450b..67fdcf16d 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:411:0 +// src/engine/editor.cpp:414:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index e3cf14150..bca99780a 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:381:0 +// src/engine/editor.cpp:384:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index de029078c..b4f4a9404 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:230:0 +// src/engine/editor.cpp:266:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index d843228ec..ad5ae6c02 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:233:0 +// src/engine/editor.cpp:269:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 2b3de12ef..d135c9ed6 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:313:0 +// src/engine/editor.cpp:227:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index bfbeb411e..4d17192e2 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:267:0 +// src/engine/editor.cpp:303:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 9f0c48074..9c43d6c8c 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:295:0 +// src/engine/editor.cpp:209:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index d6310e248..fd5442857 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:372:0 +// src/engine/editor.cpp:375:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index e049e7bf7..797379c8c 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:399:0 +// src/engine/editor.cpp:402:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 34394677b..bd70ac7dd 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:375:0 +// src/engine/editor.cpp:378:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 12df7ada3..87429cf94 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:369:0 +// src/engine/editor.cpp:372:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 6cbf20702..4cc897f19 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:390:0 +// src/engine/editor.cpp:393:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h index ea250b81d..43417c8e2 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:387:0 +// src/engine/editor.cpp:390:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index a61f33983..e4bae68fa 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:325:0 +// src/engine/editor.cpp:239:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index a0cd4b1ec..591fa78b9 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:322:0 +// src/engine/editor.cpp:236:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 4421f7c18..ca18668e1 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:393:0 +// src/engine/editor.cpp:396:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 27dd5b877..2a02a43a7 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:304:0 +// src/engine/editor.cpp:218:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index e8fab5e45..ebc02811a 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:402:0 +// src/engine/editor.cpp:405:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 6ea6df2c7..1e7f399ad 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:221:0 +// src/engine/editor.cpp:257:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 2f52d6b13..65966c37e 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:212:0 +// src/engine/editor.cpp:248:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 0d464e133..62c68af44 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:215:0 +// src/engine/editor.cpp:251:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index d2712c393..db7740af2 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:270:0 +// src/engine/editor.cpp:306:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 1895e52c5..26b604461 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:264:0 +// src/engine/editor.cpp:300:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h new file mode 100644 index 000000000..07cdee1b0 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -0,0 +1,26 @@ +// src/engine/editor.cpp:242:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +{ + if (Container) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + { + PushNewRow(Ui); + IterateOver(Container, Element, ElementIndex) + { + DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushNewRow(Ui); + } + } + PushNewRow(Ui); + } + else + { + PushColumn(Ui, FSz("%S", Name), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushColumn(Ui, CSz("(null)"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushNewRow(Ui); + } +} + diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 14dafeb98..97e3cbf7f 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:261:0 +// src/engine/editor.cpp:297:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index ea466c0cd..cd9a50c3b 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:236:0 +// src/engine/editor.cpp:272:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 5fb9b7b6d..0531cb61b 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:282:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index cd1cef206..733db8fac 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:209:0 +// src/engine/editor.cpp:245:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 2007e36b1..0f4bdb27c 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:519:0 +// src/engine/editor.h:531:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index afa103127..fee9b367d 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:408:0 +// src/engine/editor.cpp:411:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 6973eae0c..e925c7ae1 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:239:0 +// src/engine/editor.cpp:275:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 51a4b244d..fbb6d7607 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:514:0 +// src/engine/editor.h:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index c5719c128..4d67cc731 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:414:0 +// src/engine/editor.cpp:417:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 46cf0e6c8..83019936e 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:417:0 +// src/engine/editor.cpp:420:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index cd91f87ea..789171d73 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:566:0 +// src/engine/editor.h:578:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index a037c34a9..d313173a5 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:723:0 +// src/engine/editor.h:735:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 3e8902646..09fd62349 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:895:0 +// src/engine/editor.h:907:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 1b75ab2a8..aed6f3245 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:729:0 +// src/engine/editor.h:741:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 90ebd3c4c..623653362 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:712:0 +// src/engine/editor.h:724:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 9443775db..600962112 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:741:0 +// src/engine/editor.h:753:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index c83d76d6d..c5eee5daf 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:734:0 +// src/engine/editor.h:746:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index feccca1d9..4650f6fd5 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:738:0 +// src/engine/editor.h:750:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index b2bd1a286..e8c798096 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:389:0 +// src/engine/editor.h:401:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index f5977f198..d120b3f4a 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:501:0 +// src/engine/editor.h:513:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/gen_constructor_voxel_lighting.h b/generated/gen_constructor_voxel_lighting.h index f82f4a5de..9921497ba 100644 --- a/generated/gen_constructor_voxel_lighting.h +++ b/generated/gen_constructor_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:122:0 +// src/engine/world_chunk.h:124:0 link_internal voxel_lighting VoxelLighting( u8 Emission ) diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index ebe3e59de..9776c5540 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:516:0 +// src/engine/world_chunk.h:518:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index 9526125d8..be87bae31 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:513:0 +// src/engine/world_chunk.h:515:0 struct standing_spot_stream_chunk { diff --git a/generated/generate_string_table_world_chunk_mesh_bitfield.h b/generated/generate_string_table_world_chunk_mesh_bitfield.h index 5264178d0..99994fa71 100644 --- a/generated/generate_string_table_world_chunk_mesh_bitfield.h +++ b/generated/generate_string_table_world_chunk_mesh_bitfield.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:214:0 +// src/engine/world_chunk.h:216:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_bitfield Type) diff --git a/generated/generate_string_table_world_chunk_mesh_index.h b/generated/generate_string_table_world_chunk_mesh_index.h index 89fcbae72..ab001223e 100644 --- a/generated/generate_string_table_world_chunk_mesh_index.h +++ b/generated/generate_string_table_world_chunk_mesh_index.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:217:0 +// src/engine/world_chunk.h:219:0 link_internal counted_string ToStringPrefixless(world_chunk_mesh_index Type) diff --git a/generated/hashtable_struct.h b/generated/hashtable_struct.h index e766125d0..bc72dc635 100644 --- a/generated/hashtable_struct.h +++ b/generated/hashtable_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1133:0 +// src/engine/editor.h:1145:0 struct world_edit_brush_linked_list_node { diff --git a/generated/maybe_chunk_data.h b/generated/maybe_chunk_data.h index e470bac98..83be1278f 100644 --- a/generated/maybe_chunk_data.h +++ b/generated/maybe_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:178:0 +// src/engine/world_chunk.h:180:0 struct maybe_chunk_data { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 9849e0d8d..3ac83ec0b 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:480:0 +// src/engine/world_chunk.h:482:0 struct maybe_standing_spot { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 19cede94b..3e05486b3 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:552:0 +// src/engine/editor.h:564:0 link_internal ui_toggle_button_group RadioButtonGroup_level_editor_flags( renderer_2d *Ui, diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 9f7d65558..e6afac61f 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:564:0 +// src/engine/editor.h:576:0 link_internal ui_toggle_button_group RadioButtonGroup_ui_noise_type( renderer_2d *Ui, diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 90921b16d..0077ac70b 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:280:0 +// src/engine/editor.cpp:316:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_chunk_flag.h b/generated/string_and_value_tables_chunk_flag.h index 958007ab9..99c389991 100644 --- a/generated/string_and_value_tables_chunk_flag.h +++ b/generated/string_and_value_tables_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:80:0 +// src/engine/world_chunk.h:82:0 link_internal counted_string ToStringPrefixless(chunk_flag Type) diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 0e042f16f..dea77e714 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:517:0 +// src/engine/editor.h:529:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_enum.h b/generated/string_and_value_tables_enum.h index 4a0c4a23e..2bf89a224 100644 --- a/generated/string_and_value_tables_enum.h +++ b/generated/string_and_value_tables_enum.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:893:0 +// src/engine/editor.h:905:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index 5c2b7b87c..9140815fa 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:512:0 +// src/engine/editor.h:524:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 1e6d8e15c..b2cf67406 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:843:0 +// src/engine/editor.h:855:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 9ae3a64ff..5fdcc72cd 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:562:0 +// src/engine/editor.h:574:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 9656ebf83..bc03a5ad4 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:726:0 +// src/engine/editor.h:738:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index aba2a9652..f1db83222 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:709:0 +// src/engine/editor.h:721:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 86982b676..3969fd7f8 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:732:0 +// src/engine/editor.h:744:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index e4d0ee797..af885bba0 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:596:0 +// src/engine/editor.h:608:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 93636e64b..953eceb8d 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:718:0 +// src/engine/editor.h:730:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 2b01bc3bd..260de9df3 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -176,9 +176,9 @@ void main() xyz.y >= ChunkRelEditMin.y && xyz.z >= ChunkRelEditMin.z && - xyz.x <= ChunkRelEditMax.x && - xyz.y <= ChunkRelEditMax.y && - xyz.z <= ChunkRelEditMax.z ) + xyz.x < ChunkRelEditMax.x && + xyz.y < ChunkRelEditMax.y && + xyz.z < ChunkRelEditMax.z ) { v3 Offset = V3(-1, -1, -1); v3 Basis = Offset + WorldspaceBasis + xyz; diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index 9848a6eab..336a6d6e8 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -532,8 +532,11 @@ DoEngineDebug(engine_resources *Engine) if (ViewMode & EngineDebugViewMode_WorldChunks) { local_persist window_layout WorldChunkWindow = WindowLayout("World Chunks"); - WorldChunkWindow.Title = EngineDebug->PickedChunk ? - FSz("World Chunk : (%p)", EngineDebug->PickedChunk) : + auto *PickedNode = EngineDebug->PickedNode; + auto *PickedChunk = PickedNode ? PickedNode->Chunk : 0; + + WorldChunkWindow.Title = PickedChunk ? + FSz("World Chunk : (%p)", PickedChunk) : CSz("World Chunk"); PushWindowStart(Ui, &WorldChunkWindow); @@ -546,8 +549,6 @@ DoEngineDebug(engine_resources *Engine) if (Button(Ui, CSz("RebuildMesh"), UiId(&WorldChunkWindow, "RebuildMesh WorldChunkWindow", 0ull)) ) { - world_chunk *PickedChunk = EngineDebug->PickedChunk; - /* MarkBoundaryVoxels_Debug(PickedChunk->Voxels, PickedChunk->Dim); */ MakeFaceMasks_NoExteriorFaces(PickedChunk->Occupancy, PickedChunk->xOccupancyBorder, PickedChunk->FaceMasks, PickedChunk->Voxels, PickedChunk->Dim, {}, PickedChunk->Dim); QueueChunkForMeshRebuild(&Plat->LowPriority, PickedChunk); } @@ -557,14 +558,14 @@ DoEngineDebug(engine_resources *Engine) { if (Engine->MousedOverVoxel.Tag) { - EngineDebug->PickedChunk = Engine->MousedOverVoxel.Value.Chunks[PickedVoxel_FirstFilled].Chunk; + EngineDebug->PickedNode = Engine->MousedOverVoxel.Value.Chunks[PickedVoxel_FirstFilled].Node; if (Input->LMB.Clicked) { EngineDebug->PickedChunkState = PickedChunkState_None; } } } - if (EngineDebug->PickedChunk) + if (EngineDebug->PickedNode) { - DoEditorUi(Ui, &WorldChunkWindow, EngineDebug->PickedChunk, CSz("PickedChunk")); + DoEditorUi(Ui, &WorldChunkWindow, EngineDebug->PickedNode, {}); } PushWindowEnd(Ui, &WorldChunkWindow); diff --git a/src/engine/debug.h b/src/engine/debug.h index 5d9229516..52ca45c32 100644 --- a/src/engine/debug.h +++ b/src/engine/debug.h @@ -75,7 +75,7 @@ struct engine_debug r64 ChunkGenCyclesElapsed; u8 PickedChunkState; - world_chunk *PickedChunk; + octree_node *PickedNode; asset_window_view_mode AssetWindowViewMode; diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 0c2e5a8e9..738fafca2 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -206,6 +206,42 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, geo_u3d **ElementP, cs Name, } } +poof(do_editor_ui_for_compound_type(plane)) +#include + +poof(do_editor_ui_for_compound_type(frustum)) +#include + +poof(do_editor_ui_for_compound_type(camera)) +#include + +poof(do_editor_ui_for_compound_type(texture)) +#include + +poof(do_editor_ui_for_compound_type(asset_thumbnail)) +#include + +poof(do_editor_ui_for_compound_type(chunk_thumbnail)) +#include + +poof(do_editor_ui_for_compound_type(noise_layer)) +#include + +poof(do_editor_ui_for_compound_type(brush_layer)) +#include + +poof(do_editor_ui_for_compound_type(layered_brush)) +#include + +poof(do_editor_ui_for_compound_type(world_edit_brush)) +#include + +poof(do_editor_ui_for_compound_type(world_edit)) +#include + +poof(do_editor_ui_for_container(world_edit_ptr_block_array)) +#include + poof(do_editor_ui_for_enum(chunk_flag)) #include @@ -292,39 +328,6 @@ poof(do_editor_ui_for_compound_type(entity_position_info)) #include -poof(do_editor_ui_for_compound_type(plane)) -#include - -poof(do_editor_ui_for_compound_type(frustum)) -#include - -poof(do_editor_ui_for_compound_type(camera)) -#include - -poof(do_editor_ui_for_compound_type(texture)) -#include - -poof(do_editor_ui_for_compound_type(asset_thumbnail)) -#include - -poof(do_editor_ui_for_compound_type(chunk_thumbnail)) -#include - -poof(do_editor_ui_for_compound_type(noise_layer)) -#include - -poof(do_editor_ui_for_compound_type(brush_layer)) -#include - -poof(do_editor_ui_for_compound_type(layered_brush)) -#include - -poof(do_editor_ui_for_compound_type(world_edit_brush)) -#include - -poof(do_editor_ui_for_compound_type(world_edit)) -#include - link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { @@ -2291,7 +2294,16 @@ ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Temp // Gather newly overlapping nodes and add the edit { octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); - GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Edit->Region, &Nodes); + + rect3cp QueryRegion = Edit->Region; + + /* QueryRegion.Min.Offset -= 1.f; */ + /* QueryRegion.Max.Offset += 1.f; */ + + /* Canonicalize(World, &QueryRegion.Min); */ + /* Canonicalize(World, &QueryRegion.Max); */ + + GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &QueryRegion, &Nodes); IterateOver(&Nodes, Node, NodeIndex) { @@ -3150,8 +3162,6 @@ DoLevelWindow(engine_resources *Engine) ApplyEditToOctree(Engine, FinalEdit, GetTranArena()); } - /* ApplyEditBufferToOctree(Engine, &Editor->WorldEdits); */ - Ensure(Read_u64(&LevelBytes) == Delimeter); b32 Error = False; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 081ee83e3..fbadea535 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -526,7 +526,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) /* DrawWorldAndEntitiesToShadowMap(GetShadowMapResolution(&Engine->Settings), Engine); */ // TODO(Jesse): Move into engine debug - DebugHighlightWorldChunkBasedOnState(Graphics, EngineDebug->PickedChunk, &GpuMap->Buffer); + world_chunk *C = EngineDebug->PickedNode ? EngineDebug->PickedNode->Chunk : 0; + DebugHighlightWorldChunkBasedOnState(Graphics, C, &GpuMap->Buffer); AssertNoGlErrors; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 338b4d122..9ffd29a7c 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3827,11 +3827,11 @@ DebugHighlightWorldChunkBasedOnState(graphics *Graphics, world_chunk *Chunk, unt engine_debug *EngineDebug = GetEngineDebug(); if (Chunk) { - Assert (Chunk == EngineDebug->PickedChunk); + Assert (Chunk == EngineDebug->PickedNode->Chunk); v3 RGBColor = EngineDebug->PickedChunkState == PickedChunkState_None ? RGB_GREEN : RGB_YELLOW; untextured_3d_geometry_buffer Mesh = ReserveBufferSpace(Dest, VERTS_PER_AABB); - DEBUG_DrawChunkAABB( &Mesh, Graphics, EngineDebug->PickedChunk, EngineDebug->PickedChunk->Dim, RGBColor ); + DEBUG_DrawChunkAABB( &Mesh, Graphics, EngineDebug->PickedNode->Chunk, Chunk->Dim, RGBColor ); } #endif #if 0 @@ -4093,7 +4093,7 @@ GetStandingSpotsWithinRadius_FilteredByStandable(world *World, canonical_positio link_internal picked_world_chunk GetChunksIntersectingRay(world *World, ray *Ray, picked_world_chunk_static_buffer *AllChunksBuffer) { - world_chunk *ClosestChunk = 0; + octree_node *ClosestNode = 0; chunk_dimension VisibleRegion = World->VisibleRegion; chunk_dimension Radius = VisibleRegion/2; @@ -4122,11 +4122,11 @@ GetChunksIntersectingRay(world *World, ray *Ray, picked_world_chunk_static_buffe { /* DEBUG_DrawSimSpaceAABB(GetEngineResources(), &ChunkAABB, RED); */ r32 tChunk = IntersectResult.t; - if ( AllChunksBuffer ) { Push(AllChunksBuffer, Chunk, tChunk); } + if ( AllChunksBuffer ) { Push(AllChunksBuffer, Node, tChunk); } if (Chunk->FilledCount && tChunk < tChunkMin) { - ClosestChunk = Chunk; + ClosestNode = Node; tChunkMin = tChunk; } } @@ -4136,7 +4136,7 @@ GetChunksIntersectingRay(world *World, ray *Ray, picked_world_chunk_static_buffe } } - return { .Chunk = ClosestChunk, .tChunk = r64(tChunkMin) }; + return { .Node = ClosestNode, .t = r64(tChunkMin) }; } link_internal void @@ -4203,7 +4203,7 @@ GetChunksFromMouseP(engine_resources *Engine, picked_world_chunk_static_buffer * ClosestChunk = GetChunksIntersectingRay(World, &MaybeRay.Ray, AllChunksBuffer); } - return ClosestChunk.Chunk; + return ClosestChunk.Node->Chunk; } link_internal aabb @@ -4314,7 +4314,7 @@ RayTraceCollision(engine_resources *Engine, ray *Ray) { Done = True; - Result.Chunks[PickedVoxel_FirstFilled] = {ClosestChunk, r64(tChunk)}; + Result.Chunks[PickedVoxel_FirstFilled] = {Node, r64(tChunk)}; Result.Picks[PickedVoxel_FirstFilled] = Canonical_Position(AtP, ClosestChunk->WorldP); #if 0 @@ -4330,7 +4330,7 @@ RayTraceCollision(engine_resources *Engine, ray *Ray) } else { - Result.Chunks[PickedVoxel_LastEmpty] = {ClosestChunk, r64(tChunk)}; + Result.Chunks[PickedVoxel_LastEmpty] = {Node, r64(tChunk)}; Result.Picks[PickedVoxel_LastEmpty] = Canonical_Position(AtP, ClosestChunk->WorldP); { /* untextured_3d_geometry_buffer VoxMesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); */ @@ -4424,9 +4424,9 @@ MousePickVoxel(engine_resources *Resources, ray *Ray) UNPACK_ENGINE_RESOURCES(Resources); picked_voxel RayResult = RayTraceCollision(Resources, Ray); - if (world_chunk *ClosestChunk = RayResult.Chunks[PickedVoxel_FirstFilled].Chunk) + if (octree_node *Node = RayResult.Chunks[PickedVoxel_FirstFilled].Node) { - v3 MinP = V3(ClosestChunk->WorldP * World->ChunkDim); + v3 MinP = V3(Node->WorldP * World->ChunkDim); v3 VoxelP = MinP + Truncate(RayResult.Picks[PickedVoxel_FirstFilled].Offset); Result.Tag = Maybe_Yes; @@ -4459,11 +4459,13 @@ GetVoxelPointer(picked_voxel *Pick, picked_voxel_position Pos) { voxel *Result = 0; - if (Pick->Chunks[PickedVoxel_FirstFilled].Chunk) + if (Pick->Chunks[PickedVoxel_FirstFilled].Node) { - world_chunk *Chunk = Pick->Chunks[Pos].Chunk; - s32 Index = GetIndex(V3i(Pick->Picks[Pos].Offset), Chunk->Dim); - Result = Chunk->Voxels + Index; + if (auto *Chunk = Pick->Chunks[Pos].Node->Chunk) + { + s32 Index = GetIndex(V3i(Pick->Picks[Pos].Offset), Chunk->Dim); + Result = Chunk->Voxels + Index; + } } return Result; @@ -4472,8 +4474,11 @@ GetVoxelPointer(picked_voxel *Pick, picked_voxel_position Pos) link_internal v3 GetAbsoluteP(picked_voxel *Pick) { - world_chunk *Chunk = Pick->Chunks[PickedVoxel_FirstFilled].Chunk; - v3 MinP = V3(Chunk->WorldP * Chunk->Dim); + // NOTE(Jesse): Pretty sure this is buggy + NotImplemented; + + auto *Node = Pick->Chunks[PickedVoxel_FirstFilled].Node->Chunk; + v3 MinP = V3(Node->WorldP * Node->Dim); v3 VoxelP = MinP + Truncate(Pick->Picks[PickedVoxel_FirstFilled].Offset); return VoxelP; } diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 54efef1bc..5369317a8 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -2,13 +2,15 @@ struct heap_allocator; struct entity; +struct octree_node; + // NOTE(Jesse): Gets casted to sort_key_f, so Chunk and tChunk ahve to be 1st and second, in that order struct picked_world_chunk { - world_chunk *Chunk; - r64 tChunk; + octree_node *Node; + r64 t; }; enum picked_voxel_position @@ -43,12 +45,12 @@ struct picked_world_chunk_static_buffer }; link_internal void -Push(picked_world_chunk_static_buffer *Buf, world_chunk *Chunk, r32 t) +Push(picked_world_chunk_static_buffer *Buf, octree_node *Node, r32 t) { if (Buf->At < MAX_PICKED_WORLD_CHUNKS) { - Buf->E[Buf->At].Chunk = Chunk; - Buf->E[Buf->At].tChunk = r64(t); + Buf->E[Buf->At].Node = Node; + Buf->E[Buf->At].t = r64(t); ++Buf->At; } From 4c378b36c730128a59fc2af909b2c2b2a7fc8eaa Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 20:31:52 -0700 Subject: [PATCH 193/421] Load all brushes at startup --- src/engine/editor.cpp | 49 ++++++++++++++++++++++++++++------------ src/engine/serialize.cpp | 3 +++ 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 738fafca2..a85cad705 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1,4 +1,23 @@ +link_internal void +LoadBrushFromFile(level_editor *Editor, file_traversal_node *FileNode, memory_arena *TempMemory) +{ + cs Filename = Concat(FileNode->Dir, CSz("/"), FileNode->Name, TempMemory); + + u8_cursor Bytes = BeginDeserialization(Filename, TempMemory); + + world_edit_brush B = {}; + CopyString( FileNode->Name.Start, B.NameBuf, Min(umm(FileNode->Name.Count), umm(NameBuf_Len))); + Editor->CurrentBrush = Upsert(B, &Editor->LoadedBrushes, &Global_PermMemory); + + if (Deserialize(&Bytes, Editor->CurrentBrush, TempMemory) == False) + { + SoftError("While deserializing brush (%S).", Filename); + *Editor->CurrentBrush = {}; + } + FinalizeDeserialization(&Bytes); +} + link_internal b32 InitEditor(level_editor *Editor) { @@ -10,6 +29,13 @@ InitEditor(level_editor *Editor) Editor->LoadedBrushes = Allocate_world_edit_brush_hashtable(128, Editor->Memory); + file_traversal_node_block_array Nodes = GetLexicographicallySortedListOfFilesInDirectory(CSz("brushes"), GetTranArena()); + + IterateOver(&Nodes, Node, NodeIndex) + { + LoadBrushFromFile(Editor, Node, GetTranArena()); + } + /* RangeIterator(LayerIndex, MAX_BRUSH_LAYERS) */ /* { */ /* Editor->LayeredBrush.LayerPreviews[LayerIndex].Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); */ @@ -1524,21 +1550,7 @@ DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, win if (ClickedFileNode.Tag) { - cs Filename = Concat(ClickedFileNode.Value.Dir, CSz("/"), ClickedFileNode.Value.Name, Tran); - - u8_cursor Bytes = BeginDeserialization(Filename, Tran); - - world_edit_brush B = {}; - CopyString( ClickedFileNode.Value.Name.Start, B.NameBuf, Min(umm(ClickedFileNode.Value.Name.Count), umm(NameBuf_Len))); - Editor->CurrentBrush = Upsert(B, &Editor->LoadedBrushes, &Global_PermMemory); - - if (Deserialize(&Bytes, Editor->CurrentBrush, Tran) == False) - { - SoftError("While deserializing brush (%S).", Filename); - *Editor->CurrentBrush = {}; - } - FinalizeDeserialization(&Bytes); - + LoadBrushFromFile(Editor, &ClickedFileNode.Value, Tran); SetToggleButton(Ui, ImportToggleId, False); } } @@ -3142,7 +3154,14 @@ DoLevelWindow(engine_resources *Engine) // Must come after we fill out the VisibleRegion so the root octree node // gets initialized to the correct size + // + // + // HACK(Jesse): This is a maaaajor hack and should be dealt with in a better way + bonsai_type_info_hashtable Tmp = Global_SerializeTypeTable; + Global_SerializeTypeTable = {}; HardResetEngine(Engine); + Global_SerializeTypeTable = Tmp; + /* s32 ChunkCount = Cast(s32, LevelHeader.ChunkCount); */ s32 ChunkCount = 0; diff --git a/src/engine/serialize.cpp b/src/engine/serialize.cpp index ac9ffc034..9441b0ecc 100644 --- a/src/engine/serialize.cpp +++ b/src/engine/serialize.cpp @@ -98,6 +98,9 @@ BeginDeserialization(cs Filename, memory_arena *TempMemory) { bonsai_type_info_buffer TypeInfoBuffer = {}; Deserialize(&LevelBytes, &TypeInfoBuffer, Global_SerializeTypeTableArena); + + Assert(Global_SerializeTypeTable.Size == 0); + Assert(Global_SerializeTypeTable.Elements == 0); Global_SerializeTypeTable = Allocate_bonsai_type_info_hashtable(NextPowerOfTwo(TypeInfoBuffer.Count), Global_SerializeTypeTableArena); IterateOver(&TypeInfoBuffer, TypeInfo, TypeInfoIndex) From bc5c244fd382883aa931db091866fc4c5e166937 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 20:40:45 -0700 Subject: [PATCH 194/421] Fix boundary case in world_edit shader --- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- .../block_array_c_asset_thumbnail_688856411.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- .../do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...ditor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...o_editor_ui_for_compound_type_bonsai_futex.h | 2 +- ..._editor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ...do_editor_ui_for_compound_type_brush_layer.h | 2 +- ...editor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- .../do_editor_ui_for_compound_type_chunk_data.h | 2 +- ...ditor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...ditor_ui_for_compound_type_collision_event.h | 2 +- ...do_editor_ui_for_compound_type_debug_state.h | 2 +- ...o_editor_ui_for_compound_type_engine_debug.h | 2 +- ...itor_ui_for_compound_type_engine_resources.h | 2 +- ...ditor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- .../do_editor_ui_for_compound_type_entity_id.h | 2 +- ..._ui_for_compound_type_entity_position_info.h | 2 +- ...r_ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ...ui_for_compound_type_g_buffer_render_group.h | 2 +- ...do_editor_ui_for_compound_type_game_lights.h | 2 +- ...r_compound_type_gpu_element_buffer_handles.h | 2 +- ...or_compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...tor_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ...do_editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ..._editor_ui_for_compound_type_layered_brush.h | 2 +- ...o_editor_ui_for_compound_type_level_editor.h | 2 +- ...ui_for_compound_type_lighting_render_group.h | 2 +- ...tor_ui_for_compound_type_lighting_settings.h | 2 +- ...or_ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ...do_editor_ui_for_compound_type_noise_layer.h | 2 +- ...do_editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...ditor_ui_for_compound_type_particle_system.h | 2 +- ...r_ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ..._editor_ui_for_compound_type_random_series.h | 2 +- ...tor_ui_for_compound_type_render_buffers_2d.h | 2 +- ...o_editor_ui_for_compound_type_render_debug.h | 2 +- ...ditor_ui_for_compound_type_render_settings.h | 2 +- ...do_editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ...do_editor_ui_for_compound_type_shape_layer.h | 2 +- ...ype_struct_terrain_finalize_render_context.h | 2 +- ...und_type_struct_terrain_gen_render_context.h | 2 +- ...tor_ui_for_compound_type_struct_world_edit.h | 2 +- ..._for_compound_type_struct_world_edit_brush.h | 2 +- ...ound_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- .../do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...ompound_type_untextured_3d_geometry_buffer.h | 2 +- ...ditor_ui_for_compound_type_vertex_material.h | 2 +- ..._ui_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...editor_ui_for_compound_type_voxel_lighting.h | 2 +- ...or_ui_for_compound_type_white_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_work_queue.h | 2 +- ...itor_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ...do_editor_ui_for_compound_type_world_chunk.h | 2 +- ...ui_for_compound_type_world_edit_paged_list.h | 2 +- ...und_type_world_update_op_shape_params_rect.h | 2 +- ...d_type_world_update_op_shape_params_sphere.h | 2 +- ...or_ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ...ditor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- ..._editor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...o_editor_ui_for_enum_entity_behavior_flags.h | 2 +- generated/do_editor_ui_for_enum_entity_state.h | 2 +- .../do_editor_ui_for_enum_file_traversal_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- .../do_editor_ui_for_enum_particle_spawn_type.h | 2 +- .../do_editor_ui_for_enum_resolution_setting.h | 2 +- ...editor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- generated/do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...r_ui_for_radio_enum_asset_window_view_mode.h | 2 +- ..._editor_ui_for_radio_enum_brush_layer_type.h | 2 +- ...or_ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ..._radio_enum_world_edit_blend_mode_modifier.h | 2 +- ...or_ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...for_radio_enum_world_edit_color_blend_mode.h | 2 +- ...o_editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/hashtable_struct.h | 2 +- ...group_for_bitfield_enum_level_editor_flags.h | 2 +- ...tton_group_for_bitfield_enum_ui_noise_type.h | 2 +- generated/string_and_value_tables_asset_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- ...ng_and_value_tables_engine_debug_view_mode.h | 2 +- generated/string_and_value_tables_enum.h | 2 +- ...tring_and_value_tables_file_traversal_node.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- ...tring_and_value_tables_particle_spawn_type.h | 2 +- generated/string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_tone_mapping_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...ing_and_value_tables_world_edit_blend_mode.h | 2 +- ...alue_tables_world_edit_blend_mode_modifier.h | 2 +- ...d_value_tables_world_edit_color_blend_mode.h | 2 +- ...and_value_tables_world_edit_selection_mode.h | 2 +- ...tton_group_for_enum_engine_debug_view_mode.h | 2 +- shaders/terrain/world_edit.fragmentshader | 17 +++++++++-------- 131 files changed, 139 insertions(+), 138 deletions(-) diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 2c67def3b..6b182478c 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:965:0 +// src/engine/editor.h:953:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 8badc234e..9f7db738c 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:707:0 +// src/engine/editor.h:695:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index fdb664716..e4f9274bf 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1142:0 +// src/engine/editor.h:1130:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index eb5e4c89d..9afa022d3 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:47:0 +// src/engine/editor.cpp:73:0 diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index a196caed3..9c1d79122 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:543:0 +// src/engine/editor.h:531:0 diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index 30f6777db..0b96eb1d7 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1157:0 +// src/engine/editor.h:1145:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 7e570ac3f..c709dc4de 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1159:0 +// src/engine/editor.h:1147:0 diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index e21d8084c..9221abeac 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1030:0 +// src/engine/editor.h:1018:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index 8a7a5dc08..0e401c338 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1023:0 +// src/engine/editor.h:1011:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index b66ea99af..b0f526148 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1016:0 +// src/engine/editor.h:1004:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index d93c22c51..4a9d44135 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:891:0 +// src/engine/editor.h:879:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 1f8537464..6a30963a1 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:182:0 +// src/engine/editor.cpp:208:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 1dbd4354d..14d582d41 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:321:0 +// src/engine/editor.cpp:347:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index e34c9c8d8..3e3818877 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:313:0 +// src/engine/editor.cpp:339:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 128909dfb..45d5736b9 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:221:0 +// src/engine/editor.cpp:247:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 3b30913b9..f6e01883d 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:188:0 +// src/engine/editor.cpp:214:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index fae2ad551..b39e21176 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:121:0 +// src/engine/editor.cpp:147:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 3cba3997a..ce199a2ec 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:230:0 +// src/engine/editor.cpp:256:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index ae00ad436..0a8c4206c 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:76:0 +// src/engine/editor.cpp:102:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index b23aa5a38..4e64b6194 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:215:0 +// src/engine/editor.cpp:241:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index b4d05aaad..47fa73f80 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:254:0 +// src/engine/editor.cpp:280:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index a7609a0a9..d10b21a0b 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:224:0 +// src/engine/editor.cpp:250:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index e0cdd03c7..ead7a839d 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:324:0 +// src/engine/editor.cpp:350:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index f9647e9a1..876517616 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:117:0 +// src/engine/editor.cpp:143:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 32621bf82..db2125971 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:408:0 +// src/engine/editor.cpp:434:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 08100d966..0e9428f5c 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:429:0 +// src/engine/editor.cpp:455:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index d1bc452d1..f9094fc0c 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:426:0 +// src/engine/editor.cpp:452:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index a5aadde32..a92b2e403 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:293:0 +// src/engine/editor.cpp:319:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 4faae65c4..4e41c683e 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:290:0 +// src/engine/editor.cpp:316:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index f8cbcfcda..049dbb1e9 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:327:0 +// src/engine/editor.cpp:353:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 19e5c5d62..920b70e33 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:278:0 +// src/engine/editor.cpp:304:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 0b2ed5b3d..017567420 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:212:0 +// src/engine/editor.cpp:238:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 9a96a29a7..b93dc45c0 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:387:0 +// src/engine/editor.cpp:413:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 1c7e839d7..ed1e7b414 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:381:0 +// src/engine/editor.cpp:407:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index f426f5367..9c697e0d7 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:260:0 +// src/engine/editor.cpp:286:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 3cca3b3ac..acb09a006 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:263:0 +// src/engine/editor.cpp:289:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index b024a2f32..fcf40608c 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:399:0 +// src/engine/editor.cpp:425:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 9cc371890..a1ad38829 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:423:0 +// src/engine/editor.cpp:449:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 8515970a5..122ff2a36 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:110:0 +// src/engine/editor.cpp:136:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index f1d0b3e4d..8340362e2 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:107:0 +// src/engine/editor.cpp:133:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 6425b4adb..3dedf8092 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:179:0 +// src/engine/editor.cpp:205:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 22d0b3b64..3e4f6d44d 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:233:0 +// src/engine/editor.cpp:259:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 67fdcf16d..0e4915afa 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:414:0 +// src/engine/editor.cpp:440:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index bca99780a..ab164f863 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:384:0 +// src/engine/editor.cpp:410:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 139ac40e7..231753fa2 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:158:0 +// src/engine/editor.cpp:184:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index b4f4a9404..46f8bc000 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:266:0 +// src/engine/editor.cpp:292:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index ad5ae6c02..dd8d25e65 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:269:0 +// src/engine/editor.cpp:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index d135c9ed6..af1ed625f 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:227:0 +// src/engine/editor.cpp:253:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 4d17192e2..8991dd738 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:303:0 +// src/engine/editor.cpp:329:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 9255b96bb..5c78a738a 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:173:0 +// src/engine/editor.cpp:199:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index e4dc1a8d4..37f441dee 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:176:0 +// src/engine/editor.cpp:202:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index e87e9c4bb..633b71aff 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:62:0 +// src/engine/editor.cpp:88:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 6f139a8ef..2d4790613 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:164:0 +// src/engine/editor.cpp:190:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 9c43d6c8c..f825f3a51 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:209:0 +// src/engine/editor.cpp:235:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 0257596e7..a1d9bbd49 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:113:0 +// src/engine/editor.cpp:139:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index de7931aa2..a8fa1e2cf 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:167:0 +// src/engine/editor.cpp:193:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index fd5442857..1985130de 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:375:0 +// src/engine/editor.cpp:401:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 797379c8c..dda6b09fe 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:402:0 +// src/engine/editor.cpp:428:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 82985eb19..3992ef5ea 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:161:0 +// src/engine/editor.cpp:187:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index bd70ac7dd..302ffadaf 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:378:0 +// src/engine/editor.cpp:404:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 87429cf94..9402cfc77 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:372:0 +// src/engine/editor.cpp:398:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 5a2588c9f..14ab3861a 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:74:0 +// src/engine/editor.cpp:100:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 4cc897f19..15c61065a 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:393:0 +// src/engine/editor.cpp:419:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h index 43417c8e2..8091c3679 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:390:0 +// src/engine/editor.cpp:416:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index e4bae68fa..f6f2b91f0 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:239:0 +// src/engine/editor.cpp:265:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 591fa78b9..ff00d030c 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:236:0 +// src/engine/editor.cpp:262:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index ca18668e1..1e80ac972 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:396:0 +// src/engine/editor.cpp:422:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 2a02a43a7..85fb8a7d3 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:218:0 +// src/engine/editor.cpp:244:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index ebc02811a..f126e43d3 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:405:0 +// src/engine/editor.cpp:431:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 04543707d..98ae3e70e 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:83:0 +// src/engine/editor.cpp:109:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index e35928cec..f24a41f6f 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:86:0 +// src/engine/editor.cpp:112:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index d2327d2fe..8f9c39f67 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:191:0 +// src/engine/editor.cpp:217:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 45d70f699..8bc6f3d77 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:185:0 +// src/engine/editor.cpp:211:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 00cce66c7..bb6fefd6d 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:65:0 +// src/engine/editor.cpp:91:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 1e7f399ad..9bb88d302 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:257:0 +// src/engine/editor.cpp:283:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 65966c37e..a92a42261 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:248:0 +// src/engine/editor.cpp:274:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 62c68af44..e1b4bbbf5 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:251:0 +// src/engine/editor.cpp:277:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 323a425cf..429d2a87b 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:59:0 +// src/engine/editor.cpp:85:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index e1919b1f7..ba29a0467 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:104:0 +// src/engine/editor.cpp:130:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 564d880cb..739d92ce8 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:101:0 +// src/engine/editor.cpp:127:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index db7740af2..e55afd9b1 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:306:0 +// src/engine/editor.cpp:332:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 26b604461..48bbcc467 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:300:0 +// src/engine/editor.cpp:326:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index 07cdee1b0..667a655e8 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:242:0 +// src/engine/editor.cpp:268:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 9784eb11f..95e438f55 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:70:0 +// src/engine/editor.cpp:96:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 85c4cfa4b..0b9f7b21b 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:68:0 +// src/engine/editor.cpp:94:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 97e3cbf7f..2c813c929 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:297:0 +// src/engine/editor.cpp:323:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index cd9a50c3b..6d38272cf 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:272:0 +// src/engine/editor.cpp:298:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 144d2f535..4d62eada7 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:95:0 +// src/engine/editor.cpp:121:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 94c2d7a00..61887d033 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:80:0 +// src/engine/editor.cpp:106:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 0531cb61b..fc122eefd 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:344:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 733db8fac..a107f0b81 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:245:0 +// src/engine/editor.cpp:271:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 0f4bdb27c..2007e36b1 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:531:0 +// src/engine/editor.h:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index fee9b367d..ced15ad1d 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:411:0 +// src/engine/editor.cpp:437:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 485fa9a5a..e139e1e70 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:149:0 +// src/engine/editor.cpp:175:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 91822e91a..29269dbc5 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:146:0 +// src/engine/editor.cpp:172:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index e925c7ae1..e8a5b2c72 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:275:0 +// src/engine/editor.cpp:301:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index fbb6d7607..51a4b244d 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:526:0 +// src/engine/editor.h:514:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 01b2dd96a..491ad0313 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:170:0 +// src/engine/editor.cpp:196:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 4d67cc731..43f3f8461 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:417:0 +// src/engine/editor.cpp:443:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 83019936e..d2063d1c1 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:420:0 +// src/engine/editor.cpp:446:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index ae5b3a21f..8ae189212 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:72:0 +// src/engine/editor.cpp:98:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 2317cdbad..935b86073 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:152:0 +// src/engine/editor.cpp:178:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 789171d73..cd91f87ea 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:578:0 +// src/engine/editor.h:566:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index d313173a5..a037c34a9 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:735:0 +// src/engine/editor.h:723:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 09fd62349..3e8902646 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:907:0 +// src/engine/editor.h:895:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index aed6f3245..1b75ab2a8 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:741:0 +// src/engine/editor.h:729:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 623653362..90ebd3c4c 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:724:0 +// src/engine/editor.h:712:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 600962112..9443775db 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:753:0 +// src/engine/editor.h:741:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index c5eee5daf..c83d76d6d 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:746:0 +// src/engine/editor.h:734:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 4650f6fd5..feccca1d9 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:750:0 +// src/engine/editor.h:738:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index e8c798096..b2bd1a286 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:401:0 +// src/engine/editor.h:389:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index d120b3f4a..f5977f198 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:513:0 +// src/engine/editor.h:501:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/hashtable_struct.h b/generated/hashtable_struct.h index bc72dc635..e766125d0 100644 --- a/generated/hashtable_struct.h +++ b/generated/hashtable_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1145:0 +// src/engine/editor.h:1133:0 struct world_edit_brush_linked_list_node { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 3e05486b3..19cede94b 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:564:0 +// src/engine/editor.h:552:0 link_internal ui_toggle_button_group RadioButtonGroup_level_editor_flags( renderer_2d *Ui, diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index e6afac61f..9f7d65558 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:576:0 +// src/engine/editor.h:564:0 link_internal ui_toggle_button_group RadioButtonGroup_ui_noise_type( renderer_2d *Ui, diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 0077ac70b..8b785d7b9 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:316:0 +// src/engine/editor.cpp:342:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index dea77e714..0e042f16f 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:529:0 +// src/engine/editor.h:517:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 5f586b19f..c431efb9d 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:142:0 +// src/engine/editor.cpp:168:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_enum.h b/generated/string_and_value_tables_enum.h index 2bf89a224..4a0c4a23e 100644 --- a/generated/string_and_value_tables_enum.h +++ b/generated/string_and_value_tables_enum.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:905:0 +// src/engine/editor.h:893:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 118ef4138..bbe39b9cd 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:136:0 +// src/engine/editor.cpp:162:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index 9140815fa..5c2b7b87c 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:524:0 +// src/engine/editor.h:512:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index e85850146..8597b8149 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:133:0 +// src/engine/editor.cpp:159:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index b2cf67406..1e6d8e15c 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:855:0 +// src/engine/editor.h:843:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index f365ed3d4..50f55ee96 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:139:0 +// src/engine/editor.cpp:165:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 5fdcc72cd..9ae3a64ff 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:574:0 +// src/engine/editor.h:562:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index bc03a5ad4..9656ebf83 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:738:0 +// src/engine/editor.h:726:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index f1db83222..aba2a9652 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:721:0 +// src/engine/editor.h:709:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 3969fd7f8..86982b676 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:744:0 +// src/engine/editor.h:732:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index af885bba0..e4d0ee797 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:608:0 +// src/engine/editor.h:596:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 953eceb8d..93636e64b 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:730:0 +// src/engine/editor.h:718:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 260de9df3..28e0c7479 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -171,17 +171,18 @@ void main() v3 xyz = V3(x,y,z) * ChunkResolution; + // TODO(Jesse): I have no idea why this works out to > Min and <= Max. I + // think it should be >= Min and < Max .. but I'm just going to leave it for now.. if ( - xyz.x >= ChunkRelEditMin.x && - xyz.y >= ChunkRelEditMin.y && - xyz.z >= ChunkRelEditMin.z && + xyz.x > ChunkRelEditMin.x && + xyz.y > ChunkRelEditMin.y && + xyz.z > ChunkRelEditMin.z && - xyz.x < ChunkRelEditMax.x && - xyz.y < ChunkRelEditMax.y && - xyz.z < ChunkRelEditMax.z ) + xyz.x <= ChunkRelEditMax.x && + xyz.y <= ChunkRelEditMax.y && + xyz.z <= ChunkRelEditMax.z ) { - v3 Offset = V3(-1, -1, -1); - v3 Basis = Offset + WorldspaceBasis + xyz; + v3 Basis = WorldspaceBasis + xyz; { From b995c8ffdf2d1513783e9466cf6d337556c323cd Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 21:22:29 -0700 Subject: [PATCH 195/421] Add @ui_display_as tag and display world_edit_brush::NameBuf as a CS --- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 23 ++- .../do_editor_ui_for_compound_type_asset.h | 12 +- .../do_editor_ui_for_compound_type_asset_id.h | 5 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 5 +- ...editor_ui_for_compound_type_bonsai_futex.h | 9 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 17 +- ..._editor_ui_for_compound_type_brush_layer.h | 3 +- ...itor_ui_for_compound_type_brush_settings.h | 33 ++- .../do_editor_ui_for_compound_type_camera.h | 47 +++-- ...o_editor_ui_for_compound_type_chunk_data.h | 20 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 5 +- ...tor_ui_for_compound_type_collision_event.h | 11 +- ..._editor_ui_for_compound_type_debug_state.h | 77 ++++--- ...editor_ui_for_compound_type_engine_debug.h | 83 +++++--- ...or_ui_for_compound_type_engine_resources.h | 77 ++++--- ...tor_ui_for_compound_type_engine_settings.h | 3 +- .../do_editor_ui_for_compound_type_entity.h | 48 +++-- ...do_editor_ui_for_compound_type_entity_id.h | 6 +- ...i_for_compound_type_entity_position_info.h | 11 +- ...ui_for_compound_type_file_traversal_node.h | 9 +- .../do_editor_ui_for_compound_type_frustum.h | 23 ++- ..._for_compound_type_g_buffer_render_group.h | 21 +- ..._editor_ui_for_compound_type_game_lights.h | 14 +- ...compound_type_gpu_element_buffer_handles.h | 24 ++- ..._compound_type_gpu_mapped_element_buffer.h | 5 +- .../do_editor_ui_for_compound_type_graphics.h | 98 ++++++--- ...r_ui_for_compound_type_graphics_settings.h | 14 +- .../do_editor_ui_for_compound_type_input.h | 192 ++++++++++++------ ..._editor_ui_for_compound_type_input_event.h | 6 +- .../do_editor_ui_for_compound_type_keyframe.h | 6 +- ...ditor_ui_for_compound_type_layered_brush.h | 17 +- ...editor_ui_for_compound_type_level_editor.h | 59 ++++-- ..._for_compound_type_lighting_render_group.h | 14 +- ...r_ui_for_compound_type_lighting_settings.h | 32 ++- ..._ui_for_compound_type_lod_element_buffer.h | 11 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 7 +- .../do_editor_ui_for_compound_type_model.h | 17 +- ..._editor_ui_for_compound_type_noise_layer.h | 11 +- ..._editor_ui_for_compound_type_octree_node.h | 29 ++- .../do_editor_ui_for_compound_type_particle.h | 15 +- ...tor_ui_for_compound_type_particle_system.h | 68 ++++--- ...ui_for_compound_type_perlin_noise_params.h | 9 +- .../do_editor_ui_for_compound_type_physics.h | 15 +- .../do_editor_ui_for_compound_type_plane.h | 9 +- .../do_editor_ui_for_compound_type_platform.h | 50 +++-- ...ditor_ui_for_compound_type_random_series.h | 3 +- .../do_editor_ui_for_compound_type_ray.h | 7 +- .../do_editor_ui_for_compound_type_rect3.h | 7 +- .../do_editor_ui_for_compound_type_rect3cp.h | 7 +- .../do_editor_ui_for_compound_type_rect3i.h | 7 +- ...r_ui_for_compound_type_render_buffers_2d.h | 23 ++- ...editor_ui_for_compound_type_render_debug.h | 12 +- ...tor_ui_for_compound_type_render_settings.h | 56 +++-- ..._editor_ui_for_compound_type_renderer_2d.h | 77 ++++--- .../do_editor_ui_for_compound_type_shader.h | 21 +- ..._editor_ui_for_compound_type_shape_layer.h | 8 +- ...e_struct_terrain_finalize_render_context.h | 14 +- ...d_type_struct_terrain_gen_render_context.h | 20 +- ...r_ui_for_compound_type_struct_world_edit.h | 9 +- ...or_compound_type_struct_world_edit_brush.h | 23 +-- ...nd_type_struct_world_edit_render_context.h | 24 ++- .../do_editor_ui_for_compound_type_texture.h | 24 ++- .../do_editor_ui_for_compound_type_ui_debug.h | 18 +- .../do_editor_ui_for_compound_type_ui_id.h | 12 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 6 +- ...pound_type_untextured_3d_geometry_buffer.h | 27 ++- ...tor_ui_for_compound_type_vertex_material.h | 9 +- ...i_for_compound_type_voronoi_noise_params.h | 15 +- .../do_editor_ui_for_compound_type_vox_data.h | 3 +- .../do_editor_ui_for_compound_type_voxel.h | 6 +- ...itor_ui_for_compound_type_voxel_lighting.h | 3 +- ..._ui_for_compound_type_white_noise_params.h | 3 +- ...o_editor_ui_for_compound_type_work_queue.h | 11 +- ...or_ui_for_compound_type_work_queue_entry.h | 3 +- .../do_editor_ui_for_compound_type_world.h | 21 +- ..._editor_ui_for_compound_type_world_chunk.h | 63 ++++-- ...d_type_world_update_op_shape_params_rect.h | 3 +- ...type_world_update_op_shape_params_sphere.h | 6 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/hashtable_struct.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- generated/string_and_value_tables_enum.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- src/engine/editor.h | 107 +++++----- 114 files changed, 1283 insertions(+), 715 deletions(-) diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 6b182478c..ee31cde82 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:953:0 +// src/engine/editor.h:960:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 9f7db738c..1498be2a0 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:695:0 +// src/engine/editor.h:702:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index e4f9274bf..d660cb2a6 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1130:0 +// src/engine/editor.h:1137:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 9c1d79122..696c80ffd 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:531:0 +// src/engine/editor.h:538:0 diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index 0b96eb1d7..c5661862b 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1145:0 +// src/engine/editor.h:1152:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index c709dc4de..1a9ea21de 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1147:0 +// src/engine/editor.h:1154:0 diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 9221abeac..530338b89 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1018:0 +// src/engine/editor.h:1025:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index 0e401c338..c51a359d9 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1011:0 +// src/engine/editor.h:1018:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index b0f526148..a754ef821 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1004:0 +// src/engine/editor.h:1011:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 4a9d44135..b77443af4 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:879:0 +// src/engine/editor.h:886:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 6a30963a1..e4c1f0899 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->t), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->tEnd), @@ -56,9 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->xKeyframeCount), @@ -72,9 +74,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(keyframe*, Element->xKeyframes), @@ -88,8 +91,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->yKeyframeCount), @@ -103,9 +107,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(keyframe*, Element->yKeyframes), @@ -119,8 +124,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->zKeyframeCount), @@ -134,9 +140,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(keyframe*, Element->zKeyframes), diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 14d582d41..12a53e584 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(asset_load_state*, &Element->LoadState), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(asset_id*, &Element->Id), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->LRUFrameIndex), @@ -70,9 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(asset_type*, &Element->Type), @@ -86,6 +89,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 3e3818877..4f27cf012 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u16*, &Element->Index), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(file_traversal_node*, &Element->FileNode), diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 45d5736b9..1a74cb6eb 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->Texture), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(camera*, &Element->Camera), diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index f6e01883d..a7a8ee61e 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->SignalValue), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ThreadsWaiting), @@ -56,9 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->Initialized), CSz("Initialized"), @@ -69,6 +71,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index b39e21176..b7e72a9ff 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(os*, &Element->Os), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(platform*, &Element->Plat), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(thread_local_state*, Element->ThreadStates), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture_block_array*, &Element->AllTextures), @@ -85,8 +88,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shader_ptr_block_array*, &Element->AllShaders), @@ -100,8 +104,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(debug_state*, &Element->DebugState), diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index ce199a2ec..eced7245c 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(brush_settings*, &Element->Settings), @@ -40,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 0a8c4206c..02c594cd3 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(brush_layer_type*, &Element->Type), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(noise_layer*, &Element->Noise), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shape_layer*, &Element->Shape), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_blend_mode*, &Element->Mode), @@ -85,8 +88,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_blend_mode_modifier*, &Element->Modifier), @@ -100,8 +104,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_color_blend_mode*, &Element->ColorMode), @@ -115,8 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->Iterations), @@ -130,9 +136,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(rect3i*, &Element->Offset), @@ -146,8 +153,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->NoiseBasisOffset), @@ -161,8 +169,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->HSVColor), @@ -176,8 +185,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->Invert), @@ -191,6 +201,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 4e64b6194..ab50659d8 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(frustum*, &Element->Frust), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->CurrentP), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->RenderSpacePosition), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Pitch), @@ -85,9 +88,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Roll), @@ -101,9 +105,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Yaw), @@ -117,9 +122,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->DistanceFromTarget), @@ -133,9 +139,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->TargetPitch), @@ -149,9 +156,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->TargetRoll), @@ -165,9 +173,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->TargetYaw), @@ -181,9 +190,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->TargetDistanceFromTarget), @@ -197,9 +207,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Blend), @@ -213,9 +224,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Front), @@ -229,8 +241,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Right), @@ -244,8 +257,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Up), @@ -259,8 +273,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(entity_id*, &Element->GhostId), diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 47fa73f80..18fcd2690 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(chunk_flag*, &Element->Flags), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Dim), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->Occupancy), @@ -70,9 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->xOccupancyBorder), @@ -86,9 +89,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->FaceMasks), @@ -102,9 +106,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(voxel*, Element->Voxels), @@ -118,8 +123,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(voxel_lighting*, Element->VoxelLighting), diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index d10b21a0b..c40f955ef 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_chunk*, &Element->Chunk), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(asset_thumbnail*, &Element->Thumbnail), diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index ead7a839d..eef58fd41 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->FrameIndex), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Count), @@ -56,9 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->MinP), @@ -72,8 +74,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->MaxP), diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 876517616..36cd32798 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->Initialized), CSz("Initialized"), @@ -37,9 +37,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->UIType), @@ -53,9 +54,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->BytesBufferedToCard), @@ -69,9 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->DebugDoScopeProfiling), CSz("DebugDoScopeProfiling"), @@ -82,9 +85,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->NumScopes), @@ -98,9 +102,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->DrawCallCountLastFrame), @@ -114,9 +119,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->VertexCountLastFrame), @@ -130,9 +136,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(picked_world_chunk*, Element->PickedChunk), @@ -146,8 +153,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(picked_world_chunk*, Element->HoverChunk), @@ -161,8 +169,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(debug_thread_state*, Element->ThreadStates), @@ -176,8 +185,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->MetaTableNameStringsArena), @@ -191,8 +201,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(renderer_2d*, Element->UiGroup), @@ -206,8 +217,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(untextured_3d_geometry_buffer*, &Element->LineMesh), @@ -221,8 +233,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(selected_arenas*, Element->SelectedArenas), @@ -236,8 +249,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->DisplayDebugMenu), CSz("DisplayDebugMenu"), @@ -248,9 +262,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(debug_profile_scope*, Element->HotFunction), @@ -264,8 +279,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64_cursor*, &Element->HistogramSamples), @@ -279,8 +295,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(bonsai_futex*, &Element->HistogramFutex), @@ -294,8 +311,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(debug_profile_scope*, &Element->FreeScopeSentinel), @@ -309,8 +327,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(umm*, &Element->MinCycles), @@ -324,9 +343,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(umm*, &Element->MaxCycles), @@ -340,9 +360,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v Frames[(128)]"), CSz("> Frames[(128)]"), UiId(Window, "toggle debug_state frame_stats Frames", Element->Frames), Params )) + if (ToggleButton(Ui, CSz("v Frames[(128)]"), CSz("> Frames[(128)]"), UiId(Window, "toggle debug_state frame_stats Frames", Element->Frames), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -358,8 +379,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ReadScopeIndex), @@ -373,9 +395,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->FreeScopeCount), @@ -389,9 +412,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v RegisteredMemoryArenas[(1024)]"), CSz("> RegisteredMemoryArenas[(1024)]"), UiId(Window, "toggle debug_state registered_memory_arena RegisteredMemoryArenas", Element->RegisteredMemoryArenas), Params )) + if (ToggleButton(Ui, CSz("v RegisteredMemoryArenas[(1024)]"), CSz("> RegisteredMemoryArenas[(1024)]"), UiId(Window, "toggle debug_state registered_memory_arena RegisteredMemoryArenas", Element->RegisteredMemoryArenas), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -407,8 +431,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + - if (ToggleButton(Ui, CSz("v TrackedDrawCalls[(4096)]"), CSz("> TrackedDrawCalls[(4096)]"), UiId(Window, "toggle debug_state debug_draw_call TrackedDrawCalls", Element->TrackedDrawCalls), Params )) + if (ToggleButton(Ui, CSz("v TrackedDrawCalls[(4096)]"), CSz("> TrackedDrawCalls[(4096)]"), UiId(Window, "toggle debug_state debug_draw_call TrackedDrawCalls", Element->TrackedDrawCalls), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index db2125971..5744d0e25 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->Memory), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(engine_debug_view_mode*, &Element->ViewMode), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(picked_world_chunk_static_buffer*, &Element->PickedChunks), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture_ptr_block_array*, &Element->Textures), @@ -85,8 +88,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(ui_debug*, &Element->UiDebug), @@ -100,8 +104,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(render_debug*, &Element->Render), @@ -115,8 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawEntityCollisionVolumes), @@ -130,9 +136,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawWorldAxies), @@ -146,9 +153,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->TriggerRuntimeBreak), @@ -162,9 +170,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->ResetAssetNodeView), @@ -178,9 +187,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawBranchNodesWithMeshes), @@ -194,9 +204,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawBranchNodes), @@ -210,9 +221,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawLeafNodes), @@ -226,9 +238,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawNodesWithChunks), @@ -242,9 +255,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawQueuedNodes), @@ -258,9 +272,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->MarkChunkBorderVoxels), @@ -274,9 +289,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawGameCameraLocation), @@ -290,9 +306,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r64*, &Element->ChunkGenTimeElapsedMS), @@ -306,9 +323,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->CellsGenerated), @@ -322,9 +340,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r64*, &Element->ChunkGenCyclesElapsed), @@ -338,9 +357,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u8*, &Element->PickedChunkState), @@ -354,9 +374,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(octree_node*, Element->PickedNode), @@ -370,8 +391,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(asset_window_view_mode*, &Element->AssetWindowViewMode), @@ -385,8 +407,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(asset_id*, &Element->SelectedAsset), @@ -400,8 +423,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->ModelIndex), @@ -415,9 +439,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(entity_id*, &Element->SelectedEntity), @@ -431,8 +456,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->OctreeDrawDepth), @@ -446,9 +472,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(octree_node*, Element->SelectedNode), diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 0e9428f5c..19f4344c9 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(engine_settings*, &Element->Settings), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(bonsai_stdlib*, &Element->Stdlib), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(renderer_2d*, &Element->Ui), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(application_api*, &Element->GameApi), @@ -85,8 +88,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(hotkeys*, &Element->Hotkeys), @@ -100,8 +104,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(maybe_ray*, &Element->MaybeMouseRay), @@ -115,8 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world*, Element->World), @@ -130,8 +136,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(game_state*, Element->GameState), @@ -145,8 +152,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(graphics*, &Element->Graphics), @@ -160,8 +168,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(file_traversal_node*, &Element->RequestedGameLibReloadNode), @@ -175,8 +184,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(game_lib_reload_behavior*, &Element->RequestedGameLibReloadBehavior), @@ -190,8 +200,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(heap_allocator*, &Element->Heap), @@ -205,8 +216,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->GameMemory), @@ -220,8 +232,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->WorldUpdateMemory), @@ -235,8 +248,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(entity*, Element->EntityTable), @@ -250,8 +264,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(asset_system*, &Element->AssetSystem), @@ -265,8 +280,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->FrameIndex), @@ -280,9 +296,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(tiered_mesh_freelist*, &Element->geo_u3d_MeshFreelist), @@ -296,8 +313,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(tiered_mesh_freelist*, &Element->world_chunk_MeshFreelist), @@ -311,8 +329,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(debug_state*, Element->DebugState), @@ -326,8 +345,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(engine_debug*, &Element->EngineDebug), @@ -341,8 +361,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(level_editor*, &Element->Editor), @@ -356,8 +377,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(maybe_picked_voxel*, &Element->MousedOverVoxel), @@ -371,8 +393,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(maybe_standing_spot*, &Element->ClosestStandingSpotToCursor), @@ -386,8 +409,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(maybe_entity_ptr*, &Element->HoverEntity), @@ -401,8 +425,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(render_entity_to_texture_group*, &Element->RTTGroup), diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index f9094fc0c..28ce7d558 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(graphics_settings*, &Element->Graphics), @@ -40,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index a92b2e403..596d912a1 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(entity_id*, &Element->Id), @@ -40,14 +40,16 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + - DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->EulerAngles), @@ -61,8 +63,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Scale), @@ -76,9 +79,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->_CollisionVolumeRadius), @@ -92,8 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(physics*, &Element->Physics), @@ -107,8 +112,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(asset_id*, &Element->AssetId), @@ -122,8 +128,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->ModelIndex), @@ -137,9 +144,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(collision_event*, &Element->LastResolvedCollision), @@ -153,8 +161,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(entity_position_info*, &Element->LastResolvedPosInfo), @@ -168,8 +177,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(particle_system*, Element->Emitter), @@ -183,8 +193,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(entity_state*, &Element->State), @@ -198,8 +209,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(entity_behavior_flags*, &Element->Behavior), @@ -213,8 +225,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(entity_id*, &Element->Carrying), @@ -228,23 +241,26 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + - if (EntityUserDataEditorUi) {EntityUserDataEditorUi(Ui, Window, &Element->UserType, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES);} + if (EntityUserDataEditorUi) {EntityUserDataEditorUi(Ui, Window, &Element->UserType, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES);} else {DoEditorUi(Ui, Window, &Element->UserType, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } ; + PushNewRow(Ui); - if (EntityUserDataEditorUi) { /* User took control, skip this because it's intended */ } + if (EntityUserDataEditorUi) { /* User took control, skip this because it's intended */ } else {DoEditorUi(Ui, Window, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } ; + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 4e41c683e..8cb3d8390 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Index), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Generation), @@ -56,6 +57,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 049dbb1e9..6c854c954 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->P), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->_CollisionVolumeRadius), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Scale), @@ -70,9 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->EulerAngles), diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 920b70e33..c8466f26e 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(file_traversal_type*, &Element->Type), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(cs*, &Element->Dir), @@ -55,9 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(cs*, &Element->Name), @@ -71,6 +73,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 017567420..6f9d9b678 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->farClip), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->nearClip), @@ -56,9 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->width), @@ -72,9 +74,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->FOV), @@ -88,9 +91,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(plane*, &Element->Top), @@ -104,8 +108,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(plane*, &Element->Bot), @@ -119,8 +124,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(plane*, &Element->Left), @@ -134,8 +140,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(plane*, &Element->Right), diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index b93dc45c0..d39d0e2cf 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(framebuffer*, &Element->FBO), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(g_buffer_textures*, &Element->Textures), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->gBufferShader), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(m4*, &Element->InverseViewMatrix), @@ -85,8 +88,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(m4*, &Element->InverseProjectionMatrix), @@ -100,8 +104,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(m4*, &Element->ViewProjection), @@ -115,8 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->GlTimerObject), @@ -130,6 +136,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index ed1e7b414..f33af8841 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->ColorTex), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->PositionTex), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->IndexToUV), @@ -70,9 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->Count), @@ -86,9 +89,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(light*, Element->Lights), diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 9c697e0d7..556c526e2 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->VertexHandle), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->NormalHandle), @@ -56,9 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->MatHandle), @@ -72,9 +74,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ElementCount), @@ -88,9 +91,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(data_type*, &Element->ElementType), @@ -104,8 +108,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->Mapped), @@ -119,9 +124,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->Pad), @@ -135,9 +141,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u16*, &Element->Flags), @@ -151,6 +158,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index acb09a006..f198613a4 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(gpu_element_buffer_handles*, &Element->Handles), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(untextured_3d_geometry_buffer*, &Element->Buffer), diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index fcf40608c..7c360b336 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->Initialized), CSz("Initialized"), @@ -37,9 +37,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->RenderGate), CSz("RenderGate"), @@ -50,9 +51,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(render_settings*, &Element->Settings), @@ -66,8 +68,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(render_settings*, &Element->PrevSettings), @@ -81,8 +84,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->OffsetOfWorldCenterToGrid), @@ -96,8 +100,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->SunBasis), @@ -111,8 +116,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->FogPower), @@ -126,9 +132,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->FogColor), @@ -142,8 +149,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->SkyColor), @@ -157,8 +165,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(camera*, &Element->GameCamera), @@ -172,8 +181,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(camera*, &Element->DebugCamera), @@ -187,8 +197,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Exposure), @@ -202,9 +213,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_chunk_ptr_paged_list*, &Element->MainDrawList), @@ -218,8 +230,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_chunk_ptr_paged_list*, &Element->ShadowMapDrawList), @@ -233,8 +246,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->MinClipP_worldspace), @@ -248,8 +262,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->MaxClipP_worldspace), @@ -263,8 +278,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(g_buffer_render_group*, Element->gBuffer), @@ -278,8 +294,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(ao_render_group*, Element->AoGroup), @@ -293,8 +310,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shadow_render_group*, Element->SG), @@ -308,8 +326,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->ColorPaletteTexture), @@ -323,8 +342,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(transparency_render_group*, &Element->Transparency), @@ -338,8 +358,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(lighting_render_group*, &Element->Lighting), @@ -353,8 +374,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(gaussian_render_group*, &Element->Gaussian), @@ -368,8 +390,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(composite_render_group*, &Element->CompositeGroup), @@ -383,8 +406,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(terrain_gen_render_context*, &Element->TerrainGenRC), @@ -398,8 +422,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(terrain_finalize_render_context*, &Element->TerrainFinalizeRC), @@ -413,8 +438,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_render_context*, &Element->WorldEditRC), @@ -428,8 +454,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->NoiseFinalizeJobsPending), @@ -443,9 +470,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(dummy_work_queue_entry_build_chunk_mesh_block_array*, &Element->NoiseReadbackJobs), @@ -459,8 +487,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - if (ToggleButton(Ui, CSz("v GpuBuffers[2]"), CSz("> GpuBuffers[2]"), UiId(Window, "toggle graphics gpu_mapped_element_buffer GpuBuffers", Element->GpuBuffers), Params )) + if (ToggleButton(Ui, CSz("v GpuBuffers[2]"), CSz("> GpuBuffers[2]"), UiId(Window, "toggle graphics gpu_mapped_element_buffer GpuBuffers", Element->GpuBuffers), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -476,8 +505,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->GpuBufferWriteIndex), @@ -491,9 +521,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(gpu_timer_block_array*, &Element->GpuTimers), @@ -507,8 +538,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->Memory), diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index a1ad38829..997ca039f 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(resolution_setting*, &Element->Resolution), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shadow_quality_setting*, &Element->ShadowQuality), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(lighting_quality_setting*, &Element->LightingQuality), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shader_language_setting*, &Element->ShaderLanguage), @@ -85,8 +88,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(resolution_setting*, &Element->WindowStartingSize), diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 122ff2a36..f91d2cf54 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Enter), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Escape), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Alt), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Ctrl), @@ -85,8 +88,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Shift), @@ -100,8 +104,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Backspace), @@ -115,8 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Delete), @@ -130,8 +136,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F12), @@ -145,8 +152,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F11), @@ -160,8 +168,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F10), @@ -175,8 +184,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F9), @@ -190,8 +200,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F8), @@ -205,8 +216,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F7), @@ -220,8 +232,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F6), @@ -235,8 +248,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F5), @@ -250,8 +264,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F4), @@ -265,8 +280,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F3), @@ -280,8 +296,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F2), @@ -295,8 +312,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F1), @@ -310,8 +328,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Dot), @@ -325,8 +344,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Minus), @@ -340,8 +360,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->FSlash), @@ -355,8 +376,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Space), @@ -370,8 +392,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Underscore), @@ -385,8 +408,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N0), @@ -400,8 +424,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N1), @@ -415,8 +440,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N2), @@ -430,8 +456,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N3), @@ -445,8 +472,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N4), @@ -460,8 +488,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N5), @@ -475,8 +504,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N6), @@ -490,8 +520,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N7), @@ -505,8 +536,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N8), @@ -520,8 +552,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N9), @@ -535,8 +568,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->A), @@ -550,8 +584,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->B), @@ -565,8 +600,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->C), @@ -580,8 +616,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->D), @@ -595,8 +632,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->E), @@ -610,8 +648,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F), @@ -625,8 +664,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->G), @@ -640,8 +680,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->H), @@ -655,8 +696,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->I), @@ -670,8 +712,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->J), @@ -685,8 +728,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->K), @@ -700,8 +744,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->L), @@ -715,8 +760,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->M), @@ -730,8 +776,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N), @@ -745,8 +792,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->O), @@ -760,8 +808,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->P), @@ -775,8 +824,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Q), @@ -790,8 +840,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->R), @@ -805,8 +856,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->S), @@ -820,8 +872,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->T), @@ -835,8 +888,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->U), @@ -850,8 +904,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->V), @@ -865,8 +920,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->W), @@ -880,8 +936,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->X), @@ -895,8 +952,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Y), @@ -910,8 +968,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Z), @@ -925,8 +984,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->RMB), @@ -940,8 +1000,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->LMB), @@ -955,8 +1016,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->MMB), @@ -970,8 +1032,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->MouseWheelDelta), @@ -985,6 +1048,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 8340362e2..0082e684b 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->Clicked), CSz("Clicked"), @@ -37,9 +37,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->Pressed), CSz("Pressed"), @@ -50,6 +51,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 3dedf8092..2fef697db 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->tEnd), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Value), @@ -56,6 +57,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 3e4f6d44d..70ebcac4d 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->LayerCount), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v Layers[16]"), CSz("> Layers[16]"), UiId(Window, "toggle layered_brush brush_layer Layers", Element->Layers), Params )) + if (ToggleButton(Ui, CSz("v Layers[16]"), CSz("> Layers[16]"), UiId(Window, "toggle layered_brush brush_layer Layers", Element->Layers), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -58,8 +59,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->SeedBrushWithSelection), @@ -73,9 +75,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->BrushFollowsCursor), @@ -89,9 +92,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_blend_mode*, &Element->Mode), @@ -105,8 +109,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_blend_mode_modifier*, &Element->Modifier), diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 0e4915afa..c10af6e70 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->Memory), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_tool*, &Element->Tool), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_tool*, &Element->PreviousTool), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->SelectionFollowsCursor), @@ -85,9 +88,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->RootChunkNeedsNewMesh), CSz("RootChunkNeedsNewMesh"), @@ -98,9 +102,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->EngineDebugViewModeToggleBits), @@ -114,9 +119,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u16*, &Element->HoverColorIndex), @@ -130,9 +136,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(selection_region*, &Element->Selection), @@ -146,8 +153,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(rect3cp*, &Element->CopyRegion), @@ -161,8 +169,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(selection_modification_state*, &Element->Entity), @@ -176,8 +185,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(asset_thumbnail_block_array*, &Element->AssetThumbnails), @@ -191,8 +201,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->NewAssetFromSelection), CSz("NewAssetFromSelection"), @@ -203,9 +214,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v NewAssetFromSelectionFilename[512]"), CSz("> NewAssetFromSelectionFilename[512]"), UiId(Window, "toggle level_editor char NewAssetFromSelectionFilename", Element->NewAssetFromSelectionFilename), Params )) + if (ToggleButton(Ui, CSz("v NewAssetFromSelectionFilename[512]"), CSz("> NewAssetFromSelectionFilename[512]"), UiId(Window, "toggle level_editor char NewAssetFromSelectionFilename", Element->NewAssetFromSelectionFilename), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -221,9 +233,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->MaskSelection), CSz("MaskSelection"), @@ -234,9 +247,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->NextEditOrdinal), @@ -250,9 +264,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_block_array*, &Element->WorldEdits), @@ -266,8 +281,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_brush_hashtable*, &Element->LoadedBrushes), @@ -281,8 +297,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit*, Element->CurrentEdit), @@ -296,8 +313,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit*, Element->HotEdit), @@ -311,8 +329,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_brush*, Element->CurrentBrush), diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index ab164f863..9b8a2df73 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(game_lights*, &Element->Lights), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(framebuffer*, &Element->FBO), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->LuminanceTex), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->Shader), @@ -85,8 +88,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(bloom_render_group*, &Element->Bloom), diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 231753fa2..5ffd28edb 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->AutoDayNightCycle), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->tDay), @@ -56,9 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->DawnIntensity), @@ -72,9 +74,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->DawnColor), @@ -88,8 +91,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->SunIntensity), @@ -103,9 +107,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->SunColor), @@ -119,8 +124,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->DuskIntensity), @@ -134,9 +140,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->DuskColor), @@ -150,8 +157,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->MoonIntensity), @@ -165,9 +173,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->MoonColor), @@ -181,8 +190,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->CurrentSunColor), diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 46f8bc000..763cfc3cd 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->MeshMask), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v GpuBufferHandles[MeshIndex_Count]"), CSz("> GpuBufferHandles[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer gpu_element_buffer_handles GpuBufferHandles", Element->GpuBufferHandles), Params )) + if (ToggleButton(Ui, CSz("v GpuBufferHandles[MeshIndex_Count]"), CSz("> GpuBufferHandles[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer gpu_element_buffer_handles GpuBufferHandles", Element->GpuBufferHandles), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -58,8 +59,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, + - if (ToggleButton(Ui, CSz("v E[MeshIndex_Count]"), CSz("> E[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer geo_u3d_ptr E", Element->E), Params )) + if (ToggleButton(Ui, CSz("v E[MeshIndex_Count]"), CSz("> E[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer geo_u3d_ptr E", Element->E), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -75,8 +77,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, + - if (ToggleButton(Ui, CSz("v Locks[MeshIndex_Count]"), CSz("> Locks[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer bonsai_futex Locks", Element->Locks), Params )) + if (ToggleButton(Ui, CSz("v Locks[MeshIndex_Count]"), CSz("> Locks[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer bonsai_futex Locks", Element->Locks), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index 190c2809d..c14b8310b 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:537:0 +// src/engine/editor.h:544:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(maybe_tag*, &Element->Tag), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(ray*, &Element->Ray), diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index dd8d25e65..c6f3d6d28 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(vox_data*, &Element->Vox), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(lod_element_buffer*, &Element->Meshes), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(gpu_mapped_element_buffer*, &Element->Mesh), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(untextured_3d_geometry_buffer*, &Element->TransparentMesh), @@ -85,8 +88,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(animation*, &Element->Animation), @@ -100,8 +104,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Dim), diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index af1ed625f..51874dfee 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(ui_noise_type*, &Element->Type), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(white_noise_params*, &Element->White), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(perlin_noise_params*, &Element->Perlin), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(voronoi_noise_params*, &Element->Voronoi), diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 8991dd738..2f7e79cbb 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(octree_node_type*, &Element->Type), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->HadNoVisibleSurface), CSz("HadNoVisibleSurface"), @@ -52,9 +53,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->Dirty), CSz("Dirty"), @@ -65,9 +67,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->WorldP), @@ -81,8 +84,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Resolution), @@ -96,8 +100,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_chunk*, Element->Chunk), @@ -111,8 +116,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + - if (ToggleButton(Ui, CSz("v Children[8]"), CSz("> Children[8]"), UiId(Window, "toggle octree_node octree_node Children", Element->Children), Params )) + if (ToggleButton(Ui, CSz("v Children[8]"), CSz("> Children[8]"), UiId(Window, "toggle octree_node octree_node Children", Element->Children), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -128,8 +134,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(octree_node*, Element->Next), @@ -143,8 +150,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_ptr_block_array*, &Element->Edits), @@ -158,8 +166,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(bonsai_futex*, &Element->Lock), diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 5c78a738a..f8e626148 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Velocity), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Offset), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u8*, &Element->Color), @@ -70,9 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->IsLight), @@ -86,9 +89,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->RemainingLifespan), @@ -102,6 +106,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 37f441dee..af5f5dba6 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(random_series*, &Element->Entropy), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(particle_spawn_type*, &Element->SpawnType), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Drag), @@ -70,9 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Lifetime), @@ -86,9 +89,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->EmissionDelay), @@ -102,9 +106,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->EmissionLifespan), @@ -118,9 +123,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ActiveParticles), @@ -134,9 +140,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->LifespanMod), @@ -150,9 +157,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ParticleLifespan), @@ -166,9 +174,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ParticlesPerSecond), @@ -182,9 +191,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ParticleLightEmission), @@ -198,9 +208,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ParticleLightEmissionChance), @@ -214,9 +225,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ParticleStartingTransparency), @@ -230,9 +242,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ParticleEndingTransparency), @@ -246,9 +259,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->ParticleStartingDim), @@ -262,8 +276,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->ParticleEndingDim), @@ -277,9 +292,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->ParticleTurbMin), @@ -293,8 +309,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->ParticleTurbMax), @@ -308,8 +325,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(aabb*, &Element->SpawnRegion), @@ -323,8 +341,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->SystemMovementCoefficient), @@ -338,9 +357,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ElapsedSinceLastEmission), @@ -354,9 +374,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v PackedHSVColors[6]"), CSz("> PackedHSVColors[6]"), UiId(Window, "toggle particle_system u16 PackedHSVColors", Element->PackedHSVColors), Params )) + if (ToggleButton(Ui, CSz("v PackedHSVColors[6]"), CSz("> PackedHSVColors[6]"), UiId(Window, "toggle particle_system u16 PackedHSVColors", Element->PackedHSVColors), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -372,9 +393,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v Particles[(4096)]"), CSz("> Particles[(4096)]"), UiId(Window, "toggle particle_system particle Particles", Element->Particles), Params )) + if (ToggleButton(Ui, CSz("v Particles[(4096)]"), CSz("> Particles[(4096)]"), UiId(Window, "toggle particle_system particle Particles", Element->Particles), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 633b71aff..9b796b2fc 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Threshold), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Period), @@ -56,8 +57,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Amplitude), @@ -71,6 +73,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 2d4790613..18e8e00d1 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Velocity), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Force), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Delta), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Mass), @@ -85,9 +88,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Speed), @@ -101,6 +105,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index f825f3a51..10e53f5f5 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->P), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Normal), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->d), @@ -70,6 +72,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r + PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index a1d9bbd49..f6c9337a9 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(work_queue*, &Element->LowPriority), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(work_queue*, &Element->HighPriority), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(work_queue*, &Element->RenderQ), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(work_queue*, &Element->WorldUpdateQ), @@ -85,8 +88,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->HighPriorityWorkerCount), @@ -100,9 +104,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(bonsai_futex*, &Element->HighPriorityModeFutex), @@ -116,8 +121,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(bonsai_futex*, &Element->WorkerThreadsSuspendFutex), @@ -131,8 +137,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(bonsai_futex*, &Element->WorkerThreadsExitFutex), @@ -146,8 +153,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(thread_startup_params*, Element->Threads), @@ -161,8 +169,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2*, &Element->MouseP), @@ -176,8 +185,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2*, &Element->MouseDP), @@ -191,8 +201,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->Memory), @@ -206,8 +217,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->GameTime), @@ -221,9 +233,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->dt), @@ -237,9 +250,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2*, &Element->ScreenDim), @@ -253,8 +267,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input*, &Element->Input), @@ -268,8 +283,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(server_state*, Element->ServerState), diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index a8fa1e2cf..0b1137b20 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Na { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->Seed), @@ -40,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Na + PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index 60402e204..55f9c41d5 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:534:0 +// src/engine/editor.h:541:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Origin), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Dir), diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index d8bb86216..47704fde4 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:522:0 +// src/engine/editor.h:529:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Min), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Max), diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index aea143120..3e4c17262 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:528:0 +// src/engine/editor.h:535:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->Min), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->Max), diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index f913ffc1b..492414fac 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:525:0 +// src/engine/editor.h:532:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Min), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Max), diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 1985130de..72008d8bc 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->SolidUIVertexBuffer), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->SolidUIUVBuffer), @@ -56,9 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->SolidUIColorBuffer), @@ -72,9 +74,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->DebugTextureArray), @@ -88,8 +91,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->TextTextureUniform), @@ -103,9 +107,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->Text2DShader), @@ -119,8 +124,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->SolidUIShader), @@ -134,8 +140,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(textured_2d_geometry_buffer*, &Element->Geo), diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index dda6b09fe..2e7e4bd09 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->BytesSolidGeoLastFrame), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->BytesTransGeoLastFrame), @@ -56,9 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->VertsDrawnLastFrame), @@ -72,9 +74,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->DrawCallsLastFrame), @@ -88,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 3992ef5ea..71a37c56a 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->UseSsao), CSz("UseSsao"), @@ -37,9 +37,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->UseShadowMapping), CSz("UseShadowMapping"), @@ -50,9 +51,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->UseLightingBloom), CSz("UseLightingBloom"), @@ -63,9 +65,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->BravoilMyersOIT), CSz("BravoilMyersOIT"), @@ -76,9 +79,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->BravoilMcGuireOIT), CSz("BravoilMcGuireOIT"), @@ -89,9 +93,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->DrawMajorGrid), CSz("DrawMajorGrid"), @@ -102,9 +107,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->DrawMinorGrid), CSz("DrawMinorGrid"), @@ -115,9 +121,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->MajorGridDim), @@ -131,9 +138,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->DrawCameraGhost), CSz("DrawCameraGhost"), @@ -144,9 +152,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->CameraGhostSize), @@ -160,13 +169,14 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + PushNewRow(Ui); PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(tone_mapping_type*, &Element->ToneMappingType), @@ -180,8 +190,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->GameCameraFOV), @@ -195,9 +206,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(lighting_settings*, &Element->Lighting), @@ -211,8 +223,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2*, &Element->ApplicationResolution), @@ -226,8 +239,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2*, &Element->ShadowMapResolution), @@ -241,8 +255,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2*, &Element->LuminanceMapResolution), @@ -256,8 +271,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2i*, &Element->iApplicationResolution), @@ -271,8 +287,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2i*, &Element->iShadowMapResolution), @@ -286,8 +303,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2i*, &Element->iLuminanceMapResolution), diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 302ffadaf..31d932858 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(render_buffers_2d*, Element->TextGroup), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->SpriteTextureArray), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->InteractionStackTop), @@ -70,9 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2*, Element->MouseP), @@ -86,8 +89,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2*, Element->MouseDP), @@ -101,8 +105,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2*, Element->ScreenDim), @@ -116,8 +121,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(input*, Element->Input), @@ -131,8 +137,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(ui_toggle_hashtable*, &Element->ToggleTable), @@ -146,8 +153,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(window_layout_hashtable*, &Element->WindowTable), @@ -161,8 +169,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - if (ToggleButton(Ui, CSz("v MinimizedWindowBuffer[64]"), CSz("> MinimizedWindowBuffer[64]"), UiId(Window, "toggle renderer_2d window_layout MinimizedWindowBuffer", Element->MinimizedWindowBuffer), Params )) + if (ToggleButton(Ui, CSz("v MinimizedWindowBuffer[64]"), CSz("> MinimizedWindowBuffer[64]"), UiId(Window, "toggle renderer_2d window_layout MinimizedWindowBuffer", Element->MinimizedWindowBuffer), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -178,8 +187,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(window_layout*, Element->HighestWindow), @@ -193,8 +203,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(interactable*, &Element->Hover), @@ -208,8 +219,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(interactable*, &Element->Clicked), @@ -223,8 +235,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(interactable*, &Element->Pressed), @@ -238,8 +251,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->RequestedForceCapture), CSz("RequestedForceCapture"), @@ -250,9 +264,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(text_box_edit_state*, &Element->TextEdit), @@ -266,8 +281,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(untextured_2d_geometry_buffer*, &Element->Geo), @@ -281,8 +297,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->TexturedQuadShader), @@ -296,8 +313,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(ui_render_command_buffer*, Element->CommandBuffer), @@ -311,8 +329,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, &Element->RenderCommandArena), @@ -326,8 +345,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, &Element->UiToggleArena), @@ -341,8 +361,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, &Element->WindowTableArena), @@ -356,8 +377,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - if (ToggleButton(Ui, CSz("v DebugColors[128]"), CSz("> DebugColors[128]"), UiId(Window, "toggle renderer_2d v3 DebugColors", Element->DebugColors), Params )) + if (ToggleButton(Ui, CSz("v DebugColors[128]"), CSz("> DebugColors[128]"), UiId(Window, "toggle renderer_2d v3 DebugColors", Element->DebugColors), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -373,8 +395,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->SolidGeoCountLastFrame), @@ -388,9 +411,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->TextGeoCountLastFrame), @@ -404,9 +428,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3_cursor*, Element->ColorPalette), diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 9402cfc77..3e84503f9 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ID), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shader_uniform*, Element->FirstUniform), @@ -56,8 +57,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(cs*, &Element->VertexSourceFilename), @@ -71,9 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(cs*, &Element->FragSourceFilename), @@ -87,9 +90,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s64*, &Element->VertexTimeModifiedWhenLoaded), @@ -103,9 +107,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s64*, &Element->FragmentTimeModifiedWhenLoaded), @@ -119,9 +124,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->HotReloaded), CSz("HotReloaded"), @@ -132,6 +138,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 14ab3861a..74d4ff042 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shape_type*, &Element->Type), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_update_op_shape_params_sphere*, &Element->Sphere), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_update_op_shape_params_rect*, &Element->Rect), diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 15c61065a..fecf7146c 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->Program), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte + - if (ToggleButton(Ui, CSz("v Uniforms[1]"), CSz("> Uniforms[1]"), UiId(Window, "toggle terrain_finalize_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + if (ToggleButton(Ui, CSz("v Uniforms[1]"), CSz("> Uniforms[1]"), UiId(Window, "toggle terrain_finalize_render_context shader_uniform Uniforms", Element->Uniforms), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -57,8 +58,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->DestTexture), @@ -72,8 +74,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(framebuffer*, &Element->FBO), @@ -87,8 +90,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture*, Element->InputTex), diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h index 8091c3679..9073ce328 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *E { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->Program), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *E + - if (ToggleButton(Ui, CSz("v Uniforms[3]"), CSz("> Uniforms[3]"), UiId(Window, "toggle terrain_gen_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + if (ToggleButton(Ui, CSz("v Uniforms[3]"), CSz("> Uniforms[3]"), UiId(Window, "toggle terrain_gen_render_context shader_uniform Uniforms", Element->Uniforms), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -57,8 +58,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *E + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->NoiseTexture), @@ -72,8 +74,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *E + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(framebuffer*, &Element->FBO), @@ -87,8 +90,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *E + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->ChunkDim), @@ -102,8 +106,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *E + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->WorldspaceBasis), @@ -117,8 +122,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *E + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->ChunkResolution), diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index f6f2b91f0..29277d8ad 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(rect3cp*, &Element->Region), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_brush*, Element->Brush), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Ordinal), @@ -70,6 +72,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index ff00d030c..8025bfea5 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -26,25 +26,14 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - if (ToggleButton(Ui, CSz("v NameBuf[(256) + 1]"), CSz("> NameBuf[(256) + 1]"), UiId(Window, "toggle world_edit_brush char NameBuf", Element->NameBuf), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, (256) + 1) - { - DoEditorUi(Ui, Window, Element->NameBuf+ArrayIndex, FSz("NameBuf[%d]", ArrayIndex), Params); - - PushNewRow(Ui); - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + auto Value = CS(Element->NameBuf); + DoEditorUi(Ui, Window, &Value, CSz("NameBuf"), Params); PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_blend_mode*, &Element->Mode), @@ -58,8 +47,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_edit_blend_mode_modifier*, &Element->Modifier), @@ -73,8 +63,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(layered_brush*, &Element->Layered), diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 1e80ac972..585df33f7 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->Program), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + - if (ToggleButton(Ui, CSz("v Uniforms[4]"), CSz("> Uniforms[4]"), UiId(Window, "toggle world_edit_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + if (ToggleButton(Ui, CSz("v Uniforms[4]"), CSz("> Uniforms[4]"), UiId(Window, "toggle world_edit_render_context shader_uniform Uniforms", Element->Uniforms), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -57,8 +58,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + - if (ToggleButton(Ui, CSz("v PingPongFBOs[2]"), CSz("> PingPongFBOs[2]"), UiId(Window, "toggle world_edit_render_context framebuffer PingPongFBOs", Element->PingPongFBOs), Params )) + if (ToggleButton(Ui, CSz("v PingPongFBOs[2]"), CSz("> PingPongFBOs[2]"), UiId(Window, "toggle world_edit_render_context framebuffer PingPongFBOs", Element->PingPongFBOs), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -74,8 +76,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + - if (ToggleButton(Ui, CSz("v PingPongTextures[2]"), CSz("> PingPongTextures[2]"), UiId(Window, "toggle world_edit_render_context texture PingPongTextures", Element->PingPongTextures), Params )) + if (ToggleButton(Ui, CSz("v PingPongTextures[2]"), CSz("> PingPongTextures[2]"), UiId(Window, "toggle world_edit_render_context texture PingPongTextures", Element->PingPongTextures), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -91,8 +94,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, Element->ChunkDim), @@ -106,8 +110,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, Element->WorldspaceBasis), @@ -121,8 +126,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, Element->ChunkResolution), @@ -136,8 +142,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->Type), @@ -151,6 +158,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 85fb8a7d3..964ea953d 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ID), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v2i*, &Element->Dim), @@ -56,8 +57,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Slices), @@ -71,9 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Channels), @@ -87,9 +90,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->IsDepthTexture), CSz("IsDepthTexture"), @@ -100,9 +104,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(texture_storage_format*, &Element->Format), @@ -116,8 +121,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(cs*, &Element->DebugName), @@ -131,9 +137,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->Queued), CSz("Queued"), @@ -144,6 +151,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index f126e43d3..a8ad7631e 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->OutlineUiValues), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->OutlineUiButtons), @@ -56,9 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->OutlineUiTables), @@ -72,9 +74,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->OutlineUiTableColumns), @@ -88,9 +91,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DebugBreakOnElementClick), @@ -104,9 +108,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DebugBreakUiCommand), @@ -120,6 +125,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 98ae3e70e..61f80bc76 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->_Reserved), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->WindowBits), @@ -56,9 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->InteractionBits), @@ -72,9 +74,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ElementBits), @@ -88,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index f24a41f6f..9d93bcf2d 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(ui_id*, &Element->Id), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->ToggledOn), CSz("ToggledOn"), @@ -52,6 +53,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 8f9c39f67..a3611825e 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(data_type*, &Element->Type), @@ -40,12 +40,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(void *, Element->Verts), @@ -59,9 +60,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(void *, Element->Normals), @@ -75,9 +77,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(vertex_material*, Element->Mat), @@ -91,8 +94,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->End), @@ -106,9 +110,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->At), @@ -122,9 +127,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(untextured_3d_geometry_buffer*, Element->Parent), @@ -138,8 +144,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->BufferNeedsToGrow), @@ -153,9 +160,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->Timestamp), @@ -169,6 +177,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 8bc6f3d77..6a3dd0c3b 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u16*, &Element->ColorIndex), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u8*, &Element->Transparency), @@ -56,9 +57,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u8*, &Element->Emission), @@ -72,6 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index bb6fefd6d..99313d058 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Threshold), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Period), @@ -56,8 +57,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Amplitude), @@ -71,9 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Squareness), @@ -87,9 +90,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->MaskChance), @@ -103,6 +107,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 9bb88d302..7ff34ee3f 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(chunk_data*, Element->ChunkData), @@ -40,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index a92a42261..a6a6cf0c9 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u8*, &Element->Transparency), @@ -40,9 +40,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u16*, &Element->Color), @@ -56,6 +57,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index e1b4bbbf5..113fbf23f 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs N { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u8*, &Element->Emission), @@ -40,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs N + PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 429d2a87b..b68454136 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Threshold), @@ -40,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, + PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index ba29a0467..3ba0f6b30 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(bonsai_futex*, &Element->EnqueueFutex), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->EnqueueIndex), @@ -55,9 +56,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->DequeueIndex), @@ -71,9 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(work_queue_entry*, Element->Entries), diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 739d92ce8..040835363 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(work_queue_entry_type*, &Element->Type), @@ -40,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index e55afd9b1..a22f79164 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Center), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->VisibleRegion), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(octree_node*, &Element->Root), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->OctreeMemory), @@ -85,8 +88,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(octree_node_freelist*, &Element->OctreeNodeFreelist), @@ -100,8 +104,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(octree_node_freelist*, &Element->OctreeNodeDeferFreelist), @@ -115,8 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->FreeChunkCount), @@ -130,6 +136,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 48bbcc467..960a0941e 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(world_chunk*, Element->Next), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(chunk_flag*, &Element->Flags), @@ -55,8 +56,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Dim), @@ -70,8 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->Occupancy), @@ -85,9 +88,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->xOccupancyBorder), @@ -101,9 +105,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->FaceMasks), @@ -117,9 +122,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(voxel*, Element->Voxels), @@ -133,8 +139,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(voxel_lighting*, Element->VoxelLighting), @@ -148,8 +155,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(gpu_mapped_element_buffer*, &Element->Mesh), @@ -163,8 +171,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(voxel_position_cursor*, &Element->StandingSpots), @@ -178,8 +187,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->DimInChunks), @@ -193,8 +203,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->WorldP), @@ -208,8 +219,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->FilledCount), @@ -223,9 +235,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, Cast(b8*, &Element->DrawBoundingVoxels), CSz("DrawBoundingVoxels"), @@ -236,9 +249,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->PointsToLeaveRemaining), @@ -252,9 +266,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->TriCount), @@ -268,9 +283,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->EdgeBoundaryVoxelCount), @@ -284,9 +300,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->_Pad0), @@ -300,9 +317,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(entity_ptr_block_array*, &Element->Entities), @@ -316,8 +334,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->DEBUG_OwnedByThread), @@ -331,9 +350,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v _Pad1[20]"), CSz("> _Pad1[20]"), UiId(Window, "toggle world_chunk u8 _Pad1", Element->_Pad1), Params )) + if (ToggleButton(Ui, CSz("v _Pad1[20]"), CSz("> _Pad1[20]"), UiId(Window, "toggle world_chunk u8 _Pad1", Element->_Pad1), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -349,6 +369,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 95e438f55..763259f32 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(rect3*, &Element->Region), @@ -40,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 0b9f7b21b..bfb2f857e 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -26,7 +26,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->Location), @@ -40,8 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ + - DoEditorUi(Ui, + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->Radius), @@ -55,6 +56,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 2007e36b1..74dab13b7 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:519:0 +// src/engine/editor.h:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 51a4b244d..39889a390 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:514:0 +// src/engine/editor.h:521:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index cd91f87ea..bbefef355 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:566:0 +// src/engine/editor.h:573:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index a037c34a9..984bdf236 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:723:0 +// src/engine/editor.h:730:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 3e8902646..fdb1a4134 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:895:0 +// src/engine/editor.h:902:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 1b75ab2a8..83d55578c 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:729:0 +// src/engine/editor.h:736:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 90ebd3c4c..8fc92494b 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:712:0 +// src/engine/editor.h:719:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 9443775db..a6db847dd 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:741:0 +// src/engine/editor.h:748:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index c83d76d6d..63b0d321a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:734:0 +// src/engine/editor.h:741:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index feccca1d9..691d0154d 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:738:0 +// src/engine/editor.h:745:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index b2bd1a286..51d4d7c6e 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:389:0 +// src/engine/editor.h:396:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index f5977f198..5d97a58c4 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:501:0 +// src/engine/editor.h:508:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/hashtable_struct.h b/generated/hashtable_struct.h index e766125d0..3e277e041 100644 --- a/generated/hashtable_struct.h +++ b/generated/hashtable_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1133:0 +// src/engine/editor.h:1140:0 struct world_edit_brush_linked_list_node { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 19cede94b..16329d82b 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:552:0 +// src/engine/editor.h:559:0 link_internal ui_toggle_button_group RadioButtonGroup_level_editor_flags( renderer_2d *Ui, diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 9f7d65558..3d6cab4c5 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:564:0 +// src/engine/editor.h:571:0 link_internal ui_toggle_button_group RadioButtonGroup_ui_noise_type( renderer_2d *Ui, diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 0e042f16f..dea82dff1 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:517:0 +// src/engine/editor.h:524:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_enum.h b/generated/string_and_value_tables_enum.h index 4a0c4a23e..f7a5b7512 100644 --- a/generated/string_and_value_tables_enum.h +++ b/generated/string_and_value_tables_enum.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:893:0 +// src/engine/editor.h:900:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index 5c2b7b87c..f0c17fc99 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:512:0 +// src/engine/editor.h:519:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 1e6d8e15c..72c51d772 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:843:0 +// src/engine/editor.h:850:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 9ae3a64ff..fea08f072 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:562:0 +// src/engine/editor.h:569:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 9656ebf83..41c9c0c6e 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:726:0 +// src/engine/editor.h:733:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index aba2a9652..aed03f39c 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:709:0 +// src/engine/editor.h:716:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 86982b676..1b45c868c 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:732:0 +// src/engine/editor.h:739:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index e4d0ee797..f21e0db2a 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:596:0 +// src/engine/editor.h:603:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 93636e64b..9618905c3 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:718:0 +// src/engine/editor.h:725:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/src/engine/editor.h b/src/engine/editor.h index 026301ad3..949c962fc 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -187,70 +187,77 @@ poof( { } { - member.is_array? + member.has_tag(ui_display_as)? { - if (ToggleButton(Ui, CSz("v member.name[member.array]"), CSz("> member.name[member.array]"), UiId(Window, "toggle type.name member.type member.name", Element->(member.name)), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, member.array) - { - member.has_tag(custom_ui)? - { - member.tag_value(custom_ui); - } - { - DoEditorUi(Ui, Window, Element->(member.name)+ArrayIndex, FSz("member.name[%d]", ArrayIndex), Params); - } - member.is_primitive? { PushNewRow(Ui); } - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + auto Value = member.tag_value(ui_display_as)(Element->member.name); + DoEditorUi(Ui, Window, &Value, CSz("member.name"), Params); } { - member.has_tag(custom_ui)? + member.is_array? { - member.tag_value(custom_ui); + if (ToggleButton(Ui, CSz("v member.name[member.array]"), CSz("> member.name[member.array]"), UiId(Window, "toggle type.name member.type member.name", Element->(member.name)), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, member.array) + { + member.has_tag(custom_ui)? + { + member.tag_value(custom_ui); + } + { + DoEditorUi(Ui, Window, Element->(member.name)+ArrayIndex, FSz("member.name[%d]", ArrayIndex), Params); + } + member.is_primitive? { PushNewRow(Ui); } + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); } { - member.is_type(b32)? + member.has_tag(custom_ui)? { - DoEditorUi(Ui, - Window, - Cast(b8*, member.is_pointer?{}{&}Element->(member.name)), - CSz("member.name"), - &DefaultUiRenderParams_Checkbox - member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); + member.tag_value(custom_ui); } { - member.is_union? + member.is_type(b32)? { - member.name? - { - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast((member.type)*, member.is_pointer?{}{&}Element->(member.name)), - CSz("member.name"), - Params - member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); - } - { - } + DoEditorUi(Ui, + Window, + Cast(b8*, member.is_pointer?{}{&}Element->(member.name)), + CSz("member.name"), + &DefaultUiRenderParams_Checkbox + member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); } { - member.is_function? + member.is_union? { + member.name? + { + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast((member.type)*, member.is_pointer?{}{&}Element->(member.name)), + CSz("member.name"), + Params + member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); + } + { + } } { - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast((member.type)*, member.is_pointer?{}{&}Element->(member.name)), - CSz("member.name"), - Params - member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); + member.is_function? + { + } + { + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast((member.type)*, member.is_pointer?{}{&}Element->(member.name)), + CSz("member.name"), + Params + member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); + } } } } @@ -1104,7 +1111,7 @@ struct world_edit_brush // NOTE(Jesse): This is so we can just copy the name of the brush in here and // not fuck around with allocating a single string when we load these in. #define NameBuf_Len (256) - char NameBuf[NameBuf_Len+1]; poof(@ui_text_box) + char NameBuf[NameBuf_Len+1]; poof(@ui_text_box @ui_display_as(CS)) /* world_edit_shape Shape; */ world_edit_blend_mode Mode; From 0825b45e649ffb48efa5716fe1b1ee7fc6f96407 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 22:24:46 -0700 Subject: [PATCH 196/421] Fix chunks flickering when they're still being initialized --- generated/generate_stream_compact_v3i.h | 2 +- ...unctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...tions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/api.cpp | 18 ++++++++++++++---- src/engine/editor.cpp | 3 ++- src/engine/render_loop.cpp | 2 +- src/engine/world_chunk.cpp | 5 ++++- 7 files changed, 24 insertions(+), 10 deletions(-) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 148fb97d2..55fab436d 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3071:0 +// src/engine/world_chunk.cpp:3073:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 6dfc2bf8f..a2530c566 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2085:0 +// src/engine/world_chunk.cpp:2087:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 9da505eee..4c4b90319 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2088:0 +// src/engine/world_chunk.cpp:2090:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 8b405107d..9cbbcff6f 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -724,7 +724,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ s32 FacesRequired = CountRequiredFacesForMesh_Naieve(SynChunk->FaceMasks, SynChunk->Dim); if (FacesRequired) { - PushBonsaiRenderCommandAllocateAndMapGpuElementBuffer(RenderQ, DataType_v3_u8, u32(FacesRequired*6), &DestChunk->Mesh, SynChunk, DestChunk); + PushBonsaiRenderCommandAllocateAndMapGpuElementBuffer(RenderQ, DataType_v3_u8, u32(FacesRequired*6), &SynChunk->Mesh, SynChunk, DestChunk); } else { @@ -761,17 +761,27 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ world_chunk *SynChunk = Job->SynChunk; world_chunk *DestChunk = Job->DestChunk; - gpu_mapped_element_buffer *GpuMappedBuf = &DestChunk->Mesh; - Assert(HasGpuMesh(&DestChunk->Mesh) == True); + gpu_mapped_element_buffer *GpuMappedBuf = &SynChunk->Mesh; + /* Assert(HasGpuMesh(&DestChunk->Mesh) == True); */ Assert(HasGpuMesh(GpuMappedBuf) == True); Assert(DestChunk->DEBUG_OwnedByThread == 0); DestChunk->DEBUG_OwnedByThread = ThreadLocal_ThreadIndex; RebuildWorldChunkMesh(Thread, SynChunk, {}, {}, MeshBit_Lod0, &GpuMappedBuf->Buffer, Thread->TempMemory); + + if (HasGpuMesh(&DestChunk->Mesh) == True) + { + PushDeallocateBuffersCommand(RenderQ, &DestChunk->Mesh.Handles); + } + + DestChunk->Mesh = *GpuMappedBuf; + SynChunk->Mesh = {}; + Assert(GpuMappedBuf->Buffer.At == GpuMappedBuf->Buffer.End); Assert(HasGpuMesh(&DestChunk->Mesh) == True); + FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); DestChunk->DEBUG_OwnedByThread = 0; @@ -800,7 +810,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ if (ChunkIsGarbage(Chunk)) { // NOTE(Jesse): This is an optimization; the engine marks chunks that - // // have moved outside of the visible region as garbage. + // have moved outside of the visible region as garbage. Chunk->Flags = Chunk_Uninitialized; } else diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index a85cad705..868101d09 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1042,7 +1042,8 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br // @editor_chunk_memory_question // /* DeallocateWorldChunk(Chunk, MeshFreelist); */ - DeallocateGpuBuffers(RenderQ, Chunk); + /* DeallocateGpuBuffers(RenderQ, Chunk); */ + PushDeallocateBuffersCommand(RenderQ, &Chunk->Mesh.Handles); AllocateWorldChunk(Chunk, {}, RequiredLayerDim, {}, Editor->Memory); } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index fbadea535..f57d4e798 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -106,7 +106,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) MapGpuBuffer_untextured_3d_geometry_buffer(Command->Dest); Assert(HasGpuMesh(Command->Dest) == 1); - Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 1); + /* Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 1); */ auto Next = WorkQueueEntry(WorkQueueEntryBuildWorldChunkMesh(Command->SynChunk, Command->DestChunk)); PushWorkQueueEntry(LowPriorityQ, &Next); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 9ffd29a7c..6e2dfa393 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -381,6 +381,7 @@ GetAndInsertFreeWorldChunk(world *World, world_position P) return Result; } +#if 0 link_internal void DeallocateGpuBuffers(work_queue *RenderQueue, world_chunk *Chunk ) { @@ -388,6 +389,7 @@ DeallocateGpuBuffers(work_queue *RenderQueue, world_chunk *Chunk ) Assert(Chunk->Mesh.Handles.Mapped == False); Assert(Chunk->Mesh.Handles.ElementCount == 0); } +#endif link_internal void PushBonsaiRenderCommandDeallocateWorldChunk( work_queue *RenderQueue, world_chunk* Chunk); @@ -3623,6 +3625,7 @@ BuildMipMesh( voxel *Voxels, v3i VoxDim, v3i InnerMin, v3i InnerMax, world_ch } } +#if 1 link_internal void RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOffset, v3i MaxOffset, world_chunk_mesh_bitfield MeshBit, geo_u3d *Dest, memory_arena *TempMem, v3 VertexOffset = {}) { @@ -3633,11 +3636,11 @@ RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOff Assert( IsSet(Chunk->Flags, Chunk_VoxelsInitialized) ); Assert( MeshBit == MeshBit_Lod0 ); - BuildWorldChunkMeshFromMarkedVoxels_Naieve( Chunk->Voxels, Chunk->FaceMasks, Chunk->Dim, MinOffset, MaxOffset, Dest, 0); if (Dest->At == 0) { PushDeallocateBuffersCommand(&Engine->Stdlib.Plat.RenderQ, &Chunk->Mesh.Handles); } } +#endif link_internal void From 6a40dcce82f86e7ff3afc88716ff4bf9906683e8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 22:29:33 -0700 Subject: [PATCH 197/421] Clean out some garbage from world_chunk --- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 126 ------------------ .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- generated/maybe_standing_spot.h | 2 +- src/engine/api.cpp | 5 - src/engine/bonsai.h | 2 - src/engine/resources.cpp | 3 - src/engine/world_chunk.h | 27 +--- 12 files changed, 9 insertions(+), 168 deletions(-) diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index 9f87666ef..9ddf22c15 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:450:0 +// src/engine/world_chunk.h:427:0 diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index eccb7eafb..8c2f5c328 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:485:0 +// src/engine/world_chunk.h:462:0 diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 8959cae08..231a1a894 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:512:0 +// src/engine/world_chunk.h:489:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index 4a39d0dd3..35e52e843 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:447:0 +// src/engine/world_chunk.h:424:0 struct world_chunk_ptr_buffer { diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 960a0941e..f69ffecb5 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -236,88 +236,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->DrawBoundingVoxels), - CSz("DrawBoundingVoxels"), - &DefaultUiRenderParams_Checkbox - ); - - - - - - - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->PointsToLeaveRemaining), - CSz("PointsToLeaveRemaining"), - Params - ); - - - - - - - - - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->TriCount), - CSz("TriCount"), - Params - ); - - - - - - - - - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->EdgeBoundaryVoxelCount), - CSz("EdgeBoundaryVoxelCount"), - Params - ); - - - - - - - - - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->_Pad0), - CSz("_Pad0"), - Params - ); - - - - - - - - PushNewRow(Ui); DoEditorUi(Ui, @@ -327,50 +245,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name CSz("Entities"), Params ); - - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->DEBUG_OwnedByThread), - CSz("DEBUG_OwnedByThread"), - Params - ); - - - - - - - - - PushNewRow(Ui); - - if (ToggleButton(Ui, CSz("v _Pad1[20]"), CSz("> _Pad1[20]"), UiId(Window, "toggle world_chunk u8 _Pad1", Element->_Pad1), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 20) - { - DoEditorUi(Ui, Window, Element->_Pad1+ArrayIndex, FSz("_Pad1[%d]", ArrayIndex), Params); - - PushNewRow(Ui); - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); - - - - - PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 9776c5540..1adaeaeb2 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:518:0 +// src/engine/world_chunk.h:495:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index be87bae31..5ad370078 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:515:0 +// src/engine/world_chunk.h:492:0 struct standing_spot_stream_chunk { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 3ac83ec0b..5c66e849b 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:482:0 +// src/engine/world_chunk.h:459:0 struct maybe_standing_spot { diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 9cbbcff6f..559532873 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -765,9 +765,6 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ /* Assert(HasGpuMesh(&DestChunk->Mesh) == True); */ Assert(HasGpuMesh(GpuMappedBuf) == True); - Assert(DestChunk->DEBUG_OwnedByThread == 0); - DestChunk->DEBUG_OwnedByThread = ThreadLocal_ThreadIndex; - RebuildWorldChunkMesh(Thread, SynChunk, {}, {}, MeshBit_Lod0, &GpuMappedBuf->Buffer, Thread->TempMemory); if (HasGpuMesh(&DestChunk->Mesh) == True) @@ -784,8 +781,6 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); - DestChunk->DEBUG_OwnedByThread = 0; - PushBonsaiRenderCommandUnmapGpuElementBuffer(RenderQ, &DestChunk->Mesh, DestChunk); // TODO(Jesse)(bug, race): There's a race here; the chunk can get deallocated on the diff --git a/src/engine/bonsai.h b/src/engine/bonsai.h index 7aeac9796..7543ee15b 100644 --- a/src/engine/bonsai.h +++ b/src/engine/bonsai.h @@ -260,8 +260,6 @@ ClearWorldChunk( world_chunk *Chunk ) Chunk->Entities = {}; Chunk->Next = {}; - Chunk->DEBUG_OwnedByThread = {}; - Clear(&Chunk->Mesh); Chunk->Flags = {}; diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index e9852bcb8..e5a5e52f4 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -2,8 +2,6 @@ link_internal void DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk) { UNPACK_ENGINE_RESOURCES(Engine); - Assert(Chunk->DEBUG_OwnedByThread == 0); - Chunk->DEBUG_OwnedByThread = ThreadLocal_ThreadIndex; Assert( (Chunk->Flags & Chunk_Queued) == 0); Assert( Chunk->Flags & (Chunk_Deallocate|Chunk_VoxelsInitialized)); @@ -15,7 +13,6 @@ DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk) ClearWorldChunk(Chunk); - Assert(Chunk->DEBUG_OwnedByThread == 0); Assert(Chunk->Flags == 0); Assert(Chunk->Next == 0); diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 5369317a8..2ee37d134 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -326,21 +326,8 @@ struct world_chunk poof(@version(1)) // } - // TODO(Jesse): This stores pointers that are completely ephemeral and as - // such are wasted space. We could remove those to make this struct 24 bytes - // smaller, which is probably pretty worth. - // - // TODO(Jesse): remove this in favor of Mesh - /* lod_element_buffer Meshes; poof(@no_serialize) */ - gpu_mapped_element_buffer Mesh; poof(@no_serialize) - // TODO(Jesse): Pack this into something else.. or ideally remove it entirely. - /* b32 HasMesh; poof(@no_serialize) */ - - /* threadsafe_geometry_buffer TransparentMeshes; */ - /* gpu_mapped_element_buffer GpuBuffers[MeshIndex_Count]; */ - voxel_position_cursor StandingSpots; poof(@no_serialize) // TODO(Jesse): Rename @@ -351,23 +338,13 @@ struct world_chunk poof(@version(1)) s32 FilledCount; poof(@no_serialize) - b32 DrawBoundingVoxels; poof(@no_serialize) - s32 PointsToLeaveRemaining; poof(@no_serialize) - u32 TriCount; poof(@no_serialize) - s32 EdgeBoundaryVoxelCount; poof(@no_serialize) - - u32 _Pad0; poof(@no_serialize) - // NOTE(Jesse): This is a list of all entities overlapping this chunk to be // considered for collision detection. entity_ptr_block_array Entities; poof(@no_serialize) - - // TODO(Jesse): Probably take this out? - s32 DEBUG_OwnedByThread; poof(@no_serialize) - - u8 _Pad1[20]; poof(@no_serialize) }; + // TODO(Jesse, id: 87, tags: speed, cache_friendly): Re-enable this +// // @world-chunk-cache-line-size /* CAssert(sizeof(world_chunk) == CACHE_LINE_SIZE); */ From 5a3adb0f49003d2492517cec72331f3599a4bbea Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 6 Mar 2025 23:43:45 -0700 Subject: [PATCH 198/421] Move voronoi noise into header.glsl and changes to cliffy_hills.fragmentshader --- examples/terrain_gen/game_constants.h | 4 +- external/bonsai_stdlib | 2 +- jesse.make.sh | 2 +- shaders/terrain/cliffy_hills.fragmentshader | 340 +++----------------- shaders/terrain/world_edit.fragmentshader | 115 +------ 5 files changed, 41 insertions(+), 422 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index b4fec95ad..0d4222dd7 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -17,11 +17,11 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ -/* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ +g_VisibleRegion = Chunk_Dimension(256, 256, 256); /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ -g_VisibleRegion = Chunk_Dimension(16, 16, 16); +/* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ /* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 378a2643a..115318a51 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 378a2643ac5ee1b57b3a451922ce9c55c56caf94 +Subproject commit 115318a5198951de95b8374f83f0d586fe21eff7 diff --git a/jesse.make.sh b/jesse.make.sh index 81197b57f..4a47e50e2 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/cliffy_hills.fragmentshader b/shaders/terrain/cliffy_hills.fragmentshader index 8cfbcfdd6..e748131b1 100644 --- a/shaders/terrain/cliffy_hills.fragmentshader +++ b/shaders/terrain/cliffy_hills.fragmentshader @@ -4,290 +4,6 @@ uniform v3 ChunkResolution; in vec2 UV; out v4 Output; -/// -// -// fractal rock code -// -/// - - - -#define PI 3.14159265 -#define SQRT2 1.4142135 -#define SQRT3 1.7320508 -#define SQRT5 2.2360679 -#define FOV 2.5 - -#define MAX_DIST 500. -#define MIN_DIST 1e-5 -#define MAX_MARCHES 512. -#define LIGHT_ANGLE 0.04 - -//how much does the terrain change in large scale -#define PERLIN_SCALE 2 - -//coefficients are fine-tuned -//you can get all kinds of weird terrain by carefully setting the coefficients, -//even forests are possible, but they may look not as realistic as the rock fractals -const int FRACTAL_ITER = 20; -const float iFracScale = 1.6467; -const float iFracAng1 = 2.7315; -const float iFracAng2 = -0.2082; -const vec3 iFracShift = vec3(-8.92, 3.66, 5.49); -const vec3 iFracCol = vec3(0.3, 0.3, -0.2); - -float s1 = sin(iFracAng1), c1 = cos(iFracAng1), s2 = sin(iFracAng2), c2 = cos(iFracAng2); - -float PBR_METALLIC = 0.0; -float PBR_ROUGHNESS = 0.7; - -vec3 BACKGROUND_COLOR = vec3(0.); -vec3 LIGHT_DIRECTION = normalize(vec3(-1.,1.,0.68)); -vec3 LIGHT_COLOR = vec3(1., 0.95, 0.8); -bool SHADOWS_ENABLED = true; - -float gamma_material = 0.1; -float gamma_sky = 0.76; -float gamma_camera = 2.2; - -float LOD; - -float hash(float p) -{ - p = fract(p * .1031); - p *= p + 33.33; - p *= p + p; - return fract(p); -} - -vec4 hash41(float p) -{ - vec4 p4 = fract(vec4(p) * vec4(.1031, .1030, .0973, .1099)); - p4 += dot(p4, p4.wzxy+33.33); - return fract((p4.xxyz+p4.yzzw)*p4.zywx); - -} - -vec4 hash42(vec2 p) -{ - vec4 p4 = fract(vec4(p.xyxy) * vec4(.1031, .1030, .0973, .1099)); - p4 += dot(p4, p4.wzxy+33.33); - return fract((p4.xxyz+p4.yzzw)*p4.zywx); - -} - - -//normally distributed random numbers -vec3 randn(float p) -{ - vec4 rand = hash41(p); - vec3 box_muller = sqrt(-2.*log(max(vec3(rand.x,rand.x,rand.z),1e-8)))*vec3(sin(2.*PI*rand.y),cos(2.*PI*rand.y),sin(2.*PI*rand.w)); - return box_muller; -} - -//uniformly inside a sphere -vec3 random_sphere(float p) -{ - return normalize(randn(p))*pow(hash(p+85.67),0.333333); -} - -vec3 cosdistr(vec3 dir, float seed) -{ - vec3 rand_dir = normalize(randn(seed*SQRT2)); - vec3 norm_dir = normalize(rand_dir - dot(dir,rand_dir)*dir); - float u = hash(seed); - return normalize(dir*sqrt(u) + norm_dir*sqrt(1.-u)); -} - - -vec4 perlin_octave(vec2 p) -{ - vec2 pi = floor(p); - vec2 pf = p - pi; - vec2 pfc = 0.5 - 0.5*cos(pf*PI); - vec2 a = vec2(0.,1.); - - vec4 a00 = hash42(pi+a.xx); - vec4 a01 = hash42(pi+a.xy); - vec4 a10 = hash42(pi+a.yx); - vec4 a11 = hash42(pi+a.yy); - - vec4 i1 = mix(a00, a01, pfc.y); - vec4 i2 = mix(a10, a11, pfc.y); - - return mix(i1, i2, pfc.x); -} - -mat2 rotat = mat2(cos(0.5), -sin(0.5), sin(0.5), cos(0.5)); - -vec4 perlin4(vec2 p) -{ - float a = 1.; - vec4 res = vec4(0.); - for(int i = 0; i < PERLIN_SCALE; i++) - { - res += a*(perlin_octave(p)-0.5); - //inverse perlin - p *= 0.6*rotat; - a *= 1.2; - } - return res; -} - -///// -/////Code from Marble Marcher Community Edition -///// - -#define COL col_scene -#define DE de_scene -//########################################## -// Space folding -//########################################## -void planeFold(inout vec4 z, vec3 n, float d) { - z.xyz -= 2.0 * min(0.0, dot(z.xyz, n) - d) * n; -} -void sierpinskiFold(inout vec4 z) { - z.xy -= min(z.x + z.y, 0.0); - z.xz -= min(z.x + z.z, 0.0); - z.yz -= min(z.y + z.z, 0.0); -} - -// Polynomial smooth minimum by iq -float smoothmin(float a, float b, float k) { - float h = clamp(0.5 + 0.5*(a-b)/k, 0.0, 1.0); - return mix(a, b, h) - k*h*(1.0-h); -} - -/*void mengerFold(inout vec4 z) { - float a = smoothmin(z.x - z.y, 0.0, 0.03); - z.x -= a; - z.y += a; - a = smoothmin(z.x - z.z, 0.0, 0.03); - z.x -= a; - z.z += a; - a = smoothmin(z.y - z.z, 0.0, 0.03); - z.y -= a; - z.z += a; -}*/ - -void mengerFold(inout vec4 z) { - float a = min(z.x - z.y, 0.0); - z.x -= a; - z.y += a; - a = min(z.x - z.z, 0.0); - z.x -= a; - z.z += a; - a = min(z.y - z.z, 0.0); - z.y -= a; - z.z += a; -} -void boxFold(inout vec4 z, vec3 r) { - z.xyz = clamp(z.xyz, -r, r) * 2.0 - z.xyz; -} -void rotX(inout vec4 z, float s, float c) { - z.yz = vec2(c*z.y + s*z.z, c*z.z - s*z.y); -} -void rotY(inout vec4 z, float s, float c) { - z.xz = vec2(c*z.x - s*z.z, c*z.z + s*z.x); -} -void rotZ(inout vec4 z, float s, float c) { - z.xy = vec2(c*z.x + s*z.y, c*z.y - s*z.x); -} -void rotX(inout vec4 z, float a) { - rotX(z, sin(a), cos(a)); -} -void rotY(inout vec4 z, float a) { - rotY(z, sin(a), cos(a)); -} -void rotZ(inout vec4 z, float a) { - rotZ(z, sin(a), cos(a)); -} - -//########################################## -// Primitive DEs -//########################################## -float de_sphere(vec4 p, float r) { - return (length(p.xyz) - r) / p.w; -} -float de_box(vec4 p, vec3 s) { - - vec3 a = abs(p.xyz) - s; - return (min(max(max(a.x, a.y), a.z), 0.0) + length(max(a, 0.0))) / p.w; -} -float de_tetrahedron(vec4 p, float r) { - float md = max(max(-p.x - p.y - p.z, p.x + p.y - p.z), - max(-p.x + p.y + p.z, p.x - p.y + p.z)); - return (md - r) / (p.w * sqrt(3.0)); -} -float de_capsule(vec4 p, float h, float r) { - p.y -= clamp(p.y, -h, h); - return (length(p.xyz) - r) / p.w; -} - -//########################################## -// Main DEs -//########################################## -float de_fractal(vec4 p) -{ - vec3 p0 = p.xyz; - p.xz = mod(p.xz + vec2(0.5*p.w), vec2(1.*p.w)) - vec2(0.5*p.w); - vec4 perlin1 = perlin4(p0.xz); - vec3 shift =iFracShift + 0.35*perlin1.xyz; - for (int i = 0; i < FRACTAL_ITER; ++i) { - - p.xyz = abs(p.xyz); - - rotZ(p, s1, c1); - mengerFold(p); - rotX(p, s2, c2); - p *= iFracScale*(1.); - p.xyz += shift; - - } - - return 0.66*de_box(p, vec3(6.0)); -} - -vec4 col_fractal(vec4 p) -{ - vec3 p0 = p.xyz; - vec3 orbit = vec3(0.0); - p.xz = mod(p.xz + vec2(0.5*p.w), vec2(1.*p.w)) - vec2(0.5*p.w); - vec4 perlin1 = perlin4(p0.xz); - vec3 shift =iFracShift + 0.35*(perlin1.xyz - 0.5); - for (int i = 0; i < FRACTAL_ITER; ++i) { - p.xyz = abs(p.xyz); - rotZ(p, s1, c1); - mengerFold(p); - rotX(p, s2, c2); - p *= iFracScale*(1.); - p.xyz += shift; - orbit = max(orbit, p.xyz*iFracCol); - } - return vec4(orbit, de_box(p, vec3(6.0))); -} - -float de_scene(vec3 pos) -{ - vec4 p = vec4(pos,1.f); - float d = de_fractal(p); - return d; -} - -vec4 col_scene(vec3 pos) -{ - vec4 p = vec4(pos,1.f); - vec4 col = col_fractal(p); - return vec4(min(col.xyz,1.), 0.0); -} - - -/// -// -// end fractal code -// -/// - @@ -468,7 +184,7 @@ void main() v3 Offset = V3(0); v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); -#if 1 +#if 0 { v3 TileCoord = trunc(Basis/16.f); TileCoord.z = 0.f; @@ -559,27 +275,49 @@ void main() f32 rng2d = white_noise(Basis.xy); f32 rng3d = white_noise(Basis); + v3 BaseCliffColor = V3(0.08f); + v3 CliffColor = BaseCliffColor; + f32 CliffValue = 0.f; // Main cliffs { v3 v = voronoi_noise(Basis/v3(200,200,1800)); - NoiseValue += (v.x*200)*Cliffness; - NoiseValue += (v.y*25)*Cliffness; - ColorValue = mix(ColorValue, v3(.18), clamp(10*Cliffness*v.x,0,1)); + CliffValue += (v.x*200)*Cliffness; + CliffValue += (v.y*25)*Cliffness; + CliffColor = mix(CliffColor, BaseCliffColor, clamp(10*Cliffness*v.x,0,1)); } { v3 v = voronoi_noise(Basis/v3(100,100,600)); - NoiseValue += (v.x*8)*Cliffness; - /* NoiseValue += (v.y*10)*Cliffness; */ - ColorValue = mix(ColorValue, v3(.7), Cliffness*v.x); + v.x += 0.5f; + v.x = v.x*v.x; + + if (v.x > 0.28f) + { + CliffValue += (v.x*25)*Cliffness; + /* CliffValue += (v.y*10)*Cliffness; */ + CliffColor = mix(CliffColor, v3(.7), Cliffness*v.x); + } } { v3 v = voronoi_noise(Basis/v3(50,50,200)); - NoiseValue += (v.x*10)*Cliffness; - NoiseValue += (v.y*10)*pow(Cliffness,3); - ColorValue = mix(ColorValue, v3(.9), Cliffness*v.x); + v.x += 0.50f; + v.x = v.x * v.x; + + if (v.x > 0.30) + { + /* CliffValue += (v.x)*Cliffness; */ + CliffValue += (v.x*10)*pow(Cliffness,3); + CliffColor = mix(CliffColor, v3(.9), Cliffness*v.x*v.x); + } } { - ColorValue = mix(ColorValue, v3(1.f), rng3d*Cliffness*.2); + CliffValue += rng3d * 0.1f; + CliffColor = mix(CliffColor, v3(1.f), rng3d*Cliffness*.2); + } + + if (CliffValue > 12.f) + { + NoiseValue += CliffValue; + ColorValue = CliffColor; } @@ -650,21 +388,14 @@ void main() /* } */ - - { - - } - - - - /* ColorValue = V3(Grassness, Cliffness, 0.f); */ /* ColorValue = V3(Cliffness); */ // Bias noise value to lower values as we get higher in z. // This creates a "plane" of terrain /* NoiseValue = NoiseValue - Basis.z + sin(Basis.x/500.f)*1000.f; */ - NoiseValue = NoiseValue - Basis.z + sin(Basis.x/500.f)*300.f - cos(Basis.y/800.f)*200.f;; + /* NoiseValue = NoiseValue - Basis.z + sin(Basis.x/500.f)*300.f - cos(Basis.y/800.f)*200.f;; */ + NoiseValue = NoiseValue - Basis.z; #if 0 if (NoiseValue <= 0) @@ -680,6 +411,7 @@ void main() NoiseValue += NoiseToTile; } #endif + } // diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 28e0c7479..d33ec2ebe 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -43,119 +43,6 @@ in vec2 UV; out layout(location = 0) vec4 Output; - - -// https://thebookofshaders.com/10/ -float rand(vec2 st) { - return fract(sin(dot(st.xy, - vec2(12.9898,78.233)))* - 43758.5453123); -} - -float hash(float x) { return fract(x + 1.32154 * 1.2151); } -vec3 RandomV3FromFloat(float x) { return vec3(hash(((x + 0.5283) * 59.3829) * 274.3487), hash(((x + 0.8192) * 83.6621) * 345.3871), hash(((x + 0.2157f) * 36.6521f) * 458.3971f)); } -vec3 RandomV3FromV3(v3 V) { return vec3(rand(V.xy), rand(V.yz), rand(V.xz)); } - - -#define Floor floor -#define Abs abs -#define Clamp01(x) clamp(x, 0.f, 1.f) -#define LengthSq(V) (V.x*V.x + V.y*V.y + V.z*V.z) -#define Normalize normalize -#define Dot dot -#define Min min - -#define True true -#define False false -#define b32 bool - -link_internal f32 -voronoi(v3 Texel) -{ - v3 baseCell = Floor(Texel); - - v3 CellOffsets[27]; - - // first pass to find the closest cell - // - f32 minDistToCellSq = 100; - v3 toClosestCell; - v3 closestCell; - s32 CellIndex = 0; - for( s32 x1 = -1; - x1 <= 1; - ++x1 ) - { - for(s32 y1 = -1; - y1 <= 1; - ++y1 ) - { - for( s32 z1 = -1; - z1 <= 1; - ++z1 ) - { - v3 cell = baseCell + V3(x1, y1, z1); - v3 offset = Clamp01(RandomV3FromV3(cell) - Squareness); - v3 cellPosition = cell + offset; - - v3 toCell = cellPosition - Texel; - f32 distToCellSq = LengthSq(toCell); - if(distToCellSq < minDistToCellSq) - { - minDistToCellSq = distToCellSq; - closestCell = cell; - toClosestCell = toCell; - } - - CellOffsets[CellIndex++] = offset; - } - } - } - // - // TODO(Jesse): This seems like you'd just want to do it in-line in the first - // loop ..? - // - // second pass to find the distance to the closest edge - // - f32 minEdgeDistance = 10; - CellIndex = 0; - for( s32 x2 = -1; - x2 <= 1; - ++x2 ) - { - for(s32 y2 = -1; - y2 <= 1; - ++y2 ) - { - for( s32 z2 = -1; - z2 <= 1; - ++z2 ) - { - /* v3 cell = (baseCell + V3(x2, y2, z2)); */ - v3 cell = baseCell + V3(x2, y2, z2); - v3 offset = CellOffsets[CellIndex++]; - - v3 cellPosition = cell + offset; - v3 toCell = cellPosition - Texel; - - v3 diffToClosestCell = Abs(closestCell - cell); - b32 isClosestCell = diffToClosestCell.x + diffToClosestCell.y + diffToClosestCell.z < 0.1f; - if(isClosestCell == False) - { - v3 toCenter = (toClosestCell + toCell) * 0.5; - v3 cellDifference = Normalize(toCell - toClosestCell); - f32 edgeDistance = Dot(toCenter, cellDifference); - minEdgeDistance = Min(minEdgeDistance, edgeDistance); - } - } - } - } - return minEdgeDistance; - /* return sqrt(minDistToCellSq); */ - /* return closestCell; */ -} - - void main() { v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); @@ -204,7 +91,7 @@ void main() case 1: // NoiseType_Voronoi: { - NoiseSample = voronoi(NoiseBasis); + NoiseSample = voronoi_noise(NoiseBasis, Squareness).x; } break; case 2: // NoiseType_White: From a8f7b903f52989d310d1f6424e31b0dfca722f8c Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 7 Apr 2025 16:48:19 -0700 Subject: [PATCH 199/421] Fix a minor bug with Threshold --- brushes/cobblestone.brush | Bin 0 -> 785 bytes brushes/eraser.brush | Bin 0 -> 785 bytes examples/terrain_gen/game_constants.h | 3 +- external/bonsai_stdlib | 2 +- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/block_array_struct_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 25 ++++++++ ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- generated/hashtable_struct.h | 2 +- generated/serdes_struct_shape_layer.h | 15 +++++ generated/string_and_value_tables_enum.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- jesse.make.sh | 2 +- shaders/terrain/cliffy_hills.fragmentshader | 58 ++++++++++-------- shaders/terrain/world_edit.fragmentshader | 2 +- src/engine/editor.h | 3 + src/engine/render_loop.cpp | 1 + 34 files changed, 103 insertions(+), 54 deletions(-) create mode 100644 brushes/cobblestone.brush create mode 100644 brushes/eraser.brush diff --git a/brushes/cobblestone.brush b/brushes/cobblestone.brush new file mode 100644 index 0000000000000000000000000000000000000000..3182de1cb69d5c2a8a4cb0717a58126d96790595 GIT binary patch literal 785 zcmd^-%?-jZ3`PkYk(hxASfT196+sqMsuHOQ2W||+h#asJf3gqVfK=AAo_`Kj!>+%* zGAK{VxIW8cDpc#7?&Y9X@cH)ds4nHX(6n4%v|@>GL;EeqxKOD%(WNcd@xOx{$=}l- zjY|U#riU4sEu0@+&gC=LdpIvM?ZJWY;FgC2WxwT^w12^jIrM|l<8#aeB+9KGIM9zc QH?Ze;+YM0!Z4d_h0e9`ly#N3J literal 0 HcmV?d00001 diff --git a/brushes/eraser.brush b/brushes/eraser.brush new file mode 100644 index 0000000000000000000000000000000000000000..2c2a75f17d8772b5aa2fc8a35ff19d0ee387cc23 GIT binary patch literal 785 zcmd^-K?=e^3`HGX7J3Fx;1xDHLd?vVX;nobp%lw~&5}I}v zduMXC&MDvcGB9o1yqx*qs^a;w)3~;*Gt+P#@02klmZ6;T$dpfIu6OType = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index c51a359d9..8345b1029 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1018:0 +// src/engine/editor.h:1021:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index a754ef821..190170c95 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1011:0 +// src/engine/editor.h:1014:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index b77443af4..104a53eff 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:886:0 +// src/engine/editor.h:889:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 74d4ff042..ca553ac7b 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -65,6 +65,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name CSz("Rect"), Params ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->Threshold), + CSz("Threshold"), + Params + , 0.f, 1.f ); + + + + + + + + + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 984bdf236..656950df7 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:730:0 +// src/engine/editor.h:731:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index fdb1a4134..fb22f0a54 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:902:0 +// src/engine/editor.h:905:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 83d55578c..6dc66d067 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:736:0 +// src/engine/editor.h:737:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 8fc92494b..22ce5a7e6 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:719:0 +// src/engine/editor.h:720:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index a6db847dd..56952f320 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:748:0 +// src/engine/editor.h:749:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 63b0d321a..44cc5e8e7 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:741:0 +// src/engine/editor.h:742:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 691d0154d..617fc3c1b 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:745:0 +// src/engine/editor.h:746:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/hashtable_struct.h b/generated/hashtable_struct.h index 3e277e041..37d8f692a 100644 --- a/generated/hashtable_struct.h +++ b/generated/hashtable_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1140:0 +// src/engine/editor.h:1143:0 struct world_edit_brush_linked_list_node { diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index 44f7238f4..3e6a556f9 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -48,6 +48,13 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Rect); // default + + + + + + Result &= Serialize(Bytes, &Element->Threshold); // default + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -86,6 +93,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer *Element, memory_arena * // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Rect, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Threshold, Memory); + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/string_and_value_tables_enum.h b/generated/string_and_value_tables_enum.h index f7a5b7512..6e0bc7f60 100644 --- a/generated/string_and_value_tables_enum.h +++ b/generated/string_and_value_tables_enum.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:900:0 +// src/engine/editor.h:903:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 72c51d772..851bf5e9c 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:850:0 +// src/engine/editor.h:851:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 41c9c0c6e..0c7a482d7 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:733:0 +// src/engine/editor.h:734:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index aed03f39c..04f63fcb5 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:716:0 +// src/engine/editor.h:717:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 1b45c868c..e9304a143 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:739:0 +// src/engine/editor.h:740:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 9618905c3..817bafbb6 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:725:0 +// src/engine/editor.h:726:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/jesse.make.sh b/jesse.make.sh index 4a47e50e2..81197b57f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/cliffy_hills.fragmentshader b/shaders/terrain/cliffy_hills.fragmentshader index e748131b1..15ad44edd 100644 --- a/shaders/terrain/cliffy_hills.fragmentshader +++ b/shaders/terrain/cliffy_hills.fragmentshader @@ -60,9 +60,6 @@ vec3 calcNormal( in vec3 pos ) return normalize(nor); } -#define PI64 (3.1415926535897932384626433832795028841971693993) -#define PI32 (3.14159265358979) - float CosineInterpolate( float t, f32 y1, f32 y2 ) { @@ -211,13 +208,36 @@ void main() // { v3 Period = V3(1500.f); - float Amplitude = 500.f; - f32 StartingZDepth = 1000; + float Amplitude = 100.f; + f32 StartingZDepth = 10000; /* f32 StartingZDepth = 0; */ s32 Octaves = 6; - NoiseValue = StartingZDepth; +#if 1 + { + f32 Start = 8000; + f32 End = 10000; + f32 Width = End-Start; + f32 Rad = Width/2.f; + /* f32 Power = 2000.f; */ + /* f32 Power = 0.001f; */ + f32 Power = 1000.f; + + f32 CircleOrigin = Start + Rad; + + /* if (Basis.x > Start && Basis.y > Start && */ + /* Basis.x < End && Basis.y < End) */ + { + v2 OriginRelativeBasis = 0.30f*((Basis.xy-CircleOrigin)/Rad); + /* v2 t = sin(PI32*(0.5f+(OriginRelativeBasis/Width))); */ + /* f32 t = sin(PI32*max(0.f, Rad - length(OriginRelativeBasis))); */ + f32 t = sin( Rad - length(OriginRelativeBasis)); + /* NoiseValue += min(t.x*Power, t.y*Power); */ + NoiseValue += t*Power; + } + } +#endif v3 Deriv = v3(0.f); f32 warp = 0.f; @@ -227,33 +247,13 @@ void main() v3 xyz = Basis / (Period/Octave); v4 gn = gradient_noise_derivs(xyz+warp); - /* gn.x = MapNoiseValueToFinal(gn.x); */ - /* v4 gn = value_noise_derivs(xyz+warp); */ NoiseValue += gn.x*(Amplitude/Octave); - /* Deriv += calcNormal(Basis); */ Deriv += gn.yzw; - - /* v4 gn = COL(xyz+warp)*8; */ - /* f32 fractal = DE(xyz/1.3f); */ - /* NoiseValue += fractal * Amplitude; */ - /* gn.x = fractal; */ - - /* v3 v = voronoi_noise(Basis/160); */ - /* NoiseValue += v.x*150; */ - /* NoiseValue += v.x*50; */ - /* ColorValue += v3(v.y); */ - - /* ColorValue = bad_hash(Basis); */ - - /* NoiseValue = NoiseValue + (gn.x * (Amplitude/Octave)); */ } v3 Up = V3(0, 0, 1); - /* NoiseValue = MapNoiseValueToFinal(NoiseValue); */ - - /* NoiseValue = pow(NoiseValue, 1.0); */ - /* NoiseValue = pow(NoiseValue, 1.0); */ + /* NoiseValue = 100.f+MapNoiseValueToFinal(NoiseValue); */ Deriv = normalize(Deriv); /* Deriv.xy = abs(Deriv.xy); */ @@ -272,6 +272,7 @@ void main() } +#if 1 f32 rng2d = white_noise(Basis.xy); f32 rng3d = white_noise(Basis); @@ -411,6 +412,9 @@ void main() NoiseValue += NoiseToTile; } #endif +#endif + + /* NoiseValue = StartingZDepth; */ } diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index d33ec2ebe..361427292 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -191,7 +191,7 @@ void main() { NoiseValue = NoiseValue - NoiseSample; } break; case 2: // Threshold - { if (NoiseSample > Threshold) NoiseValue = NoiseSample; } break; + { if (NoiseSample > Threshold) NoiseValue = Threshold; } break; } diff --git a/src/engine/editor.h b/src/engine/editor.h index 949c962fc..5f4212f3f 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -692,6 +692,7 @@ struct white_noise_params r32 Threshold = 0.5f; }; + struct perlin_noise_params { r32 Threshold = 0.f; poof(@ui_value_range(0.f, 1.f)) @@ -858,6 +859,8 @@ struct shape_layer // them and your parameter selections stay intact. world_update_op_shape_params_sphere Sphere; world_update_op_shape_params_rect Rect; + + f32 Threshold = 0.f; poof(@ui_value_range(0.f, 1.f)) }; // NOTE(Jesse): This is intentionally not a d_union such that you can flip diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index f57d4e798..d6b3e1d6b 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -387,6 +387,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { shape_layer *Shape = &Layer->Settings.Shape; BindUniformByName(&WorldEditRC->Program, "ShapeType", Shape->Type); + BindUniformByName(&WorldEditRC->Program, "Threshold", Shape->Threshold); switch(Shape->Type) { case ShapeType_Sphere: { } break; From aac46611552cbc97c822e0d0d8b9e7416af1611c Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 13 Apr 2025 13:01:34 -0700 Subject: [PATCH 200/421] Fix two typos in world_edit.fragmentshader --- examples/terrain_gen/game_constants.h | 4 ++-- external/bonsai_stdlib | 2 +- shaders/terrain/world_edit.fragmentshader | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 5e34a31c3..c5e13fd10 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -16,9 +16,9 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km */ /* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ -g_VisibleRegion = Chunk_Dimension(1024, 1024, 1024); +/* g_VisibleRegion = Chunk_Dimension(1024, 1024, 1024); */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ -/* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ +g_VisibleRegion = Chunk_Dimension(256, 256, 256); /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 0f55bfa65..27983517f 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 0f55bfa651c54549441e32afe7a696cf587fa548 +Subproject commit 27983517ffde7f3fcef5398cf9cd14b65714fa20 diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 361427292..8e2f583f1 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -6,6 +6,8 @@ uniform int BlendMode; uniform int ColorMode; uniform int Modifiers; +uniform int GenerateNormals; + // // Clipping params @@ -210,10 +212,10 @@ void main() { ColorValue = ColorValue - ColorSample; } break; case 4: // Multiply - { ColorValue = ColorValue - ColorSample; } break; + { ColorValue = ColorValue * ColorSample; } break; case 5: // Divide - { ColorValue = ColorValue - ColorSample; } break; + { ColorValue = SafeDivide0(ColorValue, ColorSample); } break; case 6: // Average { f32 StartingIntensity = length(ColorValue); From bc54f9f2528223f73595cd8525556539548b485a Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 13 Apr 2025 18:51:46 -0700 Subject: [PATCH 201/421] Split terrain gen into two phase shaping/decoration. --- examples/terrain_gen/game.cpp | 56 ++-- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- generated/deserialize_struct_level_header.h | 12 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 22 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...struct_terrain_decoration_render_context.h | 151 ++++++++++ ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 151 ++++++++++ ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + .../gen_constructor_gpu_readback_buffer.h | 2 +- generated/serialize_struct_level_header.h | 12 +- ...r_magic_struct_terrain_decoration_shader.h | 53 ++++ ...c_struct_terrain_finalize_render_context.h | 2 +- ...ader_magic_struct_terrain_shaping_shader.h | 53 ++++ .../shader_magic_struct_world_edit_shader.h | 2 +- .../terrain_decoration.fragmentshader | 258 ++++++++++++++++++ .../{ => shaping}/cliffy_hills.fragmentshader | 0 .../dottedboxguy_arch.fragmentshader | 0 .../{ => shaping}/gradient.fragmentshader | 0 .../{ => shaping}/mandlebulb.fragmentshader | 0 .../terrain_shaping.fragmentshader} | 0 .../{ => shaping}/trunchet.fragmentshader | 0 .../{ => shaping}/voronoi.fragmentshader | 0 src/engine/api.cpp | 2 +- src/engine/editor.cpp | 24 +- src/engine/graphics.h | 29 +- src/engine/level.h | 3 +- src/engine/render/render_init.cpp | 60 ++-- src/engine/render_loop.cpp | 45 ++- 42 files changed, 885 insertions(+), 83 deletions(-) create mode 100644 generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h create mode 100644 generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h create mode 100644 generated/shader_magic_struct_terrain_decoration_shader.h create mode 100644 generated/shader_magic_struct_terrain_shaping_shader.h create mode 100644 shaders/terrain/decoration/terrain_decoration.fragmentshader rename shaders/terrain/{ => shaping}/cliffy_hills.fragmentshader (100%) rename shaders/terrain/{ => shaping}/dottedboxguy_arch.fragmentshader (100%) rename shaders/terrain/{ => shaping}/gradient.fragmentshader (100%) rename shaders/terrain/{ => shaping}/mandlebulb.fragmentshader (100%) rename shaders/terrain/{default.fragmentshader => shaping/terrain_shaping.fragmentshader} (100%) rename shaders/terrain/{ => shaping}/trunchet.fragmentshader (100%) rename shaders/terrain/{ => shaping}/voronoi.fragmentshader (100%) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 06cfb14e7..441d5e965 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -813,29 +813,53 @@ BONSAI_API_MAIN_THREAD_CALLBACK() f32 dt = Plat->dt; f32 Speed = 80.f; - global_variable window_layout Window = WindowLayout("Terrain Gen", WindowLayoutFlag_Align_Right); + { + global_variable window_layout Window = WindowLayout("Terrain Shaping Shader", WindowLayoutFlag_Align_Right); + PushWindowStart(Ui, &Window); + file_traversal_node_block_array Files = GetLexicographicallySortedListOfFilesInDirectory(CSz("shaders/terrain/shaping"), GetTranArena()); - PushWindowStart(Ui, &Window); - file_traversal_node_block_array Files = GetLexicographicallySortedListOfFilesInDirectory(CSz("shaders/terrain"), GetTranArena()); + u32 I = 0; + IterateOver(&Files, FileNode, FileNodeIndex) + { + if (FileNode->Type == FileTraversalType_File) + { + if (Button(Ui, FileNode->Name, UiId(&Window, "shader file name", I++))) + { + // Force engine to reload new shader + Resources->Graphics.TerrainShapingRC.Program.FragSourceFilename = Concat(FileNode->Dir, CSz("/"), FileNode->Name, GetTranArena()); + Resources->Graphics.TerrainShapingRC.Program.FragmentTimeModifiedWhenLoaded = 0; + } + PushNewRow(Ui); + } - u32 I = 0; - IterateOver(&Files, FileNode, FileNodeIndex) - { - if (FileNode->Type == FileTraversalType_File) + } + PushWindowEnd(Ui, &Window); + } + + { + global_variable window_layout Window = WindowLayout("Terrain Decoration Shader", WindowLayoutFlag_Align_BottomRight); + PushWindowStart(Ui, &Window); + file_traversal_node_block_array Files = GetLexicographicallySortedListOfFilesInDirectory(CSz("shaders/terrain/decoration"), GetTranArena()); + + u32 I = 0; + IterateOver(&Files, FileNode, FileNodeIndex) { - if (Button(Ui, FileNode->Name, UiId(&Window, "shader file name", I++))) + if (FileNode->Type == FileTraversalType_File) { - // Force engine to reload new shader - Resources->Graphics.TerrainGenRC.Program.FragSourceFilename = Concat(FileNode->Dir, CSz("/"), FileNode->Name, GetTranArena()); - Resources->Graphics.TerrainGenRC.Program.FragmentTimeModifiedWhenLoaded = 0; + if (Button(Ui, FileNode->Name, UiId(&Window, "shader file name", I++))) + { + // Force engine to reload new shader + Resources->Graphics.TerrainDecorationRC.Program.FragSourceFilename = Concat(FileNode->Dir, CSz("/"), FileNode->Name, GetTranArena()); + Resources->Graphics.TerrainDecorationRC.Program.FragmentTimeModifiedWhenLoaded = 0; + } + PushNewRow(Ui); } - PushNewRow(Ui); + } + PushWindowEnd(Ui, &Window); + } + - } - - /* ui_toggle_button_group TerrainGenTypeRadio = RadioButtonGroup_terrain_gen_type(Ui, &Window, CSz("Terrain Generators"), &GameState->TerrainGenType, &DefaultUiRenderParams_Generic, ToggleButtonGroupFlags_DrawVertical); */ - PushWindowEnd(Ui, &Window); /* Info("%S :: %d", ToString(GameState->TerrainGenType), GameState->TerrainGenType); */ diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 8cb31601c..7b6c16b52 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:98:0 +// src/engine/graphics.h:115:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 7583583c4..f745bcef4 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:87:0 +// src/engine/graphics.h:104:0 diff --git a/generated/deserialize_struct_level_header.h b/generated/deserialize_struct_level_header.h index 8dd581ac1..2b0193bb1 100644 --- a/generated/deserialize_struct_level_header.h +++ b/generated/deserialize_struct_level_header.h @@ -64,7 +64,17 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena { umm Count = (256); - Result &= Deserialize(Bytes, Element->TerrainGenShader, Memory, Count); + Result &= Deserialize(Bytes, Element->TerrainShapingShader, Memory, Count); + } + + + + + + { + umm Count = (256); + + Result &= Deserialize(Bytes, Element->TerrainDecorationShader, Memory, Count); } diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 5744d0e25..c897650bf 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:434:0 +// src/engine/editor.cpp:437:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 19f4344c9..d82218783 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:455:0 +// src/engine/editor.cpp:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 28ce7d558..d02f90308 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:452:0 +// src/engine/editor.cpp:455:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 7c360b336..bc2542395 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:425:0 +// src/engine/editor.cpp:428:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -411,8 +411,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(terrain_gen_render_context*, &Element->TerrainGenRC), - CSz("TerrainGenRC"), + Cast(terrain_shaping_render_context*, &Element->TerrainShapingRC), + CSz("TerrainShapingRC"), + Params + ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(terrain_decoration_render_context*, &Element->TerrainDecorationRC), + CSz("TerrainDecorationRC"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 997ca039f..5bb5a93d5 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:449:0 +// src/engine/editor.cpp:452:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index c10af6e70..c2f594e6d 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:440:0 +// src/engine/editor.cpp:443:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 2e7e4bd09..f8033931f 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:428:0 +// src/engine/editor.cpp:431:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h new file mode 100644 index 000000000..3730d5a70 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -0,0 +1,151 @@ +// src/engine/editor.cpp:419:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_decoration_render_context", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Program), + CSz("Program"), + Params + ); + + + + + + + + + + if (ToggleButton(Ui, CSz("v Uniforms[3]"), CSz("> Uniforms[3]"), UiId(Window, "toggle terrain_decoration_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 3) + { + DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, Element->NoiseTexture), + CSz("NoiseTexture"), + Params + ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(framebuffer*, Element->FBO), + CSz("FBO"), + Params + ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ChunkDim), + CSz("ChunkDim"), + Params + ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->WorldspaceBasis), + CSz("WorldspaceBasis"), + Params + ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ChunkResolution), + CSz("ChunkResolution"), + Params + ); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index fecf7146c..0f241f2b6 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:419:0 +// src/engine/editor.cpp:422:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h new file mode 100644 index 000000000..66eeb6346 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -0,0 +1,151 @@ +// src/engine/editor.cpp:416:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_shaping_render_context", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Program), + CSz("Program"), + Params + ); + + + + + + + + + + if (ToggleButton(Ui, CSz("v Uniforms[3]"), CSz("> Uniforms[3]"), UiId(Window, "toggle terrain_shaping_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 3) + { + DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->NoiseTexture), + CSz("NoiseTexture"), + Params + ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(framebuffer*, &Element->FBO), + CSz("FBO"), + Params + ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ChunkDim), + CSz("ChunkDim"), + Params + ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->WorldspaceBasis), + CSz("WorldspaceBasis"), + Params + ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ChunkResolution), + CSz("ChunkResolution"), + Params + ); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 585df33f7..c67e51bd3 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:422:0 +// src/engine/editor.cpp:425:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index a8ad7631e..eb33ce1c1 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:431:0 +// src/engine/editor.cpp:434:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index ced15ad1d..02950e41b 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:437:0 +// src/engine/editor.cpp:440:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 43f3f8461..def747574 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:443:0 +// src/engine/editor.cpp:446:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index d2063d1c1..f5b8c8b77 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:446:0 +// src/engine/editor.cpp:449:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 15180e99b..e05271d72 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -219,6 +219,7 @@ + struct render_to_texture_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index cd26ab40a..561b722fd 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -219,6 +219,7 @@ + render_to_texture_async_params render_to_texture_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 40f6f7525..c3a098a9b 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -219,6 +219,7 @@ + type_render_to_texture_async_params, diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index 1408e9270..79ad12e43 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:84:0 +// src/engine/graphics.h:101:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/serialize_struct_level_header.h b/generated/serialize_struct_level_header.h index b8734b5ac..c371b0152 100644 --- a/generated/serialize_struct_level_header.h +++ b/generated/serialize_struct_level_header.h @@ -79,7 +79,17 @@ Serialize(u8_cursor_block_array *Bytes, level_header *BaseElement, umm Count = 1 { umm ThisCount = (256); - Result &= Serialize(Bytes, Element->TerrainGenShader, ThisCount); + Result &= Serialize(Bytes, Element->TerrainShapingShader, ThisCount); + } + + + + + + { + umm ThisCount = (256); + + Result &= Serialize(Bytes, Element->TerrainDecorationShader, ThisCount); } diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h new file mode 100644 index 000000000..dacc9149a --- /dev/null +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -0,0 +1,53 @@ +// src/engine/graphics.h:36:0 + +link_internal void +InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) +{ + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/terrain_decoration.fragmentshader")); + + u32 UniformIndex = 0; + + Struct->ChunkDim = ChunkDim; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkDim, "ChunkDim"); + ++UniformIndex; + + Struct->WorldspaceBasis = WorldspaceBasis; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->WorldspaceBasis, "WorldspaceBasis"); + ++UniformIndex; + + Struct->ChunkResolution = ChunkResolution; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); + ++UniformIndex; + + if (UniformIndex != 3 ) + { + Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots!"); + } + + + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); +} + +link_internal void +UseShader( terrain_decoration_render_context *Struct ) +{ + GL.UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + if (UniformIndex != 3 ) + { + Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots!"); + } +} + diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index d861b4e1a..d208cc516 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:54:0 +// src/engine/graphics.h:71:0 link_internal void InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct , texture *InputTex ) diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h new file mode 100644 index 000000000..d0ca58a31 --- /dev/null +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -0,0 +1,53 @@ +// src/engine/graphics.h:33:0 + +link_internal void +InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) +{ + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/terrain_shaping.fragmentshader")); + + u32 UniformIndex = 0; + + Struct->ChunkDim = ChunkDim; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkDim, "ChunkDim"); + ++UniformIndex; + + Struct->WorldspaceBasis = WorldspaceBasis; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->WorldspaceBasis, "WorldspaceBasis"); + ++UniformIndex; + + Struct->ChunkResolution = ChunkResolution; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); + ++UniformIndex; + + if (UniformIndex != 3 ) + { + Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots!"); + } + + + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); +} + +link_internal void +UseShader( terrain_shaping_render_context *Struct ) +{ + GL.UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + if (UniformIndex != 3 ) + { + Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots!"); + } +} + diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index 2407cdd24..273969d06 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:39:0 +// src/engine/graphics.h:56:0 link_internal void InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *ChunkDim , v3 *WorldspaceBasis , v3 *ChunkResolution , s32 Type ) diff --git a/shaders/terrain/decoration/terrain_decoration.fragmentshader b/shaders/terrain/decoration/terrain_decoration.fragmentshader new file mode 100644 index 000000000..84b5049b4 --- /dev/null +++ b/shaders/terrain/decoration/terrain_decoration.fragmentshader @@ -0,0 +1,258 @@ +uniform v3 WorldspaceBasis; +uniform v3 ChunkResolution; + +uniform sampler2D InputTex; + +in vec2 UV; +out v4 Output; +/* layout (location = 0) out float Output; */ + + +// https://www.shadertoy.com/view/4dffRH +// +// +// +// The MIT License +// Copyright © 2017 Inigo Quilez +// 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. +// +// https://www.youtube.com/c/InigoQuilez +// https://iquilezles.org/ + +// Computes the analytic derivatives of a 3D Gradient Noise. This can be used for example to compute normals to a +// 3d rocks based on Gradient Noise without approximating the gradient by having to take central differences. +// +// More info here: https://iquilezles.org/articles/gradientnoise + +// All noise functions here: +// +// https://www.shadertoy.com/playlist/fXlXzf&from=0&num=12 + + +// 0: integer hash +// 1: float hash (aliasing based) +#define METHOD 1 + +// 0: cubic +// 1: quintic +#define INTERPOLANT 1 + + +#if METHOD==0 +vec3 hash( ivec3 p ) // this hash is not production ready, please +{ // replace this by something better + ivec3 n = ivec3( p.x*127 + p.y*311 + p.z*74, + p.x*269 + p.y*183 + p.z*246, + p.x*113 + p.y*271 + p.z*124); + + // 1D hash by Hugo Elias + n = (n << 13) ^ n; + n = n * (n * n * 15731 + 789221) + 1376312589; + return -1.0+2.0*vec3( n & ivec3(0x0fffffff))/float(0x0fffffff); +} + +#else +vec3 hash( vec3 p ) // this hash is not production ready, please +{ // replace this by something better + p = vec3( dot(p,vec3(127.1,311.7, 74.7)), + dot(p,vec3(269.5,183.3,246.1)), + dot(p,vec3(113.5,271.9,124.6))); + + return -1.0 + 2.0*fract(sin(p)*43758.5453123); +} +#endif + +vec4 gradient_noise_derivs( in vec3 x ) +{ + // grid + #if METHOD==0 + ivec3 i = ivec3(floor(x)); + #else + vec3 i = floor(x); + #endif + vec3 f = fract(x); + + #if INTERPOLANT==1 + // quintic interpolant + vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); + vec3 du = 30.0*f*f*(f*(f-2.0)+1.0); + #else + // cubic interpolant + vec3 u = f*f*(3.0-2.0*f); + vec3 du = 6.0*f*(1.0-f); + #endif + + // gradients + #if METHOD==0 + vec3 ga = hash( i+ivec3(0,0,0) ); + vec3 gb = hash( i+ivec3(1,0,0) ); + vec3 gc = hash( i+ivec3(0,1,0) ); + vec3 gd = hash( i+ivec3(1,1,0) ); + vec3 ge = hash( i+ivec3(0,0,1) ); + vec3 gf = hash( i+ivec3(1,0,1) ); + vec3 gg = hash( i+ivec3(0,1,1) ); + vec3 gh = hash( i+ivec3(1,1,1) ); + #else + vec3 ga = hash( i+vec3(0.0,0.0,0.0) ); + vec3 gb = hash( i+vec3(1.0,0.0,0.0) ); + vec3 gc = hash( i+vec3(0.0,1.0,0.0) ); + vec3 gd = hash( i+vec3(1.0,1.0,0.0) ); + vec3 ge = hash( i+vec3(0.0,0.0,1.0) ); + vec3 gf = hash( i+vec3(1.0,0.0,1.0) ); + vec3 gg = hash( i+vec3(0.0,1.0,1.0) ); + vec3 gh = hash( i+vec3(1.0,1.0,1.0) ); + #endif + + // projections + float va = dot( ga, f-vec3(0.0,0.0,0.0) ); + float vb = dot( gb, f-vec3(1.0,0.0,0.0) ); + float vc = dot( gc, f-vec3(0.0,1.0,0.0) ); + float vd = dot( gd, f-vec3(1.0,1.0,0.0) ); + float ve = dot( ge, f-vec3(0.0,0.0,1.0) ); + float vf = dot( gf, f-vec3(1.0,0.0,1.0) ); + float vg = dot( gg, f-vec3(0.0,1.0,1.0) ); + float vh = dot( gh, f-vec3(1.0,1.0,1.0) ); + + // interpolations + return vec4( va + u.x*(vb-va) + u.y*(vc-va) + u.z*(ve-va) + u.x*u.y*(va-vb-vc+vd) + u.y*u.z*(va-vc-ve+vg) + u.z*u.x*(va-vb-ve+vf) + (-va+vb+vc-vd+ve-vf-vg+vh)*u.x*u.y*u.z, // value + ga + u.x*(gb-ga) + u.y*(gc-ga) + u.z*(ge-ga) + u.x*u.y*(ga-gb-gc+gd) + u.y*u.z*(ga-gc-ge+gg) + u.z*u.x*(ga-gb-ge+gf) + (-ga+gb+gc-gd+ge-gf-gg+gh)*u.x*u.y*u.z + // derivatives + du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); +} + +// Doesn't support integer hashing +#if METHOD == 1 +float gradient_noise( in vec3 p ) +{ + vec3 i = floor( p ); + vec3 f = fract( p ); + + #if INTERPOLANT==1 + // quintic interpolant + vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); + #else + // cubic interpolant + vec3 u = f*f*(3.0-2.0*f); + #endif + + return mix( mix( mix( dot( hash( i + vec3(0.0,0.0,0.0) ), f - vec3(0.0,0.0,0.0) ), + dot( hash( i + vec3(1.0,0.0,0.0) ), f - vec3(1.0,0.0,0.0) ), u.x), + mix( dot( hash( i + vec3(0.0,1.0,0.0) ), f - vec3(0.0,1.0,0.0) ), + dot( hash( i + vec3(1.0,1.0,0.0) ), f - vec3(1.0,1.0,0.0) ), u.x), u.y), + mix( mix( dot( hash( i + vec3(0.0,0.0,1.0) ), f - vec3(0.0,0.0,1.0) ), + dot( hash( i + vec3(1.0,0.0,1.0) ), f - vec3(1.0,0.0,1.0) ), u.x), + mix( dot( hash( i + vec3(0.0,1.0,1.0) ), f - vec3(0.0,1.0,1.0) ), + dot( hash( i + vec3(1.0,1.0,1.0) ), f - vec3(1.0,1.0,1.0) ), u.x), u.y), u.z ); +} +#endif + +vec3 vhash(vec3 UV, vec3 offset) +{ + mat3 m = mat3(127.1,311.7, 74.7,269.5,183.3,246.1,113.5,271.9,124.6); + UV = fract(sin(UV* m) * 46839.32); + return vec3(sin(UV.z * +offset.x) * 0.5 + 0.5, cos(UV.x* offset.y) * 0.5 + 0.5,tan(UV.y * offset.z) * 0.5 + 0.5); +} + +vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) +{ + vec3 g = floor(p * CellDensity); + vec3 f = fract(p * CellDensity); + float res = 8.0; + float md=8.0; + vec3 mr; + vec4 Out; + for( int z=-1; z<=1; z++ ) + for( int y=-1; y<=1; y++ ) + for( int x=-1; x<=1; x++ ) + { + vec3 lattice = vec3(x,y,z); + vec3 offset=vhash(lattice + g ,AngleOffset); + vec3 r = lattice +offset -f; + float d = dot( r, r ); + if (d < res) + { + res=d; + mr=r; + } + } + + res = 8.0; + for( int z=-1; z<=1; z++ ) + for( int y=-1; y<=1; y++ ) + for( int x=-1; x<=1; x++ ) + { + vec3 lattice = vec3(x,y,z); + vec3 offset=vhash(lattice + g ,AngleOffset); + vec3 r = lattice +offset -f; + float d = dot( r, r ); + if( d < res ) + { + res = d; + Out.x= offset.x; + Out.y = d; + } + if( dot(mr-r,mr-r)>0.00001) + { + md = min( md, dot( 0.5*(mr+r), normalize(r-mr) ) ); + } + } + Out.z = mix(1.0, 0.0, smoothstep( 0.0, 0.1, md )); + Out.w = 1.0-smoothstep( 0.0, 0.1, res); + return Out; +} + + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); + + v3 Offset = V3(-1, -1, -1); + v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + + v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); + + // NOTE(Jesse): Set these in the -- user code -- section + vec3 ColorValue = TexLookup.rgb; + f32 NoiseValue = TexLookup.a; + + // + // -- user code -- + // + { + + f32 White = white_noise(Basis); + if (White > 0.3f) + { + NoiseValue += 2.f; + ColorValue = V3(1.f, 0.f, 0.f); + } + + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; + + /* uint SolidBit = NoiseValue > 0.f ? 1u : 0u; */ + /* uint PackedColor = PackRGB(ColorValue); */ + /* /1* uint PackedColor = 3543u; *1/ */ + + /* Output = (SolidBit << 15) | PackedColor; */ +} diff --git a/shaders/terrain/cliffy_hills.fragmentshader b/shaders/terrain/shaping/cliffy_hills.fragmentshader similarity index 100% rename from shaders/terrain/cliffy_hills.fragmentshader rename to shaders/terrain/shaping/cliffy_hills.fragmentshader diff --git a/shaders/terrain/dottedboxguy_arch.fragmentshader b/shaders/terrain/shaping/dottedboxguy_arch.fragmentshader similarity index 100% rename from shaders/terrain/dottedboxguy_arch.fragmentshader rename to shaders/terrain/shaping/dottedboxguy_arch.fragmentshader diff --git a/shaders/terrain/gradient.fragmentshader b/shaders/terrain/shaping/gradient.fragmentshader similarity index 100% rename from shaders/terrain/gradient.fragmentshader rename to shaders/terrain/shaping/gradient.fragmentshader diff --git a/shaders/terrain/mandlebulb.fragmentshader b/shaders/terrain/shaping/mandlebulb.fragmentshader similarity index 100% rename from shaders/terrain/mandlebulb.fragmentshader rename to shaders/terrain/shaping/mandlebulb.fragmentshader diff --git a/shaders/terrain/default.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader similarity index 100% rename from shaders/terrain/default.fragmentshader rename to shaders/terrain/shaping/terrain_shaping.fragmentshader diff --git a/shaders/terrain/trunchet.fragmentshader b/shaders/terrain/shaping/trunchet.fragmentshader similarity index 100% rename from shaders/terrain/trunchet.fragmentshader rename to shaders/terrain/shaping/trunchet.fragmentshader diff --git a/shaders/terrain/voronoi.fragmentshader b/shaders/terrain/shaping/voronoi.fragmentshader similarity index 100% rename from shaders/terrain/voronoi.fragmentshader rename to shaders/terrain/shaping/voronoi.fragmentshader diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 559532873..b35deb909 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -87,7 +87,7 @@ Bonsai_FrameBegin(engine_resources *Resources) // Resources->FrameIndex += 1; - if (Resources->Graphics.TerrainGenRC.Program.HotReloaded) + if (Resources->Graphics.TerrainShapingRC.Program.HotReloaded || Resources->Graphics.TerrainDecorationRC.Program.HotReloaded) { auto Plat = &Resources->Stdlib.Plat; diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 868101d09..0765727ba 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -413,8 +413,11 @@ poof(do_editor_ui_for_compound_type(lighting_render_group)) poof(do_editor_ui_for_compound_type(g_buffer_render_group)) #include -poof(do_editor_ui_for_compound_type(terrain_gen_render_context)) -#include +poof(do_editor_ui_for_compound_type(terrain_shaping_render_context)) +#include + +poof(do_editor_ui_for_compound_type(terrain_decoration_render_context)) +#include poof(do_editor_ui_for_compound_type(terrain_finalize_render_context)) #include @@ -3060,9 +3063,16 @@ DoLevelWindow(engine_resources *Engine) Header.EntityCount = EntityCount; Header.EditCount = u32(TotalElements(&Editor->WorldEdits)); - cs TerrainFragShaderFilename = Engine->Graphics.TerrainGenRC.Program.FragSourceFilename; - cs Dest = CS(Header.TerrainGenShader, NameBuf_Len); - CopyString(&TerrainFragShaderFilename, &Dest); + { + cs Filename = Engine->Graphics.TerrainShapingRC.Program.FragSourceFilename; + cs Dest = CS(Header.TerrainShapingShader, NameBuf_Len); + CopyString(&Filename, &Dest); + } + { + cs Filename = Engine->Graphics.TerrainDecorationRC.Program.FragSourceFilename; + cs Dest = CS(Header.TerrainDecorationShader, NameBuf_Len); + CopyString(&Filename, &Dest); + } Serialize(&OutputStream, &Header); @@ -3150,8 +3160,8 @@ DoLevelWindow(engine_resources *Engine) /* Global_ProjectSwitcherGameLibName = LevelHeader.TerrainGenShader; */ - Engine->Graphics.TerrainGenRC.Program.FragSourceFilename = CopyString(LevelHeader.TerrainGenShader, Thread->PermMemory); - /* Engine->Graphics.TerrainGenRC.Program.FragmentTimeModifiedWhenLoaded = 0; */ + Engine->Graphics.TerrainShapingRC.Program.FragSourceFilename = CopyString(LevelHeader.TerrainShapingShader, Thread->PermMemory); + Engine->Graphics.TerrainDecorationRC.Program.FragSourceFilename = CopyString(LevelHeader.TerrainDecorationShader, Thread->PermMemory); // Must come after we fill out the VisibleRegion so the root octree node // gets initialized to the correct size diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 8aa3f3736..0977d5b0c 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -1,8 +1,8 @@ -struct terrain_gen_render_context +struct terrain_shaping_render_context poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") - @frag_source_file("shaders/terrain/default.fragmentshader") ) + @frag_source_file("shaders/terrain/shaping/terrain_shaping.fragmentshader") ) { shader Program; shader_uniform Uniforms[3]; @@ -14,10 +14,27 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader v3 ChunkResolution; poof(@uniform) }; +struct terrain_decoration_render_context +poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") + @frag_source_file("shaders/terrain/decoration/terrain_decoration.fragmentshader") ) +{ + shader Program; + shader_uniform Uniforms[3]; + texture *NoiseTexture; + framebuffer *FBO; + + v3 ChunkDim; poof(@uniform) + v3 WorldspaceBasis; poof(@uniform) + v3 ChunkResolution; poof(@uniform) +}; + -poof(shader_magic(terrain_gen_render_context)) -#include +poof(shader_magic(terrain_shaping_render_context)) +#include + +poof(shader_magic(terrain_decoration_render_context)) +#include struct world_edit_render_context @@ -155,7 +172,9 @@ struct graphics gaussian_render_group Gaussian; composite_render_group CompositeGroup; - terrain_gen_render_context TerrainGenRC; + terrain_shaping_render_context TerrainShapingRC; + terrain_decoration_render_context TerrainDecorationRC; + terrain_finalize_render_context TerrainFinalizeRC; world_edit_render_context WorldEditRC; diff --git a/src/engine/level.h b/src/engine/level.h index e81dee24d..95255c8b6 100644 --- a/src/engine/level.h +++ b/src/engine/level.h @@ -13,5 +13,6 @@ struct level_header render_settings RenderSettings; - char TerrainGenShader[NameBuf_Len]; + char TerrainShapingShader[NameBuf_Len]; + char TerrainDecorationShader[NameBuf_Len]; }; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 3f0257d0c..ec5798cc0 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -787,25 +787,6 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr v3 ChunkDim = V3(66, 66, 66); - // - // Terrain Gen RC - // - { - terrain_gen_render_context *TerrainGenRC = &Result->TerrainGenRC; - InitializeTerrainGenRenderContext(TerrainGenRC, ChunkDim, {}, {}); - - TerrainGenRC->FBO = GenFramebuffer(); - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainGenRC->FBO.ID); - - v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); - TerrainGenRC->NoiseTexture = MakeTexture_RGBA(TextureDim, Cast(v4*, 0), CSz("TerrainNoiseTexture"), 1, TextureStorageFormat_RGBA32F); - - FramebufferTexture(&TerrainGenRC->FBO, &TerrainGenRC->NoiseTexture); - SetDrawBuffers(&TerrainGenRC->FBO); - - Ensure(CheckAndClearFramebuffer()); - } - // // World Edit RC // @@ -813,8 +794,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr world_edit_render_context *WorldEditRC = &Result->WorldEditRC; { - terrain_gen_render_context *TerrainGenRC = &Result->TerrainGenRC; - InitializeWorldEditRenderContext(WorldEditRC, &TerrainGenRC->ChunkDim, &TerrainGenRC->WorldspaceBasis, &TerrainGenRC->ChunkResolution, {}); + terrain_shaping_render_context *TerrainShapingRC = &Result->TerrainShapingRC; + InitializeWorldEditRenderContext(WorldEditRC, &TerrainShapingRC->ChunkDim, &TerrainShapingRC->WorldspaceBasis, &TerrainShapingRC->ChunkResolution, {}); } RangeIterator(Index, 2) @@ -832,6 +813,41 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr } } + // + // Terrain Gen + // + { + terrain_shaping_render_context *TerrainShapingRC = &Result->TerrainShapingRC; + InitializeTerrainShapingRenderContext(TerrainShapingRC, ChunkDim, {}, {}); + + TerrainShapingRC->FBO = GenFramebuffer(); + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainShapingRC->FBO.ID); + + v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); + TerrainShapingRC->NoiseTexture = MakeTexture_RGBA(TextureDim, Cast(v4*, 0), CSz("TerrainNoiseTexture"), 1, TextureStorageFormat_RGBA32F); + + FramebufferTexture(&TerrainShapingRC->FBO, &TerrainShapingRC->NoiseTexture); + SetDrawBuffers(&TerrainShapingRC->FBO); + + Ensure(CheckAndClearFramebuffer()); + } + { + world_edit_render_context *WorldEditRC = &Result->WorldEditRC; + terrain_decoration_render_context *TerrainDecorationRC = &Result->TerrainDecorationRC; + InitializeTerrainDecorationRenderContext(TerrainDecorationRC, ChunkDim, {}, {}); + + TerrainDecorationRC->FBO = &WorldEditRC->PingPongFBOs[0]; + TerrainDecorationRC->NoiseTexture = &WorldEditRC->PingPongTextures[0]; + + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->FBO->ID); + + FramebufferTexture(TerrainDecorationRC->FBO, TerrainDecorationRC->NoiseTexture); + SetDrawBuffers(TerrainDecorationRC->FBO); + + Ensure(CheckAndClearFramebuffer()); + } + + // // Terrain Finalize RC @@ -856,7 +872,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr SetDrawBuffers(&Result->TerrainFinalizeRC.FBO); - InitializeTerrainFinalizeRenderContext(TerrainFinalizeRC, &Result->TerrainGenRC.NoiseTexture); + InitializeTerrainFinalizeRenderContext(TerrainFinalizeRC, &Result->TerrainShapingRC.NoiseTexture); Ensure(CheckAndClearFramebuffer()); } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index d6b3e1d6b..4cf7f4611 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -272,22 +272,22 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) Assert(s64(Chunk) == s64(Chunk1)); - v3 NoiseDim = Graphics->TerrainGenRC.ChunkDim; + v3 NoiseDim = Graphics->TerrainShapingRC.ChunkDim; v2i ViewportSize = V2i(s32(NoiseDim.x), s32(NoiseDim.y*NoiseDim.z)); { - auto *TerrainGenRC = &Graphics->TerrainGenRC; + auto *TerrainShapingRC = &Graphics->TerrainShapingRC; v3i Apron = V3i(2, 2, 2); Assert(V3(Chunk1->Dim+Apron) == NoiseDim); - TerrainGenRC->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); - TerrainGenRC->ChunkResolution = V3(Chunk->DimInChunks); + TerrainShapingRC->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); + TerrainShapingRC->ChunkResolution = V3(Chunk->DimInChunks); TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainGenRC->FBO.ID); + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainShapingRC->FBO.ID); SetViewport(ViewportSize); - UseShader(TerrainGenRC); + UseShader(TerrainShapingRC); /* gpu_timer Timer = StartGpuTimer(); */ RenderQuad(); @@ -297,15 +297,42 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; } + texture *InputTex = &Graphics->TerrainShapingRC.NoiseTexture; + s32 PingPongIndex = 0; + + { + auto *TerrainDecorationRC = &Graphics->TerrainDecorationRC; + v3i Apron = V3i(2, 2, 2); + Assert(V3(Chunk1->Dim+Apron) == NoiseDim); + + TerrainDecorationRC->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); + TerrainDecorationRC->ChunkResolution = V3(Chunk->DimInChunks); + + TIMED_NAMED_BLOCK(TerrainDrawCall); + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->FBO->ID); + + SetViewport(ViewportSize); + UseShader(TerrainDecorationRC); + + BindUniformByName(&TerrainDecorationRC->Program, "InputTex", InputTex, 0); + + /* gpu_timer Timer = StartGpuTimer(); */ + RenderQuad(); + /* EndGpuTimer(&Timer); */ + /* Push(&Graphics->GpuTimers, &Timer); */ + + AssertNoGlErrors; + } + + world_edit_render_context *WorldEditRC = &Graphics->WorldEditRC; + InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; + PingPongIndex = (PingPongIndex + 1) & 1; - texture *InputTex = &Graphics->TerrainGenRC.NoiseTexture; #if 1 { AcquireFutex(&Node->Lock); - s32 PingPongIndex = 0; if (TotalElements(&Node->Edits)) { - world_edit_render_context *WorldEditRC = &Graphics->WorldEditRC; AssertNoGlErrors; UseShader(WorldEditRC); From 8da5f46a21a7e4fe49cb94a72077a093a55b56c4 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 14 Apr 2025 09:36:37 -0700 Subject: [PATCH 202/421] Remove a redundant texture and FBO --- ...pe_struct_terrain_shaping_render_context.h | 4 ++-- src/engine/graphics.h | 12 +++++------ src/engine/render/render_init.cpp | 20 +++++++++---------- src/engine/render_loop.cpp | 4 ++-- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 66eeb6346..3583d93d9 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -63,7 +63,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->NoiseTexture), + Cast(texture*, Element->NoiseTexture), CSz("NoiseTexture"), Params ); @@ -79,7 +79,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*, &Element->FBO), + Cast(framebuffer*, Element->FBO), CSz("FBO"), Params ); diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 0977d5b0c..5e87f6128 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -6,8 +6,8 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader { shader Program; shader_uniform Uniforms[3]; - texture NoiseTexture; - framebuffer FBO; + texture *NoiseTexture; + framebuffer *FBO; v3 ChunkDim; poof(@uniform) v3 WorldspaceBasis; poof(@uniform) @@ -18,10 +18,10 @@ struct terrain_decoration_render_context poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") @frag_source_file("shaders/terrain/decoration/terrain_decoration.fragmentshader") ) { - shader Program; - shader_uniform Uniforms[3]; - texture *NoiseTexture; - framebuffer *FBO; + shader Program; + shader_uniform Uniforms[3]; + texture *NoiseTexture; + framebuffer *FBO; v3 ChunkDim; poof(@uniform) v3 WorldspaceBasis; poof(@uniform) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index ec5798cc0..5d0a7a2e2 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -790,8 +790,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr // // World Edit RC // + world_edit_render_context *WorldEditRC = &Result->WorldEditRC; { - world_edit_render_context *WorldEditRC = &Result->WorldEditRC; { terrain_shaping_render_context *TerrainShapingRC = &Result->TerrainShapingRC; @@ -820,24 +820,22 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr terrain_shaping_render_context *TerrainShapingRC = &Result->TerrainShapingRC; InitializeTerrainShapingRenderContext(TerrainShapingRC, ChunkDim, {}, {}); - TerrainShapingRC->FBO = GenFramebuffer(); - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainShapingRC->FBO.ID); + TerrainShapingRC->FBO = &WorldEditRC->PingPongFBOs[0]; + TerrainShapingRC->NoiseTexture = &WorldEditRC->PingPongTextures[0]; - v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); - TerrainShapingRC->NoiseTexture = MakeTexture_RGBA(TextureDim, Cast(v4*, 0), CSz("TerrainNoiseTexture"), 1, TextureStorageFormat_RGBA32F); + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainShapingRC->FBO->ID); - FramebufferTexture(&TerrainShapingRC->FBO, &TerrainShapingRC->NoiseTexture); - SetDrawBuffers(&TerrainShapingRC->FBO); + FramebufferTexture(TerrainShapingRC->FBO, TerrainShapingRC->NoiseTexture); + SetDrawBuffers(TerrainShapingRC->FBO); Ensure(CheckAndClearFramebuffer()); } { - world_edit_render_context *WorldEditRC = &Result->WorldEditRC; terrain_decoration_render_context *TerrainDecorationRC = &Result->TerrainDecorationRC; InitializeTerrainDecorationRenderContext(TerrainDecorationRC, ChunkDim, {}, {}); - TerrainDecorationRC->FBO = &WorldEditRC->PingPongFBOs[0]; - TerrainDecorationRC->NoiseTexture = &WorldEditRC->PingPongTextures[0]; + TerrainDecorationRC->FBO = &WorldEditRC->PingPongFBOs[1]; + TerrainDecorationRC->NoiseTexture = &WorldEditRC->PingPongTextures[1]; GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->FBO->ID); @@ -872,7 +870,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr SetDrawBuffers(&Result->TerrainFinalizeRC.FBO); - InitializeTerrainFinalizeRenderContext(TerrainFinalizeRC, &Result->TerrainShapingRC.NoiseTexture); + InitializeTerrainFinalizeRenderContext(TerrainFinalizeRC, Result->TerrainShapingRC.NoiseTexture); Ensure(CheckAndClearFramebuffer()); } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 4cf7f4611..010cd0211 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -284,7 +284,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TerrainShapingRC->ChunkResolution = V3(Chunk->DimInChunks); TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainShapingRC->FBO.ID); + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainShapingRC->FBO->ID); SetViewport(ViewportSize); UseShader(TerrainShapingRC); @@ -297,7 +297,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; } - texture *InputTex = &Graphics->TerrainShapingRC.NoiseTexture; + texture *InputTex = Graphics->TerrainShapingRC.NoiseTexture; s32 PingPongIndex = 0; { From 9008aeb060736347338c33fd92a12b93fc91a79f Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 14 Apr 2025 11:23:24 -0700 Subject: [PATCH 203/421] Fix InputTex index bug --- external/bonsai_stdlib | 2 +- .../terrain_decoration.fragmentshader | 231 ++---------------- .../terrain/shaping/FBM_small.fragmentshader | 64 +++++ .../shaping/cliffy_hills.fragmentshader | 64 ----- .../shaping/terrain_shaping.fragmentshader | 57 ----- src/engine/render_loop.cpp | 16 +- 6 files changed, 91 insertions(+), 343 deletions(-) create mode 100644 shaders/terrain/shaping/FBM_small.fragmentshader diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 27983517f..39ec7c41e 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 27983517ffde7f3fcef5398cf9cd14b65714fa20 +Subproject commit 39ec7c41e727a3b97cbe140101c347253950a906 diff --git a/shaders/terrain/decoration/terrain_decoration.fragmentshader b/shaders/terrain/decoration/terrain_decoration.fragmentshader index 84b5049b4..3759f8be3 100644 --- a/shaders/terrain/decoration/terrain_decoration.fragmentshader +++ b/shaders/terrain/decoration/terrain_decoration.fragmentshader @@ -5,213 +5,6 @@ uniform sampler2D InputTex; in vec2 UV; out v4 Output; -/* layout (location = 0) out float Output; */ - - -// https://www.shadertoy.com/view/4dffRH -// -// -// -// The MIT License -// Copyright © 2017 Inigo Quilez -// 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. -// -// https://www.youtube.com/c/InigoQuilez -// https://iquilezles.org/ - -// Computes the analytic derivatives of a 3D Gradient Noise. This can be used for example to compute normals to a -// 3d rocks based on Gradient Noise without approximating the gradient by having to take central differences. -// -// More info here: https://iquilezles.org/articles/gradientnoise - -// All noise functions here: -// -// https://www.shadertoy.com/playlist/fXlXzf&from=0&num=12 - - -// 0: integer hash -// 1: float hash (aliasing based) -#define METHOD 1 - -// 0: cubic -// 1: quintic -#define INTERPOLANT 1 - - -#if METHOD==0 -vec3 hash( ivec3 p ) // this hash is not production ready, please -{ // replace this by something better - ivec3 n = ivec3( p.x*127 + p.y*311 + p.z*74, - p.x*269 + p.y*183 + p.z*246, - p.x*113 + p.y*271 + p.z*124); - - // 1D hash by Hugo Elias - n = (n << 13) ^ n; - n = n * (n * n * 15731 + 789221) + 1376312589; - return -1.0+2.0*vec3( n & ivec3(0x0fffffff))/float(0x0fffffff); -} - -#else -vec3 hash( vec3 p ) // this hash is not production ready, please -{ // replace this by something better - p = vec3( dot(p,vec3(127.1,311.7, 74.7)), - dot(p,vec3(269.5,183.3,246.1)), - dot(p,vec3(113.5,271.9,124.6))); - - return -1.0 + 2.0*fract(sin(p)*43758.5453123); -} -#endif - -vec4 gradient_noise_derivs( in vec3 x ) -{ - // grid - #if METHOD==0 - ivec3 i = ivec3(floor(x)); - #else - vec3 i = floor(x); - #endif - vec3 f = fract(x); - - #if INTERPOLANT==1 - // quintic interpolant - vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); - vec3 du = 30.0*f*f*(f*(f-2.0)+1.0); - #else - // cubic interpolant - vec3 u = f*f*(3.0-2.0*f); - vec3 du = 6.0*f*(1.0-f); - #endif - - // gradients - #if METHOD==0 - vec3 ga = hash( i+ivec3(0,0,0) ); - vec3 gb = hash( i+ivec3(1,0,0) ); - vec3 gc = hash( i+ivec3(0,1,0) ); - vec3 gd = hash( i+ivec3(1,1,0) ); - vec3 ge = hash( i+ivec3(0,0,1) ); - vec3 gf = hash( i+ivec3(1,0,1) ); - vec3 gg = hash( i+ivec3(0,1,1) ); - vec3 gh = hash( i+ivec3(1,1,1) ); - #else - vec3 ga = hash( i+vec3(0.0,0.0,0.0) ); - vec3 gb = hash( i+vec3(1.0,0.0,0.0) ); - vec3 gc = hash( i+vec3(0.0,1.0,0.0) ); - vec3 gd = hash( i+vec3(1.0,1.0,0.0) ); - vec3 ge = hash( i+vec3(0.0,0.0,1.0) ); - vec3 gf = hash( i+vec3(1.0,0.0,1.0) ); - vec3 gg = hash( i+vec3(0.0,1.0,1.0) ); - vec3 gh = hash( i+vec3(1.0,1.0,1.0) ); - #endif - - // projections - float va = dot( ga, f-vec3(0.0,0.0,0.0) ); - float vb = dot( gb, f-vec3(1.0,0.0,0.0) ); - float vc = dot( gc, f-vec3(0.0,1.0,0.0) ); - float vd = dot( gd, f-vec3(1.0,1.0,0.0) ); - float ve = dot( ge, f-vec3(0.0,0.0,1.0) ); - float vf = dot( gf, f-vec3(1.0,0.0,1.0) ); - float vg = dot( gg, f-vec3(0.0,1.0,1.0) ); - float vh = dot( gh, f-vec3(1.0,1.0,1.0) ); - - // interpolations - return vec4( va + u.x*(vb-va) + u.y*(vc-va) + u.z*(ve-va) + u.x*u.y*(va-vb-vc+vd) + u.y*u.z*(va-vc-ve+vg) + u.z*u.x*(va-vb-ve+vf) + (-va+vb+vc-vd+ve-vf-vg+vh)*u.x*u.y*u.z, // value - ga + u.x*(gb-ga) + u.y*(gc-ga) + u.z*(ge-ga) + u.x*u.y*(ga-gb-gc+gd) + u.y*u.z*(ga-gc-ge+gg) + u.z*u.x*(ga-gb-ge+gf) + (-ga+gb+gc-gd+ge-gf-gg+gh)*u.x*u.y*u.z + // derivatives - du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); -} - -// Doesn't support integer hashing -#if METHOD == 1 -float gradient_noise( in vec3 p ) -{ - vec3 i = floor( p ); - vec3 f = fract( p ); - - #if INTERPOLANT==1 - // quintic interpolant - vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); - #else - // cubic interpolant - vec3 u = f*f*(3.0-2.0*f); - #endif - - return mix( mix( mix( dot( hash( i + vec3(0.0,0.0,0.0) ), f - vec3(0.0,0.0,0.0) ), - dot( hash( i + vec3(1.0,0.0,0.0) ), f - vec3(1.0,0.0,0.0) ), u.x), - mix( dot( hash( i + vec3(0.0,1.0,0.0) ), f - vec3(0.0,1.0,0.0) ), - dot( hash( i + vec3(1.0,1.0,0.0) ), f - vec3(1.0,1.0,0.0) ), u.x), u.y), - mix( mix( dot( hash( i + vec3(0.0,0.0,1.0) ), f - vec3(0.0,0.0,1.0) ), - dot( hash( i + vec3(1.0,0.0,1.0) ), f - vec3(1.0,0.0,1.0) ), u.x), - mix( dot( hash( i + vec3(0.0,1.0,1.0) ), f - vec3(0.0,1.0,1.0) ), - dot( hash( i + vec3(1.0,1.0,1.0) ), f - vec3(1.0,1.0,1.0) ), u.x), u.y), u.z ); -} -#endif - -vec3 vhash(vec3 UV, vec3 offset) -{ - mat3 m = mat3(127.1,311.7, 74.7,269.5,183.3,246.1,113.5,271.9,124.6); - UV = fract(sin(UV* m) * 46839.32); - return vec3(sin(UV.z * +offset.x) * 0.5 + 0.5, cos(UV.x* offset.y) * 0.5 + 0.5,tan(UV.y * offset.z) * 0.5 + 0.5); -} - -vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) -{ - vec3 g = floor(p * CellDensity); - vec3 f = fract(p * CellDensity); - float res = 8.0; - float md=8.0; - vec3 mr; - vec4 Out; - for( int z=-1; z<=1; z++ ) - for( int y=-1; y<=1; y++ ) - for( int x=-1; x<=1; x++ ) - { - vec3 lattice = vec3(x,y,z); - vec3 offset=vhash(lattice + g ,AngleOffset); - vec3 r = lattice +offset -f; - float d = dot( r, r ); - if (d < res) - { - res=d; - mr=r; - } - } - - res = 8.0; - for( int z=-1; z<=1; z++ ) - for( int y=-1; y<=1; y++ ) - for( int x=-1; x<=1; x++ ) - { - vec3 lattice = vec3(x,y,z); - vec3 offset=vhash(lattice + g ,AngleOffset); - vec3 r = lattice +offset -f; - float d = dot( r, r ); - if( d < res ) - { - res = d; - Out.x= offset.x; - Out.y = d; - } - if( dot(mr-r,mr-r)>0.00001) - { - md = min( md, dot( 0.5*(mr+r), normalize(r-mr) ) ); - } - } - Out.z = mix(1.0, 0.0, smoothstep( 0.0, 0.1, md )); - Out.w = 1.0-smoothstep( 0.0, 0.1, res); - return Out; -} void main() @@ -220,7 +13,8 @@ void main() f32 z = floor(gl_FragCoord.y / 66); f32 y = floor(gl_FragCoord.y - (z*66)); - v3 Offset = V3(-1, -1, -1); + /* v3 Offset = V3(-1, -1, -1); */ + v3 Offset = V3(0); v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); @@ -230,16 +24,21 @@ void main() f32 NoiseValue = TexLookup.a; // - // -- user code -- + // -- user code -- // { - - f32 White = white_noise(Basis); - if (White > 0.3f) - { - NoiseValue += 2.f; - ColorValue = V3(1.f, 0.f, 0.f); - } + /* f32 White = white_noise(Basis); */ + /* ColorValue = V3(0.f); */ + /* ColorValue.r = White*0.3f; */ + ColorValue = Basis/1000.f; + /* ColorValue = V3(x,y,z); */ + /* ColorValue = ChunkResolution/100.f; */ + /* ColorValue = V3(1.f, 0.f, 0.f); */ + /* if (White > 0.5f) */ + /* { */ + /* NoiseValue += 2.f; */ + /* ColorValue = V3(1.f, 0.f, 0.f); */ + /* } */ } diff --git a/shaders/terrain/shaping/FBM_small.fragmentshader b/shaders/terrain/shaping/FBM_small.fragmentshader new file mode 100644 index 000000000..26f46a677 --- /dev/null +++ b/shaders/terrain/shaping/FBM_small.fragmentshader @@ -0,0 +1,64 @@ +uniform v3 WorldspaceBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out v4 Output; + + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); + + /* v3 Offset = V3(-1, -1, -1); */ + v3 Offset = V3(0); + v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + + v3 Period = V3(1500.f); + float Amplitude = 150.f; + f32 StartingZDepth = 1000; + /* f32 StartingZDepth = 0; */ + s32 Octaves = 6; + NoiseValue = StartingZDepth; + + f32 warp = 0.f; + + for (s32 Octave = 1; Octave <= Octaves; ++Octave) + { + v3 xyz = Basis / (Period/Octave); + + f32 gn = gradient_noise_derivs(xyz+warp).x; + NoiseValue += gn*(Amplitude/Octave); + } + + NoiseValue -= Basis.z; + ColorValue = V3(0.2f, 0.8f, 0.15f); + /* ColorValue = Basis/1000.f; */ + /* ColorValue = V3(x,y,z); */ + /* ColorValue = ChunkResolution/100.f; */ + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; + + /* uint SolidBit = NoiseValue > 0.f ? 1u : 0u; */ + /* ColorValue = min(ColorValue, v3(1.f)); */ + /* uint PackedColor = PackRGB(ColorValue); */ + /* /1* uint PackedColor = 3543u; *1/ */ + + /* Output = (SolidBit << 15) | PackedColor; */ +} diff --git a/shaders/terrain/shaping/cliffy_hills.fragmentshader b/shaders/terrain/shaping/cliffy_hills.fragmentshader index 15ad44edd..ea5f97128 100644 --- a/shaders/terrain/shaping/cliffy_hills.fragmentshader +++ b/shaders/terrain/shaping/cliffy_hills.fragmentshader @@ -7,70 +7,6 @@ out v4 Output; -// return value noise (in x) and its derivatives (in yzw) -// -vec4 gradient_noise_derivs( in vec3 x ) -{ - // grid - ivec3 i = ivec3(floor(x)); - vec3 f = fract(x); - - #if INTERPOLANT==1 - // quintic interpolant - vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); - vec3 du = 30.0*f*f*(f*(f-2.0)+1.0); - #else - // cubic interpolant - vec3 u = f*f*(3.0-2.0*f); - vec3 du = 6.0*f*(1.0-f); - #endif - - // gradients - vec3 ga = ivhash( i+ivec3(0,0,0) ); - vec3 gb = ivhash( i+ivec3(1,0,0) ); - vec3 gc = ivhash( i+ivec3(0,1,0) ); - vec3 gd = ivhash( i+ivec3(1,1,0) ); - vec3 ge = ivhash( i+ivec3(0,0,1) ); - vec3 gf = ivhash( i+ivec3(1,0,1) ); - vec3 gg = ivhash( i+ivec3(0,1,1) ); - vec3 gh = ivhash( i+ivec3(1,1,1) ); - - // projections - float va = dot( ga, f-vec3(0.0,0.0,0.0) ); - float vb = dot( gb, f-vec3(1.0,0.0,0.0) ); - float vc = dot( gc, f-vec3(0.0,1.0,0.0) ); - float vd = dot( gd, f-vec3(1.0,1.0,0.0) ); - float ve = dot( ge, f-vec3(0.0,0.0,1.0) ); - float vf = dot( gf, f-vec3(1.0,0.0,1.0) ); - float vg = dot( gg, f-vec3(0.0,1.0,1.0) ); - float vh = dot( gh, f-vec3(1.0,1.0,1.0) ); - - // interpolations - return vec4( va + u.x*(vb-va) + u.y*(vc-va) + u.z*(ve-va) + u.x*u.y*(va-vb-vc+vd) + u.y*u.z*(va-vc-ve+vg) + u.z*u.x*(va-vb-ve+vf) + (-va+vb+vc-vd+ve-vf-vg+vh)*u.x*u.y*u.z, // value - ga + u.x*(gb-ga) + u.y*(gc-ga) + u.z*(ge-ga) + u.x*u.y*(ga-gb-gc+gd) + u.y*u.z*(ga-gc-ge+gg) + u.z*u.x*(ga-gb-ge+gf) + (-ga+gb+gc-gd+ge-gf-gg+gh)*u.x*u.y*u.z + // derivatives - du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); -} - -vec3 calcNormal( in vec3 pos ) -{ - vec2 eps = vec2( 0.0001, 0.0 ); - vec3 nor = vec3( value_noise_derivs(pos+eps.xyy).x - value_noise_derivs(pos-eps.xyy).x, - value_noise_derivs(pos+eps.yxy).x - value_noise_derivs(pos-eps.yxy).x, - value_noise_derivs(pos+eps.yyx).x - value_noise_derivs(pos-eps.yyx).x ); - return normalize(nor); -} - -float -CosineInterpolate( float t, f32 y1, f32 y2 ) -{ - float t2 = (1.f-cos(t*PI32))/2.f; - float nt2 = (1.f-t2); - - f32 a = y1*nt2; - f32 b = y2*t2; - return(a+b); -} - f32 MapNoiseValueToFinal(f32 Value) { diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index 534ae6de9..f904c2767 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -73,63 +73,6 @@ vec3 hash( vec3 p ) // this hash is not production ready, please } #endif -vec4 gradient_noise_derivs( in vec3 x ) -{ - // grid - #if METHOD==0 - ivec3 i = ivec3(floor(x)); - #else - vec3 i = floor(x); - #endif - vec3 f = fract(x); - - #if INTERPOLANT==1 - // quintic interpolant - vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); - vec3 du = 30.0*f*f*(f*(f-2.0)+1.0); - #else - // cubic interpolant - vec3 u = f*f*(3.0-2.0*f); - vec3 du = 6.0*f*(1.0-f); - #endif - - // gradients - #if METHOD==0 - vec3 ga = hash( i+ivec3(0,0,0) ); - vec3 gb = hash( i+ivec3(1,0,0) ); - vec3 gc = hash( i+ivec3(0,1,0) ); - vec3 gd = hash( i+ivec3(1,1,0) ); - vec3 ge = hash( i+ivec3(0,0,1) ); - vec3 gf = hash( i+ivec3(1,0,1) ); - vec3 gg = hash( i+ivec3(0,1,1) ); - vec3 gh = hash( i+ivec3(1,1,1) ); - #else - vec3 ga = hash( i+vec3(0.0,0.0,0.0) ); - vec3 gb = hash( i+vec3(1.0,0.0,0.0) ); - vec3 gc = hash( i+vec3(0.0,1.0,0.0) ); - vec3 gd = hash( i+vec3(1.0,1.0,0.0) ); - vec3 ge = hash( i+vec3(0.0,0.0,1.0) ); - vec3 gf = hash( i+vec3(1.0,0.0,1.0) ); - vec3 gg = hash( i+vec3(0.0,1.0,1.0) ); - vec3 gh = hash( i+vec3(1.0,1.0,1.0) ); - #endif - - // projections - float va = dot( ga, f-vec3(0.0,0.0,0.0) ); - float vb = dot( gb, f-vec3(1.0,0.0,0.0) ); - float vc = dot( gc, f-vec3(0.0,1.0,0.0) ); - float vd = dot( gd, f-vec3(1.0,1.0,0.0) ); - float ve = dot( ge, f-vec3(0.0,0.0,1.0) ); - float vf = dot( gf, f-vec3(1.0,0.0,1.0) ); - float vg = dot( gg, f-vec3(0.0,1.0,1.0) ); - float vh = dot( gh, f-vec3(1.0,1.0,1.0) ); - - // interpolations - return vec4( va + u.x*(vb-va) + u.y*(vc-va) + u.z*(ve-va) + u.x*u.y*(va-vb-vc+vd) + u.y*u.z*(va-vc-ve+vg) + u.z*u.x*(va-vb-ve+vf) + (-va+vb+vc-vd+ve-vf-vg+vh)*u.x*u.y*u.z, // value - ga + u.x*(gb-ga) + u.y*(gc-ga) + u.z*(ge-ga) + u.x*u.y*(ga-gb-gc+gd) + u.y*u.z*(ga-gc-ge+gg) + u.z*u.x*(ga-gb-ge+gf) + (-ga+gb+gc-gd+ge-gf-gg+gh)*u.x*u.y*u.z + // derivatives - du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); -} - // Doesn't support integer hashing #if METHOD == 1 float gradient_noise( in vec3 p ) diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 010cd0211..12a3ae9ed 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -297,8 +297,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; } - texture *InputTex = Graphics->TerrainShapingRC.NoiseTexture; - s32 PingPongIndex = 0; + world_edit_render_context *WorldEditRC = &Graphics->WorldEditRC; + texture *InputTex = &WorldEditRC->PingPongTextures[0]; { auto *TerrainDecorationRC = &Graphics->TerrainDecorationRC; @@ -308,6 +308,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TerrainDecorationRC->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); TerrainDecorationRC->ChunkResolution = V3(Chunk->DimInChunks); + /* v3 WP = V3(Chunk->WorldP) * V3(64); */ + /* Info("Chunk->WorldP(%V3)", &WP); */ + TIMED_NAMED_BLOCK(TerrainDrawCall); GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->FBO->ID); @@ -324,11 +327,14 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; } - world_edit_render_context *WorldEditRC = &Graphics->WorldEditRC; - InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; - PingPongIndex = (PingPongIndex + 1) & 1; + InputTex = &WorldEditRC->PingPongTextures[1]; + s32 PingPongIndex = 0; #if 1 + // + // Apply edits + // + { AcquireFutex(&Node->Lock); if (TotalElements(&Node->Edits)) From 7001c5bde7e3b6bd171e025059fdc30dee61ddd8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 14 Apr 2025 18:08:26 -0700 Subject: [PATCH 204/421] Computing normals on the GPU --- external/bonsai_stdlib | 2 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 16 +++++++ ...struct_terrain_decoration_render_context.h | 28 ++++++++--- ...pe_struct_terrain_shaping_render_context.h | 8 ++-- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + .../gen_constructor_gpu_readback_buffer.h | 2 +- generated/shader_magic_struct.h | 36 +++++++++++++++ ...r_magic_struct_terrain_decoration_shader.h | 17 +++++-- ...gic_struct_terrain_derivs_render_context.h | 43 +++++++++++++++++ ...c_struct_terrain_finalize_render_context.h | 2 +- ...ader_magic_struct_terrain_shaping_shader.h | 2 +- .../shader_magic_struct_world_edit_shader.h | 2 +- jesse.make.sh | 2 +- .../terrain_decoration.fragmentshader | 32 +++++++------ shaders/terrain/derivs.fragmentshader | 37 +++++++++++++++ .../shaping/terrain_shaping.fragmentshader | 32 +++---------- src/engine/api.cpp | 4 +- src/engine/graphics.h | 28 +++++++++-- src/engine/render/render_init.cpp | 43 +++++++++++------ src/engine/render_loop.cpp | 46 +++++++++++-------- 24 files changed, 287 insertions(+), 102 deletions(-) create mode 100644 generated/shader_magic_struct.h create mode 100644 generated/shader_magic_struct_terrain_derivs_render_context.h create mode 100644 shaders/terrain/derivs.fragmentshader diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 39ec7c41e..d41a889ab 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 39ec7c41e727a3b97cbe140101c347253950a906 +Subproject commit d41a889abcf8b392d2bd3b8940171712c0e7c749 diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 7b6c16b52..ee632bcad 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:115:0 +// src/engine/graphics.h:132:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index f745bcef4..6a070beea 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:104:0 +// src/engine/graphics.h:121:0 diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index bc2542395..6bb3c0b86 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -440,6 +440,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(terrain_derivs_render_context*, &Element->TerrainDerivsRC), + CSz("TerrainDerivsRC"), + Params + ); + + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 3730d5a70..e572b0118 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -42,11 +42,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con - if (ToggleButton(Ui, CSz("v Uniforms[3]"), CSz("> Uniforms[3]"), UiId(Window, "toggle terrain_decoration_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + if (ToggleButton(Ui, CSz("v Uniforms[4]"), CSz("> Uniforms[4]"), UiId(Window, "toggle terrain_decoration_render_context shader_uniform Uniforms", Element->Uniforms), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 3) + RangeIterator(ArrayIndex, 4) { DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); @@ -63,8 +63,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*, Element->NoiseTexture), - CSz("NoiseTexture"), + Cast(texture*, Element->DestTex), + CSz("DestTex"), Params ); @@ -79,8 +79,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*, Element->FBO), - CSz("FBO"), + Cast(framebuffer*, Element->DestFBO), + CSz("DestFBO"), + Params + ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, Element->DerivsTex), + CSz("DerivsTex"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 3583d93d9..70ae5b161 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -63,8 +63,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*, Element->NoiseTexture), - CSz("NoiseTexture"), + Cast(texture*, Element->DestTex), + CSz("DestTex"), Params ); @@ -79,8 +79,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*, Element->FBO), - CSz("FBO"), + Cast(framebuffer*, Element->DestFBO), + CSz("DestFBO"), Params ); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index e05271d72..384efb3a6 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -730,6 +730,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 561b722fd..d768f2fd4 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -720,6 +720,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index c3a098a9b..73570f4a2 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -720,6 +720,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index 79ad12e43..4111bcfba 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:101:0 +// src/engine/graphics.h:118:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/shader_magic_struct.h b/generated/shader_magic_struct.h new file mode 100644 index 000000000..5a855881e --- /dev/null +++ b/generated/shader_magic_struct.h @@ -0,0 +1,36 @@ +// src/engine/graphics.h:53:0 + +link_internal void +InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct ) +{ + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/derivs.fragmentshader")); + + u32 UniformIndex = 0; + + + + if (UniformIndex != 3 ) + { + Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots!"); + } + + + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); +} + +link_internal void +UseShader( terrain_derivs_render_context *Struct ) +{ + GL.UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + + + if (UniformIndex != 3 ) + { + Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots!"); + } +} + diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index dacc9149a..37e5c41fd 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -1,13 +1,17 @@ -// src/engine/graphics.h:36:0 +// src/engine/graphics.h:51:0 link_internal void -InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) +InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Struct , texture *DerivsTex , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) { Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/terrain_decoration.fragmentshader")); u32 UniformIndex = 0; - Struct->ChunkDim = ChunkDim; + Struct->DerivsTex = DerivsTex; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->DerivsTex, "DerivsTex"); + ++UniformIndex; + + Struct->ChunkDim = ChunkDim; Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkDim, "ChunkDim"); ++UniformIndex; @@ -19,7 +23,7 @@ InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Str Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); ++UniformIndex; - if (UniformIndex != 3 ) + if (UniformIndex != 4 ) { Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots!"); } @@ -45,7 +49,10 @@ UseShader( terrain_decoration_render_context *Struct ) BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - if (UniformIndex != 3 ) + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + if (UniformIndex != 4 ) { Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots!"); } diff --git a/generated/shader_magic_struct_terrain_derivs_render_context.h b/generated/shader_magic_struct_terrain_derivs_render_context.h new file mode 100644 index 000000000..6bd78010d --- /dev/null +++ b/generated/shader_magic_struct_terrain_derivs_render_context.h @@ -0,0 +1,43 @@ +// src/engine/graphics.h:54:0 + +link_internal void +InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct , v3 Ignored ) +{ + Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/derivs.fragmentshader")); + + u32 UniformIndex = 0; + + Struct->Ignored = Ignored; + Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->Ignored, "Ignored"); + ++UniformIndex; + + + + if (UniformIndex != 1 ) + { + Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots!"); + } + + + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); +} + +link_internal void +UseShader( terrain_derivs_render_context *Struct ) +{ + GL.UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + + + if (UniformIndex != 1 ) + { + Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots!"); + } +} + diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index d208cc516..c3c307b57 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:71:0 +// src/engine/graphics.h:88:0 link_internal void InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct , texture *InputTex ) diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index d0ca58a31..4789f19ed 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:33:0 +// src/engine/graphics.h:48:0 link_internal void InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index 273969d06..4d84e279d 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:56:0 +// src/engine/graphics.h:73:0 link_internal void InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *ChunkDim , v3 *WorldspaceBasis , v3 *ChunkResolution , s32 Type ) diff --git a/jesse.make.sh b/jesse.make.sh index 81197b57f..4a47e50e2 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/decoration/terrain_decoration.fragmentshader b/shaders/terrain/decoration/terrain_decoration.fragmentshader index 3759f8be3..9746cfce9 100644 --- a/shaders/terrain/decoration/terrain_decoration.fragmentshader +++ b/shaders/terrain/decoration/terrain_decoration.fragmentshader @@ -2,6 +2,7 @@ uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; uniform sampler2D InputTex; +uniform sampler2D DerivsTex; in vec2 UV; out v4 Output; @@ -17,7 +18,9 @@ void main() v3 Offset = V3(0); v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); - v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); + v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); + v3 Derivs = texelFetch(DerivsTex, ivec2(gl_FragCoord.xy), 0).xyz; + /* v3 Derivs = texelFetch(DerivsTex, ivec2(gl_FragCoord.xy+ivec2(1,66)), 0).xyz; */ // NOTE(Jesse): Set these in the -- user code -- section vec3 ColorValue = TexLookup.rgb; @@ -26,20 +29,23 @@ void main() // // -- user code -- // + { - /* f32 White = white_noise(Basis); */ - /* ColorValue = V3(0.f); */ - /* ColorValue.r = White*0.3f; */ - ColorValue = Basis/1000.f; - /* ColorValue = V3(x,y,z); */ - /* ColorValue = ChunkResolution/100.f; */ - /* ColorValue = V3(1.f, 0.f, 0.f); */ - /* if (White > 0.5f) */ - /* { */ - /* NoiseValue += 2.f; */ - /* ColorValue = V3(1.f, 0.f, 0.f); */ - /* } */ + // Put random junk here + + f32 White = Clamp01(1.5f+white_noise(Basis)); + + v3 Green = V3(0.1f, 0.7f, 0.1f)*White; + /* ColorValue = V3(White); */ + + f32 CosTheta = Dot(Derivs, Normalize(V3(0,-1,-1))); + ColorValue = Green*CosTheta; + + + /* ColorValue = Derivs; */ + ColorValue = abs(Derivs); + /* ColorValue = NoiseValue/V3(5000.f); */ } // diff --git a/shaders/terrain/derivs.fragmentshader b/shaders/terrain/derivs.fragmentshader new file mode 100644 index 000000000..7a430e420 --- /dev/null +++ b/shaders/terrain/derivs.fragmentshader @@ -0,0 +1,37 @@ +uniform v3 WorldspaceBasis; +uniform v3 ChunkResolution; + +uniform sampler2D InputTex; + +in vec2 UV; +out layout(location = 0) vec3 Output; + + +void main() +{ + f32 CurrentNoiseValue = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0).a; + + s32 x = s32(floor(gl_FragCoord.x)); + s32 z = s32(floor(gl_FragCoord.y / 66)); + s32 y = s32(floor(gl_FragCoord.y - (z*66))); + + v3 Normal = v3(0.f); + + for ( s32 dz = -1; dz < 2; ++ dz) + for ( s32 dy = -1; dy < 2; ++ dy) + for ( s32 dx = -1; dx < 2; ++ dx) + { + if (dz == 0 && dy == 0 && dx == 0) continue; // Skip the middle-most voxel + + s32 xCoord = s32(gl_FragCoord.x) + dx; + s32 yCoord = s32(gl_FragCoord.y) + dy; + s32 zCoord = dz * 66 ; + + f32 Next = texelFetch(InputTex, ivec2(xCoord, yCoord+zCoord), 0).a; + f32 Diff = Next-(dz*ChunkResolution.z) - Truncate(CurrentNoiseValue); + // TODO(Jesse): Recompute with a small random variance to the weight if this is 0? + Normal += V3(dx,dy,dz)*Diff; + } + + Output = Normalize(Normal); +} diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index f904c2767..ae4e12252 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -172,41 +172,21 @@ void main() // -- user code -- // { - v3 Period = V3(100.f); - float Amplitude = 5.f; - f32 StartingZDepth = 400.f; + v3 Period = V3(800.f); + float Amplitude = 4000.f; + f32 StartingZDepth = 1000.f; s32 Octaves = 1; NoiseValue = StartingZDepth; v3 deriv = v3(0.f); - f32 warp = 0.f; v3 xyz = Basis / Period; + v4 gn = gradient_noise_derivs(xyz); - v4 gn = gradient_noise_derivs(xyz+warp); - - deriv += gn.yzw; - deriv = normalize(deriv); - - NoiseValue = NoiseValue + (gn.x * Amplitude); - - /* ColorValue = abs(deriv); */ - /* f32 Tint = white_noise(xyz); */ - f32 Tint = gradient_noise(xyz*60.f); - ColorValue = v3(0.1f, 0.55f + 0.1f*Tint, 0.1f); - - f32 GrassMask = clamp(gradient_noise(xyz*5.f), 0.f, 1.f); - f32 GrassSample = white_noise(V3(xyz.xy,1.f)); - - f32 Grass = GrassSample > 0.88f ? GrassSample*9.f : 0.f; - - NoiseValue += abs(Grass*GrassMask); - - // Bias noise value to lower values as we get higher in z. - // This creates a "plane" of terrain - NoiseValue = NoiseValue - Basis.z; + NoiseValue += gn.x * Amplitude; + NoiseValue -= Basis.z; } // diff --git a/src/engine/api.cpp b/src/engine/api.cpp index b35deb909..1125b3ecf 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -87,7 +87,9 @@ Bonsai_FrameBegin(engine_resources *Resources) // Resources->FrameIndex += 1; - if (Resources->Graphics.TerrainShapingRC.Program.HotReloaded || Resources->Graphics.TerrainDecorationRC.Program.HotReloaded) + if (Resources->Graphics.TerrainShapingRC.Program.HotReloaded || + Resources->Graphics.TerrainDerivsRC.Program.HotReloaded || + Resources->Graphics.TerrainDecorationRC.Program.HotReloaded) { auto Plat = &Resources->Stdlib.Plat; diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 5e87f6128..19b58d8f4 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -6,23 +6,38 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader { shader Program; shader_uniform Uniforms[3]; - texture *NoiseTexture; - framebuffer *FBO; + texture *DestTex; + framebuffer *DestFBO; v3 ChunkDim; poof(@uniform) v3 WorldspaceBasis; poof(@uniform) v3 ChunkResolution; poof(@uniform) }; +struct terrain_derivs_render_context +poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") + @frag_source_file("shaders/terrain/derivs.fragmentshader") ) +{ + shader Program; + shader_uniform Uniforms[1]; + texture DestTexture; + framebuffer FBO; + + v3 Ignored; poof(@uniform) + /* v3 WorldspaceBasis; poof(@uniform) */ + /* v3 ChunkResolution; poof(@uniform) */ +}; + struct terrain_decoration_render_context poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") @frag_source_file("shaders/terrain/decoration/terrain_decoration.fragmentshader") ) { shader Program; - shader_uniform Uniforms[3]; - texture *NoiseTexture; - framebuffer *FBO; + shader_uniform Uniforms[4]; + texture *DestTex; + framebuffer *DestFBO; + texture *DerivsTex ; poof(@uniform) v3 ChunkDim; poof(@uniform) v3 WorldspaceBasis; poof(@uniform) v3 ChunkResolution; poof(@uniform) @@ -36,6 +51,8 @@ poof(shader_magic(terrain_shaping_render_context)) poof(shader_magic(terrain_decoration_render_context)) #include +poof(shader_magic(terrain_derivs_render_context)) +#include struct world_edit_render_context poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") @@ -174,6 +191,7 @@ struct graphics terrain_shaping_render_context TerrainShapingRC; terrain_decoration_render_context TerrainDecorationRC; + terrain_derivs_render_context TerrainDerivsRC; terrain_finalize_render_context TerrainFinalizeRC; world_edit_render_context WorldEditRC; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 5d0a7a2e2..fb6d0e126 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -791,6 +791,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr // World Edit RC // world_edit_render_context *WorldEditRC = &Result->WorldEditRC; + v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); { { @@ -803,7 +804,6 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr WorldEditRC->PingPongFBOs[Index] = GenFramebuffer(); GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[Index].ID); - v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); WorldEditRC->PingPongTextures[Index] = MakeTexture_RGBA(TextureDim, Cast(v4*, 0), CSz("PingPongTexture"), 1, TextureStorageFormat_RGBA32F); FramebufferTexture(&WorldEditRC->PingPongFBOs[Index], &WorldEditRC->PingPongTextures[Index]); @@ -820,33 +820,48 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr terrain_shaping_render_context *TerrainShapingRC = &Result->TerrainShapingRC; InitializeTerrainShapingRenderContext(TerrainShapingRC, ChunkDim, {}, {}); - TerrainShapingRC->FBO = &WorldEditRC->PingPongFBOs[0]; - TerrainShapingRC->NoiseTexture = &WorldEditRC->PingPongTextures[0]; + TerrainShapingRC->DestFBO = &WorldEditRC->PingPongFBOs[0]; + TerrainShapingRC->DestTex = &WorldEditRC->PingPongTextures[0]; - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainShapingRC->FBO->ID); + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainShapingRC->DestFBO->ID); - FramebufferTexture(TerrainShapingRC->FBO, TerrainShapingRC->NoiseTexture); - SetDrawBuffers(TerrainShapingRC->FBO); + FramebufferTexture(TerrainShapingRC->DestFBO, TerrainShapingRC->DestTex); + SetDrawBuffers(TerrainShapingRC->DestFBO); + + Ensure(CheckAndClearFramebuffer()); + } + { + terrain_derivs_render_context *RC = &Result->TerrainDerivsRC; + InitializeTerrainDerivsRenderContext(RC, {}); + + RC->FBO = GenFramebuffer(); + RC->DestTexture = MakeTexture_RGB(TextureDim, Cast(v3*, 0), CSz("Derivs Tex"), 1, TextureStorageFormat_RGB32F); + + GL.BindFramebuffer(GL_FRAMEBUFFER, RC->FBO.ID); + + FramebufferTexture(&RC->FBO, &RC->DestTexture); + SetDrawBuffers(&RC->FBO); Ensure(CheckAndClearFramebuffer()); } { terrain_decoration_render_context *TerrainDecorationRC = &Result->TerrainDecorationRC; - InitializeTerrainDecorationRenderContext(TerrainDecorationRC, ChunkDim, {}, {}); + InitializeTerrainDecorationRenderContext(TerrainDecorationRC, &Result->TerrainDerivsRC.DestTexture, ChunkDim, {}, {}); - TerrainDecorationRC->FBO = &WorldEditRC->PingPongFBOs[1]; - TerrainDecorationRC->NoiseTexture = &WorldEditRC->PingPongTextures[1]; + TerrainDecorationRC->DestFBO = &WorldEditRC->PingPongFBOs[1]; + TerrainDecorationRC->DestTex = &WorldEditRC->PingPongTextures[1]; - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->FBO->ID); + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->DestFBO->ID); - FramebufferTexture(TerrainDecorationRC->FBO, TerrainDecorationRC->NoiseTexture); - SetDrawBuffers(TerrainDecorationRC->FBO); + FramebufferTexture(TerrainDecorationRC->DestFBO, TerrainDecorationRC->DestTex); + SetDrawBuffers(TerrainDecorationRC->DestFBO); Ensure(CheckAndClearFramebuffer()); } + // // Terrain Finalize RC // @@ -855,8 +870,6 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Result->TerrainFinalizeRC.FBO = GenFramebuffer(); GL.BindFramebuffer(GL_FRAMEBUFFER, Result->TerrainFinalizeRC.FBO.ID); - - v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); { u32 Channels = 1; u32 Slices = 1; @@ -870,7 +883,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr SetDrawBuffers(&Result->TerrainFinalizeRC.FBO); - InitializeTerrainFinalizeRenderContext(TerrainFinalizeRC, Result->TerrainShapingRC.NoiseTexture); + InitializeTerrainFinalizeRenderContext(TerrainFinalizeRC, Result->TerrainShapingRC.DestTex); Ensure(CheckAndClearFramebuffer()); } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 12a3ae9ed..310bed844 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -274,7 +274,11 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) v3 NoiseDim = Graphics->TerrainShapingRC.ChunkDim; v2i ViewportSize = V2i(s32(NoiseDim.x), s32(NoiseDim.y*NoiseDim.z)); + SetViewport(ViewportSize); + // + // Launch terrain shaping shader + // { auto *TerrainShapingRC = &Graphics->TerrainShapingRC; v3i Apron = V3i(2, 2, 2); @@ -284,15 +288,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TerrainShapingRC->ChunkResolution = V3(Chunk->DimInChunks); TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainShapingRC->FBO->ID); - - SetViewport(ViewportSize); + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainShapingRC->DestFBO->ID); UseShader(TerrainShapingRC); - - /* gpu_timer Timer = StartGpuTimer(); */ RenderQuad(); - /* EndGpuTimer(&Timer); */ - /* Push(&Graphics->GpuTimers, &Timer); */ AssertNoGlErrors; } @@ -300,6 +298,24 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) world_edit_render_context *WorldEditRC = &Graphics->WorldEditRC; texture *InputTex = &WorldEditRC->PingPongTextures[0]; + // + // Calculate derivs of terrain shaping step + // + { + auto *TerrainDerivsRC = &Graphics->TerrainDerivsRC; + + TIMED_NAMED_BLOCK(TerrainDrawCall); + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDerivsRC->FBO.ID); + UseShader(TerrainDerivsRC); + BindUniformByName(&TerrainDerivsRC->Program, "InputTex", InputTex, 0); + RenderQuad(); + + AssertNoGlErrors; + } + + // + // Launch terrain decoration shader + // { auto *TerrainDecorationRC = &Graphics->TerrainDecorationRC; v3i Apron = V3i(2, 2, 2); @@ -308,21 +324,13 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TerrainDecorationRC->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); TerrainDecorationRC->ChunkResolution = V3(Chunk->DimInChunks); - /* v3 WP = V3(Chunk->WorldP) * V3(64); */ - /* Info("Chunk->WorldP(%V3)", &WP); */ - TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->FBO->ID); - - SetViewport(ViewportSize); + GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->DestFBO->ID); UseShader(TerrainDecorationRC); - - BindUniformByName(&TerrainDecorationRC->Program, "InputTex", InputTex, 0); - - /* gpu_timer Timer = StartGpuTimer(); */ + // Using texture unit 1 because the DerivsTex is automatically bound in + // UseShader to unit 0 + BindUniformByName(&TerrainDecorationRC->Program, "InputTex", InputTex, 1); RenderQuad(); - /* EndGpuTimer(&Timer); */ - /* Push(&Graphics->GpuTimers, &Timer); */ AssertNoGlErrors; } From d226759698ff2ff0f86f77e849a7173dd8906cbe Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 14 Apr 2025 18:14:41 -0700 Subject: [PATCH 205/421] Flip normal so it points the right way --- shaders/terrain/decoration/terrain_decoration.fragmentshader | 2 +- shaders/terrain/derivs.fragmentshader | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/shaders/terrain/decoration/terrain_decoration.fragmentshader b/shaders/terrain/decoration/terrain_decoration.fragmentshader index 9746cfce9..70f0d8109 100644 --- a/shaders/terrain/decoration/terrain_decoration.fragmentshader +++ b/shaders/terrain/decoration/terrain_decoration.fragmentshader @@ -39,7 +39,7 @@ void main() v3 Green = V3(0.1f, 0.7f, 0.1f)*White; /* ColorValue = V3(White); */ - f32 CosTheta = Dot(Derivs, Normalize(V3(0,-1,-1))); + f32 CosTheta = Dot(Derivs, Normalize(V3(0,0,1))); ColorValue = Green*CosTheta; diff --git a/shaders/terrain/derivs.fragmentshader b/shaders/terrain/derivs.fragmentshader index 7a430e420..d991bd951 100644 --- a/shaders/terrain/derivs.fragmentshader +++ b/shaders/terrain/derivs.fragmentshader @@ -33,5 +33,7 @@ void main() Normal += V3(dx,dy,dz)*Diff; } - Output = Normalize(Normal); + // Invert because we accumulate the value by pointing 'at' the cell we're checking + // + Output = -1.f * Normalize(Normal); } From a818c1c7884248e573b1dc77c75e9a0daa9c5de1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 15 Apr 2025 10:05:03 -0700 Subject: [PATCH 206/421] Change terrain shaping to write into its own texture --- ...e_struct_terrain_finalize_render_context.h | 4 +- ...pe_struct_terrain_shaping_render_context.h | 4 +- .../terrain_decoration.fragmentshader | 169 +++++++++++++++++- .../shaping/terrain_shaping.fragmentshader | 109 ++++++++++- src/engine/graphics.h | 10 +- src/engine/render/render_init.cpp | 51 +++--- src/engine/render_loop.cpp | 115 ++++++------ 7 files changed, 368 insertions(+), 94 deletions(-) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 0f241f2b6..93f017904 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -63,8 +63,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->DestTexture), - CSz("DestTexture"), + Cast(texture*, &Element->DestTex), + CSz("DestTex"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 70ae5b161..179b56c13 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -63,7 +63,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*, Element->DestTex), + Cast(texture*, &Element->DestTex), CSz("DestTex"), Params ); @@ -79,7 +79,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*, Element->DestFBO), + Cast(framebuffer*, &Element->DestFBO), CSz("DestFBO"), Params ); diff --git a/shaders/terrain/decoration/terrain_decoration.fragmentshader b/shaders/terrain/decoration/terrain_decoration.fragmentshader index 70f0d8109..6006877c5 100644 --- a/shaders/terrain/decoration/terrain_decoration.fragmentshader +++ b/shaders/terrain/decoration/terrain_decoration.fragmentshader @@ -7,6 +7,159 @@ uniform sampler2D DerivsTex; in vec2 UV; out v4 Output; +v4 DoCliffs(v3 Basis, v3 Deriv) +{ + v3 Down = V3(0, 0, -1); + + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + + /* NoiseValue = 100.f+MapNoiseValueToFinal(NoiseValue); */ + + /* Deriv = normalize(Deriv); */ + /* Deriv.xy = abs(Deriv.xy); */ + f32 Cliffness = Clamp01(1.1f+dot(Down, Deriv)); + f32 Grassness = Clamp01(.15f-Cliffness); + + ColorValue = mix(v3(.1,.8,.2), v3(.3), Cliffness); + /* ColorValue = mix(v3(.1,.8,.2), v3(.3), pow(Cliffness, .2)); */ + /* ColorValue = Cliffness > 0.15f ? V3(0.3f) : v3(.1,.8,.2); */ + + // Grassy ripples +#if 0 + { + v4 gWobble = gradient_noise_derivs(Basis/v3(30, 30, 80)); + NoiseValue += gWobble.x*Grassness*50; + ColorValue += V3(0.f, 1.f, 0.f)*gWobble.x*Grassness*1.5f; + } +#endif + + + f32 rng2d = white_noise(Basis.xy); + f32 rng3d = white_noise(Basis); + + v3 BaseCliffColor = V3(0.08f); + v3 CliffColor = BaseCliffColor; + f32 CliffValue = 0.f; + // Main cliffs + { + v3 v = voronoi_noise(Basis/v3(200,200,1800)); + CliffValue += (v.x*200)*Cliffness; + CliffValue += (v.y*50)*Cliffness; + CliffColor = mix(CliffColor, BaseCliffColor, clamp(10*Cliffness*v.x,0,1)); + } +#if 0 + { + v3 v = voronoi_noise(Basis/v3(100,100,600)); + v.x += 0.5f; + v.x = v.x*v.x; + + if (v.x > 0.28f) + { + CliffValue += (v.x*25)*Cliffness; + /* CliffValue += (v.y*10)*Cliffness; */ + CliffColor = mix(CliffColor, v3(.7), Cliffness*v.x); + } + } + { + v3 v = voronoi_noise(Basis/v3(50,50,200)); + v.x += 0.50f; + v.x = v.x * v.x; + + if (v.x > 0.30) + { + /* CliffValue += (v.x)*Cliffness; */ + CliffValue += (v.x*10)*pow(Cliffness,3); + CliffColor = mix(CliffColor, v3(.9), Cliffness*v.x*v.x); + } + } + { + CliffValue += rng3d * 0.1f; + CliffColor = mix(CliffColor, v3(1.f), rng3d*Cliffness*.2); + } +#endif + + if (CliffValue > 12.f) + { + NoiseValue += CliffValue; + ColorValue = CliffColor; + } + +#if 0 + + f32 gravel_patch_stregth = value_noise_derivs(150+(Basis/300)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/160)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/80)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/40)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/20)).x; + gravel_patch_stregth += value_noise_derivs(150+(Basis/8)).x; + gravel_patch_stregth = max(gravel_patch_stregth, 0.f); + + + // Grass & Flowers + { + f32 n = clamp(rng2d-0.7f, 0.f, 1.f); + + f32 GrassValue = 90*n*Grassness; + + f32 tFlower = Basis.z - (GrassValue + NoiseValue); + tFlower = max(tFlower, 0); + + + f32 grass_patch_stregth = value_noise_derivs(Basis/80).x; + grass_patch_stregth += value_noise_derivs(Basis/40).x; + grass_patch_stregth += value_noise_derivs(Basis/20).x; + grass_patch_stregth += value_noise_derivs(Basis/8).x; + grass_patch_stregth = max(grass_patch_stregth-gravel_patch_stregth, 0.f); + + NoiseValue += GrassValue*grass_patch_stregth; + + f32 tColor = (grass_patch_stregth / 2.f)*Grassness; + ColorValue = mix(ColorValue, V3(.6f, .8f, .1f), tColor); + + /* if (rng2d > 0.99f) */ + /* { */ + /* ColorValue = mix(ColorValue, V3(.5f, .5f, .5f), tFlower); */ + /* } */ + /* if (rng2d > 0.995f) */ + /* { */ + /* ColorValue = mix(ColorValue, V3(.5f, .2f, .5f), tFlower); */ + /* } */ + + + /* ColorValue *= tFlower; */ + + /* ColorValue = V3(tFlower); */ + /* ColorValue = V3(GrassValue/1.f); */ + } + + // Rocky edges + { + f32 MinDotValue = 0.6f; + v3 v = voronoi_noise(Basis/v3(20,20,20)); + f32 Power = 100*gravel_patch_stregth*Cliffness*abs(clamp(Cliffness-MinDotValue, -MinDotValue, 0)); + if (v.x*Power > 3.f) + { + NoiseValue += v.x*Power; + ColorValue = v3(1.0); + } + } + /* { */ + /* f32 MinDotValue = 0.4f; */ + /* v3 v = voronoi_noise(Basis/v3(10,10,10)); */ + /* f32 Power = 400*gravel_patch_stregth*Cliffness*abs(clamp(Cliffness-MinDotValue, -MinDotValue, 0)); */ + /* NoiseValue += v.x*Power; */ + /* /1* NoiseValue -= ((1.f/v.x)*2)*Power; *1/ */ + /* ColorValue = mix(ColorValue, v3(1.0), Power/3*v.x); */ + /* } */ + +#endif + + /* ColorValue = V3(Grassness, Cliffness, 0.f); */ + /* ColorValue = V3(Cliffness); */ + + return V4(ColorValue, NoiseValue); +} void main() { @@ -39,13 +192,23 @@ void main() v3 Green = V3(0.1f, 0.7f, 0.1f)*White; /* ColorValue = V3(White); */ - f32 CosTheta = Dot(Derivs, Normalize(V3(0,0,1))); - ColorValue = Green*CosTheta; + /* f32 CosTheta = Dot(Derivs, Normalize(V3(0,0,1))); */ + /* ColorValue = Green*Clamp01(0.3+CosTheta); */ + + /* v4 Cliffs = DoCliffs(Basis, Derivs); */ + /* ColorValue = Cliffs.xyz*Clamp01(0.5f+CosTheta); */ + /* NoiseValue += Cliffs.w; */ + + /* v3 v = voronoi_noise(Basis/v3(200,200,1800)) * 100.f; */ + /* if (CosTheta < 0.85f) NoiseValue += v.x; */ + + if (NoiseValue <= 0.f) ColorValue = V3(0); /* ColorValue = Derivs; */ - ColorValue = abs(Derivs); + /* ColorValue = abs(Derivs); */ /* ColorValue = NoiseValue/V3(5000.f); */ + } // diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index ae4e12252..270ccd4a3 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -154,6 +154,102 @@ vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) return Out; } +// Value should be range 0-1 +f32 MapNoiseValueToFinal(f32 Value) +{ + /* Assert(Value <= 1.f); */ + /* Assert(Value >= 0.f); */ + + // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about + + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 1.0f }}, */ + /* {{0.7f, 0.85f }}, */ + /* {{0.6f, 0.5f }}, */ + /* {{0.3f, 0.4f }}, */ + /* {{0.2f, 0.1f }}, */ + /* {{0.0f, 0.0f }}, */ + /* }; */ + + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 1.0f }}, */ + /* {{0.5f, 0.7f }}, */ + /* {{0.35f, 0.43f }}, */ + /* {{0.3f, 0.4f }}, */ + /* {{0.2f, 0.1f }}, */ + /* {{0.0f, 0.0f }}, */ + /* }; */ + + /* const s32 PointCount = 2; */ + /* v2 Points[PointCount]; */ + /* Points[0] = v2(0.f, 0.0f); */ + /* Points[1] = v2(1.0f, 1.0f); */ + + const s32 PointCount = 4; + v2 Points[PointCount]; + Points[0] = v2(0.0f, 0.0f); + Points[1] = v2(0.6f, 0.2f); + Points[2] = v2(0.8f, 1.0f); + Points[3] = v2(1.0f, 1.0f); + + // Pretty nice + + /* s32 PointCount = 6; */ + /* v2 Points[6]; */ + /* Points[0] = v2(1.0f, 1.0f); */ + /* Points[1] = v2(0.7f, 0.7f); */ + /* Points[2] = v2(0.65f, 0.43f); */ + /* Points[3] = v2(0.6f, 0.4f); */ + /* Points[4] = v2(0.5f, 0.2f); */ + /* Points[5] = v2(0.0f, 0.1f); */ + + // Pillar-y + /* v2 Points[] = */ + /* { */ + /* {{2.0f, 0.5f }}, */ + /* {{0.6f, 0.3f }}, */ + /* {{0.1f, 0.2f }}, */ + /* {{0.05f, 0.45f }}, */ + /* {{0.0f , 0.5f }}, */ + /* }; */ + +/* v2 Points[] = */ +/* { */ +/* {{1.0f, 0.0f }}, */ +/* {{0.9f, 1.0f }}, */ +/* {{0.6f, 0.3f }}, */ +/* {{0.1f, 0.1f }}, */ +/* {{0.05f, 0.45f }}, */ +/* {{0.0f , 0.5f }}, */ +/* }; */ + + + + r32 Result = Value; + for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) + { + v2 P = Points[PointIndex]; + + // This is sort of a hack to fix the degenerate case when the value is 0 or 1. + // TODO(Jesse): Make this branchless + if (Value == P.x) return P.y; + + if (Value > P.x) + { + v2 PNext = Points[PointIndex + 1]; + + r32 Range = PNext.x - P.x; + r32 t = (Value-P.x) / Range; + Result = mix(P.y, PNext.y, t); + break; + } + } + + /* Result = abs(max(Result, 1.0)); */ + return Result; +} void main() { @@ -172,21 +268,20 @@ void main() // -- user code -- // { - v3 Period = V3(800.f); - float Amplitude = 4000.f; - f32 StartingZDepth = 1000.f; - s32 Octaves = 1; + v3 Period = V3(1000.f); + float Amplitude = 1000.f; + f32 StartingZDepth = 4000.f; NoiseValue = StartingZDepth; - - v3 deriv = v3(0.f); - v3 xyz = Basis / Period; v4 gn = gradient_noise_derivs(xyz); + /* NoiseValue += MapNoiseValueToFinal((gn.x+1.f)/2.f) * Amplitude; */ NoiseValue += gn.x * Amplitude; + NoiseValue -= Basis.z; + } // diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 19b58d8f4..d3a22dce7 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -6,8 +6,8 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader { shader Program; shader_uniform Uniforms[3]; - texture *DestTex; - framebuffer *DestFBO; + texture DestTex; + framebuffer DestFBO; v3 ChunkDim; poof(@uniform) v3 WorldspaceBasis; poof(@uniform) @@ -20,8 +20,8 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader { shader Program; shader_uniform Uniforms[1]; - texture DestTexture; - framebuffer FBO; + texture DestTex; + framebuffer DestFBO; v3 Ignored; poof(@uniform) /* v3 WorldspaceBasis; poof(@uniform) */ @@ -79,7 +79,7 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader { shader Program; shader_uniform Uniforms[1]; - texture DestTexture; + texture DestTex; framebuffer FBO; texture *InputTex; poof(@uniform) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index fb6d0e126..123b0dd4a 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -792,8 +792,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr // world_edit_render_context *WorldEditRC = &Result->WorldEditRC; v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); - { + { { terrain_shaping_render_context *TerrainShapingRC = &Result->TerrainShapingRC; InitializeWorldEditRenderContext(WorldEditRC, &TerrainShapingRC->ChunkDim, &TerrainShapingRC->WorldspaceBasis, &TerrainShapingRC->ChunkResolution, {}); @@ -814,42 +814,53 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr } // - // Terrain Gen + // Terrain Shaping // + { - terrain_shaping_render_context *TerrainShapingRC = &Result->TerrainShapingRC; - InitializeTerrainShapingRenderContext(TerrainShapingRC, ChunkDim, {}, {}); + terrain_shaping_render_context *RC = &Result->TerrainShapingRC; + InitializeTerrainShapingRenderContext(RC, ChunkDim, {}, {}); - TerrainShapingRC->DestFBO = &WorldEditRC->PingPongFBOs[0]; - TerrainShapingRC->DestTex = &WorldEditRC->PingPongTextures[0]; + RC->DestFBO = GenFramebuffer(); + RC->DestTex = MakeTexture_RGBA(TextureDim, Cast(v4*, 0), CSz("TerrainShaping"), 1, TextureStorageFormat_RGBA32F); - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainShapingRC->DestFBO->ID); + GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); - FramebufferTexture(TerrainShapingRC->DestFBO, TerrainShapingRC->DestTex); - SetDrawBuffers(TerrainShapingRC->DestFBO); + FramebufferTexture(&RC->DestFBO, &RC->DestTex); + SetDrawBuffers(&RC->DestFBO); Ensure(CheckAndClearFramebuffer()); } + + // + // Terrain Derivs + // + { terrain_derivs_render_context *RC = &Result->TerrainDerivsRC; InitializeTerrainDerivsRenderContext(RC, {}); - RC->FBO = GenFramebuffer(); - RC->DestTexture = MakeTexture_RGB(TextureDim, Cast(v3*, 0), CSz("Derivs Tex"), 1, TextureStorageFormat_RGB32F); + RC->DestFBO = GenFramebuffer(); + RC->DestTex = MakeTexture_RGB(TextureDim, Cast(v3*, 0), CSz("TerrainDerivs"), 1, TextureStorageFormat_RGB32F); - GL.BindFramebuffer(GL_FRAMEBUFFER, RC->FBO.ID); + GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); - FramebufferTexture(&RC->FBO, &RC->DestTexture); - SetDrawBuffers(&RC->FBO); + FramebufferTexture(&RC->DestFBO, &RC->DestTex); + SetDrawBuffers(&RC->DestFBO); Ensure(CheckAndClearFramebuffer()); } + + // + // Terrain Decoration + // + { terrain_decoration_render_context *TerrainDecorationRC = &Result->TerrainDecorationRC; - InitializeTerrainDecorationRenderContext(TerrainDecorationRC, &Result->TerrainDerivsRC.DestTexture, ChunkDim, {}, {}); + InitializeTerrainDecorationRenderContext(TerrainDecorationRC, &Result->TerrainDerivsRC.DestTex, ChunkDim, {}, {}); - TerrainDecorationRC->DestFBO = &WorldEditRC->PingPongFBOs[1]; - TerrainDecorationRC->DestTex = &WorldEditRC->PingPongTextures[1]; + TerrainDecorationRC->DestFBO = &WorldEditRC->PingPongFBOs[0]; + TerrainDecorationRC->DestTex = &WorldEditRC->PingPongTextures[0]; GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->DestFBO->ID); @@ -874,16 +885,16 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr u32 Channels = 1; u32 Slices = 1; // @shared_terrain_texture - TerrainFinalizeRC->DestTexture = GenTexture(TextureDim, CSz("TerrainFinalizeTexture"), TextureStorageFormat_R16I, Channels, Slices, False); + TerrainFinalizeRC->DestTex = GenTexture(TextureDim, CSz("TerrainFinalizeTexture"), TextureStorageFormat_R16I, Channels, Slices, False); GL.TexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, TextureDim.x, TextureDim.y, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); AssertNoGlErrors; GL.BindTexture(GL_TEXTURE_2D, 0); } - FramebufferTexture(&Result->TerrainFinalizeRC.FBO, &TerrainFinalizeRC->DestTexture); + FramebufferTexture(&Result->TerrainFinalizeRC.FBO, &TerrainFinalizeRC->DestTex); SetDrawBuffers(&Result->TerrainFinalizeRC.FBO); - InitializeTerrainFinalizeRenderContext(TerrainFinalizeRC, Result->TerrainShapingRC.DestTex); + InitializeTerrainFinalizeRenderContext(TerrainFinalizeRC, &Result->TerrainShapingRC.DestTex); Ensure(CheckAndClearFramebuffer()); } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 310bed844..2352bf3fe 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -42,8 +42,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) DispatchAsyncFunctionCall(RPC); } break; - { tmatch(work_queue_entry__bonsai_render_command, Job, RC) - tswitch(RC) + { tmatch(work_queue_entry__bonsai_render_command, Job, RenderCommand) + tswitch(RenderCommand) { InvalidCase(type_work_queue_entry__bonsai_render_command_noop); @@ -95,7 +95,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) /* Assert(Graphics->NoiseFinalizeJobsPending == 0); */ } break; - { tmatch(bonsai_render_command_allocate_and_map_gpu_element_buffer, RC, Command) + { tmatch(bonsai_render_command_allocate_and_map_gpu_element_buffer, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_allocate_and_map_gpu_element_buffer); /* Assert(HasGpuMesh(Command->Dest) == 0); */ @@ -112,14 +112,14 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) PushWorkQueueEntry(LowPriorityQ, &Next); } break; - { tmatch(bonsai_render_command_unmap_gpu_element_buffer, RC, Command) + { tmatch(bonsai_render_command_unmap_gpu_element_buffer, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_unmap_gpu_element_buffer); FlushBuffersToCard(Command->Buf); FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*, Command->Chunk))); } break; - { tmatch(bonsai_render_command_unmap_and_deallocate_buffer, RC, Command) + { tmatch(bonsai_render_command_unmap_and_deallocate_buffer, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_unmap_and_deallocate_buffer); gpu_readback_buffer PBOBuf = Command->PBOBuf; @@ -132,7 +132,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; } break; - { tmatch(bonsai_render_command_allocate_texture, RC, Command) + { tmatch(bonsai_render_command_allocate_texture, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_allocate_texture); texture *Texture = Command->Texture; @@ -154,16 +154,16 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; - { tmatch(bonsai_render_command_deallocate_texture, RC, Command) + { tmatch(bonsai_render_command_deallocate_texture, RenderCommand, Command) NotImplemented; } break; - { tmatch(bonsai_render_command_allocate_buffers, RC, Command) + { tmatch(bonsai_render_command_allocate_buffers, RenderCommand, Command) NotImplemented; } break; - { tmatch(bonsai_render_command_reallocate_buffers, RC, Command) + { tmatch(bonsai_render_command_reallocate_buffers, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_reallocate_buffers); auto *Handles = Command->Handles; auto *Mesh = Command->Mesh; @@ -173,21 +173,21 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; - { tmatch(bonsai_render_command_deallocate_buffers, RC, Command) + { tmatch(bonsai_render_command_deallocate_buffers, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_deallocate_buffers); if (*Command->Buffers) { GL.DeleteBuffers(Command->Count, Command->Buffers); } RangeIterator(Index, Command->Count) { Command->Buffers[Index] = 0; } } break; - { tmatch(bonsai_render_command_deallocate_world_chunk, RC, Command) + { tmatch(bonsai_render_command_deallocate_world_chunk, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_deallocate_world_chunk); world_chunk *Chunk = Command->Chunk; FreeWorldChunk(Engine, Chunk); } break; - { tmatch(bonsai_render_command_clear_all_framebuffers, RC, Command) + { tmatch(bonsai_render_command_clear_all_framebuffers, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_clear_all_framebuffers); ClearFramebuffers(Graphics, &Engine->RTTGroup); } break; @@ -195,7 +195,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) - { tmatch(bonsai_render_command_setup_shader, RC, Command) + { tmatch(bonsai_render_command_setup_shader, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_setup_shader); switch (Command->ShaderId) { @@ -213,7 +213,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } } break; - { tmatch(bonsai_render_command_teardown_shader, RC, Command) + { tmatch(bonsai_render_command_teardown_shader, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_teardown_shader); switch (Command->ShaderId) { @@ -231,7 +231,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } } break; - { tmatch(bonsai_render_command_set_shader_uniform, RC, Command) + { tmatch(bonsai_render_command_set_shader_uniform, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_set_shader_uniform); shader *Shader = Command->Shader; shader_uniform *Uniform = &Command->Uniform; @@ -245,25 +245,25 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } } break; - { tmatch(bonsai_render_command_draw_world_chunk_draw_list, RC, Command) + { tmatch(bonsai_render_command_draw_world_chunk_draw_list, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_draw_world_chunk_draw_list); RenderDrawList(Engine, Command->DrawList, Command->Shader); } break; - { tmatch(bonsai_render_command_draw_all_entities, RC, Command) + { tmatch(bonsai_render_command_draw_all_entities, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_draw_all_entities); DrawEntities(Command->Shader, EntityTable, &GpuMap->Buffer, 0, Graphics, World, Plat->dt); } break; - { tmatch(bonsai_render_command_initialize_noise_buffer, RC, _Command) + { tmatch(bonsai_render_command_initialize_noise_buffer, RenderCommand, _Command) TIMED_NAMED_BLOCK(bonsai_render_command_initialize_noise_buffer); /* Command = 0; */ AtomicIncrement(&Graphics->NoiseFinalizeJobsPending); - bonsai_render_command_initialize_noise_buffer C = RC->bonsai_render_command_initialize_noise_buffer; + bonsai_render_command_initialize_noise_buffer C = RenderCommand->bonsai_render_command_initialize_noise_buffer; octree_node *Node = C.Node; world_chunk **Chunk2 = &C.Node->Chunk; @@ -272,70 +272,74 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) Assert(s64(Chunk) == s64(Chunk1)); - v3 NoiseDim = Graphics->TerrainShapingRC.ChunkDim; - v2i ViewportSize = V2i(s32(NoiseDim.x), s32(NoiseDim.y*NoiseDim.z)); - SetViewport(ViewportSize); + texture *InputTex = 0; // // Launch terrain shaping shader // { - auto *TerrainShapingRC = &Graphics->TerrainShapingRC; - v3i Apron = V3i(2, 2, 2); - Assert(V3(Chunk1->Dim+Apron) == NoiseDim); + auto *RC = &Graphics->TerrainShapingRC; - TerrainShapingRC->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); - TerrainShapingRC->ChunkResolution = V3(Chunk->DimInChunks); + RC->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); + RC->ChunkResolution = V3(Chunk->DimInChunks); TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainShapingRC->DestFBO->ID); - UseShader(TerrainShapingRC); + GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); + UseShader(RC); + + v2i TextureDim = RC->DestTex.Dim; + SetViewport(TextureDim); + RenderQuad(); AssertNoGlErrors; + InputTex = &RC->DestTex; } - world_edit_render_context *WorldEditRC = &Graphics->WorldEditRC; - texture *InputTex = &WorldEditRC->PingPongTextures[0]; // // Calculate derivs of terrain shaping step // { - auto *TerrainDerivsRC = &Graphics->TerrainDerivsRC; + auto *RC = &Graphics->TerrainDerivsRC; TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDerivsRC->FBO.ID); - UseShader(TerrainDerivsRC); - BindUniformByName(&TerrainDerivsRC->Program, "InputTex", InputTex, 0); + GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); + UseShader(RC); + BindUniformByName(&RC->Program, "InputTex", InputTex, 0); + + v2i TextureDim = RC->DestTex.Dim; + SetViewport(TextureDim); + RenderQuad(); AssertNoGlErrors; + + /* InputTex = &RC->DestTex; */ } // // Launch terrain decoration shader // { - auto *TerrainDecorationRC = &Graphics->TerrainDecorationRC; - v3i Apron = V3i(2, 2, 2); - Assert(V3(Chunk1->Dim+Apron) == NoiseDim); + auto *RC = &Graphics->TerrainDecorationRC; - TerrainDecorationRC->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); - TerrainDecorationRC->ChunkResolution = V3(Chunk->DimInChunks); + RC->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); + RC->ChunkResolution = V3(Chunk->DimInChunks); TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->DestFBO->ID); - UseShader(TerrainDecorationRC); + GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO->ID); + UseShader(RC); // Using texture unit 1 because the DerivsTex is automatically bound in // UseShader to unit 0 - BindUniformByName(&TerrainDecorationRC->Program, "InputTex", InputTex, 1); + BindUniformByName(&RC->Program, "InputTex", InputTex, 1); RenderQuad(); AssertNoGlErrors; + + InputTex = RC->DestTex; } - InputTex = &WorldEditRC->PingPongTextures[1]; s32 PingPongIndex = 0; #if 1 @@ -344,6 +348,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) // { + auto WorldEditRC = &Graphics->WorldEditRC; AcquireFutex(&Node->Lock); if (TotalElements(&Node->Edits)) { @@ -477,7 +482,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TIMED_NAMED_BLOCK(TerrainFinalizeDrawCall); GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->TerrainFinalizeRC.FBO.ID); - SetViewport(ViewportSize); UseShader(&Graphics->TerrainFinalizeRC); BindUniformByName(&Graphics->TerrainFinalizeRC.Program, "InputTex", InputTex, 0); @@ -491,10 +495,11 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } - Assert(Chunk1->Dim == V3i(64)); - Assert(NoiseDim == V3(66)); + /* Assert(Chunk1->Dim == V3i(64)); */ + /* Assert(NoiseDim == V3(66)); */ - s32 NoiseElementCount = s32(Volume(NoiseDim)); + v3i NoiseDim = V3i(66); + s32 NoiseElementCount = s32(Volume(InputTex->Dim)); s32 NoiseByteCount = NoiseElementCount*s32(sizeof(u16)); { @@ -505,20 +510,20 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); GL.BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); AssertNoGlErrors; - GL.ReadPixels(0, 0, ViewportSize.x, ViewportSize.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); + GL.ReadPixels(0, 0, InputTex->Dim.x, InputTex->Dim.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); AssertNoGlErrors; GL.BindBuffer(GL_PIXEL_PACK_BUFFER, 0); gl_fence Fence = GL.FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, V3i(NoiseDim), Chunk}; + dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, NoiseDim, Chunk}; Push(&Graphics->NoiseReadbackJobs, &Readback); } } break; - { tmatch(bonsai_render_command_do_stuff, RC, Command) + { tmatch(bonsai_render_command_do_stuff, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_do_stuff); // @@ -641,28 +646,28 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; - { tmatch(bonsai_render_command_gl_timer_init, RC, Command) + { tmatch(bonsai_render_command_gl_timer_init, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_init); AssertNoGlErrors; GL.GenQueries(1, Command->GlTimerObject); AssertNoGlErrors; } break; - { tmatch(bonsai_render_command_gl_timer_start, RC, Command) + { tmatch(bonsai_render_command_gl_timer_start, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_start); AssertNoGlErrors; GL.BeginQuery(GL_TIME_ELAPSED, Command->GlTimerObject); AssertNoGlErrors; } break; - { tmatch(bonsai_render_command_gl_timer_end, RC, Command) + { tmatch(bonsai_render_command_gl_timer_end, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_end); AssertNoGlErrors; GL.EndQuery(GL_TIME_ELAPSED); AssertNoGlErrors; } break; - { tmatch(bonsai_render_command_gl_timer_read_value_and_histogram, RC, Command) + { tmatch(bonsai_render_command_gl_timer_read_value_and_histogram, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_read_value_and_histogram); #if 0 AssertNoGlErrors; From d1bb9b51fe9efb16fcf5b0efa8f1622fb3ff2f1e Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 16 Apr 2025 12:18:11 -0700 Subject: [PATCH 207/421] Change terrain shaping to operate on 68^3 so the derivatives are correct --- external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- jesse.bonsai.rdbg | Bin 16384 -> 16384 bytes .../terrain_decoration.fragmentshader | 43 +++++++++++------- shaders/terrain/derivs.fragmentshader | 19 ++++++-- .../shaping/terrain_shaping.fragmentshader | 22 +++++---- src/engine/debug.cpp | 6 ++- src/engine/render/render_init.cpp | 6 +-- src/engine/render_loop.cpp | 7 +++ 11 files changed, 72 insertions(+), 39 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index d41a889ab..cba8b1a74 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit d41a889abcf8b392d2bd3b8940171712c0e7c749 +Subproject commit cba8b1a74fc971415fd40b4b9b79fbb8f666d488 diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index cdbc06bff..ac1174146 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2347:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2359:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 4b10f6baf..37bf71bef 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3327:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3339:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index bb83b8616..d79265196 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2300:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2312:0 case type_ui_render_command_window_start: { diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index e91792c3f3cc993b3fc4e6af4380fb684b8130ef..c047af9b54492604878c6baa6265de35b25d73a7 100644 GIT binary patch delta 2579 zcmb7GOKe+d74GlEkL&Bik35{laed>wYA3mV#g5}mQN(VZ)H}*~LrGBKg z)9D}vQecIkwEZ>=i%}{Vv7#!1%}5}XN^B5f(h&lQ#dL-xi(y7QHb?{K|LwS}kg#;+ z|8>rP&UeoF&cC_stpIj68Wd=iXFyE`SVsjEhY&+wN8CyNWIM+;8G7cSEm!B^uhxEDs*s*oL! zkKx^{%&y@B58g1$Gt*lKjT}D1I1>U_aT5Q}ctk;f~{Xb5Xkz*?=D4IS(0E9@0htUZt>p1`%FR8@WN<0v!;|C}$qqhynCxd+8pUuu>0;-EZA%FsS?ggN zc&cXbZbAX`a!Wnk6}_&Z=AI^p0tm-i&b`{@L|4Mc5*!}aj`4cKEH>2Q&d##H;f?sQ z&e8p(9r^eGc_KWQ^=i{>zFvr{hRTI)4ZU8{8+bf3b2yxp^0*q4aiD$<8!Q5T*<;m% zjdTuQo9@Ne)n4-JGu{OpSKavO>0mUQLENy=uI38kBO|Wj^w=f*b0&(l zDVZ>A+4YR<`e5>;WxI^4lgsFvTw!N~W#=P3+>+Mhoe4rZE+m|0)ohwt+5C!5n4S?O zq~bf{8J4C3NpqPjDNwLD9)LuEa*y{VE8OEQfd-$iT5LEN^RO30X8h!+uWL7zgfg}S zMi}u*`B!*~PM^fJa8lsL*Di*$^0rpd3*{Q;2|Sw|qqDvE)94@)K`zI~eHPWgdVUBy z0iRvlF*$CXdD+}Hh&6C~L>#|ADzVdKZMtW(R&8h|kxr>>Zem4QYE^kVGh12AW8zkN z*(s99;Wr_fEX(6Pim(z&;2+~TY0E6@{H$OIxk$FwwNBimirz3fGh1tys9*-iayBT( z>_h}BXawWr%qjYE5>cS8RaAo$(F`7rIB=kZ2~a;3Vhh;v$N=F^B_p>mX6nSS@!nk7y zAIM>>4Eu>LTM6dGfqk$OMn5G<1f`=PCK6R@mGyJNb>VMAgKR~V&X0%uZ2hpraBZlE zs_zU@-aLNkALxYh294L1R!VTvxSo`{RAWUX*l&Ffd^mWVUFm4~(O^Fj=7qyLcHY<} z=B`(X`wCTEq6Lj~mFAHT4dS7H! zF^ct`$9~TitF&j!*4?aXw3?y2M-%f8Q1;dU%SbXh{%=`OW76%nHWrdSiuC~MRSQZVs&*DAIYaB2a5%}r$qeVI4 z$L~(KS?TbKdrwouN)dYDxbEE!^e}o}@gM&e&!wyX-*YKKau)hL^lgYo*=+vhs<~CG zR~lAY%VeXOELT4F>6hMSKfAn`u&{1?njdrWMRB_YzsgT}9empU@iAYGV0r10LmZ-& F{{Wa9A|?O; delta 2561 zcmY*bOKcn074@UY8FKjlSfoT!Bqd7}NogceqW-d^+Hz7W{={yIrcF#y;#eG8{B(v= z?Vzb;INfy7BtFO@D;oidtolg;bl1d5fFeK^O=<*f7fs>1MGJJ(Yyxyqp!dC@2$#Ts z@4b2VzWeSu_uM%=WQT|BwWsZ096NRlUnNr5Dk%8fQkGT0*bL02X|_qDRZJ}TVR&=c za`6ebgBoZ7NU4Kzr>!UGo!daS8^R_JME^S*3NfU`f+7G%`P0hm+O_Q zSJm3N&U^u(o*1{otvMHpa~Ey0+|aVs%`J@^1HtHgh2rBPx}#^{vJ+b zQkYC7+*t&Im0*V(pM``5%0f)kr~ zOZ|RlMN?N;L%jP`JuO|GrucXoM)BkE4ZQ9N0IPpJnr$D9-XuvtF+>s(3X!#5rZ> zz~WIX10|;5PA0=JZ+}10N0gt#+b52bS5Z^} zgD&5!mrc#k=_WN^0RlQCPk05<_$-L`hoX0>wi-jdIP~Wwt16a7pT9)L&Rr(r6_(D4^r%udEc(qDDP=T zt9(E#8wX40Wqr5S?$lsUrKMBGhD6fujr3CJEpGudvQ6t4=%3*cz5XBwcmF)rLb9~o zY?u`tTf}Fsuy6K7yEX95zAPTcR`6DAol?6-k?|~inU*}}%|^SXnK~gd-w8L4ccTk9 zj21bm9fH6dIjLQv^j7JXXFJq)m zzp$_K5}Kj_3Ua5W@TzYaToccBcw`BhRYrr3-95D?ScJnV$xg;k(Y6IV3;|cRH(9?8Mv2tq)@g-U`>vp8 zHdtaiV)P(zvYX9TAS*hSRXb||xm&j7gj?{ah-uOT|DuG)5mjz$hEdTQl*BWna;Nbv z-wMJL7Qr`se(E8XGW^%;qyBdaY40Vr&V!NK+Ku+UfgdF&aL*&-W&b$+J1J7$=&pMd z+IHJDft2TXw>N&~PQh@Os1@Y!Lq)-sJJgldNhRE==DURgZ?n=)rLGwjJgYn}`s1WB z#I=%Ks>7}xomYozQz%zU8WfGn>ak&0sH4GLFFtWbsI^)5DZ7rlc-ipWTWZR8M4UrU zXzRyv)ap4nkk6qcN2#Ocgz`L;5*-*CP2JQ~V%Jei-;}%*;xkl6T+1R(>NRb>v1<}} zEWU3!;s_|# zvC+2>|1o;-RlI;JVVBqG5^G|y`$cr?KeQ;* ft0^~s#UIA_Jd4TI2z;x7?kt9l)%Uvh<97c8#>emJ diff --git a/shaders/terrain/decoration/terrain_decoration.fragmentshader b/shaders/terrain/decoration/terrain_decoration.fragmentshader index 6006877c5..2127af1fd 100644 --- a/shaders/terrain/decoration/terrain_decoration.fragmentshader +++ b/shaders/terrain/decoration/terrain_decoration.fragmentshader @@ -18,7 +18,7 @@ v4 DoCliffs(v3 Basis, v3 Deriv) /* Deriv = normalize(Deriv); */ /* Deriv.xy = abs(Deriv.xy); */ - f32 Cliffness = Clamp01(1.1f+dot(Down, Deriv)); + f32 Cliffness = Clamp01(0.8f+dot(Down, Deriv)); f32 Grassness = Clamp01(.15f-Cliffness); ColorValue = mix(v3(.1,.8,.2), v3(.3), Cliffness); @@ -26,7 +26,7 @@ v4 DoCliffs(v3 Basis, v3 Deriv) /* ColorValue = Cliffness > 0.15f ? V3(0.3f) : v3(.1,.8,.2); */ // Grassy ripples -#if 0 +#if 1 { v4 gWobble = gradient_noise_derivs(Basis/v3(30, 30, 80)); NoiseValue += gWobble.x*Grassness*50; @@ -48,7 +48,7 @@ v4 DoCliffs(v3 Basis, v3 Deriv) CliffValue += (v.y*50)*Cliffness; CliffColor = mix(CliffColor, BaseCliffColor, clamp(10*Cliffness*v.x,0,1)); } -#if 0 +#if 1 { v3 v = voronoi_noise(Basis/v3(100,100,600)); v.x += 0.5f; @@ -85,7 +85,7 @@ v4 DoCliffs(v3 Basis, v3 Deriv) ColorValue = CliffColor; } -#if 0 +#if 1 f32 gravel_patch_stregth = value_noise_derivs(150+(Basis/300)).x; gravel_patch_stregth += value_noise_derivs(150+(Basis/160)).x; @@ -167,12 +167,18 @@ void main() f32 z = floor(gl_FragCoord.y / 66); f32 y = floor(gl_FragCoord.y - (z*66)); + + /* if (x == 0 || x == 65) { Output = V4(1,0,0,1); return; } */ + /* if (y == 0 || y == 65) { Output = V4(1,1,0,1); return; } */ + /* if (z == 0 || z == 65) { Output = V4(1,0,1,1); return; } */ + /* v3 Offset = V3(-1, -1, -1); */ v3 Offset = V3(0); v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); - v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); - v3 Derivs = texelFetch(DerivsTex, ivec2(gl_FragCoord.xy), 0).xyz; + ivec2 InputTexCoord = ivec2(gl_FragCoord.x + 1, (y + 1) + (z * 68) + 68 ); + v4 TexLookup = texelFetch(InputTex, InputTexCoord, 0); + v3 Derivs = texelFetch(DerivsTex, ivec2(gl_FragCoord.xy) + ivec2(0, 0), 0).xyz; /* v3 Derivs = texelFetch(DerivsTex, ivec2(gl_FragCoord.xy+ivec2(1,66)), 0).xyz; */ // NOTE(Jesse): Set these in the -- user code -- section @@ -187,23 +193,26 @@ void main() // Put random junk here - f32 White = Clamp01(1.5f+white_noise(Basis)); + /* f32 White = Clamp01(1.5f+white_noise(Basis)); */ + /* v3 Green = V3(0.1f, 0.7f, 0.1f)*White; */ + /* /1* ColorValue = V3(White); *1/ */ + f32 CosTheta = Dot(Derivs, Normalize(V3(0,0,1))); - v3 Green = V3(0.1f, 0.7f, 0.1f)*White; - /* ColorValue = V3(White); */ - - /* f32 CosTheta = Dot(Derivs, Normalize(V3(0,0,1))); */ - /* ColorValue = Green*Clamp01(0.3+CosTheta); */ + /* ColorValue = abs(Derivs); */ + /* ColorValue = v3(CosTheta); */ + /* /1* ColorValue = Green*Clamp01(0.5+CosTheta); *1/ */ - /* v4 Cliffs = DoCliffs(Basis, Derivs); */ - /* ColorValue = Cliffs.xyz*Clamp01(0.5f+CosTheta); */ - /* NoiseValue += Cliffs.w; */ + v4 Cliffs = DoCliffs(Basis, Derivs); + ColorValue = Cliffs.xyz*Clamp01(0.8f+CosTheta); + NoiseValue += Cliffs.w*0.1f; /* v3 v = voronoi_noise(Basis/v3(200,200,1800)) * 100.f; */ - /* if (CosTheta < 0.85f) NoiseValue += v.x; */ + /* NoiseValue += v.x * CosTheta; */ + /* /1* NoiseValue += v.x; *1/ */ + /* /1* if (CosTheta < 0.85f) NoiseValue += v.x; *1/ */ - if (NoiseValue <= 0.f) ColorValue = V3(0); + /* if (NoiseValue <= 0.f) ColorValue = V3(0); */ /* ColorValue = Derivs; */ /* ColorValue = abs(Derivs); */ diff --git a/shaders/terrain/derivs.fragmentshader b/shaders/terrain/derivs.fragmentshader index d991bd951..d01ab15db 100644 --- a/shaders/terrain/derivs.fragmentshader +++ b/shaders/terrain/derivs.fragmentshader @@ -9,28 +9,37 @@ out layout(location = 0) vec3 Output; void main() { - f32 CurrentNoiseValue = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0).a; - s32 x = s32(floor(gl_FragCoord.x)); s32 z = s32(floor(gl_FragCoord.y / 66)); s32 y = s32(floor(gl_FragCoord.y - (z*66))); + ivec2 InputTexCoord = ivec2(gl_FragCoord.x + 1, (y + 1) + (z * 68) + 68 ); + f32 CurrentNoiseValue = texelFetch(InputTex, InputTexCoord, 0).a; + v3 Normal = v3(0.f); + /* if (x == 0 || x == 65) { Output = V3(1,0,0); return; } */ + /* if (y == 0 || y == 65) { Output = V3(1,1,0); return; } */ + /* if (z == 0 || z == 65) { Output = V3(1,0,1); return; } */ + + /* if (x == 60 || y == 60 || z == 60) { Output = Normalize(V3(1,0,0)); return; } */ + for ( s32 dz = -1; dz < 2; ++ dz) for ( s32 dy = -1; dy < 2; ++ dy) for ( s32 dx = -1; dx < 2; ++ dx) { if (dz == 0 && dy == 0 && dx == 0) continue; // Skip the middle-most voxel - s32 xCoord = s32(gl_FragCoord.x) + dx; - s32 yCoord = s32(gl_FragCoord.y) + dy; - s32 zCoord = dz * 66 ; + s32 xCoord = InputTexCoord.x + dx; + s32 yCoord = InputTexCoord.y + dy; + s32 zCoord = dz * 68; f32 Next = texelFetch(InputTex, ivec2(xCoord, yCoord+zCoord), 0).a; f32 Diff = Next-(dz*ChunkResolution.z) - Truncate(CurrentNoiseValue); + if (Diff > 0) { // TODO(Jesse): Recompute with a small random variance to the weight if this is 0? Normal += V3(dx,dy,dz)*Diff; + } } // Invert because we accumulate the value by pointing 'at' the cell we're checking diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index 270ccd4a3..b634b0ecf 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -254,23 +254,28 @@ f32 MapNoiseValueToFinal(f32 Value) void main() { f32 x = floor(gl_FragCoord.x); - f32 z = floor(gl_FragCoord.y / 66); - f32 y = floor(gl_FragCoord.y - (z*66)); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); - v3 Offset = V3(-1, -1, -1); + /* if (x == 0 || x == 67) { Output = V4(1,0,0,1); return; } */ + /* if (y == 0 || y == 67) { Output = V4(1,1,0,1); return; } */ + /* if (z == 0 || z == 67) { Output = V4(1,0,1,1); return; } */ + + v3 Offset = V3(-2, -2, -2); v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); // NOTE(Jesse): Set these in the -- user code -- section - v3 ColorValue = V3(0.f); - f32 NoiseValue = 0.f; + v3 ColorValue = V3(0.2f, 0.2f, 0.2f); + f32 NoiseValue = 1.f; // // -- user code -- // { +#if 1 v3 Period = V3(1000.f); float Amplitude = 1000.f; - f32 StartingZDepth = 4000.f; + f32 StartingZDepth = 8000.f; NoiseValue = StartingZDepth; @@ -278,10 +283,11 @@ void main() v4 gn = gradient_noise_derivs(xyz); /* NoiseValue += MapNoiseValueToFinal((gn.x+1.f)/2.f) * Amplitude; */ - NoiseValue += gn.x * Amplitude; - NoiseValue -= Basis.z; + NoiseValue += Smoothstep(pow(Clamp01(gn.x), 0.1)) * Amplitude; + NoiseValue -= Basis.z; +#endif } // diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index 336a6d6e8..7c1c0da33 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -588,7 +588,11 @@ DoEngineDebug(engine_resources *Engine) PushTableStart(Ui); + auto Button = ToggleButtonStart(Ui, UiId(&TexturesWindow, u64(Texture), u64(0))); PushColumn(Ui, FSz("(%u) %S (%dx%d) Slices(%u) Channels(%u) IsDepthTexture(%b)", Texture->ID, Texture->DebugName, Texture->Dim.x, Texture->Dim.y, Texture->Slices, Texture->Channels, Texture->IsDepthTexture), UiElementAlignmentFlag_LeftAlign); PushNewRow(Ui); + ToggleButtonEnd(Ui); + + if (ToggledOn(Ui, &Button)) { Dim = V2(Texture->Dim) * 8.f; } u32 StartOuter = StartColumn(Ui); PushTableStart(Ui); @@ -596,12 +600,10 @@ DoEngineDebug(engine_resources *Engine) { RangeIterator_t(u32, SliceIndex, Texture->Slices) { - interactable_handle Button = PushButtonStart(Ui, UiId(&TexturesWindow, u64(Texture), u64(SliceIndex))); u32 Start = StartColumn(Ui); PushTexturedQuad(Ui, Texture, s32(SliceIndex), Dim, zDepth_Text); PushForceAdvance(Ui, V2(xAdvance, 0)); EndColumn(Ui, Start); - PushButtonEnd(Ui); if ( (SliceIndex+1) % 8 == 0) { diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 123b0dd4a..0a47855e0 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -785,12 +785,12 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr } - v3 ChunkDim = V3(66, 66, 66); - // // World Edit RC // world_edit_render_context *WorldEditRC = &Result->WorldEditRC; + + v3 ChunkDim = V3(66, 66, 66); v2i TextureDim = V2i(u32(ChunkDim.x), u32(ChunkDim.y*ChunkDim.z)); { @@ -822,7 +822,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr InitializeTerrainShapingRenderContext(RC, ChunkDim, {}, {}); RC->DestFBO = GenFramebuffer(); - RC->DestTex = MakeTexture_RGBA(TextureDim, Cast(v4*, 0), CSz("TerrainShaping"), 1, TextureStorageFormat_RGBA32F); + RC->DestTex = MakeTexture_RGBA(V2i(68, 68*68), Cast(v4*, 0), CSz("TerrainShaping"), 1, TextureStorageFormat_RGBA32F); GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 2352bf3fe..bafbe7e3a 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -289,6 +289,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) v2i TextureDim = RC->DestTex.Dim; SetViewport(TextureDim); + Assert(TextureDim == V2i(68, 68*68)); RenderQuad(); @@ -309,6 +310,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&RC->Program, "InputTex", InputTex, 0); v2i TextureDim = RC->DestTex.Dim; + Assert(TextureDim == V2i(66, 66*66)); SetViewport(TextureDim); RenderQuad(); @@ -333,6 +335,11 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) // Using texture unit 1 because the DerivsTex is automatically bound in // UseShader to unit 0 BindUniformByName(&RC->Program, "InputTex", InputTex, 1); + + v2i TextureDim = RC->DestTex->Dim; + Assert(TextureDim == V2i(66, 66*66)); + SetViewport(TextureDim); + RenderQuad(); AssertNoGlErrors; From 3cb1ef441c4313c21a187e2b8ae50d651bfde34b Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 16 Apr 2025 14:16:53 -0700 Subject: [PATCH 208/421] Fix calling CosineInterpolatePointSet wrong --- .../terrain_decoration.fragmentshader | 3 +- .../shaping/terrain_shaping.fragmentshader | 46 ++++++++++--------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/shaders/terrain/decoration/terrain_decoration.fragmentshader b/shaders/terrain/decoration/terrain_decoration.fragmentshader index 2127af1fd..2141f0c2a 100644 --- a/shaders/terrain/decoration/terrain_decoration.fragmentshader +++ b/shaders/terrain/decoration/terrain_decoration.fragmentshader @@ -202,10 +202,9 @@ void main() /* ColorValue = v3(CosTheta); */ /* /1* ColorValue = Green*Clamp01(0.5+CosTheta); *1/ */ - v4 Cliffs = DoCliffs(Basis, Derivs); ColorValue = Cliffs.xyz*Clamp01(0.8f+CosTheta); - NoiseValue += Cliffs.w*0.1f; + NoiseValue += Cliffs.w; /* v3 v = voronoi_noise(Basis/v3(200,200,1800)) * 100.f; */ /* NoiseValue += v.x * CosTheta; */ diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index b634b0ecf..2c6f298aa 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -154,8 +154,8 @@ vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) return Out; } -// Value should be range 0-1 -f32 MapNoiseValueToFinal(f32 Value) +// tx should be range 0-1 +f32 CosineInterpolatePointSet(f32 tx) { /* Assert(Value <= 1.f); */ /* Assert(Value >= 0.f); */ @@ -182,17 +182,17 @@ f32 MapNoiseValueToFinal(f32 Value) /* {{0.0f, 0.0f }}, */ /* }; */ - /* const s32 PointCount = 2; */ - /* v2 Points[PointCount]; */ - /* Points[0] = v2(0.f, 0.0f); */ - /* Points[1] = v2(1.0f, 1.0f); */ - - const s32 PointCount = 4; + const s32 PointCount = 2; v2 Points[PointCount]; - Points[0] = v2(0.0f, 0.0f); - Points[1] = v2(0.6f, 0.2f); - Points[2] = v2(0.8f, 1.0f); - Points[3] = v2(1.0f, 1.0f); + Points[0] = v2(0.f, 0.0f); + Points[1] = v2(1.0f, 1.0f); + + /* const s32 PointCount = 4; */ + /* v2 Points[PointCount]; */ + /* Points[3] = v2(0.0f, 0.0f); */ + /* Points[2] = v2(0.1f, 0.2f); */ + /* Points[1] = v2(0.8f, 1.0f); */ + /* Points[0] = v2(1.0f, 1.0f); */ // Pretty nice @@ -227,22 +227,23 @@ f32 MapNoiseValueToFinal(f32 Value) - r32 Result = Value; + r32 Result = Points[0].x; for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) { v2 P = Points[PointIndex]; - // This is sort of a hack to fix the degenerate case when the value is 0 or 1. - // TODO(Jesse): Make this branchless - if (Value == P.x) return P.y; - - if (Value > P.x) + if (tx >= P.x) { v2 PNext = Points[PointIndex + 1]; + v2 Tmp = P; + + P = PNext; + PNext = Tmp; r32 Range = PNext.x - P.x; - r32 t = (Value-P.x) / Range; - Result = mix(P.y, PNext.y, t); + r32 t = Clamp01((tx-P.x) / Range); + Result = CosineInterpolate(t, P.y, PNext.y); + /* Result = mix(P.y, PNext.y, t); */ break; } } @@ -282,9 +283,10 @@ void main() v3 xyz = Basis / Period; v4 gn = gradient_noise_derivs(xyz); - /* NoiseValue += MapNoiseValueToFinal((gn.x+1.f)/2.f) * Amplitude; */ + NoiseValue += (CosineInterpolatePointSet((gn.x+1.f)/2.f)*2.f-1.f) * Amplitude; + /* NoiseValue += gn.x * Amplitude; */ - NoiseValue += Smoothstep(pow(Clamp01(gn.x), 0.1)) * Amplitude; + /* NoiseValue += Smoothstep(pow(Clamp01(gn.x), 0.1)) * Amplitude; */ NoiseValue -= Basis.z; #endif From b1ab7e42ebdc7cb6907d1d7c0e5e2112e25de02a Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 16 Apr 2025 16:49:31 -0700 Subject: [PATCH 209/421] Fix order-of-operations bug which let noise readback jobs leak through after reset --- src/engine/api.cpp | 3 --- src/engine/resources.cpp | 15 ++++++++------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 1125b3ecf..4dab61aa5 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -93,9 +93,6 @@ Bonsai_FrameBegin(engine_resources *Resources) { auto Plat = &Resources->Stdlib.Plat; - /* RuntimeBreak(); */ - PushBonsaiRenderCommandCancelAllNoiseReadbackJobs(&Plat->RenderQ); - SignalAndWaitForWorkers(&Plat->WorkerThreadsSuspendFutex); CancelAllWorkQueueJobs(Resources); Assert(Count(&Resources->Graphics.NoiseReadbackJobs) == 0); diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index e5a5e52f4..aba4d9362 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -135,6 +135,14 @@ CancelAllWorkQueueJobs(engine_resources *Engine) Assert(QueueIsEmpty(&Plat->LowPriority)); Assert(QueueIsEmpty(&Plat->WorldUpdateQ)); Assert(QueueIsEmpty(&Plat->RenderQ)); + + PushBonsaiRenderCommandCancelAllNoiseReadbackJobs(&Plat->RenderQ); + + UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); + + while (!QueueIsEmpty(&Plat->RenderQ)) { SleepMs(1); } + + SignalAndWaitForWorkers(&Plat->WorkerThreadsSuspendFutex); } link_internal void @@ -242,13 +250,6 @@ HardResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag HardResetAssets(Engine); - umm ReadbackJobCount = TotalElements(&Graphics->NoiseReadbackJobs); - RangeIterator_t(umm, JobIndex, ReadbackJobCount) - { - dummy_work_queue_entry_build_chunk_mesh_block_array_index I = ZerothIndex(&Graphics->NoiseReadbackJobs); - RemoveUnordered(&Graphics->NoiseReadbackJobs, I); - } - Info("Hard Reset End"); } From c29e4fc33cb57e317c9baa9ff7b6f8bdf465c63d Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 27 Apr 2025 09:24:23 -0700 Subject: [PATCH 210/421] Fix several bugs affecting the world_edit shader execution --- examples/terrain_gen/game_constants.h | 4 +-- .../terrain_decoration.fragmentshader | 6 +++-- shaders/terrain/derivs.fragmentshader | 7 ++++-- .../shaping/terrain_shaping.fragmentshader | 4 +-- shaders/terrain/world_edit.fragmentshader | 6 ++--- src/engine/render_loop.cpp | 25 ++++++++----------- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index c5e13fd10..89329967b 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -18,9 +18,9 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ /* g_VisibleRegion = Chunk_Dimension(1024, 1024, 1024); */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ -g_VisibleRegion = Chunk_Dimension(256, 256, 256); +/* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ -/* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ +g_VisibleRegion = Chunk_Dimension(64, 64, 64); /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ diff --git a/shaders/terrain/decoration/terrain_decoration.fragmentshader b/shaders/terrain/decoration/terrain_decoration.fragmentshader index 2141f0c2a..d8678eabe 100644 --- a/shaders/terrain/decoration/terrain_decoration.fragmentshader +++ b/shaders/terrain/decoration/terrain_decoration.fragmentshader @@ -1,8 +1,10 @@ +#extension GL_ARB_explicit_uniform_location : enable + uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; -uniform sampler2D InputTex; -uniform sampler2D DerivsTex; +uniform layout(location = 0) sampler2D DerivsTex; +uniform layout(location = 1) sampler2D InputTex; in vec2 UV; out v4 Output; diff --git a/shaders/terrain/derivs.fragmentshader b/shaders/terrain/derivs.fragmentshader index d01ab15db..de4c38007 100644 --- a/shaders/terrain/derivs.fragmentshader +++ b/shaders/terrain/derivs.fragmentshader @@ -36,10 +36,13 @@ void main() f32 Next = texelFetch(InputTex, ivec2(xCoord, yCoord+zCoord), 0).a; f32 Diff = Next-(dz*ChunkResolution.z) - Truncate(CurrentNoiseValue); - if (Diff > 0) { + // NOTE(Jesse): Can't do this because we end up with complete nonsense on + // the edges for some unknown reason + /* if (Diff > 0) */ + // TODO(Jesse): Recompute with a small random variance to the weight if this is 0? + // EDIT(Jesse): Why exactly would we do this?? Sounds like a bad idea.. ? Normal += V3(dx,dy,dz)*Diff; - } } // Invert because we accumulate the value by pointing 'at' the cell we're checking diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index 2c6f298aa..306dce71e 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -45,7 +45,7 @@ out v4 Output; #define METHOD 1 // 0: cubic -// 1: quintic +// 1: quintic #define INTERPOLANT 1 @@ -276,7 +276,7 @@ void main() #if 1 v3 Period = V3(1000.f); float Amplitude = 1000.f; - f32 StartingZDepth = 8000.f; + f32 StartingZDepth = 2000.f; NoiseValue = StartingZDepth; diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 8e2f583f1..df2b5077b 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -1,3 +1,5 @@ +#extension GL_ARB_explicit_uniform_location : enable + uniform v3 WorldspaceBasis; uniform v3 ChunkResolution; @@ -39,7 +41,7 @@ uniform f32 Squareness; // 0 == not square, 1 == square -uniform sampler2D InputTex; +uniform layout(location = 1) sampler2D InputTex; in vec2 UV; out layout(location = 0) vec4 Output; @@ -53,11 +55,9 @@ void main() vec3 ColorValue = TexLookup.rgb; f32 NoiseValue = TexLookup.a; - f32 x = floor(gl_FragCoord.x); f32 z = floor(gl_FragCoord.y / 66); f32 y = floor(gl_FragCoord.y - (z*66)); - v3 xyz = V3(x,y,z) * ChunkResolution; // TODO(Jesse): I have no idea why this works out to > Min and <= Max. I diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index bafbe7e3a..443769d73 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -287,9 +287,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); UseShader(RC); - v2i TextureDim = RC->DestTex.Dim; - SetViewport(TextureDim); - Assert(TextureDim == V2i(68, 68*68)); + v2i DestTextureDim = RC->DestTex.Dim; + SetViewport(DestTextureDim); + Assert(DestTextureDim == V2i(68, 68*68)); RenderQuad(); @@ -309,9 +309,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) UseShader(RC); BindUniformByName(&RC->Program, "InputTex", InputTex, 0); - v2i TextureDim = RC->DestTex.Dim; - Assert(TextureDim == V2i(66, 66*66)); - SetViewport(TextureDim); + v2i DestTextureDim = RC->DestTex.Dim; + Assert(DestTextureDim == V2i(66, 66*66)); + SetViewport(DestTextureDim); RenderQuad(); @@ -336,10 +336,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) // UseShader to unit 0 BindUniformByName(&RC->Program, "InputTex", InputTex, 1); - v2i TextureDim = RC->DestTex->Dim; - Assert(TextureDim == V2i(66, 66*66)); - SetViewport(TextureDim); - RenderQuad(); AssertNoGlErrors; @@ -347,7 +343,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) InputTex = RC->DestTex; } - s32 PingPongIndex = 0; + s32 PingPongIndex = 1; #if 1 // @@ -389,7 +385,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[PingPongIndex].ID); - BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 0); + BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 1); brush_layer *Layer = Brush->Layers + LayerIndex; @@ -464,11 +460,11 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); AssertNoGlErrors; + /* gpu_timer Timer = StartGpuTimer(); */ RenderQuad(); /* EndGpuTimer(&Timer); */ /* Push(&Graphics->GpuTimers, &Timer); */ - InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; PingPongIndex = (PingPongIndex + 1) & 1; } @@ -501,11 +497,10 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; } - /* Assert(Chunk1->Dim == V3i(64)); */ /* Assert(NoiseDim == V3(66)); */ - v3i NoiseDim = V3i(66); + s32 NoiseElementCount = s32(Volume(InputTex->Dim)); s32 NoiseByteCount = NoiseElementCount*s32(sizeof(u16)); From 7cfc7cf19a1352c42a608855b8c33b9d290f04b9 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 1 May 2025 11:15:54 -0700 Subject: [PATCH 211/421] Rename LoadShaders -> CompileShaderPair --- examples/terrain_gen/game_constants.h | 4 ++-- external/bonsai_stdlib | 2 +- generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- generated/shader_magic_bloom_downsample_shader.h | 2 +- generated/shader_magic_bloom_upsample_shader.h | 2 +- generated/shader_magic_shadow_map_shader.h | 2 +- .../shader_magic_struct_terrain_decoration_shader.h | 2 +- ...ader_magic_struct_terrain_derivs_render_context.h | 2 +- ...er_magic_struct_terrain_finalize_render_context.h | 2 +- .../shader_magic_struct_terrain_shaping_shader.h | 2 +- generated/shader_magic_struct_world_edit_shader.h | 2 +- jesse.make.sh | 2 +- shaders/terrain/shaping/cliffy_hills.fragmentshader | 7 ++++--- .../terrain/shaping/terrain_shaping.fragmentshader | 6 +----- src/engine/render/render_init.cpp | 12 ++++++------ 21 files changed, 30 insertions(+), 33 deletions(-) diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 89329967b..30f46a5b2 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -20,8 +20,8 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ /* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ -g_VisibleRegion = Chunk_Dimension(64, 64, 64); -/* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ +/* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ +g_VisibleRegion = Chunk_Dimension(32, 32, 32); /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index cba8b1a74..6d95ba78a 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit cba8b1a74fc971415fd40b4b9b79fbb8f666d488 +Subproject commit 6d95ba78acbac7618fdbe7640cb6c4d336a21c14 diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index a05f53469..d2a982380 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:248:0 +// external/bonsai_stdlib/src/shader.cpp:250:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, m4 *Value) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 23e67f3fe..30c8f8cfa 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:263:0 +// external/bonsai_stdlib/src/shader.cpp:265:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, r32 *Value) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index 5520fa80e..51eb228f8 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:260:0 +// external/bonsai_stdlib/src/shader.cpp:262:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, s32 *Value) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index 9cf099052..fb679db21 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:245:0 +// external/bonsai_stdlib/src/shader.cpp:247:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, texture *Value) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 4c5f123cc..21f4f02c8 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:257:0 +// external/bonsai_stdlib/src/shader.cpp:259:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, u32 *Value) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index 85f84ab50..e1a7bf15b 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:251:0 +// external/bonsai_stdlib/src/shader.cpp:253:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, v2 *Value) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index cc2d1f256..306459a62 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:254:0 +// external/bonsai_stdlib/src/shader.cpp:256:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, v3 *Value) diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index 39eeb6b23..8356f8cde 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -3,7 +3,7 @@ link_internal void InitializeBloomDownsampleShader( bloom_downsample_shader *Struct , v2 *SrcResolution ) { - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_downsample.fragmentshader")); + Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_downsample.fragmentshader")); u32 UniformIndex = 0; diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index d3455c0f7..a3c41b979 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -3,7 +3,7 @@ link_internal void InitializeBloomUpsampleShader( bloom_upsample_shader *Struct , f32 *FilterRadius ) { - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_upsample.fragmentshader")); + Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_upsample.fragmentshader")); u32 UniformIndex = 0; diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index 4bc41dc21..aa617e324 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -3,7 +3,7 @@ link_internal void InitializeShadowMapShader( shadow_map_shader *Struct , m4 MVP , m4 ModelMatrix , v3 *MinClipP_worldspace , v3 *MaxClipP_worldspace ) { - Struct->Program = LoadShaders(CSz("shaders/DepthRTT.vertexshader"), CSz("shaders/DepthRTT.fragmentshader")); + Struct->Program = CompileShaderPair(CSz("shaders/DepthRTT.vertexshader"), CSz("shaders/DepthRTT.fragmentshader")); u32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index 37e5c41fd..e8ce2a282 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -3,7 +3,7 @@ link_internal void InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Struct , texture *DerivsTex , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) { - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/terrain_decoration.fragmentshader")); + Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/terrain_decoration.fragmentshader")); u32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_derivs_render_context.h b/generated/shader_magic_struct_terrain_derivs_render_context.h index 6bd78010d..ec6580ac0 100644 --- a/generated/shader_magic_struct_terrain_derivs_render_context.h +++ b/generated/shader_magic_struct_terrain_derivs_render_context.h @@ -3,7 +3,7 @@ link_internal void InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct , v3 Ignored ) { - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/derivs.fragmentshader")); + Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/derivs.fragmentshader")); u32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index c3c307b57..10f04b379 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -3,7 +3,7 @@ link_internal void InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct , texture *InputTex ) { - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/TerrainFinalize.fragmentshader")); + Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/TerrainFinalize.fragmentshader")); u32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index 4789f19ed..5aaccf63d 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -3,7 +3,7 @@ link_internal void InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) { - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/terrain_shaping.fragmentshader")); + Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/terrain_shaping.fragmentshader")); u32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index 4d84e279d..0bd1b725b 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -3,7 +3,7 @@ link_internal void InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *ChunkDim , v3 *WorldspaceBasis , v3 *ChunkResolution , s32 Type ) { - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); + Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); u32 UniformIndex = 0; diff --git a/jesse.make.sh b/jesse.make.sh index 4a47e50e2..81197b57f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/shaping/cliffy_hills.fragmentshader b/shaders/terrain/shaping/cliffy_hills.fragmentshader index ea5f97128..1502f8e3b 100644 --- a/shaders/terrain/shaping/cliffy_hills.fragmentshader +++ b/shaders/terrain/shaping/cliffy_hills.fragmentshader @@ -145,8 +145,9 @@ void main() { v3 Period = V3(1500.f); float Amplitude = 100.f; - f32 StartingZDepth = 10000; - /* f32 StartingZDepth = 0; */ + /* f32 StartingZDepth = 10000; */ + /* f32 StartingZDepth = 5000; */ + f32 StartingZDepth = 0; s32 Octaves = 6; NoiseValue = StartingZDepth; @@ -332,7 +333,7 @@ void main() // This creates a "plane" of terrain /* NoiseValue = NoiseValue - Basis.z + sin(Basis.x/500.f)*1000.f; */ /* NoiseValue = NoiseValue - Basis.z + sin(Basis.x/500.f)*300.f - cos(Basis.y/800.f)*200.f;; */ - NoiseValue = NoiseValue - Basis.z; + NoiseValue -= Basis.z; #if 0 if (NoiseValue <= 0) diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index 306dce71e..a1144546a 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -258,10 +258,6 @@ void main() f32 z = floor(gl_FragCoord.y / 68); f32 y = floor(gl_FragCoord.y - (z*68)); - /* if (x == 0 || x == 67) { Output = V4(1,0,0,1); return; } */ - /* if (y == 0 || y == 67) { Output = V4(1,1,0,1); return; } */ - /* if (z == 0 || z == 67) { Output = V4(1,0,1,1); return; } */ - v3 Offset = V3(-2, -2, -2); v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); @@ -276,7 +272,7 @@ void main() #if 1 v3 Period = V3(1000.f); float Amplitude = 1000.f; - f32 StartingZDepth = 2000.f; + f32 StartingZDepth = 1000.f; NoiseValue = StartingZDepth; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 0a47855e0..31a6a7297 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -78,7 +78,7 @@ MakeCompositeShader( memory_arena *GraphicsMemory, tone_mapping_type *ToneMappingType ) { - shader Shader = LoadShaders( CSz(BONSAI_SHADER_PATH "composite.vertexshader"), CSz(BONSAI_SHADER_PATH "composite.fragmentshader") ); + shader Shader = CompileShaderPair( CSz(BONSAI_SHADER_PATH "composite.vertexshader"), CSz(BONSAI_SHADER_PATH "composite.fragmentshader") ); shader_uniform **Current = &Shader.FirstUniform; @@ -172,7 +172,7 @@ MakeLightingShader( memory_arena *GraphicsMemory, b32 *UseLightingBloom ) { - shader Shader = LoadShaders( CSz(BONSAI_SHADER_PATH "Lighting.vertexshader"), CSz(BONSAI_SHADER_PATH "Lighting.fragmentshader") ); + shader Shader = CompileShaderPair( CSz(BONSAI_SHADER_PATH "Lighting.vertexshader"), CSz(BONSAI_SHADER_PATH "Lighting.fragmentshader") ); shader_uniform **Current = &Shader.FirstUniform; @@ -296,7 +296,7 @@ MakeGaussianBlurRenderGroup(v2 *ApplicationResolution, memory_arena *GraphicsMem { gaussian_render_group Result = {}; - Result.Shader = LoadShaders(CSz(STDLIB_SHADER_PATH "Passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "Gaussian.fragmentshader")); + Result.Shader = CompileShaderPair(CSz(STDLIB_SHADER_PATH "Passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "Gaussian.fragmentshader")); { shader_uniform **Current = &Result.Shader.FirstUniform; @@ -341,7 +341,7 @@ CreateGbuffer(memory_arena *Memory) shader CreateGbufferShader(graphics *Graphics, memory_arena *GraphicsMemory, v3 *MinClipP_worldspace, v3 *MaxClipP_worldspace, m4 *ViewProjection, camera *Camera, texture *ColorPaletteTexture) { - shader Shader = LoadShaders( CSz(BONSAI_SHADER_PATH "gBuffer.vertexshader"), CSz(BONSAI_SHADER_PATH "gBuffer.fragmentshader") ); + shader Shader = CompileShaderPair( CSz(BONSAI_SHADER_PATH "gBuffer.vertexshader"), CSz(BONSAI_SHADER_PATH "gBuffer.fragmentshader") ); shader_uniform **Current = &Shader.FirstUniform; @@ -394,7 +394,7 @@ MakeSsaoShader( memory_arena *GraphicsMemory, m4 *InverseProjectionMatrix, m4 *ViewProjection ) { - shader Shader = LoadShaders( CSz(STDLIB_SHADER_PATH "Passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "Ao.fragmentshader") ); + shader Shader = CompileShaderPair( CSz(STDLIB_SHADER_PATH "Passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "Ao.fragmentshader") ); shader_uniform **Current = &Shader.FirstUniform; @@ -496,7 +496,7 @@ InitRenderToTextureGroup(render_entity_to_texture_group *Group, texture *ColorPa link_internal shader MakeTransparencyShader(v2 *ApplicationResolution, b32 *BravoilMyersOIT, b32 *BravoilMcGuireOIT, m4 *ViewProjection, texture *gBufferDepthTexture, texture *ColorPaletteTexture, memory_arena *Memory) { - shader Shader = LoadShaders( CSz(BONSAI_SHADER_PATH "gBuffer.vertexshader"), CSz(BONSAI_SHADER_PATH "3DTransparency.fragmentshader") ); + shader Shader = CompileShaderPair( CSz(BONSAI_SHADER_PATH "gBuffer.vertexshader"), CSz(BONSAI_SHADER_PATH "3DTransparency.fragmentshader") ); shader_uniform **Current = &Shader.FirstUniform; From c4fc2cb08765ff878642afd10c2fc7e702c5289f Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 1 May 2025 13:16:14 -0700 Subject: [PATCH 212/421] Change shader to have a `shader_uniform_buffer` instead of linked list for storing uniform information --- .../block_array_c_shader_ptr_688853971.h | 2 +- .../block_array_h_shader_ptr_688853971_0.h | 2 +- generated/buffer_asset.h | 36 +-- generated/buffer_bitmap.h | 36 +-- generated/buffer_bonsai_type_info.h | 36 +-- generated/buffer_c_struct_u32.h | 20 ++ generated/buffer_c_struct_u64.h | 20 ++ generated/buffer_c_token.h | 36 +-- generated/buffer_c_token_buffer.h | 36 +-- generated/buffer_counted_string.h | 36 +-- generated/buffer_file_traversal_node.h | 36 +-- generated/buffer_h_struct_u32.h | 68 ++++++ generated/buffer_model.h | 19 +- generated/buffer_octree_node_ptr.h | 36 +-- generated/buffer_rect3i.h | 36 +-- generated/buffer_standing_spot.h | 36 +-- generated/buffer_struct.h | 84 +++++++ generated/buffer_thread_main_callback_type.h | 36 +-- generated/buffer_tile_ruleset.h | 36 +-- generated/buffer_u32.h | 36 +-- generated/buffer_u64.h | 36 +-- generated/buffer_ui_toggle_button_handle.h | 36 +-- generated/buffer_v3i.h | 36 +-- generated/buffer_voxel_synth_tile.h | 36 +-- generated/buffer_world_chunk_ptr.h | 36 +-- .../do_editor_ui_for_compound_type_shader.h | 4 +- generated/for_datatypes_0XxWqGSZ.h | 2 + generated/for_datatypes_fkubhsYl.h | 2 + generated/for_datatypes_kv3WBTai.h | 2 + generated/gen_shader_uniform_push_camera.h | 18 +- generated/gen_shader_uniform_push_light.h | 18 +- generated/gen_shader_uniform_push_m4.h | 20 +- generated/gen_shader_uniform_push_r32.h | 20 +- generated/gen_shader_uniform_push_s32.h | 20 +- generated/gen_shader_uniform_push_texture.h | 20 +- generated/gen_shader_uniform_push_u32.h | 20 +- generated/gen_shader_uniform_push_v2.h | 20 +- generated/gen_shader_uniform_push_v3.h | 20 +- .../shader_magic_bloom_downsample_shader.h | 5 +- .../shader_magic_bloom_upsample_shader.h | 5 +- generated/shader_magic_shadow_map_shader.h | 14 +- ...r_magic_struct_terrain_decoration_shader.h | 14 +- ...gic_struct_terrain_derivs_render_context.h | 5 +- ...c_struct_terrain_finalize_render_context.h | 5 +- ...ader_magic_struct_terrain_shaping_shader.h | 11 +- .../shader_magic_struct_world_edit_shader.h | 14 +- src/engine/api.cpp | 2 - src/engine/editor.cpp | 2 +- src/engine/engine.cpp | 1 + src/engine/model.cpp | 2 + src/engine/render/render_init.cpp | 221 ++++++------------ 51 files changed, 826 insertions(+), 524 deletions(-) create mode 100644 generated/buffer_c_struct_u32.h create mode 100644 generated/buffer_c_struct_u64.h create mode 100644 generated/buffer_h_struct_u32.h create mode 100644 generated/buffer_struct.h create mode 100644 src/engine/model.cpp diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index 123bd64cd..6a7a8dc63 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:2:0 +// external/bonsai_stdlib/src/shader.cpp:4:0 diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index b84f0e3e6..1087e4121 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:130:0 +// external/bonsai_stdlib/src/shader.h:129:0 diff --git a/generated/buffer_asset.h b/generated/buffer_asset.h index b268b5716..bc970c3ab 100644 --- a/generated/buffer_asset.h +++ b/generated/buffer_asset.h @@ -7,20 +7,12 @@ struct asset_buffer }; link_internal asset_buffer -AssetBuffer( umm ElementCount, memory_arena* Memory) -{ - asset_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( asset, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate asset_buffer of 0 length."); - } +AssetBuffer( umm ElementCount, memory_arena* Memory); +link_internal asset_buffer +AssetBuffer( asset *Start, umm ElementCount) +{ + asset_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(asset_buffer *Buf, umm Index) return Result; } +link_internal asset_buffer +AssetBuffer( umm ElementCount, memory_arena* Memory) +{ + asset_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( asset, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate asset_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_bitmap.h b/generated/buffer_bitmap.h index f6028d38a..fddb05401 100644 --- a/generated/buffer_bitmap.h +++ b/generated/buffer_bitmap.h @@ -7,20 +7,12 @@ struct bitmap_buffer }; link_internal bitmap_buffer -BitmapBuffer( umm ElementCount, memory_arena* Memory) -{ - bitmap_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( bitmap, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate bitmap_buffer of 0 length."); - } +BitmapBuffer( umm ElementCount, memory_arena* Memory); +link_internal bitmap_buffer +BitmapBuffer( bitmap *Start, umm ElementCount) +{ + bitmap_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(bitmap_buffer *Buf, umm Index) return Result; } +link_internal bitmap_buffer +BitmapBuffer( umm ElementCount, memory_arena* Memory) +{ + bitmap_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( bitmap, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate bitmap_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_bonsai_type_info.h b/generated/buffer_bonsai_type_info.h index a07edb7bb..70d9082a4 100644 --- a/generated/buffer_bonsai_type_info.h +++ b/generated/buffer_bonsai_type_info.h @@ -7,20 +7,12 @@ struct bonsai_type_info_buffer }; link_internal bonsai_type_info_buffer -BonsaiTypeInfoBuffer( umm ElementCount, memory_arena* Memory) -{ - bonsai_type_info_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( bonsai_type_info, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate bonsai_type_info_buffer of 0 length."); - } +BonsaiTypeInfoBuffer( umm ElementCount, memory_arena* Memory); +link_internal bonsai_type_info_buffer +BonsaiTypeInfoBuffer( bonsai_type_info *Start, umm ElementCount) +{ + bonsai_type_info_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(bonsai_type_info_buffer *Buf, umm Index) return Result; } +link_internal bonsai_type_info_buffer +BonsaiTypeInfoBuffer( umm ElementCount, memory_arena* Memory) +{ + bonsai_type_info_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( bonsai_type_info, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate bonsai_type_info_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_c_struct_u32.h b/generated/buffer_c_struct_u32.h new file mode 100644 index 000000000..77563ddce --- /dev/null +++ b/generated/buffer_c_struct_u32.h @@ -0,0 +1,20 @@ +// external/bonsai_stdlib/src/shader.cpp:1:0 + +link_internal shader_uniform_buffer +ShaderUniformBuffer( u32 ElementCount, memory_arena* Memory) +{ + shader_uniform_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( shader_uniform, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate shader_uniform_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_c_struct_u64.h b/generated/buffer_c_struct_u64.h new file mode 100644 index 000000000..eef485922 --- /dev/null +++ b/generated/buffer_c_struct_u64.h @@ -0,0 +1,20 @@ +// src/engine/model.cpp:1:0 + +link_internal model_buffer +ModelBuffer( u64 ElementCount, memory_arena* Memory) +{ + model_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( model, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate model_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_c_token.h b/generated/buffer_c_token.h index d621a59d3..feefd219f 100644 --- a/generated/buffer_c_token.h +++ b/generated/buffer_c_token.h @@ -7,20 +7,12 @@ struct c_token_buffer }; link_internal c_token_buffer -CTokenBuffer( umm ElementCount, memory_arena* Memory) -{ - c_token_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( c_token, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate c_token_buffer of 0 length."); - } +CTokenBuffer( umm ElementCount, memory_arena* Memory); +link_internal c_token_buffer +CTokenBuffer( c_token *Start, umm ElementCount) +{ + c_token_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(c_token_buffer *Buf, umm Index) return Result; } +link_internal c_token_buffer +CTokenBuffer( umm ElementCount, memory_arena* Memory) +{ + c_token_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( c_token, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate c_token_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_c_token_buffer.h b/generated/buffer_c_token_buffer.h index 451fb72dd..df452cc64 100644 --- a/generated/buffer_c_token_buffer.h +++ b/generated/buffer_c_token_buffer.h @@ -7,20 +7,12 @@ struct c_token_buffer_buffer }; link_internal c_token_buffer_buffer -CTokenBufferBuffer( umm ElementCount, memory_arena* Memory) -{ - c_token_buffer_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( c_token_buffer, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate c_token_buffer_buffer of 0 length."); - } +CTokenBufferBuffer( umm ElementCount, memory_arena* Memory); +link_internal c_token_buffer_buffer +CTokenBufferBuffer( c_token_buffer *Start, umm ElementCount) +{ + c_token_buffer_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(c_token_buffer_buffer *Buf, umm Index) return Result; } +link_internal c_token_buffer_buffer +CTokenBufferBuffer( umm ElementCount, memory_arena* Memory) +{ + c_token_buffer_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( c_token_buffer, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate c_token_buffer_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_counted_string.h b/generated/buffer_counted_string.h index 682f60305..dec4b222c 100644 --- a/generated/buffer_counted_string.h +++ b/generated/buffer_counted_string.h @@ -7,20 +7,12 @@ struct counted_string_buffer }; link_internal counted_string_buffer -CountedStringBuffer( umm ElementCount, memory_arena* Memory) -{ - counted_string_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( counted_string, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate counted_string_buffer of 0 length."); - } +CountedStringBuffer( umm ElementCount, memory_arena* Memory); +link_internal counted_string_buffer +CountedStringBuffer( counted_string *Start, umm ElementCount) +{ + counted_string_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(counted_string_buffer *Buf, umm Index) return Result; } +link_internal counted_string_buffer +CountedStringBuffer( umm ElementCount, memory_arena* Memory) +{ + counted_string_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( counted_string, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate counted_string_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_file_traversal_node.h b/generated/buffer_file_traversal_node.h index e5c53a59b..ba4321f0b 100644 --- a/generated/buffer_file_traversal_node.h +++ b/generated/buffer_file_traversal_node.h @@ -7,20 +7,12 @@ struct file_traversal_node_buffer }; link_internal file_traversal_node_buffer -FileTraversalNodeBuffer( umm ElementCount, memory_arena* Memory) -{ - file_traversal_node_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( file_traversal_node, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate file_traversal_node_buffer of 0 length."); - } +FileTraversalNodeBuffer( umm ElementCount, memory_arena* Memory); +link_internal file_traversal_node_buffer +FileTraversalNodeBuffer( file_traversal_node *Start, umm ElementCount) +{ + file_traversal_node_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(file_traversal_node_buffer *Buf, umm Index) return Result; } +link_internal file_traversal_node_buffer +FileTraversalNodeBuffer( umm ElementCount, memory_arena* Memory) +{ + file_traversal_node_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( file_traversal_node, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate file_traversal_node_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_h_struct_u32.h b/generated/buffer_h_struct_u32.h new file mode 100644 index 000000000..46ad10a8d --- /dev/null +++ b/generated/buffer_h_struct_u32.h @@ -0,0 +1,68 @@ +// external/bonsai_stdlib/src/shader.h:110:0 + +struct shader_uniform_buffer +{ + u32 Count; + shader_uniform *Start; poof(@array_length(Element->Count)) +}; + +link_internal shader_uniform_buffer +ShaderUniformBuffer( u32 ElementCount, memory_arena* Memory); + +link_internal shader_uniform_buffer +ShaderUniformBuffer( shader_uniform *Start, u32 ElementCount) +{ + shader_uniform_buffer Result = {ElementCount, Start}; + return Result; +} + +link_inline u32 +LastIndex(shader_uniform_buffer *Buf) +{ + u32 Result = Buf->Count > 0? Buf->Count-1 : 0; + return Result; +} + +link_inline u32 +ZerothIndex(shader_uniform_buffer *Buf) +{ + u32 Result = 0; + return Result; +} + +link_inline u32 +AtElements(shader_uniform_buffer *Buf) +{ + u32 Result = Buf->Count; + return Result; +} + +link_inline u32 +TotalElements(shader_uniform_buffer *Buf) +{ + u32 Result = Buf->Count; + return Result; +} + +link_inline u32 +CurrentCount(shader_uniform_buffer *Buf) +{ + u32 Result = Buf->Count; + return Result; +} + +link_inline shader_uniform * +GetPtr(shader_uniform_buffer *Buf, u32 Index) +{ + shader_uniform *Result = 0; + if (Index < Buf->Count) { Result = Buf->Start + Index; } + return Result; +} + +link_inline shader_uniform * +Get(shader_uniform_buffer *Buf, u32 Index) +{ + shader_uniform *Result = GetPtr(Buf, Index); + return Result; +} + diff --git a/generated/buffer_model.h b/generated/buffer_model.h index 677f26dee..6f5b0f236 100644 --- a/generated/buffer_model.h +++ b/generated/buffer_model.h @@ -7,20 +7,12 @@ struct model_buffer }; link_internal model_buffer -ModelBuffer( u64 ElementCount, memory_arena* Memory) -{ - model_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( model, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate model_buffer of 0 length."); - } +ModelBuffer( u64 ElementCount, memory_arena* Memory); +link_internal model_buffer +ModelBuffer( model *Start, u64 ElementCount) +{ + model_buffer Result = {ElementCount, Start}; return Result; } @@ -74,3 +66,4 @@ Get(model_buffer *Buf, u64 Index) return Result; } + diff --git a/generated/buffer_octree_node_ptr.h b/generated/buffer_octree_node_ptr.h index 8da1f9900..80bd094f2 100644 --- a/generated/buffer_octree_node_ptr.h +++ b/generated/buffer_octree_node_ptr.h @@ -7,20 +7,12 @@ struct octree_node_ptr_buffer }; link_internal octree_node_ptr_buffer -OctreeNodePtrBuffer( umm ElementCount, memory_arena* Memory) -{ - octree_node_ptr_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( octree_node_ptr, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate octree_node_ptr_buffer of 0 length."); - } +OctreeNodePtrBuffer( umm ElementCount, memory_arena* Memory); +link_internal octree_node_ptr_buffer +OctreeNodePtrBuffer( octree_node_ptr *Start, umm ElementCount) +{ + octree_node_ptr_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(octree_node_ptr_buffer *Buf, umm Index) return Result; } +link_internal octree_node_ptr_buffer +OctreeNodePtrBuffer( umm ElementCount, memory_arena* Memory) +{ + octree_node_ptr_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( octree_node_ptr, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate octree_node_ptr_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_rect3i.h b/generated/buffer_rect3i.h index 9e8296b3a..805a61c90 100644 --- a/generated/buffer_rect3i.h +++ b/generated/buffer_rect3i.h @@ -7,20 +7,12 @@ struct rect3i_buffer }; link_internal rect3i_buffer -Rect3iBuffer( umm ElementCount, memory_arena* Memory) -{ - rect3i_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( rect3i, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate rect3i_buffer of 0 length."); - } +Rect3iBuffer( umm ElementCount, memory_arena* Memory); +link_internal rect3i_buffer +Rect3iBuffer( rect3i *Start, umm ElementCount) +{ + rect3i_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(rect3i_buffer *Buf, umm Index) return Result; } +link_internal rect3i_buffer +Rect3iBuffer( umm ElementCount, memory_arena* Memory) +{ + rect3i_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( rect3i, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate rect3i_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 231a1a894..18c345ad9 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -7,20 +7,12 @@ struct standing_spot_buffer }; link_internal standing_spot_buffer -StandingSpotBuffer( umm ElementCount, memory_arena* Memory) -{ - standing_spot_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( standing_spot, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate standing_spot_buffer of 0 length."); - } +StandingSpotBuffer( umm ElementCount, memory_arena* Memory); +link_internal standing_spot_buffer +StandingSpotBuffer( standing_spot *Start, umm ElementCount) +{ + standing_spot_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(standing_spot_buffer *Buf, umm Index) return Result; } +link_internal standing_spot_buffer +StandingSpotBuffer( umm ElementCount, memory_arena* Memory) +{ + standing_spot_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( standing_spot, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate standing_spot_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_struct.h b/generated/buffer_struct.h new file mode 100644 index 000000000..a909bbae3 --- /dev/null +++ b/generated/buffer_struct.h @@ -0,0 +1,84 @@ +// external/bonsai_stdlib/src/shader.h:111:0 + +struct shader_uniform_buffer +{ + umm Count; + shader_uniform *Start; poof(@array_length(Element->Count)) +}; + +link_internal shader_uniform_buffer +ShaderUniformBuffer( shader_uniform *Start, umm ElementCount) +{ + shader_uniform_buffer Result = {ElementCount, Start}; + return Result; +} + +link_internal shader_uniform_buffer +ShaderUniformBuffer( umm ElementCount, memory_arena* Memory) +{ + shader_uniform_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( shader_uniform, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate shader_uniform_buffer of 0 length."); + } + + return Result; +} + +link_inline umm +LastIndex(shader_uniform_buffer *Buf) +{ + umm Result = Buf->Count > 0? Buf->Count-1 : 0; + return Result; +} + +link_inline umm +ZerothIndex(shader_uniform_buffer *Buf) +{ + umm Result = 0; + return Result; +} + +link_inline umm +AtElements(shader_uniform_buffer *Buf) +{ + umm Result = Buf->Count; + return Result; +} + +link_inline umm +TotalElements(shader_uniform_buffer *Buf) +{ + umm Result = Buf->Count; + return Result; +} + +link_inline umm +CurrentCount(shader_uniform_buffer *Buf) +{ + umm Result = Buf->Count; + return Result; +} + +link_inline shader_uniform * +GetPtr(shader_uniform_buffer *Buf, umm Index) +{ + shader_uniform *Result = 0; + if (Index < Buf->Count) { Result = Buf->Start + Index; } + return Result; +} + +link_inline shader_uniform * +Get(shader_uniform_buffer *Buf, umm Index) +{ + shader_uniform *Result = GetPtr(Buf, Index); + return Result; +} + + diff --git a/generated/buffer_thread_main_callback_type.h b/generated/buffer_thread_main_callback_type.h index c2df75b22..f1bcfc45f 100644 --- a/generated/buffer_thread_main_callback_type.h +++ b/generated/buffer_thread_main_callback_type.h @@ -7,20 +7,12 @@ struct thread_main_callback_type_buffer }; link_internal thread_main_callback_type_buffer -ThreadMainCallbackTypeBuffer( umm ElementCount, memory_arena* Memory) -{ - thread_main_callback_type_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( thread_main_callback_type, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate thread_main_callback_type_buffer of 0 length."); - } +ThreadMainCallbackTypeBuffer( umm ElementCount, memory_arena* Memory); +link_internal thread_main_callback_type_buffer +ThreadMainCallbackTypeBuffer( thread_main_callback_type *Start, umm ElementCount) +{ + thread_main_callback_type_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(thread_main_callback_type_buffer *Buf, umm Index) return Result; } +link_internal thread_main_callback_type_buffer +ThreadMainCallbackTypeBuffer( umm ElementCount, memory_arena* Memory) +{ + thread_main_callback_type_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( thread_main_callback_type, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate thread_main_callback_type_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_tile_ruleset.h b/generated/buffer_tile_ruleset.h index 13739dec7..b59cd59c5 100644 --- a/generated/buffer_tile_ruleset.h +++ b/generated/buffer_tile_ruleset.h @@ -7,20 +7,12 @@ struct tile_ruleset_buffer }; link_internal tile_ruleset_buffer -TileRulesetBuffer( umm ElementCount, memory_arena* Memory) -{ - tile_ruleset_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( tile_ruleset, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate tile_ruleset_buffer of 0 length."); - } +TileRulesetBuffer( umm ElementCount, memory_arena* Memory); +link_internal tile_ruleset_buffer +TileRulesetBuffer( tile_ruleset *Start, umm ElementCount) +{ + tile_ruleset_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(tile_ruleset_buffer *Buf, umm Index) return Result; } +link_internal tile_ruleset_buffer +TileRulesetBuffer( umm ElementCount, memory_arena* Memory) +{ + tile_ruleset_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( tile_ruleset, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate tile_ruleset_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_u32.h b/generated/buffer_u32.h index 9038f870d..18deb728b 100644 --- a/generated/buffer_u32.h +++ b/generated/buffer_u32.h @@ -7,20 +7,12 @@ struct u32_buffer }; link_internal u32_buffer -U32Buffer( umm ElementCount, memory_arena* Memory) -{ - u32_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( u32, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate u32_buffer of 0 length."); - } +U32Buffer( umm ElementCount, memory_arena* Memory); +link_internal u32_buffer +U32Buffer( u32 *Start, umm ElementCount) +{ + u32_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(u32_buffer *Buf, umm Index) return Result; } +link_internal u32_buffer +U32Buffer( umm ElementCount, memory_arena* Memory) +{ + u32_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( u32, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate u32_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_u64.h b/generated/buffer_u64.h index 926de5005..d3496a2f0 100644 --- a/generated/buffer_u64.h +++ b/generated/buffer_u64.h @@ -7,20 +7,12 @@ struct u64_buffer }; link_internal u64_buffer -U64Buffer( umm ElementCount, memory_arena* Memory) -{ - u64_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( u64, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate u64_buffer of 0 length."); - } +U64Buffer( umm ElementCount, memory_arena* Memory); +link_internal u64_buffer +U64Buffer( u64 *Start, umm ElementCount) +{ + u64_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(u64_buffer *Buf, umm Index) return Result; } +link_internal u64_buffer +U64Buffer( umm ElementCount, memory_arena* Memory) +{ + u64_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( u64, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate u64_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_ui_toggle_button_handle.h b/generated/buffer_ui_toggle_button_handle.h index a8759e243..78f767053 100644 --- a/generated/buffer_ui_toggle_button_handle.h +++ b/generated/buffer_ui_toggle_button_handle.h @@ -7,20 +7,12 @@ struct ui_toggle_button_handle_buffer }; link_internal ui_toggle_button_handle_buffer -UiToggleButtonHandleBuffer( umm ElementCount, memory_arena* Memory) -{ - ui_toggle_button_handle_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( ui_toggle_button_handle, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate ui_toggle_button_handle_buffer of 0 length."); - } +UiToggleButtonHandleBuffer( umm ElementCount, memory_arena* Memory); +link_internal ui_toggle_button_handle_buffer +UiToggleButtonHandleBuffer( ui_toggle_button_handle *Start, umm ElementCount) +{ + ui_toggle_button_handle_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(ui_toggle_button_handle_buffer *Buf, umm Index) return Result; } +link_internal ui_toggle_button_handle_buffer +UiToggleButtonHandleBuffer( umm ElementCount, memory_arena* Memory) +{ + ui_toggle_button_handle_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( ui_toggle_button_handle, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate ui_toggle_button_handle_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_v3i.h b/generated/buffer_v3i.h index e8ee9cb79..61be3abab 100644 --- a/generated/buffer_v3i.h +++ b/generated/buffer_v3i.h @@ -7,20 +7,12 @@ struct v3i_buffer }; link_internal v3i_buffer -V3iBuffer( umm ElementCount, memory_arena* Memory) -{ - v3i_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( v3i, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate v3i_buffer of 0 length."); - } +V3iBuffer( umm ElementCount, memory_arena* Memory); +link_internal v3i_buffer +V3iBuffer( v3i *Start, umm ElementCount) +{ + v3i_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(v3i_buffer *Buf, umm Index) return Result; } +link_internal v3i_buffer +V3iBuffer( umm ElementCount, memory_arena* Memory) +{ + v3i_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( v3i, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate v3i_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_voxel_synth_tile.h b/generated/buffer_voxel_synth_tile.h index 283c551a0..9d9df0ab6 100644 --- a/generated/buffer_voxel_synth_tile.h +++ b/generated/buffer_voxel_synth_tile.h @@ -7,20 +7,12 @@ struct voxel_synth_tile_buffer }; link_internal voxel_synth_tile_buffer -VoxelSynthTileBuffer( umm ElementCount, memory_arena* Memory) -{ - voxel_synth_tile_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( voxel_synth_tile, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate voxel_synth_tile_buffer of 0 length."); - } +VoxelSynthTileBuffer( umm ElementCount, memory_arena* Memory); +link_internal voxel_synth_tile_buffer +VoxelSynthTileBuffer( voxel_synth_tile *Start, umm ElementCount) +{ + voxel_synth_tile_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(voxel_synth_tile_buffer *Buf, umm Index) return Result; } +link_internal voxel_synth_tile_buffer +VoxelSynthTileBuffer( umm ElementCount, memory_arena* Memory) +{ + voxel_synth_tile_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( voxel_synth_tile, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate voxel_synth_tile_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index 35e52e843..cd2b7c3f4 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -7,20 +7,12 @@ struct world_chunk_ptr_buffer }; link_internal world_chunk_ptr_buffer -WorldChunkPtrBuffer( umm ElementCount, memory_arena* Memory) -{ - world_chunk_ptr_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( world_chunk_ptr, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate world_chunk_ptr_buffer of 0 length."); - } +WorldChunkPtrBuffer( umm ElementCount, memory_arena* Memory); +link_internal world_chunk_ptr_buffer +WorldChunkPtrBuffer( world_chunk_ptr *Start, umm ElementCount) +{ + world_chunk_ptr_buffer Result = {ElementCount, Start}; return Result; } @@ -74,4 +66,22 @@ Get(world_chunk_ptr_buffer *Buf, umm Index) return Result; } +link_internal world_chunk_ptr_buffer +WorldChunkPtrBuffer( umm ElementCount, memory_arena* Memory) +{ + world_chunk_ptr_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( world_chunk_ptr, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate world_chunk_ptr_buffer of 0 length."); + } + + return Result; +} + diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 3e84503f9..8913f74c8 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -46,8 +46,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shader_uniform*, Element->FirstUniform), - CSz("FirstUniform"), + Cast(shader_uniform_buffer*, &Element->Uniforms), + CSz("Uniforms"), Params ); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 384efb3a6..5256a8316 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -219,6 +219,8 @@ + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index d768f2fd4..b82efa11b 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -219,6 +219,8 @@ + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 73570f4a2..34889058d 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -219,6 +219,8 @@ + + diff --git a/generated/gen_shader_uniform_push_camera.h b/generated/gen_shader_uniform_push_camera.h index 2ac1f4dc2..701ef78d6 100644 --- a/generated/gen_shader_uniform_push_camera.h +++ b/generated/gen_shader_uniform_push_camera.h @@ -17,17 +17,19 @@ GetUniform(memory_arena *Mem, shader *Shader, camera *Value, const char *Name) return Uniform; } -shader_uniform -ShaderUniform(shader *Shader, camera *Value, const char *Name) +b32 +SetShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name) { - shader_uniform Uniform = {}; + Assert(Index < Shader->Uniforms.Count); - Uniform.Type = ShaderUniform_Camera; - Uniform.Camera = Value; - Uniform.Name = Name; + shader_uniform *Uniform = Shader->Uniforms.Start + Index; - Uniform.ID = GetShaderUniform(Shader, Name); + Uniform->Type = ShaderUniform_Camera; + Uniform->Camera = Value; + Uniform->Name = Name; - return Uniform; + Uniform->ID = GetShaderUniform(Shader, Name); + + return Uniform->ID != INVALID_SHADER_UNIFORM; } diff --git a/generated/gen_shader_uniform_push_light.h b/generated/gen_shader_uniform_push_light.h index 3f1e01a9b..efbc6f35e 100644 --- a/generated/gen_shader_uniform_push_light.h +++ b/generated/gen_shader_uniform_push_light.h @@ -17,17 +17,19 @@ GetUniform(memory_arena *Mem, shader *Shader, light *Value, const char *Name) return Uniform; } -shader_uniform -ShaderUniform(shader *Shader, light *Value, const char *Name) +b32 +SetShaderUniform(shader *Shader, u32 Index, light *Value, const char *Name) { - shader_uniform Uniform = {}; + Assert(Index < Shader->Uniforms.Count); - Uniform.Type = ShaderUniform_Light; - Uniform.Light = Value; - Uniform.Name = Name; + shader_uniform *Uniform = Shader->Uniforms.Start + Index; - Uniform.ID = GetShaderUniform(Shader, Name); + Uniform->Type = ShaderUniform_Light; + Uniform->Light = Value; + Uniform->Name = Name; - return Uniform; + Uniform->ID = GetShaderUniform(Shader, Name); + + return Uniform->ID != INVALID_SHADER_UNIFORM; } diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index d2a982380..75248f5b9 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:250:0 +// external/bonsai_stdlib/src/shader.cpp:252:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, m4 *Value) @@ -17,17 +17,19 @@ GetUniform(memory_arena *Mem, shader *Shader, m4 *Value, const char *Name) return Uniform; } -shader_uniform -ShaderUniform(shader *Shader, m4 *Value, const char *Name) +b32 +SetShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) { - shader_uniform Uniform = {}; + Assert(Index < Shader->Uniforms.Count); - Uniform.Type = ShaderUniform_M4; - Uniform.M4 = Value; - Uniform.Name = Name; + shader_uniform *Uniform = Shader->Uniforms.Start + Index; - Uniform.ID = GetShaderUniform(Shader, Name); + Uniform->Type = ShaderUniform_M4; + Uniform->M4 = Value; + Uniform->Name = Name; - return Uniform; + Uniform->ID = GetShaderUniform(Shader, Name); + + return Uniform->ID != INVALID_SHADER_UNIFORM; } diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 30c8f8cfa..7328dcab6 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:265:0 +// external/bonsai_stdlib/src/shader.cpp:267:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, r32 *Value) @@ -17,17 +17,19 @@ GetUniform(memory_arena *Mem, shader *Shader, r32 *Value, const char *Name) return Uniform; } -shader_uniform -ShaderUniform(shader *Shader, r32 *Value, const char *Name) +b32 +SetShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) { - shader_uniform Uniform = {}; + Assert(Index < Shader->Uniforms.Count); - Uniform.Type = ShaderUniform_R32; - Uniform.R32 = Value; - Uniform.Name = Name; + shader_uniform *Uniform = Shader->Uniforms.Start + Index; - Uniform.ID = GetShaderUniform(Shader, Name); + Uniform->Type = ShaderUniform_R32; + Uniform->R32 = Value; + Uniform->Name = Name; - return Uniform; + Uniform->ID = GetShaderUniform(Shader, Name); + + return Uniform->ID != INVALID_SHADER_UNIFORM; } diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index 51eb228f8..f9298381e 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:262:0 +// external/bonsai_stdlib/src/shader.cpp:264:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, s32 *Value) @@ -17,17 +17,19 @@ GetUniform(memory_arena *Mem, shader *Shader, s32 *Value, const char *Name) return Uniform; } -shader_uniform -ShaderUniform(shader *Shader, s32 *Value, const char *Name) +b32 +SetShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) { - shader_uniform Uniform = {}; + Assert(Index < Shader->Uniforms.Count); - Uniform.Type = ShaderUniform_S32; - Uniform.S32 = Value; - Uniform.Name = Name; + shader_uniform *Uniform = Shader->Uniforms.Start + Index; - Uniform.ID = GetShaderUniform(Shader, Name); + Uniform->Type = ShaderUniform_S32; + Uniform->S32 = Value; + Uniform->Name = Name; - return Uniform; + Uniform->ID = GetShaderUniform(Shader, Name); + + return Uniform->ID != INVALID_SHADER_UNIFORM; } diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index fb679db21..62916abbe 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:247:0 +// external/bonsai_stdlib/src/shader.cpp:249:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, texture *Value) @@ -17,17 +17,19 @@ GetUniform(memory_arena *Mem, shader *Shader, texture *Value, const char *Name) return Uniform; } -shader_uniform -ShaderUniform(shader *Shader, texture *Value, const char *Name) +b32 +SetShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) { - shader_uniform Uniform = {}; + Assert(Index < Shader->Uniforms.Count); - Uniform.Type = ShaderUniform_Texture; - Uniform.Texture = Value; - Uniform.Name = Name; + shader_uniform *Uniform = Shader->Uniforms.Start + Index; - Uniform.ID = GetShaderUniform(Shader, Name); + Uniform->Type = ShaderUniform_Texture; + Uniform->Texture = Value; + Uniform->Name = Name; - return Uniform; + Uniform->ID = GetShaderUniform(Shader, Name); + + return Uniform->ID != INVALID_SHADER_UNIFORM; } diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 21f4f02c8..f85a652c8 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:259:0 +// external/bonsai_stdlib/src/shader.cpp:261:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, u32 *Value) @@ -17,17 +17,19 @@ GetUniform(memory_arena *Mem, shader *Shader, u32 *Value, const char *Name) return Uniform; } -shader_uniform -ShaderUniform(shader *Shader, u32 *Value, const char *Name) +b32 +SetShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) { - shader_uniform Uniform = {}; + Assert(Index < Shader->Uniforms.Count); - Uniform.Type = ShaderUniform_U32; - Uniform.U32 = Value; - Uniform.Name = Name; + shader_uniform *Uniform = Shader->Uniforms.Start + Index; - Uniform.ID = GetShaderUniform(Shader, Name); + Uniform->Type = ShaderUniform_U32; + Uniform->U32 = Value; + Uniform->Name = Name; - return Uniform; + Uniform->ID = GetShaderUniform(Shader, Name); + + return Uniform->ID != INVALID_SHADER_UNIFORM; } diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index e1a7bf15b..481b8a86a 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:253:0 +// external/bonsai_stdlib/src/shader.cpp:255:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, v2 *Value) @@ -17,17 +17,19 @@ GetUniform(memory_arena *Mem, shader *Shader, v2 *Value, const char *Name) return Uniform; } -shader_uniform -ShaderUniform(shader *Shader, v2 *Value, const char *Name) +b32 +SetShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) { - shader_uniform Uniform = {}; + Assert(Index < Shader->Uniforms.Count); - Uniform.Type = ShaderUniform_V2; - Uniform.V2 = Value; - Uniform.Name = Name; + shader_uniform *Uniform = Shader->Uniforms.Start + Index; - Uniform.ID = GetShaderUniform(Shader, Name); + Uniform->Type = ShaderUniform_V2; + Uniform->V2 = Value; + Uniform->Name = Name; - return Uniform; + Uniform->ID = GetShaderUniform(Shader, Name); + + return Uniform->ID != INVALID_SHADER_UNIFORM; } diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index 306459a62..a29c6d269 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:256:0 +// external/bonsai_stdlib/src/shader.cpp:258:0 shader_uniform * PushShaderUniform( memory_arena *Mem, const char *Name, v3 *Value) @@ -17,17 +17,19 @@ GetUniform(memory_arena *Mem, shader *Shader, v3 *Value, const char *Name) return Uniform; } -shader_uniform -ShaderUniform(shader *Shader, v3 *Value, const char *Name) +b32 +SetShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) { - shader_uniform Uniform = {}; + Assert(Index < Shader->Uniforms.Count); - Uniform.Type = ShaderUniform_V3; - Uniform.V3 = Value; - Uniform.Name = Name; + shader_uniform *Uniform = Shader->Uniforms.Start + Index; - Uniform.ID = GetShaderUniform(Shader, Name); + Uniform->Type = ShaderUniform_V3; + Uniform->V3 = Value; + Uniform->Name = Name; - return Uniform; + Uniform->ID = GetShaderUniform(Shader, Name); + + return Uniform->ID != INVALID_SHADER_UNIFORM; } diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index 8356f8cde..b356ce476 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -4,12 +4,11 @@ link_internal void InitializeBloomDownsampleShader( bloom_downsample_shader *Struct , v2 *SrcResolution ) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_downsample.fragmentshader")); + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; - Struct->SrcResolution = SrcResolution; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->SrcResolution, "SrcResolution"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SrcResolution, "SrcResolution"); diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index a3c41b979..58e720626 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -4,12 +4,11 @@ link_internal void InitializeBloomUpsampleShader( bloom_upsample_shader *Struct , f32 *FilterRadius ) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_upsample.fragmentshader")); + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; - Struct->FilterRadius = FilterRadius; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->FilterRadius, "FilterRadius"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FilterRadius, "FilterRadius"); diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index aa617e324..0d4d9c398 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -4,24 +4,20 @@ link_internal void InitializeShadowMapShader( shadow_map_shader *Struct , m4 MVP , m4 ModelMatrix , v3 *MinClipP_worldspace , v3 *MaxClipP_worldspace ) { Struct->Program = CompileShaderPair(CSz("shaders/DepthRTT.vertexshader"), CSz("shaders/DepthRTT.fragmentshader")); + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; - Struct->MVP = MVP; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->MVP, "MVP"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->MVP, "MVP"); Struct->ModelMatrix = ModelMatrix; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ModelMatrix, "ModelMatrix"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ModelMatrix, "ModelMatrix"); Struct->MinClipP_worldspace = MinClipP_worldspace; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->MinClipP_worldspace, "MinClipP_worldspace"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->MinClipP_worldspace, "MinClipP_worldspace"); Struct->MaxClipP_worldspace = MaxClipP_worldspace; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->MaxClipP_worldspace, "MaxClipP_worldspace"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->MaxClipP_worldspace, "MaxClipP_worldspace"); if (UniformIndex != 4 ) { diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index e8ce2a282..60f461306 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -4,24 +4,20 @@ link_internal void InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Struct , texture *DerivsTex , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/terrain_decoration.fragmentshader")); + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; - Struct->DerivsTex = DerivsTex; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->DerivsTex, "DerivsTex"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->DerivsTex, "DerivsTex"); Struct->ChunkDim = ChunkDim; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkDim, "ChunkDim"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); Struct->WorldspaceBasis = WorldspaceBasis; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->WorldspaceBasis, "WorldspaceBasis"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceBasis, "WorldspaceBasis"); Struct->ChunkResolution = ChunkResolution; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); if (UniformIndex != 4 ) { diff --git a/generated/shader_magic_struct_terrain_derivs_render_context.h b/generated/shader_magic_struct_terrain_derivs_render_context.h index ec6580ac0..368819584 100644 --- a/generated/shader_magic_struct_terrain_derivs_render_context.h +++ b/generated/shader_magic_struct_terrain_derivs_render_context.h @@ -4,12 +4,11 @@ link_internal void InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct , v3 Ignored ) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/derivs.fragmentshader")); + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; - Struct->Ignored = Ignored; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->Ignored, "Ignored"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index 10f04b379..176133576 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -4,12 +4,11 @@ link_internal void InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct , texture *InputTex ) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/TerrainFinalize.fragmentshader")); + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; - Struct->InputTex = InputTex; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->InputTex, "InputTex"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InputTex, "InputTex"); diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index 5aaccf63d..b9d3e9f18 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -4,20 +4,17 @@ link_internal void InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/terrain_shaping.fragmentshader")); + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; - Struct->ChunkDim = ChunkDim; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkDim, "ChunkDim"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); Struct->WorldspaceBasis = WorldspaceBasis; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->WorldspaceBasis, "WorldspaceBasis"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceBasis, "WorldspaceBasis"); Struct->ChunkResolution = ChunkResolution; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); if (UniformIndex != 3 ) { diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index 0bd1b725b..c602c6eb6 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -4,24 +4,20 @@ link_internal void InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *ChunkDim , v3 *WorldspaceBasis , v3 *ChunkResolution , s32 Type ) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; - Struct->ChunkDim = ChunkDim; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->ChunkDim, "ChunkDim"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkDim, "ChunkDim"); Struct->WorldspaceBasis = WorldspaceBasis; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->WorldspaceBasis, "WorldspaceBasis"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->WorldspaceBasis, "WorldspaceBasis"); Struct->ChunkResolution = ChunkResolution; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, Struct->ChunkResolution, "ChunkResolution"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkResolution, "ChunkResolution"); Struct->Type = Type; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->Type, "Type"); - ++UniformIndex; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Type, "Type"); if (UniformIndex != 4 ) { diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 4dab61aa5..f05b8977b 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -559,7 +559,6 @@ Bonsai_Render(engine_resources *Engine) .U32 = &Global_False, .ID = INVALID_SHADER_UNIFORM, .Name = "DrawMinorGrid", - .Next = 0, }; shader_uniform MajorGridUniform = @@ -568,7 +567,6 @@ Bonsai_Render(engine_resources *Engine) .U32 = &Global_False, .ID = INVALID_SHADER_UNIFORM, .Name = "DrawMajorGrid", - .Next = 0, }; diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 0765727ba..079e0df93 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -384,7 +384,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs N PushTableEnd(Ui); PushNewRow(Ui); - DoEditorUi(Ui, Window, Element->Next, CSz("shader_uniform Next"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + /* DoEditorUi(Ui, Window, Element->Next, CSz("shader_uniform Next"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); */ } } else diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index eccc2cd7b..83bf64580 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include diff --git a/src/engine/model.cpp b/src/engine/model.cpp new file mode 100644 index 000000000..d6ac94c99 --- /dev/null +++ b/src/engine/model.cpp @@ -0,0 +1,2 @@ +poof(buffer_c(model, u64)) +#include diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 31a6a7297..de12d2997 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -79,15 +79,11 @@ MakeCompositeShader( memory_arena *GraphicsMemory, ) { shader Shader = CompileShaderPair( CSz(BONSAI_SHADER_PATH "composite.vertexshader"), CSz(BONSAI_SHADER_PATH "composite.fragmentshader") ); - - shader_uniform **Current = &Shader.FirstUniform; + Shader.Uniforms = ShaderUniformBuffer(11, GraphicsMemory); /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Color, "gColor"); */ /* Current = &(*Current)->Next; */ - *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Normal, "gNormal"); - Current = &(*Current)->Next; - /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); */ /* Current = &(*Current)->Next; */ @@ -97,41 +93,32 @@ MakeCompositeShader( memory_arena *GraphicsMemory, /* *Current = GetUniform(GraphicsMemory, &Shader, Ssao, "Ssao"); */ /* Current = &(*Current)->Next; */ - *Current = GetUniform(GraphicsMemory, &Shader, BloomTex, "BloomTex"); - Current = &(*Current)->Next; + /* SetShaderUniform(&Shader, 8, ShadowMVP, "ShadowMVP"); *1/ */ - *Current = GetUniform(GraphicsMemory, &Shader, TransparencyAccum, "TransparencyAccum"); - Current = &(*Current)->Next; + /* SetShaderUniform(&Shader, 9, Camera, "CameraP"); *1/ */ - *Current = GetUniform(GraphicsMemory, &Shader, TransparencyCount, "TransparencyCount"); - Current = &(*Current)->Next; - *Current = GetUniform(GraphicsMemory, &Shader, (u32*)UseLightingBloom, "UseLightingBloom"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 0, &gTextures->Normal, "gNormal"); - *Current = GetUniform(GraphicsMemory, &Shader, (u32*)BravoilMyersOIT, "BravoilMyersOIT"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 1, BloomTex, "BloomTex"); - *Current = GetUniform(GraphicsMemory, &Shader, (u32*)BravoilMcGuireOIT, "BravoilMcGuireOIT"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 2, TransparencyAccum, "TransparencyAccum"); - *Current = GetUniform(GraphicsMemory, &Shader, LuminanceTex, "LuminanceTex"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 3, TransparencyCount, "TransparencyCount"); - /* *Current = GetUniform(GraphicsMemory, &Shader, ShadowMVP, "ShadowMVP"); */ - /* Current = &(*Current)->Next; */ + SetShaderUniform(&Shader, 4, (u32*)UseLightingBloom, "UseLightingBloom"); - /* *Current = GetUniform(GraphicsMemory, &Shader, Camera, "CameraP"); */ - /* Current = &(*Current)->Next; */ + SetShaderUniform(&Shader, 5, (u32*)BravoilMyersOIT, "BravoilMyersOIT"); - *Current = GetUniform(GraphicsMemory, &Shader, Exposure, "Exposure"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 6, (u32*)BravoilMcGuireOIT, "BravoilMcGuireOIT"); - *Current = GetUniform(GraphicsMemory, &Shader, (int*)ToneMappingType, "ToneMappingType"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 7, LuminanceTex, "LuminanceTex"); - *Current = GetUniform(GraphicsMemory, &Shader, ApplicationResolution, "ApplicationResolution"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 8, Exposure, "Exposure"); + + SetShaderUniform(&Shader, 9, (int*)ToneMappingType, "ToneMappingType"); + + SetShaderUniform(&Shader, 10, ApplicationResolution, "ApplicationResolution"); AssertNoGlErrors; @@ -174,99 +161,71 @@ MakeLightingShader( memory_arena *GraphicsMemory, { shader Shader = CompileShaderPair( CSz(BONSAI_SHADER_PATH "Lighting.vertexshader"), CSz(BONSAI_SHADER_PATH "Lighting.fragmentshader") ); - shader_uniform **Current = &Shader.FirstUniform; + Shader.Uniforms = ShaderUniformBuffer(26, GraphicsMemory); - *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Color, "gColor"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 0, &gTextures->Color, "gColor"); - *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Normal, "gNormal"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 1, &gTextures->Normal, "gNormal"); /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); */ /* Current = &(*Current)->Next; */ - *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Depth, "gDepth"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 2, &gTextures->Depth, "gDepth"); - *Current = GetUniform(GraphicsMemory, &Shader, ShadowMap, "shadowMap"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 3, ShadowMap, "shadowMap"); - *Current = GetUniform(GraphicsMemory, &Shader, Ssao, "Ssao"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 4, Ssao, "Ssao"); - *Current = GetUniform(GraphicsMemory, &Shader, AccumTex, "TransparencyAccum"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 5, AccumTex, "TransparencyAccum"); - *Current = GetUniform(GraphicsMemory, &Shader, CountTex, "TransparencyCount"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 6, CountTex, "TransparencyCount"); - *Current = GetUniform(GraphicsMemory, &Shader, BravoilMyersOIT, "BravoilMyersOIT"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 7, BravoilMyersOIT, "BravoilMyersOIT"); - *Current = GetUniform(GraphicsMemory, &Shader, BravoilMcGuireOIT, "BravoilMcGuireOIT"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 8, BravoilMcGuireOIT, "BravoilMcGuireOIT"); - *Current = GetUniform(GraphicsMemory, &Shader, InverseViewMatrix, "InverseViewMatrix"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 9, InverseViewMatrix, "InverseViewMatrix"); - *Current = GetUniform(GraphicsMemory, &Shader, InverseProjectionMatrix, "InverseProjectionMatrix"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 10, InverseProjectionMatrix, "InverseProjectionMatrix"); - *Current = GetUniform(GraphicsMemory, &Shader, ShadowMVP, "ShadowMVP"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 11, ShadowMVP, "ShadowMVP"); - *Current = GetUniform(GraphicsMemory, &Shader, &Lights->ColorTex, "LightColors"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 12, &Lights->ColorTex, "LightColors"); - *Current = GetUniform(GraphicsMemory, &Shader, &Lights->PositionTex, "LightPositions"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 13, &Lights->PositionTex, "LightPositions"); - *Current = GetUniform(GraphicsMemory, &Shader, &Lights->IndexToUV, "LightIndexToUV"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 14, &Lights->IndexToUV, "LightIndexToUV"); - *Current = GetUniform(GraphicsMemory, &Shader, &Lights->Count, "LightCount"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 15, &Lights->Count, "LightCount"); - *Current = GetUniform(GraphicsMemory, &Shader, Camera, "CameraP"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 16, Camera, "CameraP"); - *Current = GetUniform(GraphicsMemory, &Shader, SunPosition, "SunPosition"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 17, SunPosition, "SunPosition"); - *Current = GetUniform(GraphicsMemory, &Shader, SunColor, "SunColor"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 18, SunColor, "SunColor"); - *Current = GetUniform(GraphicsMemory, &Shader, FogColor, "FogColor"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 19, FogColor, "FogColor"); - *Current = GetUniform(GraphicsMemory, &Shader, FogPower, "FogPower"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 20, FogPower, "FogPower"); - *Current = GetUniform(GraphicsMemory, &Shader, (u32*)UseSsao, "UseSsao"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 21, (u32*)UseSsao, "UseSsao"); - *Current = GetUniform(GraphicsMemory, &Shader, (u32*)UseShadowMapping, "UseShadowMapping"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 22, (u32*)UseShadowMapping, "UseShadowMapping"); - *Current = GetUniform(GraphicsMemory, &Shader, (u32*)UseLightingBloom, "UseLightingBloom"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 23, (u32*)UseLightingBloom, "UseLightingBloom"); - *Current = GetUniform(GraphicsMemory, &Shader, ApplicationResolution, "ApplicationResolution"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 24, ApplicationResolution, "ApplicationResolution"); - *Current = GetUniform(GraphicsMemory, &Shader, ShadowMapResolution, "ShadowMapResolution"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 25, ShadowMapResolution, "ShadowMapResolution"); AssertNoGlErrors; #if 0 if (Lights) { - *Current = GetUniform(GraphicsMemory, &Shader, Lights->Lights, "Lights"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 26, Lights->Lights, "Lights"); - *Current = GetUniform(GraphicsMemory, &Shader, &Lights->Count, "LightCount"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 27, &Lights->Count, "LightCount"); } #endif @@ -299,10 +258,8 @@ MakeGaussianBlurRenderGroup(v2 *ApplicationResolution, memory_arena *GraphicsMem Result.Shader = CompileShaderPair(CSz(STDLIB_SHADER_PATH "Passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "Gaussian.fragmentshader")); { - shader_uniform **Current = &Result.Shader.FirstUniform; - - *Current = GetUniform(GraphicsMemory, &Result.Shader, ApplicationResolution, "ApplicationResolution"); - Current = &(*Current)->Next; + Result.Shader.Uniforms = ShaderUniformBuffer(1, GraphicsMemory); + SetShaderUniform(&Result.Shader, 0, ApplicationResolution, "ApplicationResolution"); } @@ -343,44 +300,32 @@ CreateGbufferShader(graphics *Graphics, memory_arena *GraphicsMemory, v3 *MinCli { shader Shader = CompileShaderPair( CSz(BONSAI_SHADER_PATH "gBuffer.vertexshader"), CSz(BONSAI_SHADER_PATH "gBuffer.fragmentshader") ); - shader_uniform **Current = &Shader.FirstUniform; + Shader.Uniforms = ShaderUniformBuffer(12, GraphicsMemory); - *Current = GetUniform(GraphicsMemory, &Shader, MinClipP_worldspace, "MinClipP_worldspace"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 0, MinClipP_worldspace, "MinClipP_worldspace"); - *Current = GetUniform(GraphicsMemory, &Shader, MaxClipP_worldspace, "MaxClipP_worldspace"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 1, MaxClipP_worldspace, "MaxClipP_worldspace"); - *Current = GetUniform(GraphicsMemory, &Shader, ViewProjection, "ViewProjection"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 2, ViewProjection, "ViewProjection"); // @janky_model_matrix_bs - *Current = GetUniform(GraphicsMemory, &Shader, &IdentityMatrix, "ModelMatrix"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 3, &IdentityMatrix, "ModelMatrix"); - *Current = GetUniform(GraphicsMemory, &Shader, ColorPaletteTexture, "ColorPalette"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 4, ColorPaletteTexture, "ColorPalette"); - *Current = GetUniform(GraphicsMemory, &Shader, &Camera->Frust.farClip, "FarClip"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 5, &Camera->Frust.farClip, "FarClip"); - *Current = GetUniform(GraphicsMemory, &Shader, &Camera->Frust.nearClip, "NearClip"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 6, &Camera->Frust.nearClip, "NearClip"); - *Current = GetUniform(GraphicsMemory, &Shader, &Camera->RenderSpacePosition, "CameraToWorld"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 7, &Camera->RenderSpacePosition, "CameraToWorld"); - *Current = GetUniform(GraphicsMemory, &Shader, &Graphics->OffsetOfWorldCenterToGrid, "OffsetOfWorldCenterToGrid"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 8, &Graphics->OffsetOfWorldCenterToGrid, "OffsetOfWorldCenterToGrid"); - *Current = GetUniform(GraphicsMemory, &Shader, &Graphics->Settings.MajorGridDim, "MajorGridDim"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 9, &Graphics->Settings.MajorGridDim, "MajorGridDim"); - *Current = GetUniform(GraphicsMemory, &Shader, &Graphics->Settings.DrawMajorGrid, "DrawMajorGrid"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 10, &Graphics->Settings.DrawMajorGrid, "DrawMajorGrid"); - *Current = GetUniform(GraphicsMemory, &Shader, &Graphics->Settings.DrawMinorGrid, "DrawMinorGrid"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 11, &Graphics->Settings.DrawMinorGrid, "DrawMinorGrid"); return Shader; } @@ -396,7 +341,7 @@ MakeSsaoShader( memory_arena *GraphicsMemory, { shader Shader = CompileShaderPair( CSz(STDLIB_SHADER_PATH "Passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "Ao.fragmentshader") ); - shader_uniform **Current = &Shader.FirstUniform; + Shader.Uniforms = ShaderUniformBuffer(7, GraphicsMemory); /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Color, "gColor"); */ /* Current = &(*Current)->Next; */ @@ -404,26 +349,19 @@ MakeSsaoShader( memory_arena *GraphicsMemory, /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); */ /* Current = &(*Current)->Next; */ - *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Normal, "gNormal"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 0, &gTextures->Normal, "gNormal"); - *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Depth, "gDepth"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 1, &gTextures->Depth, "gDepth"); - *Current = GetUniform(GraphicsMemory, &Shader, SsaoNoiseTexture, "SsaoNoiseTexture"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 2, SsaoNoiseTexture, "SsaoNoiseTexture"); - *Current = GetUniform(GraphicsMemory, &Shader, SsaoNoiseTile, "SsaoNoiseTile"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 3, SsaoNoiseTile, "SsaoNoiseTile"); - *Current = GetUniform(GraphicsMemory, &Shader, InverseViewMatrix, "InverseViewMatrix"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 4, InverseViewMatrix, "InverseViewMatrix"); - *Current = GetUniform(GraphicsMemory, &Shader, InverseProjectionMatrix, "InverseProjectionMatrix"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 5, InverseProjectionMatrix, "InverseProjectionMatrix"); - *Current = GetUniform(GraphicsMemory, &Shader, ViewProjection, "ViewProjection"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 6, ViewProjection, "ViewProjection"); AssertNoGlErrors; @@ -498,29 +436,22 @@ MakeTransparencyShader(v2 *ApplicationResolution, b32 *BravoilMyersOIT, b32 *Bra { shader Shader = CompileShaderPair( CSz(BONSAI_SHADER_PATH "gBuffer.vertexshader"), CSz(BONSAI_SHADER_PATH "3DTransparency.fragmentshader") ); - shader_uniform **Current = &Shader.FirstUniform; + Shader.Uniforms = ShaderUniformBuffer(7, Memory); - *Current = GetUniform(Memory, &Shader, ViewProjection, "ViewProjection"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 0, ViewProjection, "ViewProjection"); // @janky_model_matrix_bs - *Current = GetUniform(Memory, &Shader, &IdentityMatrix, "ModelMatrix"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 1, &IdentityMatrix, "ModelMatrix"); - *Current = GetUniform(Memory, &Shader, gBufferDepthTexture, "gBufferDepthTexture"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 2, gBufferDepthTexture, "gBufferDepthTexture"); - *Current = GetUniform(Memory, &Shader, BravoilMyersOIT, "BravoilMyersOIT"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 3, BravoilMyersOIT, "BravoilMyersOIT"); - *Current = GetUniform(Memory, &Shader, BravoilMcGuireOIT, "BravoilMcGuireOIT"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 4, BravoilMcGuireOIT, "BravoilMcGuireOIT"); - *Current = GetUniform(Memory, &Shader, ApplicationResolution, "ApplicationResolution"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 5, ApplicationResolution, "ApplicationResolution"); - *Current = GetUniform(Memory, &Shader, ColorPaletteTexture, "ColorPalette"); - Current = &(*Current)->Next; + SetShaderUniform(&Shader, 6, ColorPaletteTexture, "ColorPalette"); return Shader; } From ed9f110738d4aebec00a2c2be0c05862a3e65b96 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 1 May 2025 14:20:03 -0700 Subject: [PATCH 213/421] Cleanup genereated --- external/bonsai_stdlib | 2 +- .../anonymous_render_settings_0_wwLVyABc.h | 15 - .../anonymous_render_settings_1_pFpWPpyN.h | 21 -- generated/are_equal_lighting_settings.h | 25 -- generated/block_array_c_shader_688853971.h | 77 ---- generated/block_array_entity_ptr_688856411.h | 339 ------------------ generated/block_array_h_shader_688853971_0.h | 164 --------- .../block_array_h_shader_ptr_688853971_0.h | 2 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 255 ------------- generated/block_array_world_edit_688735882.h | 263 -------------- generated/block_array_world_edit_688853862.h | 263 -------------- generated/buffer_h_struct_u32.h | 2 +- generated/buffer_struct.h | 84 ----- generated/d_union_bonsai_render_command.h | 57 --- generated/default_marshal_layered_brush_0.h | 15 - generated/default_marshal_layered_brush_1.h | 30 -- generated/default_marshal_layered_brush_2.h | 23 -- .../default_marshal_layered_brush_editor_0.h | 15 - .../default_marshal_layered_brush_editor_1.h | 30 -- .../default_marshal_layered_brush_editor_2.h | 23 -- generated/default_marshal_level_header_3.h | 28 -- generated/deserialize_struct_level_header_0.h | 88 ----- generated/deserialize_struct_level_header_1.h | 88 ----- generated/deserialize_struct_level_header_2.h | 88 ----- generated/deserialize_struct_level_header_3.h | 88 ----- .../deserialize_struct_render_settings_1.h | 173 --------- ..._for_compound_type_entity_aggregate_type.h | 68 ---- ...or_ui_for_compound_type_entity_game_data.h | 109 ------ ...itor_ui_for_compound_type_fireball_state.h | 69 ---- ...i_for_compound_type_layered_brush_editor.h | 198 ---------- ...tor_ui_for_compound_type_octree_node_ptr.h | 114 ------ .../do_editor_ui_for_compound_type_struct.h | 145 -------- ...d_type_struct_terrain_gen_render_context.h | 151 -------- ...or_ui_for_compound_type_world_edit_brush.h | 83 ----- ...r_ui_for_compound_type_world_edit_params.h | 91 ----- .../do_editor_ui_for_enum_entity_status.h | 46 --- generated/do_editor_ui_for_enum_entity_type.h | 73 ---- ...editor_ui_for_radio_enum_world_edit_mode.h | 50 --- ..._for_radio_enum_world_edit_mode_modifier.h | 49 --- ..._iteration_pattern_275071431_101859599_0.h | 104 ------ ..._iteration_pattern_275071431_785723886_0.h | 104 ------ ..._iteration_pattern_846291950_267608728_0.h | 107 ------ generated/gen_shader_uniform_push_camera.h | 17 - generated/gen_shader_uniform_push_light.h | 17 - generated/gen_shader_uniform_push_m4.h | 19 +- generated/gen_shader_uniform_push_r32.h | 19 +- generated/gen_shader_uniform_push_s32.h | 19 +- generated/gen_shader_uniform_push_texture.h | 19 +- generated/gen_shader_uniform_push_u32.h | 19 +- generated/gen_shader_uniform_push_v2.h | 19 +- generated/gen_shader_uniform_push_v3.h | 19 +- generated/gen_shader_uniform_push_v3i.h | 33 -- generated/gen_vector_operators_v3_8x.h | 289 --------------- .../generate_string_table_entity_status.h | 34 -- generated/generate_string_table_entity_type.h | 40 --- .../generate_string_table_player_action.h | 44 --- generated/generate_string_table_turn_mode.h | 32 -- .../rectalinear_iteration_pattern_398799212.h | 51 --- .../rectalinear_iteration_pattern_416827956.h | 39 -- .../rectalinear_iteration_pattern_428632106.h | 47 --- .../rectalinear_iteration_pattern_530902269.h | 43 --- .../rectalinear_iteration_pattern_583358156.h | 42 --- .../rectalinear_iteration_pattern_631222419.h | 52 --- .../rectalinear_iteration_pattern_643608995.h | 51 --- .../rectalinear_iteration_pattern_920026661.h | 44 --- .../rectalinear_iteration_pattern_992879728.h | 48 --- .../rectalinear_iteration_pattern_99934950.h | 43 --- generated/serdes_dunion_struct.h | 3 - generated/serdes_struct_entity_game_data.h | 127 ------- generated/serdes_struct_layered_brush_0.h | 120 ------- generated/serdes_struct_layered_brush_1.h | 170 --------- generated/serdes_struct_layered_brush_2.h | 150 -------- .../serdes_struct_layered_brush_editor.h | 219 ----------- .../serdes_struct_layered_brush_editor_0.h | 119 ------ .../serdes_struct_layered_brush_editor_1.h | 167 --------- .../serdes_struct_layered_brush_editor_2.h | 147 -------- generated/serdes_struct_lighting_settings_0.h | 250 ------------- generated/serdes_struct_struct.h | 100 ------ generated/serdes_struct_world_edit_params.h | 105 ------ generated/serdes_struct_world_edit_shape.h | 4 - generated/serdes_world_edit_shape.h | 39 -- .../serialize_struct_render_settings_0.h | 125 ------- .../shader_magic_bloom_downsample_shader.h | 1 + .../shader_magic_bloom_upsample_shader.h | 1 + generated/shader_magic_shadow_map_shader.h | 1 + generated/shader_magic_struct.h | 36 -- ...r_magic_struct_terrain_decoration_shader.h | 1 + ...gic_struct_terrain_derivs_render_context.h | 1 + ...c_struct_terrain_finalize_render_context.h | 1 + .../shader_magic_struct_terrain_shader.h | 53 --- ...ader_magic_struct_terrain_shaping_shader.h | 1 + .../shader_magic_struct_world_edit_shader.h | 1 + generated/shader_magic_terrain_shader.h | 53 --- ...icbuffer_octree_node_688856411_975905964.h | 41 --- .../string_and_value_tables_world_edit_mode.h | 50 --- ...nd_value_tables_world_edit_mode_modifier.h | 47 --- ..._value_tables_world_update_op_shape_type.h | 59 --- ..._102235355_126003659_545884473_807650077.h | 87 ----- ..._102235355_126003659_545884473_590747459.h | 72 ---- .../shaping/terrain_shaping.fragmentshader | 13 +- src/engine/shader.cpp | 4 +- 101 files changed, 31 insertions(+), 7255 deletions(-) delete mode 100644 generated/anonymous_render_settings_0_wwLVyABc.h delete mode 100644 generated/anonymous_render_settings_1_pFpWPpyN.h delete mode 100644 generated/are_equal_lighting_settings.h delete mode 100644 generated/block_array_c_shader_688853971.h delete mode 100644 generated/block_array_entity_ptr_688856411.h delete mode 100644 generated/block_array_h_shader_688853971_0.h delete mode 100644 generated/block_array_work_queue_entry_build_chunk_mesh_688853862.h delete mode 100644 generated/block_array_world_edit_688735882.h delete mode 100644 generated/block_array_world_edit_688853862.h delete mode 100644 generated/buffer_struct.h delete mode 100644 generated/d_union_bonsai_render_command.h delete mode 100644 generated/default_marshal_layered_brush_0.h delete mode 100644 generated/default_marshal_layered_brush_1.h delete mode 100644 generated/default_marshal_layered_brush_2.h delete mode 100644 generated/default_marshal_layered_brush_editor_0.h delete mode 100644 generated/default_marshal_layered_brush_editor_1.h delete mode 100644 generated/default_marshal_layered_brush_editor_2.h delete mode 100644 generated/default_marshal_level_header_3.h delete mode 100644 generated/deserialize_struct_level_header_0.h delete mode 100644 generated/deserialize_struct_level_header_1.h delete mode 100644 generated/deserialize_struct_level_header_2.h delete mode 100644 generated/deserialize_struct_level_header_3.h delete mode 100644 generated/deserialize_struct_render_settings_1.h delete mode 100644 generated/do_editor_ui_for_compound_type_entity_aggregate_type.h delete mode 100644 generated/do_editor_ui_for_compound_type_entity_game_data.h delete mode 100644 generated/do_editor_ui_for_compound_type_fireball_state.h delete mode 100644 generated/do_editor_ui_for_compound_type_layered_brush_editor.h delete mode 100644 generated/do_editor_ui_for_compound_type_octree_node_ptr.h delete mode 100644 generated/do_editor_ui_for_compound_type_struct.h delete mode 100644 generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h delete mode 100644 generated/do_editor_ui_for_compound_type_world_edit_brush.h delete mode 100644 generated/do_editor_ui_for_compound_type_world_edit_params.h delete mode 100644 generated/do_editor_ui_for_enum_entity_status.h delete mode 100644 generated/do_editor_ui_for_enum_entity_type.h delete mode 100644 generated/do_editor_ui_for_radio_enum_world_edit_mode.h delete mode 100644 generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h delete mode 100644 generated/flood_fill_iteration_pattern_275071431_101859599_0.h delete mode 100644 generated/flood_fill_iteration_pattern_275071431_785723886_0.h delete mode 100644 generated/flood_fill_iteration_pattern_846291950_267608728_0.h delete mode 100644 generated/gen_shader_uniform_push_v3i.h delete mode 100644 generated/gen_vector_operators_v3_8x.h delete mode 100644 generated/generate_string_table_entity_status.h delete mode 100644 generated/generate_string_table_entity_type.h delete mode 100644 generated/generate_string_table_player_action.h delete mode 100644 generated/generate_string_table_turn_mode.h delete mode 100644 generated/rectalinear_iteration_pattern_398799212.h delete mode 100644 generated/rectalinear_iteration_pattern_416827956.h delete mode 100644 generated/rectalinear_iteration_pattern_428632106.h delete mode 100644 generated/rectalinear_iteration_pattern_530902269.h delete mode 100644 generated/rectalinear_iteration_pattern_583358156.h delete mode 100644 generated/rectalinear_iteration_pattern_631222419.h delete mode 100644 generated/rectalinear_iteration_pattern_643608995.h delete mode 100644 generated/rectalinear_iteration_pattern_920026661.h delete mode 100644 generated/rectalinear_iteration_pattern_992879728.h delete mode 100644 generated/rectalinear_iteration_pattern_99934950.h delete mode 100644 generated/serdes_dunion_struct.h delete mode 100644 generated/serdes_struct_entity_game_data.h delete mode 100644 generated/serdes_struct_layered_brush_0.h delete mode 100644 generated/serdes_struct_layered_brush_1.h delete mode 100644 generated/serdes_struct_layered_brush_2.h delete mode 100644 generated/serdes_struct_layered_brush_editor.h delete mode 100644 generated/serdes_struct_layered_brush_editor_0.h delete mode 100644 generated/serdes_struct_layered_brush_editor_1.h delete mode 100644 generated/serdes_struct_layered_brush_editor_2.h delete mode 100644 generated/serdes_struct_lighting_settings_0.h delete mode 100644 generated/serdes_struct_struct.h delete mode 100644 generated/serdes_struct_world_edit_params.h delete mode 100644 generated/serdes_struct_world_edit_shape.h delete mode 100644 generated/serdes_world_edit_shape.h delete mode 100644 generated/serialize_struct_render_settings_0.h delete mode 100644 generated/shader_magic_struct.h delete mode 100644 generated/shader_magic_struct_terrain_shader.h delete mode 100644 generated/shader_magic_terrain_shader.h delete mode 100644 generated/staticbuffer_octree_node_688856411_975905964.h delete mode 100644 generated/string_and_value_tables_world_edit_mode.h delete mode 100644 generated/string_and_value_tables_world_edit_mode_modifier.h delete mode 100644 generated/string_and_value_tables_world_update_op_shape_type.h delete mode 100644 generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h delete mode 100644 generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_590747459.h diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 6d95ba78a..7835bf6c0 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 6d95ba78acbac7618fdbe7640cb6c4d336a21c14 +Subproject commit 7835bf6c025e0d9c408e321a9daed14d2448f240 diff --git a/generated/anonymous_render_settings_0_wwLVyABc.h b/generated/anonymous_render_settings_0_wwLVyABc.h deleted file mode 100644 index bc82f8588..000000000 --- a/generated/anonymous_render_settings_0_wwLVyABc.h +++ /dev/null @@ -1,15 +0,0 @@ -// src/engine/serdes.cpp:429:0 - -E1->UseSsao = E0->UseSsao; -E1->UseShadowMapping = E0->UseShadowMapping; -E1->UseLightingBloom = E0->UseLightingBloom; -E1->BravoilMyersOIT = E0->BravoilMyersOIT; -E1->BravoilMcGuireOIT = E0->BravoilMcGuireOIT; -E1->DrawMajorGrid = E0->DrawMajorGrid; -E1->DrawMinorGrid = E0->DrawMinorGrid; -E1->MajorGridDim = E0->MajorGridDim; -E1->Ignored = E0->Ignored; -E1->Headless = E0->Headless; -E1->ToneMappingType = E0->ToneMappingType; -E1->Lighting = E0->Lighting; - diff --git a/generated/anonymous_render_settings_1_pFpWPpyN.h b/generated/anonymous_render_settings_1_pFpWPpyN.h deleted file mode 100644 index 5035ba97d..000000000 --- a/generated/anonymous_render_settings_1_pFpWPpyN.h +++ /dev/null @@ -1,21 +0,0 @@ -// src/engine/serdes.cpp:417:0 - -E1->UseSsao = E0->UseSsao; -E1->UseShadowMapping = E0->UseShadowMapping; -E1->UseLightingBloom = E0->UseLightingBloom; -E1->BravoilMyersOIT = E0->BravoilMyersOIT; -E1->BravoilMcGuireOIT = E0->BravoilMcGuireOIT; -E1->DrawMajorGrid = E0->DrawMajorGrid; -E1->DrawMinorGrid = E0->DrawMinorGrid; -E1->MajorGridDim = E0->MajorGridDim; -E1->Ignored = E0->Ignored; -E1->Headless = E0->Headless; -E1->ToneMappingType = E0->ToneMappingType; -E1->Lighting = E0->Lighting; -E1->ApplicationResolution = E0->ApplicationResolution; -E1->ShadowMapResolution = E0->ShadowMapResolution; -E1->LuminanceMapResolution = E0->LuminanceMapResolution; -E1->iApplicationResolution = E0->iApplicationResolution; -E1->iShadowMapResolution = E0->iShadowMapResolution; -E1->iLuminanceMapResolution = E0->iLuminanceMapResolution; - diff --git a/generated/are_equal_lighting_settings.h b/generated/are_equal_lighting_settings.h deleted file mode 100644 index 102e5c2ab..000000000 --- a/generated/are_equal_lighting_settings.h +++ /dev/null @@ -1,25 +0,0 @@ -// src/engine/render_settings.h:34:0 - -link_internal b32 -AreEqual(lighting_settings *Thing1, lighting_settings *Thing2) -{ - if (Thing1 && Thing2) - { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( lighting_settings ) ); - - return Result; - } - else - { - return (Thing1 == Thing2); - } -} - -link_internal b32 -AreEqual(lighting_settings Thing1, lighting_settings Thing2) -{ - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( lighting_settings ) ); - - return Result; -} - diff --git a/generated/block_array_c_shader_688853971.h b/generated/block_array_c_shader_688853971.h deleted file mode 100644 index 4decec26c..000000000 --- a/generated/block_array_c_shader_688853971.h +++ /dev/null @@ -1,77 +0,0 @@ -// external/bonsai_stdlib/src/shader.cpp:2:0 - - -link_internal shader_block* -Allocate_shader_block(memory_arena *Memory) -{ - shader_block *Result = Allocate(shader_block, Memory, 1); - Result->Elements = Allocate(shader, Memory, 64); - return Result; -} - -link_internal cs -CS(shader_block_array_index Index) -{ - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); -} - -link_internal void -RemoveUnordered(shader_block_array *Array, shader_block_array_index Index) -{ - shader_block_array_index LastI = LastIndex(Array); - - shader *Element = GetPtr(Array, Index); - shader *LastElement = GetPtr(Array, LastI); - - *Element = *LastElement; - - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) - { - // Walk the chain till we get to the second-last one - shader_block *Current = Array->First; - shader_block *LastB = LastI.Block; - - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } - - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } -} - -link_internal shader * -Push(shader_block_array *Array, shader *Element) -{ - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } - - if (Array->First == 0) { Array->First = Allocate_shader_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 64) - { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - shader_block *Next = Allocate_shader_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } - } - - shader *Result = Array->Current->Elements + Array->Current->At; - - Array->Current->Elements[Array->Current->At++] = *Element; - - return Result; -} - diff --git a/generated/block_array_entity_ptr_688856411.h b/generated/block_array_entity_ptr_688856411.h deleted file mode 100644 index e242dfe74..000000000 --- a/generated/block_array_entity_ptr_688856411.h +++ /dev/null @@ -1,339 +0,0 @@ -// src/engine/world_chunk.h:305:0 - - - - - -struct entity_ptr_block -{ - u32 Index; - u32 At; - entity_ptr *Elements; - entity_ptr_block *Next; -}; - -struct entity_ptr_block_array_index -{ - entity_ptr_block *Block; - u32 BlockIndex; - u32 ElementIndex; -}; - -struct entity_ptr_block_array -{ - entity_ptr_block *First; - entity_ptr_block *Current; - memory_arena *Memory; poof(@no_serialize) - -}; - -link_internal entity_ptr_block_array -EntityPtrBlockArray(memory_arena *Memory) -{ - entity_ptr_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - -link_internal b32 -AreEqual(entity_ptr_block_array_index *Thing1, entity_ptr_block_array_index *Thing2) -{ - if (Thing1 && Thing2) - { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( entity_ptr_block_array_index ) ); - - return Result; - } - else - { - return (Thing1 == Thing2); - } -} - -link_internal b32 -AreEqual(entity_ptr_block_array_index Thing1, entity_ptr_block_array_index Thing2) -{ - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( entity_ptr_block_array_index ) ); - - return Result; -} - - -typedef entity_ptr_block_array entity_ptr_paged_list; - -link_internal entity_ptr_block_array_index -operator++( entity_ptr_block_array_index &I0 ) -{ - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } - return I0; -} - -link_internal b32 -operator<( entity_ptr_block_array_index I0, entity_ptr_block_array_index I1 ) -{ - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); - return Result; -} - -link_inline umm -GetIndex( entity_ptr_block_array_index *Index) -{ - umm Result = Index->ElementIndex + (Index->BlockIndex*8); - return Result; -} - -link_internal entity_ptr_block_array_index -ZerothIndex( entity_ptr_block_array *Arr) -{ - entity_ptr_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; -} - -link_internal umm -TotalElements( entity_ptr_block_array *Arr) -{ - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } - return Result; -} - -link_internal entity_ptr_block_array_index -LastIndex( entity_ptr_block_array *Arr) -{ - entity_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } - return Result; -} - -link_internal entity_ptr_block_array_index -AtElements( entity_ptr_block_array *Arr) -{ - entity_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } - return Result; -} - -link_internal umm -Count( entity_ptr_block_array *Arr) -{ - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); - return Result; -} - -link_internal entity_ptr -Set( entity_ptr_block_array *Arr, - entity_ptr Element, - entity_ptr_block_array_index Index ) -{ - entity_ptr Result = {}; - if (Index.Block) - { - Result = Index.Block->Elements[Index.ElementIndex]; - *Result = *Element; - } - - return Result; -} - -link_internal entity_ptr -GetPtr(entity_ptr_block_array *Arr, entity_ptr_block_array_index Index) -{ - entity_ptr Result = {}; - if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } - return Result; -} - -link_internal entity_ptr -GetPtr(entity_ptr_block *Block, umm Index) -{ - entity_ptr Result = {}; - if (Index < Block->At) { Result = *(Block->Elements + Index); } - return Result; -} - -link_internal entity_ptr -GetPtr(entity_ptr_block_array *Arr, umm Index) -{ - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - entity_ptr_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) - { - Block = Block->Next; - } - - entity_ptr Result = *(Block->Elements+ElementIndex); - return Result; -} - -link_internal entity_ptr -TryGetPtr(entity_ptr_block_array *Arr, umm Index) -{ - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - entity_ptr Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; -} - -link_internal u32 -AtElements(entity_ptr_block *Block) -{ - return Block->At; -} - - - - - -link_internal entity_ptr_block * -Allocate_entity_ptr_block(memory_arena *Memory) -{ - entity_ptr_block *Result = Allocate( entity_ptr_block, Memory, 1); - Result->Elements = Allocate( entity_ptr, Memory, 8); - return Result; -} - -link_internal cs -CS( entity_ptr_block_array_index Index ) -{ - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); -} - -link_internal void -RemoveUnordered( entity_ptr_block_array *Array, entity_ptr_block_array_index Index) -{ - entity_ptr_block_array_index LastI = LastIndex(Array); - - entity_ptr Element = GetPtr(Array, Index); - entity_ptr LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) - { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); - - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - entity_ptr_block *Current = Array->First; - entity_ptr_block *LastB = LastI.Block; - - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } - - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } -} - -link_internal entity_ptr_block_array_index -Find( entity_ptr_block_array *Array, entity_ptr Query) -{ - entity_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; - IterateOver(Array, E, Index) - { - if ( E == Query) - { - Result = Index; - break; - } - } - return Result; -} - -link_internal b32 -IsValid(entity_ptr_block_array_index *Index) -{ - entity_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = (AreEqual(Index, &Test) == False); - return Result; -} - -link_internal entity_ptr * -Push( entity_ptr_block_array *Array, entity_ptr *Element) -{ - Assert(Array->Memory); - - if (Array->First == 0) { Array->First = Allocate_entity_ptr_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) - { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - entity_ptr_block *Next = Allocate_entity_ptr_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } - } - - entity_ptr *Result = Array->Current->Elements + Array->Current->At; - - Array->Current->Elements[Array->Current->At++] = *Element; - - return Result; -} - - diff --git a/generated/block_array_h_shader_688853971_0.h b/generated/block_array_h_shader_688853971_0.h deleted file mode 100644 index 3e00b22ee..000000000 --- a/generated/block_array_h_shader_688853971_0.h +++ /dev/null @@ -1,164 +0,0 @@ -// external/bonsai_stdlib/src/shader.h:129:0 - -struct shader_block -{ - u32 Index; - u32 At; - shader *Elements; - shader_block *Next; -}; - -struct shader_block_array_index -{ - shader_block *Block; - u32 BlockIndex; - u32 ElementIndex; -}; - -struct shader_block_array -{ - shader_block *First; - shader_block *Current; - memory_arena *Memory; poof(@no_serialize) - -}; - -typedef shader_block_array shader_paged_list; - -link_internal shader_block_array_index -operator++(shader_block_array_index &I0) -{ - if (I0.Block) - { - if (I0.ElementIndex == 64-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } - return I0; -} - -link_internal b32 -operator<(shader_block_array_index I0, shader_block_array_index I1) -{ - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); - return Result; -} - -link_inline umm -GetIndex(shader_block_array_index *Index) -{ - umm Result = Index->ElementIndex + (Index->BlockIndex*64); - return Result; -} - -link_internal shader_block_array_index -ZerothIndex(shader_block_array *Arr) -{ - shader_block_array_index Result = {}; - Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ - return Result; -} - -link_internal umm -TotalElements(shader_block_array *Arr) -{ - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 64) + Arr->Current->At; - } - return Result; -} - -link_internal shader_block_array_index -LastIndex(shader_block_array *Arr) -{ - shader_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } - return Result; -} - -link_internal shader_block_array_index -AtElements(shader_block_array *Arr) -{ - shader_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } - return Result; -} - -link_internal shader * -GetPtr(shader_block_array *Arr, shader_block_array_index Index) -{ - shader *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } - return Result; -} - -link_internal shader * -GetPtr(shader_block *Block, umm Index) -{ - shader *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } - return Result; -} - -link_internal shader * -GetPtr(shader_block_array *Arr, umm Index) -{ - umm BlockIndex = Index / 64; - umm ElementIndex = Index % 64; - - umm AtBlock = 0; - shader_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) - { - Block = Block->Next; - } - - shader *Result = Block->Elements+ElementIndex; - return Result; -} - -link_internal shader * -TryGetPtr(shader_block_array *Arr, umm Index) -{ - umm BlockIndex = Index / 64; - umm ElementIndex = Index % 64; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - shader *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; -} - -link_internal u32 -AtElements(shader_block *Block) -{ - return Block->At; -} - diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 1087e4121..965836b8a 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:129:0 +// external/bonsai_stdlib/src/shader.h:133:0 diff --git a/generated/block_array_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_work_queue_entry_build_chunk_mesh_688853862.h deleted file mode 100644 index 23629aca9..000000000 --- a/generated/block_array_work_queue_entry_build_chunk_mesh_688853862.h +++ /dev/null @@ -1,255 +0,0 @@ -// src/engine/work_queue.h:73:0 - -struct work_queue_entry_build_chunk_mesh_block -{ - u32 Index; - u32 At; - work_queue_entry_build_chunk_mesh *Elements; - work_queue_entry_build_chunk_mesh_block *Next; -}; - -struct work_queue_entry_build_chunk_mesh_block_array_index -{ - work_queue_entry_build_chunk_mesh_block *Block; - u32 BlockIndex; - u32 ElementIndex; -}; - -struct work_queue_entry_build_chunk_mesh_block_array -{ - work_queue_entry_build_chunk_mesh_block *First; - work_queue_entry_build_chunk_mesh_block *Current; - memory_arena *Memory; poof(@no_serialize) - -}; - -typedef work_queue_entry_build_chunk_mesh_block_array work_queue_entry_build_chunk_mesh_paged_list; - -link_internal work_queue_entry_build_chunk_mesh_block_array_index -operator++(work_queue_entry_build_chunk_mesh_block_array_index &I0) -{ - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } - return I0; -} - -link_internal b32 -operator<(work_queue_entry_build_chunk_mesh_block_array_index I0, work_queue_entry_build_chunk_mesh_block_array_index I1) -{ - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); - return Result; -} - -link_inline umm -GetIndex(work_queue_entry_build_chunk_mesh_block_array_index *Index) -{ - umm Result = Index->ElementIndex + (Index->BlockIndex*8); - return Result; -} - -link_internal work_queue_entry_build_chunk_mesh_block_array_index -ZerothIndex(work_queue_entry_build_chunk_mesh_block_array *Arr) -{ - work_queue_entry_build_chunk_mesh_block_array_index Result = {}; - Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ - return Result; -} - -link_internal umm -TotalElements(work_queue_entry_build_chunk_mesh_block_array *Arr) -{ - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } - return Result; -} - -link_internal work_queue_entry_build_chunk_mesh_block_array_index -LastIndex(work_queue_entry_build_chunk_mesh_block_array *Arr) -{ - work_queue_entry_build_chunk_mesh_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } - return Result; -} - -link_internal work_queue_entry_build_chunk_mesh_block_array_index -AtElements(work_queue_entry_build_chunk_mesh_block_array *Arr) -{ - work_queue_entry_build_chunk_mesh_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } - return Result; -} - -link_internal work_queue_entry_build_chunk_mesh * -GetPtr(work_queue_entry_build_chunk_mesh_block_array *Arr, work_queue_entry_build_chunk_mesh_block_array_index Index) -{ - work_queue_entry_build_chunk_mesh *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } - return Result; -} - -link_internal work_queue_entry_build_chunk_mesh * -GetPtr(work_queue_entry_build_chunk_mesh_block *Block, umm Index) -{ - work_queue_entry_build_chunk_mesh *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } - return Result; -} - -link_internal work_queue_entry_build_chunk_mesh * -GetPtr(work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) -{ - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - work_queue_entry_build_chunk_mesh_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) - { - Block = Block->Next; - } - - work_queue_entry_build_chunk_mesh *Result = Block->Elements+ElementIndex; - return Result; -} - -link_internal work_queue_entry_build_chunk_mesh * -TryGetPtr(work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) -{ - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - work_queue_entry_build_chunk_mesh *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; -} - -link_internal u32 -AtElements(work_queue_entry_build_chunk_mesh_block *Block) -{ - return Block->At; -} - - -link_internal work_queue_entry_build_chunk_mesh_block* -Allocate_work_queue_entry_build_chunk_mesh_block(memory_arena *Memory) -{ - work_queue_entry_build_chunk_mesh_block *Result = Allocate(work_queue_entry_build_chunk_mesh_block, Memory, 1); - Result->Elements = Allocate(work_queue_entry_build_chunk_mesh, Memory, 8); - return Result; -} - -link_internal cs -CS(work_queue_entry_build_chunk_mesh_block_array_index Index) -{ - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); -} - -link_internal void -RemoveUnordered(work_queue_entry_build_chunk_mesh_block_array *Array, work_queue_entry_build_chunk_mesh_block_array_index Index) -{ - work_queue_entry_build_chunk_mesh_block_array_index LastI = LastIndex(Array); - - work_queue_entry_build_chunk_mesh *Element = GetPtr(Array, Index); - work_queue_entry_build_chunk_mesh *LastElement = GetPtr(Array, LastI); - - *Element = *LastElement; - - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) - { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); - - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - work_queue_entry_build_chunk_mesh_block *Current = Array->First; - work_queue_entry_build_chunk_mesh_block *LastB = LastI.Block; - - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } - - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } -} - -link_internal work_queue_entry_build_chunk_mesh * -Push(work_queue_entry_build_chunk_mesh_block_array *Array, work_queue_entry_build_chunk_mesh *Element) -{ - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } - - if (Array->First == 0) { Array->First = Allocate_work_queue_entry_build_chunk_mesh_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) - { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - work_queue_entry_build_chunk_mesh_block *Next = Allocate_work_queue_entry_build_chunk_mesh_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } - } - - work_queue_entry_build_chunk_mesh *Result = Array->Current->Elements + Array->Current->At; - - Array->Current->Elements[Array->Current->At++] = *Element; - - return Result; -} - - diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h deleted file mode 100644 index 33f77e5ff..000000000 --- a/generated/block_array_world_edit_688735882.h +++ /dev/null @@ -1,263 +0,0 @@ -// src/engine/editor.h:1160:0 - -struct world_edit_block -{ - u32 Index; - u32 At; - world_edit *Elements; - world_edit_block *Next; -}; - -struct world_edit_block_array_index -{ - world_edit_block *Block; - u32 BlockIndex; - u32 ElementIndex; -}; - -struct world_edit_block_array -{ - world_edit_block *First; - world_edit_block *Current; - memory_arena *Memory; poof(@no_serialize) - -}; - -typedef world_edit_block_array world_edit_paged_list; - -link_internal world_edit_block_array_index -operator++(world_edit_block_array_index &I0) -{ - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } - return I0; -} - -link_internal b32 -operator<(world_edit_block_array_index I0, world_edit_block_array_index I1) -{ - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); - return Result; -} - -link_inline umm -GetIndex(world_edit_block_array_index *Index) -{ - umm Result = Index->ElementIndex + (Index->BlockIndex*8); - return Result; -} - -link_internal world_edit_block_array_index -ZerothIndex(world_edit_block_array *Arr) -{ - world_edit_block_array_index Result = {}; - Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ - return Result; -} - -link_internal umm -TotalElements(world_edit_block_array *Arr) -{ - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } - return Result; -} - -link_internal world_edit_block_array_index -LastIndex(world_edit_block_array *Arr) -{ - world_edit_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } - return Result; -} - -link_internal world_edit_block_array_index -AtElements(world_edit_block_array *Arr) -{ - world_edit_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } - return Result; -} - -link_internal umm -Count(world_edit_block_array *Arr) -{ - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); - return Result; -} - -link_internal world_edit * -GetPtr(world_edit_block_array *Arr, world_edit_block_array_index Index) -{ - world_edit *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } - return Result; -} - -link_internal world_edit * -GetPtr(world_edit_block *Block, umm Index) -{ - world_edit *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } - return Result; -} - -link_internal world_edit * -GetPtr(world_edit_block_array *Arr, umm Index) -{ - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - world_edit_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) - { - Block = Block->Next; - } - - world_edit *Result = Block->Elements+ElementIndex; - return Result; -} - -link_internal world_edit * -TryGetPtr(world_edit_block_array *Arr, umm Index) -{ - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - world_edit *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; -} - -link_internal u32 -AtElements(world_edit_block *Block) -{ - return Block->At; -} - - -link_internal world_edit_block* -Allocate_world_edit_block(memory_arena *Memory) -{ - world_edit_block *Result = Allocate(world_edit_block, Memory, 1); - Result->Elements = Allocate(world_edit, Memory, 8); - return Result; -} - -link_internal cs -CS(world_edit_block_array_index Index) -{ - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); -} - -link_internal void -RemoveUnordered(world_edit_block_array *Array, world_edit_block_array_index Index) -{ - world_edit_block_array_index LastI = LastIndex(Array); - - world_edit *Element = GetPtr(Array, Index); - world_edit *LastElement = GetPtr(Array, LastI); - - *Element = *LastElement; - - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) - { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); - - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - world_edit_block *Current = Array->First; - world_edit_block *LastB = LastI.Block; - - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } - - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } -} - -link_internal world_edit * -Push(world_edit_block_array *Array, world_edit *Element) -{ - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } - - if (Array->First == 0) { Array->First = Allocate_world_edit_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) - { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - world_edit_block *Next = Allocate_world_edit_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } - } - - world_edit *Result = Array->Current->Elements + Array->Current->At; - - Array->Current->Elements[Array->Current->At++] = *Element; - - return Result; -} - - diff --git a/generated/block_array_world_edit_688853862.h b/generated/block_array_world_edit_688853862.h deleted file mode 100644 index 9e7618702..000000000 --- a/generated/block_array_world_edit_688853862.h +++ /dev/null @@ -1,263 +0,0 @@ -// src/engine/editor.h:1132:0 - -struct world_edit_block -{ - u32 Index; - u32 At; - world_edit *Elements; - world_edit_block *Next; -}; - -struct world_edit_block_array_index -{ - world_edit_block *Block; - u32 BlockIndex; - u32 ElementIndex; -}; - -struct world_edit_block_array -{ - world_edit_block *First; - world_edit_block *Current; - memory_arena *Memory; poof(@no_serialize) - -}; - -typedef world_edit_block_array world_edit_paged_list; - -link_internal world_edit_block_array_index -operator++(world_edit_block_array_index &I0) -{ - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } - return I0; -} - -link_internal b32 -operator<(world_edit_block_array_index I0, world_edit_block_array_index I1) -{ - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); - return Result; -} - -link_inline umm -GetIndex(world_edit_block_array_index *Index) -{ - umm Result = Index->ElementIndex + (Index->BlockIndex*8); - return Result; -} - -link_internal world_edit_block_array_index -ZerothIndex(world_edit_block_array *Arr) -{ - world_edit_block_array_index Result = {}; - Result.Block = Arr->First; - /* Assert(Result.Block->Index == 0); */ - return Result; -} - -link_internal umm -TotalElements(world_edit_block_array *Arr) -{ - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } - return Result; -} - -link_internal world_edit_block_array_index -LastIndex(world_edit_block_array *Arr) -{ - world_edit_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } - return Result; -} - -link_internal world_edit_block_array_index -AtElements(world_edit_block_array *Arr) -{ - world_edit_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } - return Result; -} - -link_internal umm -Count(world_edit_block_array *Arr) -{ - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); - return Result; -} - -link_internal world_edit * -GetPtr(world_edit_block_array *Arr, world_edit_block_array_index Index) -{ - world_edit *Result = {}; - if (Index.Block) { Result = Index.Block->Elements + Index.ElementIndex; } - return Result; -} - -link_internal world_edit * -GetPtr(world_edit_block *Block, umm Index) -{ - world_edit *Result = 0; - if (Index < Block->At) { Result = Block->Elements + Index; } - return Result; -} - -link_internal world_edit * -GetPtr(world_edit_block_array *Arr, umm Index) -{ - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - world_edit_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) - { - Block = Block->Next; - } - - world_edit *Result = Block->Elements+ElementIndex; - return Result; -} - -link_internal world_edit * -TryGetPtr(world_edit_block_array *Arr, umm Index) -{ - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - world_edit *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; -} - -link_internal u32 -AtElements(world_edit_block *Block) -{ - return Block->At; -} - - -link_internal world_edit_block* -Allocate_world_edit_block(memory_arena *Memory) -{ - world_edit_block *Result = Allocate(world_edit_block, Memory, 1); - Result->Elements = Allocate(world_edit, Memory, 8); - return Result; -} - -link_internal cs -CS(world_edit_block_array_index Index) -{ - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); -} - -link_internal void -RemoveUnordered(world_edit_block_array *Array, world_edit_block_array_index Index) -{ - world_edit_block_array_index LastI = LastIndex(Array); - - world_edit *Element = GetPtr(Array, Index); - world_edit *LastElement = GetPtr(Array, LastI); - - *Element = *LastElement; - - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) - { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); - - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - world_edit_block *Current = Array->First; - world_edit_block *LastB = LastI.Block; - - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } - - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } -} - -link_internal world_edit * -Push(world_edit_block_array *Array, world_edit *Element) -{ - if (Array->Memory == 0) { Array->Memory = AllocateArena(); } - - if (Array->First == 0) { Array->First = Allocate_world_edit_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) - { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - world_edit_block *Next = Allocate_world_edit_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } - } - - world_edit *Result = Array->Current->Elements + Array->Current->At; - - Array->Current->Elements[Array->Current->At++] = *Element; - - return Result; -} - - diff --git a/generated/buffer_h_struct_u32.h b/generated/buffer_h_struct_u32.h index 46ad10a8d..21647154b 100644 --- a/generated/buffer_h_struct_u32.h +++ b/generated/buffer_h_struct_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:110:0 +// external/bonsai_stdlib/src/shader.h:114:0 struct shader_uniform_buffer { diff --git a/generated/buffer_struct.h b/generated/buffer_struct.h deleted file mode 100644 index a909bbae3..000000000 --- a/generated/buffer_struct.h +++ /dev/null @@ -1,84 +0,0 @@ -// external/bonsai_stdlib/src/shader.h:111:0 - -struct shader_uniform_buffer -{ - umm Count; - shader_uniform *Start; poof(@array_length(Element->Count)) -}; - -link_internal shader_uniform_buffer -ShaderUniformBuffer( shader_uniform *Start, umm ElementCount) -{ - shader_uniform_buffer Result = {ElementCount, Start}; - return Result; -} - -link_internal shader_uniform_buffer -ShaderUniformBuffer( umm ElementCount, memory_arena* Memory) -{ - shader_uniform_buffer Result = {}; - - if (ElementCount) - { - Result.Start = Allocate( shader_uniform, Memory, ElementCount ); - Result.Count = ElementCount; - } - else - { - Warn("Attempted to allocate shader_uniform_buffer of 0 length."); - } - - return Result; -} - -link_inline umm -LastIndex(shader_uniform_buffer *Buf) -{ - umm Result = Buf->Count > 0? Buf->Count-1 : 0; - return Result; -} - -link_inline umm -ZerothIndex(shader_uniform_buffer *Buf) -{ - umm Result = 0; - return Result; -} - -link_inline umm -AtElements(shader_uniform_buffer *Buf) -{ - umm Result = Buf->Count; - return Result; -} - -link_inline umm -TotalElements(shader_uniform_buffer *Buf) -{ - umm Result = Buf->Count; - return Result; -} - -link_inline umm -CurrentCount(shader_uniform_buffer *Buf) -{ - umm Result = Buf->Count; - return Result; -} - -link_inline shader_uniform * -GetPtr(shader_uniform_buffer *Buf, umm Index) -{ - shader_uniform *Result = 0; - if (Index < Buf->Count) { Result = Buf->Start + Index; } - return Result; -} - -link_inline shader_uniform * -Get(shader_uniform_buffer *Buf, umm Index) -{ - shader_uniform *Result = GetPtr(Buf, Index); - return Result; -} - - diff --git a/generated/d_union_bonsai_render_command.h b/generated/d_union_bonsai_render_command.h deleted file mode 100644 index 33c2c4a8d..000000000 --- a/generated/d_union_bonsai_render_command.h +++ /dev/null @@ -1,57 +0,0 @@ -// src/engine/render_command.h:156:0 - -enum work_queue_entry__bonsai_render_command_type -{ - type_work_queue_entry__bonsai_render_command_noop, - type_bonsai_render_command_initialize_noise_buffer, - type_bonsai_render_command_clear_all_framebuffers, - type_bonsai_render_command_allocate_texture, - type_bonsai_render_command_deallocate_texture, - type_bonsai_render_command_allocate_buffers, - type_bonsai_render_command_reallocate_buffers, - type_bonsai_render_command_deallocate_buffers, - type_bonsai_render_command_deallocate_world_chunk, - type_bonsai_render_command_do_stuff, - type_bonsai_render_command_allocate_and_map_gpu_element_buffer, - type_bonsai_render_command_unmap_gpu_element_buffer, - type_bonsai_render_command_setup_shader, - type_bonsai_render_command_teardown_shader, - type_bonsai_render_command_set_shader_uniform, - type_bonsai_render_command_draw_world_chunk_draw_list, - type_bonsai_render_command_draw_all_entities, - type_bonsai_render_command_gl_timer_init, - type_bonsai_render_command_gl_timer_start, - type_bonsai_render_command_gl_timer_end, - type_bonsai_render_command_gl_timer_read_value_and_histogram, -}; - -struct work_queue_entry__bonsai_render_command -{ - enum work_queue_entry__bonsai_render_command_type Type; - - union - { - struct bonsai_render_command_initialize_noise_buffer bonsai_render_command_initialize_noise_buffer; - struct bonsai_render_command_clear_all_framebuffers bonsai_render_command_clear_all_framebuffers; - struct bonsai_render_command_allocate_texture bonsai_render_command_allocate_texture; - struct bonsai_render_command_deallocate_texture bonsai_render_command_deallocate_texture; - struct bonsai_render_command_allocate_buffers bonsai_render_command_allocate_buffers; - struct bonsai_render_command_reallocate_buffers bonsai_render_command_reallocate_buffers; - struct bonsai_render_command_deallocate_buffers bonsai_render_command_deallocate_buffers; - struct bonsai_render_command_deallocate_world_chunk bonsai_render_command_deallocate_world_chunk; - struct bonsai_render_command_do_stuff bonsai_render_command_do_stuff; - struct bonsai_render_command_allocate_and_map_gpu_element_buffer bonsai_render_command_allocate_and_map_gpu_element_buffer; - struct bonsai_render_command_unmap_gpu_element_buffer bonsai_render_command_unmap_gpu_element_buffer; - struct bonsai_render_command_setup_shader bonsai_render_command_setup_shader; - struct bonsai_render_command_teardown_shader bonsai_render_command_teardown_shader; - struct bonsai_render_command_set_shader_uniform bonsai_render_command_set_shader_uniform; - struct bonsai_render_command_draw_world_chunk_draw_list bonsai_render_command_draw_world_chunk_draw_list; - struct bonsai_render_command_draw_all_entities bonsai_render_command_draw_all_entities; - struct bonsai_render_command_gl_timer_init bonsai_render_command_gl_timer_init; - struct bonsai_render_command_gl_timer_start bonsai_render_command_gl_timer_start; - struct bonsai_render_command_gl_timer_end bonsai_render_command_gl_timer_end; - struct bonsai_render_command_gl_timer_read_value_and_histogram bonsai_render_command_gl_timer_read_value_and_histogram; - }; -}; - - diff --git a/generated/default_marshal_layered_brush_0.h b/generated/default_marshal_layered_brush_0.h deleted file mode 100644 index 7c1bb9925..000000000 --- a/generated/default_marshal_layered_brush_0.h +++ /dev/null @@ -1,15 +0,0 @@ -// src/engine/editor.h:1115:0 - -Live->LayerCount = Stored->LayerCount; - - - -RangeIterator(Index, 16) -{ - Live->Layers[Index] = Stored->Layers[Index]; - -} - - - - diff --git a/generated/default_marshal_layered_brush_1.h b/generated/default_marshal_layered_brush_1.h deleted file mode 100644 index 38876154c..000000000 --- a/generated/default_marshal_layered_brush_1.h +++ /dev/null @@ -1,30 +0,0 @@ -// src/engine/editor.h:1108:0 - -RangeIterator(Index, NameBuf_Len) -{ - Live->NameBuf[Index] = Stored->NameBuf[Index]; - -} - - -Live->LayerCount = Stored->LayerCount; - - - -RangeIterator(Index, 16) -{ - Live->Layers[Index] = Stored->Layers[Index]; - -} - - -Live->SeedBrushWithSelection = Stored->SeedBrushWithSelection; - - - -Live->BrushFollowsCursor = Stored->BrushFollowsCursor; - - - - - diff --git a/generated/default_marshal_layered_brush_2.h b/generated/default_marshal_layered_brush_2.h deleted file mode 100644 index 3ac2da7c1..000000000 --- a/generated/default_marshal_layered_brush_2.h +++ /dev/null @@ -1,23 +0,0 @@ -// src/engine/editor.h:1101:0 - -Live->LayerCount = Stored->LayerCount; - - - -RangeIterator(Index, 16) -{ - Live->Layers[Index] = Stored->Layers[Index]; - -} - - -Live->SeedBrushWithSelection = Stored->SeedBrushWithSelection; - - - -Live->BrushFollowsCursor = Stored->BrushFollowsCursor; - - - - - diff --git a/generated/default_marshal_layered_brush_editor_0.h b/generated/default_marshal_layered_brush_editor_0.h deleted file mode 100644 index 0fc75a305..000000000 --- a/generated/default_marshal_layered_brush_editor_0.h +++ /dev/null @@ -1,15 +0,0 @@ -// src/engine/editor.h:1093:0 - -Live->LayerCount = Stored->LayerCount; - - - -RangeIterator(Index, 16) -{ - Live->Layers[Index] = Stored->Layers[Index]; - -} - - - - diff --git a/generated/default_marshal_layered_brush_editor_1.h b/generated/default_marshal_layered_brush_editor_1.h deleted file mode 100644 index 2e7802a4f..000000000 --- a/generated/default_marshal_layered_brush_editor_1.h +++ /dev/null @@ -1,30 +0,0 @@ -// src/engine/editor.h:1086:0 - -RangeIterator(Index, (256)) -{ - Live->NameBuf[Index] = Stored->NameBuf[Index]; - -} - - -Live->LayerCount = Stored->LayerCount; - - - -RangeIterator(Index, 16) -{ - Live->Layers[Index] = Stored->Layers[Index]; - -} - - -Live->SeedBrushWithSelection = Stored->SeedBrushWithSelection; - - - -Live->BrushFollowsCursor = Stored->BrushFollowsCursor; - - - - - diff --git a/generated/default_marshal_layered_brush_editor_2.h b/generated/default_marshal_layered_brush_editor_2.h deleted file mode 100644 index ab899b238..000000000 --- a/generated/default_marshal_layered_brush_editor_2.h +++ /dev/null @@ -1,23 +0,0 @@ -// src/engine/editor.h:1079:0 - -Live->LayerCount = Stored->LayerCount; - - - -RangeIterator(Index, 16) -{ - Live->Layers[Index] = Stored->Layers[Index]; - -} - - -Live->SeedBrushWithSelection = Stored->SeedBrushWithSelection; - - - -Live->BrushFollowsCursor = Stored->BrushFollowsCursor; - - - - - diff --git a/generated/default_marshal_level_header_3.h b/generated/default_marshal_level_header_3.h deleted file mode 100644 index 86b8e0faf..000000000 --- a/generated/default_marshal_level_header_3.h +++ /dev/null @@ -1,28 +0,0 @@ -// src/engine/serdes.cpp:502:0 - -Live->ChunkCount = Stored->ChunkCount; - - - -Live->EntityCount = Stored->EntityCount; - - - -Live->WorldFlags = Stored->WorldFlags; - - - -Live->WorldCenter = Stored->WorldCenter; - - - -Live->VisibleRegion = Stored->VisibleRegion; - - - -Live->Camera = Stored->Camera; - - - -Live->RenderSettings = Stored->RenderSettings; - diff --git a/generated/deserialize_struct_level_header_0.h b/generated/deserialize_struct_level_header_0.h deleted file mode 100644 index 9267dc4cd..000000000 --- a/generated/deserialize_struct_level_header_0.h +++ /dev/null @@ -1,88 +0,0 @@ -// src/engine/serdes.cpp:507:0 - -link_internal b32 -Deserialize(u8_cursor *Bytes, level_header_0 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, level_header_0 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, level_header_0 *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->ChunkCount, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->EntityCount, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->WorldFlags, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->WorldCenter, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->VisibleRegion, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Camera, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->CameraTarget, Memory); - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, level_header_0 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - diff --git a/generated/deserialize_struct_level_header_1.h b/generated/deserialize_struct_level_header_1.h deleted file mode 100644 index 02642569d..000000000 --- a/generated/deserialize_struct_level_header_1.h +++ /dev/null @@ -1,88 +0,0 @@ -// src/engine/serdes.cpp:510:0 - -link_internal b32 -Deserialize(u8_cursor *Bytes, level_header_1 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, level_header_1 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, level_header_1 *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->ChunkCount, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->EntityCount, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->WorldFlags, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->WorldCenter, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->VisibleRegion, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Camera, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->CameraTarget, Memory); - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, level_header_1 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - diff --git a/generated/deserialize_struct_level_header_2.h b/generated/deserialize_struct_level_header_2.h deleted file mode 100644 index 5953a77f5..000000000 --- a/generated/deserialize_struct_level_header_2.h +++ /dev/null @@ -1,88 +0,0 @@ -// src/engine/serdes.cpp:513:0 - -link_internal b32 -Deserialize(u8_cursor *Bytes, level_header_2 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, level_header_2 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, level_header_2 *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->ChunkCount, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->EntityCount, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->WorldFlags, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->WorldCenter, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->VisibleRegion, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Camera, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->CameraTarget, Memory); - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, level_header_2 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - diff --git a/generated/deserialize_struct_level_header_3.h b/generated/deserialize_struct_level_header_3.h deleted file mode 100644 index adb86d647..000000000 --- a/generated/deserialize_struct_level_header_3.h +++ /dev/null @@ -1,88 +0,0 @@ -// src/engine/serdes.cpp:516:0 - -link_internal b32 -Deserialize(u8_cursor *Bytes, level_header_3 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, level_header_3 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, level_header_3 *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->ChunkCount, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->EntityCount, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->WorldFlags, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->WorldCenter, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->VisibleRegion, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Camera, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->RenderSettings, Memory); - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, level_header_3 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - diff --git a/generated/deserialize_struct_render_settings_1.h b/generated/deserialize_struct_render_settings_1.h deleted file mode 100644 index 186d49a3d..000000000 --- a/generated/deserialize_struct_render_settings_1.h +++ /dev/null @@ -1,173 +0,0 @@ -// src/engine/serdes.cpp:437:0 - -link_internal b32 -Deserialize(u8_cursor *Bytes, render_settings_1 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_1 *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->UseSsao, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->UseShadowMapping, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->UseLightingBloom, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->BravoilMyersOIT, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->BravoilMcGuireOIT, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->DrawMajorGrid, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->DrawMinorGrid, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->MajorGridDim, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Ignored, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Headless, Memory); - - - - - - Element->ToneMappingType = Cast(tone_mapping_type, Read_u32(Bytes)); - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Lighting, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->ApplicationResolution, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->ShadowMapResolution, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->LuminanceMapResolution, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->iApplicationResolution, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->iShadowMapResolution, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->iLuminanceMapResolution, Memory); - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, render_settings_1 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - diff --git a/generated/do_editor_ui_for_compound_type_entity_aggregate_type.h b/generated/do_editor_ui_for_compound_type_entity_aggregate_type.h deleted file mode 100644 index 5ca04b7e6..000000000 --- a/generated/do_editor_ui_for_compound_type_entity_aggregate_type.h +++ /dev/null @@ -1,68 +0,0 @@ -// examples/turn_based/game_types.h:84:0 - -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_aggregate_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) -{ - if (Element) - { - // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support - // not drawing the toggl-y thing if we just want to dump the members. - b32 DrawChildren = True; - b32 DidToggle = False; - if (Name.Count) - { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle entity_aggregate_type", Element), Params)) - { - DidToggle = True; - PushNewRow(Ui); - } - else - { - DrawChildren = False; - } - } - - if (DrawChildren) - { - PushTableStart(Ui); - if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(entity_type*,&Element->Type), - CSz("Type"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(entity_status*,&Element->Status), - CSz("Status"), - Params - ); - if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); - } - else - { - PushNewRow(Ui); - } - - } - else - { - PushColumn(Ui, Name, Params); - PushColumn(Ui, CSz("(null)"), Params); - PushNewRow(Ui); - } - -} - diff --git a/generated/do_editor_ui_for_compound_type_entity_game_data.h b/generated/do_editor_ui_for_compound_type_entity_game_data.h deleted file mode 100644 index 881f32d2f..000000000 --- a/generated/do_editor_ui_for_compound_type_entity_game_data.h +++ /dev/null @@ -1,109 +0,0 @@ -// examples/turn_based/game_types.h:98:0 - -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_game_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) -{ - if (Element) - { - // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support - // not drawing the toggl-y thing if we just want to dump the members. - b32 DrawChildren = True; - b32 DidToggle = False; - if (Name.Count) - { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle entity_game_data", Element), Params)) - { - DidToggle = True; - PushNewRow(Ui); - } - else - { - DrawChildren = False; - } - } - - if (DrawChildren) - { - PushTableStart(Ui); - if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->FireballChargeLevel), - CSz("FireballChargeLevel"), - Params - ); - - - - - - - - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->FireballCharges), - CSz("FireballCharges"), - Params - ); - - - - - - - - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->IceBlockCharges), - CSz("IceBlockCharges"), - Params - ); - - - - - - - - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*,&Element->HoldingItem), - CSz("HoldingItem"), - Params - ); - - - - - - - - PushNewRow(Ui); - if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); - } - else - { - PushNewRow(Ui); - } - - } - else - { - PushColumn(Ui, Name, Params); - PushColumn(Ui, CSz("(null)"), Params); - PushNewRow(Ui); - } - -} - diff --git a/generated/do_editor_ui_for_compound_type_fireball_state.h b/generated/do_editor_ui_for_compound_type_fireball_state.h deleted file mode 100644 index bb78092de..000000000 --- a/generated/do_editor_ui_for_compound_type_fireball_state.h +++ /dev/null @@ -1,69 +0,0 @@ -// examples/turn_based/game_types.h:107:0 - -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, fireball_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) -{ - if (Element) - { - // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support - // not drawing the toggl-y thing if we just want to dump the members. - b32 DrawChildren = True; - b32 DidToggle = False; - if (Name.Count) - { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle fireball_state", Element), Params)) - { - DidToggle = True; - PushNewRow(Ui); - } - else - { - DrawChildren = False; - } - } - - if (DrawChildren) - { - PushTableStart(Ui); - if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*,&Element->ChargeLevel), - CSz("ChargeLevel"), - Params - ); - - - - - - - - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*,&Element->TargetP), - CSz("TargetP"), - Params - ); - if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); - } - else - { - PushNewRow(Ui); - } - - } - else - { - PushColumn(Ui, Name, Params); - PushColumn(Ui, CSz("(null)"), Params); - PushNewRow(Ui); - } - -} - diff --git a/generated/do_editor_ui_for_compound_type_layered_brush_editor.h b/generated/do_editor_ui_for_compound_type_layered_brush_editor.h deleted file mode 100644 index 1a9610af7..000000000 --- a/generated/do_editor_ui_for_compound_type_layered_brush_editor.h +++ /dev/null @@ -1,198 +0,0 @@ -// src/engine/editor.cpp:352:0 - -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) -{ - if (Element) - { - // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support - // not drawing the toggl-y thing if we just want to dump the members. - b32 DrawChildren = True; - b32 DidToggle = False; - if (Name.Count) - { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle layered_brush_editor", Element), Params)) - { - DidToggle = True; - PushNewRow(Ui); - } - else - { - DrawChildren = False; - } - } - - if (DrawChildren) - { - PushTableStart(Ui); - if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - if (ToggleButton(Ui, CSz("v NameBuf[(256) + 1]"), CSz("> NameBuf[(256) + 1]"), UiId(Window, "toggle layered_brush_editor char NameBuf", Element->NameBuf), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, (256) + 1) - { - DoEditorUi(Ui, Window, Element->NameBuf+ArrayIndex, FSz("NameBuf[%d]", ArrayIndex), Params); - - PushNewRow(Ui); - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); - - - - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->LayerCount), - CSz("LayerCount"), - Params - ); - - - - - - - - PushNewRow(Ui); - - if (ToggleButton(Ui, CSz("v Layers[16]"), CSz("> Layers[16]"), UiId(Window, "toggle layered_brush_editor brush_layer Layers", Element->Layers), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 16) - { - DoEditorUi(Ui, Window, Element->Layers+ArrayIndex, FSz("Layers[%d]", ArrayIndex), Params); - - - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); - - - - - if (ToggleButton(Ui, CSz("v LayerPreviews[16]"), CSz("> LayerPreviews[16]"), UiId(Window, "toggle layered_brush_editor chunk_thumbnail LayerPreviews", Element->LayerPreviews), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 16) - { - DoEditorUi(Ui, Window, Element->LayerPreviews+ArrayIndex, FSz("LayerPreviews[%d]", ArrayIndex), Params); - - - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(chunk_thumbnail*,&Element->SeedLayer), - CSz("SeedLayer"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->SeedBrushWithSelection), - CSz("SeedBrushWithSelection"), - Params - ); - - - - - - - - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*,&Element->BrushFollowsCursor), - CSz("BrushFollowsCursor"), - Params - ); - - - - - - - - PushNewRow(Ui); - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode*,&Element->Mode), - CSz("Mode"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode_modifier*,&Element->Modifier), - CSz("Modifier"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(chunk_thumbnail*,&Element->Preview), - CSz("Preview"), - Params - ); - if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); - } - else - { - PushNewRow(Ui); - } - - } - else - { - PushColumn(Ui, Name, Params); - PushColumn(Ui, CSz("(null)"), Params); - PushNewRow(Ui); - } - -} - diff --git a/generated/do_editor_ui_for_compound_type_octree_node_ptr.h b/generated/do_editor_ui_for_compound_type_octree_node_ptr.h deleted file mode 100644 index 5ced76578..000000000 --- a/generated/do_editor_ui_for_compound_type_octree_node_ptr.h +++ /dev/null @@ -1,114 +0,0 @@ -// src/engine/editor.cpp:303:0 - -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node_ptr *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) -{ - if (Element) - { - // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support - // not drawing the toggl-y thing if we just want to dump the members. - b32 DrawChildren = True; - b32 DidToggle = False; - if (Name.Count) - { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle octree_node_ptr", Element), Params)) - { - DidToggle = True; - PushNewRow(Ui); - } - else - { - DrawChildren = False; - } - } - - if (DrawChildren) - { - PushTableStart(Ui); - if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(octree_node_type*,&Element->Type), - CSz("Type"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*,&Element->DimInChunks), - CSz("DimInChunks"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_chunk*,&Element->Chunk), - CSz("Chunk"), - Params - ); - - - - - - - - - if (ToggleButton(Ui, CSz("v Children[8]"), CSz("> Children[8]"), UiId(Window, "toggle octree_node_ptr octree_node Children", Element->Children), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 8) - { - DoEditorUi(Ui, Window, Element->Children+ArrayIndex, FSz("Children[%d]", ArrayIndex), Params); - - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(octree_node*, Element->Next), - CSz("Next"), - Params - ); - if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); - } - else - { - PushNewRow(Ui); - } - - } - else - { - PushColumn(Ui, Name, Params); - PushColumn(Ui, CSz("(null)"), Params); - PushNewRow(Ui); - } - -} - diff --git a/generated/do_editor_ui_for_compound_type_struct.h b/generated/do_editor_ui_for_compound_type_struct.h deleted file mode 100644 index 8aa0180ab..000000000 --- a/generated/do_editor_ui_for_compound_type_struct.h +++ /dev/null @@ -1,145 +0,0 @@ -// src/engine/editor.cpp:430:0 - -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) -{ - if (Element) - { - // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support - // not drawing the toggl-y thing if we just want to dump the members. - b32 DrawChildren = True; - b32 DidToggle = False; - if (Name.Count) - { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_gen_render_context", Element), Params)) - { - DidToggle = True; - PushNewRow(Ui); - } - else - { - DrawChildren = False; - } - } - - if (DrawChildren) - { - PushTableStart(Ui); - if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->Program), - CSz("Program"), - Params - ); - - - - - - - - - if (ToggleButton(Ui, CSz("v Uniforms[3]"), CSz("> Uniforms[3]"), UiId(Window, "toggle terrain_gen_render_context shader_uniform Uniforms", Element->Uniforms), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 3) - { - DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); - - - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->NoiseTexture), - CSz("NoiseTexture"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*, &Element->FBO), - CSz("FBO"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->ChunkDim), - CSz("ChunkDim"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->WorldspaceBasis), - CSz("WorldspaceBasis"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->ChunkResolution), - CSz("ChunkResolution"), - Params - ); - if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); - } - else - { - PushNewRow(Ui); - } - - } - else - { - PushColumn(Ui, Name, Params); - PushColumn(Ui, CSz("(null)"), Params); - PushNewRow(Ui); - } - -} - diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h deleted file mode 100644 index 9073ce328..000000000 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_gen_render_context.h +++ /dev/null @@ -1,151 +0,0 @@ -// src/engine/editor.cpp:416:0 - -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_gen_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) -{ - if (Element) - { - // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support - // not drawing the toggl-y thing if we just want to dump the members. - b32 DrawChildren = True; - b32 DidToggle = False; - if (Name.Count) - { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_gen_render_context", Element), Params)) - { - DidToggle = True; - PushNewRow(Ui); - } - else - { - DrawChildren = False; - } - } - - if (DrawChildren) - { - PushTableStart(Ui); - if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->Program), - CSz("Program"), - Params - ); - - - - - - - - - - if (ToggleButton(Ui, CSz("v Uniforms[3]"), CSz("> Uniforms[3]"), UiId(Window, "toggle terrain_gen_render_context shader_uniform Uniforms", Element->Uniforms), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 3) - { - DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); - - - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->NoiseTexture), - CSz("NoiseTexture"), - Params - ); - - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*, &Element->FBO), - CSz("FBO"), - Params - ); - - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->ChunkDim), - CSz("ChunkDim"), - Params - ); - - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->WorldspaceBasis), - CSz("WorldspaceBasis"), - Params - ); - - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->ChunkResolution), - CSz("ChunkResolution"), - Params - ); - if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); - } - else - { - PushNewRow(Ui); - } - - } - else - { - PushColumn(Ui, Name, Params); - PushColumn(Ui, CSz("(null)"), Params); - PushNewRow(Ui); - } - -} - diff --git a/generated/do_editor_ui_for_compound_type_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_world_edit_brush.h deleted file mode 100644 index 5cc715019..000000000 --- a/generated/do_editor_ui_for_compound_type_world_edit_brush.h +++ /dev/null @@ -1,83 +0,0 @@ -// src/engine/editor.h:824:0 - -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush_constraints *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) -{ - if (Element) - { - // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support - // not drawing the toggl-y thing if we just want to dump the members. - b32 DrawChildren = True; - b32 DidToggle = False; - if (Name.Count) - { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_brush_constraints", Element), Params)) - { - DidToggle = True; - PushNewRow(Ui); - } - else - { - DrawChildren = False; - } - } - - if (DrawChildren) - { - PushTableStart(Ui); - if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_shape*, &Element->Shape), - CSz("Shape"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode*, &Element->Mode), - CSz("Mode"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode_modifier*, &Element->Modifier), - CSz("Modifier"), - Params - ); - if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); - } - else - { - PushNewRow(Ui); - } - - } - else - { - PushColumn(Ui, Name, Params); - PushColumn(Ui, CSz("(null)"), Params); - PushNewRow(Ui); - } - -} - diff --git a/generated/do_editor_ui_for_compound_type_world_edit_params.h b/generated/do_editor_ui_for_compound_type_world_edit_params.h deleted file mode 100644 index 101758980..000000000 --- a/generated/do_editor_ui_for_compound_type_world_edit_params.h +++ /dev/null @@ -1,91 +0,0 @@ -// src/engine/editor.h:710:0 - -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) -{ - if (Element) - { - // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support - // not drawing the toggl-y thing if we just want to dump the members. - b32 DrawChildren = True; - b32 DidToggle = False; - if (Name.Count) - { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_params", Element), Params)) - { - DidToggle = True; - PushNewRow(Ui); - } - else - { - DrawChildren = False; - } - } - - if (DrawChildren) - { - PushTableStart(Ui); - if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode*,&Element->Mode), - CSz("Mode"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_mode_modifier*,&Element->Modifier), - CSz("Modifier"), - Params - ); - - - - - - - - - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*,&Element->Iterations), - CSz("Iterations"), - Params - ); - - - - - - - - PushNewRow(Ui); - if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); - } - else - { - PushNewRow(Ui); - } - - } - else - { - PushColumn(Ui, Name, Params); - PushColumn(Ui, CSz("(null)"), Params); - PushNewRow(Ui); - } - -} - diff --git a/generated/do_editor_ui_for_enum_entity_status.h b/generated/do_editor_ui_for_enum_entity_status.h deleted file mode 100644 index 34fb31080..000000000 --- a/generated/do_editor_ui_for_enum_entity_status.h +++ /dev/null @@ -1,46 +0,0 @@ -// examples/turn_based/game_types.h:81:0 - -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_status *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) -{ - if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } - - cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); - if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) - { - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("None"), UiId(Window, "enum EntityStatus_None", Element), Params)) - { - *Element = EntityStatus_None; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Carried"), UiId(Window, "enum EntityStatus_Carried", Element), Params)) - { - *Element = EntityStatus_Carried; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Thrown"), UiId(Window, "enum EntityStatus_Thrown", Element), Params)) - { - *Element = EntityStatus_Thrown; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - } - else - { - PushNewRow(Ui); - } -} - diff --git a/generated/do_editor_ui_for_enum_entity_type.h b/generated/do_editor_ui_for_enum_entity_type.h deleted file mode 100644 index 5c2595dfe..000000000 --- a/generated/do_editor_ui_for_enum_entity_type.h +++ /dev/null @@ -1,73 +0,0 @@ -// examples/turn_based/game_types.h:78:0 - -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) -{ - if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } - - cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); - if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) - { - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Default"), UiId(Window, "enum EntityType_Default", Element), Params)) - { - *Element = EntityType_Default; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Enemy"), UiId(Window, "enum EntityType_Enemy", Element), Params)) - { - *Element = EntityType_Enemy; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Player"), UiId(Window, "enum EntityType_Player", Element), Params)) - { - *Element = EntityType_Player; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Fireball"), UiId(Window, "enum EntityType_Fireball", Element), Params)) - { - *Element = EntityType_Fireball; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Loot"), UiId(Window, "enum EntityType_Loot", Element), Params)) - { - *Element = EntityType_Loot; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("ItemSpawn"), UiId(Window, "enum EntityType_ItemSpawn", Element), Params)) - { - *Element = EntityType_ItemSpawn; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - } - else - { - PushNewRow(Ui); - } -} - diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_mode.h deleted file mode 100644 index 5bfe959bd..000000000 --- a/generated/do_editor_ui_for_radio_enum_world_edit_mode.h +++ /dev/null @@ -1,50 +0,0 @@ -// src/engine/editor.h:710:0 - -link_internal void -RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_mode Selection) -{ - ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; - SetRadioButton(RadioGroup, ToggleHandle, True); - /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ -} - -link_internal ui_toggle_button_group -RadioButtonGroup_world_edit_mode( renderer_2d *Ui, - window_layout *Window, - cs GroupName, - world_edit_mode *Element, - ui_render_params *Params = &DefaultUiRenderParams_Generic, - ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) -{ - ui_toggle_button_handle ButtonHandles[] = - { - { CSz("Attach"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode WorldEdit_Mode_Attach")), WorldEdit_Mode_Attach }, - { CSz("Remove"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode WorldEdit_Mode_Remove")), WorldEdit_Mode_Remove }, - { CSz("Paint"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode WorldEdit_Mode_Paint")), WorldEdit_Mode_Paint }, - { CSz("Disabled"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode WorldEdit_Mode_Disabled")), WorldEdit_Mode_Disabled }, - }; - - ui_toggle_button_handle_buffer ButtonBuffer = { - ArrayCount(ButtonHandles), - ButtonHandles - }; - - ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_RadioButtons)); - return Result; -} - - - - -link_internal ui_toggle_button_group -DoEditorUi( renderer_2d *Ui, - window_layout *Window, - world_edit_mode *Element, - cs GroupName, - ui_render_params *Params = &DefaultUiRenderParams_Generic, - ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) -{ - ui_toggle_button_group RadioGroup = RadioButtonGroup_world_edit_mode(Ui, Window, GroupName, Element, Params, ExtraFlags); - return RadioGroup; -} - diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h deleted file mode 100644 index a933775b1..000000000 --- a/generated/do_editor_ui_for_radio_enum_world_edit_mode_modifier.h +++ /dev/null @@ -1,49 +0,0 @@ -// src/engine/editor.h:689:0 - -link_internal void -RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_mode_modifier Selection) -{ - ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; - SetRadioButton(RadioGroup, ToggleHandle, True); - /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ -} - -link_internal ui_toggle_button_group -RadioButtonGroup_world_edit_mode_modifier( renderer_2d *Ui, - window_layout *Window, - cs GroupName, - world_edit_mode_modifier *Element, - ui_render_params *Params = &DefaultUiRenderParams_Generic, - ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) -{ - ui_toggle_button_handle ButtonHandles[] = - { - { CSz("Default"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode_modifier WorldEdit_Modifier_Default")), WorldEdit_Modifier_Default }, - { CSz("Flood"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode_modifier WorldEdit_Modifier_Flood")), WorldEdit_Modifier_Flood }, - { CSz("Surface"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_mode_modifier WorldEdit_Modifier_Surface")), WorldEdit_Modifier_Surface }, - }; - - ui_toggle_button_handle_buffer ButtonBuffer = { - ArrayCount(ButtonHandles), - ButtonHandles - }; - - ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_RadioButtons)); - return Result; -} - - - - -link_internal ui_toggle_button_group -DoEditorUi( renderer_2d *Ui, - window_layout *Window, - world_edit_mode_modifier *Element, - cs GroupName, - ui_render_params *Params = &DefaultUiRenderParams_Generic, - ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) -{ - ui_toggle_button_group RadioGroup = RadioButtonGroup_world_edit_mode_modifier(Ui, Window, GroupName, Element, Params, ExtraFlags); - return RadioGroup; -} - diff --git a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h b/generated/flood_fill_iteration_pattern_275071431_101859599_0.h deleted file mode 100644 index 864665edd..000000000 --- a/generated/flood_fill_iteration_pattern_275071431_101859599_0.h +++ /dev/null @@ -1,104 +0,0 @@ -// src/engine/world_update.cpp:829:0 - -random_series ColorEntropy = {4654376543246}; - -voxel *V = {}; -// TODO(Jesse): Do we want to try and keep the amount of temp memory to a minimum here? -voxel_stack_element_cursor Stack = VoxelStackElementCursor(umm(TotalVoxels*6), Thread->TempMemory); - -// Unfortunately, can't #if this out in a poof function. Should probably -// put it on a #define switch to make sure it gets compiled out. -DEBUG_AssertVoxelFloodStartsInEmptyVoxel(FloodOrigin, &SimSpaceUpdateBounds, CopiedChunk->Voxels); - -Push(&Stack, VoxelStackElement(FloodOrigin, VoxelRuleDir_Count)); -while (AtElements(&Stack)) -{ - b32 OverwriteVoxel = False; - - voxel_stack_element Element = Pop(&Stack); - v3i SimVoxP = Element.VoxSimP + AllDirections[Element.Dir]; - v3i RelVoxP = SimVoxP - SimSpaceUpdateBounds.Min; - - s32 VoxelIndex = TryGetIndex(RelVoxP, UpdateDim); - if (VoxelIndex > -1) - { - V = CopiedChunk->Voxels+VoxelIndex; - - v3i CenterToVoxP = SimVoxP - FloodOrigin; - - - v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; - voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - NotImplemented; - /* if (Contains(SSRect, SimVoxP) && (V->Flags&Voxel_Filled) == 0) */ - - { - NotImplemented; - /* if ( (V->Flags & Voxel_MarkBit) == 0) */ - { - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosY)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegY)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosZ)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegZ)); - } - } - - - NotImplemented; - /* if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { *V = {}; } */ - - - NotImplemented; - /* V->Flags |= Voxel_MarkBit; */ - - if ( ((OverwriteVoxel == True) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True)) ) - { - /* if (Mode == WorldEdit_Mode_Paint) */ - /* { */ - /* V->Color = NewVoxelValue->Color; */ - /* } */ - /* else */ - { - *V = *NewVoxelValue; - } - } - } -} - -Push(&Stack, VoxelStackElement(FloodOrigin, VoxelRuleDir_Count)); -while (AtElements(&Stack)) -{ - voxel_stack_element Element = Pop(&Stack); - v3i Dir = AllDirections[Element.Dir]; - { - v3i SimVoxP = Element.VoxSimP + Dir; - v3i RelVoxP = SimVoxP - SimSpaceUpdateBounds.Min; - - s32 VoxelIndex = TryGetIndex(RelVoxP, UpdateDim); - - if (VoxelIndex > -1) - { - V = CopiedChunk->Voxels+VoxelIndex; - - - - NotImplemented; - /* if ( (V->Flags&Voxel_MarkBit)) */ - { - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosY)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegY)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosZ)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegZ)); - } - - NotImplemented; - /* V->Flags &= ~Voxel_MarkBit; */ - } - } -} - diff --git a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h b/generated/flood_fill_iteration_pattern_275071431_785723886_0.h deleted file mode 100644 index e7f0a9268..000000000 --- a/generated/flood_fill_iteration_pattern_275071431_785723886_0.h +++ /dev/null @@ -1,104 +0,0 @@ -// src/engine/world_update.cpp:811:0 - -random_series ColorEntropy = {4654376543246}; - -voxel *V = {}; -// TODO(Jesse): Do we want to try and keep the amount of temp memory to a minimum here? -voxel_stack_element_cursor Stack = VoxelStackElementCursor(umm(TotalVoxels*6), Thread->TempMemory); - -// Unfortunately, can't #if this out in a poof function. Should probably -// put it on a #define switch to make sure it gets compiled out. -DEBUG_AssertVoxelFloodStartsInEmptyVoxel(FloodOrigin, &SimSpaceUpdateBounds, CopiedChunk->Voxels); - -Push(&Stack, VoxelStackElement(FloodOrigin, VoxelRuleDir_Count)); -while (AtElements(&Stack)) -{ - b32 OverwriteVoxel = False; - - voxel_stack_element Element = Pop(&Stack); - v3i SimVoxP = Element.VoxSimP + AllDirections[Element.Dir]; - v3i RelVoxP = SimVoxP - SimSpaceUpdateBounds.Min; - - s32 VoxelIndex = TryGetIndex(RelVoxP, UpdateDim); - if (VoxelIndex > -1) - { - V = CopiedChunk->Voxels+VoxelIndex; - - v3i CenterToVoxP = SimVoxP - FloodOrigin; - - - v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; - voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - NotImplemented; - /* if ((V->Flags&Voxel_Filled)) */ - - { - NotImplemented; - /* if ( (V->Flags & Voxel_MarkBit) == 0) */ - { - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosY)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegY)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosZ)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegZ)); - } - } - - - NotImplemented; - /* if ( ((V->Flags&Voxel_Filled) == 0) && NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { *V = *NewVoxelValue; } */ - - - NotImplemented; - /* V->Flags |= Voxel_MarkBit; */ - - if ( ((OverwriteVoxel == True) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True)) ) - { - /* if (Mode == WorldEdit_Mode_Paint) */ - /* { */ - /* V->Color = NewVoxelValue->Color; */ - /* } */ - /* else */ - { - *V = *NewVoxelValue; - } - } - } -} - -Push(&Stack, VoxelStackElement(FloodOrigin, VoxelRuleDir_Count)); -while (AtElements(&Stack)) -{ - voxel_stack_element Element = Pop(&Stack); - v3i Dir = AllDirections[Element.Dir]; - { - v3i SimVoxP = Element.VoxSimP + Dir; - v3i RelVoxP = SimVoxP - SimSpaceUpdateBounds.Min; - - s32 VoxelIndex = TryGetIndex(RelVoxP, UpdateDim); - - if (VoxelIndex > -1) - { - V = CopiedChunk->Voxels+VoxelIndex; - - - - NotImplemented; - /* if ( (V->Flags&Voxel_MarkBit)) */ - { - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosY)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegY)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosZ)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegZ)); - } - - NotImplemented; - /* V->Flags &= ~Voxel_MarkBit; */ - } - } -} - diff --git a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h b/generated/flood_fill_iteration_pattern_846291950_267608728_0.h deleted file mode 100644 index 159c805f3..000000000 --- a/generated/flood_fill_iteration_pattern_846291950_267608728_0.h +++ /dev/null @@ -1,107 +0,0 @@ -// src/engine/world_update.cpp:684:0 - -random_series ColorEntropy = {4654376543246}; - -voxel *V = {}; -// TODO(Jesse): Do we want to try and keep the amount of temp memory to a minimum here? -voxel_stack_element_cursor Stack = VoxelStackElementCursor(umm(TotalVoxels*6), Thread->TempMemory); - -// Unfortunately, can't #if this out in a poof function. Should probably -// put it on a #define switch to make sure it gets compiled out. -DEBUG_AssertVoxelFloodStartsInEmptyVoxel(FloodOrigin, &SimSpaceUpdateBounds, CopiedChunk->Voxels); - -Push(&Stack, VoxelStackElement(FloodOrigin, VoxelRuleDir_Count)); -while (AtElements(&Stack)) -{ - b32 OverwriteVoxel = False; - - voxel_stack_element Element = Pop(&Stack); - v3i SimVoxP = Element.VoxSimP + AllDirections[Element.Dir]; - v3i RelVoxP = SimVoxP - SimSpaceUpdateBounds.Min; - - s32 VoxelIndex = TryGetIndex(RelVoxP, UpdateDim); - if (VoxelIndex > -1) - { - V = CopiedChunk->Voxels+VoxelIndex; - - v3i CenterToVoxP = SimVoxP - FloodOrigin; - - - NotImplemented; - /* { if ( (V->Flags&Voxel_Filled) == (Voxel_Filled*(Mode==WorldEdit_Mode_Additive)) ) }, */ - - { - NotImplemented; - /* if ( (V->Flags & Voxel_MarkBit) == 0) */ - { - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosY)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegY)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosZ)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegZ)); - } - } - - - NotImplemented; - /* if ( Mode == WorldEdit_Mode_Additive && (V->Flags&Voxel_Filled) ) */ - /* { } */ - /* else */ - { - OverwriteVoxel = True; - } - - - NotImplemented; - /* V->Flags |= Voxel_MarkBit; */ - - if ( ((OverwriteVoxel == True) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True)) ) - { - /* if (Mode == WorldEdit_Mode_Paint) */ - /* { */ - /* V->Color = NewVoxelValue->Color; */ - /* } */ - /* else */ - { - *V = *NewVoxelValue; - } - } - } -} - -Push(&Stack, VoxelStackElement(FloodOrigin, VoxelRuleDir_Count)); -while (AtElements(&Stack)) -{ - voxel_stack_element Element = Pop(&Stack); - v3i Dir = AllDirections[Element.Dir]; - { - v3i SimVoxP = Element.VoxSimP + Dir; - v3i RelVoxP = SimVoxP - SimSpaceUpdateBounds.Min; - - s32 VoxelIndex = TryGetIndex(RelVoxP, UpdateDim); - - if (VoxelIndex > -1) - { - V = CopiedChunk->Voxels+VoxelIndex; - - - - NotImplemented; - /* if ( (V->Flags&Voxel_MarkBit)) */ - { - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosX)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegX)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosY)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegY)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_PosZ)); - Push(&Stack, VoxelStackElement(SimVoxP, VoxelRuleDir_NegZ)); - } - - NotImplemented; - /* V->Flags &= ~Voxel_MarkBit; */ - } - } -} - diff --git a/generated/gen_shader_uniform_push_camera.h b/generated/gen_shader_uniform_push_camera.h index 701ef78d6..5cd9043d1 100644 --- a/generated/gen_shader_uniform_push_camera.h +++ b/generated/gen_shader_uniform_push_camera.h @@ -1,22 +1,5 @@ // src/engine/shader.cpp:1:0 -shader_uniform * -PushShaderUniform( memory_arena *Mem, const char *Name, camera *Value) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name); - Uniform->Type = ShaderUniform_Camera; - Uniform->Camera = Value; - return Uniform; -} - -shader_uniform * -GetUniform(memory_arena *Mem, shader *Shader, camera *Value, const char *Name) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name, Value); - Uniform->ID = GetShaderUniform(Shader, Name); - return Uniform; -} - b32 SetShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name) { diff --git a/generated/gen_shader_uniform_push_light.h b/generated/gen_shader_uniform_push_light.h index efbc6f35e..0a69d4bd1 100644 --- a/generated/gen_shader_uniform_push_light.h +++ b/generated/gen_shader_uniform_push_light.h @@ -1,22 +1,5 @@ // src/engine/shader.cpp:4:0 -shader_uniform * -PushShaderUniform( memory_arena *Mem, const char *Name, light *Value) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name); - Uniform->Type = ShaderUniform_Light; - Uniform->Light = Value; - return Uniform; -} - -shader_uniform * -GetUniform(memory_arena *Mem, shader *Shader, light *Value, const char *Name) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name, Value); - Uniform->ID = GetShaderUniform(Shader, Name); - return Uniform; -} - b32 SetShaderUniform(shader *Shader, u32 Index, light *Value, const char *Name) { diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 75248f5b9..70038eac4 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,21 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:252:0 - -shader_uniform * -PushShaderUniform( memory_arena *Mem, const char *Name, m4 *Value) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name); - Uniform->Type = ShaderUniform_M4; - Uniform->M4 = Value; - return Uniform; -} - -shader_uniform * -GetUniform(memory_arena *Mem, shader *Shader, m4 *Value, const char *Name) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name, Value); - Uniform->ID = GetShaderUniform(Shader, Name); - return Uniform; -} +// external/bonsai_stdlib/src/shader.cpp:288:0 b32 SetShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 7328dcab6..277ccfcfd 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,21 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:267:0 - -shader_uniform * -PushShaderUniform( memory_arena *Mem, const char *Name, r32 *Value) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name); - Uniform->Type = ShaderUniform_R32; - Uniform->R32 = Value; - return Uniform; -} - -shader_uniform * -GetUniform(memory_arena *Mem, shader *Shader, r32 *Value, const char *Name) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name, Value); - Uniform->ID = GetShaderUniform(Shader, Name); - return Uniform; -} +// external/bonsai_stdlib/src/shader.cpp:303:0 b32 SetShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index f9298381e..dc6a72510 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,21 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:264:0 - -shader_uniform * -PushShaderUniform( memory_arena *Mem, const char *Name, s32 *Value) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name); - Uniform->Type = ShaderUniform_S32; - Uniform->S32 = Value; - return Uniform; -} - -shader_uniform * -GetUniform(memory_arena *Mem, shader *Shader, s32 *Value, const char *Name) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name, Value); - Uniform->ID = GetShaderUniform(Shader, Name); - return Uniform; -} +// external/bonsai_stdlib/src/shader.cpp:300:0 b32 SetShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index 62916abbe..aa659a662 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,21 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:249:0 - -shader_uniform * -PushShaderUniform( memory_arena *Mem, const char *Name, texture *Value) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name); - Uniform->Type = ShaderUniform_Texture; - Uniform->Texture = Value; - return Uniform; -} - -shader_uniform * -GetUniform(memory_arena *Mem, shader *Shader, texture *Value, const char *Name) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name, Value); - Uniform->ID = GetShaderUniform(Shader, Name); - return Uniform; -} +// external/bonsai_stdlib/src/shader.cpp:285:0 b32 SetShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index f85a652c8..742b8451f 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,21 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:261:0 - -shader_uniform * -PushShaderUniform( memory_arena *Mem, const char *Name, u32 *Value) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name); - Uniform->Type = ShaderUniform_U32; - Uniform->U32 = Value; - return Uniform; -} - -shader_uniform * -GetUniform(memory_arena *Mem, shader *Shader, u32 *Value, const char *Name) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name, Value); - Uniform->ID = GetShaderUniform(Shader, Name); - return Uniform; -} +// external/bonsai_stdlib/src/shader.cpp:297:0 b32 SetShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index 481b8a86a..e3bf1ceb7 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,21 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:255:0 - -shader_uniform * -PushShaderUniform( memory_arena *Mem, const char *Name, v2 *Value) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name); - Uniform->Type = ShaderUniform_V2; - Uniform->V2 = Value; - return Uniform; -} - -shader_uniform * -GetUniform(memory_arena *Mem, shader *Shader, v2 *Value, const char *Name) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name, Value); - Uniform->ID = GetShaderUniform(Shader, Name); - return Uniform; -} +// external/bonsai_stdlib/src/shader.cpp:291:0 b32 SetShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index a29c6d269..641f17968 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,21 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:258:0 - -shader_uniform * -PushShaderUniform( memory_arena *Mem, const char *Name, v3 *Value) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name); - Uniform->Type = ShaderUniform_V3; - Uniform->V3 = Value; - return Uniform; -} - -shader_uniform * -GetUniform(memory_arena *Mem, shader *Shader, v3 *Value, const char *Name) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name, Value); - Uniform->ID = GetShaderUniform(Shader, Name); - return Uniform; -} +// external/bonsai_stdlib/src/shader.cpp:294:0 b32 SetShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v3i.h b/generated/gen_shader_uniform_push_v3i.h deleted file mode 100644 index 7a6750873..000000000 --- a/generated/gen_shader_uniform_push_v3i.h +++ /dev/null @@ -1,33 +0,0 @@ -// external/bonsai_stdlib/src/shader.cpp:187:0 - -shader_uniform * -PushShaderUniform( memory_arena *Mem, const char *Name, v3i *Value) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name); - Uniform->Type = ShaderUniform_V3i; - Uniform->V3i = Value; - return Uniform; -} - -shader_uniform * -GetUniform(memory_arena *Mem, shader *Shader, v3i *Value, const char *Name) -{ - shader_uniform *Uniform = PushShaderUniform(Mem, Name, Value); - Uniform->ID = GetShaderUniform(Shader, Name); - return Uniform; -} - -shader_uniform -ShaderUniform(shader *Shader, v3i *Value, const char *Name) -{ - shader_uniform Uniform = {}; - - Uniform.Type = ShaderUniform_V3i; - Uniform.V3i = Value; - Uniform.Name = Name; - - Uniform.ID = GetShaderUniform(Shader, Name); - - return Uniform; -} - diff --git a/generated/gen_vector_operators_v3_8x.h b/generated/gen_vector_operators_v3_8x.h deleted file mode 100644 index 9ceea97f1..000000000 --- a/generated/gen_vector_operators_v3_8x.h +++ /dev/null @@ -1,289 +0,0 @@ -// external/bonsai_stdlib/src/avx2_v3.h:30:0 - -link_internal void -DeepCopy(v3_8x *Src, v3_8x *Dest) -{ - *Dest = *Src; -} - -#if 0 -inline b32 -operator==( v3_8x P1, v3_8x P2 ) -{ - b32 Result = ( P1.Raw[0] == P2.Raw[0] && P1.Raw[1] == P2.Raw[1] && P1.Raw[2] == P2.Raw[2] ); - return Result; -} - - -// NOTE(Jesse): This is for contaiers that call AreEqual() -link_internal b32 -AreEqual(v3_8x V1, v3_8x V2) -{ - b32 Result = V1 == V2; - return Result; -} - -// NOTE(Jesse): Can't gen != because the condition welding it together -// is not &&, it's || -// -/* gen_vector_comparator(Type, {!=}) */ -inline b32 -operator!=( v3_8x P1, v3_8x P2 ) -{ - b32 Result = !(P1 == P2); - return Result; -} - -inline b32 -operator<( v3_8x P1, v3_8x P2 ) -{ - b32 Result = ( P1.Raw[0] < P2.Raw[0] && P1.Raw[1] < P2.Raw[1] && P1.Raw[2] < P2.Raw[2] ); - return Result; -} - - -inline b32 -operator<=( v3_8x P1, v3_8x P2 ) -{ - b32 Result = ( P1.Raw[0] <= P2.Raw[0] && P1.Raw[1] <= P2.Raw[1] && P1.Raw[2] <= P2.Raw[2] ); - return Result; -} - - -inline b32 -operator>( v3_8x P1, v3_8x P2 ) -{ - b32 Result = ( P1.Raw[0] > P2.Raw[0] && P1.Raw[1] > P2.Raw[1] && P1.Raw[2] > P2.Raw[2] ); - return Result; -} - - -inline b32 -operator>=( v3_8x P1, v3_8x P2 ) -{ - b32 Result = ( P1.Raw[0] >= P2.Raw[0] && P1.Raw[1] >= P2.Raw[1] && P1.Raw[2] >= P2.Raw[2] ); - return Result; -} - -#endif - -inline v3_8x -operator+( v3_8x P1, v3_8x P2 ) -{ - v3_8x Result = {{ - { P1.Raw[0] + P2.Raw[0]}, - { P1.Raw[1] + P2.Raw[1]}, - { P1.Raw[2] + P2.Raw[2]}, - }}; - return Result; -} - -inline v3_8x -operator+( v3_8x P1, __m256 Scalar ) -{ - v3_8x Result = {{ - { P1.Raw[0] + Scalar}, - { P1.Raw[1] + Scalar}, - { P1.Raw[2] + Scalar}, - }}; - return Result; -} - -inline v3_8x -operator+( __m256 Scalar, v3_8x P1 ) -{ - v3_8x Result = {{ - { Scalar + P1.Raw[0]}, - { Scalar + P1.Raw[1]}, - { Scalar + P1.Raw[2]}, - }}; - return Result; -} - - - -inline v3_8x -operator-( v3_8x P1, v3_8x P2 ) -{ - v3_8x Result = {{ - { P1.Raw[0] - P2.Raw[0]}, - { P1.Raw[1] - P2.Raw[1]}, - { P1.Raw[2] - P2.Raw[2]}, - }}; - return Result; -} - -inline v3_8x -operator-( v3_8x P1, __m256 Scalar ) -{ - v3_8x Result = {{ - { P1.Raw[0] - Scalar}, - { P1.Raw[1] - Scalar}, - { P1.Raw[2] - Scalar}, - }}; - return Result; -} - -inline v3_8x -operator-( __m256 Scalar, v3_8x P1 ) -{ - v3_8x Result = {{ - { Scalar - P1.Raw[0]}, - { Scalar - P1.Raw[1]}, - { Scalar - P1.Raw[2]}, - }}; - return Result; -} - - - -inline v3_8x -operator*( v3_8x P1, v3_8x P2 ) -{ - v3_8x Result = {{ - { P1.Raw[0] * P2.Raw[0]}, - { P1.Raw[1] * P2.Raw[1]}, - { P1.Raw[2] * P2.Raw[2]}, - }}; - return Result; -} - -inline v3_8x -operator*( v3_8x P1, __m256 Scalar ) -{ - v3_8x Result = {{ - { P1.Raw[0] * Scalar}, - { P1.Raw[1] * Scalar}, - { P1.Raw[2] * Scalar}, - }}; - return Result; -} - -inline v3_8x -operator*( __m256 Scalar, v3_8x P1 ) -{ - v3_8x Result = {{ - { Scalar * P1.Raw[0]}, - { Scalar * P1.Raw[1]}, - { Scalar * P1.Raw[2]}, - }}; - return Result; -} - - - -inline v3_8x -operator/( v3_8x P1, v3_8x P2 ) -{ - v3_8x Result = {{ - { P1.Raw[0] / P2.Raw[0]}, - { P1.Raw[1] / P2.Raw[1]}, - { P1.Raw[2] / P2.Raw[2]}, - }}; - return Result; -} - -inline v3_8x -operator/( v3_8x P1, __m256 Scalar ) -{ - v3_8x Result = {{ - { P1.Raw[0] / Scalar}, - { P1.Raw[1] / Scalar}, - { P1.Raw[2] / Scalar}, - }}; - return Result; -} - -inline v3_8x -operator/( __m256 Scalar, v3_8x P1 ) -{ - v3_8x Result = {{ - { Scalar / P1.Raw[0]}, - { Scalar / P1.Raw[1]}, - { Scalar / P1.Raw[2]}, - }}; - return Result; -} - - - -#if 0 -inline v3_8x & -operator+=( v3_8x &P1, v3_8x P2 ) -{ - P1.Raw[0] += P2.Raw[0]; - P1.Raw[1] += P2.Raw[1]; - P1.Raw[2] += P2.Raw[2]; - return P1; -} - -inline v3_8x & -operator+=( v3_8x &P1, __m256 Scalar ) -{ - P1.Raw[0] += Scalar; - P1.Raw[1] += Scalar; - P1.Raw[2] += Scalar; - return P1; -} - - -inline v3_8x & -operator-=( v3_8x &P1, v3_8x P2 ) -{ - P1.Raw[0] -= P2.Raw[0]; - P1.Raw[1] -= P2.Raw[1]; - P1.Raw[2] -= P2.Raw[2]; - return P1; -} - -inline v3_8x & -operator-=( v3_8x &P1, __m256 Scalar ) -{ - P1.Raw[0] -= Scalar; - P1.Raw[1] -= Scalar; - P1.Raw[2] -= Scalar; - return P1; -} - - -inline v3_8x & -operator*=( v3_8x &P1, v3_8x P2 ) -{ - P1.Raw[0] *= P2.Raw[0]; - P1.Raw[1] *= P2.Raw[1]; - P1.Raw[2] *= P2.Raw[2]; - return P1; -} - -inline v3_8x & -operator*=( v3_8x &P1, __m256 Scalar ) -{ - P1.Raw[0] *= Scalar; - P1.Raw[1] *= Scalar; - P1.Raw[2] *= Scalar; - return P1; -} - - -inline v3_8x & -operator/=( v3_8x &P1, v3_8x P2 ) -{ - P1.Raw[0] /= P2.Raw[0]; - P1.Raw[1] /= P2.Raw[1]; - P1.Raw[2] /= P2.Raw[2]; - return P1; -} - -inline v3_8x & -operator/=( v3_8x &P1, __m256 Scalar ) -{ - P1.Raw[0] /= Scalar; - P1.Raw[1] /= Scalar; - P1.Raw[2] /= Scalar; - return P1; -} - - -#endif - - diff --git a/generated/generate_string_table_entity_status.h b/generated/generate_string_table_entity_status.h deleted file mode 100644 index 3db1c6fad..000000000 --- a/generated/generate_string_table_entity_status.h +++ /dev/null @@ -1,34 +0,0 @@ -// examples/turn_based/game_types.h:75:0 - -link_internal counted_string -ToStringPrefixless(entity_status Type) -{ - counted_string Result = {}; - switch (Type) - { - case EntityStatus_None: { Result = CSz("None"); } break; - case EntityStatus_Carried: { Result = CSz("Carried"); } break; - case EntityStatus_Thrown: { Result = CSz("Thrown"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - -link_internal counted_string -ToString(entity_status Type) -{ - counted_string Result = {}; - switch (Type) - { - case EntityStatus_None: { Result = CSz("EntityStatus_None"); } break; - case EntityStatus_Carried: { Result = CSz("EntityStatus_Carried"); } break; - case EntityStatus_Thrown: { Result = CSz("EntityStatus_Thrown"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - diff --git a/generated/generate_string_table_entity_type.h b/generated/generate_string_table_entity_type.h deleted file mode 100644 index 907deeeea..000000000 --- a/generated/generate_string_table_entity_type.h +++ /dev/null @@ -1,40 +0,0 @@ -// examples/turn_based/game_types.h:72:0 - -link_internal counted_string -ToStringPrefixless(entity_type Type) -{ - counted_string Result = {}; - switch (Type) - { - case EntityType_Default: { Result = CSz("Default"); } break; - case EntityType_Enemy: { Result = CSz("Enemy"); } break; - case EntityType_Player: { Result = CSz("Player"); } break; - case EntityType_Fireball: { Result = CSz("Fireball"); } break; - case EntityType_Loot: { Result = CSz("Loot"); } break; - case EntityType_ItemSpawn: { Result = CSz("ItemSpawn"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - -link_internal counted_string -ToString(entity_type Type) -{ - counted_string Result = {}; - switch (Type) - { - case EntityType_Default: { Result = CSz("EntityType_Default"); } break; - case EntityType_Enemy: { Result = CSz("EntityType_Enemy"); } break; - case EntityType_Player: { Result = CSz("EntityType_Player"); } break; - case EntityType_Fireball: { Result = CSz("EntityType_Fireball"); } break; - case EntityType_Loot: { Result = CSz("EntityType_Loot"); } break; - case EntityType_ItemSpawn: { Result = CSz("EntityType_ItemSpawn"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - diff --git a/generated/generate_string_table_player_action.h b/generated/generate_string_table_player_action.h deleted file mode 100644 index e52da2ef3..000000000 --- a/generated/generate_string_table_player_action.h +++ /dev/null @@ -1,44 +0,0 @@ -// examples/turn_based/game_types.h:141:0 - -link_internal counted_string -ToStringPrefixless(player_action Type) -{ - counted_string Result = {}; - switch (Type) - { - case PlayerAction_None: { Result = CSz("None"); } break; - case PlayerAction_Move: { Result = CSz("Move"); } break; - case PlayerAction_Shovel: { Result = CSz("Shovel"); } break; - case PlayerAction_Grab: { Result = CSz("Grab"); } break; - case PlayerAction_ChargeFireball: { Result = CSz("ChargeFireball"); } break; - case PlayerAction_IceBlock: { Result = CSz("IceBlock"); } break; - case PlayerAction_Throw: { Result = CSz("Throw"); } break; - case PlayerAction_Count: { Result = CSz("Count"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - -link_internal counted_string -ToString(player_action Type) -{ - counted_string Result = {}; - switch (Type) - { - case PlayerAction_None: { Result = CSz("PlayerAction_None"); } break; - case PlayerAction_Move: { Result = CSz("PlayerAction_Move"); } break; - case PlayerAction_Shovel: { Result = CSz("PlayerAction_Shovel"); } break; - case PlayerAction_Grab: { Result = CSz("PlayerAction_Grab"); } break; - case PlayerAction_ChargeFireball: { Result = CSz("PlayerAction_ChargeFireball"); } break; - case PlayerAction_IceBlock: { Result = CSz("PlayerAction_IceBlock"); } break; - case PlayerAction_Throw: { Result = CSz("PlayerAction_Throw"); } break; - case PlayerAction_Count: { Result = CSz("PlayerAction_Count"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - diff --git a/generated/generate_string_table_turn_mode.h b/generated/generate_string_table_turn_mode.h deleted file mode 100644 index b36ae3122..000000000 --- a/generated/generate_string_table_turn_mode.h +++ /dev/null @@ -1,32 +0,0 @@ -// examples/turn_based/game_types.h:151:0 - -link_internal counted_string -ToStringPrefixless(turn_mode Type) -{ - counted_string Result = {}; - switch (Type) - { - case TurnMode_Default: { Result = CSz("Default"); } break; - case TurnMode_Transition: { Result = CSz("Transition"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - -link_internal counted_string -ToString(turn_mode Type) -{ - counted_string Result = {}; - switch (Type) - { - case TurnMode_Default: { Result = CSz("TurnMode_Default"); } break; - case TurnMode_Transition: { Result = CSz("TurnMode_Transition"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - diff --git a/generated/rectalinear_iteration_pattern_398799212.h b/generated/rectalinear_iteration_pattern_398799212.h deleted file mode 100644 index edd9ab105..000000000 --- a/generated/rectalinear_iteration_pattern_398799212.h +++ /dev/null @@ -1,51 +0,0 @@ -// src/engine/world_update.cpp:528:0 - -DimIterator(x, y, z, UpdateDim) -{ - b32 OverwriteVoxel = False; - - v3i VoxP = V3i(x,y,z); - v3i SimVoxP = VoxP + SimSpaceUpdateBounds.Min; - voxel *V = CopiedChunk->Voxels + GetIndex(VoxP, UpdateDim); - - if (Contains(SSRect, SimVoxP)) - { - - - v3i CenterToVoxP = SimVoxP - EditCenterP; - NotImplemented; - /* if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&Voxel_Filled) == False) */ - { - b32 IsUnfilledBorder = False; - poof_check_for_unfilled_border(); - /* Assert(NewVoxelValue->Flags & Voxel_Filled); */ - if (IsUnfilledBorder) - { - OverwriteVoxel = True; - } - } - - - if ( ((OverwriteVoxel == True ) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True )) ) - { - /* if (Mode == WorldEdit_Mode_Paint) */ - /* { */ - /* V->Color = NewVoxelValue->Color; */ - /* } */ - /* else */ - { - if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } - else { *V = *NewVoxelValue; } - } - - // Knock out face flags so the 'surface' algorithm doesn't "self-apply" - // We recompute these, so it's fine there. It's slower on non-surface - // paths, but .. when that's the bottleneck, we've won. - NotImplemented; - /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ - } - } -} - - diff --git a/generated/rectalinear_iteration_pattern_416827956.h b/generated/rectalinear_iteration_pattern_416827956.h deleted file mode 100644 index 59073c234..000000000 --- a/generated/rectalinear_iteration_pattern_416827956.h +++ /dev/null @@ -1,39 +0,0 @@ -// src/engine/world_update.cpp:715:0 - -DimIterator(x, y, z, UpdateDim) -{ - b32 OverwriteVoxel = False; - - v3i VoxP = V3i(x,y,z); - v3i SimVoxP = VoxP + SimSpaceUpdateBounds.Min; - voxel *V = CopiedChunk->Voxels + GetIndex(VoxP, UpdateDim); - - if (Contains(SSRect, SimVoxP)) - { - - OverwriteVoxel = True; - - - if ( ((OverwriteVoxel == True ) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True )) ) - { - /* if (Mode == WorldEdit_Mode_Paint) */ - /* { */ - /* V->Color = NewVoxelValue->Color; */ - /* } */ - /* else */ - { - if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } - else { *V = *NewVoxelValue; } - } - - // Knock out face flags so the 'surface' algorithm doesn't "self-apply" - // We recompute these, so it's fine there. It's slower on non-surface - // paths, but .. when that's the bottleneck, we've won. - NotImplemented; - /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ - } - } -} - - diff --git a/generated/rectalinear_iteration_pattern_428632106.h b/generated/rectalinear_iteration_pattern_428632106.h deleted file mode 100644 index bc0fd9dec..000000000 --- a/generated/rectalinear_iteration_pattern_428632106.h +++ /dev/null @@ -1,47 +0,0 @@ -// src/engine/world_update.cpp:874:0 - -DimIterator(x, y, z, UpdateDim) -{ - b32 OverwriteVoxel = False; - - v3i VoxP = V3i(x,y,z); - v3i SimVoxP = VoxP + SimSpaceUpdateBounds.Min; - voxel *V = CopiedChunk->Voxels + GetIndex(VoxP, UpdateDim); - - if (Contains(SSRect, SimVoxP)) - { - - v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; - voxel *AssetV = TryGetVoxel(Data, OriginToCurrentVoxP); - voxel *NewVoxelValue = &InvertV; - NotImplemented; - /* if ( (AssetV && (AssetV->Flags&Voxel_Filled)) || Params->PersistWhitespace ) */ - { - NewVoxelValue = AssetV; - OverwriteVoxel = True; - } - - - if ( ((OverwriteVoxel == True ) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True )) ) - { - /* if (Mode == WorldEdit_Mode_Paint) */ - /* { */ - /* V->Color = NewVoxelValue->Color; */ - /* } */ - /* else */ - { - if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } - else { *V = *NewVoxelValue; } - } - - // Knock out face flags so the 'surface' algorithm doesn't "self-apply" - // We recompute these, so it's fine there. It's slower on non-surface - // paths, but .. when that's the bottleneck, we've won. - NotImplemented; - /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ - } - } -} - - diff --git a/generated/rectalinear_iteration_pattern_530902269.h b/generated/rectalinear_iteration_pattern_530902269.h deleted file mode 100644 index d75d10eb4..000000000 --- a/generated/rectalinear_iteration_pattern_530902269.h +++ /dev/null @@ -1,43 +0,0 @@ -// src/engine/world_update.cpp:654:0 - -DimIterator(x, y, z, UpdateDim) -{ - b32 OverwriteVoxel = False; - - v3i VoxP = V3i(x,y,z); - v3i SimVoxP = VoxP + SimSpaceUpdateBounds.Min; - voxel *V = CopiedChunk->Voxels + GetIndex(VoxP, UpdateDim); - - if (Contains(SSRect, SimVoxP)) - { - - NotImplemented; - /* if ( (V->Flags&VoxelFaceMask)) */ - { - OverwriteVoxel = True; - } - - - if ( ((OverwriteVoxel == True ) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True )) ) - { - /* if (Mode == WorldEdit_Mode_Paint) */ - /* { */ - /* V->Color = NewVoxelValue->Color; */ - /* } */ - /* else */ - { - if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } - else { *V = *NewVoxelValue; } - } - - // Knock out face flags so the 'surface' algorithm doesn't "self-apply" - // We recompute these, so it's fine there. It's slower on non-surface - // paths, but .. when that's the bottleneck, we've won. - NotImplemented; - /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ - } - } -} - - diff --git a/generated/rectalinear_iteration_pattern_583358156.h b/generated/rectalinear_iteration_pattern_583358156.h deleted file mode 100644 index 715de6f42..000000000 --- a/generated/rectalinear_iteration_pattern_583358156.h +++ /dev/null @@ -1,42 +0,0 @@ -// src/engine/world_update.cpp:843:0 - -DimIterator(x, y, z, UpdateDim) -{ - b32 OverwriteVoxel = False; - - v3i VoxP = V3i(x,y,z); - v3i SimVoxP = VoxP + SimSpaceUpdateBounds.Min; - voxel *V = CopiedChunk->Voxels + GetIndex(VoxP, UpdateDim); - - if (Contains(SSRect, SimVoxP)) - { - - v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; - voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - NotImplemented; - /* if (NewVoxelValue && (NewVoxelValue->Flags&Voxel_Filled)) { V->Color = NewVoxelValue->Color; } */ - - - if ( ((OverwriteVoxel == True ) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True )) ) - { - if (Mode == WorldEdit_Mode_Paint) - { - V->Color = NewVoxelValue->Color; - } - else - { - if (Mode == WorldEdit_Mode_Remove) { *V = {}; } - else { *V = *NewVoxelValue; } - } - - // Knock out face flags so the 'surface' algorithm doesn't "self-apply" - // We recompute these, so it's fine there. It's slower on non-surface - // paths, but .. when that's the bottleneck, we've won. - NotImplemented; - /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ - } - } -} - - diff --git a/generated/rectalinear_iteration_pattern_631222419.h b/generated/rectalinear_iteration_pattern_631222419.h deleted file mode 100644 index a73488034..000000000 --- a/generated/rectalinear_iteration_pattern_631222419.h +++ /dev/null @@ -1,52 +0,0 @@ -// src/engine/world_update.cpp:757:0 - -DimIterator(x, y, z, UpdateDim) -{ - b32 OverwriteVoxel = False; - - v3i VoxP = V3i(x,y,z); - v3i SimVoxP = VoxP + SimSpaceUpdateBounds.Min; - voxel *V = CopiedChunk->Voxels + GetIndex(VoxP, UpdateDim); - - if (Contains(SSRect, SimVoxP)) - { - - - v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; - voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - - NotImplemented; - /* if ((V->Flags&Voxel_Filled)==False) */ - { - b32 IsUnfilledBorder = False; - poof_check_for_unfilled_border(); - if (IsUnfilledBorder) - { - OverwriteVoxel = True; - } - } - - - if ( ((OverwriteVoxel == True ) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True )) ) - { - /* if (Mode == WorldEdit_Mode_Paint) */ - /* { */ - /* V->Color = NewVoxelValue->Color; */ - /* } */ - /* else */ - { - if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } - else { *V = *NewVoxelValue; } - } - - // Knock out face flags so the 'surface' algorithm doesn't "self-apply" - // We recompute these, so it's fine there. It's slower on non-surface - // paths, but .. when that's the bottleneck, we've won. - NotImplemented; - /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ - } - } -} - - diff --git a/generated/rectalinear_iteration_pattern_643608995.h b/generated/rectalinear_iteration_pattern_643608995.h deleted file mode 100644 index f5c9fa5b4..000000000 --- a/generated/rectalinear_iteration_pattern_643608995.h +++ /dev/null @@ -1,51 +0,0 @@ -// src/engine/world_update.cpp:633:0 - -DimIterator(x, y, z, UpdateDim) -{ - b32 OverwriteVoxel = False; - - v3i VoxP = V3i(x,y,z); - v3i SimVoxP = VoxP + SimSpaceUpdateBounds.Min; - voxel *V = CopiedChunk->Voxels + GetIndex(VoxP, UpdateDim); - - if (Contains(SSRect, SimVoxP)) - { - - - NotImplemented; - /* if ((V->Flags&Voxel_Filled) == False) */ - { - b32 IsUnfilledBorder = False; - poof_check_for_unfilled_border(); - NotImplemented; - /* Assert(NewVoxelValue->Flags & Voxel_Filled); */ - if (IsUnfilledBorder) - { - OverwriteVoxel = True; - } - } - - - if ( ((OverwriteVoxel == True ) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True )) ) - { - /* if (Mode == WorldEdit_Mode_Paint) */ - /* { */ - /* V->Color = NewVoxelValue->Color; */ - /* } */ - /* else */ - { - if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } - else { *V = *NewVoxelValue; } - } - - // Knock out face flags so the 'surface' algorithm doesn't "self-apply" - // We recompute these, so it's fine there. It's slower on non-surface - // paths, but .. when that's the bottleneck, we've won. - NotImplemented; - /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ - } - } -} - - diff --git a/generated/rectalinear_iteration_pattern_920026661.h b/generated/rectalinear_iteration_pattern_920026661.h deleted file mode 100644 index 58e7fa1cb..000000000 --- a/generated/rectalinear_iteration_pattern_920026661.h +++ /dev/null @@ -1,44 +0,0 @@ -// src/engine/world_update.cpp:549:0 - -DimIterator(x, y, z, UpdateDim) -{ - b32 OverwriteVoxel = False; - - v3i VoxP = V3i(x,y,z); - v3i SimVoxP = VoxP + SimSpaceUpdateBounds.Min; - voxel *V = CopiedChunk->Voxels + GetIndex(VoxP, UpdateDim); - - if (Contains(SSRect, SimVoxP)) - { - - v3i CenterToVoxP = SimVoxP - EditCenterP; - NotImplemented; - /* if (LengthSq(CenterToVoxP) < RadiusSquared && (V->Flags&VoxelFaceMask)) */ - { - OverwriteVoxel = True; - } - - - if ( ((OverwriteVoxel == True ) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True )) ) - { - /* if (Mode == WorldEdit_Mode_Paint) */ - /* { */ - /* V->Color = NewVoxelValue->Color; */ - /* } */ - /* else */ - { - if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } - else { *V = *NewVoxelValue; } - } - - // Knock out face flags so the 'surface' algorithm doesn't "self-apply" - // We recompute these, so it's fine there. It's slower on non-surface - // paths, but .. when that's the bottleneck, we've won. - NotImplemented; - /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ - } - } -} - - diff --git a/generated/rectalinear_iteration_pattern_992879728.h b/generated/rectalinear_iteration_pattern_992879728.h deleted file mode 100644 index c94ee455e..000000000 --- a/generated/rectalinear_iteration_pattern_992879728.h +++ /dev/null @@ -1,48 +0,0 @@ -// src/engine/world_update.cpp:779:0 - -DimIterator(x, y, z, UpdateDim) -{ - b32 OverwriteVoxel = False; - - v3i VoxP = V3i(x,y,z); - v3i SimVoxP = VoxP + SimSpaceUpdateBounds.Min; - voxel *V = CopiedChunk->Voxels + GetIndex(VoxP, UpdateDim); - - if (Contains(SSRect, SimVoxP)) - { - - v3i OriginToCurrentVoxP = SimVoxP - SimOrigin; - voxel *NewVoxelValue = TryGetVoxel(Data, OriginToCurrentVoxP); - if (NewVoxelValue) - { - NotImplemented; - /* if ( (V->Flags&VoxelFaceMask) && (NewVoxelValue->Flags&Voxel_Filled) ) */ - { - OverwriteVoxel = True; - } - } - - - if ( ((OverwriteVoxel == True ) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True )) ) - { - /* if (Mode == WorldEdit_Mode_Paint) */ - /* { */ - /* V->Color = NewVoxelValue->Color; */ - /* } */ - /* else */ - { - if (Mode == WorldEdit_Mode_Subtractive) { *V = {}; } - else { *V = *NewVoxelValue; } - } - - // Knock out face flags so the 'surface' algorithm doesn't "self-apply" - // We recompute these, so it's fine there. It's slower on non-surface - // paths, but .. when that's the bottleneck, we've won. - NotImplemented; - /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ - } - } -} - - diff --git a/generated/rectalinear_iteration_pattern_99934950.h b/generated/rectalinear_iteration_pattern_99934950.h deleted file mode 100644 index 27229a18a..000000000 --- a/generated/rectalinear_iteration_pattern_99934950.h +++ /dev/null @@ -1,43 +0,0 @@ -// src/engine/world_update.cpp:719:0 - -DimIterator(x, y, z, UpdateDim) -{ - b32 OverwriteVoxel = False; - - v3i VoxP = V3i(x,y,z); - v3i SimVoxP = VoxP + SimSpaceUpdateBounds.Min; - voxel *V = CopiedChunk->Voxels + GetIndex(VoxP, UpdateDim); - - if (Contains(SSRect, SimVoxP)) - { - - NotImplemented; - /* if (V->Flags & Voxel_Filled) */ - { - OverwriteVoxel = True; - } - - - if ( ((OverwriteVoxel == True ) && (Invert == False)) || - ((OverwriteVoxel == False) && (Invert == True )) ) - { - if (Mode == WorldEdit_Mode_Paint) - { - V->Color = NewVoxelValue->Color; - } - else - { - if (Mode == WorldEdit_Mode_Remove) { *V = {}; } - else { *V = *NewVoxelValue; } - } - - // Knock out face flags so the 'surface' algorithm doesn't "self-apply" - // We recompute these, so it's fine there. It's slower on non-surface - // paths, but .. when that's the bottleneck, we've won. - NotImplemented; - /* V->Flags = voxel_flag(V->Flags&~VoxelFaceMask); */ - } - } -} - - diff --git a/generated/serdes_dunion_struct.h b/generated/serdes_dunion_struct.h deleted file mode 100644 index 325bf0048..000000000 --- a/generated/serdes_dunion_struct.h +++ /dev/null @@ -1,3 +0,0 @@ -// src/engine/serdes.cpp:569:0 - - diff --git a/generated/serdes_struct_entity_game_data.h b/generated/serdes_struct_entity_game_data.h deleted file mode 100644 index b1315ee50..000000000 --- a/generated/serdes_struct_entity_game_data.h +++ /dev/null @@ -1,127 +0,0 @@ -// examples/turn_based/game.cpp:1137:0 - -link_internal bonsai_type_info -TypeInfo(entity_game_data *Ignored) -{ - bonsai_type_info Result = {}; - - Result.Name = CSz("entity_game_data"); - Result.Version = 0 ; - - /* type.map(member) */ - /* { */ - /* { */ - /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ - /* Push(&Result.Members, &Member); */ - /* } */ - /* } */ - - return Result; -} - -link_internal b32 -Serialize(u8_cursor_block_array *Bytes, entity_game_data *BaseElement, umm Count = 1) -{ - Assert(Count > 0); - - u64 PointerTrue = True; - u64 PointerFalse = False; - - b32 Result = True; - - - - RangeIterator_t(umm, ElementIndex, Count) - { - entity_game_data *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->FireballChargeLevel); - - - - - - Result &= Serialize(Bytes, &Element->FireballCharges); - - - - - - Result &= Serialize(Bytes, &Element->IceBlockCharges); - - - - - - Result &= Serialize(Bytes, &Element->HoldingItem); - - - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); - } - - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, entity_game_data *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, entity_game_data *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, entity_game_data *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->FireballChargeLevel, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->FireballCharges, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->IceBlockCharges, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->HoldingItem, Memory); - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, entity_game_data *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - - diff --git a/generated/serdes_struct_layered_brush_0.h b/generated/serdes_struct_layered_brush_0.h deleted file mode 100644 index edbfdc8f1..000000000 --- a/generated/serdes_struct_layered_brush_0.h +++ /dev/null @@ -1,120 +0,0 @@ -// src/engine/serdes.cpp:569:0 - -link_internal bonsai_type_info -TypeInfo(layered_brush_0 *Ignored) -{ - bonsai_type_info Result = {}; - - Result.Name = CSz("layered_brush_0"); - Result.Version = 0 ; - - /* type.map(member) */ - /* { */ - /* { */ - /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ - /* Push(&Result.Members, &Member); */ - /* } */ - /* } */ - - return Result; -} - -link_internal b32 -Serialize(u8_cursor_block_array *Bytes, layered_brush_0 *BaseElement, umm Count = 1) -{ - Assert(Count > 0); - - u64 PointerTrue = True; - u64 PointerFalse = False; - - b32 Result = True; - - - - RangeIterator_t(umm, ElementIndex, Count) - { - layered_brush_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->LayerCount); // default - - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm ThisCount = umm(Element->LayerCount); - - Result &= Serialize(Bytes, Element->Layers, ThisCount); - } - - - - - - - - - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); - } - - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_0 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_0 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_0 *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->LayerCount, Memory); - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm Count = umm(Element->LayerCount); - - Result &= Deserialize(Bytes, Element->Layers, Memory, Count); - } - - - - - - - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_0 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - - diff --git a/generated/serdes_struct_layered_brush_1.h b/generated/serdes_struct_layered_brush_1.h deleted file mode 100644 index 05d6b5292..000000000 --- a/generated/serdes_struct_layered_brush_1.h +++ /dev/null @@ -1,170 +0,0 @@ -// src/engine/serdes.cpp:571:0 - -link_internal bonsai_type_info -TypeInfo(layered_brush_1 *Ignored) -{ - bonsai_type_info Result = {}; - - Result.Name = CSz("layered_brush_1"); - Result.Version = 0 ; - - /* type.map(member) */ - /* { */ - /* { */ - /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ - /* Push(&Result.Members, &Member); */ - /* } */ - /* } */ - - return Result; -} - -link_internal b32 -Serialize(u8_cursor_block_array *Bytes, layered_brush_1 *BaseElement, umm Count = 1) -{ - Assert(Count > 0); - - u64 PointerTrue = True; - u64 PointerFalse = False; - - b32 Result = True; - - - - RangeIterator_t(umm, ElementIndex, Count) - { - layered_brush_1 *Element = BaseElement + ElementIndex; - { - umm ThisCount = NameBuf_Len; - - Result &= Serialize(Bytes, Element->NameBuf, ThisCount); - } - - - - - - Result &= Serialize(Bytes, &Element->LayerCount); // default - - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm ThisCount = umm(Element->LayerCount); - - Result &= Serialize(Bytes, Element->Layers, ThisCount); - } - - - - - - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default - - - - - - - Result &= Serialize(Bytes, &Element->BrushFollowsCursor); // default - - - - - - - - - - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); - } - - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_1 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_1 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_1 *Element, memory_arena *Memory) -{ - b32 Result = True; - { - umm Count = NameBuf_Len; - - Result &= Deserialize(Bytes, Element->NameBuf, Memory, Count); - } - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->LayerCount, Memory); - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm Count = umm(Element->LayerCount); - - Result &= Deserialize(Bytes, Element->Layers, Memory, Count); - } - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->BrushFollowsCursor, Memory); - - - - - - - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_1 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - - diff --git a/generated/serdes_struct_layered_brush_2.h b/generated/serdes_struct_layered_brush_2.h deleted file mode 100644 index cdd9facb6..000000000 --- a/generated/serdes_struct_layered_brush_2.h +++ /dev/null @@ -1,150 +0,0 @@ -// src/engine/serdes.cpp:573:0 - -link_internal bonsai_type_info -TypeInfo(layered_brush_2 *Ignored) -{ - bonsai_type_info Result = {}; - - Result.Name = CSz("layered_brush_2"); - Result.Version = 0 ; - - /* type.map(member) */ - /* { */ - /* { */ - /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ - /* Push(&Result.Members, &Member); */ - /* } */ - /* } */ - - return Result; -} - -link_internal b32 -Serialize(u8_cursor_block_array *Bytes, layered_brush_2 *BaseElement, umm Count = 1) -{ - Assert(Count > 0); - - u64 PointerTrue = True; - u64 PointerFalse = False; - - b32 Result = True; - - - - RangeIterator_t(umm, ElementIndex, Count) - { - layered_brush_2 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->LayerCount); // default - - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm ThisCount = umm(Element->LayerCount); - - Result &= Serialize(Bytes, Element->Layers, ThisCount); - } - - - - - - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default - - - - - - - Result &= Serialize(Bytes, &Element->BrushFollowsCursor); // default - - - - - - - - - - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); - } - - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_2 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_2 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_2 *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->LayerCount, Memory); - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm Count = umm(Element->LayerCount); - - Result &= Deserialize(Bytes, Element->Layers, Memory, Count); - } - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->BrushFollowsCursor, Memory); - - - - - - - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_2 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - - diff --git a/generated/serdes_struct_layered_brush_editor.h b/generated/serdes_struct_layered_brush_editor.h deleted file mode 100644 index f24241fbc..000000000 --- a/generated/serdes_struct_layered_brush_editor.h +++ /dev/null @@ -1,219 +0,0 @@ -// src/engine/serdes.cpp:572:0 - -link_internal bonsai_type_info -TypeInfo(layered_brush_editor *Ignored) -{ - bonsai_type_info Result = {}; - - Result.Name = CSz("layered_brush_editor"); - Result.Version =3 ; - - /* type.map(member) */ - /* { */ - /* { */ - /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ - /* Push(&Result.Members, &Member); */ - /* } */ - /* } */ - - return Result; -} - -link_internal b32 -Serialize(u8_cursor_block_array *Bytes, layered_brush_editor *BaseElement, umm Count = 1) -{ - Assert(Count > 0); - - u64 PointerTrue = True; - u64 PointerFalse = False; - - b32 Result = True; - - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber =3; - Serialize(Bytes, &VersionNumber); - - - RangeIterator_t(umm, ElementIndex, Count) - { - layered_brush_editor *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->LayerCount); - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm ThisCount = umm(Element->LayerCount); - - Result &= Serialize(Bytes, Element->Layers, ThisCount); - } - - - - - - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); - - - - - - Result &= Serialize(Bytes, &Element->BrushFollowsCursor); - - - - - - Result &= Serialize(Bytes, (u32*)&Element->Mode); - - - - - Result &= Serialize(Bytes, (u32*)&Element->Modifier); - - - - - - - - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); - } - - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_editor *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_editor *Element, memory_arena *Memory); - - -link_internal b32 -DeserializeVersioned(u8_cursor *Bytes, layered_brush_editor *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) -{ - Assert(TypeInfo->Version <=3); - - b32 Result = True; - - if (TypeInfo->Version == 0) - { - layered_brush_editor_0 T0 = {}; - Result &= Deserialize(Bytes, &T0, Memory); - Marshal(&T0, Element); - } - if (TypeInfo->Version == 1) - { - layered_brush_editor_1 T1 = {}; - Result &= Deserialize(Bytes, &T1, Memory); - Marshal(&T1, Element); - } - if (TypeInfo->Version == 2) - { - layered_brush_editor_2 T2 = {}; - Result &= Deserialize(Bytes, &T2, Memory); - Marshal(&T2, Element); - } - - - if (TypeInfo->Version ==3) - { - Result &= DeserializeCurrentVersion(Bytes, Element, Memory); - } - - return Result; -} - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_editor *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->LayerCount, Memory); - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm Count = umm(Element->LayerCount); - - Result &= Deserialize(Bytes, Element->Layers, Memory, Count); - } - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->BrushFollowsCursor, Memory); - - - - - - Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); - - - - - Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); - - - - - - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_editor *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("layered_brush_editor")); - - if (MaybeSerializedType.Tag) - { - u64 OldIgnoredVersionNumber; - if (MaybeSerializedType.Value.Version > 0) - { - Deserialize(Bytes, &OldIgnoredVersionNumber, Memory); - } - Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &MaybeSerializedType.Value, Memory); - } - else - { - bonsai_type_info T0TypeInfo = {}; - Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &T0TypeInfo, Memory); - } - - } - - return Result; -} - - diff --git a/generated/serdes_struct_layered_brush_editor_0.h b/generated/serdes_struct_layered_brush_editor_0.h deleted file mode 100644 index 68a0a49e3..000000000 --- a/generated/serdes_struct_layered_brush_editor_0.h +++ /dev/null @@ -1,119 +0,0 @@ -// src/engine/serdes.cpp:566:0 - -link_internal bonsai_type_info -TypeInfo(layered_brush_editor_0 *Ignored) -{ - bonsai_type_info Result = {}; - - Result.Name = CSz("layered_brush_editor_0"); - Result.Version = 0 ; - - /* type.map(member) */ - /* { */ - /* { */ - /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ - /* Push(&Result.Members, &Member); */ - /* } */ - /* } */ - - return Result; -} - -link_internal b32 -Serialize(u8_cursor_block_array *Bytes, layered_brush_editor_0 *BaseElement, umm Count = 1) -{ - Assert(Count > 0); - - u64 PointerTrue = True; - u64 PointerFalse = False; - - b32 Result = True; - - - - RangeIterator_t(umm, ElementIndex, Count) - { - layered_brush_editor_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->LayerCount); - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm ThisCount = umm(Element->LayerCount); - - Result &= Serialize(Bytes, Element->Layers, ThisCount); - } - - - - - - - - - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); - } - - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_editor_0 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_editor_0 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_editor_0 *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->LayerCount, Memory); - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm Count = umm(Element->LayerCount); - - Result &= Deserialize(Bytes, Element->Layers, Memory, Count); - } - - - - - - - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_editor_0 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - - diff --git a/generated/serdes_struct_layered_brush_editor_1.h b/generated/serdes_struct_layered_brush_editor_1.h deleted file mode 100644 index 22ccdc3ee..000000000 --- a/generated/serdes_struct_layered_brush_editor_1.h +++ /dev/null @@ -1,167 +0,0 @@ -// src/engine/serdes.cpp:568:0 - -link_internal bonsai_type_info -TypeInfo(layered_brush_editor_1 *Ignored) -{ - bonsai_type_info Result = {}; - - Result.Name = CSz("layered_brush_editor_1"); - Result.Version = 0 ; - - /* type.map(member) */ - /* { */ - /* { */ - /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ - /* Push(&Result.Members, &Member); */ - /* } */ - /* } */ - - return Result; -} - -link_internal b32 -Serialize(u8_cursor_block_array *Bytes, layered_brush_editor_1 *BaseElement, umm Count = 1) -{ - Assert(Count > 0); - - u64 PointerTrue = True; - u64 PointerFalse = False; - - b32 Result = True; - - - - RangeIterator_t(umm, ElementIndex, Count) - { - layered_brush_editor_1 *Element = BaseElement + ElementIndex; - { - umm ThisCount = (256); - - Result &= Serialize(Bytes, Element->NameBuf, ThisCount); - } - - - - - - Result &= Serialize(Bytes, &Element->LayerCount); - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm ThisCount = umm(Element->LayerCount); - - Result &= Serialize(Bytes, Element->Layers, ThisCount); - } - - - - - - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); - - - - - - Result &= Serialize(Bytes, &Element->BrushFollowsCursor); - - - - - - - - - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); - } - - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_editor_1 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_editor_1 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_editor_1 *Element, memory_arena *Memory) -{ - b32 Result = True; - { - umm Count = (256); - - Result &= Deserialize(Bytes, Element->NameBuf, Memory, Count); - } - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->LayerCount, Memory); - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm Count = umm(Element->LayerCount); - - Result &= Deserialize(Bytes, Element->Layers, Memory, Count); - } - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->BrushFollowsCursor, Memory); - - - - - - - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_editor_1 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - - diff --git a/generated/serdes_struct_layered_brush_editor_2.h b/generated/serdes_struct_layered_brush_editor_2.h deleted file mode 100644 index a0184a0d5..000000000 --- a/generated/serdes_struct_layered_brush_editor_2.h +++ /dev/null @@ -1,147 +0,0 @@ -// src/engine/serdes.cpp:570:0 - -link_internal bonsai_type_info -TypeInfo(layered_brush_editor_2 *Ignored) -{ - bonsai_type_info Result = {}; - - Result.Name = CSz("layered_brush_editor_2"); - Result.Version = 0 ; - - /* type.map(member) */ - /* { */ - /* { */ - /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ - /* Push(&Result.Members, &Member); */ - /* } */ - /* } */ - - return Result; -} - -link_internal b32 -Serialize(u8_cursor_block_array *Bytes, layered_brush_editor_2 *BaseElement, umm Count = 1) -{ - Assert(Count > 0); - - u64 PointerTrue = True; - u64 PointerFalse = False; - - b32 Result = True; - - - - RangeIterator_t(umm, ElementIndex, Count) - { - layered_brush_editor_2 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->LayerCount); - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm ThisCount = umm(Element->LayerCount); - - Result &= Serialize(Bytes, Element->Layers, ThisCount); - } - - - - - - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); - - - - - - Result &= Serialize(Bytes, &Element->BrushFollowsCursor); - - - - - - - - - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); - } - - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_editor_2 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_editor_2 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush_editor_2 *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->LayerCount, Memory); - - - - - - { - // TODO(Jesse): Should this really be a safe cast? - umm Count = umm(Element->LayerCount); - - Result &= Deserialize(Bytes, Element->Layers, Memory, Count); - } - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->BrushFollowsCursor, Memory); - - - - - - - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, layered_brush_editor_2 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - - diff --git a/generated/serdes_struct_lighting_settings_0.h b/generated/serdes_struct_lighting_settings_0.h deleted file mode 100644 index 63bb1864d..000000000 --- a/generated/serdes_struct_lighting_settings_0.h +++ /dev/null @@ -1,250 +0,0 @@ -// src/engine/serdes.cpp:403:0 - -link_internal bonsai_type_info -TypeInfo(lighting_settings_0 *Ignored) -{ - bonsai_type_info Result = {}; - - Result.Name = CSz("lighting_settings_0"); - Result.Version = 0 ; - - /* type.map(member) */ - /* { */ - /* { */ - /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ - /* Push(&Result.Members, &Member); */ - /* } */ - /* } */ - - return Result; -} - -link_internal b32 -Serialize(u8_cursor_block_array *Bytes, lighting_settings_0 *BaseElement, umm Count = 1) -{ - Assert(Count > 0); - - u64 PointerTrue = True; - u64 PointerFalse = False; - - b32 Result = True; - - - - RangeIterator_t(umm, ElementIndex, Count) - { - lighting_settings_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->AutoDayNightCycle); // default - - - - - - - Result &= Serialize(Bytes, &Element->tDay); // default - - - - - - - Result &= Serialize(Bytes, &Element->SunP); // default - - - - - - - Result &= Serialize(Bytes, &Element->DawnColor); // default - - - - - - - Result &= Serialize(Bytes, &Element->SunColor); // default - - - - - - - Result &= Serialize(Bytes, &Element->DuskColor); // default - - - - - - - Result &= Serialize(Bytes, &Element->MoonColor); // default - - - - - - - Result &= Serialize(Bytes, &Element->SunIntensity); // default - - - - - - - Result &= Serialize(Bytes, &Element->MoonIntensity); // default - - - - - - - Result &= Serialize(Bytes, &Element->DawnIntensity); // default - - - - - - - Result &= Serialize(Bytes, &Element->DuskIntensity); // default - - - - - - - Result &= Serialize(Bytes, &Element->CurrentSunColor); // default - - - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); - } - - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, lighting_settings_0 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings_0 *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->AutoDayNightCycle, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->tDay, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->SunP, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->DawnColor, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->SunColor, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->DuskColor, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->MoonColor, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->SunIntensity, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->MoonIntensity, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->DawnIntensity, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->DuskIntensity, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->CurrentSunColor, Memory); - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, lighting_settings_0 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - - diff --git a/generated/serdes_struct_struct.h b/generated/serdes_struct_struct.h deleted file mode 100644 index f511ac2f7..000000000 --- a/generated/serdes_struct_struct.h +++ /dev/null @@ -1,100 +0,0 @@ -// src/engine/serdes.cpp:555:0 - -link_internal bonsai_type_info -TypeInfo(world_update_op_shape_params_chunk_data *Ignored) -{ - bonsai_type_info Result = {}; - - Result.Name = CSz("world_update_op_shape_params_chunk_data"); - Result.Version = 0 ; - - /* type.map(member) */ - /* { */ - /* { */ - /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ - /* Push(&Result.Members, &Member); */ - /* } */ - /* } */ - - return Result; -} - -link_internal b32 -Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_chunk_data *BaseElement, umm Count = 1) -{ - Assert(Count > 0); - - u64 PointerTrue = True; - u64 PointerFalse = False; - - b32 Result = True; - - - - RangeIterator_t(umm, ElementIndex, Count) - { - world_update_op_shape_params_chunk_data *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Data); // default - - - - - - - Result &= Serialize(Bytes, &Element->SimSpaceOrigin); // default - - - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); - } - - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, world_update_op_shape_params_chunk_data *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_chunk_data *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_chunk_data *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Data, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->SimSpaceOrigin, Memory); - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, world_update_op_shape_params_chunk_data *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - - diff --git a/generated/serdes_struct_world_edit_params.h b/generated/serdes_struct_world_edit_params.h deleted file mode 100644 index 731fbfb3f..000000000 --- a/generated/serdes_struct_world_edit_params.h +++ /dev/null @@ -1,105 +0,0 @@ -// src/engine/serdes.cpp:497:0 - -link_internal bonsai_type_info -TypeInfo(world_edit_params *Ignored) -{ - bonsai_type_info Result = {}; - - Result.Name = CSz("world_edit_params"); - Result.Version = 0 ; - - /* type.map(member) */ - /* { */ - /* { */ - /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ - /* Push(&Result.Members, &Member); */ - /* } */ - /* } */ - - return Result; -} - -link_internal b32 -Serialize(u8_cursor_block_array *Bytes, world_edit_params *BaseElement, umm Count = 1) -{ - Assert(Count > 0); - - u64 PointerTrue = True; - u64 PointerFalse = False; - - b32 Result = True; - - - - RangeIterator_t(umm, ElementIndex, Count) - { - world_edit_params *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Mode); - - - - - Result &= Serialize(Bytes, (u32*)&Element->Modifier); - - - - - Result &= Serialize(Bytes, &Element->Iterations); - - - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); - } - - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, world_edit_params *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_params *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_params *Element, memory_arena *Memory) -{ - b32 Result = True; - Element->Mode = Cast(world_edit_mode, Read_u32(Bytes)); - - - - - Element->Modifier = Cast(world_edit_mode_modifier, Read_u32(Bytes)); - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Iterations, Memory); - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, world_edit_params *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - - diff --git a/generated/serdes_struct_world_edit_shape.h b/generated/serdes_struct_world_edit_shape.h deleted file mode 100644 index e6d7e2a73..000000000 --- a/generated/serdes_struct_world_edit_shape.h +++ /dev/null @@ -1,4 +0,0 @@ -// src/engine/serdes.cpp:569:0 - -serialize_dunionworld_edit_shape - diff --git a/generated/serdes_world_edit_shape.h b/generated/serdes_world_edit_shape.h deleted file mode 100644 index 189c4af31..000000000 --- a/generated/serdes_world_edit_shape.h +++ /dev/null @@ -1,39 +0,0 @@ -// src/engine/serdes.cpp:438:0 - -link_internal b32 -Serialize(u8_cursor_block_array *Bytes, world_edit_shape *BaseElement, umm Count = 1) -{ - switch (BaseElement->Type) - { - case type_world_update_op_shape_params_sphere: - { - Serialize(Bytes, &BaseElement->world_update_op_shape_params_sphere); - } break; - case type_world_update_op_shape_params_rect: - { - Serialize(Bytes, &BaseElement->world_update_op_shape_params_rect); - } break; - case type_world_update_op_shape_params_asset: - { - Serialize(Bytes, &BaseElement->world_update_op_shape_params_asset); - } break; - case type_world_update_op_shape_params_chunk_data: - { - Serialize(Bytes, &BaseElement->world_update_op_shape_params_chunk_data); - } break; - - - - InvalidDefaultCase; - } - - return False; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, world_edit_shape *Element, memory_arena *Memory, umm Count = 1) -{ - NotImplemented; - return False; -} - diff --git a/generated/serialize_struct_render_settings_0.h b/generated/serialize_struct_render_settings_0.h deleted file mode 100644 index 995dbf42c..000000000 --- a/generated/serialize_struct_render_settings_0.h +++ /dev/null @@ -1,125 +0,0 @@ -// src/engine/serdes.cpp:440:0 - -link_internal b32 -Deserialize(u8_cursor *Bytes, render_settings_0 *Element, memory_arena *Memory, umm Count = 1); - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_arena *Memory); - - - - -link_internal b32 -DeserializeCurrentVersion(u8_cursor *Bytes, render_settings_0 *Element, memory_arena *Memory) -{ - b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->UseSsao, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->UseShadowMapping, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->UseLightingBloom, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->BravoilMyersOIT, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->BravoilMcGuireOIT, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->DrawMajorGrid, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->DrawMinorGrid, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->MajorGridDim, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Ignored, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Headless, Memory); - - - - - - Element->ToneMappingType = Cast(tone_mapping_type, Read_u32(Bytes)); - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Lighting, Memory); - - - - MAYBE_READ_DEBUG_OBJECT_DELIM(); - return Result; -} - -link_internal b32 -Deserialize(u8_cursor *Bytes, render_settings_0 *Element, memory_arena *Memory, umm Count) -{ - Assert(Count > 0); - - b32 Result = True; - RangeIterator_t(umm, ElementIndex, Count) - { - Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); - - } - - return Result; -} - diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index b356ce476..9ef00eff5 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -7,6 +7,7 @@ InitializeBloomDownsampleShader( bloom_downsample_shader *Struct , v2 *SrcRes Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; + Struct->SrcResolution = SrcResolution; SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SrcResolution, "SrcResolution"); diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index 58e720626..853b0b334 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -7,6 +7,7 @@ InitializeBloomUpsampleShader( bloom_upsample_shader *Struct , f32 *FilterRad Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; + Struct->FilterRadius = FilterRadius; SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FilterRadius, "FilterRadius"); diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index 0d4d9c398..84a3edd6c 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -7,6 +7,7 @@ InitializeShadowMapShader( shadow_map_shader *Struct , m4 MVP , m4 ModelM Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; + Struct->MVP = MVP; SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->MVP, "MVP"); diff --git a/generated/shader_magic_struct.h b/generated/shader_magic_struct.h deleted file mode 100644 index 5a855881e..000000000 --- a/generated/shader_magic_struct.h +++ /dev/null @@ -1,36 +0,0 @@ -// src/engine/graphics.h:53:0 - -link_internal void -InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct ) -{ - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/derivs.fragmentshader")); - - u32 UniformIndex = 0; - - - - if (UniformIndex != 3 ) - { - Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots!"); - } - - - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); -} - -link_internal void -UseShader( terrain_derivs_render_context *Struct ) -{ - GL.UseProgram(Struct->Program.ID); - - s32 TextureUnit = 0; - s32 UniformIndex = 0; - - - if (UniformIndex != 3 ) - { - Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots!"); - } -} - diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index 60f461306..9ee645bc7 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -7,6 +7,7 @@ InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Str Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; + Struct->DerivsTex = DerivsTex; SetShaderUniform(&Struct->Program, UniformIndex++, Struct->DerivsTex, "DerivsTex"); diff --git a/generated/shader_magic_struct_terrain_derivs_render_context.h b/generated/shader_magic_struct_terrain_derivs_render_context.h index 368819584..1a77a74af 100644 --- a/generated/shader_magic_struct_terrain_derivs_render_context.h +++ b/generated/shader_magic_struct_terrain_derivs_render_context.h @@ -7,6 +7,7 @@ InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct , Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; + Struct->Ignored = Ignored; SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index 176133576..b8bea5d7b 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -7,6 +7,7 @@ InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; + Struct->InputTex = InputTex; SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InputTex, "InputTex"); diff --git a/generated/shader_magic_struct_terrain_shader.h b/generated/shader_magic_struct_terrain_shader.h deleted file mode 100644 index 7d6164e96..000000000 --- a/generated/shader_magic_struct_terrain_shader.h +++ /dev/null @@ -1,53 +0,0 @@ -// src/engine/graphics.h:19:0 - -link_internal void -InitializeTerrainGenRenderContext( terrain_gen_render_context *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) -{ - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/default.fragmentshader")); - - u32 UniformIndex = 0; - - Struct->ChunkDim = ChunkDim; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkDim, "ChunkDim"); - ++UniformIndex; - - Struct->WorldspaceBasis = WorldspaceBasis; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->WorldspaceBasis, "WorldspaceBasis"); - ++UniformIndex; - - Struct->ChunkResolution = ChunkResolution; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); - ++UniformIndex; - - if (UniformIndex != 3 ) - { - Error("Shader (terrain_gen_render_context) had an incorrect number of uniform slots!"); - } - - - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); -} - -link_internal void -UseShader( terrain_gen_render_context *Struct ) -{ - GL.UseProgram(Struct->Program.ID); - - s32 TextureUnit = 0; - s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; - - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; - - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; - - if (UniformIndex != 3 ) - { - Error("Shader (terrain_gen_render_context) had an incorrect number of uniform slots!"); - } -} - diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index b9d3e9f18..32d3f637a 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -7,6 +7,7 @@ InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; + Struct->ChunkDim = ChunkDim; SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index c602c6eb6..f67a73242 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -7,6 +7,7 @@ InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *Chu Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; + Struct->ChunkDim = ChunkDim; SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkDim, "ChunkDim"); diff --git a/generated/shader_magic_terrain_shader.h b/generated/shader_magic_terrain_shader.h deleted file mode 100644 index 9691fe7d8..000000000 --- a/generated/shader_magic_terrain_shader.h +++ /dev/null @@ -1,53 +0,0 @@ -// src/engine/graphics.h:17:0 - -link_internal void -InitializeTerrainShader( terrain_shader *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) -{ - Struct->Program = LoadShaders(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/default.fragmentshader")); - - u32 UniformIndex = 0; - - Struct->ChunkDim = ChunkDim; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkDim, "ChunkDim"); - ++UniformIndex; - - Struct->WorldspaceBasis = WorldspaceBasis; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->WorldspaceBasis, "WorldspaceBasis"); - ++UniformIndex; - - Struct->ChunkResolution = ChunkResolution; - Struct->Uniforms[UniformIndex] = ShaderUniform(&Struct->Program, &Struct->ChunkResolution, "ChunkResolution"); - ++UniformIndex; - - if (UniformIndex != ) - { - Error("Shader (terrain_shader) had an incorrect number of uniform slots!"); - } - - - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); -} - -link_internal void -UseShader( terrain_shader *Struct ) -{ - GL.UseProgram(Struct->Program.ID); - - s32 TextureUnit = 0; - s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; - - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; - - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; - - if (UniformIndex != ) - { - Error("Shader (terrain_shader) had an incorrect number of uniform slots!"); - } -} - diff --git a/generated/staticbuffer_octree_node_688856411_975905964.h b/generated/staticbuffer_octree_node_688856411_975905964.h deleted file mode 100644 index 88e9b45ae..000000000 --- a/generated/staticbuffer_octree_node_688856411_975905964.h +++ /dev/null @@ -1,41 +0,0 @@ -// src/engine/world.cpp:467:0 - -struct octree_node_static_buffer -{ - octree_node Start[8]; -}; - -link_inline octree_node* -GetPtr( octree_node_static_buffer *Buf, umm Index) -{ - octree_node *Result = {}; - if ( Index < umm(8) ) - { - Result = Buf->Start+Index; - } - return Result; -} - -link_inline octree_node -Get( octree_node_static_buffer *Buf, umm Index) -{ - Assert(Index >= 0); - Assert(Index < umm(8)); - octree_node Result = Buf->Start[Index]; - return Result; -} - -link_internal umm -AtElements( octree_node_static_buffer *Buf) -{ - return 8; -} - -link_internal umm -TotalElements( octree_node_static_buffer *Buf) -{ - return 8; -} - - - diff --git a/generated/string_and_value_tables_world_edit_mode.h b/generated/string_and_value_tables_world_edit_mode.h deleted file mode 100644 index 1d7d7cd37..000000000 --- a/generated/string_and_value_tables_world_edit_mode.h +++ /dev/null @@ -1,50 +0,0 @@ -// src/engine/editor.h:705:0 - -link_internal counted_string -ToStringPrefixless(world_edit_mode Type) -{ - counted_string Result = {}; - switch (Type) - { - case WorldEdit_Mode_Attach: { Result = CSz("Attach"); } break; - case WorldEdit_Mode_Remove: { Result = CSz("Remove"); } break; - case WorldEdit_Mode_Paint: { Result = CSz("Paint"); } break; - case WorldEdit_Mode_Disabled: { Result = CSz("Disabled"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - -link_internal counted_string -ToString(world_edit_mode Type) -{ - counted_string Result = {}; - switch (Type) - { - case WorldEdit_Mode_Attach: { Result = CSz("WorldEdit_Mode_Attach"); } break; - case WorldEdit_Mode_Remove: { Result = CSz("WorldEdit_Mode_Remove"); } break; - case WorldEdit_Mode_Paint: { Result = CSz("WorldEdit_Mode_Paint"); } break; - case WorldEdit_Mode_Disabled: { Result = CSz("WorldEdit_Mode_Disabled"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - -link_internal world_edit_mode -WorldEditMode(counted_string S) -{ - world_edit_mode Result = {}; - - if (StringsMatch(S, CSz("WorldEdit_Mode_Attach"))) { return WorldEdit_Mode_Attach; } - if (StringsMatch(S, CSz("WorldEdit_Mode_Remove"))) { return WorldEdit_Mode_Remove; } - if (StringsMatch(S, CSz("WorldEdit_Mode_Paint"))) { return WorldEdit_Mode_Paint; } - if (StringsMatch(S, CSz("WorldEdit_Mode_Disabled"))) { return WorldEdit_Mode_Disabled; } - - return Result; -} - - diff --git a/generated/string_and_value_tables_world_edit_mode_modifier.h b/generated/string_and_value_tables_world_edit_mode_modifier.h deleted file mode 100644 index aae2b13b4..000000000 --- a/generated/string_and_value_tables_world_edit_mode_modifier.h +++ /dev/null @@ -1,47 +0,0 @@ -// src/engine/editor.h:692:0 - -link_internal counted_string -ToStringPrefixless(world_edit_mode_modifier Type) -{ - counted_string Result = {}; - switch (Type) - { - case WorldEdit_Modifier_Default: { Result = CSz("Default"); } break; - case WorldEdit_Modifier_Flood: { Result = CSz("Flood"); } break; - case WorldEdit_Modifier_Surface: { Result = CSz("Surface"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - -link_internal counted_string -ToString(world_edit_mode_modifier Type) -{ - counted_string Result = {}; - switch (Type) - { - case WorldEdit_Modifier_Default: { Result = CSz("WorldEdit_Modifier_Default"); } break; - case WorldEdit_Modifier_Flood: { Result = CSz("WorldEdit_Modifier_Flood"); } break; - case WorldEdit_Modifier_Surface: { Result = CSz("WorldEdit_Modifier_Surface"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - -link_internal world_edit_mode_modifier -WorldEditModeModifier(counted_string S) -{ - world_edit_mode_modifier Result = {}; - - if (StringsMatch(S, CSz("WorldEdit_Modifier_Default"))) { return WorldEdit_Modifier_Default; } - if (StringsMatch(S, CSz("WorldEdit_Modifier_Flood"))) { return WorldEdit_Modifier_Flood; } - if (StringsMatch(S, CSz("WorldEdit_Modifier_Surface"))) { return WorldEdit_Modifier_Surface; } - - return Result; -} - - diff --git a/generated/string_and_value_tables_world_update_op_shape_type.h b/generated/string_and_value_tables_world_update_op_shape_type.h deleted file mode 100644 index 6ca006786..000000000 --- a/generated/string_and_value_tables_world_update_op_shape_type.h +++ /dev/null @@ -1,59 +0,0 @@ -// src/engine/editor.h:764:0 - -link_internal counted_string -ToStringPrefixless(world_update_op_shape_type Type) -{ - counted_string Result = {}; - switch (Type) - { - case type_world_update_op_shape_params_noop: { Result = CSz("noop"); } break; - case type_world_update_op_shape_params_sphere: { Result = CSz("sphere"); } break; - case type_world_update_op_shape_params_rect: { Result = CSz("rect"); } break; - case type_world_update_op_shape_params_cylinder: { Result = CSz("cylinder"); } break; - case type_world_update_op_shape_params_asset: { Result = CSz("asset"); } break; - case type_world_update_op_shape_params_chunk_data: { Result = CSz("data"); } break; - case type_world_update_op_shape_params_count: { Result = CSz("count"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - -link_internal counted_string -ToString(world_update_op_shape_type Type) -{ - counted_string Result = {}; - switch (Type) - { - case type_world_update_op_shape_params_noop: { Result = CSz("type_world_update_op_shape_params_noop"); } break; - case type_world_update_op_shape_params_sphere: { Result = CSz("type_world_update_op_shape_params_sphere"); } break; - case type_world_update_op_shape_params_rect: { Result = CSz("type_world_update_op_shape_params_rect"); } break; - case type_world_update_op_shape_params_cylinder: { Result = CSz("type_world_update_op_shape_params_cylinder"); } break; - case type_world_update_op_shape_params_asset: { Result = CSz("type_world_update_op_shape_params_asset"); } break; - case type_world_update_op_shape_params_chunk_data: { Result = CSz("type_world_update_op_shape_params_chunk_data"); } break; - case type_world_update_op_shape_params_count: { Result = CSz("type_world_update_op_shape_params_count"); } break; - - - } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ - return Result; -} - -link_internal world_update_op_shape_type -WorldUpdateOpShapeType(counted_string S) -{ - world_update_op_shape_type Result = {}; - - if (StringsMatch(S, CSz("type_world_update_op_shape_params_noop"))) { return type_world_update_op_shape_params_noop; } - if (StringsMatch(S, CSz("type_world_update_op_shape_params_sphere"))) { return type_world_update_op_shape_params_sphere; } - if (StringsMatch(S, CSz("type_world_update_op_shape_params_rect"))) { return type_world_update_op_shape_params_rect; } - if (StringsMatch(S, CSz("type_world_update_op_shape_params_cylinder"))) { return type_world_update_op_shape_params_cylinder; } - if (StringsMatch(S, CSz("type_world_update_op_shape_params_asset"))) { return type_world_update_op_shape_params_asset; } - if (StringsMatch(S, CSz("type_world_update_op_shape_params_chunk_data"))) { return type_world_update_op_shape_params_chunk_data; } - if (StringsMatch(S, CSz("type_world_update_op_shape_params_count"))) { return type_world_update_op_shape_params_count; } - - return Result; -} - - diff --git a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h b/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h deleted file mode 100644 index 56504a20d..000000000 --- a/generated/terrain_iteration_pattern_102235355_126003659_545884473_807650077.h +++ /dev/null @@ -1,87 +0,0 @@ -// src/engine/terrain.cpp:112:0 - -// NOTE(Jesse): This must hold true for using any Noise_8x func -Assert(Chunk->Dim % V3i(8) == V3i(0)); - -Period = Max(Period, V3(1.f)); - -for ( s32 z = 0; z < Dim.z; ++ z) -{ - f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); - f32 WorldZBiased = zCoord - zMin; - for ( s32 y = 0; y < Dim.y; ++ y) - { - f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); - - ComputePerlinParameters(y); - for ( s32 x = 0; x < Dim.x; x += 8 ) - { - s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); - - - u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); - - { - /* HISTOGRAM_FUNCTION(); */ - - v3 InteriorPeriod = Period; - r32 InteriorAmp = r32(Amplitude); - f32 xCoords[MIN_TERRAIN_NOISE_WIDTH]; - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) - { - Assert(Chunk->DimInChunks > V3i(0)); - - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) - { - xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; - } - - f32 yIn = yCoord/InteriorPeriod.y; - f32 zIn = zCoord/InteriorPeriod.z; - - // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues - f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; - - // best 102.7 million points/sec - // best 26.15 cycles/cell - /* PerlinNoise_8x_sse(xCoords, yIn, zIn, TmpPerlinResults); */ - - // - // best 143 million points/sec - // best 157 million points/sec - // best 199 million points/sec - // - // best 18.75 cycles/cell - // best 17.11 cycles/cell - // best 13.51 cycles/cell - // - // targ 9-10 cycles/cell - PerlinNoise_8x_avx2(xCoords, yIn, zIn, TmpPerlinResults); - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) - { - NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; - } - - InteriorAmp = Max(1.f, InteriorAmp/2.f); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); - } - - } - - - u8 OccupancyByte = 0; - RangeIterator(ValueIndex, 8) - { - s32 ThisIndex = VoxIndex+ValueIndex; - s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; - ChunkSum += u32(NoiseChoice); - - OccupancyByte |= (NoiseChoice << ValueIndex); - Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); - } - - SetOccupancyByte(Chunk, VoxIndex, OccupancyByte); - } - } -} - diff --git a/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_590747459.h b/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_590747459.h deleted file mode 100644 index 3e1d131a3..000000000 --- a/generated/terrain_iteration_pattern_16x_102235355_126003659_545884473_590747459.h +++ /dev/null @@ -1,72 +0,0 @@ -// src/engine/terrain.cpp:152:0 - -// NOTE(Jesse): This must hold true for using any Noise_8x func -Assert(Chunk->Dim % V3i(16) == V3i(0)); - -Period = Max(Period, V3(1.f)); - - -for ( s32 z = 0; z < Dim.z; ++ z) -{ - f32 zCoord = COMPUTE_NOISE_INPUT(z, 0, Chunk); - f32 WorldZBiased = zCoord - zMin; - for ( s32 y = 0; y < Dim.y; ++ y) - { - f32 yCoord = COMPUTE_NOISE_INPUT(y, 0, Chunk); - for ( s32 x = 0; x < Dim.x; x += 16 ) - { - s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); - - - u16 PackedHSVColorValue = RGBtoPackedHSV(RGBColor); - - { - /* HISTOGRAM_FUNCTION(); */ - - v3 InteriorPeriod = Period; - r32 InteriorAmp = r32(Amplitude); - f32 xCoords[MIN_TERRAIN_NOISE_WIDTH]; - for (u32 OctaveIndex = 0; OctaveIndex < Octaves; ++OctaveIndex) - { - Assert(Chunk->DimInChunks > V3i(0)); - - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) - { - xCoords[ValueIndex] = (COMPUTE_NOISE_INPUT(x, ValueIndex, Chunk)) / InteriorPeriod.x; - } - - f32 yIn = yCoord/InteriorPeriod.y; - f32 zIn = zCoord/InteriorPeriod.z; - - // NOTE(Jesse): Important to use Tmp here so we don't stomp on the result already in NoiseValues - f32 TmpPerlinResults[MIN_TERRAIN_NOISE_WIDTH]; - PerlinNoise_16x(xCoords, yIn, zIn, TmpPerlinResults); - - RangeIterator(ValueIndex, MIN_TERRAIN_NOISE_WIDTH) - { - NoiseValues[VoxIndex+ValueIndex] += TmpPerlinResults[ValueIndex]*InteriorAmp; - } - - InteriorAmp = Max(1.f, InteriorAmp/2.f); - InteriorPeriod = Max(V3(1.f), InteriorPeriod/2.f); - } - - } - - - u8 OccupancyByte = 0; - RangeIterator(ValueIndex, 16) - { - s32 ThisIndex = VoxIndex+ValueIndex; - s32 NoiseChoice = NoiseValues[ThisIndex] > WorldZBiased; - ChunkSum += u32(NoiseChoice); - - OccupancyByte |= (NoiseChoice << ValueIndex); - Chunk->Voxels[ThisIndex].Color = PackedHSVColorValue*u16(NoiseChoice); - } - - SetOccupancyByte(Chunk, VoxIndex, OccupancyByte); - } - } -} - diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index a1144546a..3bbd41dd2 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -259,7 +259,16 @@ void main() f32 y = floor(gl_FragCoord.y - (z*68)); v3 Offset = V3(-2, -2, -2); - v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + +#if 0 + // Sets Basis to the same value for every chunk and, importantly, doesn't allow + // the WorldspaceBasis uniform to be retrieved from the C++ side of the application + v3 Basis = V3(64)*4 + (v3(x,y,z)*ChunkResolution); +#else + // Sets Basis to the correct value for the chunk + v3 Basis = V3(-2) + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); +#endif + // NOTE(Jesse): Set these in the -- user code -- section v3 ColorValue = V3(0.2f, 0.2f, 0.2f); @@ -270,7 +279,7 @@ void main() // { #if 1 - v3 Period = V3(1000.f); + v3 Period = V3(100.f); float Amplitude = 1000.f; f32 StartingZDepth = 1000.f; diff --git a/src/engine/shader.cpp b/src/engine/shader.cpp index 3f60fb054..e57e9eca7 100644 --- a/src/engine/shader.cpp +++ b/src/engine/shader.cpp @@ -1,7 +1,7 @@ -poof(gen_shader_uniform_push(camera)); +poof(set_shader_uniform(camera)); #include -poof(gen_shader_uniform_push(light)); +poof(set_shader_uniform(light)); #include From 2194e9eab07674a93fc9c3166a3bad7e9b3064c5 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 1 May 2025 14:32:47 -0700 Subject: [PATCH 214/421] Back out repro for bug --- shaders/terrain/shaping/terrain_shaping.fragmentshader | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index 3bbd41dd2..b2243f6ae 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -259,15 +259,7 @@ void main() f32 y = floor(gl_FragCoord.y - (z*68)); v3 Offset = V3(-2, -2, -2); - -#if 0 - // Sets Basis to the same value for every chunk and, importantly, doesn't allow - // the WorldspaceBasis uniform to be retrieved from the C++ side of the application - v3 Basis = V3(64)*4 + (v3(x,y,z)*ChunkResolution); -#else - // Sets Basis to the correct value for the chunk - v3 Basis = V3(-2) + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); -#endif + v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); // NOTE(Jesse): Set these in the -- user code -- section From 729efc917c70b3eda2c68da7c15175c0ae955e2b Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 3 May 2025 10:43:50 -0700 Subject: [PATCH 215/421] Add Layers --- examples/terrain_gen/game_constants.h | 4 +- external/bonsai_stdlib | 2 +- generated/are_equal_world_edit_brush.h | 25 ++ generated/block_array_bitmap_688853862.h | 8 + .../block_array_c_asset_thumbnail_688856411.h | 10 +- ...ntity_ptr_688856411_struct_struct_struct.h | 8 + generated/block_array_c_gpu_timer_688735882.h | 8 + .../block_array_c_shader_ptr_688853971.h | 8 + generated/block_array_c_texture_688856411.h | 8 + generated/block_array_c_u32_688856411.h | 8 + generated/block_array_c_u8_cursor_688856411.h | 8 + ...k_queue_entry_build_chunk_mesh_688853862.h | 8 + generated/block_array_entity_688856407.h | 8 + ...lock_array_file_traversal_node_688853862.h | 8 + ...lock_array_gpu_readback_buffer_688853862.h | 8 + generated/block_array_member_info_688856411.h | 8 + generated/block_array_model_688856411.h | 8 + .../block_array_octree_node_ptr_688853862.h | 8 + ...block_array_picked_octree_node_688853862.h | 8 + .../block_array_standing_spot_688853862.h | 8 + generated/block_array_struct_688735882.h | 50 +-- generated/block_array_texture_ptr_688856411.h | 8 + generated/block_array_vox_data_688856411.h | 8 + ...lock_array_voxel_stack_element_688853862.h | 8 + .../block_array_world_chunk_ptr_688853862.h | 8 + generated/block_array_world_edit_688735882.h | 349 ++++++++++++++++++ .../block_array_world_edit_layer_688735882.h | 349 ++++++++++++++++++ .../block_array_world_edit_ptr_688735882.h | 10 +- generated/deserialize_struct_level_header.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 38 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 9 + generated/for_datatypes_fkubhsYl.h | 9 + generated/for_datatypes_kv3WBTai.h | 9 + generated/hashtable_world_edit_brush.h | 181 +++++++++ generated/serialize_struct_level_header.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- jesse.make.sh | 2 +- .../shaping/terrain_shaping.fragmentshader | 10 +- src/engine/api.cpp | 5 +- src/engine/editor.cpp | 175 +++++---- src/engine/editor.h | 21 +- src/engine/level.h | 2 +- 135 files changed, 1400 insertions(+), 212 deletions(-) create mode 100644 generated/are_equal_world_edit_brush.h create mode 100644 generated/block_array_world_edit_688735882.h create mode 100644 generated/block_array_world_edit_layer_688735882.h create mode 100644 generated/hashtable_world_edit_brush.h diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 30f46a5b2..bb603affb 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -19,9 +19,9 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(1024, 1024, 1024); */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ -/* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ +g_VisibleRegion = Chunk_Dimension(128, 128, 128); /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ -g_VisibleRegion = Chunk_Dimension(32, 32, 32); +/* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ /* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ /* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 7835bf6c0..6e893d179 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 7835bf6c025e0d9c408e321a9daed14d2448f240 +Subproject commit 6e893d179bf8af3049fb10e342bda993eec470e4 diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h new file mode 100644 index 000000000..14aac37cb --- /dev/null +++ b/generated/are_equal_world_edit_brush.h @@ -0,0 +1,25 @@ +// src/engine/editor.h:1140:0 + +link_internal b32 +AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( world_edit_brush ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(world_edit_brush Thing1, world_edit_brush Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( world_edit_brush ) ); + + return Result; +} + diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index 285709f80..a0de84576 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -338,4 +338,12 @@ Push( bitmap_block_array *Array, bitmap *Element) return Result; } +link_internal bitmap * +Push( bitmap_block_array *Array ) +{ + bitmap Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 9afa022d3..a567342a7 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:73:0 +// src/engine/editor.cpp:80:0 @@ -133,3 +133,11 @@ Push( asset_thumbnail_block_array *Array, asset_thumbnail *Element) return Result; } +link_internal asset_thumbnail * +Push( asset_thumbnail_block_array *Array ) +{ + asset_thumbnail Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h index f646cce67..3f7036ac2 100644 --- a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h +++ b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h @@ -133,3 +133,11 @@ Push( entity_ptr_block_array *Array, entity_ptr *Element) return Result; } +link_internal entity_ptr * +Push( entity_ptr_block_array *Array ) +{ + entity_ptr Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index d3d5bdb62..e091a360e 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -133,3 +133,11 @@ Push( gpu_timer_block_array *Array, gpu_timer *Element) return Result; } +link_internal gpu_timer * +Push( gpu_timer_block_array *Array ) +{ + gpu_timer Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index 6a7a8dc63..654e5b465 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -133,3 +133,11 @@ Push( shader_ptr_block_array *Array, shader_ptr *Element) return Result; } +link_internal shader_ptr * +Push( shader_ptr_block_array *Array ) +{ + shader_ptr Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index a835912c7..5c4884629 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -133,3 +133,11 @@ Push( texture_block_array *Array, texture *Element) return Result; } +link_internal texture * +Push( texture_block_array *Array ) +{ + texture Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index fe25cc14e..d974fa5e6 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -133,3 +133,11 @@ Push( u32_block_array *Array, u32 *Element) return Result; } +link_internal u32 * +Push( u32_block_array *Array ) +{ + u32 Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index b84d0e482..745cdbe1f 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -133,3 +133,11 @@ Push( u8_cursor_block_array *Array, u8_cursor *Element) return Result; } +link_internal u8_cursor * +Push( u8_cursor_block_array *Array ) +{ + u8_cursor Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index ee632bcad..16a121940 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -338,4 +338,12 @@ Push( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_que return Result; } +link_internal dummy_work_queue_entry_build_chunk_mesh * +Push( dummy_work_queue_entry_build_chunk_mesh_block_array *Array ) +{ + dummy_work_queue_entry_build_chunk_mesh Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index da2a14013..cb7501c6a 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -338,4 +338,12 @@ Push( entity_block_array *Array, entity *Element) return Result; } +link_internal entity * +Push( entity_block_array *Array ) +{ + entity Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index 10b978472..faa1fa313 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -338,4 +338,12 @@ Push( file_traversal_node_block_array *Array, file_traversal_node *Element) return Result; } +link_internal file_traversal_node * +Push( file_traversal_node_block_array *Array ) +{ + file_traversal_node Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 6a070beea..d9a671dab 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -338,4 +338,12 @@ Push( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element) return Result; } +link_internal gpu_readback_buffer * +Push( gpu_readback_buffer_block_array *Array ) +{ + gpu_readback_buffer Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index 1abe7bd99..3edc22675 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -338,4 +338,12 @@ Push( member_info_block_array *Array, member_info *Element) return Result; } +link_internal member_info * +Push( member_info_block_array *Array ) +{ + member_info Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 42a87d641..2281ef27d 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -338,4 +338,12 @@ Push( model_block_array *Array, model *Element) return Result; } +link_internal model * +Push( model_block_array *Array ) +{ + model Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index f9a8f386a..d0540547a 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -338,4 +338,12 @@ Push( octree_node_ptr_block_array *Array, octree_node_ptr *Element) return Result; } +link_internal octree_node_ptr * +Push( octree_node_ptr_block_array *Array ) +{ + octree_node_ptr Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 0f946c9ab..925a66027 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -338,4 +338,12 @@ Push( picked_octree_node_block_array *Array, picked_octree_node *Element) return Result; } +link_internal picked_octree_node * +Push( picked_octree_node_block_array *Array ) +{ + picked_octree_node Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 8c2f5c328..bb0f888f7 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -338,4 +338,12 @@ Push( standing_spot_block_array *Array, standing_spot *Element) return Result; } +link_internal standing_spot * +Push( standing_spot_block_array *Array ) +{ + standing_spot Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h index c2485ebce..978f9a76c 100644 --- a/generated/block_array_struct_688735882.h +++ b/generated/block_array_struct_688735882.h @@ -35,30 +35,6 @@ WorldEditBlockArray(memory_arena *Memory) return Result; } -link_internal b32 -AreEqual(world_edit_block_array_index *Thing1, world_edit_block_array_index *Thing2) -{ - if (Thing1 && Thing2) - { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( world_edit_block_array_index ) ); - - return Result; - } - else - { - return (Thing1 == Thing2); - } -} - -link_internal b32 -AreEqual(world_edit_block_array_index Thing1, world_edit_block_array_index Thing2) -{ - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( world_edit_block_array_index ) ); - - return Result; -} - - typedef world_edit_block_array world_edit_paged_list; link_internal world_edit_block_array_index @@ -217,6 +193,32 @@ Allocate_world_edit_block(memory_arena *Memory) return Result; } + + +link_internal b32 +AreEqual(world_edit_block_array_index *Thing1, world_edit_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( world_edit_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(world_edit_block_array_index Thing1, world_edit_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( world_edit_block_array_index ) ); + + return Result; +} + + link_internal cs CS( world_edit_block_array_index Index ) { diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index d4d82f4a3..5b8a2f620 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -133,3 +133,11 @@ Push( texture_ptr_block_array *Array, texture_ptr *Element) return Result; } +link_internal texture_ptr * +Push( texture_ptr_block_array *Array ) +{ + texture_ptr Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index ae257c0d2..9e7d40d0d 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -338,4 +338,12 @@ Push( vox_data_block_array *Array, vox_data *Element) return Result; } +link_internal vox_data * +Push( vox_data_block_array *Array ) +{ + vox_data Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index 175598954..9123c3d30 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -338,4 +338,12 @@ Push( voxel_stack_element_block_array *Array, voxel_stack_element *Element) return Result; } +link_internal voxel_stack_element * +Push( voxel_stack_element_block_array *Array ) +{ + voxel_stack_element Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index dd9432d53..6a2e82e18 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -133,3 +133,11 @@ Push( world_chunk_ptr_block_array *Array, world_chunk_ptr *Element) return Result; } +link_internal world_chunk_ptr * +Push( world_chunk_ptr_block_array *Array ) +{ + world_chunk_ptr Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h new file mode 100644 index 000000000..1c1b5b8ce --- /dev/null +++ b/generated/block_array_world_edit_688735882.h @@ -0,0 +1,349 @@ +// src/engine/editor.h:1155:0 + + + + + +struct world_edit_block +{ + u32 Index; + u32 At; + world_edit *Elements; + world_edit_block *Next; +}; + +struct world_edit_block_array_index +{ + world_edit_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct world_edit_block_array +{ + world_edit_block *First; + world_edit_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +link_internal world_edit_block_array +WorldEditBlockArray(memory_arena *Memory) +{ + world_edit_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal b32 +AreEqual(world_edit_block_array_index *Thing1, world_edit_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( world_edit_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(world_edit_block_array_index Thing1, world_edit_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( world_edit_block_array_index ) ); + + return Result; +} + + +typedef world_edit_block_array world_edit_paged_list; + +link_internal world_edit_block_array_index +operator++( world_edit_block_array_index &I0 ) +{ + if (I0.Block) + { + if (I0.ElementIndex == 8-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<( world_edit_block_array_index I0, world_edit_block_array_index I1 ) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex( world_edit_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*8); + return Result; +} + +link_internal world_edit_block_array_index +ZerothIndex( world_edit_block_array *Arr) +{ + world_edit_block_array_index Result = {}; + Result.Block = Arr->First; + return Result; +} + +link_internal umm +TotalElements( world_edit_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 8) + Arr->Current->At; + } + return Result; +} + +link_internal world_edit_block_array_index +LastIndex( world_edit_block_array *Arr) +{ + world_edit_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal world_edit_block_array_index +AtElements( world_edit_block_array *Arr) +{ + world_edit_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal umm +Count( world_edit_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + +link_internal world_edit * +GetPtr(world_edit_block_array *Arr, world_edit_block_array_index Index) +{ + world_edit *Result = {}; + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } + return Result; +} + +link_internal world_edit * +GetPtr(world_edit_block *Block, umm Index) +{ + world_edit *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } + return Result; +} + +link_internal world_edit * +GetPtr(world_edit_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + umm AtBlock = 0; + world_edit_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + world_edit *Result = (Block->Elements+ElementIndex); + return Result; +} + +link_internal world_edit * +TryGetPtr(world_edit_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + world_edit *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(world_edit_block *Block) +{ + return Block->At; +} + + + + + +link_internal world_edit_block * +Allocate_world_edit_block(memory_arena *Memory) +{ + world_edit_block *Result = Allocate( world_edit_block, Memory, 1); + Result->Elements = Allocate( world_edit, Memory, 8); + return Result; +} + +link_internal cs +CS( world_edit_block_array_index Index ) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal world_edit * +Set( world_edit_block_array *Arr, + world_edit *Element, + world_edit_block_array_index Index ) +{ + world_edit *Result = {}; + if (Index.Block) + { + world_edit *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + +link_internal void +RemoveUnordered( world_edit_block_array *Array, world_edit_block_array_index Index) +{ + world_edit_block_array_index LastI = LastIndex(Array); + + world_edit *Element = GetPtr(Array, Index); + world_edit *LastElement = GetPtr(Array, LastI); + + Set(Array, LastElement, Index); + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + world_edit_block *Current = Array->First; + world_edit_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal world_edit_block_array_index +Find( world_edit_block_array *Array, world_edit *Query) +{ + world_edit_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if ( E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(world_edit_block_array_index *Index) +{ + world_edit_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + b32 Result = (AreEqual(Index, &Test) == False); + return Result; +} + +link_internal world_edit * +Push( world_edit_block_array *Array, world_edit *Element) +{ + Assert(Array->Memory); + + if (Array->First == 0) { Array->First = Allocate_world_edit_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 8) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + world_edit_block *Next = Allocate_world_edit_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + world_edit *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + +link_internal world_edit * +Push( world_edit_block_array *Array ) +{ + world_edit Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + + diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h new file mode 100644 index 000000000..1a8d4ed77 --- /dev/null +++ b/generated/block_array_world_edit_layer_688735882.h @@ -0,0 +1,349 @@ +// src/engine/editor.h:1166:0 + + + + + +struct world_edit_layer_block +{ + u32 Index; + u32 At; + world_edit_layer *Elements; + world_edit_layer_block *Next; +}; + +struct world_edit_layer_block_array_index +{ + world_edit_layer_block *Block; + u32 BlockIndex; + u32 ElementIndex; +}; + +struct world_edit_layer_block_array +{ + world_edit_layer_block *First; + world_edit_layer_block *Current; + memory_arena *Memory; poof(@no_serialize) + +}; + +link_internal world_edit_layer_block_array +WorldEditLayerBlockArray(memory_arena *Memory) +{ + world_edit_layer_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal b32 +AreEqual(world_edit_layer_block_array_index *Thing1, world_edit_layer_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( world_edit_layer_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(world_edit_layer_block_array_index Thing1, world_edit_layer_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( world_edit_layer_block_array_index ) ); + + return Result; +} + + +typedef world_edit_layer_block_array world_edit_layer_paged_list; + +link_internal world_edit_layer_block_array_index +operator++( world_edit_layer_block_array_index &I0 ) +{ + if (I0.Block) + { + if (I0.ElementIndex == 8-1) + { + I0.ElementIndex = 0; + I0.BlockIndex++; + I0.Block = I0.Block->Next; + } + else + { + I0.ElementIndex++; + } + } + else + { + I0.ElementIndex++; + } + return I0; +} + +link_internal b32 +operator<( world_edit_layer_block_array_index I0, world_edit_layer_block_array_index I1 ) +{ + b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + return Result; +} + +link_inline umm +GetIndex( world_edit_layer_block_array_index *Index) +{ + umm Result = Index->ElementIndex + (Index->BlockIndex*8); + return Result; +} + +link_internal world_edit_layer_block_array_index +ZerothIndex( world_edit_layer_block_array *Arr) +{ + world_edit_layer_block_array_index Result = {}; + Result.Block = Arr->First; + return Result; +} + +link_internal umm +TotalElements( world_edit_layer_block_array *Arr) +{ + umm Result = 0; + if (Arr->Current) + { + Result = (Arr->Current->Index * 8) + Arr->Current->At; + } + return Result; +} + +link_internal world_edit_layer_block_array_index +LastIndex( world_edit_layer_block_array *Arr) +{ + world_edit_layer_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + Assert(Result.ElementIndex); + Result.ElementIndex--; + } + return Result; +} + +link_internal world_edit_layer_block_array_index +AtElements( world_edit_layer_block_array *Arr) +{ + world_edit_layer_block_array_index Result = {}; + if (Arr->Current) + { + Result.Block = Arr->Current; + Result.BlockIndex = Arr->Current->Index; + Result.ElementIndex = Arr->Current->At; + } + return Result; +} + +link_internal umm +Count( world_edit_layer_block_array *Arr) +{ + auto Index = AtElements(Arr); + umm Result = GetIndex(&Index); + return Result; +} + +link_internal world_edit_layer * +GetPtr(world_edit_layer_block_array *Arr, world_edit_layer_block_array_index Index) +{ + world_edit_layer *Result = {}; + if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } + return Result; +} + +link_internal world_edit_layer * +GetPtr(world_edit_layer_block *Block, umm Index) +{ + world_edit_layer *Result = {}; + if (Index < Block->At) { Result = (Block->Elements + Index); } + return Result; +} + +link_internal world_edit_layer * +GetPtr(world_edit_layer_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + umm AtBlock = 0; + world_edit_layer_block *Block = Arr->First; + while (AtBlock++ < BlockIndex) + { + Block = Block->Next; + } + + world_edit_layer *Result = (Block->Elements+ElementIndex); + return Result; +} + +link_internal world_edit_layer * +TryGetPtr(world_edit_layer_block_array *Arr, umm Index) +{ + umm BlockIndex = Index / 8; + umm ElementIndex = Index % 8; + + auto AtE = AtElements(Arr); + umm Total = GetIndex(&AtE); + world_edit_layer *Result = {}; + if (Index < Total) { Result = GetPtr(Arr, Index); } + return Result; +} + +link_internal u32 +AtElements(world_edit_layer_block *Block) +{ + return Block->At; +} + + + + + +link_internal world_edit_layer_block * +Allocate_world_edit_layer_block(memory_arena *Memory) +{ + world_edit_layer_block *Result = Allocate( world_edit_layer_block, Memory, 1); + Result->Elements = Allocate( world_edit_layer, Memory, 8); + return Result; +} + +link_internal cs +CS( world_edit_layer_block_array_index Index ) +{ + return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); +} + +link_internal world_edit_layer * +Set( world_edit_layer_block_array *Arr, + world_edit_layer *Element, + world_edit_layer_block_array_index Index ) +{ + world_edit_layer *Result = {}; + if (Index.Block) + { + world_edit_layer *Slot = &Index.Block->Elements[Index.ElementIndex]; + *Slot = *Element; + + Result = Slot; + } + + return Result; +} + +link_internal void +RemoveUnordered( world_edit_layer_block_array *Array, world_edit_layer_block_array_index Index) +{ + world_edit_layer_block_array_index LastI = LastIndex(Array); + + world_edit_layer *Element = GetPtr(Array, Index); + world_edit_layer *LastElement = GetPtr(Array, LastI); + + Set(Array, LastElement, Index); + + Assert(Array->Current->At); + Array->Current->At -= 1; + + if (Array->Current->At == 0) + { + // TODO(Jesse): There's obviously a way better way to do this .. + auto AtE = AtElements(Array); + s32 Count = s32(GetIndex(&AtE)); + + if (Count == 0) + { + // Nothing to be done, we've popping the last thing off the array + Assert(Index.Block == Array->First); + Assert(Index.Block == Array->Current); + Assert(Index.BlockIndex == 0); + Assert(Index.ElementIndex == 0); + } + else + { + // Walk the chain till we get to the second-last one + world_edit_layer_block *Current = Array->First; + world_edit_layer_block *LastB = LastI.Block; + + while (Current->Next && Current->Next != LastB) + { + Current = Current->Next; + } + + Assert(Current->Next == LastB || Current->Next == 0); + Array->Current = Current; + } + } +} + +link_internal world_edit_layer_block_array_index +Find( world_edit_layer_block_array *Array, world_edit_layer *Query) +{ + world_edit_layer_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if ( E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(world_edit_layer_block_array_index *Index) +{ + world_edit_layer_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + b32 Result = (AreEqual(Index, &Test) == False); + return Result; +} + +link_internal world_edit_layer * +Push( world_edit_layer_block_array *Array, world_edit_layer *Element) +{ + Assert(Array->Memory); + + if (Array->First == 0) { Array->First = Allocate_world_edit_layer_block(Array->Memory); Array->Current = Array->First; } + + if (Array->Current->At == 8) + { + if (Array->Current->Next) + { + Array->Current = Array->Current->Next; + Assert(Array->Current->At == 0); + } + else + { + world_edit_layer_block *Next = Allocate_world_edit_layer_block(Array->Memory); + Next->Index = Array->Current->Index + 1; + + Array->Current->Next = Next; + Array->Current = Next; + } + } + + world_edit_layer *Result = Array->Current->Elements + Array->Current->At; + + Array->Current->Elements[Array->Current->At++] = *Element; + + return Result; +} + +link_internal world_edit_layer * +Push( world_edit_layer_block_array *Array ) +{ + world_edit_layer Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + + diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index fc0008ca6..75989e806 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1157:0 +// src/engine/editor.h:1158:0 @@ -338,4 +338,12 @@ Push( world_edit_ptr_block_array *Array, world_edit_ptr *Element) return Result; } +link_internal world_edit_ptr * +Push( world_edit_ptr_block_array *Array ) +{ + world_edit_ptr Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + diff --git a/generated/deserialize_struct_level_header.h b/generated/deserialize_struct_level_header.h index 2b0193bb1..21e2b3fe9 100644 --- a/generated/deserialize_struct_level_header.h +++ b/generated/deserialize_struct_level_header.h @@ -15,7 +15,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena b32 Result = True; // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->EditCount, Memory); + Result &= Deserialize(Bytes, &Element->LayerCount, Memory); diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index e4c1f0899..c21529e56 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:208:0 +// src/engine/editor.cpp:215:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 12a53e584..a860ae82c 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:347:0 +// src/engine/editor.cpp:354:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 4f27cf012..d7d2064b6 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:339:0 +// src/engine/editor.cpp:346:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 1a74cb6eb..51e41b19f 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:247:0 +// src/engine/editor.cpp:254:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index a7a8ee61e..3e697fdd6 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:214:0 +// src/engine/editor.cpp:221:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index b7e72a9ff..28da71490 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:147:0 +// src/engine/editor.cpp:154:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index eced7245c..1ce3f7bf4 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:256:0 +// src/engine/editor.cpp:263:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 02c594cd3..3bdda570d 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:102:0 +// src/engine/editor.cpp:109:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index ab50659d8..955da65ec 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:241:0 +// src/engine/editor.cpp:248:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 18fcd2690..d3881981b 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:280:0 +// src/engine/editor.cpp:287:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index c40f955ef..860ac3615 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:250:0 +// src/engine/editor.cpp:257:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index eef58fd41..3803c737d 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:350:0 +// src/engine/editor.cpp:357:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 36cd32798..148481930 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:143:0 +// src/engine/editor.cpp:150:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index c897650bf..09c025de6 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:437:0 +// src/engine/editor.cpp:444:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index d82218783..fc38ca520 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:458:0 +// src/engine/editor.cpp:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index d02f90308..40ae3a952 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:455:0 +// src/engine/editor.cpp:462:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 596d912a1..092649211 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:319:0 +// src/engine/editor.cpp:326:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 8cb3d8390..ca5f97bb5 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:316:0 +// src/engine/editor.cpp:323:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 6c854c954..e10bb3cb5 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:353:0 +// src/engine/editor.cpp:360:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index c8466f26e..e6fad80b7 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:304:0 +// src/engine/editor.cpp:311:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 6f9d9b678..e861197e9 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:238:0 +// src/engine/editor.cpp:245:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index d39d0e2cf..f2259a4c2 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:413:0 +// src/engine/editor.cpp:420:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index f33af8841..86d7e3fd4 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:407:0 +// src/engine/editor.cpp:414:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 556c526e2..beaf1a1b5 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:286:0 +// src/engine/editor.cpp:293:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index f198613a4..ab71e5eab 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:289:0 +// src/engine/editor.cpp:296:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 6bb3c0b86..938db9751 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:428:0 +// src/engine/editor.cpp:435:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 5bb5a93d5..c9af18bf2 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:452:0 +// src/engine/editor.cpp:459:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index f91d2cf54..45ba6931c 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:136:0 +// src/engine/editor.cpp:143:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 0082e684b..76c4b3cde 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:133:0 +// src/engine/editor.cpp:140:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 2fef697db..5d72af919 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:205:0 +// src/engine/editor.cpp:212:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 70ebcac4d..b5bf9f970 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:259:0 +// src/engine/editor.cpp:266:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index c2f594e6d..3094860a5 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:443:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -270,8 +270,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_block_array*, &Element->WorldEdits), - CSz("WorldEdits"), + Cast(world_edit_layer_block_array*, &Element->Layers), + CSz("Layers"), Params ); @@ -299,6 +299,38 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_layer*, Element->CurrentLayer), + CSz("CurrentLayer"), + Params + ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_layer*, Element->HotLayer), + CSz("HotLayer"), + Params + ); + + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 9b8a2df73..8188534b5 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:410:0 +// src/engine/editor.cpp:417:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 5ffd28edb..f61f37a11 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:184:0 +// src/engine/editor.cpp:191:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 763cfc3cd..8078f24fe 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:292:0 +// src/engine/editor.cpp:299:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index c6f3d6d28..40cf2bdfb 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:295:0 +// src/engine/editor.cpp:302:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 51874dfee..a69e4eda6 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:253:0 +// src/engine/editor.cpp:260:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 2f7e79cbb..53e1a99f5 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:329:0 +// src/engine/editor.cpp:336:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index f8e626148..95a854b9b 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:199:0 +// src/engine/editor.cpp:206:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index af5f5dba6..6c32a2a88 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:202:0 +// src/engine/editor.cpp:209:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 9b796b2fc..7352710bc 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:88:0 +// src/engine/editor.cpp:95:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 18e8e00d1..ecba284e3 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:190:0 +// src/engine/editor.cpp:197:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 10e53f5f5..5997a35f0 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:235:0 +// src/engine/editor.cpp:242:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index f6c9337a9..2e52bdf57 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:139:0 +// src/engine/editor.cpp:146:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 0b1137b20..11ba0dfb0 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:193:0 +// src/engine/editor.cpp:200:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 72008d8bc..ac16393c7 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:401:0 +// src/engine/editor.cpp:408:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index f8033931f..0af3e338c 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:431:0 +// src/engine/editor.cpp:438:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 71a37c56a..a710f0d68 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:187:0 +// src/engine/editor.cpp:194:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 31d932858..146b0b04c 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:404:0 +// src/engine/editor.cpp:411:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 8913f74c8..f017c4429 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:398:0 +// src/engine/editor.cpp:405:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index ca553ac7b..7635fb0b4 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:100:0 +// src/engine/editor.cpp:107:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index e572b0118..cba2238a6 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:419:0 +// src/engine/editor.cpp:426:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 93f017904..984e6d38c 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:422:0 +// src/engine/editor.cpp:429:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 179b56c13..a4688b1a0 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:416:0 +// src/engine/editor.cpp:423:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 29277d8ad..d92da6a8e 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:265:0 +// src/engine/editor.cpp:272:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 8025bfea5..55ed2397f 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:262:0 +// src/engine/editor.cpp:269:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index c67e51bd3..96cd568e4 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:425:0 +// src/engine/editor.cpp:432:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 964ea953d..545181d6c 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:244:0 +// src/engine/editor.cpp:251:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index eb33ce1c1..19131efa2 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:434:0 +// src/engine/editor.cpp:441:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 61f80bc76..360a395a7 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:109:0 +// src/engine/editor.cpp:116:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 9d93bcf2d..1a9d6a189 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:112:0 +// src/engine/editor.cpp:119:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index a3611825e..76b9b8de8 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:217:0 +// src/engine/editor.cpp:224:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 6a3dd0c3b..184bc79d7 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:211:0 +// src/engine/editor.cpp:218:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 99313d058..49d67b770 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:91:0 +// src/engine/editor.cpp:98:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 7ff34ee3f..23dc91d9d 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:283:0 +// src/engine/editor.cpp:290:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index a6a6cf0c9..344a15db8 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:274:0 +// src/engine/editor.cpp:281:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 113fbf23f..9e9991d5e 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:277:0 +// src/engine/editor.cpp:284:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index b68454136..f4e677c8d 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:85:0 +// src/engine/editor.cpp:92:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 3ba0f6b30..3e7223de7 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:130:0 +// src/engine/editor.cpp:137:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 040835363..ea2036d32 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:127:0 +// src/engine/editor.cpp:134:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index a22f79164..ae9d09535 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:332:0 +// src/engine/editor.cpp:339:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index f69ffecb5..b2e48c5fe 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:326:0 +// src/engine/editor.cpp:333:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index 667a655e8..7cb857bc1 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:268:0 +// src/engine/editor.cpp:275:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 763259f32..bfc50a7d1 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:96:0 +// src/engine/editor.cpp:103:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index bfb2f857e..9d7ce3cdf 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:94:0 +// src/engine/editor.cpp:101:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 2c813c929..1b4343d31 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:323:0 +// src/engine/editor.cpp:330:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 6d38272cf..46e94c999 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:298:0 +// src/engine/editor.cpp:305:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 4d62eada7..0c2e83a2a 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:121:0 +// src/engine/editor.cpp:128:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 61887d033..1b5525ae2 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:106:0 +// src/engine/editor.cpp:113:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index fc122eefd..2518787d1 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:344:0 +// src/engine/editor.cpp:351:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index a107f0b81..f454a0f3d 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:271:0 +// src/engine/editor.cpp:278:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 02950e41b..7195561db 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:440:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index e139e1e70..8fea27923 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:175:0 +// src/engine/editor.cpp:182:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 29269dbc5..39969ae72 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:172:0 +// src/engine/editor.cpp:179:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index e8a5b2c72..387b2b4ac 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:301:0 +// src/engine/editor.cpp:308:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 491ad0313..df170ea2c 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:196:0 +// src/engine/editor.cpp:203:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index def747574..fc7bc0974 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:446:0 +// src/engine/editor.cpp:453:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index f5b8c8b77..afcb184a3 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:449:0 +// src/engine/editor.cpp:456:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 8ae189212..63003e711 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:98:0 +// src/engine/editor.cpp:105:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 935b86073..e83995368 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:178:0 +// src/engine/editor.cpp:185:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 5256a8316..43ad2d4c9 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -221,6 +221,8 @@ + + @@ -727,6 +729,13 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + + + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index b82efa11b..6421709f8 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -221,6 +221,8 @@ + + @@ -717,6 +719,13 @@ render_to_texture_async_params render_to_texture_async_params; + + + + + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 34889058d..9b3860b05 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -221,6 +221,8 @@ + + @@ -717,6 +719,13 @@ type_render_to_texture_async_params, + + + + + + + diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h new file mode 100644 index 000000000..37d8f692a --- /dev/null +++ b/generated/hashtable_world_edit_brush.h @@ -0,0 +1,181 @@ +// src/engine/editor.h:1143:0 + +struct world_edit_brush_linked_list_node +{ + b32 Tombstoned; + world_edit_brush Element; + world_edit_brush_linked_list_node *Next; +}; + +struct world_edit_brush_hashtable +{ + umm Size; + world_edit_brush_linked_list_node **Elements; + /* OWNED_BY_THREAD_MEMBER() */ +}; +link_internal b32 AreEqual(world_edit_brush_linked_list_node *Node1, world_edit_brush_linked_list_node *Node2 ); + +link_internal world_edit_brush_linked_list_node * +Allocate_world_edit_brush_linked_list_node(memory_arena *Memory) +{ + world_edit_brush_linked_list_node *Result = Allocate( world_edit_brush_linked_list_node, Memory, 1); + return Result; +} + +link_internal world_edit_brush_hashtable +Allocate_world_edit_brush_hashtable(umm ElementCount, memory_arena *Memory) +{ + world_edit_brush_hashtable Result = { + .Elements = Allocate( world_edit_brush_linked_list_node*, Memory, ElementCount), + .Size = ElementCount, + /* OWNED_BY_THREAD_MEMBER_INIT() */ + }; + return Result; +} + +link_internal world_edit_brush_linked_list_node * +GetHashBucket(umm HashValue, world_edit_brush_hashtable *Table) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + Assert(Table->Size); + world_edit_brush_linked_list_node *Result = Table->Elements[HashValue % Table->Size]; + return Result; +} + +link_internal world_edit_brush * +GetFirstAtBucket(umm HashValue, world_edit_brush_hashtable *Table) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + world_edit_brush_linked_list_node *Bucket = GetHashBucket(HashValue, Table); + world_edit_brush *Result = &Bucket->Element; + return Result; +} + +link_internal world_edit_brush_linked_list_node** +GetMatchingBucket(world_edit_brush Element, world_edit_brush_hashtable *Table, memory_arena *Memory) +{ + umm HashValue = Hash(&Element) % Table->Size; + world_edit_brush_linked_list_node **Bucket = Table->Elements + HashValue; + while (*Bucket) + { + if (AreEqual(&Bucket[0]->Element, &Element)) { break; } + Bucket = &(*Bucket)->Next; + } + return Bucket; +} + +link_internal world_edit_brush * +Insert(world_edit_brush_linked_list_node *Node, world_edit_brush_hashtable *Table) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + Assert(Table->Size); + umm HashValue = Hash(&Node->Element) % Table->Size; + world_edit_brush_linked_list_node **Bucket = Table->Elements + HashValue; + while (*Bucket) + { + /* Assert(!AreEqual(*Bucket, Node)); */ + Bucket = &(*Bucket)->Next; + } + *Bucket = Node; + return &Bucket[0]->Element; +} + +link_internal world_edit_brush* +Insert(world_edit_brush Element, world_edit_brush_hashtable *Table, memory_arena *Memory) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + world_edit_brush_linked_list_node *Bucket = Allocate_world_edit_brush_linked_list_node(Memory); + Bucket->Element = Element; + Insert(Bucket, Table); + return &Bucket->Element; +} + +link_internal world_edit_brush* +Upsert(world_edit_brush Element, world_edit_brush_hashtable *Table, memory_arena *Memory) +{ + umm HashValue = Hash(&Element) % Table->Size; + world_edit_brush_linked_list_node **Bucket = Table->Elements + HashValue; + while (*Bucket) + { + if (AreEqual(&Bucket[0]->Element, &Element)) { break; } + Bucket = &(*Bucket)->Next; + } + + if (*Bucket && Bucket[0]->Tombstoned == False) + { + Bucket[0]->Element = Element; + } + else + { + Insert(Element, Table, Memory); + } + + return &Bucket[0]->Element; +} + + +// +// Iterator impl. +// + +struct world_edit_brush_hashtable_iterator +{ + umm HashIndex; + world_edit_brush_hashtable *Table; + world_edit_brush_linked_list_node *Node; +}; + +link_internal world_edit_brush_hashtable_iterator +operator++( world_edit_brush_hashtable_iterator &Iterator ) +{ + if (Iterator.Node) + { + Iterator.Node = Iterator.Node->Next; + } + else + { + Assert (Iterator.HashIndex < Iterator.Table->Size ); + Iterator.Node = Iterator.Table->Elements[++Iterator.HashIndex]; + } + + return Iterator; +} + +link_internal b32 +operator<( world_edit_brush_hashtable_iterator I0, world_edit_brush_hashtable_iterator I1) +{ + b32 Result = I0.HashIndex < I1.HashIndex; + return Result; +} + +link_inline world_edit_brush_hashtable_iterator +ZerothIndex(world_edit_brush_hashtable *Hashtable) +{ + world_edit_brush_hashtable_iterator Iterator = {}; + Iterator.Table = Hashtable; + Iterator.Node = Hashtable->Elements[0]; + return Iterator; +} + +link_inline world_edit_brush_hashtable_iterator +AtElements(world_edit_brush_hashtable *Hashtable) +{ + world_edit_brush_hashtable_iterator Result = { Hashtable->Size, 0, 0 }; + return Result; +} + +link_inline world_edit_brush * +GetPtr(world_edit_brush_hashtable *Hashtable, world_edit_brush_hashtable_iterator Iterator) +{ + world_edit_brush *Result = {}; + if (Iterator.Node) + { + Result = &Iterator.Node->Element; + } + return Result; +} + diff --git a/generated/serialize_struct_level_header.h b/generated/serialize_struct_level_header.h index c371b0152..22c7954a4 100644 --- a/generated/serialize_struct_level_header.h +++ b/generated/serialize_struct_level_header.h @@ -34,7 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, level_header *BaseElement, umm Count = 1 RangeIterator_t(umm, ElementIndex, Count) { level_header *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->EditCount); // default + Result &= Serialize(Bytes, &Element->LayerCount); // default diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 8b785d7b9..6a449257b 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:342:0 +// src/engine/editor.cpp:349:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index c431efb9d..9032cfb4b 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:168:0 +// src/engine/editor.cpp:175:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index bbe39b9cd..7042806dc 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:162:0 +// src/engine/editor.cpp:169:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 8597b8149..aa541fc46 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:159:0 +// src/engine/editor.cpp:166:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 50f55ee96..06e109ffc 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:165:0 +// src/engine/editor.cpp:172:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/jesse.make.sh b/jesse.make.sh index 81197b57f..4a47e50e2 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index b2243f6ae..bc1022a49 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -271,9 +271,9 @@ void main() // { #if 1 - v3 Period = V3(100.f); - float Amplitude = 1000.f; - f32 StartingZDepth = 1000.f; + v3 Period = V3(200.f); + float Amplitude = 150.f; + f32 StartingZDepth = 7000.f; NoiseValue = StartingZDepth; @@ -285,7 +285,9 @@ void main() /* NoiseValue += Smoothstep(pow(Clamp01(gn.x), 0.1)) * Amplitude; */ - NoiseValue -= Basis.z; + f32 xyContrib = 0.2f*(max(abs(Basis.x), abs(Basis.y))); + /* f32 xyContrib = 0.f; */ + NoiseValue -= Basis.z - xyContrib; #endif } diff --git a/src/engine/api.cpp b/src/engine/api.cpp index f05b8977b..bf2b2aace 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -98,7 +98,10 @@ Bonsai_FrameBegin(engine_resources *Resources) Assert(Count(&Resources->Graphics.NoiseReadbackJobs) == 0); HardResetWorld(Resources); - ApplyEditBufferToOctree(Resources, &Resources->Editor.WorldEdits); + IterateOver(&Resources->Editor.Layers, Layer, LayerIndex) + { + ApplyEditBufferToOctree(Resources, &Layer->Edits); + } /* HardResetEditor(&Resources->Editor); */ UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 079e0df93..f2e6f75b1 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -24,7 +24,14 @@ InitEditor(level_editor *Editor) b32 Result = True; Editor->Memory = AllocateArena(); - Editor->WorldEdits = WorldEditBlockArray(Editor->Memory); + Editor->Layers = WorldEditLayerBlockArray(Editor->Memory); + + Editor->CurrentLayer = Push(&Editor->Layers); + Editor->CurrentLayer->Edits = WorldEditBlockArray(Editor->Memory); + + cs DefaultName = CSz("layer_0"); + CopyString(DefaultName.Start, Editor->CurrentLayer->NameBuf, DefaultName.Count); + Editor->AssetThumbnails = AssetThumbnailBlockArray(Editor->Memory); Editor->LoadedBrushes = Allocate_world_edit_brush_hashtable(128, Editor->Memory); @@ -2771,8 +2778,7 @@ DoWorldEditor(engine_resources *Engine) Editor->Tool = WorldEdit_Tool_Select; ResetSelection(Editor); - world_edit E = {}; - Editor->CurrentEdit = Push(&Editor->WorldEdits, &E); + Editor->CurrentEdit = Push(&Editor->CurrentLayer->Edits); Editor->CurrentEdit->Ordinal = Editor->NextEditOrdinal++; Editor->CurrentEdit->Brush = Editor->CurrentBrush; @@ -2864,11 +2870,14 @@ DoWorldEditor(engine_resources *Engine) b32 SettingsChanged = CheckSettingsChanged(&Editor->CurrentBrush->Layered); if (SettingsChanged) { - IterateOver(&Editor->WorldEdits, Edit, EditIndex) + IterateOver(&Editor->Layers, Layer, LayerIndex) { - if (Edit->Brush == Editor->CurrentBrush) + IterateOver(&Layer->Edits, Edit, EditIndex) { - UpdateWorldEdit(Engine, Edit, Editor->Selection.Region, GetTranArena()); + if (Edit->Brush == Editor->CurrentBrush) + { + UpdateWorldEdit(Engine, Edit, Editor->Selection.Region, GetTranArena()); + } } } } @@ -2880,52 +2889,63 @@ DoWorldEditor(engine_resources *Engine) { local_persist window_layout AllEditsWindow = WindowLayout("All Edits", WindowLayoutFlag_Align_Bottom); PushWindowStart(Ui, &AllEditsWindow); - IterateOver(&Editor->WorldEdits, Edit, BrushIndex) + PushTableStart(Ui); + IterateOver(&Editor->Layers, Layer, LayerIndex) { - umm I = GetIndex(&BrushIndex); - const char *NameBuf = Edit->Brush ? Edit->Brush->NameBuf : "no brush"; - - if (Edit == Editor->CurrentEdit) - { - PushColumn(Ui, CSz("*"), &DefaultSelectedStyle); - } - else + cs Name = CS(Layer->NameBuf); + if (ToggleButton(Ui, Name, Name, UiId(&AllEditsWindow, Layer, Layer), &DefaultSelectedStyle)) { - PushColumn(Ui, CSz(" "), &DefaultSelectedStyle); - } + PushNewRow(Ui); + IterateOver(&Layer->Edits, Edit, BrushIndex) + { + umm I = GetIndex(&BrushIndex); + const char *NameBuf = Edit->Brush ? Edit->Brush->NameBuf : "no brush"; - auto EditSelectButton = PushSimpleButton(Ui, FSz("(%d) (%s)", I, NameBuf), UiId(&AllEditsWindow, "edit select", Edit)); - if (Clicked(Ui, &EditSelectButton)) - { - Editor->Selection.Clicks = 2; - Editor->Selection.Region = Edit->Region; - Editor->Selection.PrevRegion = Edit->Region; + if (Edit == Editor->CurrentEdit) + { + PushColumn(Ui, CSz("*"), &DefaultSelectedStyle); + } + else + { + PushColumn(Ui, CSz(" "), &DefaultSelectedStyle); + } - Editor->CurrentEdit = Edit; + auto EditSelectButton = PushSimpleButton(Ui, FSz("(%d) (%s)", I, NameBuf), UiId(&AllEditsWindow, "edit select", Edit)); + if (Clicked(Ui, &EditSelectButton)) + { + Editor->Selection.Clicks = 2; + Editor->Selection.Region = Edit->Region; + Editor->Selection.PrevRegion = Edit->Region; - if (Edit->Brush) - { - Editor->CurrentBrush = Edit->Brush; - CheckSettingsChanged(&Edit->Brush->Layered); // Prevent firing a change event @prevent_change_event - } - } - if (Hover(Ui, &EditSelectButton)) - { - Editor->HotEdit = Edit; - } + Editor->CurrentEdit = Edit; - if (Button(Ui, FSz("(UpdateBrush)", I, NameBuf), UiId(&AllEditsWindow, "edit brush select", Edit))) - { - Edit->Brush = Editor->CurrentBrush; - UpdateWorldEdit(Engine, Edit, Edit->Region, GetTranArena()); - } + if (Edit->Brush) + { + Editor->CurrentBrush = Edit->Brush; + CheckSettingsChanged(&Edit->Brush->Layered); // Prevent firing a change event @prevent_change_event + } + } - PushNewRow(Ui); + if (Hover(Ui, &EditSelectButton)) + { + Editor->HotEdit = Edit; + } - DoEditorUi(Ui, &AllEditsWindow, Edit, {}); - PushNewRow(Ui); - } + if (Button(Ui, FSz("(UpdateBrush)", I, NameBuf), UiId(&AllEditsWindow, "edit brush select", Edit))) + { + Edit->Brush = Editor->CurrentBrush; + UpdateWorldEdit(Engine, Edit, Edit->Region, GetTranArena()); + } + + PushNewRow(Ui); + + /* DoEditorUi(Ui, &AllEditsWindow, Edit, {}); */ + /* PushNewRow(Ui); */ + } + } + } + PushTableEnd(Ui); PushWindowEnd(Ui, &AllEditsWindow); } @@ -2957,24 +2977,27 @@ DoWorldEditor(engine_resources *Engine) { - IterateOver(&Editor->WorldEdits, Edit, EditIndex) + IterateOver(&Editor->Layers, Layer, LayerIndex) { - auto EditAABB = GetSimSpaceAABB(World, Edit->Region); - random_series S = {u64(Edit)}; - v3 BaseColor = RandomV3Unilateral(&S); - - f32 Size = DEFAULT_LINE_THICKNESS; - if (Edit == Editor->CurrentEdit) + IterateOver(&Layer->Edits, Edit, BrushIndex) { - Size = 3.f*DEFAULT_LINE_THICKNESS; - } + auto EditAABB = GetSimSpaceAABB(World, Edit->Region); + random_series S = {u64(Edit)}; + v3 BaseColor = RandomV3Unilateral(&S); - if (Edit == Editor->HotEdit) - { - Size = 5.f*DEFAULT_LINE_THICKNESS; - } + f32 Size = DEFAULT_LINE_THICKNESS; + if (Edit == Editor->CurrentEdit) + { + Size = 3.f*DEFAULT_LINE_THICKNESS; + } + + if (Edit == Editor->HotEdit) + { + Size = 5.f*DEFAULT_LINE_THICKNESS; + } - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); + } } Editor->HotEdit = 0; } @@ -3061,7 +3084,7 @@ DoLevelWindow(engine_resources *Engine) Header.Camera = *Camera; Header.RenderSettings = Graphics->Settings; Header.EntityCount = EntityCount; - Header.EditCount = u32(TotalElements(&Editor->WorldEdits)); + Header.LayerCount = u32(TotalElements(&Editor->Layers)); { cs Filename = Engine->Graphics.TerrainShapingRC.Program.FragSourceFilename; @@ -3080,9 +3103,14 @@ DoLevelWindow(engine_resources *Engine) Ensure(Serialize(&OutputStream, &Delimeter)); #if 1 - IterateOver(&Editor->WorldEdits, Edit, EditIndex) + IterateOver(&Editor->Layers, Layer, LayerIndex) { - Serialize(&OutputStream, Edit); + u32 EditCount = u32(TotalElements(&Layer->Edits)); + Serialize(&OutputStream, &EditCount); + IterateOver(&Layer->Edits, Edit, EditIndex) + { + Serialize(&OutputStream, Edit); + } } #else RangeIterator(HashIndex, s32(World->HashSize)) @@ -3178,19 +3206,20 @@ DoLevelWindow(engine_resources *Engine) s32 ChunkCount = 0; /* Info("ChunksFreed (%u) ChunksLoaded (%u)", ChunksFreed, ChunkCount); */ - RangeIterator_t(u32, EditIndex, LevelHeader.EditCount) - { - world_edit DeserEdit = {}; // TODO(Jesse): Do we actually have to clear this? - Deserialize(&LevelBytes, &DeserEdit, GetTranArena()); - - world_edit *FinalEdit = Push(&Editor->WorldEdits, &DeserEdit); - if (FinalEdit->Brush) - { - FinalEdit->Brush = Upsert(*FinalEdit->Brush, &Editor->LoadedBrushes, Editor->Memory); - } - - ApplyEditToOctree(Engine, FinalEdit, GetTranArena()); - } + NotImplemented; + /* RangeIterator_t(u32, EditIndex, LevelHeader.EditCount) */ + /* { */ + /* world_edit DeserEdit = {}; // TODO(Jesse): Do we actually have to clear this? */ + /* Deserialize(&LevelBytes, &DeserEdit, GetTranArena()); */ + + /* world_edit *FinalEdit = Push(&Editor->WorldEdits, &DeserEdit); */ + /* if (FinalEdit->Brush) */ + /* { */ + /* FinalEdit->Brush = Upsert(*FinalEdit->Brush, &Editor->LoadedBrushes, Editor->Memory); */ + /* } */ + + /* ApplyEditToOctree(Engine, FinalEdit, GetTranArena()); */ + /* } */ Ensure(Read_u64(&LevelBytes) == Delimeter); diff --git a/src/engine/editor.h b/src/engine/editor.h index 5f4212f3f..722fa035f 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1138,10 +1138,10 @@ Hash(world_edit_brush *Brush) poof(are_equal(world_edit_brush)) -#include +#include poof(hashtable(world_edit_brush)) -#include +#include struct world_edit { @@ -1153,10 +1153,18 @@ struct world_edit typedef world_edit* world_edit_ptr; poof(block_array(world_edit, {128})) -#include +#include + poof(block_array(world_edit_ptr, {128})) #include +struct world_edit_layer +{ + char NameBuf[NameBuf_Len+1]; + world_edit_block_array Edits; +}; +poof(block_array(world_edit_layer, {128})) +#include struct level_editor { @@ -1189,9 +1197,14 @@ struct level_editor b32 MaskSelection; u32 NextEditOrdinal; - world_edit_block_array WorldEdits; + /* world_edit_block_array WorldEdits; */ + world_edit_layer_block_array Layers; world_edit_brush_hashtable LoadedBrushes; + + world_edit_layer *CurrentLayer; + world_edit_layer *HotLayer; + world_edit *CurrentEdit; world_edit *HotEdit; diff --git a/src/engine/level.h b/src/engine/level.h index 95255c8b6..6f848bf3f 100644 --- a/src/engine/level.h +++ b/src/engine/level.h @@ -2,7 +2,7 @@ struct level_header { - u32 EditCount; + u32 LayerCount; u32 EntityCount; // World Params From 60fece40c3972db0949cb1bb49ea68748a0d71f6 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 3 May 2025 13:01:16 -0700 Subject: [PATCH 216/421] Add enum that drives visible region size --- examples/terrain_gen/game.cpp | 10 +- examples/terrain_gen/game_constants.h | 4 +- external/bonsai_stdlib | 2 +- generated/are_equal_octree_node.h | 2 +- .../block_array_octree_node_ptr_688853862.h | 2 +- ...block_array_picked_octree_node_688853862.h | 2 +- generated/buffer_octree_node_ptr.h | 2 +- generated/deserialize_struct_level_header.h | 5 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 6 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- generated/do_editor_ui_for_enum_enum.h | 410 ++++++++++++++++++ ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 172 ++++++++ generated/freelist_allocator_octree_node.h | 2 +- generated/freelist_allocator_world_chunk.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- generated/serialize_struct_level_header.h | 4 +- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 44 ++ ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...ing_and_value_tables_visible_region_size.h | 89 ++++ src/engine/api.cpp | 17 +- src/engine/editor.cpp | 25 +- src/engine/editor.h | 2 +- src/engine/level.h | 3 +- src/engine/render.cpp | 2 +- src/engine/resources.cpp | 9 +- src/engine/world.cpp | 9 +- src/engine/world.h | 29 +- src/engine/world_chunk.cpp | 9 +- 121 files changed, 902 insertions(+), 153 deletions(-) create mode 100644 generated/do_editor_ui_for_enum_enum.h create mode 100644 generated/do_editor_ui_for_enum_visible_region_size.h create mode 100644 generated/string_and_value_tables_enum_brush_layer_type.h create mode 100644 generated/string_and_value_tables_visible_region_size.h diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 441d5e965..10c178368 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -764,11 +764,13 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() world_position WorldCenter = V3i(100, 100, 0); canonical_position CameraTargetP = {}; - f32 DistanceFromTarget = Length(g_VisibleRegion/2.f); + auto VisibleRegionSize = VisibleRegionSize_256; + v3i VisibleRegion = V3i(VisibleRegionSize); + f32 DistanceFromTarget = Length(VisibleRegion/2.f); f32 FarClip = 150000.f; StandardCamera(Graphics->Camera, FarClip, DistanceFromTarget); - AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); + AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, VisibleRegionSize); GameState = Allocate(game_state, Resources->GameMemory, 1); @@ -793,8 +795,8 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* CameraGhost->P.WorldP = V3i(5, -73, 2); */ /* CameraGhost->P.WorldP = V3i(1000, 1000, 100); */ /* CameraGhost->P.WorldP = WorldCenter; */ - /* CameraGhost->P.WorldP = WorldCenter + g_VisibleRegion/2; */ - CameraGhost->P.WorldP = g_VisibleRegion/2; + /* CameraGhost->P.WorldP = WorldCenter + VisibleRegion/2; */ + CameraGhost->P.WorldP = VisibleRegion/2; CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); SpawnEntity(CameraGhost); diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index bb603affb..961bf18dc 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -8,7 +8,7 @@ WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); #else -global_variable chunk_dimension +/* global_variable chunk_dimension */ /* g_VisibleRegion = Chunk_Dimension(8192*32, 8192*32, 8192*32); // 1677km */ /* g_VisibleRegion = Chunk_Dimension(8192*8, 8192*8, 8192*8); // 416km */ /* g_VisibleRegion = Chunk_Dimension(8192*4, 8192*4, 8192*4); // 208km */ @@ -19,7 +19,7 @@ global_variable chunk_dimension /* g_VisibleRegion = Chunk_Dimension(1024, 1024, 1024); */ /* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ /* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ -g_VisibleRegion = Chunk_Dimension(128, 128, 128); +/* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ /* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ /* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ /* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 6e893d179..767f807da 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 6e893d179bf8af3049fb10e342bda993eec470e4 +Subproject commit 767f807daf84913627ee242345cc6342a246dbd4 diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index a01b374ee..0011eec00 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:47:0 +// src/engine/world.h:68:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index d0540547a..20d7484c4 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:61:0 +// src/engine/world.h:82:0 diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 925a66027..fc525b539 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:64:0 +// src/engine/world.h:85:0 diff --git a/generated/buffer_octree_node_ptr.h b/generated/buffer_octree_node_ptr.h index 80bd094f2..acf29ddd5 100644 --- a/generated/buffer_octree_node_ptr.h +++ b/generated/buffer_octree_node_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world.h:38:0 +// src/engine/world.h:59:0 struct octree_node_ptr_buffer { diff --git a/generated/deserialize_struct_level_header.h b/generated/deserialize_struct_level_header.h index 21e2b3fe9..d8e71bba3 100644 --- a/generated/deserialize_struct_level_header.h +++ b/generated/deserialize_struct_level_header.h @@ -37,10 +37,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->VisibleRegion, Memory); - + Element->VisibleRegionSize = Cast(visible_region_size, Read_u32(Bytes)); diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index c21529e56..788f58bce 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:215:0 +// src/engine/editor.cpp:220:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index a860ae82c..6ae27688f 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:354:0 +// src/engine/editor.cpp:359:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index d7d2064b6..49c8b78e1 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:346:0 +// src/engine/editor.cpp:351:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 51e41b19f..33b4f8ae1 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:254:0 +// src/engine/editor.cpp:259:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 3e697fdd6..e3ec8a4ad 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:221:0 +// src/engine/editor.cpp:226:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 28da71490..fc176b8cf 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:154:0 +// src/engine/editor.cpp:159:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 1ce3f7bf4..29753b1fa 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:263:0 +// src/engine/editor.cpp:268:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 3bdda570d..b1d5c7662 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:109:0 +// src/engine/editor.cpp:114:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 955da65ec..50e71c48b 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:248:0 +// src/engine/editor.cpp:253:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index d3881981b..4a4212605 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:287:0 +// src/engine/editor.cpp:292:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 860ac3615..785af42e7 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:257:0 +// src/engine/editor.cpp:262:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 3803c737d..cff8316d3 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:357:0 +// src/engine/editor.cpp:362:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 148481930..3dd5cd0be 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:150:0 +// src/engine/editor.cpp:155:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 09c025de6..6747d8856 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:444:0 +// src/engine/editor.cpp:449:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index fc38ca520..81cab58e8 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:465:0 +// src/engine/editor.cpp:470:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 40ae3a952..0d1f23a76 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:462:0 +// src/engine/editor.cpp:467:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 092649211..b942b5cf3 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:326:0 +// src/engine/editor.cpp:331:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index ca5f97bb5..7a045f61d 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:323:0 +// src/engine/editor.cpp:328:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index e10bb3cb5..b90970298 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:360:0 +// src/engine/editor.cpp:365:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index e6fad80b7..b25499045 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:311:0 +// src/engine/editor.cpp:316:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index e861197e9..92f5b6ac1 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:245:0 +// src/engine/editor.cpp:250:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index f2259a4c2..60983072a 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:420:0 +// src/engine/editor.cpp:425:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 86d7e3fd4..9e6c06d43 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:414:0 +// src/engine/editor.cpp:419:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index beaf1a1b5..cd7e90644 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:293:0 +// src/engine/editor.cpp:298:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index ab71e5eab..a604f7540 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:296:0 +// src/engine/editor.cpp:301:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 938db9751..ede232b97 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:435:0 +// src/engine/editor.cpp:440:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index c9af18bf2..b9ae8a945 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:459:0 +// src/engine/editor.cpp:464:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 45ba6931c..29c45bac0 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:143:0 +// src/engine/editor.cpp:148:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 76c4b3cde..4b66a1b76 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:140:0 +// src/engine/editor.cpp:145:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 5d72af919..38a21b17c 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:212:0 +// src/engine/editor.cpp:217:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index b5bf9f970..648e243f0 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:266:0 +// src/engine/editor.cpp:271:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 3094860a5..b1eff0e49 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:455:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 8188534b5..e22402e41 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:417:0 +// src/engine/editor.cpp:422:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index f61f37a11..a34c98324 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:191:0 +// src/engine/editor.cpp:196:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 8078f24fe..881864345 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:299:0 +// src/engine/editor.cpp:304:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 40cf2bdfb..1841387da 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:302:0 +// src/engine/editor.cpp:307:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index a69e4eda6..cd43d2c1f 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:260:0 +// src/engine/editor.cpp:265:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 53e1a99f5..ea6f0482c 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:336:0 +// src/engine/editor.cpp:341:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 95a854b9b..e60dab470 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:206:0 +// src/engine/editor.cpp:211:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 6c32a2a88..ea9a06f05 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:209:0 +// src/engine/editor.cpp:214:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 7352710bc..01f1117e5 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:95:0 +// src/engine/editor.cpp:100:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index ecba284e3..1845a7b01 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:197:0 +// src/engine/editor.cpp:202:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 5997a35f0..290bf7ce4 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:242:0 +// src/engine/editor.cpp:247:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 2e52bdf57..f33635e2e 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:146:0 +// src/engine/editor.cpp:151:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 11ba0dfb0..713979e06 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:200:0 +// src/engine/editor.cpp:205:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index ac16393c7..202c0fcdb 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:408:0 +// src/engine/editor.cpp:413:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 0af3e338c..c8ad52c0f 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:438:0 +// src/engine/editor.cpp:443:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index a710f0d68..142a5bedd 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:194:0 +// src/engine/editor.cpp:199:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 146b0b04c..ee43eddcf 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:411:0 +// src/engine/editor.cpp:416:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index f017c4429..1e36e4d79 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:405:0 +// src/engine/editor.cpp:410:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 7635fb0b4..c0a18e5bb 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:107:0 +// src/engine/editor.cpp:112:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index cba2238a6..ccf552eaf 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:426:0 +// src/engine/editor.cpp:431:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 984e6d38c..aec454953 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:429:0 +// src/engine/editor.cpp:434:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index a4688b1a0..77852348e 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:423:0 +// src/engine/editor.cpp:428:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index d92da6a8e..47c899ba5 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:272:0 +// src/engine/editor.cpp:277:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 55ed2397f..13a45cbb1 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:269:0 +// src/engine/editor.cpp:274:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 96cd568e4..b99fcf79c 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:432:0 +// src/engine/editor.cpp:437:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 545181d6c..2feb60866 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:251:0 +// src/engine/editor.cpp:256:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 19131efa2..a4910b2ae 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:446:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 360a395a7..8c989023b 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:116:0 +// src/engine/editor.cpp:121:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 1a9d6a189..17dae8093 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:119:0 +// src/engine/editor.cpp:124:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 76b9b8de8..c79a34c49 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:224:0 +// src/engine/editor.cpp:229:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 184bc79d7..5b44c7025 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:218:0 +// src/engine/editor.cpp:223:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 49d67b770..68072f203 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:98:0 +// src/engine/editor.cpp:103:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 23dc91d9d..f0b53074c 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:290:0 +// src/engine/editor.cpp:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 344a15db8..6a7de7570 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:281:0 +// src/engine/editor.cpp:286:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 9e9991d5e..3f126f1f5 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:284:0 +// src/engine/editor.cpp:289:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index f4e677c8d..61a249c6d 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:92:0 +// src/engine/editor.cpp:97:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 3e7223de7..e32b0fcbd 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:137:0 +// src/engine/editor.cpp:142:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index ea2036d32..7940b20bd 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:134:0 +// src/engine/editor.cpp:139:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index ae9d09535..8492d52b4 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:339:0 +// src/engine/editor.cpp:344:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -45,8 +45,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->VisibleRegion), - CSz("VisibleRegion"), + Cast(visible_region_size*, &Element->VisibleRegionSize), + CSz("VisibleRegionSize"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index b2e48c5fe..2c6b11d67 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:333:0 +// src/engine/editor.cpp:338:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index 7cb857bc1..71516be7f 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:275:0 +// src/engine/editor.cpp:280:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index bfc50a7d1..639de83b7 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:103:0 +// src/engine/editor.cpp:108:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 9d7ce3cdf..6b4d15bd8 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:101:0 +// src/engine/editor.cpp:106:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 1b4343d31..e0310efe0 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:330:0 +// src/engine/editor.cpp:335:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 46e94c999..4aab964bf 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:305:0 +// src/engine/editor.cpp:310:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 0c2e83a2a..fc523fa4d 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:128:0 +// src/engine/editor.cpp:133:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 1b5525ae2..6d5f4539f 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:113:0 +// src/engine/editor.cpp:118:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 2518787d1..2aaaeaefa 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:351:0 +// src/engine/editor.cpp:356:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index f454a0f3d..62dfc022e 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:278:0 +// src/engine/editor.cpp:283:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 7195561db..2f6c97d14 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:452:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 8fea27923..ec12d22a7 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:182:0 +// src/engine/editor.cpp:187:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 39969ae72..f0504fb8b 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:179:0 +// src/engine/editor.cpp:184:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_enum.h b/generated/do_editor_ui_for_enum_enum.h new file mode 100644 index 000000000..640bb3a56 --- /dev/null +++ b/generated/do_editor_ui_for_enum_enum.h @@ -0,0 +1,410 @@ +// src/engine/editor.cpp:91:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + { + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("1"), UiId(Window, "enum VisibleRegionSize_1", Element), Params)) + { + if (VisibleRegionSize_1 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_1) == VisibleRegionSize_1) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_1); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_1); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("2"), UiId(Window, "enum VisibleRegionSize_2", Element), Params)) + { + if (VisibleRegionSize_2 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_2) == VisibleRegionSize_2) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_2); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_2); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("4"), UiId(Window, "enum VisibleRegionSize_4", Element), Params)) + { + if (VisibleRegionSize_4 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_4) == VisibleRegionSize_4) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_4); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_4); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("8"), UiId(Window, "enum VisibleRegionSize_8", Element), Params)) + { + if (VisibleRegionSize_8 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_8) == VisibleRegionSize_8) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_8); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_8); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("16"), UiId(Window, "enum VisibleRegionSize_16", Element), Params)) + { + if (VisibleRegionSize_16 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_16) == VisibleRegionSize_16) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_16); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_16); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("32"), UiId(Window, "enum VisibleRegionSize_32", Element), Params)) + { + if (VisibleRegionSize_32 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_32) == VisibleRegionSize_32) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_32); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_32); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("64"), UiId(Window, "enum VisibleRegionSize_64", Element), Params)) + { + if (VisibleRegionSize_64 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_64) == VisibleRegionSize_64) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_64); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_64); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("128"), UiId(Window, "enum VisibleRegionSize_128", Element), Params)) + { + if (VisibleRegionSize_128 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_128) == VisibleRegionSize_128) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_128); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_128); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("256"), UiId(Window, "enum VisibleRegionSize_256", Element), Params)) + { + if (VisibleRegionSize_256 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_256) == VisibleRegionSize_256) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_256); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_256); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("512"), UiId(Window, "enum VisibleRegionSize_512", Element), Params)) + { + if (VisibleRegionSize_512 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_512) == VisibleRegionSize_512) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_512); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_512); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("1024"), UiId(Window, "enum VisibleRegionSize_1024", Element), Params)) + { + if (VisibleRegionSize_1024 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_1024) == VisibleRegionSize_1024) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_1024); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_1024); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("2048"), UiId(Window, "enum VisibleRegionSize_2048", Element), Params)) + { + if (VisibleRegionSize_2048 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_2048) == VisibleRegionSize_2048) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_2048); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_2048); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("4096"), UiId(Window, "enum VisibleRegionSize_4096", Element), Params)) + { + if (VisibleRegionSize_4096 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_4096) == VisibleRegionSize_4096) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_4096); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_4096); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("8192"), UiId(Window, "enum VisibleRegionSize_8192", Element), Params)) + { + if (VisibleRegionSize_8192 == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_8192) == VisibleRegionSize_8192) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_8192); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_8192); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("16k"), UiId(Window, "enum VisibleRegionSize_16k", Element), Params)) + { + if (VisibleRegionSize_16k == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_16k) == VisibleRegionSize_16k) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_16k); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_16k); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("32k"), UiId(Window, "enum VisibleRegionSize_32k", Element), Params)) + { + if (VisibleRegionSize_32k == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_32k) == VisibleRegionSize_32k) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_32k); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_32k); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("64k"), UiId(Window, "enum VisibleRegionSize_64k", Element), Params)) + { + if (VisibleRegionSize_64k == visible_region_size(0)) + { + *Element = visible_region_size(0); + } + else + { + if ((*Element & VisibleRegionSize_64k) == VisibleRegionSize_64k) + { + *Element = visible_region_size(*Element&~VisibleRegionSize_64k); + } + else + { + *Element = visible_region_size(*Element|VisibleRegionSize_64k); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + } + else + { + PushNewRow(Ui); + } +} + diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 387b2b4ac..3e8029c26 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:308:0 +// src/engine/editor.cpp:313:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index df170ea2c..eaa11a3ee 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:203:0 +// src/engine/editor.cpp:208:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index fc7bc0974..1305bf1cb 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index afcb184a3..c6b8ec0d5 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:461:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 63003e711..023fb1e92 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:105:0 +// src/engine/editor.cpp:110:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index e83995368..09d031fe8 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:185:0 +// src/engine/editor.cpp:190:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h new file mode 100644 index 000000000..2ab53ea9b --- /dev/null +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -0,0 +1,172 @@ +// src/engine/editor.cpp:93:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + { + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("1"), UiId(Window, "enum VisibleRegionSize_1", Element), Params)) + { + *Element = VisibleRegionSize_1; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("2"), UiId(Window, "enum VisibleRegionSize_2", Element), Params)) + { + *Element = VisibleRegionSize_2; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("4"), UiId(Window, "enum VisibleRegionSize_4", Element), Params)) + { + *Element = VisibleRegionSize_4; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("8"), UiId(Window, "enum VisibleRegionSize_8", Element), Params)) + { + *Element = VisibleRegionSize_8; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("16"), UiId(Window, "enum VisibleRegionSize_16", Element), Params)) + { + *Element = VisibleRegionSize_16; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("32"), UiId(Window, "enum VisibleRegionSize_32", Element), Params)) + { + *Element = VisibleRegionSize_32; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("64"), UiId(Window, "enum VisibleRegionSize_64", Element), Params)) + { + *Element = VisibleRegionSize_64; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("128"), UiId(Window, "enum VisibleRegionSize_128", Element), Params)) + { + *Element = VisibleRegionSize_128; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("256"), UiId(Window, "enum VisibleRegionSize_256", Element), Params)) + { + *Element = VisibleRegionSize_256; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("512"), UiId(Window, "enum VisibleRegionSize_512", Element), Params)) + { + *Element = VisibleRegionSize_512; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("1024"), UiId(Window, "enum VisibleRegionSize_1024", Element), Params)) + { + *Element = VisibleRegionSize_1024; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("2048"), UiId(Window, "enum VisibleRegionSize_2048", Element), Params)) + { + *Element = VisibleRegionSize_2048; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("4096"), UiId(Window, "enum VisibleRegionSize_4096", Element), Params)) + { + *Element = VisibleRegionSize_4096; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("8192"), UiId(Window, "enum VisibleRegionSize_8192", Element), Params)) + { + *Element = VisibleRegionSize_8192; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("16k"), UiId(Window, "enum VisibleRegionSize_16k", Element), Params)) + { + *Element = VisibleRegionSize_16k; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("32k"), UiId(Window, "enum VisibleRegionSize_32k", Element), Params)) + { + *Element = VisibleRegionSize_32k; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("64k"), UiId(Window, "enum VisibleRegionSize_64k", Element), Params)) + { + *Element = VisibleRegionSize_64k; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + } + else + { + PushNewRow(Ui); + } +} + diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index d8b6017f7..978abbd54 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:52:0 +// src/engine/world.h:73:0 struct octree_node_freelist { diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h index 52552c609..0b9bb9b7e 100644 --- a/generated/freelist_allocator_world_chunk.h +++ b/generated/freelist_allocator_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/world.h:55:0 +// src/engine/world.h:76:0 struct world_chunk_freelist { diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index fb6e89c11..1ec348541 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:58:0 +// src/engine/world.h:79:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index 91b1db74c..78654987a 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:49:0 +// src/engine/world.h:70:0 struct octree_node_ptr_stack { diff --git a/generated/serialize_struct_level_header.h b/generated/serialize_struct_level_header.h index 22c7954a4..7d3c50057 100644 --- a/generated/serialize_struct_level_header.h +++ b/generated/serialize_struct_level_header.h @@ -55,9 +55,7 @@ Serialize(u8_cursor_block_array *Bytes, level_header *BaseElement, umm Count = 1 - Result &= Serialize(Bytes, &Element->VisibleRegion); // default - - + Result &= Serialize(Bytes, (u32*)&Element->VisibleRegionSize); // enum diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 6a449257b..2b4e1dfe6 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:349:0 +// src/engine/editor.cpp:354:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 9032cfb4b..fb00654b0 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:175:0 +// src/engine/editor.cpp:180:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h new file mode 100644 index 000000000..6e0bc7f60 --- /dev/null +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -0,0 +1,44 @@ +// src/engine/editor.h:903:0 + +link_internal counted_string +ToStringPrefixless(brush_layer_type Type) +{ + counted_string Result = {}; + switch (Type) + { + case BrushLayerType_Noise: { Result = CSz("Noise"); } break; + case BrushLayerType_Shape: { Result = CSz("Shape"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(brush_layer_type Type) +{ + counted_string Result = {}; + switch (Type) + { + case BrushLayerType_Noise: { Result = CSz("BrushLayerType_Noise"); } break; + case BrushLayerType_Shape: { Result = CSz("BrushLayerType_Shape"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal brush_layer_type +BrushLayerType(counted_string S) +{ + brush_layer_type Result = {}; + + if (StringsMatch(S, CSz("BrushLayerType_Noise"))) { return BrushLayerType_Noise; } + if (StringsMatch(S, CSz("BrushLayerType_Shape"))) { return BrushLayerType_Shape; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 7042806dc..b5ac7e7fc 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:169:0 +// src/engine/editor.cpp:174:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index aa541fc46..83c26607a 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:166:0 +// src/engine/editor.cpp:171:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 06e109ffc..769580af0 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:172:0 +// src/engine/editor.cpp:177:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h new file mode 100644 index 000000000..ced23a627 --- /dev/null +++ b/generated/string_and_value_tables_visible_region_size.h @@ -0,0 +1,89 @@ +// src/engine/editor.cpp:91:0 + +link_internal counted_string +ToStringPrefixless(visible_region_size Type) +{ + counted_string Result = {}; + switch (Type) + { + case VisibleRegionSize_1: { Result = CSz("1"); } break; + case VisibleRegionSize_2: { Result = CSz("2"); } break; + case VisibleRegionSize_4: { Result = CSz("4"); } break; + case VisibleRegionSize_8: { Result = CSz("8"); } break; + case VisibleRegionSize_16: { Result = CSz("16"); } break; + case VisibleRegionSize_32: { Result = CSz("32"); } break; + case VisibleRegionSize_64: { Result = CSz("64"); } break; + case VisibleRegionSize_128: { Result = CSz("128"); } break; + case VisibleRegionSize_256: { Result = CSz("256"); } break; + case VisibleRegionSize_512: { Result = CSz("512"); } break; + case VisibleRegionSize_1024: { Result = CSz("1024"); } break; + case VisibleRegionSize_2048: { Result = CSz("2048"); } break; + case VisibleRegionSize_4096: { Result = CSz("4096"); } break; + case VisibleRegionSize_8192: { Result = CSz("8192"); } break; + case VisibleRegionSize_16k: { Result = CSz("16k"); } break; + case VisibleRegionSize_32k: { Result = CSz("32k"); } break; + case VisibleRegionSize_64k: { Result = CSz("64k"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(visible_region_size Type) +{ + counted_string Result = {}; + switch (Type) + { + case VisibleRegionSize_1: { Result = CSz("VisibleRegionSize_1"); } break; + case VisibleRegionSize_2: { Result = CSz("VisibleRegionSize_2"); } break; + case VisibleRegionSize_4: { Result = CSz("VisibleRegionSize_4"); } break; + case VisibleRegionSize_8: { Result = CSz("VisibleRegionSize_8"); } break; + case VisibleRegionSize_16: { Result = CSz("VisibleRegionSize_16"); } break; + case VisibleRegionSize_32: { Result = CSz("VisibleRegionSize_32"); } break; + case VisibleRegionSize_64: { Result = CSz("VisibleRegionSize_64"); } break; + case VisibleRegionSize_128: { Result = CSz("VisibleRegionSize_128"); } break; + case VisibleRegionSize_256: { Result = CSz("VisibleRegionSize_256"); } break; + case VisibleRegionSize_512: { Result = CSz("VisibleRegionSize_512"); } break; + case VisibleRegionSize_1024: { Result = CSz("VisibleRegionSize_1024"); } break; + case VisibleRegionSize_2048: { Result = CSz("VisibleRegionSize_2048"); } break; + case VisibleRegionSize_4096: { Result = CSz("VisibleRegionSize_4096"); } break; + case VisibleRegionSize_8192: { Result = CSz("VisibleRegionSize_8192"); } break; + case VisibleRegionSize_16k: { Result = CSz("VisibleRegionSize_16k"); } break; + case VisibleRegionSize_32k: { Result = CSz("VisibleRegionSize_32k"); } break; + case VisibleRegionSize_64k: { Result = CSz("VisibleRegionSize_64k"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal visible_region_size +VisibleRegionSize(counted_string S) +{ + visible_region_size Result = {}; + + if (StringsMatch(S, CSz("VisibleRegionSize_1"))) { return VisibleRegionSize_1; } + if (StringsMatch(S, CSz("VisibleRegionSize_2"))) { return VisibleRegionSize_2; } + if (StringsMatch(S, CSz("VisibleRegionSize_4"))) { return VisibleRegionSize_4; } + if (StringsMatch(S, CSz("VisibleRegionSize_8"))) { return VisibleRegionSize_8; } + if (StringsMatch(S, CSz("VisibleRegionSize_16"))) { return VisibleRegionSize_16; } + if (StringsMatch(S, CSz("VisibleRegionSize_32"))) { return VisibleRegionSize_32; } + if (StringsMatch(S, CSz("VisibleRegionSize_64"))) { return VisibleRegionSize_64; } + if (StringsMatch(S, CSz("VisibleRegionSize_128"))) { return VisibleRegionSize_128; } + if (StringsMatch(S, CSz("VisibleRegionSize_256"))) { return VisibleRegionSize_256; } + if (StringsMatch(S, CSz("VisibleRegionSize_512"))) { return VisibleRegionSize_512; } + if (StringsMatch(S, CSz("VisibleRegionSize_1024"))) { return VisibleRegionSize_1024; } + if (StringsMatch(S, CSz("VisibleRegionSize_2048"))) { return VisibleRegionSize_2048; } + if (StringsMatch(S, CSz("VisibleRegionSize_4096"))) { return VisibleRegionSize_4096; } + if (StringsMatch(S, CSz("VisibleRegionSize_8192"))) { return VisibleRegionSize_8192; } + if (StringsMatch(S, CSz("VisibleRegionSize_16k"))) { return VisibleRegionSize_16k; } + if (StringsMatch(S, CSz("VisibleRegionSize_32k"))) { return VisibleRegionSize_32k; } + if (StringsMatch(S, CSz("VisibleRegionSize_64k"))) { return VisibleRegionSize_64k; } + + return Result; +} + + diff --git a/src/engine/api.cpp b/src/engine/api.cpp index bf2b2aace..8e310aa04 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -39,7 +39,7 @@ SimulateCameraGhost_AndSet_OffsetWorldCenterToGrid(engine_resources *Engine) if (entity *CameraGhost = GetEntity(EntityTable, Camera->GhostId)) { - SimulateEntity(Engine, CameraGhost, Plat->dt, World->VisibleRegion, &GpuMap->Buffer, &Graphics->Transparency.GpuBuffer.Buffer, &Plat->HighPriority); + SimulateEntity(Engine, CameraGhost, Plat->dt, V3i(World->VisibleRegionSize), &GpuMap->Buffer, &Graphics->Transparency.GpuBuffer.Buffer, &Plat->HighPriority); v3 CameraTargetSimP = GetSimSpaceP(World, CameraGhost); Graphics->OffsetOfWorldCenterToGrid = (CameraTargetSimP % V3(Graphics->Settings.MajorGridDim)); @@ -87,7 +87,17 @@ Bonsai_FrameBegin(engine_resources *Resources) // Resources->FrameIndex += 1; - if (Resources->Graphics.TerrainShapingRC.Program.HotReloaded || + + b32 VRChanged = False; + DETECT_CHANGES_ON(Resources->World->VisibleRegionSize, PrevValue, + { + Info("Changed From (%S) to (%S)", ToString(PrevValue), ToString(Resources->World->VisibleRegionSize)); + VRChanged = True; + }); + + + if (VRChanged || + Resources->Graphics.TerrainShapingRC.Program.HotReloaded || Resources->Graphics.TerrainDerivsRC.Program.HotReloaded || Resources->Graphics.TerrainDecorationRC.Program.HotReloaded) { @@ -133,7 +143,6 @@ Bonsai_FrameBegin(engine_resources *Resources) UNPACK_ENGINE_RESOURCES(Resources); - if (GetEngineDebug()->DrawWorldAxies) { untextured_3d_geometry_buffer CopyDest = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL*3); @@ -373,7 +382,7 @@ Bonsai_Simulate(engine_resources *Resources) UNPACK_ENGINE_RESOURCES(Resources); - SimulateEntities(Resources, Plat->dt, World->VisibleRegion, &GpuMap->Buffer, &Graphics->Transparency.GpuBuffer.Buffer, &Plat->HighPriority); + SimulateEntities(Resources, Plat->dt, V3i(World->VisibleRegionSize), &GpuMap->Buffer, &Graphics->Transparency.GpuBuffer.Buffer, &Plat->HighPriority); /* DispatchSimulateParticleSystemJobs(&Plat->HighPriority, EntityTable, World->ChunkDim, &GpuMap->Buffer, Graphics, Plat->dt); */ UnsignalFutex(&Resources->Stdlib.Plat.HighPriorityModeFutex); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index f2e6f75b1..65e199286 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -88,6 +88,11 @@ GetUiDebug() } +poof(string_and_value_tables(visible_region_size)) +#include +poof(do_editor_ui_for_enum(visible_region_size)) +#include + poof(do_editor_ui_for_compound_type(white_noise_params)) #include @@ -3079,12 +3084,12 @@ DoLevelWindow(engine_resources *Engine) level_header Header = {}; - Header.WorldCenter = World->Center; - Header.VisibleRegion = World->VisibleRegion; - Header.Camera = *Camera; - Header.RenderSettings = Graphics->Settings; - Header.EntityCount = EntityCount; - Header.LayerCount = u32(TotalElements(&Editor->Layers)); + Header.WorldCenter = World->Center; + Header.VisibleRegionSize = World->VisibleRegionSize; + Header.Camera = *Camera; + Header.RenderSettings = Graphics->Settings; + Header.EntityCount = EntityCount; + Header.LayerCount = u32(TotalElements(&Editor->Layers)); { cs Filename = Engine->Graphics.TerrainShapingRC.Program.FragSourceFilename; @@ -3181,10 +3186,10 @@ DoLevelWindow(engine_resources *Engine) SignalAndWaitForWorkers(&Plat->WorkerThreadsSuspendFutex); - Graphics->Settings = LevelHeader.RenderSettings; - *Graphics->Camera = LevelHeader.Camera; - World->VisibleRegion = LevelHeader.VisibleRegion; - World->Center = LevelHeader.WorldCenter; + Graphics->Settings = LevelHeader.RenderSettings; + *Graphics->Camera = LevelHeader.Camera; + World->VisibleRegionSize = LevelHeader.VisibleRegionSize; + World->Center = LevelHeader.WorldCenter; /* Global_ProjectSwitcherGameLibName = LevelHeader.TerrainGenShader; */ diff --git a/src/engine/editor.h b/src/engine/editor.h index 722fa035f..2c7d02e02 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -901,7 +901,7 @@ enum brush_layer_type }; poof(string_and_value_tables(brush_layer_type)) -#include +#include poof(do_editor_ui_for_radio_enum(brush_layer_type)) #include diff --git a/src/engine/level.h b/src/engine/level.h index 6f848bf3f..536e97bc8 100644 --- a/src/engine/level.h +++ b/src/engine/level.h @@ -7,7 +7,8 @@ struct level_header // World Params v3i WorldCenter; - v3i VisibleRegion; + /* v3i VisibleRegion; */ + visible_region_size VisibleRegionSize; camera Camera; diff --git a/src/engine/render.cpp b/src/engine/render.cpp index cc31df7c5..41c1ebf2d 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1619,7 +1619,7 @@ DrawWorldAndEntitiesToShadowMap(v2i ShadowMapResolution, engine_resources *Engin UNPACK_ENGINE_RESOURCES(Engine); - v3i Radius = World->VisibleRegion/2; + v3i Radius = V3i(World->VisibleRegionSize/2); v3i Min = World->Center - Radius; v3i Max = World->Center + Radius; diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index aba4d9362..6bf4cbb08 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -212,12 +212,13 @@ HardResetWorld(engine_resources *Engine) VaporizeArena(World->ChunkMemory); VaporizeArena(World->OctreeMemory); - v3i Center = World->Center; - v3i ChunkDim = World->ChunkDim; - v3i VisibleRegion = World->VisibleRegion; + v3i Center = World->Center; + v3i ChunkDim = World->ChunkDim; + auto VisibleRegionSize = World->VisibleRegionSize; + Clear(World); - AllocateWorld(World, Center, ChunkDim, VisibleRegion); + AllocateWorld(World, Center, ChunkDim, VisibleRegionSize); } link_internal void diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 57d3bd0be..0ddfcd609 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -3,7 +3,7 @@ debug_global u32 DeferrFreedNodes; debug_global u32 FreedNodes; link_internal world * -AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) +AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, visible_region_size VisibleRegionSize) { Clear(World); @@ -23,8 +23,6 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) /* World->ChunkHash = World->ChunkHashMemory[0]; */ /* World->FreeChunks = Allocate(world_chunk*, WorldChunkMemory, FREELIST_SIZE ); */ - Assert(VisibleRegion.x == VisibleRegion.y); - Assert(VisibleRegion.y == VisibleRegion.z); Assert(WorldChunkDim.x == WorldChunkDim.y); Assert(WorldChunkDim.y == WorldChunkDim.z); @@ -33,10 +31,11 @@ AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion) World->OctreeNodeFreelist.Memory = World->OctreeMemory; World->ChunkDim = WorldChunkDim; - World->VisibleRegion = VisibleRegion; + World->VisibleRegionSize = VisibleRegionSize; World->Center = Center; // NOTE(Jesse): Has to come after World->ChunkDim is set + v3i VisibleRegion = V3i(VisibleRegionSize); InitOctreeNode(World, &World->Root, {}, VisibleRegion, {}); World->Root.Chunk = AllocateWorldChunk( {}, WorldChunkDim, VisibleRegion, World->ChunkMemory); @@ -532,7 +531,7 @@ DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats } } -#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (4) +#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (6) link_internal v3i ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) diff --git a/src/engine/world.h b/src/engine/world.h index 778a0fe0e..4f892365b 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -1,3 +1,24 @@ +enum visible_region_size +{ + VisibleRegionSize_1 = (1 << 0), + VisibleRegionSize_2 = (1 << 1), + VisibleRegionSize_4 = (1 << 2), + VisibleRegionSize_8 = (1 << 3), + VisibleRegionSize_16 = (1 << 4), + VisibleRegionSize_32 = (1 << 5), + VisibleRegionSize_64 = (1 << 6), + VisibleRegionSize_128 = (1 << 7), + VisibleRegionSize_256 = (1 << 8), + VisibleRegionSize_512 = (1 << 9), // 3.3 km + VisibleRegionSize_1024 = (1 << 10), // 6.6 km + VisibleRegionSize_2048 = (1 << 11), // 13.1 km + VisibleRegionSize_4096 = (1 << 12), // 26.2 km + VisibleRegionSize_8192 = (1 << 13), // 52.4 km + VisibleRegionSize_16k = (1 << 14), // 104.8 km + VisibleRegionSize_32k = (1 << 15), // 209.6 km + VisibleRegionSize_64k = (1 << 16), // 419.2 km +}; + enum octree_node_type { OctreeNodeType_Undefined, @@ -66,8 +87,8 @@ poof(block_array(picked_octree_node, {32})) struct world { - v3i Center; // the world chunk position of the center of the visible region - v3i VisibleRegion; // The number of chunks in xyz we're going to update and render + v3i Center; // the world chunk position of the center of the visible region + visible_region_size VisibleRegionSize; // The number of chunks in xyz we're going to update and render /* u32 HashSlotsUsed; */ /* u32 HashSize; */ @@ -195,7 +216,7 @@ link_internal rect3i GetVisibleRegionRect(world *World) { world_position CenterP = World->Center; - chunk_dimension Radius = (World->VisibleRegion/2); + chunk_dimension Radius = V3i(World->VisibleRegionSize/2); world_position Min = CenterP - Radius; world_position Max = CenterP + Radius + 1; // Add one so we can pass to functions that expect an open-interval @@ -253,7 +274,7 @@ link_internal void InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks, world_edit_ptr_paged_list *PotentialEdits); link_internal world * -AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, v3i VisibleRegion); +AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, visible_region_size VisibleRegion); link_internal rect3cp GetBoundingBox(world *World, octree_node *Node); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 6e2dfa393..7f69317af 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -4098,10 +4098,11 @@ GetChunksIntersectingRay(world *World, ray *Ray, picked_world_chunk_static_buffe { octree_node *ClosestNode = 0; - chunk_dimension VisibleRegion = World->VisibleRegion; - chunk_dimension Radius = VisibleRegion/2; - world_position Min = World->Center - Radius; - world_position Max = World->Center + Radius; + v3i VisibleRegion = V3i(World->VisibleRegionSize); + + v3i Radius = VisibleRegion/2; + v3i Min = World->Center - Radius; + v3i Max = World->Center + Radius; f32 tChunkMin = 0.f; for (s32 z = Min.z; z < Max.z; ++ z) From 32cb4005a26a00a66462c445bdc8109e456cf8dc Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 3 May 2025 13:25:32 -0700 Subject: [PATCH 217/421] Change VR to 32 in terrain_gen --- brushes/soft_eraser.brush | Bin 0 -> 785 bytes examples/terrain_gen/game.cpp | 2 +- .../shaping/terrain_shaping.fragmentshader | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 brushes/soft_eraser.brush diff --git a/brushes/soft_eraser.brush b/brushes/soft_eraser.brush new file mode 100644 index 0000000000000000000000000000000000000000..455a63e0aa756c9cda478bab715cd6a75c88e835 GIT binary patch literal 785 zcmd^-K?=e^3`HGX3Z9`iDLu(hA=ZMlFc}x_Jdj6pVbaMbS@Z@@8D4nFpG9aov~x5j z*+rG28Wu2MwV|-D;BXJDlyxwZ2GBOnl{wZ`xai4K%((17= zThAceZtz2>rQJ!t-QYE|9XJpk-1BgtzV9`X{x7(3hj~zEVvS5fVceU617jq(UcB75 L?+{JUgD~I^qN2ul literal 0 HcmV?d00001 diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 10c178368..755b75ee5 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -764,7 +764,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() world_position WorldCenter = V3i(100, 100, 0); canonical_position CameraTargetP = {}; - auto VisibleRegionSize = VisibleRegionSize_256; + auto VisibleRegionSize = VisibleRegionSize_32; v3i VisibleRegion = V3i(VisibleRegionSize); f32 DistanceFromTarget = Length(VisibleRegion/2.f); f32 FarClip = 150000.f; diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index bc1022a49..687d3bca8 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -273,7 +273,7 @@ void main() #if 1 v3 Period = V3(200.f); float Amplitude = 150.f; - f32 StartingZDepth = 7000.f; + f32 StartingZDepth = 0000.f; NoiseValue = StartingZDepth; From 6779b61ea496f4de239b199469bb43743ef077fb Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 3 May 2025 14:29:36 -0700 Subject: [PATCH 218/421] Update stdlib --- external/bonsai_stdlib | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- jesse.make.sh | 2 +- shaders/terrain/shaping/terrain_shaping.fragmentshader | 9 ++++++--- src/engine/editor.cpp | 4 ++++ 14 files changed, 22 insertions(+), 12 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 767f807da..67a8945de 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 767f807daf84913627ee242345cc6342a246dbd4 +Subproject commit 67a8945debf8152c3d1702a138265278e9e4a86a diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 43ad2d4c9..b278fa914 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -742,6 +742,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 6421709f8..38eeda829 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -732,6 +732,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 9b3860b05..fa785d11c 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -732,6 +732,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 70038eac4..92b0a1b64 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:288:0 +// external/bonsai_stdlib/src/shader.cpp:320:0 b32 SetShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 277ccfcfd..43aa9e0d7 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:303:0 +// external/bonsai_stdlib/src/shader.cpp:335:0 b32 SetShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index dc6a72510..bc2ba9fa1 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:300:0 +// external/bonsai_stdlib/src/shader.cpp:332:0 b32 SetShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index aa659a662..e8cc2f373 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:285:0 +// external/bonsai_stdlib/src/shader.cpp:317:0 b32 SetShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 742b8451f..5e3161673 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:297:0 +// external/bonsai_stdlib/src/shader.cpp:329:0 b32 SetShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index e3bf1ceb7..4a4b48e31 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:291:0 +// external/bonsai_stdlib/src/shader.cpp:323:0 b32 SetShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index 641f17968..d850a488a 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:294:0 +// external/bonsai_stdlib/src/shader.cpp:326:0 b32 SetShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) diff --git a/jesse.make.sh b/jesse.make.sh index 4a47e50e2..81197b57f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index 687d3bca8..64e9de86b 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -154,6 +154,8 @@ vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) return Out; } +#if 0 +#extension GL_NV_shader_buffer_load : enable // tx should be range 0-1 f32 CosineInterpolatePointSet(f32 tx) { @@ -251,6 +253,7 @@ f32 CosineInterpolatePointSet(f32 tx) /* Result = abs(max(Result, 1.0)); */ return Result; } +#endif void main() { @@ -273,15 +276,15 @@ void main() #if 1 v3 Period = V3(200.f); float Amplitude = 150.f; - f32 StartingZDepth = 0000.f; + f32 StartingZDepth = 0.f; NoiseValue = StartingZDepth; v3 xyz = Basis / Period; v4 gn = gradient_noise_derivs(xyz); - NoiseValue += (CosineInterpolatePointSet((gn.x+1.f)/2.f)*2.f-1.f) * Amplitude; - /* NoiseValue += gn.x * Amplitude; */ + /* NoiseValue += (CosineInterpolatePointSet((gn.x+1.f)/2.f)*2.f-1.f) * Amplitude; */ + NoiseValue += gn.x * Amplitude; /* NoiseValue += Smoothstep(pow(Clamp01(gn.x), 0.1)) * Amplitude; */ diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 65e199286..90f716e0b 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2894,6 +2894,10 @@ DoWorldEditor(engine_resources *Engine) { local_persist window_layout AllEditsWindow = WindowLayout("All Edits", WindowLayoutFlag_Align_Bottom); PushWindowStart(Ui, &AllEditsWindow); + + /* PushToolbarStart(); */ + /* PushToolbarEnd(); */ + PushTableStart(Ui); IterateOver(&Editor->Layers, Layer, LayerIndex) { From cd39ad0621792f37bc5fce77b9e2ef88b65e76e8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 4 May 2025 10:11:15 -0700 Subject: [PATCH 219/421] Add logo --- readme.md | 8 ++++++-- screenshots/logo.png | Bin 0 -> 71511 bytes screenshots/logo_256.png | Bin 0 -> 71511 bytes 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 screenshots/logo.png create mode 100644 screenshots/logo_256.png diff --git a/readme.md b/readme.md index 462c9e4da..19a824bc4 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,7 @@ -![hero_banner](screenshots/two_doors.png) +

+ +

# Welcome to Bonsai! @@ -14,7 +16,7 @@ get around to it. The only requirements to build and run Bonsai are an OpenGL 3.3+ driver, C++ compiler, and a few appropriate system headers. -![banner](screenshots/orks.png) +![banner](screenshots/two_doors.png) # Quickstart @@ -25,6 +27,8 @@ for your platform of choice (as long as it's Windows or Linux ;) See the docs on the [build process](docs/01_build_process.md). +![banner](screenshots/orks.png) + ## Renderer Features * Deferred Shading diff --git a/screenshots/logo.png b/screenshots/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..627633449de721e37979a23fe096ef50fcfa4d82 GIT binary patch literal 71511 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 C@S-FD literal 0 HcmV?d00001 diff --git a/screenshots/logo_256.png b/screenshots/logo_256.png new file mode 100644 index 0000000000000000000000000000000000000000..627633449de721e37979a23fe096ef50fcfa4d82 GIT binary patch literal 71511 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 C@S-FD literal 0 HcmV?d00001 From 7d897d9518bacc68f7d4c4858d96c4536775a1e1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 4 May 2025 11:26:51 -0700 Subject: [PATCH 220/421] Update README --- readme.md | 31 +++++++++++++++++++++++++++---- screenshots/platapus.png | Bin 0 -> 317354 bytes 2 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 screenshots/platapus.png diff --git a/readme.md b/readme.md index 19a824bc4..3196610a4 100644 --- a/readme.md +++ b/readme.md @@ -29,7 +29,9 @@ See the docs on the [build process](docs/01_build_process.md). ![banner](screenshots/orks.png) -## Renderer Features +# Feature Sets + +## Renderer * Deferred Shading * HDR Lighting @@ -40,9 +42,8 @@ See the docs on the [build process](docs/01_build_process.md). ![banner](screenshots/abandoned_workshop.png) -## Engine Features +## Engine -* Shader-based Terrain Generation * Hot Shader & Game-code Reloading * Async Job System * Entities @@ -52,9 +53,31 @@ See the docs on the [build process](docs/01_build_process.md). * Asset Loaders * Primitive Physics +

+ +

+ +## Terrain Generation + +* Fully programmable GPU-based terrain generation +* Batteries-included library of pre-built terrain shaders +* 1D, 2D and 3D noise library +* Terrain derivitives available in second-stage terrain "decoration" + +## Editing + +* CSG-like SDF world editing +* Library of primitive shapes (sphere, rectangular prism, pyramid, cone, etc) +* SDF brush-based texturing of primitives + +## SDF Brushes + +* Layer-based brush GUI +* (coming soon) Fully programmable custom brush shaders + ![banner](screenshots/profiler.png) -## Performance Profiler Features +## Performance Profiler * Manual Instrumentation * Memory allocation tracing diff --git a/screenshots/platapus.png b/screenshots/platapus.png new file mode 100644 index 0000000000000000000000000000000000000000..b6825bbfc658c135822fc2bc20501a2a1d991443 GIT binary patch literal 317354 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

QiD=?wLAiGDsa8hi? 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 N002ovPDHLkV1nVTTPpwn literal 0 HcmV?d00001 From 575f65b499b099bc9b68e1eb4edbf4610d116ce7 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 4 May 2025 11:41:20 -0700 Subject: [PATCH 221/421] More screens --- readme.md | 9 ++++++--- screenshots/ork_aerial.png | Bin 0 -> 323986 bytes screenshots/pillar.png | Bin 0 -> 396546 bytes 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 screenshots/ork_aerial.png create mode 100644 screenshots/pillar.png diff --git a/readme.md b/readme.md index 3196610a4..f5b14b404 100644 --- a/readme.md +++ b/readme.md @@ -53,9 +53,8 @@ See the docs on the [build process](docs/01_build_process.md). * Asset Loaders * Primitive Physics -

- -

+ +![banner]( screenshots/platapus.png) ## Terrain Generation @@ -64,12 +63,16 @@ See the docs on the [build process](docs/01_build_process.md). * 1D, 2D and 3D noise library * Terrain derivitives available in second-stage terrain "decoration" +![banner](screenshots/pillar.png) + ## Editing * CSG-like SDF world editing * Library of primitive shapes (sphere, rectangular prism, pyramid, cone, etc) * SDF brush-based texturing of primitives +![banner](screenshots/ork_aerial.png) + ## SDF Brushes * Layer-based brush GUI diff --git a/screenshots/ork_aerial.png b/screenshots/ork_aerial.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3bf847e7a16a1975e5a280b57ccd5861b44417 GIT binary patch literal 323986 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 z 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
  • qft4%N$*&wM)x+!-rKy@GYLGXq=$+cY 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 b^1%NC8^=m>esYls00000NkvXXu0mjfsS#|e literal 0 HcmV?d00001 diff --git a/screenshots/pillar.png b/screenshots/pillar.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d9fc3b209f2829019913f28521ab3262d59673 GIT binary patch literal 396546 zcmV)>K!d-DP)EX>4Tx04R}tkv&MmKpe$izo(GDUG8LCsesEA{!Vi7EqwnD28CYOFelZGV4 z#ZhoAIQX$xb#QUk)xlK|1V2FB1t&!pDe-?vp+$@b$NhMB?{W7I@V079G5m2rQB6IQ zObGeHst|ld0DcT1ieZr%S}MDkgX{RZhlj6sF`ngq?$0qG7Yzn@1mZZ;bdz|4cy`m& zIPVjOSw)nI&xxZtU6A;Z>ypE7oXa+Qd1hG8W#);)#6r1;r5w8i`QE(4 zGUqMMO0B^<_v9}O71fn2*J+L;i6x|vh5!i-R8fP87_BNP1~RmtaPg1X{xrEHa#g{| zv4A=hh_)a64}N!Rl%}Vgq)-9~yja%91Q6T>+D*&)KDMm(3E+DMuGFr--U8-6NpE(w z$PqBO4P0DzHE9pH+yO?PG*K6A$w$*$Dgp0j^i2g|$V!t*T;?y!U2iM4Vv{Yx%=E8EhGb0Lv}NPyz`O$;^lod;Cvp(fR-B zfBe03?tc!^{SOWChePIeS#i#xT~YPm)V{?Lah#)P>B6Ri$Y33nJMCXyN0QBBzy`w6q2RuX{Ng)EtN~3CHoeQ_O z6%}R7iQqg$hd80t4k8Rwf|H}Bjs~UBX(5p(`9qhK$A15rVoA|hy4!ZGkPo`@PzQSy*k+R9Jm6%k=@2?q#D>;aNPBRCws zc%&(%7rGZ-zAJnkHom&bO&i}b@;xUW>&Rh_^w#;xOcUWjMv?~l*6FPi4uQioF#E!+ zl~5dB96kkn^vt2KQaQ|#af^6yICY@Vw6nxY90Sk8iNPnEHyW3=@iK0_9xFfSN>QQv z4k+RP@A;SVz<;-X&*OUF%koO?jT8dczOWuUbF7^6#0P)mg)9GC_y^P{zLO86H^);r zAh(97P+g_bIfRkaBVIgOg)TyMo!4=}1;>LPm`(%ByfXF7{JJ6mIDqrueIPnd4iQ0F zTmcVxNX%QI^iI-%0yTAxaUcY5bCVq}>y5b=u9NWADr@UJ9X+vkqKDoC!)fGrm{`89 z{B!q-I0Hd>D>L(LBP^alBOf0h$vIK!Y*M-QjZfnvX?3jE)%GclF=vL9X{~X&&6HM& zIr8z-Gtz{={OM{W7{erM4}H&E^!?; zesWim2ClC1M{j4iyie!`VyczLh?*QCUnp2D}VfW<$ z*(Lt@<43-oA8=P?aGCkGFke@^ID+@&82I(CKl1$e$dEH4!d5o^_@_Vd!w)}jKA-r* z-~55|>CEfvE0^nqhw}riH-7lx2j1S^xZZBu<}2QN4u>N{9uVpH5b(~^dt+W^K7aX) z0x2fEcP!h&>*bZ&8ohTO&yPHu&N%1j()sb{AL%NH2!b+>1LvnF&fkB-Kl__M@Gn37 z4bnR6vholA{vY_$4}ao#IP$lD^S3-bKjWOEY#V?1@h`l-zViFu{}tbT`z>9BpMU;| zFJHdm9Q^#{Gl%KGx1YWx=gjqbp|!>^44`nEZ`4`|`{#)%@^-nPDu^hz+ZFF^&DK^4 z-qTv+d_HrVZ=6mi9v>dLTrR{Axm+)_-g$a_(1748zFf zdLf3uRto3SiFIB1^74gJ3l7KQ!y^yp2gW>-a|Y~wOeqti-G?y-LI^nLanA5Wt@VyA zaB!Fotm}%R40%8mQi`x!u0okvjC zWdR2wN~s&7%3(V2*T4H~K7IU#$HymP2$Wj+{P|~8m4}B%US3~lt>T^MHsAR8{E^!- zvuzvRJNuoNub^-^9O%6hLa=cKN+~=%JOB_wU|m-Ly!Xt@LTeROy^qcNeB5zYYpmNw z@0}O}BKF^OA7k%5-Z@%tq`>*-c-~G1?<6z_C z{u2iEpYqH7Cr#^r^ec)8;OJ_gX;})2@f>@%zAp#?2Tda{RRBeuf++aDZ!`zkM$#RW zI&lQ=&|n9gsMw2pM`wRc>CCQj3Bp+$DqpF193Ed7!oV!ngsO%)jgGN>@^d_h% z8o(!S2a`ZlM+k|iVgDE&DPo5}5D++Oz}v6$90s1Yk#zBNgj*_HQsojWB?>*jn{T+} zP!F{VqBdX?9v3`=OJtYGJ<^-dw+1tKafk}DY)omut0y{78X{F2&SMYZ9Hn-m?gw|Y z`7uHYwN!c#eDg#iDMr99cCAXj1q4S*9&l7`G;I*P&71cm?;t=_Z@{oOrXINY&dqy% zbSoEK`Mn(Zb$u{0qmI!BvJXTJJ5W@%QYl(_JRUiQky9inpRH;(YC^YG;x$*fp^XIs+dZnPaE(|Em?_(~G-i4~2N@eSX(ijtB;9y;4nIUNq9H8A(ex)xNFP(8!q>@y~hIORExJdY>btZYB7{M$eO#M|qQvQ|=x zq#Q|Eaix-aL}%g4{K_(KtWSltRdSD@P*OvRFpPCmhAGdiXLmeiv;`EN>gq z6^RO7aNgkthm7$0q3}~&`1@_a`A$ITIP$PCG|%t97QSf*d{=yPgzoL375WY~&f|gO zFjBWhDHRQ#E}iAJvN{7MRg2vLs?^dzK$_5-(7KRg00-%q$;Zs~Z6ObdZ7U{z^+2c& z-@z01Z-);sN#x@d9<`G-^67LScu#4S=@$7kjMPz?Lge2MZ&cq&*x4V|5uC$Mp40h# z9oyOAMESNIh~4wyIC8o~IAz@mO*+|O^`yAeV_gN^%7pMPQ+CmtRiSavZd=gjqX;}in`IcI8X#9+8#nHL_P z9=Y9as0b+~T5G5nF;l0gvj01P&|0T=v7he*HTZyPGYqD`kk+P3Yn8*{$f%R8e-XUc zy)aD^4jA*WuRqxVe<0^{Uo-2vfjV%CQ*ZN8E7FA88fh5WI=~42!1?(j=jRXqB%oaX zG5K)-o<2QN!XL=5g}QDG0et8<>~8Gh?3+Z+2b@oKGdd$qDQ8ecv9lMrucK2u^YhO? z@$&LwW6~PqFf!zUd71A7N>xcY?PE3U7<)7Eaa|e5$>yiq8h(Et-RCP#6Cy$>hUrnY zeWgMO(dMt&UEo}#)`)gN%R;Xk?8Ha;rzal&rN1Js?epz%>Y=?aYz5bLwzZQ8%=u9< zCkL-aj8x3h*)5qo1WM~@>xASH6?+X;@c-dRrVg8Sl5bSk*`%Qg%evBA|3x)$p15yr zb+({H6>VbVtFr?xhu^=OC{7`zL=2|Bl-B4dv3rsaIC0PvUn64(w4fY_q~c*#5FwAA z2Qm)~rlKbJU*u=z*6>-_qM`&`S9}!uAhfO=Nr)I=7+MB|m;&BAG}sV!luD;-$45^N z0j-@c+Y5rCMR5gkjyU$iy&I?w&f9CDbWu|anow%Bsq#k5zz#QXB=v;iX+bEiLUv^5 zQLm%3*~Eclg}f7dDX3Gr3SJ!prtYrNk)JRKQ^ zjE|mB0(7O;%Dk>D+eRD%F?iN>!*xfD!N8Dr)F2G!Ow5sf5t2`gen7H)w$dx7VKUI{ zgcKtoRdfW2O6ZeH+ULO{I-51u8vZSB%z9QrD`L_ktm+g zC%i!28ohRcdPa!^bp-W9JXr$X+28iAyAo#LG-{wXBR{GNO{rbc;E+jq`1Z`G397A= zb=`Qo-q5Io7+6cei6go|3xM&U1VMZ1u^jkj~2kUV*e zluycQUU{WZq>+<>v50Uj$`#?w3*B9~4uwMse0V$Xv>5<3Wpy;bB1X>UW#hJNq}m9< zbI1cKJ17^3J`nu=KG73mKu~=2xa_D=h@&G;k%3Ga5^@oS^T>02ph#nul~O8)aioVv zd8ou58CH;0kqTRHBnh-4NEHqt6Ix)4xn_r_nb~Aa?Z$Q zpVM80lU?z5&eo)yh39dEoSCMHmzNi=*DJMF zrg0*r1PYhSm2n&q?OZMw#&P7~{J^?xT(1|Fb!8X^`+cAmQ;vje5)Pnb(yaWEZ%y+Q7m14xZR$`0SoiGL;$T@Jm-OLHtouHH=(>U%9fpD8|pio=e-4XlD z<1liauO>v)iuZw!AHQLlXI@@j3>2rt*RNms@bt{v<&9w&=s@2cym_92fovmT-9JMPVo!$)>dgqAyXQ{0sqQnr0(ePaFjV{91m#;jW&ji1(?Va4T-l)A1 zoWBbJAqI06ZS!zA9J$`EIPXX?(^|c+mDU?g8uMDHeWJPncY0!a_+Z4}{b#TPaH#W? zbmVsYYjSOPeE~Ll7r^%Q?b_+#18JP_0aO~`Y>!lPLA|p%G~olb&77WxhX-C>Ud+98 z&IqD&yWrsM9$scdlyzBA;Cw#waDL?V^@Vx9?Pty-qPAw=*R*qvVHgY}?_&;%_rYAX z-tOzkImhvM!1;)aaJng%R!s>0|I3%|ocN#cC4>9d-#rH0zZvo0Pa55*33bp^z?nPa zaG((gcI@aLeS0S{?CPR3#_oednmH-&kvT!2?<8fnQ^DiZk?@Q@Fli(fZ*jQ&_d+mm z`L3$!uAqdS-OB#6vQI7{>CH_4N!Ges@UP- zlPOoCO6!Vuj!Y!GWXfw-dKXfNb_qD!Sk8OGuHLStP-?X)^5CPVd7;Ek4@QP?u(`_5 z!^|abBOijBW2cgHmZ zyZFYGVRsMLy76+kvQ&#bg&YtSa!6>0b=in1GED>Hmfq~4+k8iNYRj;?%B5p%6($o|c<#3pIKSIZtNFg%pYvI*b7AHLS%%lPF%E2cN zF%zeV%Z@%O+tj&!D_q9H<+2ji&ZBys9}c)7@nzdVmV>CB-V2*5X9kXaurcw!sMhZU zulG)G1}svH3@PJxmmqipQaFn(g9$6*lsE;_bLPTI$_ALaGZN5y=jqpvoYIl47h0=K z!^nrHM>Y!M)4({5yv{S??S8pvq1R5|6erGvDCc-vX0!>pJ9>s8TdZ{hjy_ssNt9dz zt~zQo(dZ!@=wG|-i%n30F=uM)l-9^Y;+v08^rXxWm6*(#Z>6Cs91cfXYrMX`(xr1g zo|&eJxT~YI94Dq} zB!+M&O{zi+$pCCKpe16UxOZV1r=1Kqi>ImX$dJ9szb5!thGj|;M)H;ZN|O4!|u*880##29J4(VIDa@A0u(D>-Mjb!9pnNGY)_3(i~O zp!ZJiMwGX*QJalVPMODt2Xl~s6cUP(bLMm3jI?I)+HEI)@1Iw97r=W@DchZF$sT|5A<%a)yaT#D7S(r=+TEQ5 z=RGk*bE3rDq4&8x9nbgZkFcZDib|CaQO5)KK=f0Ih;;+NA>?XxAvbHcYDt}J5LV-s3*ya)4uBs4F30r5?ReYvmo~#$++KR_jg{ZCr1+8>JRIGlr4dJk$5M=(cSv%fexw+xNd4 zM{|}P?jFN5(r%9Ky8zSoXJ~t5(K|=VMy5^VlKY++awfz`@CjUG(F4QNCx*lEm-+cG zZTb9D6Q8Gl^@qoU=6`ea!}s0=SAh~hv{~j#{4Z{f`$vT5Uc>W$_X!mhL8aTGm;LuW zMta!eaqq7aJO?~SjhtI%#Im8zy(?*voRV#f+NibJW^0y(G*Sj-v!ACB$T^Z?uo@aK zJ7W}Tu!EYS1OhQei}ZDiOnGOnMJ8GOMK=KEqY(^5b}*z25=hQdomkzE69$0~W#U6W z62()cF-pSM-5A^R%syD{OBy0MBm$0Jh3!_+pb*Tx3Y#ap#E^ecyrTD{9Etm(2GB$q za%3x&)+)6(I)Y0M7aT1rx6~;?=%KUuPK|<(cHrb5@!gS^z}OOpIFemp(8vcyx(Z)) zW$J-J0@{>1H*=%JF7#;{h&fPQW6{D)Wec62l;(u3bxLpMKByAaade&>%{lDqh}|=a zGKeEp&#-xhW@I$saUJT~S+{}!2LeSpH7EoFM=Q$e1@GX4A2_tc^)`b#b1FOZwG-7d z#eu#FPMpQOngK!w_~uD1lAK*e>TJ!&5C|GbArOW{DUDt_wRUsYoPl?3=E$XBfYZA@ z_SwyS@XnzQHgA{k)*HPG0Z*35p(e5<%2F+s*A% z&f{d6YOnO5yG#0R+S+ANTcd21UM*IY2dka4a1v-Y#az0wZIzTGhr`Ht7?52M$sv&l zj6PF01CY*Hykx#D%!}pGU*E389C7Sy;9UJn&<*k9;sWk_};F;yw?$S5tenM zHX}|1%f|b`;iKpLcqF&T<;#`m1KtNpsXRU$2|iFuW4#vY(m6jKtuArTg9m5zRvyPS z6n^l9H5k~)>XD$xq|6_LujiHPH=Vy6X8uxc&>>XiZ~QZV7ry1AKjOM@*;XD1oC#!w zq#$^r4-5pG$KXgI?!e0LitDa851CJ&J}?f0<>|p<1I37$%LC-aTb)N7Tl&p zaZEY!x9$^9GU2M7_a4W=XZ-4L&EY0zS4sD@wKK#FV)=D*{)G@d<6&T7V-8OFXjd2{wDc^yODZmEsb+3Ui0AeIZc8AFA zp!}UMh>D34Dtq+J*?vly$MYiqYgz3~NgjO|@xMCo;lspP4#?W6rSkdf7aNbmfl@Y} zo}P?sN#}aGAiZ-q9IQ5F$c*EJ^v=30dz9Sn5sOS+e*p$NaNf3Uk8efRZN1m~lv0ee zVCSZ)@ZrPr-JNmH;;!?un6tCT!&1!j-tM(BDJ7P5HSnL(E_9~5TbWYc>t75U#@$7D zmx6VV-_=^_(wWA|i2Dvr+OAyZobGi%%d#M%cf#Oz$L>82^j_mKP18Qd-N;uL#&M+Y z(Z3i2hv~p=zFF+kRG%~lH2 zbRfpCe+CmWpPrugx{n(vCZ>ZqXJBOSecZ;up7C%vSadOjJF#@T!1L~Oz6;5=X3Xt* z5BIda2FmZ`qKlmo?~akxhm^aUFpVR+*SHKhlVZ99@Av0A9FC-Hb;mJ8VlYSTJq9Lw z40PXA^xpaT=ND>=RF3%Z8y>#f^&lG=Z=cvgTK4N@8sp3Xt&nz!LzKZi4Y0iAMiqR3?g&oM_YisnM{b-q(E2V+xWJx0 zmAl)Z>o3QoZ{Q>lr$9)KUZ8J6_iBJ3c#`f8kr$+NTo=4}#*h$iOfNP#2UE;jg%@p% zc!td`HwpH!sqW6O-#3C-X$@Yi*vthZ53cTNf>VS})_@Ot#At{l7YOX&u)klXP+RBg z>jeo)*Ul|%h*NwrMRyC0C3Mt5)QDGjjwjA>qSAP2Gp%+To9=j9XZzb6$>N!MB#I*z zQ-4b{MHkUY_9P-Y-}{5GpHgSqBxS8(w1D{V~>2lCAQG{S!SdOr? zA*-p+DVn>c)!{v)<_TNkuwdk3xNc9~1(ow*7QhYy}{OjN1Rl^hdYg&-bD zVuUA{s#xa^0frPABysM09i76Q3NLYigYv07kgK^Yw{2lrHd?our_>_J2fR3HX}D%J z6~0&vm%|!=MAvv*W`={Q-CM5=57`<Q zIE;INtB~TzsGWJ;cw4RvF_B}WIA<}l)){jqA1q#yhsZnQh^Wlb5=ox;D8@+Ts93Y6J5&2k0 z{$?KO*kvwV&^Qb&Kx^`)dR-@H3{wsYE>E)i7+pXp(xKX@Grjk z9cOpor!QZ)%ECt-IPxC%YEXqE1E(-jC*l7bz7oXoah*7B14FQ99%AA+7{D5b!HT7W zC#ne;B0>`(B~vTaD{)9@gei}lVu5DS$-Z?|Jljy2`%2y%l7&{4>#`E3OmLntjjZcN zEEe@0NCdYxIN3V+m`v?vZ(P!Zk;HKx@XaxW#Hl7;(?$bAv-9~t;vfUb2ezeHf*?ey zRBKk!p}S5RB04Cy=au!hfx|KKwyk_!-mFf{*%;PhF`KYQx1^T8ytBli# zs&YIYxn8fkV%&)#l5^(m@^&YDtu-9(UK4XZKXAFc5q!FTe&-xtzJ6idHfk*#4hKX! z^StoNw#FQG*BG$3v72u*q81-6 zwOM>pj@*_^I)C8&-S>>g)4ksGKPT8Wevhv0akpJnwQ<#*_&D~eIlJWEshjJ- z9;I-O%_*;;@-nRa5H9>2Zv?L_VdJ{3Y-=?eaWB*j-l9hDij{3$%MfYpD!5n^N5h z#dlWUn9q$iDLn`^b}qT{Id3en^Oy%>3e0TGx=|6{(#p+M^ePrvN*FN4A|=uU-;DdJ z2niHQ(MOs@Ow1U6lKK)`1G3(c=3elST6`${<2W!*0|du%TPbtJtK&AC+FP1Aw(p|rdmO+y%neF`;WTh#<)_1q zA5JrW^jCg7th|hcKfA)5J6~BT+UX9&3+jaCY`?9cv9O`LTdduL2p^2hdT+MBb0#*F ztx}s1_ju~OZRlnS{^P>~-n%m>YxyHQHz)H5fe6cpe2 z8aMuJT(~5=tdBYn_FBsn%%PIrS+_mDwJZIig7Ywp1H+h!DH5`0lg9buiS8^i=|e!8 zkbS}>Yo74sPcK|wXX;LVqj-XNe)a7qmU-jt?S>Q~V(a$3flVCz-nFvR>9i`0DOULmqb_s#3PXmzOUV0epJqa5&y0 zWbh6)<=za)K)mjtr!bAyscfk$>R|fzf&ASAuEMzvJjSB|oK|_eyzMb2b768emt@-t zx9gR|;lSh5)9#iSP%5R+_NY{?jnnZ+*vU}a_o7A1_J%sjy&(F%urkMWtZG>n7QH0{ot3Y1nrVOeJDz!}1QJnp3hdxHoS{YOM= zZ>X_5CpOL&ffVT+4@Xi;){(7Sr%;QVDciO(jT6xaBMre~n}@@}I&|&h|K4R1l&>!@ zoK7dUvRU1jTCCBE(hJAqiCQhD*IK*BHJx`%<3tF7VHl~k+)29C{MvpuN7C-S-hXi) z*=wxsE=6nay;4jp+?!&(#|7UD>%aN#8iB`iy=~l9Pxoj1>02JY{hq`5Y%ublAm;WT{qwu?6X^Mj7v&Hd&S!3%2#??3 zLWDRlwJT$6pnZ>qn)B-RF>pH}wi>E#0{S}vbdJmQvNz{2G4Oaip}N;4KYy^AsaEeU z5}3PKOSK4MOuM+g*OBjYxo)dr^MB-SzOP?ZArF~pI$ETTz{&|upBSdYf4z>6cZ$K z2e{xM??na$TFFMh7<^@ zcnxf|;#}ufJ@9EeT7w3$*rIr)_HO&#d!mmJ+#Qg*=2%N*DV67kqeZ(mp(i0sp1Cdb zBAlPkDPwHMxWqgTO;@=Z*14?mwaLcj2|jXb%d z?J1PYJTu=`4u^4Xb8F62%8|#@#JX;la(+K&l8302(DzQAFdPO-Z1lNO*1}Q>8%8d- zuyGiz$ps2S$|!<3Ys4aAown9iVHI3-3?V^u1m`I?a~Seq%~4#p|FrxDCo#q;TaMadmLCAlVh<_Cc8>}ytlSGC?`kMX9Wa*&GR!dkx2X*Em(B?olu! zBFbT!`0=M7?{TB86t=SQ`0&WruU~e@%Oeu*U8i!k7}dNiq?GP1((!oYa=BP%vD5O4 z!rkAaR2B<69*%aG?sa4mgmD~f%tW}&*S-6ik*VH0(`Zq&>+O0!tLOIueHZR=w-}N& z_K{AhmDkr74&!w1D%WbG`g(6Z5n~|r_CaKYOpWzC|t@ z{yEe4J=(~kXv17vYh_#Bkms9?G3QKfmNsoP&UtDr%yZ;+zqjwn&~+oP*9+4;?e9g( z8KpHjibAsGTyjomJrF`0u$z4>gutiIpY|n7N|Dp~gbhN2Th|rq1zd1Co>-QduJ5?t zryb~ET7GD5Lv?BP%q@SjJrk8y+fi;G5;t{>26Nbk6j|m)Qu{tPde}5iJAA?#%b_1Q zosMGPRP6SyZ4tf^%#1N~&J%(tZ=wzfoF^BBG99`0^urP7yMF?n?Vm|^`^SbK-w}uR zeEKqz>;O+~=+T;D2d3dS^kF9D1vxs^9csW1oA7e|Ilp7lV~q5DPv7?~=On|tU)N^g z6kv*K=ZX9Mwp&n7$736uUTDQ)aZ3~n$ zF(=T92Q_d^10hO=<`)*m8c}n^YE6gOD01`rYf~j-QCi3~ixOb8ruZsZ1(zUcI@4t2 zP|#Qj-lq(z2qIinE@mS5L^x)aYvg7FKXyTI&sGR_St)^%SH+iFc&&=gRxFC47=~i# z@Eit@&WdcRM7vrDLRW!2XT zj06T_OjxU-Sg`@+LRq4av09in=0c}!qjxn_a;nr&aEN8_L;pxz19M!7HF4;BmL>4Z z#}|^yaxmQTb7u1ow{0EZJ1@(FoGDg(l{L4Y#kYM!EU3lcltGy)!<`b_Uqvy`fi$N^ zaIEx$_~XMG2}ur7Lwi`}X5+NVpt8IVO9{lBm~#;7o!1P9j^lBptOA=bM&X@Bp}0@d zkK}sEPYIn-UJt7bsT4jgS6)g+cM4zN{n@hK5_3$LwxLu>Fzrh!jM?!%d%okuaPyEr z8-p`iY?)OS1EmzE7;u9j>4Nr>(@MHJfF3&$bZZE7Q7) z4X*QeZ5a;(<8h$af*CBuz#1~u%6&8HjP5kbYVlG48vTOOs>%DM(> z6@2W5w%+JnF^1i`8Dqpdw|Ce$=Xp4t(OT${UBh1sD@c06whei1y+T?Wj>8fEVo@vf zlg4-mr%d!28%5bT9Z#Z!OcU4Jjd$naX&h2(1<;=P37>0rS{Z1}o;ZsU-1itG? zMU<2;pFgvPmA>!y>`Kmwr-w&TiZ0S|v>m*?b97z5LjbhWc;61%aozJsN{N3&hO>#6 z%PY^1n$CCaU|zZ1@2p|PJ1^Vu$bR3H!BB>o!{I;(Vc*1W`J}q5Uv(bM<=)8i9=`teVqkSReMkHd&HRu%;7%HeRtTItM6DRDd=IUbK(F0X)O ze5PsQdb#cyjoa;pY4*a~?IyXbMQm2r+m&$`_xG^(q6(!Ne+AxhuWMI%RF;997#!l4Sm-M#KDU-5-p*8qYbgX0TomW-^Ub%)MqRq z1wMWG!ZatA3hv>=`NOx2t()jCeHQ=!{BlZs8F_r7_@mT;GZfNbG z7Gj99aJLq=T(*A8Fpc9#*Yypf?it6C`(5m*&e?WN4tU?S`%5OQGGLCwLGp2J385b} zhl7BhXlIr!%U(-m4J#o8)^*)8hb+k;)O*VP2j7pNoT z4zk`gteU^VWLF`-JQmAu>cEgSF1O9FtDJNvT?QgC5lDRMZv64xD?gnAzZs4k=$ge$ zJo>6-DoV)YP)N;w=A6ZKvfUTSwskI4niT_i*y}>lvPr91aJ#g_aIKX^MUpN|CDC0# zhn7n!ZOg2oILQ)`K_^9uLK`whh+TBBn27P*^?ktqu) z?B)|MUF6jzf-Xd>$cBA`v}Lj?g{TujXFp?bsy2@XT@$XdYVydFx_0`cC zhqYSlVp>y8<=#hrQ4_^h&c>m2;i_}9J<5P=y`d=0oGOc|WL5DfoHAe}M84X@i_q1CaIeu zBVk(Kg0&T}RyY4_;d+~iHH!jeEV|Qt;ZABBZEB^*)3pt*`U>RUuPSB}du78f!!WQ|hZQw{+N~EQ6tK!%Awjp^y_xiQHHyS}cOf zNS{~lJ?FzwJmX2Ok7W&Vqqc_8dk(`O*i>V%UX+xO1N6{4%Q(Yd4QHNy>FF1Z%9V#| z`D=CJNqKH6GGxQ|>w(|aXVN{Ra%Hfhh8ZjNwHOmAWab*VxP?FWcP_`3rB7rJ-@Sk4 zItG5RH@?`J_)uA^6v5tI;JG`nt^wCsPW^#(S@)kQ=Zw-a)GccOBZ2xF3z;eyY^CYY zSfz*tQ8SE!no%jrCeJHoQ@Ewb;4R9)rw|Aw@8l&J%;4S%T~z_QRt}5D8$%#TPAm&B zq(-@yB$WwXdQVW$jSifmKXeR_1E1=ZU@{AVI)FYKUe`NDY2H1YC?@mEmlwjzO1wo( zY!=}n_YY-75s7QWJJ0oYm+QL7z!rn_XSu2+F4~@KTXrzHykQzzra`Q?3flFWNkyK} z52q2|TUM1=PKo)i;PNiNNy%mTNr&CoKVP6P)h4Kl4rrD2Chxbcz%2) z#wf%tV^K=TbA8`8_`>vd|7azXrDXbcT`8qF9*%nvY>Yxt6DY#a954mvearn==6RB0 z+?>U-*v@Gces#dz08ATNxzy60V^YeSbD{H+FOwl(t`DIEihA?>{7l!0g7M8a-!Kfr zo+okEVU3jeZiCgPLX=ii|At_ed*`%Nsu}T*-}CVO?-@@II}P!F$oQ!LKZhScX_T?3 z))}?aj2or67KP7OoR;Of*xe1$cr$wo}-ET6y z#6U`!hx55zYmw9OMBfYH&244A%~Dr#X^Q9uRAE>1QcR?rS=Ye4M5eXyI$P}HcN`v{ z_xqUo*DwM71?_I;_rLp_2UXPHcEZZ`?*3pEJu(F1s7{L+E9{J-rwmGg)Zi*!D`u@8>Pu66LjI~BVTOb;uCk1nN*SifdWPjn#L%sRg~HW z2NXe7W|eu-E5G=epZvr}H}mQfuQj5mbk#5>hcBY^IB#K4+)3(HPTi z*)02Kuh9cX4ZUhZtXSBhs-lEug(?COFiO+)9&Hq<2yrTcQ?K?RL zD%ks9LQbr$7%!JXD5=@K+QX?-Rvr0SUC0!k$ForSVq{*$cB-8a@H*#t+~oO&>z<>) zGJ-CgOvmxn@SX?it)e5SQaM%6hjPM2#Y`ls%B4$$9MCU9%zHQ82{RaMyv) zCOD-C9AddT?rv_I2@oU z3mdgc@@bXxNgCYmlLWLkb>TkUDOI-X_erQ;r{jrtPwxbu-?A~fb$?VUa|^H^k0)l6 ziD$=if5xqbJZDbB&<;4;_a?~s$HzxH@2R!&dbv;=;p=c1_d|Y4sSRz?GOx7}RXAr} zUtjjnx|B}l9c+?I5t|!dW9SF^zQ-8NvaW=6ZBT@PT4j-!a)u&Br@4yND`&9` zh8Va{_m+7Oymf7xcJDo%^UZoLDwpWeYR4IGXzT5eUMu91@Xq6${0!cU`mnh~hJI*D zoou(aVo_r)(>#e4$XH@iOlmtgsvYmGTb)M1wqn%F^+IYrDBgQIATNws001BWNklb0;%@ch$a5x+UB;h@;udgi2!uxmcWSJBM6frN0bSGK)-c0M+ zQEg~;%_4mmM{%b#E7h_td!>QorQZNa8_{jcI63PYwpj+;E$@?(bSE7fTtHMfwd1$} z4yOa-IP%?xZyAPxx!EJPAQ%W^nRUfOOY65=%43#N2+fY*~56?a=pkx zU|IG&>2{wO$MFr1t+pXv02$snjJ1NgZuzxRijWc8|G)K5=?3kP@5OLm6dc}hczU-l zd{F9NzQpt|Ir#kHcYpJs;BTv~KO|FB(UsroXV8j2>MM&R{2RG#tL*vj1|QYROn3FC zm1PJe79??=^ft^*EBDw$henDRng<lm_iJ_bxD*m0%K!5oKic znP2=&ze*@=SE1TAsv`8a)n@+wVdArktfo-)zP@>Tn`ptExBnqGGc-jhh6-I0>^Dji zO<}Q_S!ZUOD5_wR!WE6jVw4uzSSn=X;WmfHGG-f~cTxOjVy)vq_!GGJ(G zh7=Of7gAsL>s|%1e8d=~(ACSoYpP_}XoFR384HsXK5NdULw|3Qx z4Vj19^N>W9Tx;UEINm=#;;m=CuL7E|^7&k9U{#6eGxx5Lykf3}iNeiBE@fpZnNSM2 z%B(XN5}$M6rMxhkg}*w!r;Cp3%Uy=rBDssw?4pO$QEsETGC0q}c%WBSa*EHI^$8}G zu@QzW?}r&2K~?TcB&W=W^MLb~FZY!c%i9M_-n_S(HAFdb-r$u%UuhXQQRM>CQe;ZotIYR>SQBIKS?_^VDpOv$-fmp37hHsM?s>Y5giov7XR~37E5Gy; zFNYP2eGwkyJ$ zqA&~t!#J`o%U)!-p@X*&_!3tE*Nm2Y_9(AVrQoXJ`FP&@K&EMG3T)yq%E2=i!B#Kp z!qE3TK0HcZrO~@Cmy1xMoMW0MO36H&ABZXLL(OLK8pi``>seV>vCJ&%itjqcK|+Dx( z=Cb!xZ4W)MBhIbBv}^rxZyh@+=cZib-Nsf*Zk=?lm5+9BHaIKx3HMcYW}c^C1=hD9 z|Mhm2VWs7GPRA3s`&F>lNwEKb9Byw{jIr|ipU!l>C_AN;W-Ih8>&mjslA&n@mz!!O zSYj<5Fvlayx(dy8UFrKl`hHq|$}|#KE?E}5O$pdKh_*jhls<6}Y(RuEV%D z1jbQn-Kn{yitY0-j+{=XJwvo9fuKZzYiAhAGPOTbK?-rdCUfgmd%dj$JUo5N@cuho zdoQ;$<6m<4`R5+2m4Y!}v2~*4NGXD$_O5kQwc&Sj8*Em=5CXpIgxuB!;&B{zWwn&T z>3CusM`DW7zvjE$vMA_kfs72puwSc+ZD4()^=;xsX$ufG-~pPL;l5}XpE*2z*wv$d zdxOtk|II_C{OxMv4>+ZI=jpZMCv)MWnwwgo-Ughyou9vAr?xd;d6vD%7-MrW!8Yot%3_ny&p4IL<;gqg@nCd7nV1v*f*9L%WT zwdI{Xax|W#GehzCVhCB(AlHgWbpr^PDmf-&wOEk40v4jFL<&o$JsOwgm zCsv{*1(rTA9V1JZ_&BbFjT%tjvQ=WaN^J;IGH4k~EfNsjcE*MRJ`sn+V&Ud8pM2zI zGpnxjRWVkJMWd_y47EWeYPY=0)dUZAhFoduVaXhE*i5qEyAIB11`m zwb=|;Te)em{a7^BDHfl&=Rhu%Q8`Yv!$k$TqJvy7szTp;p**dr^+?G<-8s`N1a-HS z<*(EZDIaa`Q7eHQP96GS`7g^)EG01IKyHKPZHN?G#nwn|Hys*0BfkxzRVY=ZREAEr zgj@fVYJE;#8G7Z=UT9TTX|aN4_QG9SXUJyHiz%Zl2otNp7E~eGLN|Ik?XX4YhLlQf zc1GO}m~lxg_rNj*j57FEnkIk^u`lVmwSJ3Is+1yCfhJTfq%zw!n8sQ9&_)!jJx{5-S8h(~4-t$~C#bul}_|?f}T`FE19^8mZkYdE3 z`S$pLUMkOV;BoFbxt`yC|E(xbvshoYhq^L~U=zt_ZZ2>my%oO#wjHLtQS?VgF^aVm zh?yZ9Y;pXqd(V(O^L2h}I*(!vsY)>(22pQ|fI)_?Lm5rB1@+gCb3gF>(eTZs<9FuF zw|az>xu&pNBrA$}%`CHQ&huPP-mfL5-QXE-VT^= zgNk>a!{LDU4e=hTT`0op80 zoAt;T)4(UP(5M>5(~<7sz)xmoHj(bZ@%(V+Scj%QNiHO;5 z%W0K@5CZpU+WU0w)5I|JEbF=-ep8H+-}@?rzNx)2iCyh@I7%VsNmPK>i)4q!HtY;T z--f-q=Vb&~Q}E8U(7fKa(&H#JsT5_n=vxM&(n_dv-c=4!p>iXPnVq0kw_Iw=U-iR4 z@4MFJqa@_tsFTK6jIp~NYa_9xlv+`$Agsl@7kB#G8!W-@3QB1mO*!ROIGUN}iDg|$ zIqlZGZ4>|W_{{Bo6=l#_-oJmpZ`rlh+;4Z5mf49h3NWVO#09W1?gQ8M-ruJ?B@0G+ z4MFmlUBAC}8>~YB95NK~RX@*OV4B57wNbrl>#G9Au;jHwo;xd&yjUqoAS7+LZYUvkw;mO`5+^4&A`m}4$m{zkGDog`&q;?ILX64K|w*qg0B*o&ms}ud>JNjY#H#zuN)yVE^4EI`46g-J8OQGXd;+fV=afOf)&T78X1HKrdD%?tBsfAMEP&D1F zapA3F#>YaH?$R(hJM0af-am2;+T(<`sFka~l5mAKB5 zzfg+U?05&Q8I)*DH6<)sq;(|+a|JjpD%fB<&dvVzCoNXBS~oO&p;Q4hpmiIV6*Yr# znxv5u(MFJ?O5aLC^OMcI=sSlpbJUje=ozbH2$~VcnpV_Q7`$T~de$|dij>l7r5J~v zq4TWmK)QL7t8c@bHxm9u5XXf|(S^xIRHu138a}xjKOQFTw@5rBtX7x^FD`K`mLHap zqjA`q!50Z7hovR@zdl5)g&Tq%P7M$3YFOL@wn{DjDMx#tQyAQZb=o3RrC#@>m9*f0HRcc#ZvEy_ON>$WQ!0L85SLBrFi(tUBl1*o+W$)F>xiAhrrENCj8qpQLeST_r z0L8=efC`$+r-_rcgnLJbk->W~npz6B!ix#~WFpf&?+TJq71bAs4}pP@63W9j8H zn=7tZy2p<1&jWw@uOGQAvs4D4@mcW;f!Gz!zyp?d>df6ox;4<_U{Ek#$tX)7`$1*JxUHSgo@3>xXjj$wJ*;CgEk*nE4 zq)ENs4=dZz;CMLUoa1)8wJmt-nQNUs)>=Xg%=6qRYa?CP@p^fcK9gp}GFYe?uPoo2 zN1p6={GaMaUd+muGVx`-$->7uo?GyJ!%@rOT{DaW3YeFrS&QoK**_c(yu7?{zu!5Y zPIO(z<$7s-HK`$`3t@dbINk5}W`~jk*F4SiUAI%DrfF(ruwr@J)RCQrR7JwCB4OSAiw9h=;@o}CTLOUuE8mPy)z`diLn4J*0X;5K`gWP(IZ zRH_vfx1N;^M6*FIoOL9XF$OyCn}Q}ooi$SIIt&9TXKwc!AxMAF-qY0RvPQo_89LwL zopdBwD_`T`;h|-)^bS1GS`k8$=hz0s0AdOZ{khRJ1-E`|YL6V2dqTsaFU!I$iu$xK zE8BIsIZ#w9B-JgSWQ}QyQ?vg&Ap}xRbk1|T-6_rDCy;|i^=C!rJ$ zeS>?fYs*r(Us*eiezVYh{`^@6{eHk%$xVrUu-OsYwW3;;gmi#GcB$Cf0^7B+rbw~{jUkdTRr8@*E;X@|1kSMCT$JQ1 zl#$qSsaeQ*wekOReZxpL$rb~vF3dR-P35=#%(wL<9SR5ys%E4_GbHJa%Iv_3H6*5G zm98fzTRLkL{U}=~Z4D)5(wbUpxFMQM90IrJz#r8gx&IvaQX?~&stZ;ZsuzIaU1x4% zWV9A-;bHZB7Y=m25czD|P)YxWfGwyHqGSY|Yn@aLc%iap88biWE7ij}Ich1W*ebG6 zI4Pu}^om7CvXd;4+feZ)GM6AW!jMQIQBnn4q_`M?TNoumQJjVR#!@qQdljv%~%r3DU<^f65Jv(dP9{P)hNC#J|);nFW$Kga>y7EAxGqwi0sJA@#8Jf#%w)1AKW>AFrxmyJ#( zC6O(ZzOWBQx#WgvzBA1;_vy~*blfRUIp=n;lWqI?eCGRazvst~KZ(kjbUM9t*Hj5r%QHeUJ;uo4bW=Ju^~H9U zt`p^_@5NShpC>x!(MIFF40T2uhGA@FlxbHzHVf=l2NOcTdqv8L)A7734XSODOBMyK z^U@EvewBBMNs1hEE)8?sF}DGGvuSCqu_(cpe>L3ID&^^G2;8RIu2#kEz-TPb_99C4m70=Ert_lwosTDe z`TU8YQS0Vq=6=6XvMk0nRq1$=*IRzJviBIqB>hYCvNU?&4P%7tm9u1gVieSSZEB)~ z=q0mcjgdTSN=>N}is6Rc-cihIb9c01P$e$cSKd9p2P&8ARWRL3QMKU8kB1}9dFjb& zW#10zfm_#gr|G$tjS>}9&VS0Ny*zd32d>i>7JFyvG(&-Y)`ThXIVALVf5X@x->}Q- zf1$_J|4nIUOAY)JYJ;k_B-L|YHDhO?7L2v{*4J24Be1sT?3UY!%?Yw8WgB|^UVxi*_+>`>U|MCoXdH+)l8&eXaesZdNr?;d8nY zYNY7GjfEAl0=cS)D$C(_Qy}E@gm#u%Kqtt}isJ`|v4$GO$6HFlCPTLxV#&PPnaQsl zbj25gnjP^by%6D;D5}yGOI6Za;GNwIyNUtr47z|`g$`9?!&e(cMqmV`6bKc)R&;@` zDHS9jNKVCQ#XYasCGzM-X1@|@62E3|vDQ$H$eS35w&0^-)Eyelr+nv~A6voL#5r1Y zja+r+r+#JCnZ6UGa;*yG4M(e3+e6l+g3p?F(ej~;Jm`^_Ggq~stwK4)wM4#AM}FkS zf8oZuU*8R<+JFN>8UtrV@}5j$Rteo}4!z@?J;NuBo245`HMF>`8LvIT7Lt;@idCAm zS->{Jn{Tj&STecUwrZ(w-A_sm5r80Uk-i+IL^`_FjEZn(AX&#R^_AI10ts6LUuun! zV6>BtldvTI{PP!v&hed=2e@^XvG3XqIm*CQ8_u|7?tSFH_BX22Tx#N80*{A|({&K5;6Z-(HV+B}|E!GHVDdp*<9Lf=)Z|8R^ZbSrL}Z10D@z zq(^3c7g$XuYC|`#9PbWqt>m(Nq;rm5dsH%nRJfMJ8fW5~=qAtsLe1b52i4)LP_twg zP^p^-Tq{&HyEGr$W^Y44qrV1du(#T8-8^dy7-yv5HY=<**v_I-MbC!(28FB=)K>x{sm;=IyWLqr;P`OB zpv12D7`cCw`FLGqTW<{SpARgbCUR)>yHmZh@kbwo3ll_< zDQ#0e;P@^L9A?iq`izZ=>umz9=&Kcln+nQE39p9heCM*>NmMu*5{la?bD0A}wDd-E zJp{f?ci9LR%~j3#`HG2J4o+Jstdm|EcUSyp^IJOa_&a{&@6so+Sau`d`bVDqnJ?E1 z&TD*i+@?wL2o$V0+)t78PQiL%x~-(NGL*^(Jpayr;C`QR8K^TIq89(d&o|ao>9pp@ zpT98QBc#Z|8}2?ZFNNQodVFtqnXkOqmE&>bc=Zg)`-?*(OWl;=X^Tz?&+D=>xHltqqdLO5*C(a z#Z}GwZs4j*;vAis^?Pfqgt4 zd3}Aw8p|!+82Vw)AZme- z?c1oT_vzk-OF3-xy$lRnFh1qP`FJ8G>CZ9d*90o*K*_rjwT0|A;DmFseK*Q*JRDe? z#joVTyet@P+Oo$`OKMq|L~aU&YQu~|aXJcRZ4H5CUFiFshtmTeKmELCqP8LJFdn3D z=z0;AI|fcCQ7%4x{>*QG`0cN3mi^GTex|w;ykZP=UB|Mn91jP+yu7sc?evyoYD1PW znpkqP{^h-dl`5*whNG6Qpt|R}QhWXCUiKsELaEJO*eXm^b2E4+H40tVHJas3&RfIC z?S3Q2gmaEqnVj z5&W7W97Eh89i8`d&(D(gu9icw0%Tw?Mw8aGqmFe8KGy(2C5o;%Iqj2C9JJ+R9M>9ot%YJX>9t6IebID9^B?My zwAt54Dg_fVWswlQbB;AGs7bKUoilVtN7aI{%xghqxpAQP=n!_WSZyd-@VT|gvsD*d zXNAs{+1hGQDlsEnI67;(*u1<|$Ro0CR=Y4E<&ufggXvbP1J%nWTr0`*M3p4itu;v( zT-K~Qpp&N8hI8quuJWnO*sS?I&s^)m%bfUAS-{rTFmL$&w@*Ai9C*3jxxOx(K7m^l ze%APENH&40bQq2dbk%WIfhTq3t^>Ui_sOFo{9*#y6byl& zYE#nkSG{HM>B|e=JI=?0(7)y+l%!gv2(&4+Mrk_laa9OYIc4&k+YoFx>4BoeYSLMS zRfbo+qI00rnobKu;HPxseY*z!&^cbzRffI{B%L-v001BWNkl~ zqAp_fJs9p~;dNe#C&i~FakiRz(4?+%RwEx@zffu>n2fs{-W?xAi7cSj_8F}T6BI*o zbjCAiN8*kGE-vtD7vA#-8BEcw^G1f+kRz+n{PMW+nU!ZOxA`Rpz*Y5qh1TfFrwapmXRjbrRN z*I_?IS0xmzoD!XvtWT+hX`ZC-r3K=RF*s*iUw7UIUuRsSo661AThD6Noy1gY<>m5% zcb?Pf#5_yWdeVuQ<@s|hGb&seqT?ZTJm~|AiCprX?}qn;c-=pH8$dvz7!PB!$pi_a zmm-_~7KlC^4$>Hp;yz8H@H9ms=Vp(pm3f&P1TDudsHk;j6x{6ZmpC=(Qt}9<& zzO-wm-D;m;11(~((vOU zi0bs^<)vLmvaB@5h+;fQCrnD|D={*#EuthC1p`KmSx=s-f5m2HBOWz3EC?btyq=?rN9{l1cFg4 zS~FZV?y9-{eL>Av9^U^R-3@4GC?;@Gf8>|zg|a$&GxFTO=lSqnvV*GbO8GxF^?W_- z6yBaaTIqd|+6SJhzCN<-E|of*sfQ0}n^0yVmz7+SEM%L-UMq!nUMz$uF$_J|t8Jyh znOqjRf3&KMwUwKO7=+qbDq#)n{gaGdt>VHM599v%i~IX8U42~xc5JYz+U|2XWtLFT z$}pHj%<*5B((@PmUhL9|gt>%3rJ*#HTO%&=d;dq%iE|%e?(BBP*)u9*AL4M9sCETpDVpcLhI;9CEqHN_+Ih;|v znnY|}OAg6$1W9hl+))LXHs4|xn=nJfwhTRsFGTJo4 zAG;l5yRePXP3ABAKQKnrh?KWLy5xm^w1J!Yg>TZ0cXg!NLKrGG$-rB((AJ!D@;({O zp|yEyt%SyBRqDR?xd!#E>I`dqPz7J$w2092CY zNhvjyxsh_*QUpAp3b(irW5N`}>G6Oc9P@R-Mmbz8C2&o5$ufD59yPs#cc&kFN-E?fa`4jT9YeF&mWnfi!OyvpW3!q3zudi9k0n=n zuJ^1lhCO6vRk28ROD&xVI0kG3_J7eo_l14qqobC@W(}FOrx@1gi*H2~Y5UyiLTCa6 z2xev0&Kuynv3_k=YM{-+@CUE^2&pRcA2>t3bJXfx^j!N40I?BT`Zd+ zqcz^yCUdPMUzvxDRpOU=XxYSiqd1>C`dPEyBUL+ehFq%1LTx6;Oq>&^ekAEcRu!Er zYY2S4Ua(%_a^-(gXUt zaf_y^ey1;OhVPgn)>-Y|rVjA^RYiYPj`Q9LS=P*UK$Qu!^l-$tu5)A3u`?GD<#D64t zN--w9bBu#D&bE=LI|$8H8yf~Zr(I!9o~D199UPm=e*y+ zK0_WFBti0@E|&|J%cXg(>@FGX`^_`7?f?!6t1Y`KWBdQx*XDUX8E)qr_mHl*rH4nps^SmcUFzm5M1^jLlkOJ0ny5Z1BdSoMO=l zV#Tgvyfx0Cdd=bm#cY)X;?-P8t4w7!WaH*Z0L9RCcq>@~Rtc6i#3+qU5Phbz7H_=- zQ1%8oDJJ`D@zt{W#B3AaT*jJ$^@AB}2-Zqjt#p`74`Z)M@t%&4L;NwW~i zN;X|4vxglP1^uM>_C52B?;3W;p zR;t!yG};?!Mt4)rrk~Y2hP<{WFc&d*E2~JZFnk;^XUE}bWIT2#3VBY94{!yN0kx$b z7qxFaMB-PP45#iSIHhDGRDVO`)<(i>A2soV8x%37hU z{0^DI)EN5)-OQ;oF=mXGjgLXoYX`pa^$>|M^D#UAm-q+XrvnQsQ(j25kqz4e{!|qX z#UeH%F`6rd?G-;fopD*V6k03HZyrY0=$6>5_XpdC*>){RwB$l5Vm3FeSN zle+PVh1Z%Gv*zbGa84a&23En3Z^`2uX=bPLSjkGURz6okZkoDr46Z zLLyheomVPEMX9h@K}L7R(jPr@2-x272ustDTMC8e4`(jnPO6!w4`+(6{1RWe)s^fN z_73llM?S`Z;SCO}=3Ov!k}8TIa89 zdtP(kjfpSn&Kom}5z1f5lFLZe8YbT{$GhOYQiB zIs5+uaoa;ag38zI0 zSaK1fSS_;Q8UocOt{LV8=iulUjeb<}EJkP(H7*HAq%V$VJ2GaETMew0pN=n_gM+1T zC-9~UV{chfX3dFHFU7NShI4mdD4zRmLWN3NyhF z2A=Z)XJkY1_4VscLlaL-kJ6Ga({-Nb=Vz>Q&6_9pLI{D|?e@J8ZbkA|?4+1l7^weE zXlCMgJP>2#<@tr$wgI_eoj0$IYK`MoR9j=oMM5y8=?HCOl*Oww9>{Gg)puRX$3cRD zbK18Rec$f^sMb2!NN=>PHhkLTVjF~K7eZB$jBT{5t&raeciBXIFXlrGvVki?C7Y*N z8o$Hd$8NG+W>L#yl&38%y6)>B;yvfoxY;>)1UTo;= z+=8n6u9x?y`LZhT^G`qV!}}i^g-kYNTUf4Z4N%VCCCCc3hdpmF4DpDrJRXm>CF%I- z=?DJMo$2Swp=zwI^aXT`l;uvJC+vJdKfa+JcU+nohZVKX+#VOcPQNmTD@S|6S-*+m z$TgAb%A6-+%!Kmbrv5K}z5X|@^`CgV{e{Q%E7SayY5IbmZ>+DcJRaXLuERRt?z7*U ze~ec6G-Jzy6jwl``dh9}Eppz;@<86}Wsz-TY2LxyU>MfAmhqGJ8fa~j#x<-hcS+>c zhjIL#)zfu2XZPlPUS`SVauVgT1*p+C(VASU z6uZAA6{rHbG%1gk0ubx!;qW9HQ?zrM+XrUk#-yw-BOC;$@ro+XUqLT`pAj zOD$T`3GgYt94;&J?sx)M9W{k}Z5PE8g7rgFW%L%L^q{?tbOc&)5XY!G~g5 zUZwapRx>EyNGT1D(86cylsN>+GD;~yHN;%_kdM5-%Qoxs6saA&GaaQA<{|}7)|IH? ziw@)w#<`<}OjzUqM6vsOoHe@)M1uMxgQci~QcY%AAsPvAbV{!0YtCFKJ8YyDO{#?& z3z9=CvYkxDXxVC-B0eZ>L0geOSq#=_qJpf7G}^UNOu=-9YAQ*$?aOwMXoK&pV8WGX zz?T@XMmG*hVfPEc=2}`G^(f;PAH%6m?EyXxIq(AB&bAmnQS0e*;=T^L$Th- z_glq6;$9b?+tjS+iZO~9B_qfhL#D8H0tj$xhrI>H)zPmN^GR_uJth`P$S7?HxiXbR z7mc9QRTUaxl?|pz8kaOti8(jd!hM=~dOlHfA=E_YoHT=45kum(JTMP~^Ucp#6_@*+ z$9>`B`xhxll$Kl0iL7hls!g)ji8=1(No=fjgb<}jcW&P%s*RF-=0oquJjl?v;;}&= zw#mN$c~+eBEX%^}cI9|H3Q9ai))27P@_c@hEVu@PNGWj`M;_Bdyil8WrVSUh(yj3j zT>5vsaswpo)VtaOG9_qJw+x`L-QUJ=xqjm~9%YM|OY^S4JWUdsJBr+{Zdr6`lY1Gw zcRU`C_Bj&tcGn1jm&>aG>%?Z#?o$Pzz>>yt``pWO;vz zeAI@2{i;~pfwh03ACCNgdIF^=+VJRqqAyo$4HD6imR$~Nv}_xLh-_l7;EsIhiPj}B|~a#zMM4#PEFFf$x(fkvuK{?y*bJ`Q<|i6=p8y4 z)U?3*AjgPlp4Go9s+-6aMK>;nwcoh5*s@?+0h+&mEjJmQs;bG<%J)fuR;)GiXLS<_ zO!0KZ(q%8x;#?((T?e9zgeud>z8VHoiKa4EnMl2GKs&`87gEVsXXNir;FJIZk_KWG z9lNbm2R4bp4cnyj6mnI>nlM&zFrL&TBueRBr;BQ6%q`8ih)2m7gK=^gtT~fPMq9X- z2~`xmvgkpAKPiyV&Y_f&E*Ayk$F}f;73=bbERf^FV zGbURP6;+|L2CB%5l(N)ZxZW2D?QF>9kI6Gc!6a*>A(C{$?@C(Z z6vi8Jk+m^ONx|M4pkg+XM$03jw#^NwEX`|75tQcBP?&lNWV0*y0FSbA&kLh>OfK@x zulyVa)URL$Ar2}fA*FKQ%R_fsR@OBToNTOy;y7u?*Km_&wN{2|#iXwa=b^_LjVYQX zi?l|Q>8oJBJFV%9XwvsE+a1A5lNpHg2O|dfm@}Qz7!;}bkxDJQe6bYp*>Ea_XYKIX zGLd;zfrp8F=m)y2!3Y95lZh%5OGbswRwad*Nt&t)S!;qyEGn|)kw#a@yDQjHM3&pi)A2+ok(e?|%iYi@YA&1)2b?xM?i1tKV=aP-X~eJ2c0lFw zCaL$z^e9tNI$^A)KRB?8Kfm6^OL@+iCrw@>_iuss&u4O{x!)sQ(Hwir>7w~B`8`8% zgf8=!`75;~`fLSu(+HB-Kv9JyEcosyp@|`KJ{{$OZpCZottW;^Dv6{D))~fA$Lr%p zR2l2_{?X2=PU(Xp%nl@(9+Kutw_nYp5h;%G-o&26Gu$u$v+ zs0Q9u2UOlv;>YJBk2P|O73U0(9QhhAyqF`}8M3K7Oe8Eb+G||VRE2;Cf&^;{OOzvIR@9>h;D2~=zhF*}&scji#8sD(f=?lm4KtBu|h64|iS;j~_NWrMQ zVdy-*@92~VrzoM|nlvrPgzx-LaSAPXR02JhHdm5i!?yJiIdI=_)Q#lUNOsk~%=6r&UAkrbG#}CC`Kg5vBhxhDz31iWWe-GkZ37oV zKpR7961I)NC7X_J_h;oS(xmMg$2Kf2O{#Re-}bGMHI}F2Sq8y}6Gj>C(_JR|Cod3& zWg$h`5PIjiWeGza$3dp`#-gjCQg}L@B`awhMSW96COOY@3%6AJCP1qe&fapQN^MXi zXDQ8NTS^w-Kr57U61aiVN<66A(D#C@PDwsz<0w9|>-D;4Ic@T*EoW)lG?m<5M-l&o z3e!nRA-9MUW2QKy}-jxZfGe(2f1%r?fowFpQv6pPB$~;d(3+%jXheM$6 zdX&};f^ymcLPi^ouTm@e z{|a%|LIQ$N(r@HNYB!n7v{#8{cALo8eI3vW>P9$IW%tQcRrzdIO1`k@#DB6sP*UQy z$b?X5C18Ur-Ip-lV*lqw-9v_p`uRR9##%5_z#pq)lh z7_DXvna(QK47r(>g~liMh*6rDDmic1@v_s{bXz0W3U4Z5{n8Fl%}a57tC6U8s}H6Y z2#ri-RLk*^lyajWYem%!9p3ccIi}s6S4uOPQV1pURx>IqevSh#UwVqI{Nw2>)@$x2 zqN@B(eX#VSlP0Rk>`JZFA^~93N{N;JP4mO-F`dSC@^`DM=#w;{LIO0Hq|r&dGCmt# zqUTTrAaPV4UkwJubeqW`?^2j;3M5mV8SAW|CA~=7Zu3M@Z9t$su4clLNm@2Crqdj< z;n|M-e0)#QmH#_`;?Lapr{TuWcI325W05K3run7FFyK)G7R_KhMoXYsG?}#~bgOfN z&Lm&OqD2+SVw1Qk1B*_)ngumzY%zFSF#(2yrFJ4cyq5`^3_dv2EDuzx4W^SVYD$@< zMx3g2WRk6~~fxcPoI{LTEHUU@!`SAOYl{BpnGQ4D>@Y!-@DU^ULdd)KpE7v}qf zyL*1Rc*+INs^fh=aPkA!w<~K+)LW()ptBMSpyhYZPV&(-GK?yf@ASHyNnvGK0#+F? z;@PsJrhoFBo{!v?S#amd@cH^i4f6fYS>7)r-K^;b%R-=2z70X@zI7g4N2*e2rWQ-k zDTl2_KHsH~RHS(Mno^3>!J>RYnZ)Vr={t|tmiW4G`8M(4cxJRcO9{+o;$m*}qv0hF z=%|?=6U#jF?&UqF(}`)GSwp~k-^|Ikw&iGP?7sUhuZodi1Bda*VLb5d@=c7*4TNB{ zq2$ccBweoe{QTq3{Caz(ix#swC>>wAh4M%|pGV%66HYsP=NZ$;)A_uILC*8c+Kl?% zi}`t3mK~F@+d) zHVJJ}4CC=P5*>}Ts%?H$Gt-L{?|QwWl;ZjPECu$q(P-Hzeb+OuGv4{#qqGH)*A|K$ zV_;qus1=Vi2`Cv5Z*nf{8YX;MI2})XyI#a=S}V)CaJ}F5V)QXT7>1#JO|ary80lku z2xSk=W0GykJWsqlzp#d|hpcYRR;h*Bnz60WwN`$YoRioGT4?H)5wlAMwZdsD(2Zqg zT~`^9w+3rNe{WK_6cdN>K;QK|9&AlAyx1Y(rHWD%WPUpcc8G+c4Bx%jtOH+&NW- zkW$^ZkMlC`N~H=c=M~>|62xsJ+;l^wZvzEm49@%gb@!cN=rrG!6_+CZud(rApEz#> zEwdrDP)g)sWRbIJ6dr{&nl(vLiwxaK8zG`(k;PS++PqRJ9#p72*`A`{xf`$;9`np0 zE4tqEwcgQTrCUtH!y1+@G20+s6eCiKk_t5ybP|(R2vGw4T26{p1|7xcv*C7oWzbGj zTHtC?;!hB1k7<;f+77AI^vE*R5D$bHfn!W$rRaM{^-v6wi9=!~<8B3$HG0r=%Hory zs>(?@Zf4=CGsR|Z1ndV1nXF3TOh$XdBWGwHicMw~RVBE%ako$gY|b*-)-?2|P{OpT z^s2IwK`D+%w$XzIC#bn;xWBW=m6eri$&Ka}iv)=x)1f&^fM{)mi`q7E-mB*MfSr6$ zL90sF-u`T)m@P{2rAi*oQ+B*xJST0*y3tiooQo%_!k@c|N!J~1T^pK`swq+bj>BK~ z{Rq875lO5&Zm{Z2(f-RO0=QHbLA=W4jdzSmm7?BpJHYv+Fqm49` z%1Be1b8U*i21HN_7c?m;R5EC%7&}i_9cqSsx2b1sxT(GuY9gJI(S~F@vLyhO88G4kTNNUEvx7S<95Y^l()(YmBT>u+LE` zKA-MfZQ}FS2P@xYc+P5Ww?A`CmSPLbH}NX{WqIRjW^#d>Uob_XM#K6ymDjh#+jYjI z%232io+})I-f8GP*(;LGERUJIW=7j#GE8HpTo*#l%xfZ2`S{%N>%8&^ffsA|n|?)w zN^!Nx=fHIa<)v^;MmDl*4AfkiLm=kN;n4Hp<(WbuOc7gzrs%Wbm?=t@2?!qCMQNGkxi}T<=_%NoQ&P(i{nEB*iReTHCxzqbgJSx}7^( z3d${1@9~(ZRVaBSWQG>}sXImgvuDYHsw%FxgelUWI_`Sr@|Xx!yp>eA)x=YGBHRlx zWs)tVB+YrJMJ7hBnBMGpY>&sh(?t`RdZ?h~a~W)=J80Zt;B8L)(D%GQ4RpFEtsRfg z6TyhI^6D1uF7j*l;D`4IjzQu6l37xqvot7y_~CB%AVsb3n9Q{MTTGK?d*{hr=6bs_ zFAL|>c@LPZrBV|+MXfY~*ct-2`yKCljP@MxjO#$TYuvLXlNdj1-W^Ze=PS;dJ^Mx} zAwb0xS=SZsJ>GZR?{^;4Btxrh<6<5CFrcp&N`b!XTY)7%Yi`KtVGx}4JWnu;?X1)- zh%!mRl@rr6?UR1mCTa6Kg%H0t47Ki!$p#=epUxuTdOUb~dO{nKmMPt~-6`)#;@C2F zoOL4EadJj)z8z}~Iop;-FA9U**j;2JRa)^EV&HPQ2sP1lvgLA4>Y9{T)!N_-X{XfX zQdrg*XB^WaTe9b;XTE&>%XwAEqcY+v35n|-+ z?Tw)u`1<-~Zw%*UVP0kq!+~Eu{n9+4MgpmgZ6sn;5?&YYZv}~XD z+$w^?k14jMmnJo9Qpmn1#>iBrwq+BqmQtF__1X~W8e{S#Ec1j{f;qq41cuR%1K0ZveXw-rj;sWs?VZG!tf^)HwAwX=L{e}Vd$9@JXTlQb zw4pzD+#WNBe&Fx_?gwJcT*3{X0x1-1)|B~9)S7s#lr*8%K$jJR({h%WLUt93rhod# z@YCPn564}8|35ONWZm&_AF<(%&Y^jln!>_ba%jHBAZYmQ-g!(D%eu6P2-UzHju_%T zWDu{LZnQn|4{D`%eEswDv&bg(w$YPw$#9V0Njhv<`T@($yX=%(kNN8qf9adXhTbpXFP{TF_ z5)-Ec!0{9 z$u;Ah<>Uqi<9X&tNdLq?>N`~z?xpPgr8bryz2m1ia$$wF@I=qSd5n_$ng1jI1%u*E zXYq;@g~sq>b==$3U;?aB3>vzW>8s`s`N**hd@>JSS$P19X>9UZDXp0CT5>y5%RH$m zV*P;jmNg~V$R(vEJ!@pbx=CJ?-jt4%0&8ffYARNVw<2}$79#Jf=d60nT>|-3OI^0k z60CgRQVVx0(~S|wox~SfgR2$j){vsGT3%Pt(05`apVvqzl0$W)@ad)Ci{Y3(AMcJ| z{T*EzA-fdjm}JFnHQGu8Jv0-zvI_4Uos-bnh~Ug!k?b4O-Wz2lye-v24MK&ffS%>P z@ECm2gsg;@*JwdqCm3Jr4D+(0vJ@rW2|6{cSu$RfYThcqw(leoLcYajUBE%Xk0qyPz4v8qC>qJ#gWRuYv*Eu?K>U!>vQ)Sy-dsAMDH zkWV_Gwf$~pR+^wQ3zg9ster4PHmfy5PMNY6JQnX9*%wxmC<=zIXZ5c@BDu=luFTKy z=Qxu~<(+YqXU*$vB9w^J27Ru4UT?6hB&+$R60rsI>I&9W?&-lPYdWR4JOY22FFcBb z1}puII2NA99;YUZ^61eJX6Ule4hJkM3v!-8^UXv~$DT9?mJ%5{p_q|iGVpYFoEJk+ z;bc49?D>=<50f!9@qflYgV&57I*xgyJj5Vf|73ZqcmDPI31y(mhVfx3H4B`>hyy};8ue@T2>N&tnYX?Jn{DW#!-)Cod_i|;F+uASSz+V z=5^s;!h%Z{qcn%U-!oh`xvDqfUnxp*P&R3dF@|Lc7H4C9Y!;@C1`HYrnX zhUVJv!+pPDhlTRAo6VKxFpj(5as#4-u=1FMP^OJUT7($e^8jo+yYBb9OroumX>)HH zwNobl(==17(7U=$JWBIC({&;uRQ7whOA2^?$Sl5LgKK#Jtdciu^C})=5_dK7U`Ske{YY-In`E(Ya$1>4(12FS+ zd}3J_rg`Ep9EeFaXP{azXx*Dp!F7MXZrg;vQrkvAey6-iCp=~v6w#1rQh>}UBB}&9t&%1YLf%VX#t2_^tg1+~ZoEdw^`8e`eW~N0mSi^Lk zi3w6%sX?*K8dWm3f=`+r&%6eTD_En@!-)Oxx46^uo;CPCs>!Q@qBU#x!Wsq+W^UWJ zx_|FR{4Bcc@5?X<=wc0l=O?-5wdMG1Kmw%{^D?t63(rr_`=HNQc@~8b2_X_gq&A?5 z(lRtCP2!k$LbGfxB(uz5jpNYCP~oqU>Sk$pTa6U;2P}V+2M*O@tK~?K!SFBXm0!DG zcr$OjeEx}#WyD!oomDN3G~7N?kF!V&nKFW97b*cCFkm{3t< zBq(H(r@%_6j;I?NWld%FsZm(lq|Lgv8K`?#TT5+I2|)&0qroX|$HYaJLflm|~TPoT3}33b?B2szaxOO#+IjO3<&G#8W8zP#kop79*wj zJj`S_@ivDxNn|I!L7|r{a$=N;b8Rxd3S3KM@)cVQClW98`09x{F|PsB9_ZF;l+`G! z&_y2nl{V3KGRe|Za!Tl8=#<;UeEWl3DUDNxLX`reVc@9>(=ui#Lab8=G(tNmW=oq$ zZktB$B+o+fv}y|*YXPI}J@D4zjM*E(5ECh6=;Rt1GzPF)GbYE&+HvVuKKBa`9i^%F z0zepIMgbR{34Hfbe*ki0Ksu{IPLtW@9futBkK=E)H#z1*!#u7Nu5sIi~ z6*8ElISf0j_ z{JuiA#AW7I0<+B=(7ZQ2CfO#760erkW;e*kc;^c@){=Oq4s=FBY{NC-jNwTi=&MI7 z#hM~rlZTatr?pBm;5n3mYkF|gGZ=-bS^^MLCd`@caFDE;3M!|D7e`yHC`9l z#00=8ytSAVIre8}{f)^4y3V4W6~E4}C~Gi39dPr?uV3%P<-xT?UaNp>&c@)pMkmP^ zi7}yzV&ku%D!#X5E!l9&O0mA`NH7_tHGSt<=gg=(-i=4fYs7rhe9%YEe&E~q#^?CP zV}MHx5~ynxuk%Xqg-@rMpXm6ggtoM{fYObiwqcM@rxTr*Y?k}|{#|m_hHJG{E|&|O z&m0d29uIkDZAGUwmWrJ7p=NB&yp|hpc_M4WQVVI$yky5O=_}K76NDYH{aeR~6?52%fhrwt$9m3ydbAc&NH3w z8cj{4?N8??F4qe&h8;7ll;U_e^7ZX?4|UzJ)?40@Z@_}Clg8tEzwWt0eb;ln-}vWW z{sq@0Uzhb;%X_-uoaHbaCC{(x_o=;1`(-n*uFJmNk-VYwduUL@S#N=yTk!PeHQm4x zx?#=dc@|Hj_xt8cRkhzMAihawo#f2)lJ6v2OW(46^1f-@16q@80f%n*o}t&CmCL*| zAcmzJ74spJ@=UT7oeg-!+vP^45D}F`E*XVE8AVK)AKt(4<@HT~Gv@WS=ih{rY`yY9`UYWnG_#$=XXgmJ!;}87um(P5?FJzs`>Os8!cl^sofkq&dURBlZ zrB=UNQYeb;Scku%pBGY`a7KuPF@*2;SOZ6d5Qssr-hJ0ghFHrt+Tatkdu=;^Hh*I^F-`=6ey z(*NKvfBZ=u)Sv1z@8ZA^JSkKTbdVMIWo3F>DQ}wR+ktZ#IjEk4?j=MpC>#cxnvqb6 zv`8D7cBL#uVy*>kQcD&V{IaSVrwxXdag&8C<+a_7?iNkWa zg=#K^)Z|#YG&xlx_M|nVqM$%0Rwg&I*htWld*V7vE}LOLp-bhdjJR2TPTxDGxbVme zy286~;5{d(l_{-sMT%KcMJ4zU54@`f`eGQ0;e9?)XEAW*oGEvq+ziEXiXM{-J(i&`g5c9^PB83yARuyjS^jgd*d@>mp8Ni?exvHnItsDIPYA|5^ov}&8a zMm@1g8mv+(esFZ7CB;lvDg%m6S^A*qSHqY(!ZlHY9JKD8XZ;Dj9V5S_2f?i*79J&# z4w`>@JeZ<%Fy0#;F>#42x0)%ga(dr$co}%4!l&zmsxXDLld=@z|FcT*-Yfc2D5bI} zuukEepv|9OMjmVA9ujjBiqR62P@Vv7G^f$?pFjM_$H##eM)bX4Cpd==cQ@F(=9qha zv@h5R^eX3Bmo5Eb87IxVs5ow=Aya+%eL z-)ht%AMw^Po(EPPxyMPG=B%XAbsauBj(OmZ!$;oN6G|!W%v>IKp^4>6S`uD4rfI?V zj`Q=0>+%qm0eQfz#7So)d4kNJ^WRRD5@eLNfCCV-<;*Z(g|jGIMwt zDORMhs?*Fm(*M}AmJG(=dfC97PX|5@PjoomraM(Z7z3~UgMYqXxYtazitD^`nO9aS z=a+#+S1xhopfzT#g!#LCYsBooh?onB|O*$Z7kU`I;MXl2?) zqV9g0QZmoa&zz1&LJU|Vq_b^u?VW4qV#ZptZw{0~HZf|$j^};yJ@h?&-?KLP+a`Id z)aFA=4ZXgFF$>@+CV8D9hMl&x$=fQjA(MjBvWA6RGTwEB7ahjscK!ElTFxT*^({MTZ2_`dvnRe- zMQHx0P0l78m%KN&8e=2g+!S@2Cey94pyXN(ajl7>wuL@hJ4uB9qRv$Yy-( zdkMj|hGh*DE$WJ#3n@kk>+QTC^kCc{acg+CtjG{nrpH8V^uJsb*GJ{9pYcy0>H1-B zn*Uuae*O)R*5<$bZ~yh_rTTyPIUoM`pX*2Ur}_c&fUqVp6cc%*g*9Z>Pl@51=b(C? zhJ#F;tsq%*s@SaPlI2PDyel4C6|1fk6okr2TYQ$xiZNPDP}o`Hj1{T{7E>joXVZY@ zR(R>GB)oLf2yY+K-B>2(I%~uzrT}fl%dqG`BC-0!^%(f-B0*(loq5>G)g+Eu^PxMV zo#t9+bPGWhDv3xnoRfoH8`TatG2m+@=Ju2db4lb_@yan;;k##5h+3csSwmC}^W3H@ zGm)E(lwR^NLQTv%u@*7D>Yy-_{Mn^MmLe;7AB2)+7KNXUq+mA!d5M+0N}762l{{s^ z1qY3u!B@+VocO66d6x(J75+nf;Xl>){7IeZiZq~Owj8tNkQC==c`DMxjK%QBG;&Io zL?yHkLf=x`bA?bUF%?t<9TkC!H-;BGO7=&em<}?D@=?PIC1xCk9(nkmx`ChF3pEyg zNq1hX#GIMZO4ZUpMW1;aCw}n{?6bucA=-4o zVjIydri{{{yb|oOjtC9iv=G458hD|GNtj+~(t)&V#s!{NrGaV^nfm{5_Z~}4iuUSN42|yszvj~yM6!&m9 zv#Y8Fs^^m$*(u9L~I+U}6+lJEsO9LHVH z?$|MJiGA zEfA6f%Wff|I*oeJ_@Yo30pU2~*zHCskc*s|>olQ_zIz;QA%S(gtLz4 z=MQ+_H6WGzP9h7_7-N~+gkNcW&lZtFNpQrS_YLJ;n3ox)jhC)Mx02yT9q?4N5W5_Z`;SyZ1;nY1-}YIg8&$wcp(u@$J&4-|Mzf zYq@WTtdZA}Q@Z~fH0h9TO+K~Wvr&{*I4?4{&UKVp82XWQTN(O+c@f`~Zl>{Z9JyYv z_igAcB+`4&e%uptxnatwNzdvXs8Fj=Xm9gHXC24GQ5q4g*w(EP z1-G_6Y`J)~GzwvD@6j#u=sW36x8PQZ>$ufDg%8gkS~k$qws*B<^W2EIa(=B9ztzLT z1INRGM#jEp&*WQ(W}_D>B@K~Ml1F2dG(0gStZ{7H%F>!6r7YHW6c63Ll!dxaeN%zDJEXuP9m>f1KS$d`GNhgW4_Kz zi^wEnO!VGktYO_Ywv=!lzL^v6b%yHkrn?gazc)SVAH^vscIAw(Gn$NTnR(i1rfK4Q zIg3x~c7EGt)H#QBmU)>4%?^0q(f87DxgW00oC{soH7vMnqx#(k9*+aP|Ngn&0)Txd zLyWu3RVkFRXl==A2m23nyBn@s@jpV8&;J*VkA18?4#Niy9II%k!xTs{(HTS3qB~Y0 zqozuS7jvm~)B>0DjCC5PHL4nXsg!GB(2j%ac(fC#6y_~3D96F~d>$6wOro=32hD@F zc&%|*C@nQNC!w)fxq; z*r+9JFDG1YF-0~O8bQfI#pDdSl2(~^XM}K)w@eu{xI(WKWl5wlQd%tBsX`9RL6z07*naREA!UL|urs@PuS3d@Bnl6$G_hHClo3hIbwLvpTW2 z9TS1UdOVJ4-Jn$QePG2ylLh-d#|;%Tzt26!fx~f7nzN65)S6@}L1kWQfSTFbjdd{@ zUj%9HSkS;&JTKds3M~6bA07EUql}@q7LOt1OeTvAt}2Lya84)(`XFa+DWSm)6q`$Y zd)P2tM0G3I8d=Gx41Njht{o&-&ntb8E}MIVN%8S zG62X)&SV%0(IwUrSP^fP$h#`Le&o43GOsg)O30B@x^Rj!U$z&X?14|+GqYVNx}ZkQ zv_-627!Ua+Y;OcN$kL7?{FB)P-T!Q3uf4 z^7GSAob=2W|H_}=-`R3z-CIIfNlWBy$;7BQ)|r3)c|;#Q-`*~uEP*WfaYfywl(Q~$ zCgY4@+h=B#@v39@%Ykp_nU~?p+O51^W)2T4&RL7_XtaUAnFyXxfYIa^S zN#-)kwmO%)&qlS(l`>1AvKvN`OEq9k=X>I~@$w+qFh5~9($OoAJ6QN|R4mlD zD?SedozN{4WuE2vm~!U*bmH;h;Xcj3QRZ%%C)Hpn#t1;?hOnOIsTuNnuG7Rgjw1DH z*(1gnoU;wL>xJId@_TOCEdneEOw$!(P4nh(PrY}}5w^fM?nKIUdY27GN=)<2&<`Tx zYWKfewv9r(f+FLJ7$c#N=3dBa@l3VtNC@FxHEAuX29YO<(ZAF}ia|EmMr3Z&JTVO8 z-D6~|Wm+bvm35VHQ>`_--JTc&+E_Z@b2^{c!irK_es&C$TG{XR?00*9{rq>?R%yk< z{>bTkV%=7r9-d?av95QN_2a`6uWzp{|K{euk)rjmKag^2+Y}jwh8UW}&7yDEs#+ze zvy?l!_~rr9TF7eFwm|Ww5f{jT0Do@VvT2?ex}MH=T&IX{o3@)2alb#vIn!D;D!!Ag z#mz6IG(|PZR+Ikal3CYPU=ms&2c=}R)e@o6z#lp&$^t`j9NoydUN~K5!a1U|BE&@O zGqX<2HgPB?=3`)=9Ured#yUvgd6WRpkDs2HE;DNg3|)Vx9KN5fcqh>*&I@gHE(_Pw zf;ATBAZ`mr8Qd25^*r-+dFRvh7k+d2BZuw*+oWeknR@^%AXHj+K*bJKBT7Tgp<&P4 zd!-bI{a%{o>s4~JQlf90(_0hVH~&;_$n=;J+ZF`s5+f-WK0H68w87+8(wf+ue7;7D z?^-sQa;Eyem*!L%l)goIO!#g2A;|WBB9G4({f?(y{5eCctTBk(N@+}mTrDbQT-F@M zp0R7xj+EHeh_#(eFRHpvpmQq3B{AY8i8)q!>v2x=lsnE{V9}A~5O_0@L$dgyIMfao z?0uSWo5U!s?%6ud3c*FGAMlij=cX1|O=Px#7eDddZ(MBRToX=Zau#r%R+W;zOS4V{ zPBoya!VQ*96`te9!FjsLNcM+ubjG4eqsz6_ds8*lXlz^gY7{ZVd+3)gLg4bsV5{X( z!NErUS}tH9T6oJ14q*z{Uc5AZ*6094E#YdpqI!i%LcOzDqZ8BwSxJZ>QL=y}?K(6= zp-9$BOoWhx_+oNS_Ka7weSk*a0It7^qtLsx~~qHmj{BJZC9p{#_;@BAajVPq|l zuk}JC^NZT^Oy;dFyqZAqfL20Nsgb8$L}f_Vgh@RX#b6vdDwZ`6Op@j<7OIiS)uZiE zPN9>=E6r}~c8p%~496nS`RrsRl zltxF`+V5Mp?>8+9f?==ibx=rSfn3NxX|BE!YNYQi^EvS;b$pn6$dzGncqM)~rCWZ6 z5K#hDoYMSNJX-s6offponfC8 zzFLfh$6d#6^ypVXoR?fNMGDdXR6pR9Wv+|h^A&=+pJ1FiMkScok_(UJ$W|@q(?mQ% zmo+^xq=M7uoQ#W9W;-E&hWo0{WOnJsBi;4=JHC9WQDy6cm;jWu6S+*-$Db{5} zd4nz*l`{QrdlntJzOH=md+h8`F=ML6WzFbz7&IX!N>XH{(J51nVmS1;2S@OUm@`FH zs;+D*@>(wFd?jp&bG+hB&$>%|xxS;KVl|OzTW}8!HAruxwesO%Po5Jm(@LT8)EO>oB^5=Vyp@&9S_oP(Q~2fMfzR{I91_7qF6BzNRxWReP{DSFv8&9NiEndc3Wc$E zf^i4Bs`*qspWFdrVL7i%H4(K&cbZ27u_m^4Yehmw*Ro&)D;ygvputqO6{WZrJGm70 zyFCxbN1>=G2qrNd6<;0{-X-R6)JL&2874Mp#_1eyN^d}2@QRIdXnk%yS)C+ z`+Jc#O_LzCjpcZF;5uD-I36jr^6((Rn>VWLx~@3u=-U=WFuU#^4C#=y3PmK|hRLxc4614BQ^q`vFLbM%AcZJH)d=M$w?y1paLGDw*w+0bnvOJ0`i z`1z-wMUDvf*S_EH2~8F#(!%EXx%r9JkM4-tHels0*~_`0b-n*Ttu=?^QLgKG7L0Yu z5?0!NrjQ6T&O5yCI35mIE5HWHV>0)AnVbtLMXa%MU#yk5E-f^3xPMMD28=ayrjuse zI+S&?z1tH1{{F(hFRzrCaGRpWOs5)NJXZ0Po5ZFv#T2s1s1fX9q0@AoC#1xzHzu=j zc;2Ix#$|)Ep7-m8xk0xuKnHekoL;XSwPDFCb%-Q2W0J+N@U6_u;T!MUuXuC7;2Hg% zU-rM}!|sESUz^wGYM;^Ol`bx*oM`#6^leMC-|uA@(1r+y{hn!_ndeCc>%+*lZFl%Y z-}m>7F1cQ1U~r=krVy!h!FER;U5~flebTqjL2HFE0$EbpaGe6{R`3M*9qVnq@IMdb zz@Ey2L2?;X6il?OVz5@aY2=flMoVuThj9?%R7`}FFfE5eHM3N0>BQ5vh_>EXtP=T) zQ_@u*f?-IOP!oT9ocQb`FM31Q!h>@RJI{wx&lp7FqBLNna8EhoyqB=PHkn4X3=~yK z1ip3`{?=VM8=)wHP`|cDEmO_3{iBS>s*0)NaR@c>nasOd+4q{>X>7La=-3s9j^HPQ zuX0$N)+mI2QFTFCFh!%a!#I&PX)Q;`MGaB&xLI_8zH^*a;KchqA$BsA&w61UB8TER zuHtv`-pVvSil@k9Nm*z*-dTK=RcviH{Fqu|bvvxiShQCdYj9pn_!ud2a~67CE*YIQ zJKqshCT|(94a&)lC)F$sZdI6Sr~#aof_2l8S_-oXTy!L>%0yzef`Klja`XW5(Nist%QZ9imB3!xgy|(p*T{AWS96iJ5mf-Ek^BB3x6v! zXPvkxh&FR7R|<((Tk|+p@(5NHMk6xIR0@YO(tp*EC3w|p$>uS}aCL#~EBR58P6_25 zPk5#^FucQ0m!2m(qJn70OqI<+(IPvDCEp*;T8VU1B}FQQ%dnuFqRWoqcDrmwP-&Pn zrq-6BAl{Q|D!Z}g=PMk~8)+?sk}!i14eNX1vG%xZIL028VGe<1jbLGC9KE)5d&5{Z zP9}0Sg?ux^-YkXchdpy`#I#({A>v|Y51b2kZ_P6UKPi!Y)gTy6+tQ{-r%_&G-Y2YD z*&YkOtpn;>nEp2NTRYH?o{hwm0$Np`i>K2TH&`l`E*Ab+56p{2CB=Rl=&NO6!&yU~ zGvOjMK--9Twix_s$e}Xec;0rr#tpMVKU@AO^gL8c={<4E{9=3llY3(OI`f$KMF#pjn9%YrT|FKJ=td(@+B!e3q|Uety+ z9g`3I`tpD95?0P7v+E7Veb1NEg>wszhC)@DVl}^B6J`X{choshYT+6sZ;B?_q{2es z&uYP930m{bWUljHdHP8+U02@L$W$x4kU8#puo9>}n@Do7%z?ko5v<}G8c9$qKJ5)# zh%7PlydMZDW9Q7%X8E0Z!me=r+eFZb8Vkqb_-OXnMRQqaHnrl7!5b?$@|K$dNRoQ< z*lf$(4A`{7&NgYQ(7A?Tkem~v*zb1yVX(X}8?QF=ZdW`CUp479vnY)OTmc_C`W$9+ewWE2T(o8vh%qO+qExrXz{RMYmwk8%RY8U41X8`u)JRt<3YxILgLr zzu&Vg3o)hd0j(|2)p?PwS!3|tOW5V{cz@l?y09PjO+F_L)-VirbhUMskOIzm4*fw2 zaV1$v-|^Yfc-)!+0XAt|13uh{S?BY)`O(x}0;f=S+E|R=Ap|K!E>{8l7;D*&QkdRA z3OD&yOp&o43GLoq+hnNL!frUQ-|g>U0Ht7E1@15m1GU2MfA`FnuV32x;dwefa-FYC z%S7)x#&K+PKrMgInYYs$<1hk>WnMTO4wQ1`IxRxAQ;7eid6dMfmk3STsGHPIDF|`9 z=lI-wUrNDsx{$ME%S>@%YK`*^^?fUehrVaG+soNciE-SCSwBU5!@lSIUB;Jl!&or+eR`4^&AO9Vs}#f zbGH0Rz3@Jt*)b56=PNtrZGrNyeAs_NHR)y49odYS;>c-1HQ8%Q;-9?D6qS;Vm$jB@ zp2#^f46^;4=7}wCKaeyhIL-q)=ALl#{aM>{vXKi^Z&H*`NMf9m{IHKii6n9+OB|;Z3acc;)Z9>p}qMz z7fh4gIBQ$>Qs(xAGFqcTF|&pwMX|NAZdXQg9w)w>3Nz-ovIrm zv9KyZ{c5eKCeYWFUKwn!+3!6A7F#r(^Vq1+=Za1WQ<^HsK(?8ZE7~fG5yNuK1-)rL zvFF(Bd8-ruO`Y*%F1iwc)mE0evW=Ntc9WG{i33PlZ)@lsPIc9FTuT)Rj%g&r|c>m(bH_i^FPEWGH6 z)da3O^45RP!xbuDMiqtLA|LRKs}*0;qH#&ldymo$R*@7nAb^1^(!7e$V_ebbs%07* zV2vBGCXxv}jt(`7|KzBJ0JPP}u^N&pY`S33>`O<{mAMAIQoK=_ROO8p-Ul4i!tTlN z-1j_ho(DH_nM7B-SDw;UobQ;`jC$9M#ZxwsbcU1!qnQO{fQ70mv1V$n#4MqUUEiUt zBKpk5Y;x%s4PNnQcSZ#;Md6CUYlABW7YswNcq?XKr2(rMb1!)CD1;kZCGa=pj7Hy*w8;*L-I#e@ESfiL#Gt$npumG_5Q66 z9BRjvh;68HifmVuQ>adpmQ3#)W9`|#ZD>50NfsgjUw9e$1DIqsRwr&%AF+HP@#PM21bKd0MrP046rCuKDa%n2Y*kPl_ z7tPL$Y&PJGAx4o3T5Sa3d&kELKAi%euU}bA#2h?US$6c8Y(Q5^D!6RKL|!#I$aSi= zirI^p$%WTN zBw;2hW}P{c`A{nF>qbZ-OT3ZFrWhI!B;B7C+8T0#8Tfn>WcfW5@&Tuez zY!P*-9J1rd4iE}2?-zoPC@asdogXj-&hwR(z{7EeDuwIiM2wMP7$rRPM!m8Q@7 zpd$hlNDRVhK_$jT`4WtDh`YFJewn|d$uZ`j(D z6QyRH^Em786JjY^^_|*gjAXFXr7}&|JM=)cB={RWD(8#`9v_}~d41t>x!iq3T_>Ba zQVZ5OjJ4<>krUG-gs*v?NjY&ky+akETq#9@7Hg60p(dHTg}@qZm=}>7-5Q%)LuajP zR5e-ZJ@Ld1*Bdm}!iprqOP`Qs?9aDJ7O|!Ne#?@Deaa2BxYZ$AnmV%W4#FQc9BhBRTc5=@T!h z+;@i7c&+QoZokJ`dxsa?JYv$gv`tWhSM*)qC~)6pjY?^9mhe60WoQ<1wXF7pAC(s^M-vX)UuFcz&3f}J=5YpcmrhXoEv$= z;;kX(O4f@+Q=e` zev;;)R}e@{DzciDU+v0e7unZ^WAco%WsL4VN!1!`=P*XIn#jv=<=1ZFn+~ihH*M1Q z{D@oTjHE(CNrFk0JDp4x^PTiqzX!TDJhL*2mBQQ(&AX0Rr7#A(u~?Vt>$2Ra;%*Cl}o>o z$uhlXKx6r;CeAK_t&}eF>Q{oQoXJEQkRr)NT~(F-60io=TBs|S*`hWLs}!Zis=Gnn z8r`57^={JCjoeaVy@%%3B6Br^kh8q8D6d&nWNi_a1DfaBabQ4I#S|7sI%0dhiNY}! zW}nGkZcK9xOuDe{D@#8UW1(K9dGpFL`hlzpyE>w3L9H;>ju;ZLW@Z&wO2iF@pbFVm zlC1=l&{5$xP0^Lu2g<0}K2|=jf|0dGP|%kg$V$xIR%sj>i{_v_AFmxxD4a8tR7id0 z)2_#@h7OC$6_pEPcBJO{%2`m?Raa8XlvG4|mv4mAN?#m96~l6_6;C9pLM`fkP26y! zs*$;KktRGV#lLh1{^&m9E{eA_@uFv5^TY!kotA5L*AK84Ph5!=mn|+N!Z~8CNI@U$ zz~1$;!N?V#EXj#9ZayaTqvJ9aPNyqbD@w}Ptmu_x96C}iT$TkD<$>a=xd;80EZF<3 z+u2dlnBo+@Z8WYT1Uif1CwF9^ClHv|MS_o=rfWf-sZDq>N&;b{$V!bCRJOMI?yJzv zOF*th`<)h7SY3JN$$<1KYNd z5S+Vr4nH`SQ(#$ER1#95b{cauEFlm=V(&-N0bbLEE_LKRyqlH3oxc*c!o%apZtvK( z$nMaw-*vo&B$8KE(WMYJ3A$BH_Vacsgp}!Qd&nro~!GM+RhjT4_Sjn&~ zM^N5yJU-q{>LCWfJ~tUl{lCdYN_#GqQtlz3LWk^77e#+n{5%f~PILAN)hQOE`RWo? zRkpSjQ_jNCvP?p|>N+oBmaPfsyhzu&&J!EutmM*sJ>0`Rjj`>S-GVxEVd#6tapZJ5 z;hdxEI`RKF$MJCB>&wQp%pygLH<_2dqxS_;5YSF=$MdqZB7eJ60Y%=kq0p@u7W26= zVww*j+#8Y0<%-tdam%^MaYSJv()zfr)RrrCE9hujt8pB~C?1m}*5Br!waWIWP2q3B zqpB5mMJc9v!WhHD;juvgGTwPg3l znnA&i$5sGaV>s;gt%(bm-mo9{oGxe9ZM}bON{QV#-gA69*O79TTrpr6Of$u|jHu>` z&Lv@sxqFa0@9$DZL9`o@uB|KEwvw})=b;q&Y+F+#LsTyii*cmZ!m_UPzH8gKECqg% z=E%3L-!uiZmJF~I6PWLaWn&B>1JJ-BeNON1cH^o#MhFzND8%0qYBbi!1c=)DyV%tuPIkJ2DncmB1wY4TYXBigU z?n5~zLXs$kR9{%;FVyZ6F$YvN7-g}>;f)u+{C~ja$0nz+O38;}B}q4%N-`A_rBF~> z9yVUfT0S9!oxyb&B@&>N60s(sj9I}L>rLG?xY{W3Y80VLiNvbW+Ooz)@vdm2m`!5o zBPX4>y25)+9Gu}djF?4Jb7iod?f?O^4#-&~7-x=WLMn$PO3rZDY zE>vyWR;d01G5od?S6Xt8N)hQqP??aktaefW6)~M=P$TCY8MI|kj^o8KW=T!X6p}4C z<*2zb<-i&f7{y*WQq4H4(JFy1QlL@!qG!}0^P6%&$AYb5M6}xCt>qdcFWrPTir6KV zec-DN6eFKqsv>7eRAQ|-DqhXls`19+vtcWV$w>~$jz#dxso<(&S9%8J=&|Um`N+V( zxDnlH{>nRlDkl<|F)KP;BkB}FO`KI`voPTJm_3iBM<)fjVvGFzt~ykLToN&6eAi)| z5ou57rC6;+HfKr#RBQeopjN6ThC~UV19ZwZ6=UI<0TmQZDO6DmtEE=iY`IQ6CoF}> zQPU|ejZfT|*f{r*)l|Odg}LAOH0*eG2O+veMYmYgEZ(c2gEU%JC@EW?xIQLc(hRkb zbS0F6%Zj6O98$;SpCacdewK^M=uSGsRHU0QNY$%>*A=URAF0#GR-;{ez|C%?31=SNQKnKi5u*jTFM>r{pH z4hF?i0(li_2L|dvvHr8-C1vzdh)QuT8N!w4>e=gopUshRH}LK9&b0`N7Fk@QTmDqe zEn3{{4YvRQAOJ~3K~z>rgPC2W^a>S)F1aDTr{}|gFh@q+@#G#@^uk;s$~2&g)2*p5 z5*BMKSnd!5Z4^+@PO`_0(szWcJghP=r+2(@JdY2o*TA}NO`cZR9eeR-gxE~!vdJwe zO1N{87=S57PGQCsO;;t*^yD{YU+Amj#ZMTm@!4|iBcIiozB;ZCfzu`OM8Z8eUfr3` z;mVpL%dW86!s~fOdDwTF>v?6HEgy~}?^nrCQB}@m`GE{p3v5j$lO?Jb-QXq5mQYpm z>BE7)eL0JdtK5>;TNBWNp}$L!8?0RkOamacB62o~qtXo4GS7+U(el$z5176q=FCUG z!>a*v(fnus2iAGvb-8dXj$O6rdSSH&G@NrG2l!(;VAjfeUdUNCrv`;ayhdbM_j{1OT^fBb;QHt zBbUpWX`0$5Xr%9ZDSR7nV45bze&D!25TX#|B-=+k8#D<|*Y}Lp5@O_hIp3*lw*A}~ zBm3QsbzAQ;vU!>r2Jyu#Exms1ZieoH_dQB!c|RMC?iMaus*oM4lAuy!ObgMZH7K`C zw9*E0?oM;N`JQS61k~Gv8_B%8(fN!v91lm75)i`B51xTqDY!``ce_2)JaM|5>AQ|y%U7yR@_Yj^q?GQNIk$~f$yv5x ztq3yO-U(g0$>B;VtuYpF)41C)4x=Eww@onLt?7v=l4AS;f*@*vTVvXJ-x^zyZ7%b2 z56Vp`qFUC@?X1gr>hGCS3Posgx=ps$?C4m^XUvv)JaG4@Y61gX#GAf0-KzHcz&hq+Yq2D60 z6hh0;DO-YEc!-9_WU*@%0GJkNkBgZ;R-(D^K7D4`KT_3&^W|?GmkS@=)+ClU+ib&r zw?;%FGRmEdSIX|*6yBO$k;==qIK;@%3k_~r7h+Qx7-Lwrg?U@}ccX~FZ=XNWwUFl@ zk@luFq%kH6g_t)kk6)3XM zJPB?&#Y#;YwKEhY1%p-^U0NPb)9e-sB}1fOtU`IHHKUvo@(>!Y?DwgqF(i{oNn|rZ zbAwzo-aAy$__S~_iK%90o!M-G<1Bi_SsJoDR9?D?H#KuI5pC5ye?>-x^?TwGKmJt; z%v=ge#l~hc|L}Ff0dA9SBa^Fq+l$|uqnndkh*za379vxr(o}fEbhJE;o?Y%RSxX3M z5}!=bvhFm9l&_Y;fML~^l}r`N0E^1}+O33RqRWJZx68~kp;y{84{*Cp7lV`kwqnZ zRP3T<=X#=vyjL-nhphOhMjmU&nA$XoAcSPV8KLYfVWZ~Cx&=8OwqT5+vyF_UG;7*O z?S^3x!*i&S*ot_Y3WN3{SyXMam?~=tVt@~VpT zBJVz7KSqu!a#)mXN-~m1R4bt*va8g+;`3o<8w;mx<)sFZJr&tNq7`S8IjF#@4OboS zXy;m_@oo_`WG#CBp=gp)B&CR@@YPgaO<~B2oicnlc*(ERJo-HYvC8$@lQsRRblQnE`Gx+LuxCZqxW>$@XI#x5IfeF zmDw#QG+8Bjr%BwV|tint592_nyA9T&^q6z2}$5J->cC z3qrQu(SQHI8#P+7-w&Lwfr{eweWN$hENF~epYZ)&T5G!pw+#>q=_utrDfzbPZjxkR zGqCzh+-8hctf`~Rin?Up-X{LVKhon+QxWo9Ub%*us7224SUc8|h_zrSgiGK<{lJJr z)yk#c2nN2H8D$HzP7(zWEe?Y!|0szHQHsD^3hS1z*59Y~*Xha@Hs)<1n9zpYCXGxrROKwl)QWrOY$e=_=FaQtr(} zrBOz$Y>$^^q3gO9lzPB9$II&rN^6lzDSby`>(8-43KU743z$apQYsULbu$?SJK2}f134cglGEz2T4EUn48u-om} z)|F+Q+3y5uFfB9M7)q(6B;V(p7b$g$SmW;1PrO40?EQMZy+*AxAp{QN9`twFq_sPd zp2bMak%!|0)>_V&Go>ngCphj9f;3OVNC<&>mIk&e*~s1A57|=fS{|L$hHFEVn+D}j zUXwaltYGa=zTjH3x~mq`$>(Zc6i@wL6g4UnyNusEKG-AHI!>1>hv$K{E06?^q>R)7 zOUlgohT0Yt$+f`tGILxK%4(KcF{#OuouOahU$;Fj$}?ujj%5kdP#FfPQ<91dRblGH z>*c>t&CF)bl<*Z565Hc}P8F=xZ9soRic27Aim5@JD#l1tG+ie`isA(Vp|_>fvaV#n zqP1omWcx4Iyhmf$a^Q_CXW$ez4z=T%k)zv539D;UL)DfYsM(gl%FH>Q2(KMs*8C<7 zJd_<NoVQS^xi&{PzDAvtV6krAW`7s0#1985<2QSZXtWY7_y<0P)IEE93yz zZMjo!H=T((5e$q@Q4=InNGh}DfYJ)zu(h=o3>mT6%S1IX`^c-=xRRu6ZU^@++|}y4Ca2ySp6`K-rM5(R^mouf`7wQ}{;(;k z-)#=+2cvgw%~6#^=}gA7FWG?4F0lB8r`pjckBbf)CB0f(B_W{5)}TfhwI#U9Qf~iz zMU~20Gk@_3S72u%Mz)q+7PgY;2FX~WH80dkSRyIO1bfI1zZv>s>8qv7k#isTlX+#|JASeUKJ<@ty=Nux z&7WC5DK?e)q5?}!#2mjDh4s5%A$IUBCrl|&8i1m06Ym9~G1LOC8pbM<(S&U6R^X%e ze2N`zQye!>z9!b|%3yp$%gc49(R8}Qc-c_w`hmDfc(7AePKRz2_N+( zD^{JERbqEF4AlwAk>dz$Kyy;ilg`F3R_5A*a$_u1bz9;d%ciM z;_%<8d$S(NvMf9AJJTKPnwbv~IaXD(BnlKE=>Pu`JxBrxvb)ihnGqS`?l#=vOq&n; zn0aJLfCNxzv>p;QW`?`j9nRist#A2(r?O*Tdd_C!L*9c!)70?f(W>M2dp9`rbu65JDpGvF|DT1pyl=rs78b_uO zgAk_`=M4;=YhQW2MsNxf@zrpQJ$D& zNZ*pXtW{7^2<*m@>wIOJ#`~de7zPC4e7$H%r}td07lkEx?Vt*wyN9%I1H&x~ckAl8 zD=f{zCRKQOec^JwYPS`%ZX9Wasx7c@-vi+G4hYb}$yrq`^fM8<(BHE@>!zPm-}gK} zJ>RW{H)OE2R&zY3H%iHDQW=MlQVWMkONOskRc~(C=h%P^fByMTeER&E^W}24@8zbr z*!B`BRiCk?YBhmc7hPMNsOqA&z{F@BrFHx?HiQmOqJWEBvMPo~`>0Y*T+U}w)UGCj zUPrs#jt?I`(hmd6JY$^_K-Xn^&xW+FCK0tC&+~lmxVp}lyApmQ=@n5GY7Fw;N7ORc zV8}HidFH9~jBX-TMM6_Fv-wc>40Hquy!7zv?!-dj?KBgm^0*&ZuL)l@j&Q$LjDR!5 zs`uOzo*#ne<6*}#N6t$ki6EsiEFH`o87t4XMFChGFDzIItUc zEOBL;c68m!Kih?~d}UW1|IvKU-t6gvZ$opvcTVM;sC6TR$m3v`NyJUCW#g1LWKC>Q zV+`N@_&?~v;a`jS_W!{jGY@p)*h)rxg<>eqP{ck{&j#w}{KFh)LVF#R|{t7zr#Tb8at1q4K$3 z@O@=L*lryorBQ;a{ks?Cw;0F23ud*0s4<;xe5%1<-^Cmw?*oo`$M@2_?YK5D*#hPY z)noI7GnSpPd|<~z9Wb>bWKMSF>LOwaW9^vM4(klTIVweO9t>SE9IQSpe@Cq}h~Nym z^|!*wWU6Ze-ED{iy1|oTQxJInJ*sGSq$Fto2f-K(LW>9`R;*YaYR7XPwOlc2M@O(K zC)cbQE#vj&ezu!_ik^suhCZY~^qM%G?#iS?2xBX%eJlCFLDrb}E$3V`7VGI1lJYusjz683>vK4)a zr=*8$*Lix=(K}VlZrjZFc6cbJk;IDP-8*YJxSm*?c2iZsWW(S*UC{fyH=YL>*vk%! zWeOw7M}l#zTVjnHwQKlwfwW}iTA_nfRZ;T6;RjWiUv`QAa#`>9mx=PuBe6m%xD!{z8liTMb9)8EjzPCCXsPv#=$_xLa?@R;{+Kw~YP3F7(K? za*7wqp^`$y*uw5%smH4Gl_72%9+nRMqHE?Dl1xt}iR~%UiuG+SH z(O|W+nu7s%FJX>3K~?48R+4-}AS3#+>w*>qm#6>^>l~Gg50*YSvP1^dQfj@bzBy+Q zLvV(tp~Hybm(#2kv)l#^^#rjb;dGukP6M4c(`n^tXL#HXeExdDW0B1J zv(=dPd=^|49%@IF%3dnW9kJFcd3U=No<`Q^le8Th$-VyQE)>scwNrgCM`-`Qyoid5lxo!<}2RgHc= zjAZB8_J&K%JYJ3*7r3r7RDA|#iVi-LJ#RJW0VmQoA$G9 zF+#I9&C9GVgmzz55xTyoG+VD}7B}0)xF!_ z?$7UL>%1NOQ%ZDQPfAh2IQu;UjN`6Z<7O?1OuBIDyMZpOB%>CzQY*W0)Mw24-cPu$ z3(rr_ATTd8DJ7mBANlk-RvLyPiKCCk8CP%q!xg*^)I!zIU*%UI7nQm(=@nmMyt+&*iNUMYGsdjI52?YUDwQYS#e9HNTOp@8=F;YMRf*e z^q^Q9#YhnF27+l=JoP?j3Xx0>q68cGr<5JJC#NK|52KO=R;K?;LwO5S(Yn zjAc_2kQgqtAT~8I!~b#6X}(je`J;{EzL=Ch_{I^_(9bsqoBUtZo;%IAsYmu3`a zc_Hde5FCB*%xioP%C=2t$!d=?#$lxSiH#n9>ROO?NN_>J(zWP=j$#;!5$I%(J-)*IkN+x7OXFCE0Hi5OWq>VfkY-ico9NO7%r zR%Kpe6(k{6iD(w10ef^a<;Box*cBE}J8`Nl!1c^)IGY8<4~Z7Tt5J+o{)mYpKIbK+1(0-nXL_pC&& z1yh`cjEkb$t+QO0g>8)tLr)(9OOC{(gSV-w?uJH%k=8Nfs>5d;3NLnJGnJW*JPM`L z-lsv-PG@SOY^`6z>jPPG!_HTOv4Yvb^*Qs}U0H0Uidv(vnhQZx8Oc$Q76#NU;N7PQ zSW-1yQ(`8v=EP1M0Y|ZVXNgrBT;3`%>WkL}edd_XKrdvk7Rj?)csqaP#YD=^Vv5Cg zp5t-Pr}I~85f1Afk7J-i&WWjdu9ulu65?UkIpVIe7;O@l1QK~an6^11)l9L4>ZI9B zqzw+}fQsg^?uR(*RK+csSXC9ZUUQk|!Om6Hw-$ujZv}3vk z?Q9tKj1n&ohoX*V(Wfq9vk zb`u7}>3nWwma49VyHb*gjT(0wDm1^K6$-T$j)x=bvZ%^Gj*W_^iqkEhqjon9$b0Wu z*F~QTMF9i1!Q|T^#kL{shNvzj>jBeyd!M-g86g8+zOAj8JO9T6h0> z3~)Rg*|tb2mBV3wS7dJ8HKmk0fIw+}O26xxDslrcJRBc5U(USDFKpY!ZrCABg`0NM zT{XF5%4^G~nA?)1BO5Js%~=OJC4ky?oM}CB&DvI~LJ#!)qlezZeot&YOt%8q8~ow+ znRTtd$6#32g<%*O$B|kKDQQ;7VCX`pokrVwNB!@1J7S8OA!~z}+Ow`|?=+R_pjyk* zab(?`HTkZr{s0-QWqjnDqEe;$IqT>!yu4kTLnKg4YTbSY zk&f%@XHIXQc^>}KpbPIx{lDcA$REpq)Jn`7y?CZBU>%q$8qf{OPcNiGSpC84Hov@69%`*%73JCoPbi*`rQ?_aJ{w%MxY{Uc)H|KW zv~8hustow5lL2iXZj*E58UWD0A|EH!bi3&z4x0$*7<+e+Ltm*cGl+)LIn$$R%{{YIZP&2DI| zZhJALnCS>)K4b5tx}EXZYzVGr z-;bmu!U6(gM1rgH5o( z;Y&xIS2`S%^i)x6p@uj`65 z@|y1hmv!O6k6f0OVk_zQ%%k5kU3=^-bT;6wm8+~|U)kr5vQt&`W?|K#r&3~ND`32S z?%6hIijlk3P^6OLszGX_s$`K$GMP0;mbkIxjoRxoH}!=r2;*S*t{RF_W&XM(ExQ{6 zTUHo+Duu2Kc$JR7u?m>`L#|}uT(xIJ4E%mt`7!kDcLSf^E_995<(*|5J#$KwR555) z@cFpMR)blDpURHI7I?KQ{bArI`@onilJxt{TW-52!S*fSFNVE$#4HSAb?6bpR%-kH zMLl!!UO|93f;TvXQWR(W+t&;KZU?(T_N#MA3*bVZQ@kWcYy=^o|lX<%scD>_+j2yk%W!>nh z=fYw(vQ-+}FbvJooRCd89*($XskvM)#1z&3))s)d+$gWw&7;|Y_e_TOp10H6Jv)<9 zMr5Yzd&Znws9JQ85P4Tm+|BBwLzoUW11V*^S9G;?S^#_-bZ+^n+n@umt}Fi5QPjfy z(#p=Qb*j4DhJmIc<(m@J@;rURV=L{hYZkZEepY)QC=3cn(5|EM4kt=jS7!hKAOJ~3 zK~$mMdwy*Du2W99Y$k<;=naoed0v{eG)~%3gWjA`#nmJYdOcoJRg%AvLo!Lua+&exF1N$|w z+m!T)H5|U%(f>T~>1pPbD|IVOW3P@5Q&@2f2g_;O*qwVlZ?)@DX~|lwn{&om!xqiG zRQ6^Owa&54*E^J89LJ{m#8zgiDrqjc4c39wZ2ciyLbQ+}^_e;d*6Ouyt-Yhq&zCc? zCce5?&eI#lb_AmtO=rOPK)!y)zx~GH>3g~`==rn7Kjd5C;NRFF!D~ZDlAuV!#`B_q~eOtVA`UG^2)$&T`wzI+i|i4T)taD$!SE|9fLuq-f5=37yM` zQ|nykJ#)#-Qiv?N|Fr6@z6~F@NDU3U_y=Ht{NMWljWh2#oo_5})*3vzF-%64Ez^dc z`~S23fyP$dl62-XYT(NeA9+GUc_ zJ`aN)#9g&?o8$b|5&8-9&?r)-+19Gu{kR(1RHBgajWU%5iM5@!zsVrk+qS$RuCV-t zfn)B7Re0P6#;66e!RXMlY>|k?2UUHXvE)$hN|7tDl38ovyWHWeC%T31Pzc%KRs&VD zHm2E(u&{|{x&{*vr}hjfLI_^FPQ1f{4nlFGA3J)lFDRoFNUE(AU$9v>XW~^^xP8a9 zHt(|2JVe>RbSPf9XbGrkTQVG&U~$z@dZ9MDVHW~tS%|ifLm}J3*)5!1}jUOpS$gQw!;Bv$yMd9elA2u2V{2tpw-j8#yU8+M9Jsypt-#n3*pd-dcvx z(RZzcR|;eZ!7)#Tzl}2~3qQ$DTiZ)gtgd&eDjG*;bdwpnK#@YCu$jzj7jb=Ha28{9 z^J`E$pvRCa_X5E8tw!@ew)@i`d5rQbzR;nVzt*I1a@h&Lchdce0p0crSkQ%Ft16KN%^A)-okKn!7>hkIVvpVoHEn0G46U2 z!l%=fH5YcBN=Y5{l4c8S(r>ec*#T@=N@}-^z*ACN_#%IV}i|rNGZJVyxv?SvkeR>9jE& zJHRvb!n$PM&ND;T@#;3Jhd+Hh@R$m$iEw}qhX*e6jJy{7&d}F@7f*_rtOa*Cqd0L} z4EwF8%Z@CWv&{4o*bVBpS9PJV#z;z8Ey^~Mi|~&`zWB_u?~%STKNdPMgjNbYWyg>l zBwYqMr$eAoECii%T96$LAuG-CaE`cSDAjO2TzTP*qwJKx)ygKFaV8Vmqp2Lh$_?3 zI^vCX$r!7Sgn3z7r_#-4s+PWGUG)9YEN8VU2u7*~@y(5rcZUOL-e%o4x~}8lcqA8f zuK1uCoAdeH;0e0Hw~fdpBAhN~K0G|LEDOUhv`!Z-^E55Tk#pwp@sTfIz93QwerSrW zFb)IP>qYZBtx(ka8(p<6ovg)*)6cp6?6(0?kURXwI?H~4xZ|*gPD@;i(IL`@W~WC> zn+;ktJB~Xr+$n%JLRqa9>oxZ^&$Gg-8Ze@?{u(9kX^+t`j%3MP<4PQ0dvr{Pp0~?N zu#WvMP?B(2b-_OMo-PW67y)Fid5uC{^p)iNaK6svo%y11nPCNP^ zdeR5Tov@v=4)?X^VeE;<;;khi{H?t3oja)Au@udNwd?6N{DW!mj?(UvNS?3M@@~Pr zcV|@vU!5ne( z;5!aEv3HrwmHG9*@Grkq!t{Z|^nr)*={=q)H;wV%)*$3-ZbeBb)lHl*h8{CoW;@eg zJ8~^V$!$|Dq>!-*T(Fd&R-s^2s-L^a+Hbt>5@$)o##Fy|=8&*0pjJ^bN2$4$f~59R zu28j*vonw=l-dqHt#H(sLhmiP7^O_z0{ilJAOmyT(tPvZH>-@8hC-x#LxF3UYiro@ zEk{$pB#hsXYN6~g6`WK;_6*yex;WO7v|O_`7QV5#s{Io-Y9_@Q#oPL9_}+{VEVgsh zrK+W%1VXfQuYoBj8E)(B!rqN->!sW2VpMLHt+I`YMKYi3nbj1|HZ$AIk689} zh=bY*wSaNbUc!Yyvrjd;RxahfwX3D&PD~{Xfnn^3xlpa>ULwt)|es#$KH25`#o>@M2(qU3Zw)Fd!$_Se(Qaw*??4_h!(?D zA-Dc5izSl@1VZzHdu#E=y?cE-Lqv!^GrL57Ff5bs+ZwsfnW<_)UNA7=kU=O_=n!_j zqdRK&?tCp&ADD)~U;Q)3Zsd|9=ON>J_~+A=xh9sps%^1`yIo9|S5R}odV?PvHfMry zj3IDd)zb3wanFDH^%YwMZ!%_1{DN`C1H<=ySiAiYQR3~5WetrxZ} zwnMHiM*3=T#c;J7U;LG!27GZXzn}_y71Z)oGm;=!*t{^8LcA`mm=|_pcq)!V4ooG` z-}+>Vu#pveZJaK8#Bv-vb~hp`N}#lxf#5N{r3SgQ#n*M(y;r@+Lm(0IVDJj5J=0?w$Vc0 zsZHv7y<(L;&%7!jZ5)TYLZNmbPcET#4Q2hEnlt2EJa28Kt9Q?a=zFUcVd#5BK{o{S z4I%8TyIbSTH+C@R9AfMpA*_c)nu=o^B3G5mzUw((E>!2#y3~HA8>;(Od>T3>)gAVS z`#?G`3*#`5a%MN|===WOc{I=3^_FtRI?IRS1DETSx6@k-z?*Mqc>Wz@-8LMyk@;>4 zmTkrLTijTSW}zM*9`35lw42mI*Br53=$Or{YLbCL!{eU16n_2v%qEq? zLyz;8aq&FtdL&o&L(dXdIv1#GMP4#{<2hUcIYz#2E3cO`*;RI(r)JBZ5qF9lcYC_( z`Sj(&gy;Lm30H)F*)9}QDEfvWTSFD$OyXw*MBzt?yFt=rOA^Nr2XG=)#E)uA8h`ku#YBAz#PUE$JIUP2^@=ZVBnHm;Z7 z*qB)kkL3Cfh}&4o6`Kb>OyA>exOacvopA4`)PGeP-233uB-a}{)mTU8JGPLy+K8(& zb=B!!@s1k)GS*<6WwQyJ)F*k`t-OVW*;kep5PKgs4Bkrvi0aOt$(2R)KnTy*HTD`Jz>+4hZ=Zv z16_tG1qRb`v=c9!^#CI}MBoi>^cwWHt=+lmhNmVW$3jn_Z@%cwWVJAw!j*zJ;X79t zoWt}wY?jvfal=0+3=$f&z-OFO8lVPh9ia<&)O%hUeayHvR3=A_+G<~KpLL@uNd}u8 zwyM1^k=T%GE{|xA0?qq^3fQ32)Rww=63q)%LmAcl>J$m6lT2awKh;IYg3!oeNYd#R}C6 zn=j-^$ej>Bz{yvBn-@ZHjdCcQ^2(QdW(pmn>u@X3NJI0sYVTJ=vDQXctF^LZwLE5H zkYL#N9p`0fMZ;>VG}blJ-8VNhAW~6RhPhkcl7TN4cD-Z2@A!INp;i)*mz5|Lhv7p~ z3y078ot#W0d@B4@MhyWMbYJw#u;|`0Q8Wmgt<}`gT^^Oo6u~WOKk?t7ZticB_=6 z_m1<9!*NGHbj)uXE(ud{?A^fVdS2zqi(FaC%3B+nhv*2V6~!7zR>3Vtu{fidzpXQ6zKAd67hH1AXHWw{6oL zQmZ+rrQX{bLI_N|iOc0e*L7-tYS?K3`d)2n!=QH7X*W@7Wu9k5gx9w>z6;@f&@x8* z*{r>H7CGw(qaM&h7w!YgFlr~xw&^Cil*&9`bqnq6-F}tQJIU>Kj0!F5V+@UI=I(*~ zTUgvQ1w}1t`EH3@mId2ej>iYKZDU;*&1W|2X*HU;$n7vnE9|ZJypLvszU`*5R)1da zJ;tiNYuZg*t`|ztA!dskhr^NeZ3Cm=fN3`o+a`V(29|ZOn zgghC3e?2oE2G*Q3Piq`6>CB^@=xw+wV7CEYnxbQUtBq*`Hv(hp%39q<@PTDrSe6Cv z6$}!$$TUqD18=7jaoZTjBVBV2SgS6Nn%|=%w|hd%gd^TN)-AKWE%e^4MXy;J^=X{wP^G% zu(PA00!`+^!kgcqvzVkdtk4>X1A(neI4Z^)Uj5A1ap5&&qALhl2NkjJl!rza6KrdO z*P){11}ZSMmewLBH%E$KN z`oc=)NXJCS*{u9#w}zN{AE+dICBL-;mzO{%otA^zLTU$lk6II?YEj|Ma`b*U7f1$4 zS}L_n96J}@e!BcWO z*n4I4J8O|3xT1x;n=fRi!$mRe7pR4<1$(>BaquI>R2CD-v_^NAm|f=0L{^j4CLh#r~{VTZ6*OD7gv zRoGi?;dd8_`75SCq|!@A*dQ*6xav?m`krmo7jPef-g`yb(4!C7SaRzYf+&U3X^+lo z3*}IF@mER@?kTYQZlq5=hk504O01?}1>R)kpZT4??4J4H4wy#iS+>Y^+lVQ%aqt5_9zI|fOMHnubdwUKoLWF@5yoy% zt7R$lT~EpSd1|&pRpb;4#TL4%`0pecXAHS0v8*3hfX z)5x|ZzMf{jeTY>9ucc78g3EyqIlgzAn<2BE`<;=20rqb?xEP2c9 zal|#T&w+JY5mV`HAT>LV3y%Hs#D#_VydtI2SBFP2;Lr9zykzDWF+r7WKO0={u)Ts; z<{HVOJzr|ku#DBS!_sv{4@lD!zwjr!>Kw3pJ}vEBHXyb*&&&2l}BOFhJb4KWy-=bu8=3!-EF%FRf71Ij>p7 z)?;IWb{iR^Sq3e>RE1%l=LQO}Z0p82j7-yxWm#4EXiCTpSFNFMqq(1E-BOrqZGxu# zh771fN2xl<-iDD7f>Q5pG}@FK2Hf3)-s&(hcjDU}igUAn*8;V+!B0Dno}ZqZHA(NM zzE|sUE{a_an|}VLp~btdYlE7-FQJcz2i9#RMh&lTal=~8B>`Nn7pC3B)8ivAudjCi zLrSS-d%lSS-1AWSGr0D>nPy>=_Rhb|7oMJ;2tKs#h18rF`a9nM5JDyx&ou3E&S@6O zScbmWpVJunakyu_x-Njg+MX>p@|%ce(MnP4tJ(*Z?B|9KH+oVkjMniq?FknM*O4Ee zKeB8qpX5aBh3^j|fcT_Uv8H{&fTcPixQaL&rb3%J0`j$+|{A$1}oN3V-tp|406n?rQk!`aQK4 zwwhS~R9TIdn16n|V4PtWJg=w7KgQqrI2>`ZN3t|^M{{P?80x0B)LKQ=o|dBM69t473!LCHgVVqA8X>e38(AA%kUe+{*m<(SgObLo_h7{!UNwu`~$t) z>2t~Y`v8Rbe_@0B??hVr)kO8UdPUXNT3AZtEzMM4xP%SUId(Si4w`n2W+RS;^*bT@g3pn1DT*HqiZi8v zaTf3NkagRF-?rbnrP5)oRN=V}bnLL=d6tn6bI2;cr2KYhuhQovb?F`8LvHoluDI(LO^ zH1E|p3sLYM)*_VZ_}+DtB#nT~4VY7%qJWK(%%V{NzCFYZh~D3Bz~I#{^& zaxO(N(tWSk*;?LT;FxXvbuDtcKAC zdTS}E&}Gm0y5c&A&AK(VqT%FHbilrC)s%dv3k+wiQoM@6R@bbzdJQX(l=$bUMV_Y~B|;_u=UF@}M? z9OzbLZUOV`}Bi&3u(JXLBW3hsCf+B^PV+Fq%BlZR28Uq0dMr6 zTXKb{omu4wPmfQW&u1OxT2SA6PuF#KI#DTjQ6+;4~FTehIqN=}JxnzS8$(GHtS z>y%m6nPr*j`bVT8*l&laTJ<1%L-gLCOGd3?ed_~46pwvVAolyc_SnRYX_~ZEJ}U}2 zS6w_9W4O#$oYS*I$>rWhbGMbXvh{lr@XZ3)29jHzqU!?Z%jIq_^1guvnu-)#X61G; zlqMnGsBG^xwtA=Om6BV(kE&}%XxB!&e%fU6`u4_Qe^6&k2$U9D2VrTJv4`UWr}K#} zbd2N3`Fv(xWAUN7$@?Y_^E#6Wjym+dL_=8r{RH*Oq{P*)~^e_vGmy^Tj4P6mCm}R`{3(D&oItd z>MC?s&s2JrWyN9Wi)UYU*f-0U>q*bQyOE8ATr1OK&vn_Tx#AF{*=hgJ^pzjG5&QJQ zeBSsJucWKtloHe68OM%HQHOj4OvXRb!%Fc4)4h9tX8<}?j8WIKv2KL zTMkF1iGnfGIQ5S9Ps3`a{{7Qw`2gco4Je{7QHs(l9%W<{kFSPWgwA++8|ZQLX5n|Y zQJg9{A;W{~8BHLU%v+stXg_FYJRT3RB3rZTwec+1LQJ^@U5;DY>&52$xx|iJ}I>J>h@t4%70_+O`0UhvMassjjC#c4-pxel_&rWL3b~> zWB>mjLLu3t07L;fMT8G#ro)?VFYYsqC~$+OuxgVc=@IE}uEV?cobw&c-B>Ly&7vJT zQVp&;f_0c|D6Vmhnb~=Y4ZMcN%t8>ugyU#Dp<1p|nQh|%rTWBRF@t*hEtY|Rw^oNP zY!7go{($ZWggqFj769#1RC-yeg%-d@ZLYTs3KfI)@icmqw}Z_lzVc3{ay1+8Ch=l3 z?^GOZS4OB^t273=mkxao5HvlPf>mox=s=00skWR8wF=Q1PFSk-iW`T@X+BSt-`TJhUU54HX2nG`2nmm3Y7isjH64`)Z*0`r`q zR#MWXz!zDmu8|oz+mX>YwvrL2_GJUCCgaf!_x%xebR+4Sx!q=5hEe*n-}Ve&Q{^Q% z2NLjAX^2LEB3QBf7|wi@GcU4od7W{&@~3pFeG@w5$uK<7r2$--|p&1m`_@QB1t_zMr&h{cE+iW*kSP6(yOq%3+-LL8>+_ zU$j=gHguftwyq3uAjYWHx$bCqdwW+U##_?1YLTO~Z=|dKea9GgidyT#iM5K(zW3Rv zohNHB+!(f`>iFq+Vp(V6IQ7hu4iPxbL~M2I>XD`Na>;wqXepWTc;fN#5$SX~9UNn~ z+^N0n>+1_!-uh-+X^y&m-#Xf!Zgoq2Q5u9>)paRl(cs$~X)=EpXk|4qZ}uoi!F8 zL+?9MmF_qT*-?`^9T0fC+`8+iE1<@4J|1|#-e^g?1+Q5LTx%8TR7>NhhbJy+ z!LFWYEUOHB`f$X2t$dxYl#_5-HWn#h^k@6}eqmb*?$IHGVOv+Om&~Wuuohl!iNAX~ zQjM^z8^%EB%5^OYwh+q>9I!plmP=Nc#r4X(%sf9mD>!1g;hbe0Mh?@|7aMiY_N7{O zl~Um=l_ZUnbSdMeJ{WcRB6_#mRO2#Z(yC`d=P0f_l^kF##%Zatl*H|NVJn5Vb>Vc1 zd~yeP-^jNa|Im2!XFeVyFSiS}CVn_R@!RDKU)MLn=}%0DCkA^UxbPi^%>4g8{P==e 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

    A+aktwMLtvUGE|;^wGn`y^DdnoNr0^&p zABVAm1MJh_v#l%hG&8&o7=-jCrKe(tyx-;LXuPiocmWs1sX$X*NYMvC44X6f8zD^wW8aff0az)q{>^{ zb`=odoztoSOLm#t^~Udi{I0~iP;F%?XS{XF(z1B#XuVj!%Hlw<+zOM@;cY9R4+HbE z@Zbml;P#!2eYCzlanK-12}#i zPTig61zvAXaI#sv@nFfqGb1YIuxu1;e(G99EN?PAJ}i6Axw`T4t&?{3xUxhE&}J*B z+2VICT_42`;|z5(RHpnGjpSl9klA>zSXdoQ^uIe;OR||evRUhVs}CVrIi{e$wY@#% zgvH`)gR`dI)Y+<4BVw}U4D4uX zztAPz*lgsxyK^!^0D%qLx6pOuZIf3j|7=^#T4HOg!C{C6yKbew$oWQ4r7;mxrgxTu z_pCbf(Tps&g?OC_#QK`HeNVWrY+GQr>zS5?-#-4}Kkfg8n_rl=l`-z6vvW2~w;QW} z#di&H5#RO4bRp)2Uu@f(4A*%kZwdTBh%1Q(!$!`YsQzPIC!3xS zA!M4SB^t5%7@Mmql9r8JukYtVCdJDao7r964Po1OKmVXjEuCq}*<+$%vI|3Qn2=3u?b<5OoabzhqVKca*or!24B0r%{OI>? zrT;5O!+M`FUX~HA@g!%+jU}#u>@9I#>G}@i7BY!;*Rq9~^>V?4K>z8L ze&I83cxU;zpSWBu42SN4nY9_;I3>||_U)c6uLK(jE)YpL$|e)MDn5%f>Nb{+iMDA7 zz5(qOGkTD*M(nuJCN{Ng_SqxAbA9d@$vaA}uk>%ofzr3~waYw{Qsm3$KeKKt-@bh# z#UvdnO~dVem+R0xR2P6~j40ge%C-tBcvC<@t7_e0w`c4J&8WC~2ydIVszPnsR$HBH zTBCHaWU=jZy%N2mSSm{AMbkD|Cx?S_AjsOWQBH3bBmt!qa4LS0DdatTlH}n;6d_JGJX+h<>X}+rO*zI=gce~o@ zb37c?X%M;Ht~GO20?u+c_f>T_#;}HsWnD=*F^;NGHI3FC$n?E#>rWWn0^TSkm>~!r zTi`yCuJ7>C%fZVz?$>*@A&I4{t<)=LgmC2)J|UmOa!B;fDYn|EG9x6la=>kxhOTR| zrdPyzs95m6A2^@S(l<2;()-ivC;ju1v+TQ`d7k9wScPm&S zijXP@MU}W-uN8gWv{J|#W8~%K$nARLbULxF3&SufP~erAzO!6c-rs)++T1s)2)69^ z2QHU0(>B!s1eYuBzHu$tJ{D*N@0<<1f4tKVz0w1%Wb#a`_-CW{Vt`%sk4l2t=zr!dr2S7;9>G*SyS}&*zE{zuj(Cjf+W^BD>v=ZCz>FhL)Do`NZXV5!IZ` z`}>s`0z*I4`hvsZz^XRHZCjO$xzVcPvSm5VMn)8wSC<@UD;XG1qkHQQBb;d zX!P&csO1sGNB=OjD+FQtr^8xQ>sx}n(?UdkCc~w&-uI6Irxc#%@^$5;+-kUcC7V?z zZLtFdm-rYK91X|2!!LrE%_On0<;<2gLfUZI(fLLSxAej(mb#+2WTTrD-MTpAFwT&y zBiMvBY8kZB(_xJfLRrBbK4pKBNfjF_t;V*Ni9JiTh4faoq=lnztd*z}GFW+QG2Rh# zcmxjZ5X59F9oY_MZp7Php>#ho2Fi}hn8Vp@kAyp+)8 zOk*8BSt60yY%D|K(geQElc<0p2%sQ)Oe2(*l%5m>Yid?4r$nj&7z4J^91o9<0c%My zkd~RwsibbKUfPDkFmgVfnC}yx_D8-=@7N{tYyU!H0^Q9rei_Ke#E;7dFYCy^zW#;V zyz<9<<{qH`b)ix{d3W;eGDW@UP~Fy zEb@07!*4k;vCz{p(6XirU2gbO^F|vR;ublik^dS-jLrN%_CL6>Jr*5LD+77|BBVQD zNqBw&vy{%C8oZO?O-eu$Til3UN8cPUttSToeM}*;E(V&0+q#gw!woHAmf>dSTRyHc zOU_uck;ay^%$S@A%Z3HkoS3(j>>MU1a!llTVQ(9(^{i_oXTev`x4_OM+Ti%t_A9S> zN0(drvEw!gC1>qdwPrZ(+l22NF(lF|3dtNZ*(8D$%2C!{9h)_ zQ#+JTa?;Pkz7Vp}#*J3TC043hD9sy4`_IbNL)Dawayh>@;q zan93g3;C`exvEz^=@vU>>S75!SYaOMCE3sx@*h1 zsKT+HHQJ^V6|SJH)n-=CG|$x>N$W7EnQ6$1RgPMeT#7umO^9XQdp>`DtFV|xFR~D_%QBwaCWAG*3cND?K~N0AB|h9WdLr;pOF3OI0&D#rmxDz7+O~ zdUd&+an7?Wv(VFkmxFZoRD^ea82(CGZ?O&+RSVBk#t4qbqtu6}mH2W!vr~1al>auZ z4F2VOG!7$^epVe02L)PeG`?fefv9A?01o>Dm+OVYK{8b_O7ZE->uaUprJVWYmtVME zubeLDDg+3K#;`x^8P(GJ`O{~9|Mok(Q9uggFv`6;?zm~+)XVY6GS4)PXSdsPzMLf| zt=FO_l>>x-bYzsKd*fvw$w>}~Nv_gtGbyA8+B)f`ILC)6J(}oRa{DPrnIKwW-$+(u`84- z^{^I++3>(SN;xTY@OjK}r3c8>4}=oZTep?8s0B~olVAhcLesb6XHJkd38FjS;a!8t zmcC1P<1vj9QLSvy%1oWFyW!iGlni!W$jM-v z7Q7`*5{$LZ(D;n8fv_c9+pAqi3V(|onyx2K&QetC`QqH=R=pLlTI(!6$3;0I~ za494%c|rYsw}FW(yWDcjvPoOHvXXc+d$DN&r!00E$FpLben!z3LZc~4ll>V{Uy$r3 z|5FjFEManvL_V0$ft(w$a2n~yT5c1*ldM6GL2N;b4Abj#py=sMRjQUo@Jgf zCXqv=u>;vUj1jBq7(E8Zx&(qUVMYUC)(&~dyh$0o)IRo8bQD=t03Erl?{Ei zmXud+&CF&tKE41pLCL#b@LdLm`mH& zj%IH-zh7`6klI7Fw>SR*O{bUHIF)mLJuvZroJmSqA1`4%_eG}D0mW_Z%HXX@a6c5N*7ha;az537R`#K zpZ=K@CEhiy(Coac+h7As^DO9erH{33%Q~%({Er?qSIu0=wV0WgSyUQDc9&k8`!w zI;$0IsS1lVw!)yQnoOo~VqY!@eD~BTmDLVel%a7D1=%~X)``mZ!Z?ojrcr2&RSKmn zg2J{{8)ixgf>`KE&g^_SKg#G;;m#@7=Zo`luQ}^#5pfP;x1E=TaTo-1zQ}dFu50a} zyDy7?IbL3>y|nLop|{=c9QFsC^Sm!VV1c(!Z_*p2Ik;vRiJP3oe);kXlV<(qbrE8x zbByD_vP#+SAAkHI<1*wa7uV58GHdxLE!tX;T0QB~UF=rO(ColpaHic@Vg;Vx4L-Y$jH#nRtn6Rj3YW zPaA3*!OpncV`z!A$YXAM$}Cw$dY6Nula3*ig-Dk~jk=q_dv~WFJumk`Zs4+T#tC*) zH_}yQiBS$7)sJfH!QwLA2r1~GBb!EVJ&p5^+>OHu`9!2=0dPr5ACu5v*2c3sIrO#btUXrRdlD1Gh;1F@gaz86 z<-d2oGslHFS!gn!c_q!6^LmA2!(aJ@;4}Z&PHZDg^NrlV?Y3}P6HV7)l9T_YZ-@a> z?#SK|rwN~|xVmB_=P1F`t|PFr4QI?YkrszZhZ<>L42W zb`%_{Z@|pV(;^;u4bXxNA#2(&oyF}OesUbTJxf@4znxgp%6eMqT+3~`a=o9~4Fkt^ z4^5)8EzUSXi2VAeUuzFW>F|h2K77lDw;V2065EzN$cN&zNJm2{FfKOIFQ32AxJKK| z$0-n?>HO|wG+l*xLmI+>rw;X z;~>}Mvd)bA9rHBn5FmL*ktb>HskkkZQJM%z4pi`9ja~XM|`8hP$?!YP=sZf3BlEEwGg1Z&`ph1d)QKm zZzbndasi@rhzp~D6+)B&$2m`+QmB9J$RC2BSG6%jI&Z z@8^Dh;B-3CHjU(mG)QjBrruhXW!BGYE5(d`UsaRS`GXK5lcL)H@-Khk$B!Reua~M4 zetev;*6``mCr;-x=gYYsfG^i8`Kq$p<|@4cwgih_1ttl+2fiRmeurxc~5H5oGxcB*Q;j5JY6RR&RG?msPA7< ze4k(6qMqa|1A0n{+x5z_u6%y`TzkXHBEx&H!?*qEy_zPu<{KR%F4s#{N;7EYW>#XT z&@r#qYo#)l>tCJ~(y1gWoRHYsrmawjX`Y#uiE$ix|9IzoJ(E)AkMDo*a(w0e<6U!T zx>TDc*08Z3cbqTh`hLHE{Ge4t|9zgMe3$=Y|ANW?7lyw`a#%O0HAJt)jdWF;3<1R*MiVcpc(&OHS^q$|L}U4RGXaSWTw2mLWE{?9@$Xu+icW-+Kw0 zNTHg%o@*9ttx=*!%!w&1tSRvSv-MufksRr^=5iS#6-0?9yLVsAnf(a!{*N&i$Ii^z zs@Y@}fD|EJ&c*+`M}T{1MziiB3P@x|c>H3mZ-tylIwvx$GPU_JoajC+3k9Vai`KLZ zL=cs>vp3>p-Vkl3H=^tmQU`><>t|Ww_HM5T% zDJQh5g%N}i4T>^Ev{F_6L6}>MwjmNZ7Xwz|F$)imgfT^& zw83|C!WVfUv~pUpWDQ|^mJJeaS_lDUSvzhtpcPW^)C|SQg;a|W9ikqQ^9@2 z2x-a_7t?oy3XKt$&R`fHFh-+4oiGjqj8u4fea3hnAtBH`clh`Cj(@B-2$S*ka6x}P zLar90a`+H4bgS`^1_Vn5?658{eT!vr2+a%Qz;B@BIt36F9~ee?R_;qdWkCjPbF{XpbF)13rF!K(!k3pfF&9 zJZX3tH(7^EczJ#SRK^fTs7@iKgif?DiSWBxE10P9wSOf)q7MkkLu3jvT$dG(=>Z1^ z`6PfoBe{&r@r-$15KEyGff122w2vI%(Z;TE2VKhoNzjvDd(bTa6BA1th5-v>ET~;d{QEBfl!hp z!4Q~c@>LW70=S?l)7j$jkn9_Ap0YQPNe(egB-#7&N(TH&72|C~Dbh(EROGy=8qiB| zMl`mT@Y`;I)DkTh2s9teEO|@Z@T7{`E>_Sovx!XbEVQwivtClpc)xyNnnv_pPXn{Y z;Op0~{I1eBxZQ5}F6i^hU~ zKJ-17b*%xO%SyF@RvNFbuawWl1+sH1XShgw`SOLDJ@$GyM?Rzw2p!%uO_d1J`-}}a zT{C@9x0U7pSE?UxP?veG!`8sTlLeSiU>N=3fYq%v1B~dj8@Qk+!~DGqpru5MMQKu+-(^{z*F6Rptru|7JVH@ eUc@UvF0$y!3q~%k@3w1l{g81co4x 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

    vhfn=}<9a`#Dej?_s6GQQzYmxD-plCf*BW zv2CbKal^K@&$PGiMLIV71H9`M;Mdtap|yBRMNrrp#f(>shs(ul)-nyt1BFyNWz(~ zfNZwNg$ad`4@HXvT7L>vM%E?}b;?=A`7%EMJ$%)S1Ti+}j0rr2Bvf3kB9Bu43Ry%h z$dxb+l9qJ7|CiJnO2j_JNFfHraZYDnQ=p17e>a2G2y4^ni@!+R_83tJeM9M@G|zQv zp)DP!9*3D9VaVZX{FueFpEbLGDbID+`)1B&9!D5mfvW?T|9x1^LGuq{Uzg?6Yha#+ zRTNRVr3d5x$JSd0wbh30qQTvvxI-amakrwy-92b=hvM$8#ogWAy|}wm++Dl#eslKT z=ggcx`H`8dB$LUypG$8&)12+Ih{|4TtDspOz7=0@EYBJ{<0p=Urnmoj<=|F^4&HWt zonEtZ(p>8>mfXQ+DLcDF@^EgDNExzpQSBn5gDG%ia)_wFHoTv0(FDF^l6D|*=D?e& z1R;hNIgW4;%g{z=cOxWJ#gpI&0@K)CBn%Qg3Jy1-tM)A67llzMnmxPF{c6a)u_eGNj~i z!r=khz(I!~GI+&w%tWuCN?D9jbPQu?x*#SFi4IUW{yK(za6U*Ksgm^S8mvc?O`v!g>(TdQ9W{7hdz06gOc z_DOw^6}+D<`9Bus-EYfiZVprwb`EZ^G<)h|TGvHwWosQ8tqHbJaD>Q29i3w!tjY@L3 zA6C&#lojCFXZv{%6%VM7a|QR^;gBgVOa%&=T$KDj6HEK&iK|IZi!{{u+xk1VHHnU6 zCUbT^yEzg|5!YW;bNvIA*P2pknbM>HRQA0?Cdo_G8NM~i&N=aw#D~IXN+s+@(um6u zAVj?gjacV~_|-GyuMxOoVguoS&w!78q+?QpojassV!~Xvq!!S9#>dABpbG@0%_jq} zh(Sg5gxC`ab0-(;#LIUpj10!|c24>3PF}RezjIw{7_)!eQWi^0^8?gi+T@qSO?^5d zF|~YY{;A6auDp>hs1S(pyM$Ft&u=lL1IRe%vZ}fkpP|MV9slWcl)mNxRwPM2uh-jq z5V+7iEt;qm@qYUuoJppCK&cys&N$r2ILOJ-vLb!%qnT0u$Jks(4pp4oGd?z#RQ-&* zzALE2nO4VF4!?73Li73n5*X>YoL>J}alX&1@^h+>hjrt7+hLuzwsSM5CAaa++7X-rakKhQ|r;+8j`j;E{DtaEsqWmCer^x6YT1FZ@c6&IRDW1a8x&8 zFidqdXSeF!;(}WYOz=(9S^fJa`((0 z4TlZQ7;o(7({IjQnKcIs_o>IO-Cw{fDSZ<)hURVD3YYupwMqQ+pja}@lEz!i*nm!Y z5>*Uv_eZ6M-CuK*PK|%W$^xw$enz{tpm3S8T-6`Y%DVkQibx?*3Ocp6lb)@6QzHPa znhNsRWZoh*{F!n zB=NSWGwV(THW#+zf@3Jza=>vdYZ{EbvCpWvAO%{A@-)*0Ut+>^Z9>qe@kpmIC)Soc zcD2}R``a5f2Gi_=O3Ylc)B#XZK*9Rp5*`d0igmosB_6ahqHPARtV3Cgs5(^K&s3ak zXTDgQ&m>~f`a7od7vejY1lpUz%+`V6m(}z3O9}3YG0EaNdG1QUNcogdZs#@|5WV7zKrJjNG1RQ~fP zc2_n3O{%^v_mHkx?6(2n@H%Bwi^bfCiKi?UTk|lUUG%rDgXq{2Pn82L5iGUL5hF|F z+e+c=!_j&oj}#DRCdSnT%Z=IRK4Z#A{V@1^(Q@L>o0Lx-N#wr7v!rfwS(MV`Hh&X_$W`negmdMkZtj59*~H}2 z3#4MFJ@owk*}k2h4?-|jh4evmF7DmaG%^)iUsEhdrFBm_+_FW4o

    !$7ok;H`&sR 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�%78UC zc#>6KQ*v-j3ELdXS909=^U!UA&UMXHcvSe^ z5i{B}nRY_zL*Ls88Y<0qIs?xAYu!73fuBM`gbBHW_wXO;AFm^+Y)~iw)bNlx;q&c+ z)~Sha9NmF0y6Wmfn*%@CK{9#RHUCYJkgSMio;R424^Uc1Lph~r{5mHX!u|m!@^)DS z#Ew*?;xFXShK;ifhoY)JF*f0!Wl{zTf8}?Wm~QQ1{d$EqR^FuUHBVkc?d1<{t7g@j zH`*dZeTL7<`5;7MWDxose@o5(tUVdVEA(6a6O9T3kyseO_WH$BZjPv5XA7{a?XQ2Z zI$H{GLt&8ZU-7~mOH3f;v77W|&ENV%aa*GxnD;&RH|Z=F7-g>cf5^@MXRR<^LZ|A- z5Qxj=q>!=-34hu&d1+PCpY}DEc-hkaLJJs=w;-guT+!-C0M7Cp1_dTh7H4b9^X}vB zUGZAPj6Wz=wExfP@C1_&EntjhJjlKT&<>Xp2y&KF{el@Jr4D;}Ze6NPgiy9_9}9UY z*yrJF;b@A-&1Nop<}C>03#*_YyR8c$HKnQ^;DY|gMJc5BQ0h}b92EZe(y-i++%Wu+VK4P^ahWQ^ye&OIj%vl+p*GFV}P!Y%Z&c3(X;01G0kGk z8*2Db@Y&8!$XC$iUGppswa@}DdXV#O7F@^y2!dlYI+Q-`aLY!oUseUx_xn9R;E_yL zr^D$~ER9((JF5{IPb)0FEd#dQNwA&8!<^Anj+1`=R?WGDil=$4wui{V7>zHPI zQd4NvaexkAiLl&TFCy#aq2qg5^v`!b5(*A3|C8JIs;|&>_fLpnEv1(~o3y`7k()YS zZ39Kn+}lkzzg9tk>b+UGQz_7|isrxh1YWBeJ(P2#{C5#Um1D2&S~ymhz(1^1k?E=9 z{6~gv0D3`22+`X!{V&W=46m5vOi**^#p&LZMg-ZoJ#v|~cao6j)!qTi7nl6(yAgO4+=+%WxtT zle7K}KQEi#|C4d7!W2zX=KIq$ zE}VtsLGlddkg*cA{8KX zHqFlz#uSDdn9eHy(vZp$bhfAA;cHO=g2uRX(Ls$O`Z{yqmGWCIbMe#(g@oSJM6P=J zd}eyzh62Q1)5sCz@14QCy;pV&>3nX7II7>o*%KpIT9C@-vpwBudmrDRWJJiLOsZ4# z@Mxp;a4oA*r#d)g-oJzzSLCCBIoffUS*Y}lWtxDHDaE8XnePrxeY=DOT10XQ(sDY~ z#iSUsAragQzca_uN(D*=;{t%p{gw!IfN^$R%|4q1S!y|RB9JIMW(j5&zw4?)54VF= za^#VEH4DO9N_{fAQjWzC^?dG{jrXN_wn9Qgv*4dd9efZ4n(aoDpF#^n4QO!69Xm)i z@>4_cpSh=hjoeedE(QEWoX=$tCL@kd<)bZmE;WyMOq|K$^0q;I`PA|ec!^Hkg z_5R?d-r=pqWnD&2EyYBq%JSW~w8*rGux#65N`N`6Ca zeW<@}`KgPP{4fETUf6VwrJg*jSAT;-r!$--tO*_OQ$WHyWA&yqRO$N9Zu-d&$GNzw zCj(G`Mbw%yd|&Ps=81ndo+TVuYKf$VXONfWk{{7XH;5I*>dkl>zTGia=CJ?i?-p{V zi~m2QTi-@Uhl^MmMpS_Mv~})zpox@p<7D*zud>kZhzc+EBEZQ)n8nkH=npJeQh7TIayrkrdRty;scOa;@D-? z*_%8S^?9X1QJh}E6TM;g+)BZ!Yb{@UmWDX(7oYn-Seq0+E`ibCGXsbO7bj5OJEN`X-f(pdj4rOd90FUJ>w9il_KNqkNk%T3 zRa#$u%$j+a#d49ggByeY#6`g_yzyXuD_RqQSJf@0K%de(lVtcNJOadBuMP{8iv??t z5i9f@6K>vi4<;prXTVfQ!Oa=lfgoeRRC!l_K=?^jzn4DG66gxBuQ1mlf;Ru~t?`-c z*QY)vRTEVWhAPoV(616{`<`p$>nlvlba5M*WL!{noeS@;^XWt=#xUj)j&-skKYyqk zh^VlMj*U9;uBNO7o7gsi039OU|Jnk7M{e=x%T z^{UgA=b5g&n(^&Iil>8n_>A05dC9enms^vL)cPw5srLj?>p4vv9jWkqsupSS4o+JY z(C4b+-_G-sN4q5N>Q3M8ccqbg!Yvk>;2p=WhkZ-u^DqS6O$?=V9|${Liht91k(#Rs#al$xpmgNb8E5?Fq=JTWdDVo^$s*p)6>1B70ow-tgF5~iKoGz0%ub|XKK?9S z;rZY7Uq?w+RRd-mg6^QNg_9`-aRqZjfh2$A~s>-E{%Q&A|UijYRz`ng*v5 zJL!Ah=o6n3AbkpQ1-7ic(Q62zG8E+a2xI&Vt0sQvM`~5IzMJBzC(gjdRC1iD7PCJxq52gKiKZ z_i>vIs{^?rI@R&o>&*NIfBSX)`kvota>!hA#UM%m{6Cvl#RvVFyp`Wju9k%LA|c*9 z`MkHJ6v=D{4asQBbPL>Qdal+|56ETn-4!Jh>EZVOP&W6kUGB4@#LiC}8XsKEU^UiaairSc_3sK>jO6)tP9Y2^6}I zd~1GfRrZfIPDAwZ64uOo^G(8li+5FWtIUW~-w7BGjzZY{lN&*e4acSfJIBfoJ`;q2 zAj|n8cMOS~euXzzQnRH^C}?_Pv%XtO4*s66dib-~wW2_&HhGb>?f zOp#?FjNa}cF(j>USAdf*Np8kh+%)3?4k(mKUH{39h~xiJZ|*%Od>`nPCSRw9@mAx> zMb+>4Lq#&5+~9asG&8FJXX>bU z!!?pD^r(aKD&q}wN!9cphW@T8Ss;A02|ySBg;LGlB~yJbQeJoOL$I7S;V8(l{Qr(9ksd;mCXHc}Q2BzjU$GsG&~%js&BN*E%s z;86`B+B>@UYd7sdM*>MgOlXW;W&}zw%W5``b!;_{kh29#o(}XJa<^?Tzs{jWFl%ty zkHPCt{VC46ge=S$rMlT?U{*#EiiZ#y_V28=pS1lyWl*P*k~2=-4wmTCct~=z z8p~*mWBTummf1uP`u~uJY*yJ!=?EQf`W{ zr-qiZ+2ox}%rDct5a#~+ybBn1z6;Ojg^vLa&NQ7GUbgb-A2D8=FCtd?IEj{UGJe#Z z_bHm8nf=C4n5$u={cRVC?facW0tORcT( zucqVxu_~S1*q8x=M|sqAr0}j8y>P?$o6vsP&WhAfnOs|D zenuvmne7%7iVY%A9+L|$zsHHL0`tn-?Km+^aCx@!$uDrY$v1{+fN?d5P%txRF5931HT++5k2gK3~P4BsD#u`hl^1 zi*!AXzxrSa(a~p3aEHekm*9^%Mb_xjrpc@cK^t(_g*2P7&p<<1<sv>hd{r@SxsO~^3|K`_vL(@PGo^;>%lArLT0w0pZQ#=W zyk3dvjXjeqJYxiA3y*{5esHlmMWR@~oQIH0^uK5a=E`T0?}tQkDO`j=c^J{a7ci0G}5Px zaiOaDKdXtWe-;uHxT_`LpH{tmyjTv1qc%sYrO02nxSJ9QKu9(?8TRxnXQ27|3IzqRG@kMv$4ci+f~Hut)PQ5kU_E}%OPr^ZkS7`9^!mI3y|1-fxpt` z_r1*~+>at+;OT5lR^S?~2>s1RA`$xN!VCH~{vPX=O5vh{pOd@9YfC{DVnVz~;7pgF zernOD(PA{x6+VRGSQ;Iozh?t_29`h` zy=#={!%i?r@bkc)!r5Kg_n)T~Yw?V@0t-^TTpL z%B<@nl7TE`RBGC>PX5(UT#b=3x3(2g*C%Rb9O2AHwX5y%YQN_Wb{*uS&_VmFl0*j346o2LF)6tunbc=Uexv97B-X7c66>hed>)u$Z2u-v!Z zh|3+Z2kOhFLHo?jGd`y+o%hm>-%oerZTTFaDl&sX@^>z=upO&-Xp(HB)rmZJ4SY$1%SXo1rf?UF=qy=k26jIq@=24zWV(vkL3haML%-V&-MaP&;lBnaQP;z-K1{6vC zs!}DKs#O|vC%nxg&lHKZoB1cJu*cIw?zCXzgX=#gop|Y`doX_3Oi|(b<5^mqF=jIO z0AuuhSB^#z4Tl$pP=4VH?6%iJ%uzfKC^83RQ=OFVj8aqT_zX}Dm6PaScPP>N+K~j`Gr7I1tt_PpV1?zXbncvkgf>^AVKC{D54Q?LJ^{;#? zO0l+9{#Jz(LL-Q{$$~y5;)|-lfV$E8mGgju41RXXl#SJ;QiJLSCl&$Tco(?=U&mwo zZ2@@#W00TMb5O3NJWj#jj*5ImW7rPMS<8p%%iVE=1NPd6Zn%2zHLhmw$p=}o)CHV0 zW`EuAJq_G1=t0e5Em$Ss9qyA2y|e#d8XMCF0htCN%Y}%`Y%enAF|yVmX#{BBk_+t3 zGpPW-c{iA{r!R4NuSsW9FXPi@xv!M|Ir1{2KjeyDY~!4KHJwF>_RZ#hXlSp=1m3{j zFpnjxhvLImFe8=SiFoG@{t&?^y@xB)Qq4u^*@%$G2E5e|LeXUbK%|DeY9UDVyLv+` zx%H}2TCh*_2er0?rEw@*NbQ+A_Vrrvn|@rm^RtA8cE9JSXaN+QG-0GA7fuv8KJrH^ zGCcJ-{tSA5G7Z=vK5nGwvT`pzyVpl7Q&7}tbLcYld-G&3mihPx1IX7o zaoE*9qPfq*Uek*g1@}DjdmOhC5n>u z>qVwGKYoNd!85Hp=4Tq>Yk808KZ*`i!e)Bv%!UQm(RUpvO(37)VQWX^X=hS2dQdW282=? z(!WcRoXU(&r0-F9pS=rIs&F>pQbT8tPe;wN=#7IQ!zjf?IDpUeno!z1IFB5fzRk31 zqu@4yY7)i&tEU6+SZ*@0W5_lFaF@2@6#rt2Z+J_j@AjP8TRCA|ps^KN! zhC4O&b{gc^Q{{#fx>PGU_ihB3v{Dy(xD*QJ$yx2oP@_t4$p(JhkGx|R|5oS5fA`>B zjoTZRb`=Y@fUBikxV)Xtj+;*O!%~KMlzpniPb_oSADrE{)qo@F#h84Z%Zs9|E#BTQ zVnqVG>@F5ARzWggDEfnchz2tgLRB2fH}Ri!$=0{(adoDb2*|2LjF?`(b_SF z6A%~3@kDR`PT<}{i3LG3f?KA&w+ERUN0t#eNTK7TNo#uELG(P{aPYM!HB!F>F>$y1 zbV$^FQ_@9>rG&1=ThpCbZ~R)TRL`nA=UM5;EG(MO{&6rJzoz-ev5K^LGyQir=Y!zm z`J|=*p=r2qkV_Qm9!~c>#lfLC33_^(az`{b#)$%lipB@In8L4&sQxPb7(k{Pa7b-H z*)p{IADwq_7?=$0uB@(I1k2lBK21ZX1k=e5%P`Jb??*Zu&hbyLc{nAy(6J3WhI8e% zV#}R2j;c08A1r?|B>J^33B%`zD|{9^gaGgY>!-@)SVZ5H3tYJ8BT>+dxO?>-A53w- zLR^2?eskTVCV!-tjJx{5I_TwY=3T{|9MYd&$thn_-Z<0&Pzk&vk8Pil4uDo3x-liL z(gY5qprOBLiqlBX!ln1r7q*^7eaZG8FNBc+^AS*?;VTO?)NCvSw1pY}AIm^e1;A*J zqPmKmkEePd<`P6&hWoLIUlhgldK!&npr7lePgyXsu@ttD`B&Q+%ArLBOn#R*K1RT$ z=-TtJpY!#Li#-NVg!1HJ7jeJa9Yfy_y}WtK$T(QPzENvLnypYhhm@r=CRq>JoYLklp7U6ndiL_={k~ zN~y`yA5K=e#>~nMzdr|Sus`Zm$&VH^65>3%F>Gi_@LMYsqg2T|md5S+)k+*Et~LDze3>6z-kPNHS5W}!k102*Y7o&NrM zo4~Y5=3zqsJ$6T!dyx!m+gj!^k8_Z!)Vl}w7$)=lk%%2oveMf(&o%g;`$C{+QxIp8?xfVeNnYz&x}TAKwXR--^7O2 zxgOt-_sc5$@S!&WqAvOUmsb(C(Ymhp@p?3)lY!rVnkiyLuSZDC5MdH>#EygQv45Yn@C|99zF2@s@I8#*jCzdp=p0Vds z(O_H&RsRkHi>EQ0!YQn5Ocac~|JBphi5aRCg2{@LlQVYa$jnW@E1@l-xz% z8s)dpiOy;@bRTM|dW+hW=h+71ofq1nRU0T@v7drvQ+(%ixIZZhAunXb)C?*t#_RJF zUacAv*nu9*QjKqrn*62}c^-9bI)kDIu{ zzI+z>v#`ivWFjlL7BS*Ys!ed}sc`CrN=M0l6Ea6_mqD_p_@wD8Z#0+r-B3diYcpJZ zMCW2&SUi+C!q5bFsoawTe1-v|-~8A6b-gzXov?TJO7{^lD1(&A;A5p23zF$<^>yX~ zbn=P|fpV4yV^vL$rQyc|Z)2a5ghK`BHv`sF& z2>AE&BS^b1g=d;aBw;rI*_p1C!S@0Ufurl)mrAAJ*){g>&Hv9@_dkJ(uyAv32$Vk& z_+nhNoJ2wXi+$G_XDC++mZ7>5G7Fv14H=N{eHhe>z3K2OOd&^~t06V%11^Jk5_&|P zS1Xo=?f)3byf*?`o%fYr9^NP4u?!YHr_m~TERC+I$?dGtFZ&WiqjwGxw%K0r-vy!_ zFdj$(>U?bClKsQ?c2FMK-dFPa+1>})cAVbtdctIt#X<(W+kB25q*+y;CjCGZ|bIeP-#ry3YEJTB{|%${dQ|IW zQ0yOSL#)`+57FEDq03zr;rN5@C!@}nQ@hrul~vHN8JU;)+TEs)@XKzP_a)4O_%qox zcmLme%*mivTK@-Pww)O-HUnemxpd=@3}auUS`#1KgwA)fm+8DW8|&)2#`P+yW?8Lh|L zR!@1jwgrkK-wXGe9D2GQzZ_h8POfh3^RIw{`{rOQA>0u`MNSK4l#0E@|6Z7W!h?C0 z3WD|Zt#m#-KQVGP7iMo%#QZj608AM;dQj6-H(iWI9$~OF`7qBIBlYd`aiV{TD6=pV zNs%9wy|D7v%Ev0ktd|DZy;h&ldMVzM?8AO-K3VC}m2)uCox*z%NK_o~Wep zsd@1G*{8&D0#(a=3KA(;L-s_1TPjzDFn2ugGOpP&ahN-IzlEO!){x9GEPHtNG3W@# zoxXi=58IRBS|`#%fS0@1J}4RhAXDPZ2K>+w^pvf7zN|5jWVV>SOxZf#FfkEBJ& z!dzTNxx;Y#ytF=MFy-BZhpDA56t0+n=L6J7bV2 z0bJ8y`I;Zk zI2npC4v1A+owaGdBx+m&i71%4-A6n>*R=*6NK2u_(9gnl)OJPt2SsvLH(*+bvY)0c z#iHFyhE^i0cI2o2c|mm@R1?7C6cz^;X2o$#Wfs~nL??=4A3O;nYS`&}?B6_&?S=-c zkNV=Jnu#h0mDSr`mbe+RO8%f*L%f7}TBV~k53d)-s1tQARE{{Z96f$69#(8HH;>bp zTKjSATfaleiIJj3T^d+oFGE%ACRhuTxmy5Z46|~?bQ`w^ibpp&Q1NihC4#ILe-c)s zDYe!&B6{qW1v`MjXCnm&S}=rXa!}SE@2;>A%25h%5dkg;<)1dbg{fY1Qog{`s578`Df>%Bf)v8IEvn9tONC7)0 zyRg2b(%hz}Q^g_bBmW10h&kj{QfwI#eQ<-qiKnArZ` zHmv{k-n^=YRz|u@Aj&BR+&m?dROXA`uOlB%Ua5kgb5#&E7E=nzfr$@en=m(A z>cGzFG_aY@2L`CVytkNlDC2-Fo|n=0`xEbfgKm%JV()H`k3(;WZ)0K)CT9NB14nx| zWiV3AG9wfZ#QBQuB-h4Lk#UV?2Jkwkd(?tx1c+*!Je1-pzxln z#dkb1u^SvbA*OM~9yURjeS&kJ4Wq})kD|eofm^eW?{7hG_-lSIUHooCdfCEWBnRiB zarE)dH)mOoPVW;zFpU>mZ$e~)Nhy`Ox@4P&6Y%g}uu8aNOmBGO{rPHd5e0r3} zqy%7TQaX{{yO&Y3ebV#%e4m^Cb_qz4p5!ai?U}z);Q`ZK1CXZ22=^OkFHT_9RIUua zI0nu8>&=TN;SK*}kkw=a0dBHy_}-Bj?KKa_IY*d;+pfqWK?M4^UMB3P+O+c9%Wp{8OR|7eTx(TxmCHwk~)nW*?{F^Ct#! zfl_Qis0nTAF zd+N`-nlP|bdN^H7RxEy!3=A<;ANb6V@6wbsXr6!f{PBJ@g&!5(C=x9)Tb1RGJV`;xZr36U@i3(bEu=&% z+3#)}qJR_HBefEt(eEU`(w`tQ-c^gf@+qJ43D(p%YgRn*J3xwK8+3k+zS%(3Wt#r2 z8KFO;rDy=0&J7>FP#Y4`+~sfD!P{D)&ZVb5wR-KNe&KVXTwS3Pp}o8M993NhZ5z`7 zYiZ>Of^=TIr8SL3hpjiwAQnus@n~ycp!|>-Hm$#hd0ZEDClL1`vef&9BJrKM|8zm{ zlUn{9e4ACGZ!b6d(gi{6%Lgu{ll>JS*SZNeQMw}bj9D!|oZ8l|ya^YkTsffC!}uf! zlA^UraoJE7ypl*|+m$%;Go`>VG5ut%0pd3?5-k?;@S9wr&m2%oJRPK$JS~`2B1lcR zOtjDDvagByu^@z{qWAPvb^1GVK0kGZkf(H7vQ&-!n2lc69F7Yk5gg!j_r2hB&&e_x z9qvbe%qu4!SKFy``&ryHM33f}r971duIE9r>Vr`LtB5%je4H0k?yauPnMp}p3L9UD-mtpA z9f=zv{xNuCOS3Z@SxEnMitE>3$wkIo)BJ!;@1n=-1MJ}o!Z2qsNh>CCD{Aq&TrlmP zVV(9c2$pp=7{(hJkvlphp>T)twd0r*jrB)`t3j2RHtP80Pav zeOPPV5u9PK-_ZNJ-8OHcnz_(bo=v#zzQbc1GpYw}%<(xB)Kn%|e)%<|&>otfO@79$ zd%P2mQhK?GaNh4WDUz`91ljmCxG#9#@h-aNchU8Df76rT`UUfckBbO6u7_LBo62 z6{?SRd&nL*cg9~`U2VOIf7smiW8Ln4==$%>BX8gy^6I&v>b@Ok1MiV7v=6ZpD%S;? z!vM+m-lsv$F#jv)a&xU9^ZFk)}? zf4kp!yI;Q5g5am7RE6PQU%ISZw%*)Y{g04q47+3PoO;8Q^m3t)5AS?i4+6ZlhDUgA@jL#jh;8Y4 zV-|g1X4{@$G!BVJRn8R(FPW!3wLjaQ$2SQp6=7y(*}NUl@ZR1@=*JN0d|9jX-uKGw zyO|V=IBEGSZDt|*fbI8b^VRzrJ7MRWQxN{f%W(@(DHK3jYvN0~ zSkv=ud|fHkEZlCfb}LRX1IwFI_^hoSisdyiMGgMBOXO2D#|%<+O6KV#5V`_QtQbww zm>;^P^P!FwOIF&Lin!#y+dq>k>&q}*sx2$&cp_@)u$6nZ5@I$bcpi#n?dOoWrH1y8 z47nj1CbzxFD*4dZMG|ZgfWIp)A}sAr@lyv{Atj8he8kuMSqL~d@1J~lY4o@(Qc#Zo#Y~xF{ilZm zlr&h)<~W!TJEYTRua`N_C_%SbKOhd<_1abM#s*monGw`Sd!Xuu{Q1P6jX|GDBzA4k=2W+6jHO~!lmul5XB$ppCaP<| z{s0ml1kE4=P%nuK(Q{-%zv1}FN>e%O*|Xo86>Q3wo5kbx6EtMT_Pz9!Gg_1p^Fl6> zovpOe8o=K?-rCE*3s^Rg|GSi6l>|IrU1&b6OBS=+g1w%W_ zVR$6I5Ri%hP>{};l*Xt04OCC7*gj3U4IT1d8}8lV!WjqJ5q@{zQxg3?WcIS@Q90P& zBP;xdK2|<qpCD53oDuYQBd=bm3 zG@_q{VhNA*PgzY~v1_b*YN;+ns1uTVVq#ew6tL;Y05re;xZ@f^C_i`#sZQ7TaIX`d zrYB1rYQP(sT9ME?|1!h|7Vr>hDjsV=fhz|qa7rl`k*6|yGacpjqWvG&F}EaQO)+8W z6A0y;%R_$efLa@*l4yplG*WGlOK?K_Kz*iA#=Ul)_;8(T6n{eMR4+lPe@bycMGc^{ z#0ETO4)i*zi)H9&>+xR12QfJxG?)t1Ke`4t7ZCGHNW-ABd~e(}je5OkdGTP6Lg&q2oAkSV5#&`VlT4+@ol|NhA55R01r8kd^Jd@H>Yas1#YFdf{b6it0sSSZ%2 zk1uJWSK?ZIRWxT6T}h-!KE2~Sw4Hs%PiBKJ0%lR8YR@Wz8qI!FXuv2!M7#r{Oz;rr z3&yvmhhhFn6c&3A1xA1plueMZQA*m0elo%Xtr~@Wa>HRkjg37KR--!%zckMq+))m; z=J;7(L{3dI6$sR{7B$XDcdkhT(IfW~Qegyu&AKLyV~{0*D@fpMrN=jCa&fw`g2H@bsWJ8B7>iLWhWN?y&EA<~w5o9XDZhqL=@7)&8$U z(!DkzZ9QdQR-Nxh24k%=g87&>6Hp#!p^@POKW~=Ox~dXc0N}hHq`NJd_wzF?_;W7#cFI}w;qHTjtzNAOdR{QGm&Z=GGv#inBx}Ie6~&~mWgBkgt&OL8syXv zmNTt=lMI9}{I65L*c{FiRy=bqcr#*HD_jW@qNmU*DLS^vl5Ow`_s`i}MK@ruB^c6h zo&#rlWLNFVKNVoSWiDVOZMqKwIr!^Fgb}!DTt%YyOQ+|brT-h#ZhP9vz7=E{N z)NNzfVj{nma8-rHY?IB@j2I@EY{8(=;FXQHI4`(4Xs}bk5ctgNDvd304}+vk#MKoI z|6C+So^$Z+O;njg;2X9VNq;CHF;6)IOG1;c|J8Ue};0WTkyzPE+ zKj?LF1fAN>Z|_IsFW4^=7Xf&+wLOv5SMc{gR|&?$heu&U@VAFYv4roFWG{c&ZS?g# zota3S-eEpr`5Ui3tgTx)-=AxEpLa}dwPoZERO%QHs(Zl!?QzCyHa#Ji&l~1?oiwU6n81^S}eG`yO-kb?heJ>rC4w$I1~vM zoZ`0g?TdZ>bN0E&dUBKZVy!1*&NauFV{mzZFPpdCzU2Bq*0i>I1LyV-y73vKD*tz> zm>A+mcN2R~>HVj90quQ&wzYeZIGpSMd3D8;N!&SmI_rO|c7p{bZiy4SI=-GYdft!1 z*Sj0zY`yHu-D|$>EnS>sZS^glay#1XD)>Se4gRdwtNUJA_+zs8UU&W%@cK&<{ju%3 z$A!n`j^sXP>yfzUGN*Psg^0z_q9fv_Tc_;`Y$k9$v^CUfaF6R=wx)GfQ-C!Af2;Gj zU5rW1HSUI7_LM9dJ0Cpfy$UBGJL|grGdpc(V$6a-HI`yLiTD99aJWx8oFxYHu}VLa z|F)K4*uhTo*Ez0`B=LnHu^Sd5qSnJA#gaKLxZQFk`rzu z`?sv(Z|`7HLy^&*7A7Ae*x|gTT5m@~RZ~eCAg*Q1j4N42E!>csV5EuLGU?mWZ|`=f z6_F;)I76XM0ihJ5?Y0Dxt)VVv3N0XP>Nalbrx?t=d2FLNN{*~qa<~(LvIbnM?{@T~ z2?}bkW$xV@^5Lu|Fkr=A{>Zy^rPK#2*e^2KHBTK(Z-Dq)B?Gs)C4rU~He&gvPnMXy zfjB4g1^+``mQ5e{enS$K$2n!yH*{qa`^n+l7^c!lFok8L@moMe*i8&^sXV!Vn18+^ zP@+hOz-(q1-tmX&VV2eIU{44IAtkzZJgme2-XTz9Ddx$OP=`jFZ^EFzYvFs>prLu( z_c=wwqS!1Ew#&*_pp+X*zRJZ1vP+8hC9uumj>;wsM?#%=t`mu5wl?zJK8;;8&w{uq z=Qz*We=~ZgnrnnFr+~Yv?0l@b!B6f@WIZbXw7ZtSd$dd4k`3Z#Yc=_H+W7s`cse8@ z$PaM+xtSoeQ-a#nR|&>7&nb!h{I0IAT`6CVBmBRFwOZHuct%&%k0~nF#%kDflBm*^ zpUTzKhvC%7q^a)})$;*?Mu2Hr?bSQ!^P-O*B5@JQ39^B(#8@(YS`of%qf(U6?-AYQ z;-(zl)NAYbk+}-y7oCEGm6cjNF1RK12?}K*vPVPRn1{t*WIvX`7q9jyL)1?(CzMth zKYsHyEc%?Hfm^IDTR32LYVg6^R3KTWBu~?6=*)9pawUNYk;4`IvKOxB4XTv_bUgnt zsXuXn4`xMXs7D@3!UF_!RDG}t35c2gu3fC`_FEEOQG*s+8h*%zdHfDh-RiTx8UYki zwW2&CNWB|*q7|Rq6T)GER>yUL=$dv;RS&ORi^uLz_%SMfp#$Sj=kbXpQ({fryV8>#ok%y+kO z+L&DbS1t6X1AZ8f-+|13U|#17dKYju{Z>Zj;kzF2yuIpneRxil-m9{Um8~a^*I|RFES_FZv{e4e@MrvY7YRy!_`+AP;n7mS4fn;wxj!i^ zpak=b_ZIz3Ab@rXR!J?$1Q3P6(sKkQ^;};XRel}xTXvJ5~ZNWA(MsqJTOK% z7z!`%vWA1l8KdST+hGnIz(eH@sh(N@EEA#0Sp-jJ>K#i0)D#P3uRV8fE-P!ppptAP zyf3Xhs;Jm?ETH}O$E;q-?m9x|#znbJ^4;7!LTtjp<@%VK*)V>Bf zM0DqSZS7L>aR>^Wh;Izc3L@^Afnl*OI+Lk9mincJM|!+UWE54K^5@6aj}38QmaLM4 zsFvRhGZfV9`D;+pSq?MkPveoI1xBr6_{5IHo0U|uzK7Y0K}#5ty#jqD(Jt8-0r`wo zRU#M$gxK1OE#pX$rd-Kv+$Rz+$6O4SL71gOWL1OR)a>7W9k60E#K{gVAK;}op}SfN z53`@uKBFKMzbJYnZ1x&{exLkV%JP7!b3y`lfKHWa;9VL|T(ji4G}-J|p?6&KC_e*X z^EtY97FpA(puB~5Eo-Vpc^Xpo)Io-+WXS=i7d{687syH0b?hQ4Gdu-;iWsZK!|CR< zijJMCz}aAYANC`uSpPmOLm8VYeNv-~TV!u75uBf>6yl7GBOZ4u(IAdw>#s))C#3Vs zM4suxpO*1!Tu2_XHGqTa@1pQ9-l55y{AEjVa8rxP?Sfhuh3=XX5!w;`NXA(obEmO=lJBYhT%lA?gm2 zxlik?YQuWJ1;c2Q*5G3boa&4D_q=@Q0>Hhu*(RBca?<{Zx7FAZ5zf~C7$|>+&T)Wc za6ft5hYO0w1^G?P325iM(+7opD2XV+K6mW}XUk@?v*Po-L{gSqbAa~1Gm5_&xa#^k z|CxO5CF+Z-KvNN~5a)6>hl881%E|VNh~%b@DTBqu_rPOQ!+aF7Av{;Z*p&`bKeLY| zeBSSrnC&IeUtNZS%NIo&4!0j)1SdK&*H{hv{LtzuO7wiZnv<7eB3;oQ?!44dtaQpx zv`qiWKfl%AZT(3#Tk#^hUjrH3ZTh{IR8Lfmv1xC*s{4H8K#)TJ`u(G*>sKjE@`&tw zeAB^Tb4mOdeD;C_3Q0^}_UHuBVtlHw@A0;6_MS}=S-+W=^q4Cf=G064URO=-p6hRg z4%VMG#~C;XKh1O)43B!8torAeec_s9~Y|pN`#~ z-K(vt`8p74Uh*4V0!O8Cf?Ju>is3qDyLI5|&UfXGw;0tX!ln^lCChWsE0NWsVxWJB zc|wm;gGBjNKp@?4ZQ#@7y5oUZp#t|&|@8h?%96#WUm^^I!X z>ggM235as%>5VIYDY8}RZ0Z@gWS8{-X>EQsL6BR*m2$)DecX_& z1YAU3(M+xZny3wGaB6H_N1I}6vj_&`2)S+W`rER$bB@z?HIgsH#(;(hLY%=rI{T1B ztS2~}U?Roib}pmuwY&B_g(oyU`+$|*eMdT#%^$K$Z*RA`cihYvtQa(7^|uloE$`1} zeCt-%hzpA#2t3Ti2Nwd9_N{EL(;#6wOYNBRwKWlvXrwLiba*G1F41f%IHl0dncr`r zHqF_>>kLk5CFh0~GdYt-h(}b+Xp;x`^H7sSl^Eojimn&av{=|<8@ZDNn_v8uRTz)&L0D<%8hjGPe#OHXY%EE7fXyXjtv}j8Q8uocX0Si0 zBKe0|+)O)eH`z8lacIY%SIH%EaKT7rQLo#cP9C5mhn)T#g{gud%ed8HF*Q7_(Ach# z?g~q>U@<|>bS5whFfx8;%_OU7H?l{;Qk;ik>_o2T@llX#jV?i8aA&n`Q(wY-?i*53 zlQvHZEd^1qqfD605h_2cRf<`|5pl9cw#PA=x^bFY8=mHsoev7_hN6WNjkpXs zcqz$FxBW@+(U>4FcJQ%l1c_Y&AKKaR%lk`+n}XG z{mk;^t#S2NxDSiZs-_`rM^y>3^UDFlBBeFQa9B^RilHZK6L(qaXFdf^KGy5`aMkgS z%)i$qxrY=Q+!}Q|s%~{N*XXzHBV{>%ql_YfQ|lp(;!$LKIhh@6 zb60@%+%ohbq@AuRb{i%-l~&ZaX8LJ%xG8PToOnYF|;Z$qaYZ za!9(taeK>%si}Y)@gl!#Bkh94qVeNc)R(4eTv-=t8J6D zH+g;kNNTq=&xJdehm1P_HysUIBkeSClTY3r;%y`|giVI#D*XR1l%8<>N~250PrtT} z+g@M3NVuMq$M@vI$1*Z6icL#1mFAYRCrKJpLSv+9j21F1XeKnp@aqrr+ajTo51@4X z38p8-&OLWN8-3#OHqQyTQS#36vO|@e3*$ zCJeNxszMf+HnVrCp|TFRSrUe)OoNS`2mPM%^97f7KIS!upDyuic0)U57no~VoOjMl zx*mrayDrv|1l*s4vbEdeOs;8p=LG*0#R>PX9^v@ET<7iHPAWVLFr+wDx6>#E93xKk zzQ7qg_NN_j;b~{_56k+HfCh7_2QZs8YxK6Wwmfrr0|IC4&^_N9QT}}eO*!8tuy;M4 zYI;5Oui4@ka$OObY7fJz&t+Ec3(@mX2 zn&h!FD6u?dKD~9bt50srJ0W%r^4ctQp_g~78wH_^T6eqsWVc7&SW>xXJ& z<`_n4#mIe7J20Nq)cmk^8KT0hjTbKZk3h7Z!;7zPD4YC!2tq1Has(oO!M7&Uf))+& zu#u{~)+;EDrrOf)i7a1y>Yd_6DE5l!ITM6fwvN#`y!xOFK7lkv**>lKJ!%;~9{-L#9F;z$N4vo(m#1sR*K zXhJ=F((uQP%5q6y(SiJ4Z3As$;H~X$VC-(NuJGWrcF_#msawq7&}xXa*Sk;6MSFTo zZ1VF<*0^0V+1E?0srCS-E-33y)-8@YS#p3t8AaTz&mXN6*NN(%rnm+sy|qKJwZEGb z(C@w~mX`(oNG~i6ZbkmNxVWUKkT01_C)dKeBc!%YB$pof=-J|uDCjV6Z##7FL(hPr z*=LVEtEEkSemA7LXqs>7V@kVr_<#U>uV~oaj*!8Z03I~=3XA-ipA9eGM$~qHs=RLG zL6NN?0!9tT6N?O$YQoq}9}0grx=AXL{mtW;!@mrrMy{ii@nvQ~fnCj2fb2~?>#uZ} zqhIW>bC%>}iYt#pc$+( zVqJ5N8g`B8&4fa5!7BcG$d-vd|y*&*@hg)O(z=B%XDeQ*zO*{*BwL~OE@M#66^fR`!(lm@#vP5Br>v=y?uFXsdU0YgjZld~|E*ppMwiq|ghM5$(c>IIn)q zA(h(p$CE8Kl9l8dKX}}~W;5Y98wLF=U+>7(^2d+H7Tzxk(X7#3P{a*2R&r>r%>_(Q z;Bq%zZkc{htjstkn)ok5%c! z`cV_-R^X)c7U3d{hu<2BQj|@HgUe_K9A}C^Td+#5oVezpJp%1Z>7RxbL;qscr2}^G zlEm%CV6?EAlba= zdl@T8)g?q@=8v2197RFn49ya~PmrL#_nFzP`;+S`$yvY&0En~R<{!j8)f<==2K)It z^1iefQfzX+8Y zvmQ78l+i>hzBJ$B#b*D?OZArIm%oV@{iD%9mg@j|6J*+Jt7(R_otW@jf6QNfO&Cxe zQ3ppMd*$$W>G}d2cC2lh5vl{#w<<6y+>wnTnpZT(70J9SsAj92cO|Lenm4c7T=sSa z!6Ymmsx-!I!z{ATG&fYW*-B^DXpcGx>w>x)`HeB$PUMgz~<#0vN4*5-RvM zPUOi@r|`RyW_Akt-5*F+xuA9@UVFe%Li<+|>XM-hRoSZSFid{n2sHh5QV&Z>8$loB z;s|9fM-yA2dn({Gz7dcgF|Kb?d}O^e1Uy_0;XMC?F8}+`Rn<3%v<`dZ)tJ`eX4wxsb_xQ6E&9C6EHgX5D@y&$NuY2fYGmDGEO}n$H&YKnri9@nRTG` zJkXv9Z)cys3kQ>f`mBBzL56uKgW^J-AjQi9(Q6mWodQ@Xdcu_k3{9_Uv8*?%5~gPA z#raE+)|jLdbMG{yUWe!9iBgY$!!H`z8Y?Y7t0AKdWNVTz;j1?PX;C#q+rp2Y1TiPn zYB#JZ=(Wh7>kkmo;8zlrEOATQ@Ff@y%<^`;byJS21>gglh#h=>l?*MSx0A)Pn zmTyMf;)KZGyenpoe)*NJ+y+e9v*n#!s4}kfsH}j0ik<(vA8B5dPQ=?L-DQZRV==Z+ zacW`zl{K=O$lltolKAO&rp@uBN?7tyyrhJEx}{E|jw!DfMZuTMA{rO=LibPt^K_&C zbJphCHVQkcfL~kLFEz8@})j*r-|6S@dGzixPtYO5| z{qYSTWx+}_z&&lpCA;6-<;fkl+49dZczQm-KZ!}d#+%{Y(+(^X&`8zb^?&A(iX+<| zvM?~8Axd@9jN5D;?v7iZT)o86hy`G9eRRKdM^MM&zEQ|-9wp0EVc*-7I@`ZLqO8i( zg4|~mA&2@kaG3aA;xl;Qqex;+`_fvvWxA$y67%~7^AHsg4}G*C`#Tar31fMUU+x(O z{)BV)xaG3=L8AV-`%EjWJYzq{~F zQ*2eJ+%P>oWC+A-@HP#>DvNV^J~QEo9oRor(D!;->v}rtM81;*G{ff3)AUmUo`hR> zTKf9i3wmWd?pOFWQkqB1Q}gz2ho}GAy)PM9dY&nEjV9)v*~-p^WfIGDd);GT{Vj;m zHx*cESmo0>eqBXku)oNy4az^swP zCKyU)Mn19{A(eZ_&l$y<;IN15#x`z!v&ml_be5o&QdmcoBhO1Bh6!wF@vV_0OmjYq z$D2SZP~`hVl|XxShh+zO{qAgYVEeQH;ji(uuZy&6Zv{(YS)HauL~Lnns?km)Q-5Jf zsGgt{ty5S~QaCfRf+g*sp^o;Zc;!E5%8xd-o6j>rLBKA;b~iTFEIPN6=gcagKJ9$N zUBq*LM@7xJ2hG#vCmErHgBL3+mwMl+Jp&_-#TGl1F}~m9ED-tJENRdf*JVQe%RD%a z30L)vOQ{5>>BvW;y(UKPWS#D6$gJIo#dh5|iqXQUK6_|~t2@2ncCn+Oq2=WR(_k(* zlL9Agd4-OgfNIdE2$6fZ1j!!SvQnG`G9J=R?W8fViP$P94w>Ry;bD?7bs7Sk<$^jX z=K`6OBAu~gGq{^-u5>+S^{IHZvl9rlQ;3en78|J(=8cTk%|OLPO%r+XpVS3Sb}|z2 z$~iy;kYJsP2o>n=^dypsj*DM(*-S2lowq5Cdl>?EK-pIaE0X(!)|gs^-$@%Mro-cR zYc?G08VU#Ra#18BV%~DmqMc}49xAd}5iuU&xUHkV&A_>XD`FDbHmATW>veg#2lOaK zJ3N;k>S`Fgsq#(=y2qu$M{_H{Si)A2B3*sAL>t1~el3ROtxf0fOO0Cyk*nx)sZ)uM zADmkAR%wRz~b0++^+7teSNlYAz9`WFi9YWY(k-G+OcM_{Xjn6-MX z1>7sYuk~qZBT|%e{2r0(!HwLFA?j*w3XI!+dni=c^7AW}=5eeScz!O; zZ6Imus6}{bJx6LI^k{sJ%x!e5RY@l74nqF+sP2yPRk zw6^#kxC%qqv!5R$fYjnlKYfWW%aKBgV{}Vm#J}wgZ-gxv(LGcXCO5B3OVg>#rv}09GlUTI3OS1lGI#|88 zi<=JEZY8)e-Y;Z+hbH*)j_hd`?TZW%BE84bQPL+qQ|Ke=C=WeTGhiQg)%TcIXgEk| z6ZAN$-oR0`Vec}%(s{&jfPaRv($=odP|>R<9s?UYCoL9@SCMLOzrvp%z&?=W3d*K^ zpsxQlNzdib!NZP&Z%AuRw<4pZ%kANdz|AbJ*ItH8w%z#>t;-jN7l*qlFA08 ziH{23<#S4i$J`yF`3cah@h-w>?S$jdRj14SRbAirNFvtbyl|UaCMkK`p-U`a+2Up5 zOWyqg=-~n+JSY|?B+YK?yuFt8aBA?(ww9G8uAkIy8F=}1_(r#5{5resfDTQ_jZDe! z88P>9CP~2a?0f0~*z;1Z_9CWMXq>;brcn8lz6d||=Re3>Pw0j2^MmD|qf<(mqxlV` z)_E9UYuTAN@6{>aS0tMj23LlsJ~s2s77S0A0Ui}mS`MpPW8N!z6xie*7;TR z{x9TnB(3Ht)=Y9xwz9R7+*tZNIIMX$;aOdv#!~pctbeuN7!|6Fji^xRtKADvA%dWM z&yXwM4TtPQ2;F>2wTIM|{T@5{){j4~e7Ma`$2XK{i@5AOS8!FW7TvE2J@h-&ZyG(_dP`N))j0Lk7sx7=@*CiJ45(J4;h+6U&w`et zb77W;3Q&srZ;JRRD(*`^lmhgqt6o45dGh!_sMX?_4((UgD-x-M7}eoUO36;K#7(X6 zsP7b)0aBRbEv}zYO$UMnrY^GHOVFI9L;=$9dtO+Nq^}6hV-B|t2^bA_SKFJoNHNc2 z25~%CQekT>}$I78%(n$Uy^Hbr1yOjQ{s&`2S^~E zeohh}m8lSmbht0q>@sbj9GXibp<;>Mf}=jaFTDw3bWC(VcWlc(>&WHO(HB#{gKll4 z+Gf0x;!$X{h+2KwC0(>%?pi|PxFliG$>DhJwsq5nA7z60?EG3DW^GCJhX~%hh_xJX zj48+o=LY{CtNP8RG@iYQ+U0PZS3Tpml*|^VnNn@n2>!aV!s5`7Q0l0RQE}sjL@By= z7FKvgnh#LvGzteYxybSn$KO013c!C}4HR(3*D3@n&Ne&I)c3JR%Hz7476lh`b6pQ> zRcScf5!exGUaW~VsEE#>GB$Le>Xfp@Fx1O<4DxCxj;^yy5Ay%lv=SMU^KW7<4Vsvc z@NXvYGBj_0khFR@YjJ6vIHKWYe_Qp)5M()L=rqW>n`HWmlg&Sa#<_+v`E?<9HNGn3 zC=Wt5|E8?Iefmgl7yRDn_u(Mwr0DmxGA%3g>ZWkqtY9P*Ak+mmDG*1hMoiRr%u2W- z-B6%38%@f#O&%c@O1^D!+Qm|vrc|3QvQwL0Gfp5rAM=qq_ogt; z_lzaV2d`K2CHkwE#Dzn+F+-)o_`}3Z@e}!R_sCF-t5x z!zpVHE=?|potmU{I4H98&wXXh_zB)7{!h?e#U-8X%|-b4T0k8`|K@?1ZV!A5$_4=w zi>4t@mV!h24~zMy9+q&Y5w3B$Kw1q-_t30j30a3Oxqx-b5kjh$XxI40^-VIgySras zkuBW_0aeV7F88RKEnDUV_2HEQb5upGYZfLhLDe}50w9xSzhw9+fswo?w1Di+Gr{jO z7ef-p2?=-vHM{jLK53KCwYJ#t*4|6LX}|5E2o91Z@^lxc{Vy%MYxnjd16GaA^$OW> zBiX^5igBCzc>>IB9ydm*2WgjCq(m#6m=@7c{t0fp@O2snkL9(E-3_91=a>D?d;31? z13KDN#rm!uY2l;Gvs1?G-bX^D?JpLZQyC3U96%J{1{{mQGtG3*m0K?FjT3H`=-vk& z1?B4OgyU`a_e{MCY-4Rs*Kp^$onJmzH7)US1>nijcZEjH|2qALd;fW|{5xazz^GuN zO8+Dgx7Ps}hs)i;X?pA<48X1KtAVEz7v0gikS?4Yi|LK`gI9&$s1lr0+V1~R!|7KD zGL2>t$_(y3bA8VpL-ZQfayjgZZ;S3}BW~89Foy8RP-#1mL3EKIHNnBV66;}y!c z@UmYGeg2(1e`!0>8!63XEj~?UJA7NF4py)q5&axnAx6|$_e1rJ5&9ldl~$w?*MWW| z%`01#B_Jc#{<}$hF(f{Pn%*Qt5f79-gP?8Dob>ObO##Fcba*j^Oe-#YwGb1utmIm73a=<1Voe{1Jx+7$zg953@7#=w@nAAcmoe5wvf zumh2pzmD$8SFs~u(e!tL#Ba5+Nb+Q*vU=Gy2V|taH8~XsZ^G(i^w?dD zufeKM$hWPx9b{XahMR{&)i)f1zCkM&6)R~ zHWHblnBeD&;HW@5IZ|O1-CA1@T}!odv-DuMI^y-3s&2M=r2c>Sy73}jJ+%K9 zx7C|_Br-YWmJjLzDs>=dVSBtJb=dTef!s2b;ZCP6B?9)3rz9kgX4aP|9Y3zl3b@P) zT+j9grlzb7C~(1Z%UlH;&CyN`Hx2NLvJ?_DX+en@^#E`FPHs;Wnk_6ds0WTYW1n61 zrH5F!G!MD(cpIFP<6aKK(sk@HEKKGE3T8r7?xnl=$H*@z^xyWgx-K9N+wDR%zcotY z=EysD?P^YSzpJ5pDTpND@PxRIW_Kx3TJapmQsW3zO>K%0^oh9 zq53VKf#GNM*+gAE&dPk6(d3VI+@DNj_X} zsc>!b3m8+70HFi5nKVNhP4~X{L+ip)*E!A}pwkT0;36Q=XA`}iZo9n0Q7p4JR#{63 ze&LME5XJIs&__s?__6K857s>ba@A%;mcNh8u}2?ccM-Pvs5=1%uIdWkb#|ucIwS&_ zi%WKS>C{JA@HiKsVL@|sW2=M-Iiw;SPghI@Zq3VoUq;J*n96M+&_{j%Rqw4m;(3Lx zS2b%|XK_s%e7L+m?5L6gVLw1Q)N+)jh^innLE8kjKnAS>H zlS^z{MWcMxLS=jEkC&QT*jeqO2vuzGB;?Vrv0lmDo|4=K<=mcL{#2 z0^O~cYJyNyI=PwjS9ob1WC~0MFL2eHr)1m}wIgs}Ai#ew8Hhv@tKz`X5?2kD6B;vRwXi~JD|jCes@RfD}b6VwD3=bD#0s~T*3P&i%N?(YQs z_9c`^RohFI#*0HMsnl>m#UfgC2w4t; z5*j++-eI?+2SBI>_I%UI+M}(O{#?ea9lAS;_}{MOtTvtC=viJ3X6mf^j&hd7v*JZ| zn)2$o6zNX|U7fgg9s$ZmPPC7T+Usk|0BY1?y6$pM)+U!cn}o8&e>Fr*3S?$bohSp0 zW8XuWwZv2q2-5KmorbSMFyzue@kE7SG%HeG$&OCBhGuol<^g3Fqh`ays73eKTqP;K{mCsXgJwA}$+5SYj3S>Kp zrl|_%n9;SG)z2Gn_+(r#?~=jaR|qynzr&~cnEAbt3LZ^V!xV-<2;G*yJev>Z1#;T9 zR8R}HzFrXqZ~BiftMHko{~P@xwu#>s8+HEJG~m@mSn>Gu=j+it(RnIJmR8V=C=aLzQsFFuNyV9QnPw2w_BZdTsA#8Yv?Ygu-k@UXFhW*>ogL6WY;+>Gt+b2Sb zo+sB%C~&k4$%$aY<)fX%atHBKUy^vCtZoyZI-*)c-cLj(Q$}y#B&d2$j#J0kqE_BPZr(R@Fg6H_JP|_ajfT@V^CgrFJcBCSQ6yxDUmE{|E zWIt1z-!zk?3nh6Ih0;0`+*~iHQ_P#&UFI=D>!W3nG@wcAIR|$qF^}iG1h5o7F!}zT`|%6~9JVpNZD4 z^sJ=6`J(r&ZNsFA)3l4W9;>8kkywv5&raysTx7xS?<0;j)SIi+K-n7NTCl2a*l71kp!3LfBZ4Y4ORK+YzUEj4G#XgTqu9PSS(=aEw}z(wJ}^iV=i+24 z8(|nC)C{33`UgN})x;L{Z#TBGjli`#?n!h=?lOD*tygDOUSq|y2M-J?augtMxx>i0 zx%2IgEj5~Jk!afc3OrT>Oe;joWxZ8&^qRb)*mi%pw5%FsniY^(u-2orj&bwMDQ^yz zd*PM+1)R$qQOk$`2DApq6H1r^Iyq8?YFNxt;mTt&8kCYn8IyM^J7!Z6aw#&qoeM%Z z>Z*&b2*l2SFxSB=VrcR1KV{@3d_srKN~@rg$}}0Hcc`w2S^C{UQ(y~$Dn!>k3m9_Dm5Jl|8`Q~B#zLo$% zTO%nj#Y>9<4$CUA*sU{;nd3Wcv5&dTCgps8SshC?;b74xs$q$0iCoiYu23_w)P{_D zqhX>Efs;1W@3f|`|0wJYKZK?pDPT3r?v%&QU&$uyMRV^a(&17l)X+;|xKb9Dgy&<8 z7LuvW-qc%TW#||&u#k_miRR4$+=(-7NPvta>my0$ zu!N#0HLrt`IbpZ#g!MC*6E5NvxBMAVFfMGiX*6=gr_xCwZda2(V?IH?>riM5>EW%7 zQTL&_E_B8o!}3^;r8N=FIRB-p=+`4C-C_kgYHwYw&Eff*>USrf-TI`qgw~c5nHEOh zIya{4Vf`}ko_L;Fu|S)oy$Xf6i%;9;RZ+n*MVXqa+WEa^ijL5Ep7S~H3_@rF7rJh)raw!lO zXfr49$7vnWc{Z1&Tw}vz;ajY;6Um)OhF3xoUWQ8L4`B`nFZ}dnO#kg&T-C@(q%3{W zgz%CRErLeW#w=IXfKG{o9m!QTov{FM>-Fl(d+a*;r8kJoo9kW=|@8RbQqFtIZ z@9SZ+7N<|%r}rXS&JqFC`SS83iLMxOM9?`Vk}}DPN|oH8 z10U-8GVGoHWjAqlE{W&Sntr4Z?0UW?ilpVFpf$gGp2?7Mj7lwXzK}kbOHna|_x6XH zUtFH@$Ul*64Iy>QHkwzds9PbLy@A6K#bxqhF(a@vI=QT3__et}ZjQeg6v@MHLQRhA zlWWM2VhGNW3G7iADtYC+)1@|MKu*wI&D#`Aw#lgAy%sN*=ik+d{u7oqB5xXK)kAz^ zQO|6C`K~3Ampgww6G424cH@xHnjZ<|iIH9L=~>)&)?j@ zxmy3nzw9o{ACP*M9s|_|pQ!VO3}Sc`XN!ELEP>= za~&~1AjTTEIX7<0S_K(|9fAI7RUWiDtE<1Telmh*5IbD8o&K1}?l-!S#s$GGlm>*4 zdyS(vx5PHrFxAjiV@wKQw|%NsevF2OckX_t!EN6C1t}QNJwdoMW-r2?q?Eci;G+r> zI{ZbUAbsa=PCCkeGHAvqEs*jkWE!GP`$|c3Cv4&;)BeIC9o6 zvl<_eREJchH2olm6*1ax?xVJqoS0_Wy+)uirJhC5V$COS8KG{>3%g2F4S0$S&MO+y0jab)ss4&zzhk8 zlvU%(E%cZ%SD@|ewhuF`lPB|#LDQiOvFas3$MK)W8L>y9YP-J^aWKW$Jk@qEjxTfwM2@eSg+ zwsnV4DI+MkYo;ph{|3YyN2x-MK)%<@#*U`8I;UyhqP{_f`Ux~%rY}|f9nBw-D`DCx zu(cF+i&)+b_Yy+rQ#HK>4}MUwlJF+Z=iMH%KRCpYxrlwl?!!*=7nt5PfVjX<;jQBR z(Q&a^w=TzTs_FV(hb0zWvJ3l|sC?^zK zDzM4pr-)aR3y$6A;w0!5r0%;?r+!1Ul!kMHH2^h1OXcAbO#lSUM8$0aIq7l)G2U`_ z+I;e}I9SS8WgeSb?(bkL9~vG zUL#-;xSM&o{fLTB(LCmGbIL*g0~M7=onf`vjYz*k!`+4|roM-L%SM9SR6%9|+;gsr zWkM9pG`p|eGbW0CgH!}Ro>g$QaprWM9YGr0x6o*;_| z3v5(`OSABUl7fL9=~+eM^?o3jfe>o*>H2!lD|E?nq|?$SsA;Jv9F+eRl`}}W5exU< z$8fQbwJVuj`E`7yNQJ6VKNJj08`OhWf3(+(I&a+WFozl-obo9{L z*hJz+7a$XgdgJX~)_Z?`D$6i6aXX1GCYx$2-*TNw?7Ekx7p>pW3DluKxaI$etLrr!Y|IQG3Ya7Sb|<3*9+=tgct`lv z=r1TP?{{L@R}oz$2`wmxHbxzN9)cP7FvsGXhF@4?6Bn67>lDBr;G`&9_H{8~qN?kv zuhY@ZEf16W#SQUQBh82~!W($9%yk~WdhU}IHgJq$OKSE9?EQuy3YOTg~w)V5;A?Ap$yojt@#|Ddk6fs&NIA$aC;nEg6-nc?lyEH$fycw5jOeI)* zuwtz&JaO1m@qa6TdgRintQpy)n8EJH-kqveK(QBnqyc6PDiehs1ctjx5L&!mnBUYG zzqo%lewYyjHRE0Wo}AG+`4)p`<-lt5s+XTM@0~^Yuf)gfuRqF^BLs?x-Q>$0j%z72 z?}~g)A6E!ZQV=nK2o4L_kc$zPnVEt&*Pp{HvcxLKYFN~xxFeGb7*8hlAq0ZhB_#ikvm>aT6W=1rU&xRcKM zHkPhMb8|qW^@*AZ1@M6Qhke6BCF}o~M4gYJSwY7-LrqcDyLG_692M zNuQr``&Q-NS@iQ|lU{PDgh;}W1;BH)&5qRrJk|SoNOM_oJhw)Vg`V*mew!+_^G2!3 z&O8`k-7T_X^JNq|;>d1d&~rd#fMqHpnAa>+Atzc&VLkr&!?5*|kQ(sTDy9-=ykg*r zLnW%&kVE}krmDumXrEJ0W8U+7Fw##e4juP3E^RaN zDiZf&C#S_%}WxEFVKDeh3*p~YcvcZ$2ayA=is3~nv%6dPc0cXz+L z=R4nj^WU2gLSVA9!=731TF-jK2WLF)Q5Fxi4+aq(Jx62Ww4Y2fM!wMVRe3U8$pF+l#m= zsoCd*15%YIxe{*{RuZ;NXzfT)T200x=K}5MK%K75%jAhC@&{0@zBX^&w38pOiwTuP z`+OPV$bRfuH_Iwldv7}tZT(J46i1*VrRs*yv!oXW>C;* z`r_A*?gGA(vIYl-rZ#m2lXXj2gO8lSRiF*$fUClUrg8 zx$Ng-7>~l|?Ek@(NIpVJ=Y6bWtr;t%{VmlzY5rz7n}9!TTJtH&csi69F(qrtGQD~n3`E>~%%V%0jcithy|)bt!glvtMP zp$Sk6(fKmM5B%sy_03PUjIuTGoN1&=Y&Bn4Q@&|uu`Uy&KT1I~OF#7R9e)i8jEkYL zt$lOxeA!cbjdC8zKrP4iWt~;FwSzl?0Y~De`39lV(zo*rYP_@GI@5dwr`$mB)b6nH z)cCQmvY0xmM@k|!-aHTeIH+*ZMUU*Ga-S#n&Qc1Dq+-gbS$u+QG$W89KywY70_nH@~9@U8=AD0QGb+D7? z<2n;W#^X~kn3;;e&bUSHtPKFBjFOta+#cezlggqmA!sWp1oVT@$=+Hr5c04}3n^zx zD3_0ZWS}Lz-Ou}g2 zFR!Wgjt!DSKKD!%_XcDhiB>)!k})G~yqPx}KDJ;)Lb#A0AU9o~O2Hne=KAxm2o+B8 z^mwvhZs@J-w)hrJz^^}(UFZVU8B!U_nJiW?YGm=+jV3tX!s}zSNS&2N1J)t<{noD) zKmXXLX161AHQN3qInHzW)3r!fb+FbV1l}eb>p&wqzqAl2nq64GzUD8I(Mzar9xGp2`A7qCacm5*VM(a+_X`r&& z*Ec*&+P^o;UOFH)+Ati_m!fv+UCH zK1-V#sqnoR!$8WKrQgNh!(dyW+JWzq(_{ZfTKpf8@u5_98Ii|lCbtzT(Dr)%pvzY& zA!kXD7|`JLFhWegyLxo=(FK3MRnj0DORTx0_~WpYZl9fgEhlf<+vst-b>aReggbrk zFFid$bx8FgG-S1nmLVcz0FMpQwVL<|D`!TtuRm)YbN2+YFcvJ@Rga;&5WsawlzL+UIhQgz*P>iw(w?GU7G8ob(LG`g&|F1p zETZ0!%_J{^5VmB^X*_B}_XZ%Pyy?Ao4t6FC zjE{PlVjyuui%I5XppSNA8MmKP{0K%U!ryZhdPQDnaUN8t+D%Cfjyd=bqm zoM2x<2zUW^l~1X%U17MRCFa4eWrMAlQC*K(US1ZA4;JP3@Dg|3Lg)?i!Kr%_*gIl$3D7Wuh#WBTLe#@#~t`2EoJz(J)j7cBN0oXyqez-#&2tMyWD+s*PLa z11;ck(vG1ofZA|aR)XWLt>cf5)GdL2MsC_Hn5!yQAxr0{Cv&C&k_;1eJ;sz1i83hM z=E0_-f_G}{b<1CMhHo22I<#_VI!NDT#&KT?I5^ltul&XMUBVFiwPFKSET?#V-s{B* z5GPvO;NkqC-CM3|I=$vt7!8=4iPBRLrWqhqFdNXe8L%7_&2}%}UPve#JtCLIB$#d) zs)ufvJvW~Cdp^y?4C#AyPREm3f#ocXX|?-|xvtn`eh+Fj1~KsP$Qm{A^UzTCq^Y1( zZJ-A$BqiYPS8d==s%{(1UfB~h9+tAn7yAT|8r8Ih=+?#AaKOaZM3AH^e1#@9P_wxA zsXq0&1(==x8iz6L;+729@#~B%|k~dZ*k)2cWr+NT5_uicnrvMto zO9mP~CjY9wqTC>F#*oa^ldMf@)SsiOTdAJwWVNC(HRJX7AkX(F`I!QcE8lLlqvmlk z*jCI?ZYTPX#3rAH)bA1oBde-Wi)qWCHwG)$NJdlEP0c$x0(5AH^EcE`IBp{~JvF#W z##HT11>nmJD|N)^u3YxXXGNyT{A>wo_-5Y)Nz*ZLqt; zis?bA+0r97$ptiMO;G!V%(wxYz;kb#JW><;UsXBv`tjyX@#!abS>;#Z(4O87LqWDu zT8T{>J$5z8U@G=V8ME8vz$1bV6^kkEKKRS%lTYsTH)C#?63TI=+is`-E6F+yjj$}Z zo?Luq#LVR9RQ{O+tDu1fQJajUsUYcNr3B-8&M-}3q@LU(GeP&5n+31UFD6vPf&2Apd>6BZzw?Ln4rZBScNr)w%+nG`gZA^`nvF0yl(#E6y?9ligCQLUxO$OHth1Cnk?5oYIz2c#A!_ zMx4Xp@QcxYGqkQx1a>Z_Oq)HboZgA3aRx%Y8LrMv_x02+3)WMTM6l4#L!ZVmo8BZ$(oAb%VJ-b*QK7^Z792HWG=mTM%u*8` zD9MtaMPhx4Yl|#>=xx*wsqvlukp8g*5gc5IG3+v~b@Lwl1rP_d$AkyA+>CKOEeJaB zTQBtVIJx|F2k3>2;X07%x<%%TR1IhWHWTCKqV-lt8MxAFm@1dtsy9JPT5c;WISaHg z)q*lq^Hhun(||tx7+&z8P#>}`K%U{h@ho1O24fuzjjUi z_TmCAGLl0>!`?gBy1IYtpjwqe28;=M@4vk-I`*4cS}nS)z6eZYWR^3jW5j^d+_N(y zAyFh7bvabfVC^>Crr=uPV_b14#Ca!S@MK``6OLE)vDtJB>9uLFRt8k-FCBcpg99Pz ztixAXqa1)G@-c&fF^u1+-{H(BS8|%m!8m`y0-g9vTMFE_C&JJu!!+DZ%tk_Yzo$); zC;6zGx2`vXbyqS^L`Cy+ZDY~8sq=HbsT4%hqV7P(b63x%HH=aZ{}2DhOzu8*8{j5{9}1KL=0WiHbnp~EIS+6z7kQPzlf zgwUrZBC$kq@CYjW6|bp@F|0w}@u!TbFB|p=m08OQ!m!=jPE6S>52tDZPk7IwulS3i zm?-R7q8ldf{wM}yVoxR_M!WIzw*o>cfZsdIOs3o`>3t6h>xK%uceAZrYbayMm*^@YZEmjcg zFQnV+PdH;d&EB0edh@H+ET2@3eo)02~O zMa>Mt^@3MHUvcUrKqixPBK>jr-m6!OGSx;MF$0@h&3;)tq>&>>=rU$EM)eZshU;%J#MEobP)uV34IK)q<&K#X6P zAolI&`xvxA1u$GPL?nuE1EAO|XHgYa zQ4cfs5q=vjd_=`jHdEiInyY5``e4w+a@VR^(nP^{2a7f_<;~CEI)bu2HFKlm- zV;|JcAX`VlU`-4h78}rMjM0>`cNytMOitP|`dy2E*d4T!cQ)R?wndv1@QkwWkP{-D z==4sXIMUr}8X+3}J8RvD=vojEUr4K_evP0B(NRrf(*gk-fVTI2N0l{Yy{^ja)!(j% z4RjCaDIwN6nvonXRM@Sea7x;8DL2E0#mFM&jONK=yIkoYW{1PuB{&f+p^C3ORR9V~ zr#TQ~Txk)U>`c^1vAj?7VDqHcZg<%IocJ)lh^MYFvv2+LURG;uy9MmRFSOy_<1Rp< z7^>HL#?{DG6+vl}GH8^?A*Py_{YIdMu=nGi`_?5Er>-T-xUUTniC#=nUR1tT`3{9) zeP0&aBqq>x@J*RWuOM)wjaX6S_?Nzl& z)l0s+L9|Bsn(L*ZJThcGT$5kvn0m4uj?(Xa^);RzJ33(;ZA-ZwzPQtuW>gjji1Qfr z7oyWCwiPa{6CtMfrXdw$c#I7eO!dPz&5xWL!`?VyF219D^IB7lILOq^*lGLg1@6b2U4j+*wEx4-Ic<-95AV3^iYq9TmiN6(H%K=^YX+(-#gOwM{+&46>di#4-GQ z%HA@h9Qh&!9B6{%xvhQ%o#rBPO9)znXOoJ*RWkl|r(`197`O@KeAc4h_0dAJrvZY4IIGNkvdjUPy5r9^L1>L>&rM33y0)}|K5*Tt`? zu(Lr3!DEZ6N;~s^jCzvjDhBps%ht2 zDtw8!RHnhL7D{y4byVdLCF7TL$B4Pmw~9nReiBDklH&Dk1;CAXue~FF26jMR-s|r7 z0iT#_Yk7BHWSrWa@LSuIS(^x6C#3<3LLp@Px%m?CZ_!OwHgJgj{HUog30LMO~T=@Q)(AyUV% z0WPurr+V@C%sAY5SFIuag2nuJeh52!|0O>M$80PbBY3rmc<`9%49Ycl&Ba&UMtjJ~ z(O&lL(8AN-Z1WT4yh;maFVk~bSAxZc%@=L*dRt{se=Do{&v8Sl`L|@_VRDw)INL<3 z?fpq0S%Vbik*6dTDim-{iHjb-L1yqZU4P7yf>)K?oW-h#uM8CW0P9%hnpvKjb2D2( zK;iconD1uQR(C7ww)}(H2y+Xz#98eF4==X(1fRJNu)l z!l&2xe%cExx09<>vUZyZj|d`RZwObY^$b#a(FHLHV8MWg|5+KiEuV!F1Jt?$!X|FR zBQqUxA)51ZuQvUOd=%I2qqM7(Nuje*eCWnN7mvq{LPMj9nXMIq@&O;psM!x)FD1Ti zLN}8RuMu9P(!aM3OjWbSWLBu;I>Q_XM-6r_ao6A@rBc7uj^yG|->01Od$M16;FtQE zQe^FlPi+f~O)cN_H38?PFG^Q3#;gY+#7Ccay4LMEZhCAl7P>cllDX5i@a;jiz204!qa+CD{K)x^9Y(WW%3znl zVUGPDl3ph_&>+z5INp%A+bdy3)Zgusih}SpENupbqiMhbm=z0W^zVw2?UElf${Um% z8Nn(Y%0+=>R?(CRXm2>_nf0mBWNC{9ewvK>guo4dM3183Ui$qhl1@xz@JN!~Fn1R0 zoVZhKJ(V^h>e7|N%@)ZPlTSu|r17~E;*qK~`AzneXlucBh@E~V;T@3sOGz=bb5qLh zU~w=RR|e~G`&8hXaQJ(Br6D!h>8nl}-2Rnuo7UVTiTt$UpfFAL{U5a_tf@QZ4YdrZ z{ik`RE;@>kTDG1R<3*ua<*m{NyO`mnJuhn#&doT-hLNnI|R?o3WROE+go8}I9X zS@QAZ^gk|{pA}GLGIwY>1?ri71h2|+@0ju9ROnO!O6p3m9!V1a3W! zjBR{W-sTMbSLUczso@8SJ{|HqEO;m8odP+09&=Aqhof zT=Z?iU|l1hT<}~q!wEJ3E1Ye|P>XzR-$=C$^s?4Gp;ytfs2+=89}r5#|9@)c`4;d8nTc zorSWlN(Q1I;4&L$enD&r;*9%tufUzWk!AEPirW#5acEqyp2O z7#DS6fmLFgB~gG`d`20Pj~3h~LA-wa^#fPtwuuDvLe)st7udSax;X^MM8YD(Ke36{ z@}>82Z2Ic={haprKF~vZlRt#PSnuj7>@&LE8Ff)Md|f^ev+qk5B+sYHHr!tBDDxa# z#5h?%;ZM{`lP3u$_oUjJ$IVn+V{03otS3W*pX5_|NRNrLrR1TvWQSn#3ws4R2}_5R zMYBhYG_f!T6ULu`I zh>qaO8N1XJZ}L0&vQ){rn%%v?Ag!YVa|~J8((l6NX{wA!t13u+PeheqCSIf(n&=9$ zcUy>GUV%3`k}6MHXtsdIso;tK%|#rU1+6}um=kx2hq3s@<0}jY!AeL^nL7SgBN=*e zu+hdJ6ff!wqrC7q3?pT)ulH9@>R=1-V4|Lp96{qI{1r8KoUet_j-_N9w^OgL zofsKp-_3Nb_Ejn0=IW%L&(~t8QncP+3saQQ>>zvoKMRV=&DfEu;8PtN!mWhE!#r=2 zV#4$9pSj^5ps~w=eU|k@!#qaA zE2eCM^uuTGl^9+s*hL<68D9PQMha)@C;20FUpgCcKktU-iiIZe}eKr^yEvLa@B|YLiFw6nq}Sv>8bm;e1pGv zW%n15N-Src!Q^Pspn=)^l#PD42Rz-FSAr_&+7( z(cd_utexY9tNokiHZzD-(_TuB%u2Wg{LVB7p=Jk{+dkzm$tyabwPaK16n=Y})<%X7 z^DTODkGkDAX-P41%S>|{BSnqQtsC_8E1!6~%5uO_6I65Xo~g?2(=FAw>GRF3Lbi8G zXX4Ev{ZWsp7`|=+3o``?r8Y<(K2kk3$svK|Tf{D1KIr@+fP9!%K1zqIhRz6miV5mi zXPTg!_X_v zpBxk~$r4UEI^+v~&U!`FnxO?yC@K~#F12I?_W)n6AO#6QUZ>$izCl-zBoSWcZ6Bvw zJc9Nn?(AaB$+}LYqi%=}ev*RA*PV*@T4p3Rn zBf>9$R#=vDYU?$dVi$1b;%8n7XdZ#1$z^D3C~TSPKkSeT7!EM&tFb28@S7XUX@RnS z15$%?`CSE_LEQuCpOqzrYJIu%Ox60WT7|xjE_lz>DE=TgpOD z@?Avs{}|MfYJZeY5nG=@JK|fV%Nh_%W$+IhodO~l#QEf*i0WuQ$5C!2u8BG#E(V^*h2Kf zaJ+5(?BgLD+9xw^A@8~Ahk|im9g}tw;NmPdG?gq4HGOuC@+eINE%GqyW3;y79p^+v zh8G>oaMc*{v$Xzf5cWB`@qP5Aj(KY`&El~4gHP~q;#@U;iLA(wH8dN)!s+u z?6|fma=c!W-d?m*XYP9rP#q!#+9ZDvxVs~7z+lVf7xrIr7$FEUe+5?ZE*_$Q$BA+v zHOuQTi?EHejqoN{V0eCUjv|6QfMvDVu4CjH%B4*e^bDNZ;A)5SOBw7`?9;co6ZSn9 zfVboknCO+>?AFLUdzRPjYeY<2*}S>=<+Z+g0zJPQzV0>Ysu$L-$1VZT0mvC=d%mfD zaKWx!&}UdENO=HW=n^Y%`G;o56`gj*5q+a0){$#wVyUA2#*p8=qsJ zRR)k0^h0-?dFMSLK_fTSad|iJ>-HB0uwv$!`$%si)8qobp5fMm5URlCtC+$jhbO9q z%!M8Y0iOl`ud)-?oV>2RJ43C&4eZ||j{96?E_S$h-JhL&pjOJ> zoS-ItkL5sE*SN58rDoCOjqdjQXs0#eVbZT^HOw zKuNl3@nUi^1g#zY7hganeh7ylU3zca&&8D&7*^0W?9(V^K3Kuw=oISJ-~(^xe$P*3 z!wuM(p@WUTioQmdsrSLgk$dZFL6sWTLb7jUG!eVR5X|XU`lva?(;SHw|1yUE-t%h4 zoZ!m8&0?7AnQ%@&Fl7u^BpcD&kkm=8asz3^agj7&prF}QA7p^G$m#8)O=}0ZgOtHp znCH}+>eNGm4|=0Un$42FG(o>y8u^yS{}L`sN_%>?_||sC?M+I$bX6R_<$Af+qpgO4 z$JB$i-~g}#F6};5mwF4QIJvt1wjuI^_2D2}`2M`uIr~JwRl|TpdZe~ADew_3Dx|cs z>4abp7yk`J6rf#65dqbpFo2VN8X>p8o|bi%Qklk)0jXZ7gVPZ{W0L|5lCRLTIJ@On zLNa$zGSZhpT<8ut&LL9zV09p0Yv8I&m1(%ebE}XG01(?Mz?Q|fKm;3F{Mn(JArR@F z`$qabE5J6Z6H=PCS(X{^=;WVKnjW%_#~(Hd#!wmW$*n)4Y0PAEdZp~;BYrU|M1kMQ zDYbKn7r{ZfG*8yy5GabX`i9tAu;t51RSH?Oyneam`s%MqnXW4;Ps6gCc0QDYP&L!) zouZu4J`{GpO96@ z?k_1*S1hhJbLcyDjU{J370un2ZPjyUi@(r$J>=koW~CmFqPm{Vx{>)->^i7vXlwUz zsd7BGWGS5+>HyszDbZTsmbK;;4nFVcp!a*U|3Wg^^32G}yOa80F-iVC?&Q?={(U&M zTc>GVvJpLR12qkJucNmA5hO^1CGD*MP6ohPKGJ@34_3m7i33b3p_MUI5;)v9wO) z+rc?c;^S9Na>`get;T#fI?gLOp(k-=>ayq|WVz34Cp*+H>q?H}J~w~UL74rl%)&2h z^dR~Xx1BrT=cN~RW`Tz{-GA(LdPwkv&Ynni#-ECX`!`73qmD&W31)3ib6@)XQd4vM zni*!tA4fa;R$iE2h&RsC1X5St0FJUlfTasT?vsM=RjO}vMQU{d#USKXc+&ke9{z3< z)jJ@R*e9&oZ|mSO(eF{I)NVd>YsU21@MV+4aqmd(aph(BC1lwkmV+xk|~Am2V>70pYK<;=?!m}_WCJ*JPN~WiUc9WYoZdW7bqfD~3n0K;iSAAVNv-7PUQ6GvGY$*h z`P@9~J^2faNr%=nk;q3+)ou5PMPwFhd*oj;u3?^_1pd^%)~Qs_^JGaIf) zi`D4Z+i~=x^eSMi@(wZVo1xLo6NHD*Q^Mjw`ItM+{gD-9FLKxoE;p*jo0f{sMV6QA1 z$KHwO*C0gW{hkqKjDys$3H znuB4u3h~1Y8{{OR9(+}ijeF!xekVDoclch&m!85Rq^U!zS8-%*%WRvn&aiVkX=fy) z4b=9RdRJV0lc7tCE*z(->OW?~yKsHk6 z+vy!X2$^*~)wq*nH`$rHxBxzStd#XiM=!L`1;d=;L=+RrouKUG8r@tG#dK8>v!PsJp7RR)I09@bdOB9wdz3}D}05! zL(JR%a=Y>z`xxnW&wMvy_)M7l6g*zrT+{2bbG%VQP5kFdVA=a=)bh-)sHUZ1sJvCF zrln(OMr}3@_tmSHOBrzyHF`~t=jNT_>cxDU3^0}OJ*IG%J;!?RPO$U%qzsa!@Tte{ z1iZ)U8vHJk>s`I!9cPtcs}R|&i@t_N%HVkv!K~eR@XFmApu0p-;QuHlbefO)>(^ZI z%E`t01#>N63UvFVJRl`>_C2Yv$$gD{wo2cagOJ#>Qvx>_=!?%%U-}FSmMqVhU-n*N z$Dbyv&lWnL7rZZ;cbaaVAKZ5*LM=JS0Wb5;k>p{`71iyBKg-9&%z`f%cI|iAfonfB zT1PcIE8X6zdQu1M2zWWK9IEKmgaaQ7(VwJZcp~gg#|v}ga-G%!^Xz>cMsz} z8=2l0^L8EPeh(W#q#x{;T5z&XP|gLY70g@a|7-DiTlnKQl6Jaqz{$H^>BObv4dxK> zrT5=U{af#M&vJ()XFFM72Ng+GaPOHlaZdjvqCx8SdO zd`h}OxRYaa@PdYwX<*7S9K@PcDJntT4z~6W%;!UMRh&MJ%Ig~MDrQ%liBc>%-^!HY ztv0^tQVd!_>}|JfKLWXg?IF1&S*E*{fYympk3M;ZuprobYwk;^BU;k0V1&VQ#s()1 z(pX0i8_wb&nK5If_J0eLqg0ZQt8<<3U*g`7tS+ zSn9F&o;Ompwr2kDqA;k5JHy#rDAQiUkE+f2JbjWU6RaUp^2(bR<(E(VH(dE#Sk)8nBIP8YV?q@jC|Ne&posKT`G(qDDRV7 zFT7s0P0Yc%=X%b9o2Y1p^Yoj-cCtbd5-HkRhR@?pgtOUkwCS84LSbdu)|;Y@A@Z*?Q^PfO~wzc6h{kc(ZF`!$y2<*}%`yjiS&g26$twR!zES zTJqSCmnw8yVql|h@@~HKN3mFpIO7U2O4gQ+=C1<996eG~@>BzR|u?WVOeX;ey73I9W&#q2eWnwrOnyAzr8gfFvb+kRBc_u z!X?YdcN?#5T@LK^Lhp_Vfu_2WNV{;tA}`5PX&B1#G5ut$&eb`Z^yBW)HIOpB*`rV0 zbh7C4*k$e;4|LY6bd3~NB;J>VFS|elo%b4&;U@S3hsW<(p>Hs)7-&E*Yfx)i>xMNu z9$RU!{7L>=b82hpeDnRDqtP17#NoR-l>@4CHHl81`P71>uQw|J(r*d0t=9pW>mO+WZ+)%c+>jv=>_WY#4dAAKp9iN0bOD8Q4}gY8uZ2|MRL-<7GYRy=m- zn0*c?H8eG}b#+ZmZGt7m*0HG_)N`XH1C@O56D^88ZkF7dTn@N&KrKs5%2;bO@Ut#= zfBS_7%GurGDG)lZ7CL)JGaK!b?=HI>qg(HJ4STDwfuF z&k6;e@=LY!3@Aobm<(E^<99|}wkfcJ&AN)O;glb)0qUtWTF`5$7-CaX)A>tQi5wY0 zU1yw@MW++N$6cjImPT%_Tf^s4zpjJo_C8&l<#kv+h>+JcD7ctOmezMm6L6T+T*)4& zQ;A?f+;eSR*YK>7!wuf_U|N$!@i;j=x^8;BHigio8SXl6?(!MluctOS9Nqi7808a6 zRLmH8NWi?R_(OL*O|&(98%f}bvHrQtS2H4b25rzxaum0+D51d>SL{mG{W%|E zJCK5UoW?r|ocDZwJl5>!IzDE)aMFimb5$K+#G<+~f|HCaJ;HmFDU(#%T-F#3Jhnb9 zcU*D-I(!r|FTj27!&?9%(l*dHv-FTze+O!}b9lv-J3Nfl^7~4U&&dWFTUpcA(xvBy zGMk*%>-V*4_J0;Z|48rNC&nboUTpo@PGo#!CfrSL!c+Ee&gA8{Lq*m`e)7aO)i%nsTZcaSycLq4uc zCPaguqXiisi4k9p5eB+|%x+tNoh_=z2A{2f2nYBr8p#FD8>{-2zTyHHI(NyMx0tky z*rmi0)zJ*fglJ;fLQ&0}$+1@ISiFbMu+7)6fT_08Iu=w~M|No*;!;@jX_Wf|tVD10 zhh(FSmrYDxz~d3&UP7;EkydRi{=|2gd>zr^$!hXliVkz0S<=HG0H?6%0P-|sjB6wc z7XbbzWT67^egFauRNPcTZ2&1xh8*Lhf18qZL2*G1q|GIK8(^$UTp$B~DX-&s)Qq4htg;iy+sf(ZWf{daJ7}W{(C>gtNj;xb;X+>XTtWS0zLQB# zpXl3ux50!c0rW}VjMb`p(daoA@qEYZ1juzJ71%cL`d%P9m@4KZ;p0YlM{zw`xG8_K zL^(PIrlkxX@PM;oKkN{|G0F^|>7CP>if3QaJp@sb$K#F`7uU{gri_QZ@ex%v862^k zo+^*;N-$J?KWmXaiu-#R)ZYd9reEPF4|7@9mdix)FvU)%RVOg~B%_;9pU&7+@94^4 zZgQ@cTsWdS{|;r$T)VVb0=##^Dd+h)Z$wvHiEA4|X*FD9sYx+CRfhd7>|J$D7v~Ml zJHFW{H>oH$$tX8Exy6a=xC!WwCT=P`3W}#Rfl>Nq)hp8r4IQ$~Ds7W@8|~;G8Sya~ z@42sW0l0bt{CWdSc6J@-4w7#AG_^Py)@Q`K(?q=~620yl;P zQEp2<(^|oiCz#2!ENI{Sod6qh`5UA42V0f^s-1wp%W?}@&gMw z4TP%)$_1$Bmnexoe!#&w<0r~uAzy|`;&||yhkD^DGmAA6A+F?~{!E*6jRBt!`1VrJG-IL2i8k1gUe8=_9KOR z{)J1o2I)SrH_RqJcOQqNjTzoa?efu!DG4If2wfOn@`%WWIh141*CLAY0(@6-~fW7fTI$#it>3Y zENh8(t@$M zKHzh1A?mo@Vy>;JdEGo6l%4zdd*^m=L*Q|@Ti|-Su(A@IhcpUw>y~VL8ndE!jXiF; z?U_=AG8-;#JosG1)e*>(hO&>s7p3MsBQ zWsG}ouQ)uxkiEB3#g9HK35|@uwC3()gHFq&%++pW3N@A z`*z|p9;)$CubCz+A(w3|0NdXk0i5ZtsigOS0>6GvZhj&-EEX%+^Ep;n-tBun#V@JA ziJ;7Ngo5jP{zhH!lCk-%>C zPUzo-yxnp{af)PyP@m>dYujpjlI1jS&u9Ow4X`^fDvpe)W6n-DVu2U)x3=oFdnQMo zw2it8FrAcd%!L~Z+>IpuJ7*Y}m7i&>EsWlJ{qHKz)5eP~_e{$zr`Vl$3!Nf*QG@46XQbPs zjmt%|ClkQ)*Uf!lv|VbG_&Qv7(89pP=(v4|m*al#pt#}_Az3HWIZGX$$e$2Yb@0p6 zC>zs_$oy!4FZZQur`bXOeof@7?AjeM@PG8Uoe1@~9F*eqJfwNmF1RNQFG3r9(45u0 z!+|P%&7vfDfdy8KWEkB&I(8U;y7_C(HQz+Z8aNAuy5F9K^7`BWZ-(91#~nAeOnNOp zNN%%ud=u)g)RWf#rqx&Noc}FE{WsTMLs3?Ik3KE8+)^!g>E7OkVobP-^frf*to{id zcQ|=#t~^8*v+;HVv$_g=e!79meu(-Z;0LB#_Ua(2&|q`un8W3qG9oy<-+>p}vG9M9 zqyVK$P{yW(=o(IelY{=^u^_#$Cf&NT0)jas(H8~^AO_?(45)=Q%E!@-p*{Sc&$E-p zT;Z8-{`Y8&;Zu%8>cvyAXDDc1tZFDm84add(-Y^Q4zl@+cvkp|8GE40W)W*AAZ?RRQgBbQ=@s`k$}MlJ+* z?$NJ=&n+1m(u8ZYF!~ZL>w%w#*n*u>7BA044J&E&gK=c=dUd{1ITd4x&|}FNis5tN z=!}pUmTjhPfu{7VrnD?%b!=p)e^q#ku4qMg^5oE_sz1&iOgvtR=9ba3a%IX*N;1~T zcmY?2gl+ebH(4=vR*G?-+6!VjO*h2TWB10GSC)v?JlZ&Cju4&5YNr%0>kJc33G=B` z-G%+C69)g(6TNKq*G%Bi0R@;z|3xfn-*;)!t5;6e$lMl<1kQ6F^Lt5pjEc?Q-5@w| zCv*=wXu?%(K5)OJ77~U_nH0Wph9B zk*(6 zC**D25vHuPfmDT3ic3(C6Uk>8E=Bx~JZs}pRyGCIG6Cyx^uPud_2qRvI#oJf zgc^3&T-x6~(tJ1L)QJ+89f5C<8S^IIZ%y;&5O&gN)vUjq8deP#Bq$4y5-F)jk`WM6 zJgUp;lfgFwqy9zBoTNllO(IvsuW0lnCeLx1f_Fm#BPDx9!}bKI53X=mmPrYafvlNR zn2o)FGlrb{Cw#j&OdBe=C#)ssi79A(3H=wa^tQN5DtL-d<{*z_7t8rQ7GiNQB>5fk zCz(jcui;&z0vU?%h!XLUGns5Y0(h~?Fjnb?^BUjf{nte|Vrj*Cy+t{2=&- zBNw0KSf71kfir(Tg>aUvCWF1SDz2E+E0jyy*EXOeb&)|=@h^QOK+b^?uE`7%sBv5 zxc}1iW{#cUH#><(NbaqZ@EDNiHNOnYAw|y|rCNCj%v}ez%BDvH_^HeWW_FFCClA2v zxAYh;d>8n5Y4}77OiK=WWDwX9*Uh3Ex01jUkH~5w6)pb)|F}nY5qT4 zy$3X#j~h1Jt))d#sz$12Yqh9RMD41gs-<>qYVQ^DYwf*?+C|aUNNp(+wKug1f=Fy3 zu|mZ6_`lyd?{~g)#EElqk|%i{x$pbBuOVV$@mp4U_zz+EC!^f%9^-lG6`+1tV=Kq` zj0(3dqqZF6gXYHnUQuTsUiaQuTbJE2YCxJ}OO>=fum?!{fR!z=Wa1TUntW4kq6EFtwE zkL-Xf393lU*A}{l!%x-Z;e^xs)E)K`w!S63b{rKO9^`g+?VM*l$4TCZosJ<-;-9@X zhbxLLK!3^r)_z-3_69lYi7X|n+x&mvaLV_MeEGJrxOzf4&F1fP2P-X zqM?yVfjHV?805CL)yL>y2*?@FFJd52qWv=6oX*|Q_K>e}zEWe+-+ z?c3`UlEjdP2Or}cUn#q!IlmRPdMlXn&|uuGnD!Q&%llzyI?Id3Kc6C8XN@B~Zx4hq z|5bTrQ44yfLR2xT9Y}td_S#pTN_6k~%Dtt4=`jny9Q3`DR~6iHM*SYTvZT4H?PaPuQ;t+y+JJNzWCs-#Zgn3 z+(c_+F`Yn^fYo50hJ}hnTQ*LEF_~h=1JBoc#&qX88oZ6Su2D5GOP!2(_9KrkT~OD^ z=>L2X1#5-(^7>3gxy|-g{SMVCOpC`drZTA3*EGH#dxXiHWymagWBXDqM_xeK>9&Vb zw^4@qm#8}*%OT|uP5U$g|Mf|wGL)%fkdp)K=Sl6XF~d(I8i2)aC(h@bQQ6)|5;?E#g}fwI74_HJ^d3qRu1>|}4Fw7Od7eCb`Y?G0dhuNDe zA^ioNFalG$#|BQ=47zp8Wft*QnpJ!<$I9C|Rjp8$p;j^O$7xH1LJPJpea#04KN*wH z4qRmiogS(C;gpAdH^Vz75fpDT$nI4+EaNekBK-o@Mc+L6w)6HRrcV=CZK4`w&oh(Z zURVYxm-z)?La+0!Tctae?p@4CkZUV}E|1Ec#MuFB(Z*P{LXTXhx_c19Xx_q@e8~-^ zyp=rYr}A=PqjF}2okE3{QPA;)(v8w{#)XOBiE{-aFqQIKr&yfYqr$Xtu(KSsxw%>J zx~!ty<8WGhHgH?Wb53SN0$V*&j7RsZ^bal?auR=ppbJN%nRQl^k z)aKt0EdU!(m)qJqD6A-qH@*yH5fl{n`1$}L^v`l;G;Py~GN zGvR!kz6fAGG$sg0(j0{|c-eDutuZq5cB5<~(4-{u{Pi~71_y?hD3B%2yT+;6spXN5 zn5O-SEFS;fR>CDZutz-5s=5<#THrI%P~jKl(s8C3)B~Fe*{)qom*2s(-TB1{;2KVN zCjfGPI^TTYVtD2a#0IvGJOIvc_Ma6djC+4)`7NO3hz#k!ifyh?E}UKfnpF+XAcF3_ z0Y2AUXi8tYh$rUYR)KAI?=dwU*egB`#RhascWK)LCjf}1)%>UrnrmCCF%~(6LSa%} zk*$rB6+oatF68)zQI2G~h?%9t-QY>@xc{5%h&TkcAmXA{uv+!x473sErY~iWFfc&EJJO;!WH8LslN8Tm5*NBJSlUWOid@@x*;!3grpme7Dh)?Sj_ zukNs%t?TUOk#q8}eR*eM^{(@|e!>4EIJVTNI(tYI*+-TB7cE%!qAmKBKuJy8zQM0& zRUS<*%HEYPHHf(013Y^zJ`d6~4VUtyM`dzct-#;g=#TEEer1AscG2U5Q7>7jw)aC3 z-<`IZZoGuOSC#~eG4OMz$G$FPguy=rTQ<2u>7TuLU^tyIbx;)8q7Rnks_qThj1H?p z-+W0kR%PNX_OnhQXYiA8d3m$I{Y;knAUHib=p9jOUiFKz=l=)@_+Kv7+#SZ>XTOZmO}sXph~7ON(43G_WaR&mK*u|I_R+_dG!hs@ZVNL+H| zbMuWzw(V3})qG7F^&d&p*YtlDz8zSvpJlhwdKj9+%iiaj7ZMroFcmobji=(5u)1lm zsSli0)5zVXOjBx1J8t1A>(5-kvC4q^P5B*I`Er#|*s|V>qMs0*Z1JJ7a&PasH!}}0 zD#on5iq0=wY?P42FArG4X|+GmhqXNk$o@83c5m$^!~6}J<6J%|5)hVR{S}DG0!%O3 zgNX6FdsWUt&2=_x`1r^`rN;mdXhhNSg|Bkcq)@0cd)XrDVqLfBCydb|@1u;m&^^iLOP-*}~A|AUkY6b%g z?y6bAE(3~_I>(krR#w8mz(GhOYU3zC_;Qp$pIYief7b z|C4zYCDqlQWi>Jv>LkiLr`dDxrpin$QBr!kIf0KD>Yoz6{d-or^CRYpscWjg?>O1i z0&HS|s8p#Qw~$yBU)_HNEi!3OjP2Sx@LAh(VhrUP@IftCUXwkW(C%^jbu9;O1NsH_ z>b~V;f-qmb%wep9a4oTbr4rR@KPaxqkiO~6gAxxE8ow)51Eq`Q z*+*GBYPxRdW;1j={Ofil%lHR{z9>%BDPPwHS!aB)Q|pPp?(Lcg`dX}ub3Yz6NtIY* z>&PjqMx1hAiWBxq{_Nq_`W(#-hX4ovO!*@AO_9 z_RctliKW5vH5*1c&F!ztprY){yzMzQ7|Ls+(rg@s>Tej#NMv%AXFb{WOYYWxi~oJ9 z;=EPiarR-#cgEhaWxf$5R8t+zRHYR>M$M0>L**?uM*Qc83P+zJ$Kc3JmWSn$3hIpk~|v@=^hv^&EF+r@Pd zO&a~<=KhLYmB}Ue?d_`jZ~jy#<%p7L4JyodIXiKUuWvtnkPE?SFsJ>w8GbqVkPX>4 zf#d6=5hU9|4;6~U6}n&)0*rvC4A>pbOd@-MD9DxZNptMi-T$D z5)^1?st@M|sK7@TMNHxCX8>Vyh&%zKFb@S24b5cEsDV;%aS9;UWQ5L+W8R7PeDkpg zb%)#I<@pmlHX{K%U>Ce7URF^-P*xx-A0dWlM8QKWNb=QS@(@{ivcepLCZnJ+A}wug zdJKFPfsR>HXulL)uw}4A?m3W85J1FWfW8I+a3)&RH$8`)mby)Vwg??) ziX}-{KVst#a5ldHgxN1DTjk1;GYL?1*AWVO=1Od>7Tpmnk@5w4tZ*t0K7hpEM0bciHmJydjX|#>?{%jPN|%Jr%oe13rjK*rhvLR9IpOUS#oGGZrP3 z8z4GT9SvS+(0SRIFkLkeH3xFCwP!uEn<*lAGib!*5b~4kox+LE@2As9qLe#F#MuUP z*PMtI4GLpHo-)9)&m@s2wJ?TIuCu@96o=&ZWqB}@rb{i&bhCYjrwfPfd+oQ)g0Sx> zbkIZO0x8{W0R;<+0sh6CGhNHqPAYveHAm}>*Pxb$6DHwCytRQjogPfQg zF3jBRZSq=C^bg@wM?R6v)7$So;U%{_vStO5;JI0wC!`SmkEWA04*p3XawTYa*_7Ww zf(>$7ivAGj+1RwQMi=y-XM$Xd=vgbwZKJpye&iDTd;lN;K##sg>c-gW&DjF`N8i|hD2 zBDKp>`u0MvgjZU6C2xwNkpBD5j}}ehk4EohN`xCLCo9Gd#*9?$H-Gcw0+f;kz0}G1 zT7q2L9RMG8&vpN2V!~1|MeI)a-524N?;T=0s+>McV=s`r zXSsxP9NpzJZ#)4^oB$Kc($|6n?W&R|Ir^usW3u$hi$G~X{fWPkC0;j|ZyQq;9n_Yw zajBQo9hWnX-26y--HV{&w;99g6kqLq552}w`PSKs4Im{rh}3@+DGhUT7V(Y5v02JE zm6@InvrPWevq@C&*z}{dkZrvMA&2YK4D)2W4x8BjGt4W6FI5!Pj^$Slx4340MRuAt zSeaM~@?I%m^HW+9saww6SWq=%wUWt9x!X5T#GJ!z`mB@zGkr^L@d-g`eY`HnRK^S@ z$~HRP-d>wF%)r70_QInwk)z$Z z?TcK`KcjBrB;#~*ex#%RR9L0Sz^kmU5lit9hj+!F^;zBT^uK^ffY8frS&*xAp| zLkiy+nghi(!K$^07l`Q$rJ-R`<-#Yu0?eJF_-3^oW@B0Lu~R6vWT!r6*946N%c|g) zlHJ|vG8=Px+2CV(b$#t>1cYUy&$qJ9D|x&qrA&ykaBiL9>aBtws^T9RuiY}4d|&y6 zs5^c6f~sp^mWAsOQ-l6tZD-#|=&oC+B!2&mqT#$Xt<@pZsXQrQoyofqB(K zK`!s=LwV?OPfGs`$-8&e9>VQT4~+WQCmmki?pl@LMbA7iHs?pr^WmLS$}5ta2-It= z?poQo@|po^h-%_WkErPbWRnu2N+}pi-O+h1;IWF0OmAXoT4*hg=uC1|@lAaSwR@_| z4WnrvF!t1jIG*`oT|D&RfCSw2_4kKs6U?L!@Auugu>ZdPb?usLUold7)VcmH@`bWm zW@6{yvQi{v5uoox_#xlfX?ePw}Zuh_#40ey27_ma&?PX82#fZ z=%gvdN6)_KF5czwJnDItuaD-`Oav3fITRetvTq zUB{#%R^tuhCcpKooPkSEa>=bJ7qT1HuAGa@?9kGhuB8TpRCHkSee_Noo==PMfOD!Z z=Wu>d*%cb;D@T6p3Pqvdq~ffpMpw`roHikN`^m)QgrSkq(n;{nNyBzGmqccWI#2N` z3KT4h_dAhoz~`PcP^R|T!5&}J&HXcmf)70XdNH3OI2TUQgkUp2+|}T->OAb2W61@r z7ccr;tEWtt=L7NBG?Yum%dz=@$#ODz=u8et`Dec3i98d?ql|IOQKlHPWr){&(Vi@T zwx!e2^&4aLi#~GW%BMy+z~Lq>^9QG+kIT_OR{Ze;hulTSgz%3HKdfLI<%P-aJ>AB3H;LuSE>0`QAR5??p{Zd9Q6AW6gE{?9PMe5x_$6o8 zKsMhwZ>f{R&8|MVDrsfAH>40wi<1uT*c2Y`K&QK02TRK6=Yx5MhiZ z*U~X4D{Yi31$FPX}bCMvP@1bfY z$V*5HubCgo|G1D7eDT&e0EwE&c_tZ{`Dcg*t;J-^2d2Gv`rY(P7kO5$elD1eu4(Hc z`1oIf+rhqPP2WMf&f|{M%8vXtDmZ2k#Y)#@BK?23qtC;h798x{u4Fh z(8qV%RC2Yn#(8)ia1><+?|Zu-H)sLQJ@PCAt)AaNTGnbhImP4tsVfZeE07xHPCH5- zdc`N`$gaAfgAOa3npDh~AiHa#9wY)a*j(Py`~Mo=LQj7fj{W-L4ULO^J70f6he;## zO;mE(Q~e7W0{i6!eaSThTO-p(;sD+;#;1OOvO(*%k;6X?wKw0&R!dnAjV*(aROT%J zyS{Cc^q`YN_oG#dgH4oj;~Ya+hG(R%t|x3Q(F0Q5|`6usIjSUZLd8mKH(%w_*Jhr9ljByRvf417zEr2 zXS=L-(CUL5r2Nr0t0iQCA8%O`b<`bHqqUy1EKQgTi8`AxI=?^gRqdpk)avhvyXgPM zcRb+fi{@XD=(784B|N87J&yM4Z?I?jqj}-KgyS~!8690}!1uS~!k$}}T$+0neX91_ z=%~)eTTs*7YRh=b_ho%oepLOY)aQE-W4WH1ejZJ@WK_GCQ{xC?#7{2UScw_Pc*|Z|s72ofA{8{#f@dfmR zF5xV$M9q=f$L$rh_JAo(6&xMRVyjy)NaLm7F+UD3ej#S~b(Cc?Z|!k@H*x*gWLva% zPb*l`HOrvlUxwsbmfS#73azCY8+T}DyD^~3WO0`!lv2vo{&=GgD@bm2B+MWq! zjG#g2{eBMzvcqJ#!WC&n$YQ{y3z5t zO*1IdEWKzOd?3VWi6>YbY$p#9T7&QD#;6slHcl6fZ_;0}kg;e8P5w4hVg2@ntV2n5 zDbL83mDiqg~94eu)>grsH@X!FKi&pxqF*v4+=;!sN-#rLq zGSrWw5+tYOwIcRj$(S*%3Z?kOSw$=6Ia%fG&B|~Ymq3!m?Ovc0bu1H*yK3H>x9rZm zYIAas&wc*U*QSf=nZQ5KPlZZ^$wf5LS4pOOj3YFad}h>TCmX!Ki{XX%1MKE~7yF;+ z9hR_bQ(az)yA}OFs{LEBfCn{oj}HOUQ?kRe?MT}Fw$s7k&fuWj^6_}!bFKDYqs9;A zIn^_RHjR3}=b!RyX4?)xXt<1jPmFt*t5;9_E6c=tG?q_COBmPw9&l_Q4P`7bl(E!GEP>W^meP+HL)|H+g2o=Ud(ksMgr&S?w(O=ZcztoEPn zv|DwJ{k1Dm6O+D z8ad)#b+(LWcq~(#tqYI~sctys-;jbtWs_T%I(c1tHW!({(5Z{QeZuio;MXso3>I&1Y-+YO(pjHmYqFk{;~(yjYyvT{61{lYSGnO{#k3}!vu);0Q0A;8b(q`pm( zCg-XWv_!QgOexj+XuNw?zp(>x`Q$bAwKg!SO_(6p)|GzsR_LDOadrR&s7jK3f$2qf z_G!pLhMhkpY(*pHN|+eU)dx4KlWb}-wQ7JedMDT!z}^2}f0e$l3CkAVa>;cO4Vc@KwY8@bUKRkzng2fzWAK42aNJbtD+5Zk<`m?x_wYhJ2TGM;a^Py$v}= zwmRhzsHQr#SS>QlFYwi~SYBNEK;L@_`)WTmw)$e#iXO{{ zF(MMV_XvEI?5nRb-^s zEH3l2MhgDh#SORLN_*duA~0eilmY}eJQZFwoh>6&kyuB(8o<^KlK1Bs(*MJhTR6y* zYy~_j2SwO7)*7U28^GUu9U6H)s&8EGWK*h0kW$~@GZky^p07>pV)ai>VSD4(B=cco z_F3EhMb+fdRmqnLtfTjrW7>@mE+KiC<`Uq)A6RKRe#;5K5@tL`xdgQO7sTqSG}mXE zikHoC@0kC}?dAl2wiVbeY#b0%`yIEq5i!9~AFVNG;eA9y(!<90;i{et<_0EyQubThzabF1 zxggIgaf!RQA7hGXqY0&nqUAS>6x*?tdoa^jzNWZ$%WMqgf99qud}`*TtV`uriiO2^ zUR9kszc(blo2a2y6*my-0wW$aUfL7j0>!s`4ByTiuvJuGQhF;^%V8>-rFkjc*%A!s z4)z~AzhBUZ;8!i8qU=~w!{@X8{hbFDF*dVQ-*2ta0y7>j=!=RMe}()b781U-?|lu0@`#f$K*&xZ9#Ip7tmN2-(X$^U z?$STaT5^7%*)#GbmAKMy)VbkgVrUVBWneq6!6XJY!Sw0JS73OmnrEh5yst(la2#2A zjn3fIS^MbSua*)@{5PgMudR`Y?V^Ym1mHrLGU|I@{lCh)#<12A)A`7UvAI$afl#b$ zHoXnwtz35j;Fa7P_NF!pbAziD8+7bJ;{snT_(#wZ#yaFSWbY>_4Yki_)vj ze6g4Ak}`GgPgMS_jlW7QUg0%&zh=2+V5Ddr;y-Iry01+^Y4sua1Z`e8SY6x{Bny16 zRX3ra>{28eQ3r$773}T{{6HoF?2d^AUY(#DzhPAZx!0Wnq{#?WeO~;SHxJk91g`oG zWwnhqk3gp-KNbgz^)(*r*NmbeaIbjMo?!J4=UO9naKKm4@jnpYLz8|TR$ftA`Dngo8;S~=4VcuRbe!#q`Yrn^w8fY|>!2Azw4C3F zLvlmn=8*6bPG~eg=Gb+RzT>ZWt_3g((+dQFlbNOcaa^2Ja{Gy?gLqg>l z`H7hy#XkUrs%fI-%ID_&g7Tg9q&k#ylS+_3xXUtRYCXla_>fNLA#Q~QU>;I}54O>5 zB;tx@j8Wcy5?cPJwUbB7{0cpGpi}lCF!AQfkl6*{N?GJeLa-DSE&GRIHo^!|H2+oX zOkr1o81nIuCIHbh>c}bfIY!xhXBh^L9kY#spKhZ_fX2DC!!!M5%%rhPV_1DNMiCHx z&1t9aerTUT}{9)3{pBxmw>z3Ap-&#BP6 z%Q)$IFl)#O>}w+5hM@2bajs|Eu6F*1A^-t`5Y`v^h$qIgqO6Rtm!50uFv);E2}1X| zp5a_Q5B6A<6qf&RPXbTnlDWl)+|xvMmniHym<1o$0H^Zm|4wHhP6n}a#NxM3qq9pW zh5d#j6qD}w#b+&ub`=0gGp?8%d=NjdNH|s?9k~WWR;K)qS#tvj4><$(ZfNHP<_Kvy zNIip~e1q6nALc=qh_TnWqnRGu89(OZC~3#s)l&TNfJ z-l|%Zv(MJNDtnjp+MepK2wKqcL8FV+X8p@>@`3Kl#UYR>rH8Oi zh|`{buKJVb$zqw(pnQU^*H!qCN8QQB%Q5g_t0!dB3WUjz;I#C%N#zGYFNKMzY-xZA zNeRE}s?@$M^V$Xn=VrOUqd+I1Gp2J~j7URMgA#T@?Ay*$wj)-(WO+1SFcWO$tP>NT&_a~0~ip?Lb-dq%@$S5*v>uwUXHr zSJ~RYAYvt-iFXosa(81!J1ckGNq>UbM*?r~JjSJnor6k{$eg zbHJ~f9~IrE%Dt$jk59zAc!IdF&oJGZ*#tW+}>U^);S`{#%pPqg;U81znsaM(%glRs!;V+vu4a?QvFzZlb@BYmqCLE%O}T3xvxo9g?7A=!%@%HZhaJ_rhZt)val)TWGL6)Y-jBRQ;$S|Kz}>Tir{Vn$fKo0W>0lIYvBCQkom#(^D$O8&5_ z?nY>j%$rY@A8vz-4gK!u8ruq5D^HK(md@J%fzS_6mZ=bdi|tK%6R>B_?PW8MQAUnl zF1SRK5Le3wC!ML)18v`BgoCzMfZ<(ux0aQ~s9 z90%j-=Pxq5EiBA9DEbYOH!&Y1!JN)ZYj5_AT9x~qgt+QAuHF8d#dlsRzhH!2kBm@0 zHa2cAyuGD8+2G4EoqEP+uAbYQ+_3e{!Z9fI?*a2&-+zAuVmDSVnJ)8cY#Ytk8g}{( zm(*8w9?aaS(}w}A!Tq={CWn_vHdu8Qf6{-0qhBmw>aJECLqvNC;|ok}T>h?EmJ$Vb z&;DjL=DZb>G}_!13s3H1=z2Qv1{lsg@s|$?WX~bbZL+^)o#fQI z>%Z+f8K1T%F38+251ma_&+)Lqg>aOsa>lw7|e5hEJp5hZ*;HzSg2o^ z@E3ndOUo|T(%W%ogvV+aRE0ovW_a59VQbU<0lZe)pTJ|Bg@SA!f>a-JeN32hi)}tR zAarJo%8}X`CB7v7nqZtBkDOtY%3GMH+O{~%oijmrWuQsrI&R1P8!B;;D3`{#YP&%~ zJEP9drsq(q!=EFMD5D|b*Q^bXo#Bhx^X|!jxZ?0Vyg^CO$&+x90vW9j;zpCukizBX<*r>Kc9?Kzfcq`d7$|M+{E z4&2g)_miFEkndLqAKxBqa=!*L+(9}HiEsw2pc>p3FQtpZc4jtUmE-6Fsm-Jm;sE+U zt6x-jr$aP2iAPJ?t(eL@#7*^(w)&-6vi-&;63m)2zFntxq6W~*31)X(*e5X91l%+pj^Y$f}M z*^E*-3v7tpIl1H2!ZMR4rDy#BtQ;}FPY*p1J#`Q{pG0qcCAA)z@zU7 zp;Kr9CjVjkUAJ+zf-jaX!SO(6jmdy_IY8aY^VcXfDaw-7U*lN8bTM3 zw)1KxUYQB#s|PPL`aA&QgoZs#s53!^6%V467@02itxcx?2s+l(AUcU}AHW}dHO|HWa1fyR3?s4t zwthPBCdVj1{u%Ke{eES)3$$|HvdrOwSorbMJu9G~SRqXrpVKFZlM`fCpJ4h?za2Ql z-^K^vj{=7dlk}mloquHYG%ZRiYFjcv+$tk83cEJ7*`;)xO8olng_b>jvqGSqJubJf z+4IH?=edrRFnY1H7nQxzDe(jK4_ICmIf1ct(-Qt)c-AEf>V_?!I>~WO!Qs7*M$^vC zzX-;Cu&P(RMh!SZR9HhF<}Kk7s@GXP;=WJhJI#@_EvpxT&XFa_ciD9g()+vKWv1*W zJ9E7ed@%J$)H}au6G$J?XLX!+vL=Y@^Bok5_c+>_uCEoUI+TiI3X~i>Q3V%j*Nh1! z1cqdZ7;!!IN+02>rjH8B*H8%cDBcPYiC%-wtB$WE87yVj5^|cBxzo^m<|XoB3j+ZA zuhL|Y(J`sK7Yx{#YM7VxRO`O{7O+v}d%WjY*sVOkFZ6TbKe!<8LBGZ zyP*haY2)EFb=J;{Mxc9wTr6pOEYr6q$N$i$47}M5dfG69@3ATpG3y@sb|;Ow;lRpj zaUwGA%^EnVBE`p0$g_DRa0vmwqfs{JqcR-J)9K@|#kRnz)IuZIS|A&s=bV`h880!$1oL~>kX+0J)#Q=c+6dedgKG9` zYgQgsi{k6l*QsB_Tg5*ceu$iz<&WxW$K3W$TRgFRx8YylmM$}X+rzioDF7vsxwZfF z*f^^gTw%QWOhXVY^QZeEA=XRo0Viz~mGaVJ;)D2I!p+o`P{32;bJP7^&rAok$DD-$ z@?Nf40t44Ep_Yy*PTr|b&T$aO7>H*I#5rz{>>mw4;{#gJ1Hy#z0guM1`GTqK{QAJv zzZcZ3k~AV9&A7w2Vs!!f0gC@oU-rtp?KPu9LlZhDVy~6N^We$|L>BkeEtnHI$H$f+ zFj5xlY;IhN%-NrE&y%60~g(ns-{nVopSX-md16! zTP9Y5`-G#{7n#p0@ypXV$+nbhMLpm4Ztt$H0COegIU`lH^naDG9&WljSLyxy%C93i zKAR_1S4Aq{`1cDdl_UZ8Cb>X8WOi+~hQtK>J1b^vbUxCZH1!r*vTcLJ{y>`6noZ3FPe6#HvI9zB}&j*!2GqVEdimJiIYGaR7 zk+)D<%Tj+|H^oFAGLg2D02u5eb9M&$wJqWHZdP`LNk;Z@(wjjW=;Hz(Jf*qm%y@nX z_(rs^%LKexX-$128G-DD@_KaVr;rmvK!?DXcXWkCq`UDC4D$K@_ij%g{G94oq^M6ERP$yXjJR|TB`d+=w>FTVI2wIQ5bZQheQZnt8@*<2#V&<|Ed%u*x) zF9V1YPUtpQwp^jI0KUB9w-m)M?TL%!suR4l(Ot>igkj^v#W%XH00^@6*{9RJh@dKI zyFlm0WYi67|G|+FhAx+e+(ozUPp4E3BwUt1p!1W4>^)1C#`f^%Svxz&=~s8iA{H%P z@2m^LJSeUHOBSzo_*Ax{*j$%C)hj&rtu=GDkS%lWLOawEZgw1*9T_V)y^$H@-Z zIs~S#{kN(RLsb(5S+bV>zxbC_+Rw> zUYaOe22T95`Q2P!w=Vg5PmHjXJJ8?+gm4;WSJ(cj)*`p?YrFwOC=R|TmAGq@9PoJV zu6Q?cCuY`tg(Fn4Wm;;m%Eu;0LVLGn2-nG{%e{n4k-8nmb#e$=*hy-e^&{SJX~yu> z&-=5*skL{`@UaY;l`;EW^iLC4Q0M|wi?5KHdSB^D8r z`x+fvzm;bF&?gJ>a(jaj4O@dKd*2y}EG(TVJYI#57gNYg(nRjKFb77IVEI)*L67HtRpy-Z{5ccA@iQPi-S2J|^7Tzg+4b;? zF8{zdbhsl-`d~Wu=OusXhx)IOBwwBJcpd*m-#dhv<5ZT(mR^ISPp&50)JdPjJWCw4 zWHa`x!L|mD$_$xP<-K}8TH5F!P2GQ@p4K<=6wYoIzb}$;*G_l0S3N0#7}j7S5btBY zu#TZdB^6T>Q;PM%lYczj!dxweecZAdsb14#u9+3lgJCg=KQaU=QbqOi-URE$&wTGa zs9$>*rR@qb*7Dfse7zZ~#b)QW`8?g)O zSdY;Jy`~$ zxz|DnT99ch?G|rTkn9cjIAI#*CB;`s*dvSQRuvkpF8a6_TQ3FAF?_6$;IYjzm1Av32$csOuOKfl+o)E#DrL2C@!&&@qI9_uG1LCpU!Sufmhb?^Y3eT&@C6@_T z3^jS}EuRRUzGk{=XAbTtsxHYP>BpykUQ2${`vVB)nHnemh^or|mbg3rO8lN-yyW5W zy-W?h@5tmkKO}QXQ>*Ko`|7M3gSEUj-c>x*Y4raBeHq#p<5$kygBA2j;LP{jylzJS z`*cKb&s@Q|LJX_V$oSt}8uc?2<4R>(^`K1PY`Gr%x8h{q&-Jx+4{R9UEs2a>L-0+S z&QJRy7k`!*($R>Wj5>N;&y*+~<0EGLND)(cLSLgywvC*iALx@)FajmsO<;4GLf7eT%HN3Wpvh$m+JUjCzbY_na`h%+fPZz(WBHoSUruH zE8{>@vQ@`X@Ad%_xe*?5QQ8yx&aBa^*MyAw3P}He+OjNqx{vIh4+&)LvZ7^|e!f7p zY^Ys2zGMI;DeUM_78S7MUKzFB>tO{yjgF3L8lC44a;c66@u%A0olkU+@7~;zqbpw= zBZ?CKnV;%FmJPr!Gw;DTu4x7`!}qsS$VX_h`?>bpPnwzVNL$+TSV-YyF%P4u1C3hz z@IF~f@$T=#7S7-u2GO2}Bp)JH3dEi`?!XU!A4TJD@3Y(&YLZPJYPbxJKN0rw~xDi9UxcD1^N=Zf|nBrmqEuD!F&01 zyJ17}s>a?I8b}ja{&*>5gu<~hdI%3$@;!2dVqy7TmekLHhfhM6V8p{<93C)7Jw-K9 zW;Sdx0ZAm9q8q$a5^OSm0^tfv;aNnVEx`!Y3j3b1;oJmB0C`vz-5lly=YT>nHtN+*dWG^rnYwgft*0Td+A2$tNy zzunePGssB_2hHSV^qH|u7NA;S?}F^1p=KW>8W zTZgJN81OVa+h?J$%oDZnTsM_#CICMr*d#{uY#P~X2PS10ao!yv2B8UN6tej#=)IX) zF<=Erqg6e<%!u6A2tIZ_y_r5KG717hSF`KZcTCYIbL4iNQ)v*T5rp%FuJ}&>sWRo$`K9H9z7HUbM-;I4mjb%>rwE_{{r{xAX&U8c-2@iU<0FF9t7< z>T|@KfM1F`1e-?9sTz7Pq*!roKMeov@ktnx+9iraQ?Asv#EGDz3ZA)QKh4W+=) z-Ho6$NY~Jv0}L>9DBU2sJs0>ypxMKJ#*Lbf2%B7Quhs;-P`SVM?M2vNauSjhu`$0SPu3?%-UDH7wINp{lH{z*kUh>&d@)wZfeBbphP|qPKM>e`l!xIH4FWY-z1}IE5;%)(liEG)& zDhKMUGd-31`g_$aBTYp+#MPCIjIv6R(>XI{ZFei@tY%K0Yv2Cc;AzuDgc7O%sqb&N zK4;^lBBvg?jP>H+trT?3*2o`a_-&>q`E7)h4H)1(jW(q(i3H8QbxzoVwolWg$l-qw zAq=rTGebvOa{jzJRb8mN>DM{a;jOjN@AL9mF>JPCRnE<{ixMS+cDNv7K~%$iXc$sQ z=$#hj771Tx>l&HwUbDRmi`4&;s_1;9OL6~|mo%ep%|LDOdQ`wfGtU)d_fQtBNz>=e z?)t%~G{dWm2_soQXG!0u`^>VherF6YwjPWjaRedUo>Gp8#0!1O5A&>u z(ELRoCD!xt>z+E24wB9UF`|P&7!R-C&CM$a3dEw7By;0^ppxp!kDzq3_&^DyOg*`$ z?Y(}QdUa&}!AI~zp+Y4Gsh}37I`1F;MozSz&Stt*h$*zWLxqO|paG|oF`QOR{%$Er zC?Oos|Kvp4Gw1`VOwJJWH~vA=O2veAqD+}W+J*O1kF9*S#x^)bjO*smUhT@wryX?# z!-b$ezsN`VIHCyp7+`z=MvqbN2;$iLp)K67vVIO z_!6OtTWU{fK0r8IFH?xkEIN2-_L%niJ;63{XUPfeDN^6L@H;WFwJSpxHxHI8v^^>B zyP}aT8KYV(H9;fIZ09`j#N$SBlV8*N_9OLW?KKtQ&Gcl)xSj`_h~Byhd6rKjVy6)r zFXL!EPw`*kqe(4(G5IlVWS`NzFYxO8ZAQy?GCT9TdydRG{pE^mQHSi9bnELT9FCym zMct3Ad>UZ$>%vOeeHIIdI1rZ2gl)iid@j^A@mhtaj*n@?)dr6Z-*c5+uAZ|{U)Y80 z>%varC6&f-k#{qu2*|JL3gP4-;g2TkK=6EYYz*iwGf!Y#!}9JZ>L*}Ho484AVYh9Z zQj<4*v`2+lazzxyN;(oJ2CMbGIWm3=$RKho3~k!Epv=rHVXv@ytBI&g{U_%+cp9&Z z+Jpvhnc}AR8YbnWe#sHHl&tNa-(yc85G_&(WW{o&no*XO-}24Th5gsLY*K%2ydX%V z$6R`#sodA|J{+ywEDQm*<#*!$%>N~ZP8RXkQb2+Vp&)$8a4E}omv}#O-@->x3#p%F zYIdB{@lQkH*(CRqgx)7)4((KEI|D4L;cg#Y~#+jGl>R z0B0KHlky7G>!Dv49?&X~j8yQAn*`!Wh zwH`o>EGJgQM#1B5A1MVB$jI^g8?;Lg1V6qW!27pN*c`rZ)P@Pg2?uS9 z)^whfdd821Uz@nAzkG7EK0-0}tw; zrT*XZY#GPIux53cuSuqhl6Gvqd=}ldb1JPyKZh;FX5xE8OvY*Q-pwzm#CC2O%M_R$ z0A03jsR}J8U=#35(97}ju+8+&F|(N<^us&)Fp2e08#g z^D?Aq#lhuaXg|X+U1mRI(C%Xxy{h+BiYyGv9}w}|h7 z)Q-&#xIYGgyZz1bhWc>t^OJzwwxhP_l{?RT9jR(;tn4HU%n9)uDoQ;8uNbt6^Mwv4 z!2zdEnwtER0P?$FGUweXh8&+O@~~3^V{1A(e-h_klc0aQoYGvsC}6+v>vLk+rD)tg zL4sqxQr1A0@0Ofz=EHwOA9?)^oFh^B6wbqb!3&i6RT`sh;`dTJxML68hI*F!@kd_ls)X`-jaJZd7kG>oPs*{@4Avq{}lgyb-n6^@3rElr!d3m z<>fNb;dTBt@JHOq_;tspzxP3ZtpJMi7CIRXRvhgKAS|I}N?$iQZ{bZ&=(zztdTxm-t}5Ot?B~W0xssn<)48S+3tjy?c8L zD!Lbkcl2a-fL_B7_yQbA(5BXFE(>^!jD`>haXQ*4XLCa@GVPMGp^L!8(*R-=m5NVf z5Lst3GM`x@x0s(16(=?+TJeCj-tf-1rWyWoX|JWB;QAV*-3xY?m1M9i+-dqc23wxZoZ-8u*uzjDc*H5fQc2V|>9B@r z$TjI>G|x!I%J7+C^!o{YzPDj~bx{v>0ae8XF5wQ#J-)#NgMrrUPgd>@ybP$Ag6;-b zYUa)c2qPedbPGi_IKf6Mnkf?mR;YfL3$fGZQw{*$Ht9_P(=+oF>kO0NR2<=waF2j+cgXoU|9SuQHs{eS&R}#1-#GB@ z2Jmlvb#?OYs**Q6aUUW@)gs&`np3A!-?J-&fK(1_mvV<`UROq*J?+LhW$Er)A|8t% z`}rxgJ}8{3o)qcn$iLK|A`&W}KbC%u`2>HWS?v-F#Ih7=Hu2R;{L*@B&I0dV{!{;v z7>};}>nXsSpQCilynC>$)rDLY&g?xN~f?bcgK-2n~DSY>FDE}p<}VPR!sz5yYjK4;(4&8&^MQ_-A9 z4wCEH+aA*0L>jkz9gdOL8Q@rHemd>K;In|1{&R~p_BWG|q?m!;LeQ=^yNjt9H0Kl6 zEQWg9cBIEB7daO#W9cKTe4DWl43O;BOUTH2*rX_WiU9`k&3Z^n)hA*S;y-)^p5Nk2 zXQ3iLqJjZ{jDqfKTW<3i@ugBiBsScZJGU=65T^MV=C305S63s+MmP_NEDWVM+xy{8Ao8uK(OB$F6%iQ>2ALHN2@pmf} z4!u)QI7#*yn5PNl989?LfAU1<1@fv>mdP3#=tr)H8=B(8hgCx#%kIjxpE`XWV5s4T=@0bwr8nv^=^Wlj zeJ9#~H_JKkVK^f`p4c2_GSd4|2Paw_4fgSU_`dm)0Hy*989AdR+v85G-iI?C(JUK2 zOzzM`XZD;FlI#tZILXk@VfN!g3dqe3B7%&@Ze?^dnCw8Wobu9sGPgZ%c48vt>3(F) z`z_fWVq)pQiabjWocN^Z7?wz#su-i~H*8R7Vp#_yGmqq3W`lyFqV26Qxeq56`BNR? z9_lyMpVPC9Xas*-9#~`XZYL+~C=im+zJASAsNVO*WoKhreGK)o=28w|3w5S$kxd&B z*zvWD4{2j5Zm^iHE+&Y_-^kw1I1FfT7kwpc4m>oHQZ3Np$zI<`GrzA4{_mUM?`02z z?ZD3n-VrB)aPC&-cj%aVD-sXc|yxd@$g+= zH~#^z0Q9xHfzI%jP~mD3e`*&hfQ)SB7is7uHgx@Pdc5Iq>>H2&_aa>Qe2<*2;*|xd zuyBv};4W_|fZ#>HrdkjG+l!AlZtdWM;L-&C{s1J>Jn(b@!o7sQ6X1KNWshrPqfYOP zF5m^h_)o28eE=4o#^F%)z@wqU3V?JO?V=3Z1e~mhbT)V&=jqWKoKe$p~=B(@mAipAwMm^GL6|bHG@0Y7Q zNz!rM@h}YBfRLLjXhN7MrB&bImWpLJx)UbVoW)VG+26fnldt?uL^svU=!uD)`6V+x zGp#T}u8p)tTGo4xPN*V6)zGpjz+PM+n__r#|F96gRm!j)d$$dN>Ft{`sa*dq+TW$n zu#41YdSI=A6sU$U;_lQY@F$;C|3fN5gmnR&;Gr{ju~$#KUV?Bd}#) zOv<>`f|T$pcJF1ClaX(lqDzzgxX@IKbp?D&3yQn7$-U_4i33Z|&#BQDZH=C*R^459 zqDYidCe`b;f1^lVebJYwg{M*kR;1oyN&RwI($Qw9b#`oxkKTAxAXxKPHv=nk&amYQ z!qqgd)dGR(+!%9PtmEwq>wtP?_7z8~ndVO9g*T<&@Od78!c!L7J6s8}=DKXtW>mf>wz~o-!cJ z?&U3BrZ%Dti5__Y=?MCv?6!Fvkc=z<=iBQ+o9)g~6 zZgv~Omt=94ofi%IOBx^3?7ra1T*U@x@2<@>bU-cHPpcAI*}^d{MDLB;tXG0weVZaQ zDP(cbH4(gtZjpA~CA^tqG%0p%x1u|+fGp9gXDM0sDUWL#59Mgz1n*7CY_s7TQ9%P18gEeU5)-k`0eoK)~emH zAoRrRxPPq!yJqp(R(?T*^RbEcd(!Is#pb&1z0h-ecy)X!K$4HaY1-Kq4!kqAzZTRt z@cFdroYMa8`!E6D8#1|8kSzxX$v8j8Hl=rdZ$H31-qviRGf_z?IZ$?QHw0h*R$Xv0 zI2w`KiF$KTUlHhh_UKX^<~j7`snKCx@-RmsTewIR>xLL*F|k4zKx}$4bqV@Y{8+Hc zw?V$5p@bt60``OVbLJz$-ITA_HJ`^C#f*Gm$NGGv0gEV9;(KEfS&(|K~2Ueq_^x$EY zp1kc;O%LJRytI^R2`?eFmO94n0p@NwZvM6kOKHPf`4TNx4pLaoS)?`}QiTsTY9ygh zfjUP3U~yd>C!YR}2#3s62WGFT&5H6vhcZph0ra7#Yju zq@=2O`J{){5;rsh6=c{u7$&Gd=Ezin=h8eS*6`C5hFq_?k?t#*0wPyU&@65+Rhjc% zfSw%@0o(b1UQ55-0C3q(H+$c3MjlNjpF@1OU25h+6S!@9Y;K?t z>}uVKaJ^55`?5@$^2EVW7%3@Rz9u}YMY)W3?>0e#<^!3E1VP3B58B&Q!l*zXb7Y~_ zF0(2-0gq_T#2|y#Haks!tFvp?gwd<>{p}Ks+h4Rulni>!M$X;w_Q0R+-1U+qL6_6@ zzQi&IbZXKavYU-px90v6`2K>qw=<=`H;?@jnZ*AV-EV3}_4T2NpK!c-zcoyf<9+YK zY1|p}g8ZtvcI27IMQ5uVBxA8Z{SCj+nsP`%R)$-G$Xqaxb zP8?mtXoV~8_pIJ;fN{1kgEvZ{&>PIIVP`^d(}EV_R^EV+}#$$C9D+)C_j)~=Z0nfezJ zrNWWTyi{@!8u_3@IEK9N8V-pUAxbYxvJ8m;M?y9rivXy3*Pw2Ewe9s-WS#la8X>a3 zqcB;bEJ8c05fSjSapKFE@11h$8gJ?je>6%O`-Mh?lG%QBE0<%E(%EW%a3ha4;g32o zOqOj~VHH0h3x>39>-QxiyRFKK5;-?dwDkJnbDH7SD95S$|&dCm0uj1VGsi6ax<3}d80t#Gh;vpo)<70jbO;0x!!Z-za^C|Dq z?L88Kc|C=VmvH{W7U3^zzDy>+66nqA=spCvM~RY+q47RmEy$dUMJGROj<-xF_ zabMc4`HUD6D7&pr*7sjK%e8yoX+UlzHvu40WJztm@qH-6*rIV*83&(%#^9vPvKDVK zrqWAcZRS?=oeYtN2+bd%Jm8dxfk;nv$^Fphhv0{Akq|aLnw;cC0^_`sWG>3UiInR(@Pr9+`QX*|Np`T(&=rR zj&~EhT%*{Tb_dG5f_{r2A08h;YRV$#BW$hK!*ic^?QmZ&{&kgwt9{My3IA;vbnN8( zcj?H=+^&$`HnSo$d_b`Mc*TF(%by6|!dTOOj|KQ`*bP!&{C*60IFYN5A@$Br%Hr@C)B{Z-(X1Vb@L5KheeS8`IxtM;+HR zXeTIGGWq7wqR?yVe!}_}=BGL(5^_?;gy_(pr%!Y9$Wu29IEw;4zt^PiDQeK_S z|HNTk6H|lD6&_>P3d12GWF~v`XUXH{T$b z=wlztHVBali;hR>nh|z~wJUiYl`=CnKhVT|_L#lx`r-qpLTmFiN);BcMsDm_8E+rI zcB}iT_($g`XoR5du?)K_NrAvG_tW-|_I{Mf@`lleC6_kQ4sdHZrW@O*$_=SQpr#nIW$Qcgnuq~=x zV6(uXCZI@ew9H7|OYDN@6TA~?r&tWK|J)EF8G#xt9AWK};LR0} zNU$vGpt-S*QPoN=#lWNKH8lzAB|r`VVcfbunTsTfPvpOhQhgLSE5nsC9M{{vxAuL5gRD|<%|+Bu0^Rj4U?m+IfiMcKMQ`t8%b*=a?AT; zE!|qGzERRFW^0wzO`GXEL;@7nYdv-Xy9bMaETc>^0wRjPb>|IFZ6?kMt8+|3-|O-l z1vSp;EgE%n1DSlH6oj9Fq|jB>%B4QRqa?urHv9fG1rKGy7==&G+B-_Ej9bG4Eh>R# zw=PQ;tj%-6WJD<}ULFp|Y?3-3%YlT0+Zirnym|!t_~3dBP}&0yRL*)w+pv$94eVb} z_#23N3p}fojhuE2K5YH6m31&tCx%#~U*G6@hNsBfCEPgvIU&S;n^sIcO2sTVcx`cL z2lF=`R6p^z3(CcBvN1h?)hzx)Wryqg1LD||NR}f1R2akqOuPC{5Fm2f8eSg z-NmZ4f_byH!69l7hH6zGq$eopj)-Sk@LXry6d6okHEErvxH#>$DeSCYl)Mo zdax1>9@Ce;e?v}Wu+q$)Kx6AU6O#{sPUwpo#5Dv?rN{z1$Bo3b+FMPxn_3jvF)~!SX`QU<^w0Pn zR%B|YbjW;bPpQiM06T}X;$?^R8zmjB`tZT*vv^jixSOXcTOJ|lsT$#o(@lyFOs|Of zT2&A~zH7Qo=s$}S2(#E|Q0}6$sk|^|&MbLNIjm2kPgo7uiXOXw1?Hkt_ASdlDdbj4 zh&!AfzKR72yJ`5d71O6WsrQ8-W#4kdRTfJG*V(s}&8KMo?ytD1*v;H`GvBRr1KB>^ zfEZ;gv`bGZm;1pVCEaO7{Hy!=|LAna$cb1UTs9gpXkbeViRdCdl~JyX2q$dg*OsW+Uj}pr3Vw?g2kEohCYiZb#=__Vo`rO) z6iUX*9TlG38)%@M9X$5Q#aRX}(rzscl2#+CAC#5fz}Q>Oxvm6XLAEK+p^+${ckU+hAWZ zg)$YZm+?(I>FNPt>BO2Mrm?nMymG@S)eEP%m(>^Ka9rC71wr&;==jCxdTLbJrA?g9 z?vYV-ik0v%2*4N)Flew{eV{0hJ7f}>JGFmPcL;=o$V896GGLtspK~+h$nM_&#Z*-L zc*OsDE&pS<1TNWSFOcWLVoEb~VEetfSApv0RnNBZI3uE)F=y7GVX)^ffH6Y z<#OF7C;SWmh}j%)h}^Auf@^YvvP-)zv=wILV9S~PW^ny>O z{cEZ4TCdYHVgn6`d&4^LV$vBtKg9YhH?stRDq47g*#_ogRWM4elx9ZPTZPxp6Et}kkY9khh#z( zTq;NJ8D44@;;DIoD4^4hJK%@SeS3HYC;c>SWpl6?y5`6$6d=!TCPKZfO2stMTOhcy z%-2M=DMQI4`E1mQ{}hIs{3;$loY+Qw(qY6~RVzw}1@1o5MdVP4Fg90UZJMt3RKD^e zY{WWbN&Nbjt^Vbsmwq(n6P~Tzadg|HY3drvGm*d7H~7ka;Jl`RRq{ksLZ#{z=WR>>QRa@68#*MpRSN$IOTKD@g~?==3Mf5h8QK zR4bZ)MyVObWGJO=W1Wv)<7n)&ak7(S8BT4s(y}SXK;Wkkkd#QGPnOg`L9Ff%U;pS`5#biruxLd4fN*<0eh{}v#S7Dj-a}Z$9~IVqfjIY>^2Ft zU7SYWLo>^k*mLn;p7HG|_fNGb`oUHdpyeuEU3Cs9ODR87>lx7)jRF}hu)7>VMUFTe8?`Et#+8tHZW z-z2G)?G;xHQv&)tQuRa@Ri#o&CWn@>vPY)N zX3gTXMbIi5@AA|%F1SlUXKWfg8cCMvfid#d0rFg$hz$!gmj5jpKzL?6o(3}-46$6 zH%s9*UEq90|0`oEB3bDyq0WHE=!#9cy$-0LT`^A!qK>fv6GWy!ZO-EmdC3Ga`cI$R z8xCqvvYTAAdji(uO%ZSA_Bt!{90QM2!f}#8K0T^WCopqAOaw2#SAZ1f`#?vJn1Fy$ zb5J&A8@;?kovR%Cg(#xJxTU;jE`ij9>B$C`p@;=sArReG#&h`I(?iHcRmq#ew%~A+ zp{F_ww%k5@QTlCkf?r9LxI(?m=sVuF^(}RB*m%n4Z5RRark_-<2Hn7(fAit-8&!3zc1xlyzs*8KB)8#KjXyq#+%G=4QgUk*A&EG$FnUT#zU!lJPEF*U zE@AySE0%Zca;b#wZKErI4JQTt2T+^<6vbp4WDnt)|q};Tq+JRveV|3MAGq5025HlZ}Deh6f0r(CNA)>LwObPQV(5f_)cNQ{s!>N z{>Pm7--}(I{ER2Bfa4mioz?c3QXyW~H6z@=aQR#e7R>=i_cdsM#}psu-E~y4e)*TmU0W|!$I@=r5^ZDd%Wc+* zN_tb)3&tV)&~)jpICL2uQe>*;Yyx!Kjqvr>)-XX9CLyNmP9)ZkW{DCnm*_do zx9k32@HE&g-61_U~!gQMjqxmmvF*q-nT(T&S0Ie}+?F-L3Qw zMvD!hwa;8_nhOC_W@KOa3%%j~Y}XtMdf=FZH7^M)>RFV4SUmE-XHfO%+ZnPMwLN-V zDe861A9W!*rqPLDc6ydl+~V=rVQ9t1T%UKPLPZT^8z4u3){mNp1c=bX5fQU3ESZQ3 zr0&SN8LIhXBM-O2$r~2{0Xze1KcIV@nfALY*$+FZhT(_KkDop?A4H0f%Pjk)-(v*d z7WEV<4$K((L~Z*=_nEh0W~I+?R_%P4XuhyFA+O&*y__o0B_S9c`{^UTc-7bd2idMI z=+t&f6nVJ6s38wI#{8x`lHaNK4b?grNc8;&wRVMI z+=@zKMYchb)xnL{qp<^b zo|B2rKw1~8>sP?Eyu#AE-z%522|av+E|-wRi1{fnm!2lcs_s`o6Y|@8KP9XH5-IQw zcMN~mVk5M6qZJx~@+^(s5#CrVGUVVR(Dc;4@D>XQbKz!=+cMxxtpMD=E;s7;239UQ{?I>kwwvopID)k6Cx9y-^(5 z5Al3whftZsU>i~L8ZKw)8V#l%$b08DB}4)($e4V)FEi!RdQPLnPEMy_s1)npw1rmzp)5toLmD0QSX52aqJXtgwkc3p zw5Wa~nPntIuy0yj$F+V0Q%>N$wiQGPkbGe*Y@ID@;K<8ux~VB@CU zB!&&x>t)qN1o}o4j%0NW@o7KwtZ3hSAE+AEDR}CcNp^Mo477X0#b|?!(nhU!UsJj@ zRn;p@>!8S52&&~cH_JW#8nxlGWOk4p_U`dVgSCG}E^X#Tfg^b~V;FL4 zE$}<{8*1wT_nghmu!U*7V7Px=-it|KBm}W1@}OW=i)=fUVwZiQ;}21jY0`7vRF2Ah zXQ2H!R;;bB;OY!3l=JJfHU8>Cv4QcE+1LnAFN|%9xe3n4( z_ONH2UFHx=`fHD2n=I7^DI)tp=GMh8+8!GEJC^qsoa1GzMreODT{{=?{7jqI#+`V_ zyh)E;(`oldcZa9hk@FdKlR4q@1kotElpQA_2`hG6!Ajv-yg(=;;~nB$Nnv#{uBF=Z zc(Zfb^UCPukFklQ*a3^e7muE*!QJUd)vl|qXJPb{Ns@`P_>*0{2zwohK z{?Jr9yUM;#^OF+BEeFlL1711Q)@`O5AwO)ZO(PWwc-?`__p?#)-T6VstGk=-gKQ}C*da31Uz`iw zgzlIx$xS^dZYzWrU1~J&_C+G&J-a{4!3ot~rk3FnlaXPMb1H8BNG#Jy6kv=SY6MRN z7?gche0sP;+0e!J+V&qT;=jcNdG+(OGV1Wx;|IQAa9Dz4C|0eb2m2ZTenJYat*nJiD! zV2?sG(}n!8#$99vQ8QQ+Hng_W$8XY2Tw9MS-AYaC+davMq&`@-9yTC(GZ8hlPOru* zGXqQah7d=`wpiXoR)v-zid<6aeIW6DDIqO$Ibj$acMX$8J;^`&KVG>4LDZT3(v@^) zjI{IyI%IG;OiKNIZBJIIni4{|NBwygGILH*fyMlg_rsyZ>GrP3nFdYOmI)J1m2&I6 z?XQ{(AP{Ose&x9dtz!ZS0iO&E+o6=Ju}Tm8ipb{zeErUM8$DXMJh+y8J=BE7F7S08 za)wm!`~D}MlA5_~nsbroY`HJ>vJ@lzchGXc50x{YXOmthdG zkp@Ym9H+>(amJXfH6JxR^Y~C@&L98>&ou)hh}LugXnj#_td9|dbUwn`1-dt8xN!f_SI;&7uXm#(ntcEJ z5>4N}H^PzZRsXS!_P*4uTCoqy|Bn84zi&;#>D>s8IaSjxEaDik<$M!I`Z)t6cXs|df!>|=jf zse5It}KEROPutbul+%V#fyyQuMTbLORMcC**%IxteqLlB-CrgR7%Ubq3PGEvh}Z<_J6!K0 zPX>dS0<>pqa*nx!EF!ORgp1tx<4vdCGRJ$MmdJMs$mZ_HR6A9Hh$K& zPFUubKUkLOtd#pH#6J!HLcR0#XJOv^fGr-oG%z;>-q5+S**9CFIFcBJQaU}BrvgJd zjY(x=u81;zqK{Y>?LTxJjECD36v(!!{ru}poPIWo{ji6*Z8zVnXj;_iKgZFa9BSX@ zOnwYfbjTwF+xekWY9Q-bcTNPc`=L1!!Y1ci_$Ig63{G}VtS|LB>S zMw^E#5Q<5rNOlUz;I?jB3!yThz7+U!XAT@908G}?c(Lyf@+sH~NQJv_B zLTyZ^J1H{f23)_I9ZpK=34Hw(U#=W&n_=4JL9c^Nq$Y;~<`Yfn3y8`O|L@Owj2qCW z8HlUYAULobE2%R}n(L#4@89|s=S2nAL6Os`fR+P#YZ=tPkAxRwasAItN10ynWDh~nx{)b zuNsmR>65DDm+5z=%q~8B#a(2J>8C7GP3&;T_oUm>n%yGyvR>hxor{!ldaHhM{TxAK zZ=Z)(u70|H#J){JF5Ot4>q2k)h!)ZQTtoQMcx(K*bwd7}S!RE`KA|bDqscBUXu=gy z$Cs+8AR*x3bSH`7Tr3L1RsqO9wfrklHFIkHtR(UJUy4=R63Yd3aMeuI_wyU!R zVk8z$Wu5JcJR@2~3%8(|)~v`-tP zZPMF*3I*0n9nXvq`!LdfnaWx{BtT+l7&1ej>ItQG;zd@Cg}gM!-MPtW-fld~f}?fV ztkHoj0=XV&$%bAn#TF}XmWU-I7_UMJzO>@r%j-wAFYEPD2iCVAbY=%N)H@GiTYP&5 z;50ocH#Y$Eac>Ce=S}Wl5r1jA6-MREXXW}ithiDHQ;uHxtMzd$p$zw5ce<6pQ$dIP zSN4~fQ#fZ&qC$$3L?R)2swxQ%bC&_=6dU8qde&<)cQnj#zrF^B7`H)1kr3}#%Pkm6 zAdmM|nJ#t>=oHaW7K~NH!(@!B_(yxLF3c7gR4u;_TT)tZ_oS+H_?VIgCZZcy&zCxy zr*~0Kq|f6o{Q2?J`MnXAT^&6T`1eUPMOewM{^QpYy}uih@1#Js&?>fK#R6RxIY8>R zo-R7EXk-cnIGB72y%fe|i3L-#W6#_0soxg{g|hAM44%#CPj7D;FrFu~eh$DnFk;+l z=$e(Sw#83IEmTr_<*pFTqNHG{Oq)Ms&&~!m!ChUfO(Qwk^97jE5RPc2;nUXFYV}%w zS@TDwM64D+nSHY(U0}w@e5}DsSU0D|N7Q^YlWr;THUkY{nHp_nyhJi+h&V++h|(7I zv)X|E)qy#^O3PmWwX*Boo62ye{9wzuP1(QlkemPE;dEXByHVDi(W!m=w@U@RZY0iE z&nr*ewz(?b*Y}zwkfnrLGV8*IiO{@NSgeMA@Z>`ZE=4`WNa_1mYLSxXqLJBFHQ;lE zM{TKXo7VO^bzk|so|eIl!F&b8E;8H3s46wemG?T$VRx=Zc{H`0H9EjVf4{Sv0NIH= z;zhV~V=X{v1URC3#sF}9)ceFU%KdMXWQn7o$OEL~&B)oCUBd-8hVKUiNRwY1cb&~- z>;^Am?wg+_$ozQeS|&VS)E1PVnpOm^i>FM~i^$5Bg*&jtT*l5Z;*~RTRsx#s0>{Gf z7eXFx=ZXNP<@8EU$u1J&4qe(P0v!=|f>PKKHX5be zB|lWa&Cfk?B5kPc-=`ev5IrSuii@~2cZoC^#AM?fzQ$0d(ga^%E+r69M-VPM4TeNh zJD*WI;=J=UKkMxu5jfj0Dvc#6eubt^Y!L~X9$9-|(g7cBF|Q^_%a(f0m6~4n>)C$y z!f?FI%w9X~1U+LRnSR0CzX zO*8Iq_a)WTF?Zo9gp!cI5`$C+LZqiVSnMynVP2P8x?QXyb|9Tr01>hnasyC!o)i`v zG0TKVimyE~@0z|w18WOdh0HrGiy2EzYtl3?-mcouJAU>?t?yiS>Fxx40ZU=M`@RCj zId+x!ANm_>dXF^udb)_KWPjzL&78NkX8LV)@RX3R;arc_WLV;y|B3_S&1qwOx?i3r z6tS2E4UOCn>Cvd0x`g84unTQ0(Fw4*uinj2lWSvX{_y(V{6hO-`v(o;Sy3QG(jYal z*F2$gPvG?cV}GT=d%!SOr0~RA{?p^vGBdW6*o_4Hv#x>Z5OKZnVm!siiv6KGLv%^| z)e_^uJp)uqhL8H@`YC|WnU@!SG2t?avg_Y%`3@b^h?tIx1W}u3d*si1IOI3PPrbE) z2S7gYtUnD*xYn4=WaufPs+^$IjJu~>JU8C>V#PdZer`GeoFNm{&KwCTPG*;k>=ls` z4q7lg^taC;y1Y1$BSL$eK&R!j+16TKWeW3T;>TlH8MST1&$W-(x<(13YZmvP5cPb|L*!Fi0SVOB6ArH&Qy7E6_vtnEu?;8<<_8!9OSIN18;x5y z455aQYj~)NX+&0HnFmHZ=ZL%=n#Ka-TReex{UUQphPX<;5NX z??cRbs1C~bsByxyK)N^z7K1!3W64&K`nlo%L)Je=*Y$_*zHpi*ZP=i(ZCj1KV%xUO z290goPFAeOw%LY_Z9Vh1_kWLPpL0g$t7MEMW6dvaT=(_S#GfzGxep?LLG&!ly0y)e zTdz?_rM0ZgKBCK;+DmK>7)4G z;V4&cJVmYz>H|CZ(wVp@G!j*ghRXJDkoLgS769H)thwnlXelx?RJ+%$BvwD{G>~9q zSEPz7?^QI^v%e{>PllAK#*r3@7)lW+H}@sUn#YJ$M!M7aFl`5ssOSCkuX}R*3-A;n{ih}pdl(3YtUXu&cLX!9N7#mjR$M*+Z z#n832*QrA=`s%1=JYyiWq{g~sK??_QhjiO+xX~fdYWyFq8Vg#UiK|$MCW?Xt&kgvG zQ3Y|;W}-33oGE-NRGmb<@FINMobV8EJU8%Jt-AyTW}q=OQu%R#scvV#9S`5qt!7Kq z#1d+0>H_f~rX;K}z=yy_uIM692D}uXm^Qa8m_cDuPUj?*kY?C3{5)pbz*c@vvtRTa zt(ZvI5qq0I(pldP7Nx&?R!K`c9jox(A=!unFXMLvewNTFP#bD&GVU8XMqg56m|fT5 zgz^xoT;Ctkz9?EfLZ&ok(De#R1~=N+RfnDI3e!2j*T%sDl~h%!gy>mY97Boq-&0?F zX_r@?mtyqJa9%d1gR2JV0K(t(%iudk(}Uy-Z=@o{eC7sqM^Of0zuQ2K_WgG^()q0e zxI@h{rlDcMrtJEcS=E9&G?w(#`Ykv*MO+#fzGl00<6Rt4Tgxzg`z)`g(uHw5X`Qty zzLa6=b#qS5?#_w8$)Nv<(rZx)%7i+Mw-~!4X0%xGZl&g3t{49QJ5wDU*qKe=)$BVV zK@oW<3FOqrfBJ{n#oLax;*%K*L&R}S*T3xx6rfrBZ^6~ylQ2L+&}VJ)OIy6&5#l-3(K_jQAaB`)D^BX=k9?Q}guOYi4^NrJp(=*wa@Xpc5uwWg= zNbzy}p1zTt@^_C|nc*-CG-aXut9Rgc(~^Tz{=}21@8-nj?S??fs~GY5XIBQ%m?C>V z_La0?FUlj`lS2H(%3~w?pOHGxzn#MkmU&iDK_xl~a$w!Q$+@N;Fw7G4BQW41WF4-g zBCVyHhEle@D?Adpdv`Y10Z?LpyE>r!gK4)iej37GGHh~5RXiVn- zELUa)4z?gK0X-U<)JXR5E5Ys=v!gv7#=IS2rW+>eqDJ0<*{5(vbh_ZYf#$_EtsRWw z3Cxf9ZEf@h~ zV_){oEltVkjMWQSMUXS%2#nA#hSI8r?5Tse@J%>DPi)2txRsvPpO9kM>unn&$`-K- z)^1I8JF~8AKUVlA_zKSYh*>{cJ(E(Jv|uDcG%B8R!H z)O?MCI4dV*J^5?%kTJYt~a6|7vYI=v%hb#;K!6{I)RyNn}*77|0Y;nC1Q#j9QZQS`q))(c=fhNY& zWBx?=erE~(1=Jif?_6~RnRanhI)?;xpWDEB;tLFKv=fR(n@_Kv9laSCqu~C=TJ$6w z89Y?cOlBn;r3EQ(1Yk)K3zjxnc!AEuQ26T*)9w%afuhfiX}wz}IfU1^b2^#h&Q=!( zdf#mDfBsL-9sPgj@B*iR!-ON-!NwM=$t2poH=1W)`_aoeJACHgnNd8*MnD}_Hn1}e zn`)b?3(X@?Ub}_cYaeT}i2Hxn0cyD^!q?_+Ld#s~@T5(t6W4g0N2tEQ55uW=q6W>i zL#24isYZxOa34;E^UiU;6i8+hSyh96>>4ewkQBVKL@>2^k|=T#Di7liQyLrqIG=qz zyD+Vpod$N)0x`{Q`OMb#lJ0vA&22!-Socj+DgJkNz2sG)VA4)#Qu7)0zQa6ort+~K zXuI_m9bQn`&pJB_>`@N$*GqUYl)C*i{aNj(<4k!JQaqe`T3oqAI1Js9l$K>rt1tOU z_Wr`;&KjCUpMr6{28(17Rg}Z7rc25?aai)n8`qR#aW8YKj~k?%G$KxhpU|s? zvR<#u@ObUprzYu~4=ru9e;_5!BTb!PBk@7IT{vqyw<#dM5+kiXZr650_C2+=nV_V$ zP|jq}Iw9TRPjf#zgSRsmr+iUim9U@mv+2DZcTKqT7aM(aOF5P(SZ$^4?6PNGf&sEO zW+_I7U3P1ciTq$0pq0&v8E~u5AvfTK*?}b_nc?IZ;+kt$HPvMRr)hccd7{+Gw+bf7 zi207I9y>y;nizLY;@hqSO8@dU@|N?A8<>1nla~5G;R54M`U2mu^F?RvPznV;oAn?E)@eaXK zUvWoT&ok*Q;`j>zO{;O$wr({Bi^kEs%7>6o-e@+%B~sWZ@gRNRud4K42^7NxB8Ms~ zW|Kb~1##f)C+MF^19)~2v*@r4v8Ef}dvFvBK!Gmq{)9+&8X z1*$lJl)#+6p=zR-CR?hEOQ>%pWN54zW5UBK;6Q#j*UV_>YST+mR~J@IWaQo%2}y>g zjJ@uRm&jC0F3D;+q$ya^NLW6|rA|a~T1luM%amJ?Zez=%lHnJN7sa@kwd=}O>o9&+X#h@usVv|4cZWzvz9P;IB3e|DxdY)D9#LDxm1d4RmkRCk_QP6e z>U+5~W9jg(pNf$&j{@y;>{%E!Vo~o~GIb|@o_*!rmZX#{n7?Kls5(^7$38VmtD84? z|JN`O&{E{7DJV5Il_@Q<0y+`3bpxEs2FiSu3z}(KmK0353!^_hanbsJ6a@vl5Jmcq z@ix)cmi%bS+F0J6{{4RnZD;?VO|QtbbNgC35a@X^m$&ug-Yrr{EYBKB`$HU8Bq3)& zG%=O2@KOxTXH5AKvA#iwx3vO3f=9VfS9{|+|;tAU@a z+Re)#2#8w5f$oy>RQj!T#Jtt~=CX!+?+~~_5jkbA*b$xPh!+s%9CaYuYJ#~D&%+Y} z>Vk90NAQ-1f!I@3t=+VK*g9>ZP-YuB8@L^+!P&dd9@5Wt8RYSQ37qFS)oO)Espx-_ z*OVljw~$r%`pH^TDd#qDPlE5Rzp`smjbAL~m(l&P>68bZdj+=Yg0UCJSQTrWoP}$S z?=V>USXszK;{h}D+gd4wUg!1*g?_!`QQ0-fjS8z6i>Vk$p2OIeUQb=I z_#4;T=+>EuN&Qr>4;pk@YUfweqBA|@9na$OLJF!TXrICBxWd4RF3~w@Ri!@(p)(V* zZdm+pGgFE6Af;<8JjWxKuoqxV0(MS?=q$HrP{evz1+NihV2mnH24K~rd5n=-umJ_F z9beqO)h10Wj(-evK#Tk_P+k!Ym@UA*_b%y_>uFt2JhPSy<3j^{5#u9IwF{QC?!9s( zI_CFh>UV<`gXqSwZkwsEv)H6obUK7nutTb8ak-wXN-4oLsnr`bu@deb8*_KQ-ip+f z%0w+#@DDm0@Fzgdx_D)!rjFg+(c)=p0>d`dWp$Wl)FNv~6Q@ zJEP6C(GF`mEe*K-)i?Xat55re&$db!N&;iWSK4R||0=2~wYSSN&2+T5fWTwQYQ7<7 zapM%4Vyg9u1bMQhVh~U3dlSj)jCm`+K@$(r7M?8M=gJUT_7ykRYo$Pmg_u3=W7?l) zk~46yfZ2ar3HJPfS7y}P61pbtosyeCvv_NcAWujcJF^umx^~ONg^RDvTvif=_AkDv z75*NnPHqz1@t+}Z&7yMa@=;=Jr-XQa4DA1B^YH>rl>gJJ|BJ*6T*J$UdgQP}M757) z?r)n&V=sP+af8@bOJPNX0ATQ@kA47ptlb1PRbgqe=+IkqH>{ZQ5Vkq!|0=|HZ~2Ct z8AJ->IziwSClq#O{#1I(!L)$ZJ7Sr4^*u#)ZYQCufm8pj5oT070$*=*)it-%K$c2( zWqM7OY@j}ABpiNEF(zGRXF0*Hm_rgto0`&&JWe?=UQu0IUFq%rgYiaPlSPECFL;89 z8Dso0VrNMSSFC+Kg}g>fUuZF9&b&LE{FJ-ifL+dCx3ZQ3DgA_o7KgZDuwc@$+6L{S znU0}N2?Z?dchOWlKl!Y?7z?+C80JRwmKy?v zRpfR-L&AWXur%pYfJ<6j3~Ga;+Ci*h!Pm*SC8f+fV$pf+kT*mVcat8sX8r@WQ@O0y zih_j9hRSL_+_ul(J6!v8o0FldiSdU9){Vt80qajFMM2~4kOp|QEaplulZa;m^A;*} zkH#*}6Rjvg@{$J?AJHXWec2`)3@f>b$fwCJ@2kGJ$3AknY{0JNc{U78J~(6`lVM`w zDI_Geu*R)#?fBbrv!IY>d0;GIMCl*?&Ga6pss3_CX}kV-TOIxmbWS|8^Oot@n0U*} zeI@_>8F%#{jYgQ(iP{=N32YR5g|KD4P%m2YJY7v(h#2@CnLL(jr`I8$kJL0Tn`P*$fJn zTug2$JP>a3o)vrO%;HWd+*EyocedwB2{0L%v|7GQw$Z+r7pzhhCI?zrb8}r=kx}a= zoUv)S@*xy}IhvXV`KO&|WitRwRKI-|%LGY0tDB96BAO*cCl-onr;Ia>VSAKyLt=jX9kc=KS6{> z-O1Qkos4bk)lTf77N7c9VD3wCt~hHZBo1RA5taB`X7WubosJ#zxoe{<;giQ`hKpvv@A5xbOhv8QBZNi}xRirP5In z%=$jp!06JC>HDSoy(30k&Mha>2Yv^nXtVFz4_M#CeU5i?cL1hcVrmLtch~ju;M5<@ z>99*r3BmOSxGe)V{s5dqAG^bA|At3pGinX4mF*X(OzRqDjk{6a!E>o8^u5B zaCJpX5h9J_U^}et*uH*;Osb`7$N~&-#{AiUvaufV1bizQ?;H04Z&4cnr=juk4R1?} zR@!Y>7_+8-qNCQ*a4$BET8j|9gVZ;Pq-oAhR-QzgEU$!GocmZq&J?4$E{J-u0qqg- zyzod_&u7a_hqyiWM|WX+>?p0FPL@=Yxz$^056fD|9}2f>v}}<(o@){DdScV+fELt( zll0rel3t497JZY+Yg7Zg10_~s0AP%@r<$m()!If}Xg7(4SW_yGsIzQeNxbF!l7W;V zvE>+tGBTU+&(ML>Y?Yd2C@aXjzutEz?|;g8JSuE-Kf6U4R8@*=i_A3q%j4dr*-Yt( z<73kVPBARhhv6b);(s!j;o1h|WYwj;BK1rQct6yUi*THXt=`Pw_dU^qh_$2ywaJG_iY;YNcN08lvYy%Yne4s>9N{{x$t@8HF1*0CmN@;H1R)Q*Pk);k z*POp>z`qfF5#k{|w6$|hKx`EhpjIkUxJq{uVErAugl@x(ml=v);8sam6Z_JQWEj9w z<9{Mrtub$ADQp4cwU)wMta5|Ld6u{ian!A?ht~hZ!)i?G2y5U?B z9UO2Ai;I{f{@<(v7CTJg2%mlRU6s#Ew|wKG_!GYn@=UsZ?}P60Qyc~Ci8=%8KU-FU z=#lxccBQolB?ItM(;9xvwo@ixl;Uf3oM@`Kin%)*_S+#c`V4)lwrhe5ALhy02*w%& zxBfFtX(Zc$qZ?G}bQ z&*7g@AaY~QX(tzAGH(L&Mdv0o#`v2i0kcl-iZCr(3a7}1ARW)-o0nhzk!7~ueP4@n zA9DdtOqTa99)x8^3Op5qetX~1vfkm~q1^1n9i{z;KV6biu;ECH??cNK{r1%-zxz`E zm{ffq&+CTr6|gs^|IzRVB?iVJH((gQAOQl?A*$!=Z$g8L7^@}GatxGiU+_k~>n6^Yb$0Fk>po7QpBlSxVV0{QVu_;&N`J%pg| z`u~i`fJu%xAS5$Ag;$JRDs%UJ1AGHp_lLz#i0R|ZV6L|Ro`o(PTWLwaJR#JpP zeVoO`F(3xy-lr~b6EU*jp+Z;J{Czx58`TopU>{bl6mD&J(66*=P3N@U!HepR0Bu2> zfH4_aTtA@U`^2&UVOMHUN!NIHJV-Go&wil^w&wC;8iOK=?H5~@0`wY)awiIEmh zqaJ2vu7)*;cb%h|8G6!z^-RrP;6-t$eeC9k);NB~jqFb|4XvC4!@9LZWaItzNqx%l83=GTaSnYZi zv^VA6C#U(w+U^XtA%jD!1|1;RM8dQP#g|*K@a*crmA?&qdmU^A=Mo?D^+@yT7Z@;6 ztq>;%F#s02IDp;&pv=#yUIs=6DZA5S$<#Uzab(CXUW$M52c_r$-0dlUzoiE%9D4Pc1z3^9j zCnT#Hm0kp2zY!WQcfXlFJJ=Ser8{#m=fmf1$E?_i*@S%Jf$4n!6xAv%PW_pt)S4MM zKNm=?nyo~u4_Bd;ht}q!7}viQhZHje4|GJ}wGW>)M``Z<xh&<&@d#{tQ00nmpc*)M@j`G3-$v+Dc|qP0v}%a4YS+cut&<#I9?=Xvq1~hOnJzv6vWjo3suaT#V`X zTI1#gX{szU(z|yM1L!g89OPD57KT0sswqB0dmKE-H)YqoI9CRrl(+KdkXij8f;gjX zw#ziXi4hCmkEWvoePQ-gi=)I2O4d92wjI_mlKbL4y`1p3mW>+o<_10RHLy>f-^kwV|Pp@$E#vW*YRxGUIy4+P<#4 z`L_j^7wAY2{srm$KUyLs%;*1wT9|t14C=YZeCGiox=3}|^&37649pd814c?ap5G5| zfBgG#YkPiw++FyEaO&~O_HecycYVkM6WB;TFPt}p{^t^_8!LO|!?`=GJulv;Kble> z{Qtc9d=S3aUw+Qje^u`pi2W$erNUI4yafOL-`b4-HD~r-2TX^o`xcW~x#lZgJg#pu zzz^OC@AP0pQ^EC_kwNt~rLukX`#*WAK&z}JzRG}!S8c!820=z$JX>6lhjplH_+s9I03x|o(KZJ&IF&Z8hLG)1DYS7Tj>MWri zcwm?hbOC=eN8>z$3+(p~1&j;fkuNcWMvJvhY08_j#3^iN(R)L-L^G5@aXxsml}j;YlF2cinAOTCT8m%0`2*0n)H(Oo zIZp^x&zEdE+WK(2t9Z)Ke%8mGLIm`1A80t$aF@{%7{yHD4OAiv=e|Cl?fJ6H#9;ph z5L>cTtg9>=PQ)?7nf)0 zXT0tb&0dZ9yaNe_$nJ;qKB|*cl-!ugz5Z(tFHFX-nM|Rp6~Ue@nOp` z#l+nA;X$Rl-uYpV57*4ijAP=UbB?C2GE5SVNRVU|iwTmHE~@TR&;5&$O%%k<+LsCI zIuv2e%1KXiH{h#(Lhd~MD67N1%G=FQQH|Mn za$^>IZKzNv%kU%B_+5G!Na5|&t)%!OQF&!T+)y1AwCNkAw#9Cm)GYHNN;5BpleGC1 zspl-Lvb!!Urf)N@B3_wmbGuFbg&f@sG0D$g{xFSSKMy7FY0%;Rg(EvzvCplHDOsQ| z_JCt@Wzh`fup!Yu?Q1aIu%z8r%;YE3Fm$N&3U1ggkW|9s)J^rOj?k{0bI{$;3Mrx8 zZIaeacDB9fC3+LF9!2jcOTwULq>~(i-s>7sCh|mnX2WGL{P$h!(^fzvAv^4=;Fh^q z2VL2fJYSFY7ZTUlnCUhc7)Aa0X(LRj;VV#flaaaZhD*54^{=F+Ty~!GE82+Tn|%VX zsXQb&T%tM)mrQ~7kky6TeyWN!ZOfp-V+&b)u8>0ozWcQ#m9JkczWsyt4Ya)tyBk6$ zwOdk=S$l7?;8!)J>JJ^yE$|pkqXMl+8{Hf)*Akj-eTS#Vppn)DzpjZ7N?ji|>mk}xu)4LBi2bY4Y~fD#AOSmdc!4Ai3n^0t&*m?mBi;Cjs|A_j8b=wir4&oU^N$BDXsyEtYz0W0$p$!q9W7+5!Vos9d5wqQB|V%1@) zgpZ75aokRY&}FEmfFj}XL@$x>Pk&*o8g2711Y2&QBojSHeKn*w8B$`pBl1{u3sh|> zeCgQ`^AU#I%Z<&>no-4Os@V3_Y@2{#kw1#_?66^=C=#*XG;FXQ`53So zo~5$v+V-P1#>lF^Lj~ApoeI@-w{8KVPCTSlGG&bp)eQEs228mN{vQy6TWP0_DdC7U;PZWdQ19eK9I$R0pAsYdWCPuxTa^_>Jt=KmxH*}fkk#_~6Exaz z^-LdbC2&VCI`kUzyM*Ik9-kEwBgqDbLZvo`utjimD4*iRZ5jQ;8dQ7HbyS>chl*k% zkEqhGpDFUjqqd*H71ORDuOe$^1#3_qMjl^-WZ~YM&97MGviGon z5=g5p0r% z%V~MV?m<|igQVS*yBl8&!)lIDnVQKp);}#&yoBkb<@50^wssa3ecIdaah23L-#_`t`8?Mv0rlc&EJ?%84ek)8c6hfW3i`)SBM9V9N z>}~>gdwU-*Rg24^{6HAo1x$M>y!`tfdx_igj{8sY9zu40)QlB?SA9ScKL16!UjI1Q zzV2iFm6n?&LA28BjGLR>4{mW8K}(*uWydhghB>@%MvoMKVp|cV!uQ zIaUGA9=>$Z*O9|vzhj9f%AQMBfUxP4go)H01`r)?IiZMOo?jl%K5n%q7$&YMKhES^ z9S->Hio>Z>=qFT?Mpt!G#%nsGy5IF=Kn?!^&AQYM7p~^%80aYeXu8W|idZkt%&$*w zobnw`=a}yvL?hH-lVwg`j)7{G7*a(n9{J4|na=eD}`&S4XZ38Sy zu*mD9{3}=g;jgD4f!EJYB=Yv|gd!p$F0SaBIyyTW>CRHw#rzsJD@}pbyv>e#GoXpd zDPycJsk&{6z$-Cn&^!k7+%(<*->tVD<^bM_1IxEb@x)p9!Yn?wpJvL(StXXYNVm*Q zZiv=P)xR6)5#|M#T{5C6s@1-?Z2ftx-=&*kbfbd^+TXTy^q9>z3nIU2X;fh5Z zWodac^EKvV#Qr}SC$;(hd9g$=Woi{3Ik7d?XdMwIjhZs!MS7LaevgpDddX)WW}`F; z9W<2<|MP60IWa4EXM|cH=kr;$bXm(MVRw|?PLD*Z9 z?W4W3{1X{%a0@m6-ErZLf7u8?SJZl02mb$lwcf1?p7LjYrNHD!i)AAMWt&#Kus_-1oHkDABLH zJB3rourE5%9+BT@)JM+^-A0mSD;>YW;DB5)7$>MN6kYwJNvg7B?dl-v)wA)v(?`b< z*HwCr*YPNn<=9DB-a?$6Ve`@;a2ypwddIYA7}FDw4Y(YiX=+U$9!I`uBs~wx(mY@-j=zpFZ_bfRnqk8Re8-KNCvwLM4$gtH3f~PI zst?%Jh_p1IROvMz3sMISep@mE=8v+Dcq&+a1s3f`{k~pltVCofzmHJz9KI8q`ov6S zgKh(7-EML^AnD2RDW7nsjUI*+k}*%yk_e)M7Id-Xx9`}a^NTV6mX25ctUJG3pCsW8a=6;RRL!*L&gF012T0o1(g$8rxp^*9e4rB&5}gjj%2# zV9h0LxydDo>pdaIJ+W*5>zVJHu%f z{SV*W)};|~YtD6YxNYX0^<*>)i$sbxGo%wvTgt>qL#$9b`-&N3z{!o5n>d|x=c>kq zY0JHVJ7V+4EmF1Evg_+A_VF~ogi56lvM_Q};2I{nLL`)7X0s5vu~eQ~A^})9w(AeM z2bLI$8%2Nb8sfjuPjD`}8JWde4Agn@G2EjL`C}&wEs%bT)PPW zywG>5MKZz6xZ<;x7&P0u=z4m=@5>SnE)2uD$nURvk{;2CP>y7zsHF2E>E0GM(qNJo zk>ymzIYzJ}Qf3-&me9N0-6xLj^9Zipz9ywmMQCWHnH!pAjLj7kg~lxK4E(u73_XuCfJJGaAQg=Je<8$zcWln-Bd~f zKP9h!C44aMXKe|*TTWl?JzumvPVphM5)t?r!?2MyVIA& zJ@2SUK1U}~dX{)KhB@BHz1QPBdxZi|q^}E%uVez(qyl}Qulju`>GnWw((-ZClBS)uEC2qI>u`SS zxgl*VmdBAgUGI59;diCnGlJexO9Ur^&`%U4jB$YRh}3gO$nA5BA$`&Y6s`=wd@Wc0q&w;#O zZuymz-^=m`;}GVs1-tf2-*4nEI5_P!jb=B;}~z0=La$5?qYuI3moPE|L@QwZmWY`@L>*5 zFYu#r`Pb9ol{!mO_#60@=0W9H{=tuzmyhJtbZ#8G&*KfPcQx9cFK_m{whx=2YPDfi zf~^zIn$J+Xg}bl!wQt(r@VOQ~iJLWG`yBvp$9v0J;VW+2s)|N7ve=>_C5C%4Rau)cxR{`#vId{Fxn-+W8@%;^O&7Jm zHGiTV6TEw!u3tnj|NU}5yZ6k3si$9bDYo?w$3H|zQsbUhJu@abbC(W3l594+Lv#U{ z>{|SCT24mE6Mi0@SEC8{-PJ4l4U{!xRcFyhz4GX-+29BBDWPhsjqMeq7!b-!jm{lbzSPN<#w2##X~<# z)&6|D%IuB+(N14&VnjE9N_ZoaTaqacaErQh)W$%n)vBrs!=W*DR2dt=axVM)+Qi`I zqHC**A>OgHG#0X{ z9Wty_!g^bpC3*Yv6=2l7eC5(2G6L`j30#Wz!jLDJdjsQzDED zeUn_|O!%Tp47HdZam$Z!>|t{$`w61{L7~W^&Q)X z>BU8%S5F;rFrrQXF3Is&q?qOi4{XR~2`8Aib>>DaQX>$n>Ohvqu;=PGpU6}E+^uLwrgxQ|Q&ptE zd1r6*+MI0Gc8)Cc4`k&+Y@%aBf(@^Tg_B{aljH+6H%Ti64Bb`qr(Ty$+OLKhuB*u9 zQowyC(LLC;8&z0O%HKFdwi+wsxGK^89bHq13YXMcW<(vnpjrQobiIkMp)5elQ_@1% zYvCF0R(+SA9#$bURj?Wvhb*le$Np0GHXP?6-iA9+Fq4gW47*_!a`T7pUgYLVbD>fa zba>zz7ECgAIa)GhNzF-u(Okn3zK+P!L%G0P6_iy!^3S*&TJ3%F8J%CBijor7VMb|W8`L~6qgyYeN2*pe)XXc1_=)2Q}tYsu3a;!0RagK3D1x)TEz>; zoVLC!QMjLFd#I`lYA7Tz)LY{lf(&AB3+#eb=%3=$7z3Ekx)xX^Qts}UH_q^#ey6V8 zw~LG{-275|fz)(v=NrG@Giwj0ye|y;OYZ(UGl{m*WwlG z)il~!{OGy0?vd=$JFJ%=*u8{jRMM-+Bh8gs7d-pHcl)RR_5I?Vzoc%Z(H-eOwy<~Y z=J?(t*{@synQ|?XFi02WVMiNb;DoPmxCSe$fK-ELQ1k9F{q7FAeV^HW{6zgV4B4Z=_N1P~*j7wU`wC-(4i_oZM3dhv$C z_+97j=7oWQL%>x$vmW;~T(K4QWKvG5z3)jE-NeMrUZMQeTs|p~9x%v5cJ~Wb8)9v^ zUg&myeBBm4Q-xPt@Y5y>4n{(gcuGbj} z|2WcLF-*+-Ld9yuTD2r>mN!fYLE-VRF+EANSq}NV)s^@7JYeEmmO) z{TMOrtmAFdqdcub*@Mr0VuEJ?Gx4!-`-4=*u#ot0noZ&5D)t>}`o|Lq*nG@2vHQS_hQBFOV!qm|0%nw7T)?{dk= z$~oQc8>jV24=uIO{=YA?LBTWZf9PDg*p|3wTg;c1Pb>sNGR9cLHLxVuNLA>6Itcvw zhih9dPY80>Nh}^8t0AgC>E01c%nZP5O{A1uzWQ(EZMk>sU2~uNt?L3AqGGiQHBdvf z$bV;+rpWwT<9%UdVG$=?EZwH^{uNs9qV1Vx>#D|`3HX>ooh_~)zd)|o>)`Xhi`q?AEK`;0_9$#W3KWz!h76=nVgGTGw;puRr~7rb5p=H?s3u!J zMysLf&+1l;-=5I(sSlxI3J+=6Xp@m1#m~Z#mF@p}M3g^Bo{}g&>Cj6^RZq>GY>4d8 zNc|#+-p?$nm>%#wo=tMdwY?Q_{p=q*AD{Zq$!e|dJxAmB;U=A`qLlxV7bqe=IV{=> zNzNoZLDO6my=}HmYk5>$6cDM156E2UtoKf6nY1^q3?isa$#JmS8}F}glY3BolI-U&q0?B8 z>nWXTbmDN^8k*w8YM!kZ6pB$@WVAGHSc?v1mG!)$@WngC52}Wpsl>=1yv@6!D2mrV zZr&(jD1um)G-F^(&W#(g%5MPGgj+hO;%#E($)8A+<&^&{iQT@2&7e8A0^vN0$Pal! zYi{KoQSQTMbmO($r4)6kJ#SUCSkNtzYiOt5G$W%jMUH1I(5o1y{8>hp3NjuYtOOSc@zf;Nx=1ak>^5z2~i7Jce$ zY89*|!IaWV5@DebhMX=`tR1JYV+*68{C$H`p(p1r5Nf+CCx`kJXeA(IkRFWvt4>3- zh2Dlzq`o#*r#@0AUy?zeNITA;pxEel28~%oV*FN>A==LXD!9bfGNm2VaTe)}ThoPM zr#f(D(mA9jRA8K7ArG-|itfCNOTQo|0-LUc@@*H%eiva-)6whPQ>kmaG0QO(2#Oj@ zghSU`ZxQkPJlibdXWm5O#PPpenx`@;G7J*kD`MRmWSNW!lb8u^ljspH5BKwn>k`ch zGWd)JSmH{lT*{h|nq^aN5r@pxh+$v(h5pdyd1-F$-YZxRiXanH-QOzwJC?d$VhgmC z>Z-GeB#L|O6e9XzjY32>;{`<$qvRN0P(vrxA>s5%apo2_h=Vq$sv~21e$FlwG=9Bp z+!emi7=VfFb*$M7pK!>xojlEP)%fee3kcDwt(5(0$IXS^>)&1}auwGyw=Wl*GdsTq z`$_JFi0VOfcmA?KN#nm=f-0d@FNaygs90*)sQ5vPO=Yg)Ol`kLrS?;DD-rcBn$y*{ z2#~}^h2-a`SN){N{4(_L)ETWi5qC5>CKhzuol|Y@h=C6weJ6%dnOd@_E7jiK(R$JK zK`PKKtPG$nZbi=fERW z4ehRsrEsE4{Y$OchwSpz7;Ww4NPp}#n9(QUPU^O^nstv4r0!Ut_PGCFFcB|7uzz}~ zIfa;OZe6A69uy$$G+(o#zf+<>@+ zp;fvIpK0Fo^vu7NNIr-tun2}mbdf?Q-T>1hC@%8rm#@E8+I?w1TYtgEC*1#&9|TJd zM*gY8Fn-?E(RL7O{rHN>KRxn<(j;l_W|rdIe~5*PzmNaW6Xc4!%*@K$fB1gv%=fgX zoWk+9%+9Y8?pix)>St4>?KS( zpH!$aITiWPzZs~i0WG`#{p|Bnrx>!%fHCIlF4<$ry+6e#Ul_FK7rNVCe6TS~R(9$L zqmzC$H9$TSJA~a-vRNUDV1f)HXmLj`d;3Z@XcXuUEU$mZG%P>ZCvW!3TW7`zEm|;G(iHnw7Vb zYwe3eK9gbe4*bFLK9*d&XDeILs8CL)Q`9f}%dq5#d3^0$AJd^wsA)G-!C|S2!&WK# z8hQ)ZCiU_J5?LZ88aOo03I6*@1!GBFsFSchFTk(3U3;Rq#5GEA7ogl7i zD9I#CWuGEmE?2omX7R*Qn=nB;DzX2UVWFIH$+T-nqoVkWUbPrju*X=CMhhbBdGQa3 zMWY-w*&IS#+{Dfl6MlT#Hibk3cd%6B>0A|C*iU3uWAcC@r|=)LJMCX(bH!H&?IjJC zDqG4XRmvvS95Ag|dO~>ao^Z~UvS*N(ooU`8t6DHYNdqj1uo-$g`B;bQ*)+IxRWsTF+0Vs5f-I=9W``SX)(LBj59PR16K|x>3v%P0k&fk^H6F zDbcKrxNCRO1E@O$V&<)fLhgqYWvDHTUG*WrvNTyNX0(D_t&~kSOq~t*O4(=;GfdT| z@?aTFF>ieUkHvVUh_l zl4tz?5%m>NZA9z3Elz<#p~a=e-QA_QyF+n@LU1h>iWhe%4y8bGcMTTY-Q8W^aPE2c zt`%0YCS)h0`~N?iMth7~!C_B*51T*N%FEudtaUAZ%3@UGW!kI`#g7{d*KelKVD-61 z+4b%I_)OKK=PJSI40f!2U1!y6q|Y$>brroJK0z*CkTDz!*{aAuUGjmwL@UiNsf#vN zBw2!m{kv2h>|b-ROQ0kBGO7d6utjzZJ(&iT4g7Q7nR1LF84#%fx2cuE2LZ+%r{A2Y zrl@9AY2p*?Fe`;?)5tL5d!>vrbz-cDv>6{ol@5>dN0;INOa(zoxN&wOe3ZRe0~V@^ zB1P}N3vX1GmrPefhv}|)VT>!mK8S`N?t=W?6LV;C_!87z8N?*xI_JM-xZx#?QHxVu zypyg`BjQpS!Kc}yUo`Qv?hZdPm=|cctH$%xfwP$X%$gx5IZ}LyY!fbJejF6)SrBhh zK@>QR3MZiMzgGz0YbS%-@iGW9bCXZ>Wr~l-nQH9nR+cvz#c{eb;`YpnuAdc+>@=OS zM*f(jJo5tw|G=Lf9c`4R&2RFuwUG{pMLvgTeYczC-m!hH*SOLAr$~xIXQ)+dRj*y* z!-^ltj^s!cyJk-7CS_(Jz~vFxw`RH=%qW-7+yz1(zc97A!ZDpQ2Zx5HxaV5$emoC` zD-z)IP6X2QQzNm#zqS-%YYIm)*BfA=M#uzp`zkb=?mJ$~kk?7?Ijt;Li=I?eq~&nD z2w;VE-CHH;Y~RADCL=3(-Ki&C>?!)CN|JbetfN?|2+;W958+$Bde0c4znU#c(yjK} zpjBzL^=7FLgqXPz*LGgQe|0*+e>bYi|2&HI`j;-~=sCwv0YqCktZwt!Z{IvWot#~= zDXOB|Snlq|M6DokyI#6X+i5``1W$>Hy>3}3dnq-%lb#gb*61&Z`>w?aLBWv(?(1Vz z9_M>hcxm|gpExSm(|+RtKX;el(4;F7P0ww^1@IRJK+dE)nK!+bpA@#S%{{IgEbg+= zpD_qHZNK^YW_B?VnJ+}yH9rwKY*d7h?3}KN$w3uNj9A#&y9-Lw>UZqiKwYI=|9mGr z>6db}9V*xjJ00NNTSKCmc21;zIkI{~z5a8jYhusaFLHlnRTK|I`!KQb@nHjDUvbb5 zTtFH02Ai|-7ZeK6e?X&q%9Zs(AOXaqhH~ESnzAmwEI+)0>CopxD7Vul#dgv*67s*G zUOC)dypktHoM{gSRqWVMjjT1bl@~14vP*XqWbT{1rjN}?H zsYkB7WI#`MbEB0|tet|s^2Q)i83;)`_@R?LkD;I4k|};)TMW)Seu8}h%DBjqYlEIO z9P|r_;xnx(NHxgl2cxsxmjxND#;{Uv$21?h%Ky@j|D&>TYtn<8)Inhvumah{>s41* zFv}=o$~4klIT5!h7NAlgQ)kzz-!*;8MrNHuT@qNjyuKn=i(ionqGV=>1Hk)t;#P}Z zWT8J#$+EEJ*;SROxA#bP$qe0LWoF_nQzbMNae|HCPOxh-llzze`5q@}J&1?Efk$VZ~szR@P+$0b2L^O68E2@nui`!iL$e;#m_YuFpmu# zu5kB_>bba}*H13w)h`g#%rB@l*M_0tgu%{rbvN+pj4;g7D(lsmV!5*}#X4W9}{fnuQ=2%zD!i5n& zrLAa7^|biDq$0V5BHH#E_Qv+k2A(;K;%0!TRmC@qze+7%ADIEB?AtI(-aXhY8r-{V zIX_!uH|5%fCbdG~`+0SD<--VXyn z1v@fK2j=---d^j(-HRsd%cbl)hvuVP09>xw^C4=@+&crY3amU-+lq`@lkhx84xZED zey(I=rjd;_DMP#;6I!bC%!~daG`TG)HM=@1Vzpe+`u*Q3F@XN>-aG6eDs=xu>VpV2`z73?DMh1Ux%S9@IA}XyU zg?D$nh=@js+TP;s7uHD$JT8lHjIV-fK*2=ZH6cFT4od zzjwXgdz|k%{I%7_&_sz~_)}zlv&zRe$0CN`!`CzH?4oOu?vuA7>!<#m8-?}?kd2r0 zfUAnI3OU_Eaz;LU7xYQs@qofE3Zp>Bla3=9 zydA-8RIf{7*b0+VaC3ENKirNt@yyNRk-tl=mLHcWcIqxH7zsvNa0I%4mU?^G22o92 zzRsWj0H&rkR-B|}j<#lxbqazh3tR=b*#mE8Q$@dl4X@J^9Jd=XT$SY91? zK^@HqyrJmwCqh&4ZEi6Gs;CY}jnZHGixTKekwQYTLK00R<3D%Kgq1mM;G;Cr49aQB zpe@@^ZmkNV@qZD|KtN7=lJBxI$i?e`zuZJuurK6YvwFB_EVMpmqu}HahC?mEw>yda zCg~G4LjHDay`c!JzZ6tklCeNF+=sXJlkwtHXt+a+AzZi@}Bz9))ynkx~P390a_WgzA!kTt%FLG{IH{q_4CZuJrm#OSbdP z$O{#GQCy1%T^7)@g|_E~$KFEUK&a0#Xt!}>p>@aZao@o^_T?0@t*h;JvTgPG;n+g| zCe}dSnern6@>bQ?OjM5%e#>-h3nq#lR01^=C#+Nl(w4{`JO4VUvZK zLf)R*a#|My$?1+Tn|PfJ2O<&EJhR)V@KHP>I{IQveHvL^I$c5)U&a)$)pgd$so zVfj@U7Yu;c)1|tSy(4_S0Y(?t{F`4jLbCgdVY;dzc>IW!={(zTO+%^{6p6`sK3kcKBsyy+>FXuqNU?$A9WQ_V;1G$97$RqQf(U3BrJDRQ!EML_vWGsIZiQ z!&&?bkY4$(A~>>a;MP2#`hVp_z>60p3g4rsPNWta-Iv0x2kjkMG8lGw51Srh=`$4X zqUO)Pm?AtaM;E*=_^m-LJf738gY}*t;Fed8P`Xz%$I$f4zAZLH3Otk<_igdbHk#1s z*4i0eOb^>GHv2z63j&g-QjMl3E{COV7cPUo`^baYRuG@&acjU4UtNXcg~aqoev_Ny-SOaDvkMkbZq%2B&z$pWe6~)NX#Hg| zSj%wOWY5G`ULRq%P*>@(V2%Jrzz|i^p{3fnvxgR)s4p4Smefe``S2K_>gPN{49 zOKDh~WBpZ>F17QgQ}5{GR{L7pg#ojqBh!h*$V;?K6K%>!39J>HwxL&;;)&~Mr;^UC z(rm$e`me57g_h~WwESU{D-$2%%E)$Uns$>f!<0+{pj!SYZkgJfXqVP-+D=ehyO03IPepc5O!ZTbTo zBy&BHbxZv~olHi${->mD{hW@`0RcSGCQ7)XGOjIY?2wkgOtw(YBoL{U#@J2A*QXA3i2EqP0 z!?Mbe0}bp6<{t^xRQCR?tUKkSc~)f5s4UlrO!PT)PkK};ocS)`QVmXP_kH}F|0c)% zS@JEe$e`kG_=1`rLrOW-Ld6pJh+WyEXJuhk1&Jl0gevl)0`Ys*eEhO6azaI((zTwV z3S|i=s!ruer*N&V(~FA7=go?CRRjd4-QVulpE7_DZy^=%cJ@1;zv=V7G+4D3wo^`?`3ryXu@kM7y=5i+*5sZb5K=N8BI3!3-Vl}HaZH>nkp<3e_AE7VW%>Z%R7nShnA*CPEZsl z9=#%|ln)vs8c?drHV*NVzq*)Gfcn?-DUT-U;(eo?uxJv^0~v8N#D`Si*d(yb`Xz`} z=ZQFaaQ00mZs!y!XSS@#ciT+~w3~3$ZGXMw4+z=(ig9-`)$hLMS?cH3x@qV*kdKld zz_K0#j)J`R(tlhG_v=#0);*Z<+KPFkrzr|R3LeNPdq-gyK?a|9Cc!HOuyvYwaeJiy#J(^re6L)(RoWP5Ifl?KLvFRp^%@LMmN)fA1#fSEDbXuoFN;-@et{| zI_k1MCHE5bh(NYw3MblTc1C`$Q%mMA(Dii&E#3D0$_nxgl9qSha2i5Wvw@6nbTt}%PV6hvE48o4#Qc@BTxWA6knEk>9`M$^@f zaaU%49$b%lo^G2hoINYwI-74iwEdk`J6#TYu$BdN&(0!we1j{6AQb8G$7dv@&Nqf* z>N7U#_*cAWTs2eHfWEm#2CvSbr*!bivs9)0Yn!$>PKPOd2jh&K zt%u3IgEXzkABLTH7r%xX)GzyjDh>H@MTkKH_=Cro7=$q`YwBH|zz8ts@Z&IrOYBE$4hps33GuUY9QscOqtn z-7Q5K684y^ol+mcW|=NR7WW}cqGJ?YOrk}Z8mwpyy-iWa!mU;CE&7>K6YG90s(SOA zotnUbm1amA_Co%&h)7Uq2rF7B=8eGD4}dF!<6!#VMJ16bn>J&5TYJS!6vfAm2ED`s zhgRajT40vmyc1(mqMQ02M79x7Ak5(ZIc@O!Qshj`u!U7kYB~=H>^aplDMvrJ4z#7) zBX!Ht0Eap?WAF;@_F-~17GT|f!5N8W=H%>Md?YlYKA9=7`<=r3+A?dk`K$IRC>z9| zG*(C+EgxK;H$Z)&iYsX7jf(5@d4rApAC|pHayN4MuXjz}QBTlNN6%M;Diix`j%^ym zVf*K8L|VDH=v$oBcr|#w2xfY2OK%tKWFt2+kB$P24-uc+_bV68D%U6c*2kK1W)7B6 zVwdr|bE3;44*57><}k+PMdEhZCa-ZqL&57)pD|r>XglD1*8>A6pf^^tceHi1NRuF- zE{2(n5Wy{{6gsB1*s&O81MW+h83Qi{ubU%^Ea=4@)F*SIPyy@qOM&@1htKx*_Nzdl z3Iu}l{b9fNJJ1O4?+Us9>}WJKQ=;QR8SM_X+ybd#KbsJTVkv1?SNGNK{_#41jgSM& zI9U;d9SoTWIPJbIM3u_PE1n&KpvK4qVr+o8xo**y?ZIIgIyx`XdfUUqD#*ILr+mP@ zc(Z(BWNjYy^3?Xi6@#AmPtA5wK_7vqb;o>%+wYjaYX`g~V32fz_vI}x?rP&f`Nko{ zXxn_dcxE4{{mKM1oi2{JE;dyaSvgpyvZ=sE|9tv5ul1Xv0p0caR=ICV3`#Dpj3S`0 zo^7#{ZdJr0 zcv9&V_h*&CPi1HAg=#~>%^tS&(dCdQB^=%>H90~h7@Lk*>HE5Es*9MWlCsXDRajF{ zXAav^Z=Tw{?kcjLS?pUbu*(2SXJ(~3>lMwf2cVKUfD9>byXFN%c#y8`CZSV%->Vhx z*aQ1|Kw)^pxqRVsVsx{-wCK6Ru;@Btr#7gLy@R8b>;U_nMd{#yIA0}{Oqt z$!o=f$!*08$F22Bp={2N15mU8{yha4Um3ZH*TSIr;pt?((C@jh{(1Xp(Fc%&JU!Qe zw$wG1N~Yb9wsIkN`b+wc-B923=;zJo(v}qA%c65Nd@suEY7`-(-5Uz)z5oahXI{z; zHY0n+L%jef#x3@x1xSB^zVGG9%kzUKLT;;8oGNMPO+Sn&|tv9D7 zFZXf$FNYTqkr8h3g(ZdIeouZc2nSq$H_k$c6{FG;A+5lPdW_zjmUTN9?YN*{=kz2$ z0|KrHjxRUMeHjidaf5F9BcU^jtZV{tyO1)Vw%e;sbHAF>oNKY*5_$>E+Gr%W0ap2B z^BGW#$k#0kufh|$Z-4vq@x{WFN2$qjXkrq7{8v0es>($|de!*1zw8AR5;x48e;D{O zaiMAfc63RP_|UY0@BpbEXoNrB{Ib+|GEQKwU9O%av15wroj40d@p*l6fVw`uOMv+K zyc$s=9_E(A`6DxY!Mki>(o!_cnh6KPIQw$)a%W;keYHCihd5jw4AF5>sviyKl{QI2 z2zm2ntwqu6UYftxQD}d2Di{V_zq?ic<|>D^kg|Q=tkQ>xA)imOK+Un2GOEII(3~2f zPS}Tz_VM#aPdkUw-+NehtgWT?`xsxKksCnmPuC1!Osz_B6_T|mV1ZhOg%x)4*L{BTI52Xtr9N+;s2%wpU9kaN%LV)3GKcRJ4C~l=x)!|lDH#+qC*xjW+>v@#Udz7y?0BkEJeJI z`|W0bEKSLS>=mY^d2L2fVfTlz!)thBinHg;F|oKHT>40x>#e{P_#>emr3k79^wJdi zdpUWuE;}Xlpjg%x^_U9xCygHy88MUjHD=HXN5jI9q+bK1K{^dQs(ofh%l^q*Q+s=MHX~zJFg-=-15)&?ewqhfY|GdN7 zp#)hTH2ow+U7^w}mHn-eQIdinI`NZVaX<9FV+LMcKeqry^vjhtn_NJ9U#Yb4sLC6I zkmJ(NmE<4hy!~xkf9jTC-V1`w#@oz^?ik_2u$#22jIa(k9rFF;X@4C07!In!u}jDox1PeRaY8PiB1iK6 zlTU$H)w-CcZYTXujUfjq^{t3%Z)W69&b2owPGpdO1Q7wefBMO0{MS`!%1Coaf{9+R z{;!Wc9Ma-?3A%(DfDFs&3q(BpY8=XO27*>HJQ3E7pTrPaK%ObcrNuJHChMm#|8aJr z!ne4fv8h#kB}a_;?5iMFDQ>Cc2pBf4#q_b5lEbpT)J&3+*R<0vWJ%WLQ!(rl$M636 zb~jAme(_@-v=id7A6ocN96?npxwD&vZPDjOzxgQR#_9Id=sl5Ocf%M6S^PWdgNE}1Y zn68lbCdg@el#!e0ZdYkGJ4sY9Zg+f5Yt2Q=I6)rq}N4{T@aGjDuWpZK32 z7T5?;>ERCQm)QXEU?ok8mxrlYiF;F1@XH|I?zd}1ABj(TMF09v)Y^X)vGU_by_j%s zHIL_dIJoqN0rEZnjx~R-vibl?q(W=+LFoMHa2`Z~0z%8G`z}zA^R?5>JYeHv z>!Ry3*gm5o-YGGBphXvW#JKXz7%Z!g0M^>4`La`1EwHm*8v7M^5W0g3DpZv8t40fyM(yBfv9&)Fl$+T5MoE(Rs9h%*0WmPcLQnaA z1HjDCKi-LH__VK?f}5uIp-5j#XY~Nxn@G~MBB;f3?bra4%qL9STMcyp232&3{MEMw7mAyN;wp?%ytv}Z5>t73XY7oy

    YH&OiE8$dSG-bbv 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

    |S=Hq>S@i!)}SOVHj9qtl4j3jE0z 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 OuK8uIJt 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 C@S-FD From 12adc1be4f19f852aa5dcbff999ae1850977a93e Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 5 May 2025 11:34:58 -0700 Subject: [PATCH 225/421] Add sphere brush, dottedboxguy comment pointers --- brushes/cobblestone.brush | Bin 785 -> 0 bytes brushes/eraser.brush | Bin 785 -> 833 bytes brushes/soft_eraser.brush | Bin 785 -> 0 bytes brushes/sphere.brush | Bin 0 -> 833 bytes external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_rect3cp.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 16 +++ .../do_editor_ui_for_compound_type_struct.h | 85 +++++++++++++++ ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 26 +++++ generated/do_editor_ui_for_container_struct.h | 26 +++++ generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + generated/gen_rect_helpers_struct_cp.h | 64 +++++++++++ generated/hashtable_world_edit_brush.h | 2 +- generated/serdes_struct_brush_layer.h | 2 +- generated/serdes_struct_brush_settings.h | 2 +- generated/serdes_struct_brush_settings_0.h | 2 +- generated/serdes_struct_brush_settings_1.h | 2 +- generated/serdes_struct_brush_settings_2.h | 2 +- generated/serdes_struct_layered_brush.h | 2 +- generated/serdes_struct_shape_layer.h | 17 ++- generated/serdes_struct_struct.h | 100 ++++++++++++++++++ generated/serdes_struct_world_edit.h | 2 +- generated/serdes_struct_world_edit_brush.h | 2 +- ...truct_world_update_op_shape_params_asset.h | 2 +- ..._world_update_op_shape_params_chunk_data.h | 2 +- ...ct_world_update_op_shape_params_cylinder.h | 100 ++++++++++++++++++ ...struct_world_update_op_shape_params_rect.h | 2 +- ...ruct_world_update_op_shape_params_sphere.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- generated/string_and_value_tables_enum.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- generated/toolbar_for_enum_enum.h | 2 +- jesse.make.sh | 2 +- .../shaping/terrain_shaping.fragmentshader | 2 +- shaders/terrain/world_edit.fragmentshader | 20 +++- src/engine/api.cpp | 1 + src/engine/canonical_position.cpp | 7 ++ src/engine/canonical_position.h | 62 +++++++---- src/engine/editor.cpp | 94 +++++++++------- src/engine/editor.h | 23 +++- src/engine/render_loop.cpp | 47 +++++--- src/engine/serdes.cpp | 5 + 140 files changed, 730 insertions(+), 200 deletions(-) delete mode 100644 brushes/cobblestone.brush delete mode 100644 brushes/soft_eraser.brush create mode 100644 brushes/sphere.brush create mode 100644 generated/do_editor_ui_for_compound_type_struct.h create mode 100644 generated/do_editor_ui_for_container_shader_ptr_block_array.h create mode 100644 generated/do_editor_ui_for_container_struct.h create mode 100644 generated/gen_rect_helpers_struct_cp.h create mode 100644 generated/serdes_struct_struct.h create mode 100644 generated/serdes_struct_world_update_op_shape_params_cylinder.h diff --git a/brushes/cobblestone.brush b/brushes/cobblestone.brush deleted file mode 100644 index 3182de1cb69d5c2a8a4cb0717a58126d96790595..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 785 zcmd^-%?-jZ3`PkYk(hxASfT196+sqMsuHOQ2W||+h#asJf3gqVfK=AAo_`Kj!>+%* zGAK{VxIW8cDpc#7?&Y9X@cH)ds4nHX(6n4%v|@>GL;EeqxKOD%(WNcd@xOx{$=}l- zjY|U#riU4sEu0@+&gC=LdpIvM?ZJWY;FgC2WxwT^w12^jIrM|l<8#aeB+9KGIM9zc QH?Ze;+YM0!Z4d_h0e9`ly#N3J diff --git a/brushes/eraser.brush b/brushes/eraser.brush index 2c2a75f17d8772b5aa2fc8a35ff19d0ee387cc23..25a1838d91c99d2b7a3cce6bdbe1d0eda6bcfea5 100644 GIT binary patch delta 50 zcmbQpc93mC`NYPb6DM#@u3~JMypM@zG8*+rG28Wu2MwV|-D;BXJDlyxwZ2GBOnl{wZ`xai4K%((17= zThAceZtz2>rQJ!t-QYE|9XJpk-1BgtzV9`X{x7(3hj~zEVvS5fVceU617jq(UcB75 L?+{JUgD~I^qN2ul diff --git a/brushes/sphere.brush b/brushes/sphere.brush new file mode 100644 index 0000000000000000000000000000000000000000..a16197a2125808769865c04b2375c8bed62126ba GIT binary patch literal 833 zcmd^-K?=e^3;6P~Vl)4Yyd?ISbH6lwtyq}t zs8&wleC={AAGKb>`8+cn9K^#lkAvF#_02Nv>RdPfAJpL7pvf=iYd&W_kQmo`aL|u9 QSE<){E<2|Pmq85t0OS?eBLDyZ literal 0 HcmV?d00001 diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index aee9c8be8..9901935a3 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit aee9c8be8bd685165ce013265ae41cf8d410f8f1 +Subproject commit 9901935a33bb53cb583bb22a6a7ac7434996ce07 diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 7ccb9cc4c..621258091 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2376:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2375:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 7c52d93e3..fce085062 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3356:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3355:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 672dbca70..f798d7c65 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2329:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2328:0 case type_ui_render_command_window_start: { diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 559fc45ff..f74bac793 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:994:0 +// src/engine/editor.h:1010:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_rect3cp.h b/generated/are_equal_rect3cp.h index 3bd225aba..af193f0a7 100644 --- a/generated/are_equal_rect3cp.h +++ b/generated/are_equal_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/canonical_position.h:254:0 +// src/engine/canonical_position.h:264:0 link_internal b32 AreEqual(rect3cp *Thing1, rect3cp *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 7eaa67161..4c8c5d78b 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1171:0 +// src/engine/editor.h:1187:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index ab89bc9be..7a2a5eb09 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1186:0 +// src/engine/editor.h:1202:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 4994c2be3..36bc0e96c 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1197:0 +// src/engine/editor.h:1213:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 0a7a58f61..896e37ec4 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1189:0 +// src/engine/editor.h:1205:0 diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 534df7549..7abc0b5e8 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1059:0 +// src/engine/editor.h:1075:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index fd14f37d8..b370d7d6e 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1052:0 +// src/engine/editor.h:1068:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index bcedc82c4..71462fef2 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1045:0 +// src/engine/editor.h:1061:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 13c86f542..dcd51769c 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:920:0 +// src/engine/editor.h:936:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 788f58bce..eaa64b96f 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:220:0 +// src/engine/editor.cpp:270:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 6ae27688f..749f65e74 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:359:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 49c8b78e1..3c1d6664b 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:351:0 +// src/engine/editor.cpp:401:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 33b4f8ae1..54cd12269 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:259:0 +// src/engine/editor.cpp:309:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index e3ec8a4ad..3ab510f44 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:226:0 +// src/engine/editor.cpp:276:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index fc176b8cf..1ccc7ffd2 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:159:0 +// src/engine/editor.cpp:209:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 29753b1fa..09c41a37e 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:268:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 50e71c48b..66ece8802 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:253:0 +// src/engine/editor.cpp:303:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 4a4212605..0315da3e3 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:292:0 +// src/engine/editor.cpp:342:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 785af42e7..c660ba2eb 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:262:0 +// src/engine/editor.cpp:312:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index cff8316d3..782d1267d 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:362:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 3dd5cd0be..bb5d9b8d1 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:155:0 +// src/engine/editor.cpp:205:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 6747d8856..1f9cf74ff 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:449:0 +// src/engine/editor.cpp:459:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 81cab58e8..5534786e6 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:470:0 +// src/engine/editor.cpp:480:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 0d1f23a76..4ebde841d 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:467:0 +// src/engine/editor.cpp:477:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index b942b5cf3..4a93f860a 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:331:0 +// src/engine/editor.cpp:381:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 7a045f61d..e81a218ad 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:328:0 +// src/engine/editor.cpp:378:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index b90970298..6691a8735 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:365:0 +// src/engine/editor.cpp:415:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index b25499045..befd9c305 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:316:0 +// src/engine/editor.cpp:366:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 92f5b6ac1..fa7562ace 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:250:0 +// src/engine/editor.cpp:300:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 60983072a..92d3e58c6 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:425:0 +// src/engine/editor.cpp:435:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 9e6c06d43..9e305f782 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:419:0 +// src/engine/editor.cpp:429:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index cd7e90644..d0e3c7c42 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:298:0 +// src/engine/editor.cpp:348:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index a604f7540..8d8f1c036 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:301:0 +// src/engine/editor.cpp:351:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index ede232b97..67bddb74d 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:440:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index b9ae8a945..d7f855067 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:464:0 +// src/engine/editor.cpp:474:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 29c45bac0..e22d0972b 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:148:0 +// src/engine/editor.cpp:198:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 4b66a1b76..04656cd16 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:145:0 +// src/engine/editor.cpp:195:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 38a21b17c..65acf3ea2 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:217:0 +// src/engine/editor.cpp:267:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 648e243f0..4cf4567ae 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:271:0 +// src/engine/editor.cpp:321:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index b1eff0e49..55c3047d9 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:455:0 +// src/engine/editor.cpp:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index e22402e41..5bd9d4d99 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:422:0 +// src/engine/editor.cpp:432:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index a34c98324..4b461dacf 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:196:0 +// src/engine/editor.cpp:246:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 881864345..213d9b2eb 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:304:0 +// src/engine/editor.cpp:354:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 1841387da..076af0c73 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:307:0 +// src/engine/editor.cpp:357:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index cd43d2c1f..33dbf8959 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:265:0 +// src/engine/editor.cpp:315:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index ea6f0482c..5b654c240 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:341:0 +// src/engine/editor.cpp:391:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index e60dab470..d6557996d 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:211:0 +// src/engine/editor.cpp:261:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index ea9a06f05..f91551777 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:214:0 +// src/engine/editor.cpp:264:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 1845a7b01..a250965f3 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:202:0 +// src/engine/editor.cpp:252:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 290bf7ce4..b2f1269e0 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:247:0 +// src/engine/editor.cpp:297:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index f33635e2e..e03f0d328 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:151:0 +// src/engine/editor.cpp:201:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 713979e06..6cdda8681 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:205:0 +// src/engine/editor.cpp:255:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 202c0fcdb..012c761e5 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:413:0 +// src/engine/editor.cpp:423:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index c8ad52c0f..a61d5016e 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:443:0 +// src/engine/editor.cpp:453:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 142a5bedd..bb6805503 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:199:0 +// src/engine/editor.cpp:249:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 15eb5d867..0be24363c 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:416:0 +// src/engine/editor.cpp:426:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 1e36e4d79..c8670f1d3 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:410:0 +// src/engine/editor.cpp:181:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index c0a18e5bb..acf72ed3d 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -74,6 +74,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_update_op_shape_params_cylinder*, &Element->Cylinder), + CSz("Cylinder"), + Params + ); + + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_compound_type_struct.h b/generated/do_editor_ui_for_compound_type_struct.h new file mode 100644 index 000000000..c2085ffa0 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_struct.h @@ -0,0 +1,85 @@ +// src/engine/editor.cpp:93:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle shader_uniform", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + PushTableStart(Ui); + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader_uniform_type*, &Element->Type), + CSz("Type"), + Params + ); + + + + + + + + + + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->ID), + CSz("ID"), + Params + ); + + + + + + + + + PushNewRow(Ui); + + auto Value = CS(Element->Name); + DoEditorUi(Ui, Window, &Value, CSz("Name"), Params); + + + + PushNewRow(Ui); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + PushTableEnd(Ui); + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index ccf552eaf..0270af993 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:431:0 +// src/engine/editor.cpp:441:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index aec454953..d8624754a 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:434:0 +// src/engine/editor.cpp:444:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 77852348e..095b51ac0 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:428:0 +// src/engine/editor.cpp:438:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 47c899ba5..6039d5868 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:277:0 +// src/engine/editor.cpp:327:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 13a45cbb1..e8ceac6f5 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:274:0 +// src/engine/editor.cpp:324:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index b99fcf79c..880de2afd 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:437:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 2feb60866..b50da6027 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:256:0 +// src/engine/editor.cpp:306:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index a4910b2ae..13f53ef96 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:446:0 +// src/engine/editor.cpp:456:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index c79a34c49..d398db3d8 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:229:0 +// src/engine/editor.cpp:279:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 5b44c7025..2a8b35f7f 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:223:0 +// src/engine/editor.cpp:273:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index f0b53074c..bf4f5bf25 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:295:0 +// src/engine/editor.cpp:345:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 6a7de7570..f135ab0fd 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:286:0 +// src/engine/editor.cpp:336:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 3f126f1f5..369a10aab 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:289:0 +// src/engine/editor.cpp:339:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index e32b0fcbd..f090fcfee 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:142:0 +// src/engine/editor.cpp:192:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 7940b20bd..253a33aed 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:139:0 +// src/engine/editor.cpp:189:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 8492d52b4..8035658ab 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:344:0 +// src/engine/editor.cpp:394:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 2c6b11d67..338787a73 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:338:0 +// src/engine/editor.cpp:388:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index 71516be7f..d181ddf36 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:280:0 +// src/engine/editor.cpp:330:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index e0310efe0..e2bf5834a 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:335:0 +// src/engine/editor.cpp:385:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 4aab964bf..c05d64f4d 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:310:0 +// src/engine/editor.cpp:360:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h new file mode 100644 index 000000000..3859e4a6f --- /dev/null +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -0,0 +1,26 @@ +// src/engine/editor.cpp:184:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +{ + if (Container) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + { + PushNewRow(Ui); + IterateOver(Container, Element, ElementIndex) + { + DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushNewRow(Ui); + } + } + PushNewRow(Ui); + } + else + { + PushColumn(Ui, FSz("%S", Name), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushColumn(Ui, CSz("(null)"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushNewRow(Ui); + } +} + diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h new file mode 100644 index 000000000..6c1a5db9b --- /dev/null +++ b/generated/do_editor_ui_for_container_struct.h @@ -0,0 +1,26 @@ +// src/engine/editor.cpp:178:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +{ + if (Container) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + { + PushNewRow(Ui); + IterateOver(Container, Element, ElementIndex) + { + DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushNewRow(Ui); + } + } + PushNewRow(Ui); + } + else + { + PushColumn(Ui, FSz("%S", Name), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushColumn(Ui, CSz("(null)"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushNewRow(Ui); + } +} + diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 2aaaeaefa..03321c1d1 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:356:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 62dfc022e..4cfee51fb 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:283:0 +// src/engine/editor.cpp:333:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 2f6c97d14..74b5615d3 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:452:0 +// src/engine/editor.cpp:462:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index ec12d22a7..c5ed43303 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:187:0 +// src/engine/editor.cpp:237:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index f0504fb8b..496dd78f8 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:184:0 +// src/engine/editor.cpp:234:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 3e8029c26..e998e5274 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:313:0 +// src/engine/editor.cpp:363:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index eaa11a3ee..0a321c5d8 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:208:0 +// src/engine/editor.cpp:258:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 1305bf1cb..559ded0b6 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:458:0 +// src/engine/editor.cpp:468:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index c6b8ec0d5..961292ec5 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:461:0 +// src/engine/editor.cpp:471:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 09d031fe8..be120cdf1 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:190:0 +// src/engine/editor.cpp:240:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index e93ca4a8b..d822bb5bb 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:936:0 +// src/engine/editor.h:952:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index b278fa914..dc4632e3d 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -224,6 +224,7 @@ + struct render_to_texture_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 38eeda829..449e3ba91 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -224,6 +224,7 @@ + render_to_texture_async_params render_to_texture_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index fa785d11c..40ceec33e 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -224,6 +224,7 @@ + type_render_to_texture_async_params, diff --git a/generated/gen_rect_helpers_struct_cp.h b/generated/gen_rect_helpers_struct_cp.h new file mode 100644 index 000000000..b4cdad5a7 --- /dev/null +++ b/generated/gen_rect_helpers_struct_cp.h @@ -0,0 +1,64 @@ +// src/engine/canonical_position.h:273:0 + +link_internal rect3cp +RectMinMax(cp Min, cp Max) +{ + rect3cp Result = { .Min = Min, .Max = Max }; + return Result; +} + +link_internal rect3cp +RectMinRad(cp Min, cp Rad) +{ + rect3cp Result = { .Min = Min, .Max = Min+(Rad*2.f) }; + return Result; +} + +link_internal cp +GetRadius(rect3cp *Rect) +{ + cp Dim = Rect->Max - Rect->Min; + cp Result = Dim/2; + return Result; +} + +link_internal cp +GetCenter(rect3cp *Rect) +{ + cp Rad = GetRadius(Rect); + cp Result = Rect->Min + Rad; + return Result; +} + +link_internal rect3cp +RectMinDim(cp Min, cp Dim) +{ + rect3cp Result = { Min, Min + Dim }; + return Result; +} + +link_internal rect3cp +RectCenterRad(cp Center, cp Rad) +{ + auto Min = Center-Rad; + auto Max = Center+Rad; + rect3cp Result = RectMinMax(Min, Max); + return Result; +} + +link_internal b32 +IsInside(cp P, rect3cp Rect) +{ + b32 Result = (P >= Rect.Min && P < Rect.Max); + return Result; +} + +// TODO(Jesse)(duplicate): make Contains primal and get rid of IsInside ..? +link_internal b32 +Contains(rect3cp Rect, cp P) +{ + b32 Result = IsInside(P, Rect); + return Result; +} + + diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index fce11d431..62d41242c 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1174:0 +// src/engine/editor.h:1190:0 struct world_edit_brush_linked_list_node { diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index 5796e3b88..51830457a 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:435:0 +// src/engine/serdes.cpp:439:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index 411d8d348..bf8d01e65 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:432:0 +// src/engine/serdes.cpp:436:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) diff --git a/generated/serdes_struct_brush_settings_0.h b/generated/serdes_struct_brush_settings_0.h index 772869a04..fb835526f 100644 --- a/generated/serdes_struct_brush_settings_0.h +++ b/generated/serdes_struct_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:426:0 +// src/engine/serdes.cpp:430:0 link_internal bonsai_type_info TypeInfo(brush_settings_0 *Ignored) diff --git a/generated/serdes_struct_brush_settings_1.h b/generated/serdes_struct_brush_settings_1.h index f213dcc4c..4ae5db67e 100644 --- a/generated/serdes_struct_brush_settings_1.h +++ b/generated/serdes_struct_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:428:0 +// src/engine/serdes.cpp:432:0 link_internal bonsai_type_info TypeInfo(brush_settings_1 *Ignored) diff --git a/generated/serdes_struct_brush_settings_2.h b/generated/serdes_struct_brush_settings_2.h index 1f9ef1c1c..a703a144e 100644 --- a/generated/serdes_struct_brush_settings_2.h +++ b/generated/serdes_struct_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:430:0 +// src/engine/serdes.cpp:434:0 link_internal bonsai_type_info TypeInfo(brush_settings_2 *Ignored) diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 5fe5a232e..b69a9014a 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:441:0 +// src/engine/serdes.cpp:445:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index 3e6a556f9..73980d6dc 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:423:0 +// src/engine/serdes.cpp:427:0 link_internal bonsai_type_info TypeInfo(shape_layer *Ignored) @@ -53,6 +53,13 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) + Result &= Serialize(Bytes, &Element->Cylinder); // default + + + + + + Result &= Serialize(Bytes, &Element->Threshold); // default @@ -97,6 +104,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer *Element, memory_arena * + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Cylinder, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Threshold, Memory); diff --git a/generated/serdes_struct_struct.h b/generated/serdes_struct_struct.h new file mode 100644 index 000000000..a6717f274 --- /dev/null +++ b/generated/serdes_struct_struct.h @@ -0,0 +1,100 @@ +// src/engine/serdes.cpp:420:0 + +link_internal bonsai_type_info +TypeInfo(world_update_op_shape_params_cylinder *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("world_update_op_shape_params_cylinder"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_cylinder *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + world_update_op_shape_params_cylinder *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->P0); // default + + + + + + + Result &= Serialize(Bytes, &Element->P1); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_cylinder *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_cylinder *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_cylinder *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->P0, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->P1, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_cylinder *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index 66a4b2422..e04de5515 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:447:0 +// src/engine/serdes.cpp:451:0 link_internal bonsai_type_info TypeInfo(world_edit *Ignored) diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index a0275357d..2101d1be9 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:444:0 +// src/engine/serdes.cpp:448:0 link_internal bonsai_type_info TypeInfo(world_edit_brush *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_asset.h b/generated/serdes_struct_world_update_op_shape_params_asset.h index cbbee95b9..446b0d5e9 100644 --- a/generated/serdes_struct_world_update_op_shape_params_asset.h +++ b/generated/serdes_struct_world_update_op_shape_params_asset.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:418:0 +// src/engine/serdes.cpp:422:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_asset *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h index 43367e3c2..62fd8e389 100644 --- a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h +++ b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:420:0 +// src/engine/serdes.cpp:424:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_chunk_data *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_cylinder.h b/generated/serdes_struct_world_update_op_shape_params_cylinder.h new file mode 100644 index 000000000..a6717f274 --- /dev/null +++ b/generated/serdes_struct_world_update_op_shape_params_cylinder.h @@ -0,0 +1,100 @@ +// src/engine/serdes.cpp:420:0 + +link_internal bonsai_type_info +TypeInfo(world_update_op_shape_params_cylinder *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("world_update_op_shape_params_cylinder"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_cylinder *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + world_update_op_shape_params_cylinder *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->P0); // default + + + + + + + Result &= Serialize(Bytes, &Element->P1); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_cylinder *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_cylinder *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_cylinder *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->P0, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->P1, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_cylinder *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serdes_struct_world_update_op_shape_params_rect.h b/generated/serdes_struct_world_update_op_shape_params_rect.h index b97f678d7..daab8a5e8 100644 --- a/generated/serdes_struct_world_update_op_shape_params_rect.h +++ b/generated/serdes_struct_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:414:0 +// src/engine/serdes.cpp:416:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_rect *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_sphere.h b/generated/serdes_struct_world_update_op_shape_params_sphere.h index 7a31d5818..128d64c4d 100644 --- a/generated/serdes_struct_world_update_op_shape_params_sphere.h +++ b/generated/serdes_struct_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:416:0 +// src/engine/serdes.cpp:418:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_sphere *Ignored) diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 2b4e1dfe6..2a3332083 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:354:0 +// src/engine/editor.cpp:404:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index fb00654b0..6e6a9827e 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:180:0 +// src/engine/editor.cpp:230:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_enum.h b/generated/string_and_value_tables_enum.h index c889ab211..a6e9bf2c0 100644 --- a/generated/string_and_value_tables_enum.h +++ b/generated/string_and_value_tables_enum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:2398:0 +// src/engine/editor.cpp:2412:0 link_internal counted_string ToStringPrefixless(layer_toolbar_actions Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 268142585..ea0e24811 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:934:0 +// src/engine/editor.h:950:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index b5ac7e7fc..04279d9fd 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:174:0 +// src/engine/editor.cpp:224:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 83c26607a..1c9a3f391 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:171:0 +// src/engine/editor.cpp:221:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 5b3429395..22a6596ad 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:882:0 +// src/engine/editor.h:895:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 769580af0..fca336199 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:177:0 +// src/engine/editor.cpp:227:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/toolbar_for_enum_enum.h b/generated/toolbar_for_enum_enum.h index c1cab337c..90cb74af9 100644 --- a/generated/toolbar_for_enum_enum.h +++ b/generated/toolbar_for_enum_enum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:2400:0 +// src/engine/editor.cpp:2415:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, layer_toolbar_actions Selection) diff --git a/jesse.make.sh b/jesse.make.sh index 81197b57f..4a47e50e2 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index 64e9de86b..9d07b28dd 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -276,7 +276,7 @@ void main() #if 1 v3 Period = V3(200.f); float Amplitude = 150.f; - f32 StartingZDepth = 0.f; + f32 StartingZDepth = 800.f; NoiseValue = StartingZDepth; diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index df2b5077b..32575b428 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -1,6 +1,6 @@ #extension GL_ARB_explicit_uniform_location : enable -uniform v3 WorldspaceBasis; +uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; uniform int BrushType; @@ -23,6 +23,12 @@ uniform v3 ChunkRelEditMax; // uniform int ShapeType; +// +// Sphere Params +// +uniform v3 ChunkRelLocation; +uniform f32 Radius; + // // Noise params @@ -71,7 +77,7 @@ void main() xyz.y <= ChunkRelEditMax.y && xyz.z <= ChunkRelEditMax.z ) { - v3 Basis = WorldspaceBasis + xyz; + v3 Basis = WorldspaceChunkBasis + xyz; { @@ -109,13 +115,21 @@ void main() switch (ShapeType) { // ShapeType_Sphere - case 0: { } break; + case 0: + { + f32 Dist = distance(ChunkRelLocation, xyz); + if (Dist < Radius) { NoiseSample = 1.f; } + } break; // ShapeType_Rect case 1: { NoiseSample = 1.f; } break; // ShapeType_Cylinder case 2: { } break; + + // @dottedboxguy (Step6) Add more cases and implementations here + // for shape types added in Step 1 + // } } break; diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 8e310aa04..386453667 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -97,6 +97,7 @@ Bonsai_FrameBegin(engine_resources *Resources) if (VRChanged || + Resources->Graphics.WorldEditRC.Program.HotReloaded || Resources->Graphics.TerrainShapingRC.Program.HotReloaded || Resources->Graphics.TerrainDerivsRC.Program.HotReloaded || Resources->Graphics.TerrainDecorationRC.Program.HotReloaded) diff --git a/src/engine/canonical_position.cpp b/src/engine/canonical_position.cpp index 7a550fc16..2544414ee 100644 --- a/src/engine/canonical_position.cpp +++ b/src/engine/canonical_position.cpp @@ -76,3 +76,10 @@ SimSpaceToCanonical(world *World, rect3i *Rect) return Result; } +link_internal cp +GetCenter(world *World, rect3cp *Rect) +{ + cp Rad = GetRadius(Rect); + cp Result = CAdd(World, Rect->Min, Rad); + return Result; +} diff --git a/src/engine/canonical_position.h b/src/engine/canonical_position.h index e706e3ab9..384c77d2c 100644 --- a/src/engine/canonical_position.h +++ b/src/engine/canonical_position.h @@ -1,3 +1,4 @@ +struct world; struct canonical_position { @@ -144,10 +145,10 @@ Min(canonical_position P1, canonical_position P2) } #endif -inline canonical_position -operator-(canonical_position A, v3 B) +inline cp +operator-(cp A, v3 B) { - canonical_position Result = A; + cp Result = A; Result.Offset.x = A.Offset.x - B.x; Result.Offset.y = A.Offset.y - B.y; @@ -156,10 +157,10 @@ operator-(canonical_position A, v3 B) return Result; } -inline canonical_position -operator+(canonical_position A, v3 B) +inline cp +operator+(cp A, v3 B) { - canonical_position Result = A; + cp Result = A; Result.Offset.x = A.Offset.x + B.x; Result.Offset.y = A.Offset.y + B.y; @@ -168,42 +169,51 @@ operator+(canonical_position A, v3 B) return Result; } -inline canonical_position -operator/(canonical_position A, s32 Int) +inline cp +operator/(cp A, s32 Int) { - canonical_position Result = A; + cp Result = A; Result.Offset /= f32(Int); Result.WorldP /= Int; return Result; } -inline canonical_position& -operator+=(canonical_position& A, float B) +inline cp& +operator+=(cp& A, float B) { A.Offset += B; return(A); } -inline canonical_position& -operator+=(canonical_position& A, v3 B) +inline cp& +operator+=(cp& A, v3 B) { A.Offset += B; return(A); } -inline canonical_position& -operator+=(canonical_position& A, canonical_position B) +inline cp& +operator+=(cp& A, cp B) { A.Offset += B.Offset; A.WorldP += B.WorldP; return(A); } -inline canonical_position -operator-(canonical_position P1, canonical_position P2) +inline cp +operator+(cp P1, cp P2) { - canonical_position Result; + cp Result; + Result.Offset = P1.Offset + P2.Offset; + Result.WorldP = P1.WorldP + P2.WorldP; + return Result; +} + +inline cp +operator-(cp P1, cp P2) +{ + cp Result; Result.Offset = P1.Offset - P2.Offset; Result.WorldP = P1.WorldP - P2.WorldP; return Result; @@ -271,6 +281,16 @@ Rect3CP(rect3 *Rect) } /* poof(gen_rect_helpers(rect3cp, cp)) */ +/* #include */ + +link_internal cp +GetRadius(rect3cp *Rect) +{ + cp Dim = Rect->Max - Rect->Min; + cp Result = Dim/2; + return Result; +} + link_internal rect3cp RectMinMax(cp Min, cp Max) @@ -286,9 +306,11 @@ RectMinDim(v3i WorldChunkDim, cp Min, v3 Dim) return Result; } -struct world; +link_internal cp +GetCenter(world *World, rect3cp *Rect); + link_internal v3 -GetSimSpaceP(world *World, canonical_position P); +GetSimSpaceP(world *World, cp P); link_internal v3 GetDim(world *World, rect3cp Rect) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index ebb918057..177151683 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -135,6 +135,56 @@ poof(do_editor_ui_for_container(ui_toggle_hashtable)) +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +{ + if (Element) + { + if (ToggleButton(Ui, FSz("v %s", Element->Name), FSz("> %s", Element->Name), UiId(Window, "toggle shader_uniform", Element), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + { + PushNewRow(Ui); + + PushTableStart(Ui); + DoEditorUi(Ui, Window, &Element->Type, CSz("shader_uniform_type Type"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + switch (Element->Type) + { + InvalidCase(ShaderUniform_Undefined); + + case ShaderUniform_M4: { DoEditorUi(Ui, Window, Element->M4, CSz("M4"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; + case ShaderUniform_V2: { DoEditorUi(Ui, Window, Element->V2, CSz("V2"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; + case ShaderUniform_V3: { DoEditorUi(Ui, Window, Element->V3, CSz("V3"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; + case ShaderUniform_S32: { DoEditorUi(Ui, Window, Element->S32, CSz("S32"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; + case ShaderUniform_U32: { DoEditorUi(Ui, Window, Element->U32, CSz("U32"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; + case ShaderUniform_R32: { DoEditorUi(Ui, Window, Element->R32, CSz("R32"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; + case ShaderUniform_Texture: { DoEditorUi(Ui, Window, Element->Texture, CSz("Texture"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; + case ShaderUniform_Light: { DoEditorUi(Ui, Window, Element->Light, CSz("Light"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; + case ShaderUniform_Camera: { DoEditorUi(Ui, Window, Element->Camera, CSz("Camera"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; + } + + DoEditorUi(Ui, Window, &Element->ID, CSz("s32 ID"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushTableEnd(Ui); + PushNewRow(Ui); + + /* DoEditorUi(Ui, Window, Element->Next, CSz("shader_uniform Next"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); */ + } + } + else + { + PushColumn(Ui, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushColumn(Ui, CSz("(null)"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushNewRow(Ui); + } +} +poof(do_editor_ui_for_container(shader_uniform_buffer)) +#include + +poof(do_editor_ui_for_compound_type(shader)) +#include + +poof(do_editor_ui_for_container(shader_ptr_block_array)) +#include + + poof(do_editor_ui_for_compound_type(work_queue_entry)) #include @@ -366,49 +416,9 @@ poof(do_editor_ui_for_compound_type(entity_position_info)) #include -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) -{ - if (Element) - { - if (ToggleButton(Ui, FSz("v %s", Element->Name), FSz("> %s", Element->Name), UiId(Window, "toggle shader_uniform", Element), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) - { - PushNewRow(Ui); - - PushTableStart(Ui); - DoEditorUi(Ui, Window, &Element->Type, CSz("shader_uniform_type Type"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); - switch (Element->Type) - { - InvalidCase(ShaderUniform_Undefined); - - case ShaderUniform_M4: { DoEditorUi(Ui, Window, Element->M4, CSz("M4"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; - case ShaderUniform_V2: { DoEditorUi(Ui, Window, Element->V2, CSz("V2"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; - case ShaderUniform_V3: { DoEditorUi(Ui, Window, Element->V3, CSz("V3"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; - case ShaderUniform_S32: { DoEditorUi(Ui, Window, Element->S32, CSz("S32"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; - case ShaderUniform_U32: { DoEditorUi(Ui, Window, Element->U32, CSz("U32"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; - case ShaderUniform_R32: { DoEditorUi(Ui, Window, Element->R32, CSz("R32"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; - case ShaderUniform_Texture: { DoEditorUi(Ui, Window, Element->Texture, CSz("Texture"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; - case ShaderUniform_Light: { DoEditorUi(Ui, Window, Element->Light, CSz("Light"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; - case ShaderUniform_Camera: { DoEditorUi(Ui, Window, Element->Camera, CSz("Camera"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; - } - DoEditorUi(Ui, Window, &Element->ID, CSz("s32 ID"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); - PushTableEnd(Ui); - PushNewRow(Ui); - /* DoEditorUi(Ui, Window, Element->Next, CSz("shader_uniform Next"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); */ - } - } - else - { - PushColumn(Ui, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); - PushColumn(Ui, CSz("(null)"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); - PushNewRow(Ui); - } -} -poof(do_editor_ui_for_compound_type(shader)) -#include poof(do_editor_ui_for_compound_type(render_buffers_2d)) #include @@ -1028,6 +1038,9 @@ GetLayerDim(brush_layer *Layer) link_internal b32 CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *Preview) { + NotImplemented; + return False; +#if 0 UNPACK_ENGINE_RESOURCES(Engine); // Leaving this function here as a reference for what used to happen, but migrating the functionality @@ -1173,6 +1186,7 @@ CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, br } return UpdateVoxels; +#endif } link_internal void diff --git a/src/engine/editor.h b/src/engine/editor.h index dccf583ab..d9c99da0f 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -827,9 +827,19 @@ struct world_update_op_shape_params_chunk_data struct world_update_op_shape_params_sphere { cp Location; poof(@ui_disable) - f32 Radius = 10.f; poof(@ui_disable) + f32 Radius = 10.f; }; + +struct world_update_op_shape_params_cylinder +{ + v3 P0; + v3 P1; +}; + +// @dottedboxguy (Step2) Add new asset struct here +// + #if 0 struct world_edit_shape { @@ -878,6 +888,9 @@ enum shape_type ShapeType_Sphere, ShapeType_Rect, ShapeType_Cylinder, + + // @dottedboxguy (Step1) Add shape types here + // }; poof(string_and_value_tables(shape_type)) #include @@ -888,8 +901,12 @@ struct shape_layer // NOTE(Jesse): Intentionally not a d-union such that you can toggle between // them and your parameter selections stay intact. - world_update_op_shape_params_sphere Sphere; - world_update_op_shape_params_rect Rect; + world_update_op_shape_params_sphere Sphere; + world_update_op_shape_params_rect Rect; + world_update_op_shape_params_cylinder Cylinder; + + // @dottedboxguy (Step5) Add an instance of the new shape here + // f32 Threshold = 0.f; poof(@ui_value_range(0.f, 1.f)) }; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 443769d73..93a08c60d 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -400,6 +400,21 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); BindUniformByName(&WorldEditRC->Program, "Invert", Layer->Settings.Invert); + rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); + v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); + v3 EditRectRad = GetRadius(&SimEditRect); + + // NOTE(Jesse): Must call bind explicitly because the + // driver doesn't cache these values otherwise .. it + // just reads them whenever it wants through the pointer.. + v3 ChunkRelEditMin = SimEditRect.Min - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &ChunkRelEditMin); + AssertNoGlErrors; + + v3 Mx = SimEditRect.Max - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); + AssertNoGlErrors; + switch (Layer->Settings.Type) { case BrushLayerType_Noise: @@ -439,27 +454,27 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "Threshold", Shape->Threshold); switch(Shape->Type) { - case ShapeType_Sphere: { } break; - case ShapeType_Rect: { } break; + case ShapeType_Sphere: + { + auto Sphere = &Shape->Sphere; + + v3 SimSphereOrigin = GetSimSpaceP(World, Edit->Region.Min + EditRectRad); + v3 ChunkRelLocation = SimSphereOrigin - SimChunkMin; + + BindUniformByName(&WorldEditRC->Program, "ChunkRelLocation", &ChunkRelLocation); + BindUniformByName(&WorldEditRC->Program, "Radius", Sphere->Radius); + } break; + + case ShapeType_Rect: { /* No special uniforms needed for Rect .. */ } break; + case ShapeType_Cylinder: { } break; + + // @dottedboxguy (Step4) Calculate values and bind uniform variables for the new shape + // } } break; } - rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); - v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); - - // NOTE(Jesse): Must call bind explicitly because the driver doesn't cache - // these values otherwise .. it just reads then whenever it wants through - // the pointer.. - v3 Mn = SimEditRect.Min - SimChunkMin; - BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &Mn); - AssertNoGlErrors; - - v3 Mx = SimEditRect.Max - SimChunkMin; - BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); - AssertNoGlErrors; - /* gpu_timer Timer = StartGpuTimer(); */ RenderQuad(); diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index 7712b2dee..453dba38f 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -411,14 +411,19 @@ poof(serdes_struct(noise_layer_0)) #include poof(serdes_struct(noise_layer)) #include + poof(serdes_struct(world_update_op_shape_params_rect)) #include poof(serdes_struct(world_update_op_shape_params_sphere)) #include +poof(serdes_struct(world_update_op_shape_params_cylinder)) +#include poof(serdes_struct(world_update_op_shape_params_asset)) #include poof(serdes_struct(world_update_op_shape_params_chunk_data)) #include +// @dottedboxguy (Step3) Add new asset struct here to generate serialization code +// poof(serdes_struct(shape_layer)) #include From cf8d6d00054a68dd447415254a7c342e4e86e0f6 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 5 May 2025 16:53:38 -0700 Subject: [PATCH 226/421] Update logo style --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 60a31d11c..741da327f 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ -

    - +

    +

    # Welcome to Bonsai! From 7bfa90c44433af7e7096fe95a41bbc65f7e23ab7 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 5 May 2025 17:30:38 -0700 Subject: [PATCH 227/421] Rename WorldspaceBasis -> WorldspaceChunkBasis --- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...struct_terrain_decoration_render_context.h | 4 ++-- ...pe_struct_terrain_shaping_render_context.h | 4 ++-- ...nd_type_struct_world_edit_render_context.h | 4 ++-- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- generated/serdes_struct_brush_layer.h | 2 +- generated/serdes_struct_brush_settings.h | 2 +- generated/serdes_struct_brush_settings_0.h | 2 +- generated/serdes_struct_brush_settings_1.h | 2 +- generated/serdes_struct_brush_settings_2.h | 2 +- generated/serdes_struct_layered_brush.h | 2 +- generated/serdes_struct_shape_layer.h | 2 +- generated/serdes_struct_world_edit.h | 2 +- generated/serdes_struct_world_edit_brush.h | 2 +- ...truct_world_update_op_shape_params_asset.h | 2 +- ..._world_update_op_shape_params_chunk_data.h | 2 +- ...ct_world_update_op_shape_params_cylinder.h | 2 +- ...struct_world_update_op_shape_params_rect.h | 2 +- ...ruct_world_update_op_shape_params_sphere.h | 2 +- ...r_magic_struct_terrain_decoration_shader.h | 8 +++---- ...gic_struct_terrain_derivs_render_context.h | 2 +- ...c_struct_terrain_finalize_render_context.h | 2 +- ...ader_magic_struct_terrain_shaping_shader.h | 8 +++---- .../shader_magic_struct_world_edit_shader.h | 8 +++---- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- .../terrain_decoration.fragmentshader | 4 ++-- shaders/terrain/derivs.fragmentshader | 2 +- .../terrain/shaping/FBM_small.fragmentshader | 4 ++-- .../shaping/cliffy_hills.fragmentshader | 4 ++-- .../shaping/dottedboxguy_arch.fragmentshader | 4 ++-- .../terrain/shaping/gradient.fragmentshader | 4 ++-- .../terrain/shaping/mandlebulb.fragmentshader | 4 ++-- .../shaping/terrain_shaping.fragmentshader | 4 ++-- .../terrain/shaping/trunchet.fragmentshader | 4 ++-- .../terrain/shaping/voronoi.fragmentshader | 4 ++-- src/engine/graphics.h | 24 +++++++++---------- src/engine/render/render_init.cpp | 2 +- src/engine/render_loop.cpp | 4 ++-- 50 files changed, 82 insertions(+), 84 deletions(-) diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index f74bac793..df884578a 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1010:0 +// src/engine/editor.h:1011:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 4c8c5d78b..73ac7a8e5 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1187:0 +// src/engine/editor.h:1188:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 16a121940..61ecb92d2 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:132:0 +// src/engine/graphics.h:130:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index d9a671dab..634447412 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:121:0 +// src/engine/graphics.h:119:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 7a2a5eb09..f53ffe96e 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1202:0 +// src/engine/editor.h:1203:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 36bc0e96c..bfa5fd8e5 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1213:0 +// src/engine/editor.h:1214:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 896e37ec4..bb19e70db 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1205:0 +// src/engine/editor.h:1206:0 diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 7abc0b5e8..7f074c713 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1075:0 +// src/engine/editor.h:1076:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index b370d7d6e..a224742bc 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1068:0 +// src/engine/editor.h:1069:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index 71462fef2..fb44221be 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1061:0 +// src/engine/editor.h:1062:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index dcd51769c..958ae35dc 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:936:0 +// src/engine/editor.h:937:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 0270af993..80ddb3fd2 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -127,8 +127,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->WorldspaceBasis), - CSz("WorldspaceBasis"), + Cast(v3*, &Element->WorldspaceChunkBasis), + CSz("WorldspaceChunkBasis"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 095b51ac0..85f55fc49 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -111,8 +111,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->WorldspaceBasis), - CSz("WorldspaceBasis"), + Cast(v3*, &Element->WorldspaceChunkBasis), + CSz("WorldspaceChunkBasis"), Params ); diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 880de2afd..cda067833 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -115,8 +115,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3*, Element->WorldspaceBasis), - CSz("WorldspaceBasis"), + Cast(v3*, Element->WorldspaceChunkBasis), + CSz("WorldspaceChunkBasis"), Params ); diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index d822bb5bb..a51f040f3 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:952:0 +// src/engine/editor.h:953:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index 4111bcfba..b51bd35f4 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:118:0 +// src/engine/graphics.h:116:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 62d41242c..f30ac44fa 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1190:0 +// src/engine/editor.h:1191:0 struct world_edit_brush_linked_list_node { diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index 51830457a..4d839ba1c 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:439:0 +// src/engine/serdes.cpp:440:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index bf8d01e65..f00e4f500 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:436:0 +// src/engine/serdes.cpp:437:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) diff --git a/generated/serdes_struct_brush_settings_0.h b/generated/serdes_struct_brush_settings_0.h index fb835526f..29abebb0c 100644 --- a/generated/serdes_struct_brush_settings_0.h +++ b/generated/serdes_struct_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:430:0 +// src/engine/serdes.cpp:431:0 link_internal bonsai_type_info TypeInfo(brush_settings_0 *Ignored) diff --git a/generated/serdes_struct_brush_settings_1.h b/generated/serdes_struct_brush_settings_1.h index 4ae5db67e..4bb1250e3 100644 --- a/generated/serdes_struct_brush_settings_1.h +++ b/generated/serdes_struct_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:432:0 +// src/engine/serdes.cpp:433:0 link_internal bonsai_type_info TypeInfo(brush_settings_1 *Ignored) diff --git a/generated/serdes_struct_brush_settings_2.h b/generated/serdes_struct_brush_settings_2.h index a703a144e..d1845aa60 100644 --- a/generated/serdes_struct_brush_settings_2.h +++ b/generated/serdes_struct_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:434:0 +// src/engine/serdes.cpp:435:0 link_internal bonsai_type_info TypeInfo(brush_settings_2 *Ignored) diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index b69a9014a..999da198c 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:445:0 +// src/engine/serdes.cpp:446:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index 73980d6dc..a526aaf51 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:427:0 +// src/engine/serdes.cpp:428:0 link_internal bonsai_type_info TypeInfo(shape_layer *Ignored) diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index e04de5515..bb0a845be 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:451:0 +// src/engine/serdes.cpp:452:0 link_internal bonsai_type_info TypeInfo(world_edit *Ignored) diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index 2101d1be9..062ddfc44 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:448:0 +// src/engine/serdes.cpp:449:0 link_internal bonsai_type_info TypeInfo(world_edit_brush *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_asset.h b/generated/serdes_struct_world_update_op_shape_params_asset.h index 446b0d5e9..f3fc07283 100644 --- a/generated/serdes_struct_world_update_op_shape_params_asset.h +++ b/generated/serdes_struct_world_update_op_shape_params_asset.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:422:0 +// src/engine/serdes.cpp:421:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_asset *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h index 62fd8e389..3f803d596 100644 --- a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h +++ b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:424:0 +// src/engine/serdes.cpp:423:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_chunk_data *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_cylinder.h b/generated/serdes_struct_world_update_op_shape_params_cylinder.h index a6717f274..1233a1da5 100644 --- a/generated/serdes_struct_world_update_op_shape_params_cylinder.h +++ b/generated/serdes_struct_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:420:0 +// src/engine/serdes.cpp:419:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_cylinder *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_rect.h b/generated/serdes_struct_world_update_op_shape_params_rect.h index daab8a5e8..f9640f21e 100644 --- a/generated/serdes_struct_world_update_op_shape_params_rect.h +++ b/generated/serdes_struct_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:416:0 +// src/engine/serdes.cpp:415:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_rect *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_sphere.h b/generated/serdes_struct_world_update_op_shape_params_sphere.h index 128d64c4d..6e4faf683 100644 --- a/generated/serdes_struct_world_update_op_shape_params_sphere.h +++ b/generated/serdes_struct_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:418:0 +// src/engine/serdes.cpp:417:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_sphere *Ignored) diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index 9ee645bc7..2f271675c 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -1,7 +1,7 @@ -// src/engine/graphics.h:51:0 +// src/engine/graphics.h:49:0 link_internal void -InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Struct , texture *DerivsTex , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) +InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Struct , texture *DerivsTex , v3 ChunkDim , v3 WorldspaceChunkBasis , v3 ChunkResolution ) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/terrain_decoration.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); @@ -14,8 +14,8 @@ InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Str Struct->ChunkDim = ChunkDim; SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); - Struct->WorldspaceBasis = WorldspaceBasis; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceBasis, "WorldspaceBasis"); + Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); Struct->ChunkResolution = ChunkResolution; SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); diff --git a/generated/shader_magic_struct_terrain_derivs_render_context.h b/generated/shader_magic_struct_terrain_derivs_render_context.h index 1a77a74af..91dc1b6b7 100644 --- a/generated/shader_magic_struct_terrain_derivs_render_context.h +++ b/generated/shader_magic_struct_terrain_derivs_render_context.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:54:0 +// src/engine/graphics.h:52:0 link_internal void InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct , v3 Ignored ) diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index b8bea5d7b..1fd706119 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:88:0 +// src/engine/graphics.h:86:0 link_internal void InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct , texture *InputTex ) diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index 32d3f637a..9d3066fb1 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -1,7 +1,7 @@ -// src/engine/graphics.h:48:0 +// src/engine/graphics.h:46:0 link_internal void -InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct , v3 ChunkDim , v3 WorldspaceBasis , v3 ChunkResolution ) +InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct , v3 ChunkDim , v3 WorldspaceChunkBasis , v3 ChunkResolution ) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/terrain_shaping.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); @@ -11,8 +11,8 @@ InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct Struct->ChunkDim = ChunkDim; SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); - Struct->WorldspaceBasis = WorldspaceBasis; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceBasis, "WorldspaceBasis"); + Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); Struct->ChunkResolution = ChunkResolution; SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index f67a73242..f2dd31f66 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -1,7 +1,7 @@ -// src/engine/graphics.h:73:0 +// src/engine/graphics.h:71:0 link_internal void -InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *ChunkDim , v3 *WorldspaceBasis , v3 *ChunkResolution , s32 Type ) +InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *ChunkDim , v3 *WorldspaceChunkBasis , v3 *ChunkResolution , s32 Type ) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); @@ -11,8 +11,8 @@ InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *Chu Struct->ChunkDim = ChunkDim; SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkDim, "ChunkDim"); - Struct->WorldspaceBasis = WorldspaceBasis; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->WorldspaceBasis, "WorldspaceBasis"); + Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); Struct->ChunkResolution = ChunkResolution; SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkResolution, "ChunkResolution"); diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index ea0e24811..71d8d6924 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:950:0 +// src/engine/editor.h:951:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/shaders/terrain/decoration/terrain_decoration.fragmentshader b/shaders/terrain/decoration/terrain_decoration.fragmentshader index d8678eabe..327130081 100644 --- a/shaders/terrain/decoration/terrain_decoration.fragmentshader +++ b/shaders/terrain/decoration/terrain_decoration.fragmentshader @@ -1,6 +1,6 @@ #extension GL_ARB_explicit_uniform_location : enable -uniform v3 WorldspaceBasis; +uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; uniform layout(location = 0) sampler2D DerivsTex; @@ -176,7 +176,7 @@ void main() /* v3 Offset = V3(-1, -1, -1); */ v3 Offset = V3(0); - v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); ivec2 InputTexCoord = ivec2(gl_FragCoord.x + 1, (y + 1) + (z * 68) + 68 ); v4 TexLookup = texelFetch(InputTex, InputTexCoord, 0); diff --git a/shaders/terrain/derivs.fragmentshader b/shaders/terrain/derivs.fragmentshader index de4c38007..f226c2e89 100644 --- a/shaders/terrain/derivs.fragmentshader +++ b/shaders/terrain/derivs.fragmentshader @@ -1,4 +1,4 @@ -uniform v3 WorldspaceBasis; +uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; uniform sampler2D InputTex; diff --git a/shaders/terrain/shaping/FBM_small.fragmentshader b/shaders/terrain/shaping/FBM_small.fragmentshader index 26f46a677..5006cfb19 100644 --- a/shaders/terrain/shaping/FBM_small.fragmentshader +++ b/shaders/terrain/shaping/FBM_small.fragmentshader @@ -1,4 +1,4 @@ -uniform v3 WorldspaceBasis; +uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; in vec2 UV; @@ -13,7 +13,7 @@ void main() /* v3 Offset = V3(-1, -1, -1); */ v3 Offset = V3(0); - v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); // NOTE(Jesse): Set these in the -- user code -- section v3 ColorValue = V3(0.f); diff --git a/shaders/terrain/shaping/cliffy_hills.fragmentshader b/shaders/terrain/shaping/cliffy_hills.fragmentshader index 1502f8e3b..06e08ea14 100644 --- a/shaders/terrain/shaping/cliffy_hills.fragmentshader +++ b/shaders/terrain/shaping/cliffy_hills.fragmentshader @@ -1,4 +1,4 @@ -uniform v3 WorldspaceBasis; +uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; in vec2 UV; @@ -115,7 +115,7 @@ void main() /* v3 Offset = V3(-1, -1, -1); */ v3 Offset = V3(0); - v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); #if 0 { diff --git a/shaders/terrain/shaping/dottedboxguy_arch.fragmentshader b/shaders/terrain/shaping/dottedboxguy_arch.fragmentshader index 202ad7c1d..8738108ba 100644 --- a/shaders/terrain/shaping/dottedboxguy_arch.fragmentshader +++ b/shaders/terrain/shaping/dottedboxguy_arch.fragmentshader @@ -1,4 +1,4 @@ -uniform v3 WorldspaceBasis; +uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; in vec2 UV; @@ -92,7 +92,7 @@ void main() f32 y = floor(gl_FragCoord.y - (z*66)); v3 Offset = V3(-1, -1, -1); - v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); Basis *= .2; // NOTE(Jesse): Set these in the -- user code -- section diff --git a/shaders/terrain/shaping/gradient.fragmentshader b/shaders/terrain/shaping/gradient.fragmentshader index 2c558d39b..875dd9d07 100644 --- a/shaders/terrain/shaping/gradient.fragmentshader +++ b/shaders/terrain/shaping/gradient.fragmentshader @@ -1,4 +1,4 @@ -uniform v3 WorldspaceBasis; +uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; in vec2 UV; @@ -139,7 +139,7 @@ void main() f32 y = floor(gl_FragCoord.y - (z*66)); v3 Offset = V3(-1, -1, -1); - v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); // NOTE(Jesse): Set these in the -- user code -- section v3 ColorValue = V3(0.f); diff --git a/shaders/terrain/shaping/mandlebulb.fragmentshader b/shaders/terrain/shaping/mandlebulb.fragmentshader index a166b3e76..d476a3c92 100644 --- a/shaders/terrain/shaping/mandlebulb.fragmentshader +++ b/shaders/terrain/shaping/mandlebulb.fragmentshader @@ -1,4 +1,4 @@ -uniform v3 WorldspaceBasis; +uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; in vec2 UV; @@ -51,7 +51,7 @@ void main() f32 y = floor(gl_FragCoord.y - (z*66)); v3 Offset = V3(-1, -1, -1); - v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); // NOTE(Jesse): Set these in the -- user code -- section v3 ColorValue = V3(0.f); diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index 9d07b28dd..51492a551 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -1,4 +1,4 @@ -uniform v3 WorldspaceBasis; +uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; in vec2 UV; @@ -262,7 +262,7 @@ void main() f32 y = floor(gl_FragCoord.y - (z*68)); v3 Offset = V3(-2, -2, -2); - v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); // NOTE(Jesse): Set these in the -- user code -- section diff --git a/shaders/terrain/shaping/trunchet.fragmentshader b/shaders/terrain/shaping/trunchet.fragmentshader index 36ea14f18..9f7600a2a 100644 --- a/shaders/terrain/shaping/trunchet.fragmentshader +++ b/shaders/terrain/shaping/trunchet.fragmentshader @@ -1,4 +1,4 @@ -uniform v3 WorldspaceBasis; +uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; in vec2 UV; @@ -52,7 +52,7 @@ void main() f32 y = floor(gl_FragCoord.y - (z*66)); v3 Offset = V3(-1, -1, -1); - v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); Basis *= .2; // NOTE(Jesse): Set these in the -- user code -- section diff --git a/shaders/terrain/shaping/voronoi.fragmentshader b/shaders/terrain/shaping/voronoi.fragmentshader index 1220d9003..35a708383 100644 --- a/shaders/terrain/shaping/voronoi.fragmentshader +++ b/shaders/terrain/shaping/voronoi.fragmentshader @@ -1,4 +1,4 @@ -uniform v3 WorldspaceBasis; +uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; in vec2 UV; @@ -69,7 +69,7 @@ void main() f32 y = floor(gl_FragCoord.y - (z*66)); v3 Offset = V3(-1, -1, -1); - v3 Basis = Offset + WorldspaceBasis + (v3(x,y,z)*ChunkResolution); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); // NOTE(Jesse): Set these in the -- user code -- section v3 ColorValue = V3(0.f); diff --git a/src/engine/graphics.h b/src/engine/graphics.h index d3a22dce7..f2f3067a6 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -9,9 +9,9 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader texture DestTex; framebuffer DestFBO; - v3 ChunkDim; poof(@uniform) - v3 WorldspaceBasis; poof(@uniform) - v3 ChunkResolution; poof(@uniform) + v3 ChunkDim; poof(@uniform) + v3 WorldspaceChunkBasis; poof(@uniform) + v3 ChunkResolution; poof(@uniform) }; struct terrain_derivs_render_context @@ -24,8 +24,6 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader framebuffer DestFBO; v3 Ignored; poof(@uniform) - /* v3 WorldspaceBasis; poof(@uniform) */ - /* v3 ChunkResolution; poof(@uniform) */ }; struct terrain_decoration_render_context @@ -37,10 +35,10 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader texture *DestTex; framebuffer *DestFBO; - texture *DerivsTex ; poof(@uniform) - v3 ChunkDim; poof(@uniform) - v3 WorldspaceBasis; poof(@uniform) - v3 ChunkResolution; poof(@uniform) + texture *DerivsTex; poof(@uniform) + v3 ChunkDim; poof(@uniform) + v3 WorldspaceChunkBasis; poof(@uniform) + v3 ChunkResolution; poof(@uniform) }; @@ -63,11 +61,11 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader framebuffer PingPongFBOs[2]; texture PingPongTextures[2]; - v3 *ChunkDim; poof(@uniform) - v3 *WorldspaceBasis; poof(@uniform) - v3 *ChunkResolution; poof(@uniform) + v3 *ChunkDim; poof(@uniform) + v3 *WorldspaceChunkBasis; poof(@uniform) + v3 *ChunkResolution; poof(@uniform) - s32 Type; poof(@uniform) + s32 Type; poof(@uniform) }; poof(shader_magic(world_edit_render_context)) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index de12d2997..ac9f90931 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -727,7 +727,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr { { terrain_shaping_render_context *TerrainShapingRC = &Result->TerrainShapingRC; - InitializeWorldEditRenderContext(WorldEditRC, &TerrainShapingRC->ChunkDim, &TerrainShapingRC->WorldspaceBasis, &TerrainShapingRC->ChunkResolution, {}); + InitializeWorldEditRenderContext(WorldEditRC, &TerrainShapingRC->ChunkDim, &TerrainShapingRC->WorldspaceChunkBasis, &TerrainShapingRC->ChunkResolution, {}); } RangeIterator(Index, 2) diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 93a08c60d..64bbadc46 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -280,7 +280,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { auto *RC = &Graphics->TerrainShapingRC; - RC->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); + RC->WorldspaceChunkBasis = V3(Chunk->WorldP) * V3(64); RC->ChunkResolution = V3(Chunk->DimInChunks); TIMED_NAMED_BLOCK(TerrainDrawCall); @@ -326,7 +326,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { auto *RC = &Graphics->TerrainDecorationRC; - RC->WorldspaceBasis = V3(Chunk->WorldP) * V3(64); + RC->WorldspaceChunkBasis = V3(Chunk->WorldP) * V3(64); RC->ChunkResolution = V3(Chunk->DimInChunks); TIMED_NAMED_BLOCK(TerrainDrawCall); From cfed3f28626c373cd635f86a16ce1d8a655b6f30 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 6 May 2025 08:20:22 -0700 Subject: [PATCH 228/421] Remove manually programmed brush layers UI in favor of generated --- brushes/{eraser.brush => orb.brush} | Bin 833 -> 837 bytes brushes/{sphere.brush => perlin.brush} | Bin 833 -> 837 bytes generated/are_equal_brush_settings.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 183 ++- .../do_editor_ui_for_compound_type_asset.h | 98 +- .../do_editor_ui_for_compound_type_asset_id.h | 53 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 51 +- ...editor_ui_for_compound_type_bonsai_futex.h | 64 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 139 +- ..._editor_ui_for_compound_type_brush_layer.h | 32 +- ...itor_ui_for_compound_type_brush_settings.h | 244 ++- .../do_editor_ui_for_compound_type_camera.h | 359 +++-- ...o_editor_ui_for_compound_type_chunk_data.h | 163 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 51 +- ...tor_ui_for_compound_type_collision_event.h | 97 +- ..._editor_ui_for_compound_type_debug_state.h | 894 ++++++++--- ...editor_ui_for_compound_type_engine_debug.h | 625 +++++--- ...or_ui_for_compound_type_engine_resources.h | 581 ++++--- ...tor_ui_for_compound_type_engine_settings.h | 24 +- .../do_editor_ui_for_compound_type_entity.h | 318 ++-- ...do_editor_ui_for_compound_type_entity_id.h | 46 +- ...i_for_compound_type_entity_position_info.h | 97 +- ...ui_for_compound_type_file_traversal_node.h | 68 +- .../do_editor_ui_for_compound_type_frustum.h | 183 ++- ..._for_compound_type_g_buffer_render_group.h | 156 +- ..._editor_ui_for_compound_type_game_lights.h | 119 +- ...compound_type_gpu_element_buffer_handles.h | 178 ++- ..._compound_type_gpu_mapped_element_buffer.h | 53 +- .../do_editor_ui_for_compound_type_graphics.h | 807 +++++++--- ...r_ui_for_compound_type_graphics_settings.h | 119 +- .../do_editor_ui_for_compound_type_input.h | 1408 +++++++++++------ ..._editor_ui_for_compound_type_input_event.h | 40 +- .../do_editor_ui_for_compound_type_keyframe.h | 44 +- ...ditor_ui_for_compound_type_layered_brush.h | 151 +- ...editor_ui_for_compound_type_level_editor.h | 497 ++++-- ..._for_compound_type_lighting_render_group.h | 119 +- ...r_ui_for_compound_type_lighting_settings.h | 260 ++- ..._ui_for_compound_type_lod_element_buffer.h | 121 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 53 +- .../do_editor_ui_for_compound_type_model.h | 141 +- ..._editor_ui_for_compound_type_noise_layer.h | 97 +- ..._editor_ui_for_compound_type_octree_node.h | 235 ++- .../do_editor_ui_for_compound_type_particle.h | 110 +- ...tor_ui_for_compound_type_particle_system.h | 527 ++++-- ...ui_for_compound_type_perlin_noise_params.h | 68 +- .../do_editor_ui_for_compound_type_physics.h | 110 +- .../do_editor_ui_for_compound_type_plane.h | 66 +- .../do_editor_ui_for_compound_type_platform.h | 381 +++-- ...ditor_ui_for_compound_type_random_series.h | 22 +- .../do_editor_ui_for_compound_type_ray.h | 53 +- .../do_editor_ui_for_compound_type_rect3.h | 53 +- .../do_editor_ui_for_compound_type_rect3cp.h | 53 +- .../do_editor_ui_for_compound_type_rect3i.h | 53 +- ...r_ui_for_compound_type_render_buffers_2d.h | 185 ++- ...editor_ui_for_compound_type_render_debug.h | 90 +- ...tor_ui_for_compound_type_render_settings.h | 428 +++-- ..._editor_ui_for_compound_type_renderer_2d.h | 621 +++++--- .../do_editor_ui_for_compound_type_shader.h | 152 +- ..._editor_ui_for_compound_type_shape_layer.h | 137 +- ...struct_terrain_decoration_render_context.h | 195 ++- ...e_struct_terrain_finalize_render_context.h | 129 +- ...pe_struct_terrain_shaping_render_context.h | 173 +- ...r_ui_for_compound_type_struct_world_edit.h | 68 +- ...or_compound_type_struct_world_edit_brush.h | 85 +- ...nd_type_struct_world_edit_render_context.h | 208 ++- .../do_editor_ui_for_compound_type_texture.h | 172 +- .../do_editor_ui_for_compound_type_ui_debug.h | 134 +- .../do_editor_ui_for_compound_type_ui_id.h | 88 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 42 +- ...pound_type_untextured_3d_geometry_buffer.h | 206 ++- ...tor_ui_for_compound_type_vertex_material.h | 66 +- ...i_for_compound_type_voronoi_noise_params.h | 112 +- .../do_editor_ui_for_compound_type_vox_data.h | 24 +- .../do_editor_ui_for_compound_type_voxel.h | 46 +- ...itor_ui_for_compound_type_voxel_lighting.h | 24 +- ..._ui_for_compound_type_white_noise_params.h | 22 +- ...o_editor_ui_for_compound_type_work_queue.h | 95 +- ...or_ui_for_compound_type_work_queue_entry.h | 30 +- .../do_editor_ui_for_compound_type_world.h | 197 ++- ..._editor_ui_for_compound_type_world_chunk.h | 317 ++-- ..._for_compound_type_world_edit_paged_list.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 24 +- ...type_world_update_op_shape_params_sphere.h | 46 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- generated/serdes_struct_shape_layer.h | 15 + .../string_and_value_tables_asset_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- generated/string_and_value_tables_enum.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- generated/toolbar_for_enum_enum.h | 2 +- jesse.bonsai.rdbg | Bin 16384 -> 16885 bytes src/engine/editor.cpp | 186 +-- src/engine/editor.h | 157 +- 134 files changed, 10398 insertions(+), 4638 deletions(-) rename brushes/{eraser.brush => orb.brush} (61%) rename brushes/{sphere.brush => perlin.brush} (53%) diff --git a/brushes/eraser.brush b/brushes/orb.brush similarity index 61% rename from brushes/eraser.brush rename to brushes/orb.brush index 25a1838d91c99d2b7a3cce6bdbe1d0eda6bcfea5..326fb8c1fa9b73b6eb47d6a05cee8b6c3fb9b62a 100644 GIT binary patch delta 37 vcmV+=0NVe-2E_)DaRYC1Vv&LQk&q3OdI1cRwgMBgnE?#}lP&@nlez+j7s3sf delta 34 qcmX@gc93mCAzNxuVsUEG#KxZ!CvZ)!V&q|D+}zG6&p3G%(`*3jpA4e_ diff --git a/brushes/sphere.brush b/brushes/perlin.brush similarity index 53% rename from brushes/sphere.brush rename to brushes/perlin.brush index a16197a2125808769865c04b2375c8bed62126ba..4f5a598a7fcb4ce15e7e702b9a0ae702cfdb3a01 100644 GIT binary patch delta 55 zcmX@ec9d;GAx}YSQBG!_UQ$tMamK{PpA#prOs-<&nY@ijc=Alf>5K}K4Vg-r85lsc J=;U2Y?Ep<-6Bqyh delta 39 vcmX@gc93mCAzN`lMru*&#KxZ!CvZ)!V&q|DoZQa1l96GuAyet(RZO!1FW3%E diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index df884578a..e32fd4e4a 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1011:0 +// src/engine/editor.h:1022:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 8744c3abd..13526e95f 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:734:0 +// src/engine/editor.h:744:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 73ac7a8e5..ad8f9941b 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1188:0 +// src/engine/editor.h:1199:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index a05d43bbf..2a7a87642 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:569:0 +// src/engine/editor.h:579:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index f53ffe96e..12b72b6bf 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1203:0 +// src/engine/editor.h:1214:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index bfa5fd8e5..893930c4a 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1214:0 +// src/engine/editor.h:1225:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index bb19e70db..a1ef0f35a 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1206:0 +// src/engine/editor.h:1217:0 diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 7f074c713..096663bff 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1076:0 +// src/engine/editor.h:1087:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index a224742bc..ee4e87551 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1069:0 +// src/engine/editor.h:1080:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index fb44221be..8beba961a 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1062:0 +// src/engine/editor.h:1073:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 958ae35dc..d90eaecbb 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:937:0 +// src/engine/editor.h:948:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index eaa64b96f..dfda6de86 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->t), - CSz("t"), - Params - ); + + { + + + + cs MemberName = CSz("t"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->t), + MemberName, + Params + ); @@ -41,15 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->tEnd), - CSz("tEnd"), - Params - ); + + + { + + + + cs MemberName = CSz("tEnd"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->tEnd), + MemberName, + Params + ); @@ -57,16 +72,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->xKeyframeCount), - CSz("xKeyframeCount"), - Params - ); + + + { + + + + cs MemberName = CSz("xKeyframeCount"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->xKeyframeCount), + MemberName, + Params + ); @@ -74,16 +97,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(keyframe*, Element->xKeyframes), - CSz("xKeyframes"), - Params - ); + + + { + + + + cs MemberName = CSz("xKeyframes"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(keyframe*, Element->xKeyframes), + MemberName, + Params + ); @@ -91,16 +122,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->yKeyframeCount), - CSz("yKeyframeCount"), - Params - ); + + { + + + + cs MemberName = CSz("yKeyframeCount"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->yKeyframeCount), + MemberName, + Params + ); @@ -108,15 +146,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(keyframe*, Element->yKeyframes), - CSz("yKeyframes"), - Params - ); + + + { + + + + cs MemberName = CSz("yKeyframes"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(keyframe*, Element->yKeyframes), + MemberName, + Params + ); @@ -124,15 +171,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->zKeyframeCount), - CSz("zKeyframeCount"), - Params - ); + + + { + + + + cs MemberName = CSz("zKeyframeCount"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->zKeyframeCount), + MemberName, + Params + ); @@ -140,16 +195,32 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(keyframe*, Element->zKeyframes), - CSz("zKeyframes"), - Params - ); + + + { + + + + cs MemberName = CSz("zKeyframes"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(keyframe*, Element->zKeyframes), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 749f65e74..a930fb185 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(asset_load_state*, &Element->LoadState), - CSz("LoadState"), - Params - ); + + { + + + + cs MemberName = CSz("LoadState"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(asset_load_state*, &Element->LoadState), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(asset_id*, &Element->Id), - CSz("Id"), - Params - ); + { + + + + cs MemberName = CSz("Id"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(asset_id*, &Element->Id), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, &Element->LRUFrameIndex), - CSz("LRUFrameIndex"), - Params - ); + { + + + + cs MemberName = CSz("LRUFrameIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, &Element->LRUFrameIndex), + MemberName, + Params + ); @@ -73,15 +95,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(asset_type*, &Element->Type), - CSz("Type"), - Params - ); + + + { + + + + cs MemberName = CSz("Type"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(asset_type*, &Element->Type), + MemberName, + Params + ); @@ -89,9 +120,18 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r + } + + { + + + + cs MemberName = CSz("(anonymous)"); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 3c1d6664b..3dec154d6 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:401:0 +// src/engine/editor.cpp:398:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u16*, &Element->Index), - CSz("Index"), - Params - ); + + { + + + + cs MemberName = CSz("Index"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u16*, &Element->Index), + MemberName, + Params + ); @@ -41,15 +47,32 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(file_traversal_node*, &Element->FileNode), - CSz("FileNode"), - Params - ); + + + { + + + + cs MemberName = CSz("FileNode"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(file_traversal_node*, &Element->FileNode), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 54cd12269..f9711c82d 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->Texture), - CSz("Texture"), - Params - ); + + { + + + + cs MemberName = CSz("Texture"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->Texture), + MemberName, + Params + ); @@ -41,14 +47,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(camera*, &Element->Camera), - CSz("Camera"), - Params - ); + + { + + + + cs MemberName = CSz("Camera"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(camera*, &Element->Camera), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 3ab510f44..f4a03009c 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->SignalValue), - CSz("SignalValue"), - Params - ); + + { + + + + cs MemberName = CSz("SignalValue"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->SignalValue), + MemberName, + Params + ); @@ -41,15 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->ThreadsWaiting), - CSz("ThreadsWaiting"), - Params - ); + + + { + + + + cs MemberName = CSz("ThreadsWaiting"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->ThreadsWaiting), + MemberName, + Params + ); @@ -57,20 +72,29 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->Initialized), - CSz("Initialized"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("Initialized"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Initialized), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 1ccc7ffd2..9e025c8cb 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(os*, &Element->Os), - CSz("Os"), - Params - ); + + { + + + + cs MemberName = CSz("Os"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(os*, &Element->Os), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(platform*, &Element->Plat), - CSz("Plat"), - Params - ); + { + + + + cs MemberName = CSz("Plat"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(platform*, &Element->Plat), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(thread_local_state*, Element->ThreadStates), - CSz("ThreadStates"), - Params - ); + { + + + + cs MemberName = CSz("ThreadStates"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(thread_local_state*, Element->ThreadStates), + MemberName, + Params + ); @@ -73,15 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture_block_array*, &Element->AllTextures), - CSz("AllTextures"), - Params - ); + { + + + + cs MemberName = CSz("AllTextures"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture_block_array*, &Element->AllTextures), + MemberName, + Params + ); @@ -89,15 +119,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader_ptr_block_array*, &Element->AllShaders), - CSz("AllShaders"), - Params - ); + { + + + + cs MemberName = CSz("AllShaders"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader_ptr_block_array*, &Element->AllShaders), + MemberName, + Params + ); @@ -105,14 +143,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(debug_state*, &Element->DebugState), - CSz("DebugState"), - Params - ); + + { + + + + cs MemberName = CSz("DebugState"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(debug_state*, &Element->DebugState), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 09c41a37e..f00c2456f 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:315:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(brush_settings*, &Element->Settings), - CSz("Settings"), - Params - ); + + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(brush_settings*, &Element->Settings), + MemberName, + Params + ); @@ -41,8 +47,18 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name + } + + + { + + + + cs MemberName = CSz("PrevSettings"); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index b1d5c7662..bd9ea8e88 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:114:0 +// src/engine/editor.cpp:115:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(brush_layer_type*, &Element->Type), - CSz("Type"), - Params - ); + + { + + + + cs MemberName = CSz("BrushType"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(brush_layer_type*, &Element->Type), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(noise_layer*, &Element->Noise), - CSz("Noise"), - Params - ); + if (Element->Type == BrushLayerType_Noise) + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(noise_layer*, &Element->Noise), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shape_layer*, &Element->Shape), - CSz("Shape"), - Params - ); + if (Element->Type == BrushLayerType_Shape) + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shape_layer*, &Element->Shape), + MemberName, + Params + ); @@ -73,15 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode*, &Element->Mode), - CSz("Mode"), - Params - ); + { + + + + cs MemberName = CSz("Mode"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_blend_mode*, &Element->Mode), + MemberName, + Params + ); @@ -89,15 +119,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode_modifier*, &Element->Modifier), - CSz("Modifier"), - Params - ); + { + + + + cs MemberName = CSz("Modifier"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_blend_mode_modifier*, &Element->Modifier), + MemberName, + Params + ); @@ -105,14 +143,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_color_blend_mode*, &Element->ColorMode), - CSz("ColorMode"), - Params - ); + + + { + + + + cs MemberName = CSz("ColorMode"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_color_blend_mode*, &Element->ColorMode), + MemberName, + Params + ); @@ -120,15 +167,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->Iterations), - CSz("Iterations"), - Params - ); + + + { + + + + cs MemberName = CSz("Iterations"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->Iterations), + MemberName, + Params + ); @@ -136,16 +191,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(rect3i*, &Element->Offset), - CSz("Offset"), - Params - ); + + + { + + + + cs MemberName = CSz("Offset"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(rect3i*, &Element->Offset), + MemberName, + Params + ); @@ -153,16 +216,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->NoiseBasisOffset), - CSz("NoiseBasisOffset"), - Params - ); + + { + + + + cs MemberName = CSz("NoiseBasisOffset"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*, &Element->NoiseBasisOffset), + MemberName, + Params + ); @@ -170,15 +240,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->HSVColor), - CSz("HSVColor"), - Params - ); + { + + + + cs MemberName = CSz("HSVColor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->HSVColor), + MemberName, + Params + ); @@ -186,14 +264,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->Invert), - CSz("Invert"), - Params - ); + + + { + + + + cs MemberName = CSz("Invert"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->Invert), + MemberName, + Params + ); @@ -201,6 +288,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 66ece8802..4d00af101 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(frustum*, &Element->Frust), - CSz("Frust"), - Params - ); + + { + + + + cs MemberName = CSz("Frust"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(frustum*, &Element->Frust), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*, &Element->CurrentP), - CSz("CurrentP"), - Params - ); + { + + + + cs MemberName = CSz("CurrentP"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cp*, &Element->CurrentP), + MemberName, + Params + ); @@ -57,14 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->RenderSpacePosition), - CSz("RenderSpacePosition"), - Params - ); + + { + + + + cs MemberName = CSz("RenderSpacePosition"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->RenderSpacePosition), + MemberName, + Params + ); @@ -72,16 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Pitch), - CSz("Pitch"), - Params - ); + + { + + + + cs MemberName = CSz("Pitch"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Pitch), + MemberName, + Params + ); @@ -89,15 +119,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Roll), - CSz("Roll"), - Params - ); + + + { + + + + cs MemberName = CSz("Roll"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Roll), + MemberName, + Params + ); @@ -105,16 +144,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Yaw), - CSz("Yaw"), - Params - ); + + + { + + + + cs MemberName = CSz("Yaw"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Yaw), + MemberName, + Params + ); @@ -122,17 +169,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->DistanceFromTarget), - CSz("DistanceFromTarget"), - Params - ); + + { + + + + cs MemberName = CSz("DistanceFromTarget"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->DistanceFromTarget), + MemberName, + Params + ); @@ -140,16 +194,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->TargetPitch), - CSz("TargetPitch"), - Params - ); + + { + + + + cs MemberName = CSz("TargetPitch"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->TargetPitch), + MemberName, + Params + ); @@ -157,15 +219,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->TargetRoll), - CSz("TargetRoll"), - Params - ); + + + { + + + + cs MemberName = CSz("TargetRoll"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->TargetRoll), + MemberName, + Params + ); @@ -173,16 +244,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->TargetYaw), - CSz("TargetYaw"), - Params - ); + + + { + + + + cs MemberName = CSz("TargetYaw"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->TargetYaw), + MemberName, + Params + ); @@ -190,17 +269,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->TargetDistanceFromTarget), - CSz("TargetDistanceFromTarget"), - Params - ); + + { + + + + cs MemberName = CSz("TargetDistanceFromTarget"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->TargetDistanceFromTarget), + MemberName, + Params + ); @@ -208,15 +294,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Blend), - CSz("Blend"), - Params - ); + + + { + + + + cs MemberName = CSz("Blend"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Blend), + MemberName, + Params + ); @@ -224,16 +319,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Front), - CSz("Front"), - Params - ); + + + { + + + + cs MemberName = CSz("Front"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Front), + MemberName, + Params + ); @@ -241,15 +344,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Right), - CSz("Right"), - Params - ); + + + { + + + + cs MemberName = CSz("Right"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Right), + MemberName, + Params + ); @@ -257,15 +368,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Up), - CSz("Up"), - Params - ); + + + { + + + + cs MemberName = CSz("Up"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Up), + MemberName, + Params + ); @@ -273,15 +392,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(entity_id*, &Element->GhostId), - CSz("GhostId"), - Params - ); + + + { + + + + cs MemberName = CSz("GhostId"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(entity_id*, &Element->GhostId), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 0315da3e3..f9cf1f7f3 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:342:0 +// src/engine/editor.cpp:339:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(chunk_flag*, &Element->Flags), - CSz("Flags"), - Params - ); + + { + + + + cs MemberName = CSz("Flags"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(chunk_flag*, &Element->Flags), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->Dim), - CSz("Dim"), - Params - ); + { + + + + cs MemberName = CSz("Dim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*, &Element->Dim), + MemberName, + Params + ); @@ -57,14 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, Element->Occupancy), - CSz("Occupancy"), - Params - ); + + { + + + + cs MemberName = CSz("Occupancy"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, Element->Occupancy), + MemberName, + Params + ); @@ -72,16 +95,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, Element->xOccupancyBorder), - CSz("xOccupancyBorder"), - Params - ); + + + { + + + + cs MemberName = CSz("xOccupancyBorder"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, Element->xOccupancyBorder), + MemberName, + Params + ); @@ -89,16 +120,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, Element->FaceMasks), - CSz("FaceMasks"), - Params - ); + + + { + + + + cs MemberName = CSz("FaceMasks"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, Element->FaceMasks), + MemberName, + Params + ); @@ -106,16 +145,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(voxel*, Element->Voxels), - CSz("Voxels"), - Params - ); + + + { + + + + cs MemberName = CSz("Voxels"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(voxel*, Element->Voxels), + MemberName, + Params + ); @@ -123,15 +170,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(voxel_lighting*, Element->VoxelLighting), - CSz("VoxelLighting"), - Params - ); + + + { + + + + cs MemberName = CSz("VoxelLighting"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(voxel_lighting*, Element->VoxelLighting), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index c660ba2eb..92611ca10 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_chunk*, &Element->Chunk), - CSz("Chunk"), - Params - ); + + { + + + + cs MemberName = CSz("Chunk"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_chunk*, &Element->Chunk), + MemberName, + Params + ); @@ -41,14 +47,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(asset_thumbnail*, &Element->Thumbnail), - CSz("Thumbnail"), - Params - ); + + { + + + + cs MemberName = CSz("Thumbnail"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(asset_thumbnail*, &Element->Thumbnail), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 782d1267d..a228d0b8a 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:412:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->FrameIndex), - CSz("FrameIndex"), - Params - ); + + { + + + + cs MemberName = CSz("FrameIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->FrameIndex), + MemberName, + Params + ); @@ -41,16 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->Count), - CSz("Count"), - Params - ); + + { + + + + cs MemberName = CSz("Count"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->Count), + MemberName, + Params + ); @@ -58,15 +72,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*, &Element->MinP), - CSz("MinP"), - Params - ); + + + { + + + + cs MemberName = CSz("MinP"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cp*, &Element->MinP), + MemberName, + Params + ); @@ -74,15 +97,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*, &Element->MaxP), - CSz("MaxP"), - Params - ); + + + { + + + + cs MemberName = CSz("MaxP"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cp*, &Element->MaxP), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index bb5d9b8d1..6685fabc8 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -26,28 +26,42 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->Initialized), - CSz("Initialized"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("Initialized"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Initialized), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->UIType), - CSz("UIType"), - Params - ); + + { + + + + cs MemberName = CSz("UIType"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->UIType), + MemberName, + Params + ); @@ -55,16 +69,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, &Element->BytesBufferedToCard), - CSz("BytesBufferedToCard"), - Params - ); + + { + + + + cs MemberName = CSz("BytesBufferedToCard"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, &Element->BytesBufferedToCard), + MemberName, + Params + ); @@ -72,30 +94,46 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->DebugDoScopeProfiling), - CSz("DebugDoScopeProfiling"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("DebugDoScopeProfiling"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->DebugDoScopeProfiling), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, &Element->NumScopes), - CSz("NumScopes"), - Params - ); + + { + + + + cs MemberName = CSz("NumScopes"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, &Element->NumScopes), + MemberName, + Params + ); @@ -103,16 +141,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->DrawCallCountLastFrame), - CSz("DrawCallCountLastFrame"), - Params - ); + + { + + + + cs MemberName = CSz("DrawCallCountLastFrame"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->DrawCallCountLastFrame), + MemberName, + Params + ); @@ -120,16 +166,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->VertexCountLastFrame), - CSz("VertexCountLastFrame"), - Params - ); + + { + + + + cs MemberName = CSz("VertexCountLastFrame"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->VertexCountLastFrame), + MemberName, + Params + ); @@ -137,111 +191,321 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(picked_world_chunk*, Element->PickedChunk), - CSz("PickedChunk"), - Params - ); + + { + + + + cs MemberName = CSz("FrameEnd"); + + } + + + { + + + + cs MemberName = CSz("FrameBegin"); + + } + + + { + + + + cs MemberName = CSz("RegisterArena"); + + } + + + { + + + + cs MemberName = CSz("UnregisterArena"); + + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(picked_world_chunk*, Element->HoverChunk), - CSz("HoverChunk"), - Params - ); + + { + + + + cs MemberName = CSz("WorkerThreadAdvanceDebugSystem"); + + } + + + { + + + + cs MemberName = CSz("MainThreadAdvanceDebugSystem"); + + } + + + { + + + + cs MemberName = CSz("MutexWait"); + + } + + + { + + + + cs MemberName = CSz("MutexAquired"); + + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(debug_thread_state*, Element->ThreadStates), - CSz("ThreadStates"), - Params - ); + + { + + + + cs MemberName = CSz("MutexReleased"); + + } + + + { + + + + cs MemberName = CSz("GetProfileScope"); + + } + + + { + + + + cs MemberName = CSz("Debug_Allocate"); + + } + + + { + + + + cs MemberName = CSz("RegisterThread"); + + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*, Element->MetaTableNameStringsArena), - CSz("MetaTableNameStringsArena"), - Params - ); + + { + + + + cs MemberName = CSz("WriteMemoryRecord"); + + } + + + + { + + + + cs MemberName = CSz("ClearMemoryRecordsFor"); + + } + + + + { + + + + cs MemberName = CSz("TrackDrawCall"); + + } + + + { + + + + cs MemberName = CSz("GetThreadLocalState"); + + } + + + { + + + + cs MemberName = CSz("DebugValue_r32"); + + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(renderer_2d*, Element->UiGroup), - CSz("UiGroup"), - Params - ); + + { + + + + cs MemberName = CSz("DebugValue_u32"); + + } + + + { + + + + cs MemberName = CSz("DebugValue_u64"); + + } + + + { + + + + cs MemberName = CSz("DumpScopeTreeDataToConsole"); + + } + + + { + + + + cs MemberName = CSz("OpenAndInitializeDebugWindow"); + + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(untextured_3d_geometry_buffer*, &Element->LineMesh), - CSz("LineMesh"), - Params - ); + + + { + + + + cs MemberName = CSz("ProcessInputAndRedrawWindow"); + + } + + + + { + + + + cs MemberName = CSz(""); + + } + + + { + + + + cs MemberName = CSz(""); + + } + + + { + + + + cs MemberName = CSz(""); + + } + + + { + + + + cs MemberName = CSz("GetReadScopeTree"); + + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(selected_arenas*, Element->SelectedArenas), - CSz("SelectedArenas"), - Params - ); + + + { + + + + cs MemberName = CSz("GetWriteScopeTree"); + + } + + + + + { + + + + cs MemberName = CSz("PickedChunk"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(picked_world_chunk*, Element->PickedChunk), + MemberName, + Params + ); @@ -249,45 +513,71 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + } - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->DisplayDebugMenu), - CSz("DisplayDebugMenu"), - &DefaultUiRenderParams_Checkbox - ); + + { + + + + cs MemberName = CSz("HoverChunk"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(picked_world_chunk*, Element->HoverChunk), + MemberName, + Params + ); - PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(debug_profile_scope*, Element->HotFunction), - CSz("HotFunction"), - Params - ); + } + + + + { + + + + cs MemberName = CSz("ThreadStates"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(debug_thread_state*, Element->ThreadStates), + MemberName, + Params + ); + + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64_cursor*, &Element->HistogramSamples), - CSz("HistogramSamples"), - Params - ); + + + { + + + + cs MemberName = CSz("MetaTableNameStringsArena"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(memory_arena*, Element->MetaTableNameStringsArena), + MemberName, + Params + ); @@ -295,15 +585,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(bonsai_futex*, &Element->HistogramFutex), - CSz("HistogramFutex"), - Params - ); + + + { + + + + cs MemberName = CSz("UiGroup"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(renderer_2d*, Element->UiGroup), + MemberName, + Params + ); @@ -311,15 +609,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(debug_profile_scope*, &Element->FreeScopeSentinel), - CSz("FreeScopeSentinel"), - Params - ); + + + { + + + + cs MemberName = CSz("LineMesh"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(untextured_3d_geometry_buffer*, &Element->LineMesh), + MemberName, + Params + ); @@ -327,16 +633,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(umm*, &Element->MinCycles), - CSz("MinCycles"), - Params - ); + + { + + + + cs MemberName = CSz("SelectedArenas"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(selected_arenas*, Element->SelectedArenas), + MemberName, + Params + ); @@ -344,50 +657,141 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - PushNewRow(Ui); + } + + + + { + + + + cs MemberName = CSz("DisplayDebugMenu"); DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(umm*, &Element->MaxCycles), - CSz("MaxCycles"), - Params - ); + Window, + Cast(b8*, &Element->DisplayDebugMenu), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("HotFunction"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(debug_profile_scope*, Element->HotFunction), + MemberName, + Params + ); + + - PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v Frames[(128)]"), CSz("> Frames[(128)]"), UiId(Window, "toggle debug_state frame_stats Frames", Element->Frames), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, (128)) - { - DoEditorUi(Ui, Window, Element->Frames+ArrayIndex, FSz("Frames[%d]", ArrayIndex), Params); - - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushNewRow(Ui); + + + + + { + + + + cs MemberName = CSz("HistogramSamples"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64_cursor*, &Element->HistogramSamples), + MemberName, + Params + ); + + + + + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->ReadScopeIndex), - CSz("ReadScopeIndex"), - Params - ); + + + { + + + + cs MemberName = CSz("HistogramFutex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bonsai_futex*, &Element->HistogramFutex), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("FreeScopeSentinel"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(debug_profile_scope*, &Element->FreeScopeSentinel), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("MinCycles"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(umm*, &Element->MinCycles), + MemberName, + Params + ); @@ -395,16 +799,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->FreeScopeCount), - CSz("FreeScopeCount"), - Params - ); + + + { + + + + cs MemberName = CSz("MaxCycles"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(umm*, &Element->MaxCycles), + MemberName, + Params + ); @@ -412,40 +824,142 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + } PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v RegisteredMemoryArenas[(1024)]"), CSz("> RegisteredMemoryArenas[(1024)]"), UiId(Window, "toggle debug_state registered_memory_arena RegisteredMemoryArenas", Element->RegisteredMemoryArenas), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, (1024)) - { - DoEditorUi(Ui, Window, Element->RegisteredMemoryArenas+ArrayIndex, FSz("RegisteredMemoryArenas[%d]", ArrayIndex), Params); + + + { + + + + cs MemberName = CSz("Frames"); + - + if (ToggleButton(Ui, CSz("v Frames[(128)]"), CSz("> Frames[(128)]"), UiId(Window, "toggle debug_state frame_stats Frames", Element->Frames), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, (128)) + { + DoEditorUi(Ui, Window, Element->Frames+ArrayIndex, FSz("Frames[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + + + } - PushNewRow(Ui); + + + + + { + + + + cs MemberName = CSz("ReadScopeIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->ReadScopeIndex), + MemberName, + Params + ); + + + + } + + PushNewRow(Ui); + - if (ToggleButton(Ui, CSz("v TrackedDrawCalls[(4096)]"), CSz("> TrackedDrawCalls[(4096)]"), UiId(Window, "toggle debug_state debug_draw_call TrackedDrawCalls", Element->TrackedDrawCalls), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, (4096)) + + { + + + + cs MemberName = CSz("FreeScopeCount"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->FreeScopeCount), + MemberName, + Params + ); + + + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("RegisteredMemoryArenas"); + + + if (ToggleButton(Ui, CSz("v RegisteredMemoryArenas[(1024)]"), CSz("> RegisteredMemoryArenas[(1024)]"), UiId(Window, "toggle debug_state registered_memory_arena RegisteredMemoryArenas", Element->RegisteredMemoryArenas), Params )) { - DoEditorUi(Ui, Window, Element->TrackedDrawCalls+ArrayIndex, FSz("TrackedDrawCalls[%d]", ArrayIndex), Params); + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, (1024)) + { + DoEditorUi(Ui, Window, Element->RegisteredMemoryArenas+ArrayIndex, FSz("RegisteredMemoryArenas[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + } + + + + + { + + + + cs MemberName = CSz("TrackedDrawCalls"); + - + if (ToggleButton(Ui, CSz("v TrackedDrawCalls[(4096)]"), CSz("> TrackedDrawCalls[(4096)]"), UiId(Window, "toggle debug_state debug_draw_call TrackedDrawCalls", Element->TrackedDrawCalls), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, (4096)) + { + DoEditorUi(Ui, Window, Element->TrackedDrawCalls+ArrayIndex, FSz("TrackedDrawCalls[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + + + } - PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 1f9cf74ff..10524d222 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:459:0 +// src/engine/editor.cpp:456:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*, Element->Memory), - CSz("Memory"), - Params - ); + + { + + + + cs MemberName = CSz("Memory"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(memory_arena*, Element->Memory), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(engine_debug_view_mode*, &Element->ViewMode), - CSz("ViewMode"), - Params - ); + { + + + + cs MemberName = CSz("ViewMode"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(engine_debug_view_mode*, &Element->ViewMode), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(picked_world_chunk_static_buffer*, &Element->PickedChunks), - CSz("PickedChunks"), - Params - ); + { + + + + cs MemberName = CSz("PickedChunks"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(picked_world_chunk_static_buffer*, &Element->PickedChunks), + MemberName, + Params + ); @@ -73,15 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture_ptr_block_array*, &Element->Textures), - CSz("Textures"), - Params - ); + { + + + + cs MemberName = CSz("Textures"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture_ptr_block_array*, &Element->Textures), + MemberName, + Params + ); @@ -89,15 +119,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(ui_debug*, &Element->UiDebug), - CSz("UiDebug"), - Params - ); + { + + + + cs MemberName = CSz("UiDebug"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(ui_debug*, &Element->UiDebug), + MemberName, + Params + ); @@ -105,15 +143,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(render_debug*, &Element->Render), - CSz("Render"), - Params - ); + { + + + + cs MemberName = CSz("Render"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(render_debug*, &Element->Render), + MemberName, + Params + ); @@ -121,15 +167,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->DrawEntityCollisionVolumes), - CSz("DrawEntityCollisionVolumes"), - Params - ); + { + + + + cs MemberName = CSz("DrawEntityCollisionVolumes"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->DrawEntityCollisionVolumes), + MemberName, + Params + ); @@ -137,16 +191,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->DrawWorldAxies), - CSz("DrawWorldAxies"), - Params - ); + + { + + + + cs MemberName = CSz("DrawWorldAxies"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->DrawWorldAxies), + MemberName, + Params + ); @@ -154,15 +216,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->TriggerRuntimeBreak), - CSz("TriggerRuntimeBreak"), - Params - ); + + + { + + + + cs MemberName = CSz("TriggerRuntimeBreak"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->TriggerRuntimeBreak), + MemberName, + Params + ); @@ -170,16 +241,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->ResetAssetNodeView), - CSz("ResetAssetNodeView"), - Params - ); + + + { + + + + cs MemberName = CSz("ResetAssetNodeView"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->ResetAssetNodeView), + MemberName, + Params + ); @@ -187,16 +266,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->DrawBranchNodesWithMeshes), - CSz("DrawBranchNodesWithMeshes"), - Params - ); + + + { + + + + cs MemberName = CSz("DrawBranchNodesWithMeshes"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->DrawBranchNodesWithMeshes), + MemberName, + Params + ); @@ -204,16 +291,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->DrawBranchNodes), - CSz("DrawBranchNodes"), - Params - ); + + + { + + + + cs MemberName = CSz("DrawBranchNodes"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->DrawBranchNodes), + MemberName, + Params + ); @@ -221,16 +316,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->DrawLeafNodes), - CSz("DrawLeafNodes"), - Params - ); + + + { + + + + cs MemberName = CSz("DrawLeafNodes"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->DrawLeafNodes), + MemberName, + Params + ); @@ -238,17 +341,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->DrawNodesWithChunks), - CSz("DrawNodesWithChunks"), - Params - ); + + { + + + + cs MemberName = CSz("DrawNodesWithChunks"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->DrawNodesWithChunks), + MemberName, + Params + ); @@ -256,16 +366,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->DrawQueuedNodes), - CSz("DrawQueuedNodes"), - Params - ); + + { + + + + cs MemberName = CSz("DrawQueuedNodes"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->DrawQueuedNodes), + MemberName, + Params + ); @@ -273,15 +391,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->MarkChunkBorderVoxels), - CSz("MarkChunkBorderVoxels"), - Params - ); + + + { + + + + cs MemberName = CSz("MarkChunkBorderVoxels"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->MarkChunkBorderVoxels), + MemberName, + Params + ); @@ -289,16 +416,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->DrawGameCameraLocation), - CSz("DrawGameCameraLocation"), - Params - ); + + + { + + + + cs MemberName = CSz("DrawGameCameraLocation"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->DrawGameCameraLocation), + MemberName, + Params + ); @@ -306,16 +441,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r64*, &Element->ChunkGenTimeElapsedMS), - CSz("ChunkGenTimeElapsedMS"), - Params - ); + + + { + + + + cs MemberName = CSz("ChunkGenTimeElapsedMS"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r64*, &Element->ChunkGenTimeElapsedMS), + MemberName, + Params + ); @@ -323,16 +466,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, &Element->CellsGenerated), - CSz("CellsGenerated"), - Params - ); + + + { + + + + cs MemberName = CSz("CellsGenerated"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, &Element->CellsGenerated), + MemberName, + Params + ); @@ -340,17 +491,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r64*, &Element->ChunkGenCyclesElapsed), - CSz("ChunkGenCyclesElapsed"), - Params - ); + + { + + + + cs MemberName = CSz("ChunkGenCyclesElapsed"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r64*, &Element->ChunkGenCyclesElapsed), + MemberName, + Params + ); @@ -358,15 +516,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u8*, &Element->PickedChunkState), - CSz("PickedChunkState"), - Params - ); + + + { + + + + cs MemberName = CSz("PickedChunkState"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u8*, &Element->PickedChunkState), + MemberName, + Params + ); @@ -374,17 +541,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(octree_node*, Element->PickedNode), - CSz("PickedNode"), - Params - ); + + { + + + + cs MemberName = CSz("PickedNode"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node*, Element->PickedNode), + MemberName, + Params + ); @@ -392,15 +566,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(asset_window_view_mode*, &Element->AssetWindowViewMode), - CSz("AssetWindowViewMode"), - Params - ); + { + + + + cs MemberName = CSz("AssetWindowViewMode"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(asset_window_view_mode*, &Element->AssetWindowViewMode), + MemberName, + Params + ); @@ -408,14 +590,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(asset_id*, &Element->SelectedAsset), - CSz("SelectedAsset"), - Params - ); + + + { + + + + cs MemberName = CSz("SelectedAsset"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(asset_id*, &Element->SelectedAsset), + MemberName, + Params + ); @@ -423,15 +614,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, &Element->ModelIndex), - CSz("ModelIndex"), - Params - ); + + + { + + + + cs MemberName = CSz("ModelIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, &Element->ModelIndex), + MemberName, + Params + ); @@ -439,16 +638,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(entity_id*, &Element->SelectedEntity), - CSz("SelectedEntity"), - Params - ); + + + { + + + + cs MemberName = CSz("SelectedEntity"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(entity_id*, &Element->SelectedEntity), + MemberName, + Params + ); @@ -456,15 +663,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->OctreeDrawDepth), - CSz("OctreeDrawDepth"), - Params - ); + + + { + + + + cs MemberName = CSz("OctreeDrawDepth"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->OctreeDrawDepth), + MemberName, + Params + ); @@ -472,16 +687,32 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(octree_node*, Element->SelectedNode), - CSz("SelectedNode"), - Params - ); + + + { + + + + cs MemberName = CSz("SelectedNode"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node*, Element->SelectedNode), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 5534786e6..e2967456b 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:480:0 +// src/engine/editor.cpp:477:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(engine_settings*, &Element->Settings), - CSz("Settings"), - Params - ); + + { + + + + cs MemberName = CSz("Settings"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(engine_settings*, &Element->Settings), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(bonsai_stdlib*, &Element->Stdlib), - CSz("Stdlib"), - Params - ); + { + + + + cs MemberName = CSz("Stdlib"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bonsai_stdlib*, &Element->Stdlib), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(renderer_2d*, &Element->Ui), - CSz("Ui"), - Params - ); + { + + + + cs MemberName = CSz("Ui"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(renderer_2d*, &Element->Ui), + MemberName, + Params + ); @@ -73,15 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(application_api*, &Element->GameApi), - CSz("GameApi"), - Params - ); + { + + + + cs MemberName = CSz("GameApi"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(application_api*, &Element->GameApi), + MemberName, + Params + ); @@ -89,14 +119,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(hotkeys*, &Element->Hotkeys), - CSz("Hotkeys"), - Params - ); + + + { + + + + cs MemberName = CSz("Hotkeys"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(hotkeys*, &Element->Hotkeys), + MemberName, + Params + ); @@ -104,15 +143,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(maybe_ray*, &Element->MaybeMouseRay), - CSz("MaybeMouseRay"), - Params - ); + + + { + + + + cs MemberName = CSz("MaybeMouseRay"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(maybe_ray*, &Element->MaybeMouseRay), + MemberName, + Params + ); @@ -120,16 +167,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world*, Element->World), - CSz("World"), - Params - ); + + { + + + + cs MemberName = CSz("World"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world*, Element->World), + MemberName, + Params + ); @@ -137,15 +191,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(game_state*, Element->GameState), - CSz("GameState"), - Params - ); + { + + + + cs MemberName = CSz("GameState"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(game_state*, Element->GameState), + MemberName, + Params + ); @@ -153,15 +215,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(graphics*, &Element->Graphics), - CSz("Graphics"), - Params - ); + { + + + + cs MemberName = CSz("Graphics"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(graphics*, &Element->Graphics), + MemberName, + Params + ); @@ -169,15 +239,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(file_traversal_node*, &Element->RequestedGameLibReloadNode), - CSz("RequestedGameLibReloadNode"), - Params - ); + { + + + + cs MemberName = CSz("RequestedGameLibReloadNode"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(file_traversal_node*, &Element->RequestedGameLibReloadNode), + MemberName, + Params + ); @@ -185,15 +263,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(game_lib_reload_behavior*, &Element->RequestedGameLibReloadBehavior), - CSz("RequestedGameLibReloadBehavior"), - Params - ); + { + + + + cs MemberName = CSz("RequestedGameLibReloadBehavior"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(game_lib_reload_behavior*, &Element->RequestedGameLibReloadBehavior), + MemberName, + Params + ); @@ -201,14 +287,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(heap_allocator*, &Element->Heap), - CSz("Heap"), - Params - ); + + + { + + + + cs MemberName = CSz("Heap"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(heap_allocator*, &Element->Heap), + MemberName, + Params + ); @@ -216,15 +311,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*, Element->GameMemory), - CSz("GameMemory"), - Params - ); + + + { + + + + cs MemberName = CSz("GameMemory"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(memory_arena*, Element->GameMemory), + MemberName, + Params + ); @@ -232,16 +335,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*, Element->WorldUpdateMemory), - CSz("WorldUpdateMemory"), - Params - ); + + { + + + + cs MemberName = CSz("WorldUpdateMemory"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(memory_arena*, Element->WorldUpdateMemory), + MemberName, + Params + ); @@ -249,15 +359,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(entity*, Element->EntityTable), - CSz("EntityTable"), - Params - ); + { + + + + cs MemberName = CSz("EntityTable"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(entity*, Element->EntityTable), + MemberName, + Params + ); @@ -265,15 +383,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(asset_system*, &Element->AssetSystem), - CSz("AssetSystem"), - Params - ); + { + + + + cs MemberName = CSz("AssetSystem"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(asset_system*, &Element->AssetSystem), + MemberName, + Params + ); @@ -281,15 +407,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->FrameIndex), - CSz("FrameIndex"), - Params - ); + { + + + + cs MemberName = CSz("FrameIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->FrameIndex), + MemberName, + Params + ); @@ -297,16 +431,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(tiered_mesh_freelist*, &Element->geo_u3d_MeshFreelist), - CSz("geo_u3d_MeshFreelist"), - Params - ); + + { + + + + cs MemberName = CSz("geo_u3d_MeshFreelist"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(tiered_mesh_freelist*, &Element->geo_u3d_MeshFreelist), + MemberName, + Params + ); @@ -314,14 +456,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(tiered_mesh_freelist*, &Element->world_chunk_MeshFreelist), - CSz("world_chunk_MeshFreelist"), - Params - ); + + + { + + + + cs MemberName = CSz("world_chunk_MeshFreelist"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(tiered_mesh_freelist*, &Element->world_chunk_MeshFreelist), + MemberName, + Params + ); @@ -329,15 +480,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(debug_state*, Element->DebugState), - CSz("DebugState"), - Params - ); + + + { + + + + cs MemberName = CSz("DebugState"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(debug_state*, Element->DebugState), + MemberName, + Params + ); @@ -345,16 +504,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(engine_debug*, &Element->EngineDebug), - CSz("EngineDebug"), - Params - ); + + { + + + + cs MemberName = CSz("EngineDebug"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(engine_debug*, &Element->EngineDebug), + MemberName, + Params + ); @@ -362,15 +528,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(level_editor*, &Element->Editor), - CSz("Editor"), - Params - ); + { + + + + cs MemberName = CSz("Editor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(level_editor*, &Element->Editor), + MemberName, + Params + ); @@ -378,15 +552,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(maybe_picked_voxel*, &Element->MousedOverVoxel), - CSz("MousedOverVoxel"), - Params - ); + { + + + + cs MemberName = CSz("MousedOverVoxel"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(maybe_picked_voxel*, &Element->MousedOverVoxel), + MemberName, + Params + ); @@ -394,15 +576,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(maybe_standing_spot*, &Element->ClosestStandingSpotToCursor), - CSz("ClosestStandingSpotToCursor"), - Params - ); + { + + + + cs MemberName = CSz("ClosestStandingSpotToCursor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(maybe_standing_spot*, &Element->ClosestStandingSpotToCursor), + MemberName, + Params + ); @@ -410,15 +600,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(maybe_entity_ptr*, &Element->HoverEntity), - CSz("HoverEntity"), - Params - ); + { + + + + cs MemberName = CSz("HoverEntity"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(maybe_entity_ptr*, &Element->HoverEntity), + MemberName, + Params + ); @@ -426,14 +624,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(render_entity_to_texture_group*, &Element->RTTGroup), - CSz("RTTGroup"), - Params - ); + + + { + + + + cs MemberName = CSz("RTTGroup"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(render_entity_to_texture_group*, &Element->RTTGroup), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 4ebde841d..33617a388 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:477:0 +// src/engine/editor.cpp:474:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(graphics_settings*, &Element->Graphics), - CSz("Graphics"), - Params - ); + + { + + + + cs MemberName = CSz("Graphics"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(graphics_settings*, &Element->Graphics), + MemberName, + Params + ); @@ -41,6 +47,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 4a93f860a..01ac1e35a 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:381:0 +// src/engine/editor.cpp:378:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(entity_id*, &Element->Id), - CSz("Id"), - Params - ); + + { + + + + cs MemberName = CSz("Id"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(entity_id*, &Element->Id), + MemberName, + Params + ); @@ -41,22 +47,38 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } + + - DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + { + + + + cs MemberName = CSz("P"); + DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->EulerAngles), - CSz("EulerAngles"), - Params - , -PI32, PI32 ); + { + + + + cs MemberName = CSz("EulerAngles"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->EulerAngles), + MemberName, + Params + , -PI32, PI32 ); @@ -64,15 +86,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Scale), - CSz("Scale"), - Params - ); + { + + + + cs MemberName = CSz("Scale"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Scale), + MemberName, + Params + ); @@ -80,15 +110,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->_CollisionVolumeRadius), - CSz("_CollisionVolumeRadius"), - Params - ); + + + { + + + + cs MemberName = CSz("_CollisionVolumeRadius"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->_CollisionVolumeRadius), + MemberName, + Params + ); @@ -96,16 +135,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(physics*, &Element->Physics), - CSz("Physics"), - Params - ); + + { + + + + cs MemberName = CSz("Physics"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(physics*, &Element->Physics), + MemberName, + Params + ); @@ -113,15 +159,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(asset_id*, &Element->AssetId), - CSz("AssetId"), - Params - ); + { + + + + cs MemberName = CSz("AssetId"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(asset_id*, &Element->AssetId), + MemberName, + Params + ); @@ -129,15 +183,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, &Element->ModelIndex), - CSz("ModelIndex"), - Params - ); + { + + + + cs MemberName = CSz("ModelIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, &Element->ModelIndex), + MemberName, + Params + ); @@ -145,16 +207,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(collision_event*, &Element->LastResolvedCollision), - CSz("LastResolvedCollision"), - Params - ); + + { + + + + cs MemberName = CSz("LastResolvedCollision"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(collision_event*, &Element->LastResolvedCollision), + MemberName, + Params + ); @@ -162,15 +232,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(entity_position_info*, &Element->LastResolvedPosInfo), - CSz("LastResolvedPosInfo"), - Params - ); + { + + + + cs MemberName = CSz("LastResolvedPosInfo"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(entity_position_info*, &Element->LastResolvedPosInfo), + MemberName, + Params + ); @@ -178,15 +256,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(particle_system*, Element->Emitter), - CSz("Emitter"), - Params - ); + { + + + + cs MemberName = CSz("Emitter"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(particle_system*, Element->Emitter), + MemberName, + Params + ); @@ -194,15 +280,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(entity_state*, &Element->State), - CSz("State"), - Params - ); + { + + + + cs MemberName = CSz("State"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(entity_state*, &Element->State), + MemberName, + Params + ); @@ -210,15 +304,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(entity_behavior_flags*, &Element->Behavior), - CSz("Behavior"), - Params - ); + { + + + + cs MemberName = CSz("Behavior"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(entity_behavior_flags*, &Element->Behavior), + MemberName, + Params + ); @@ -226,15 +328,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(entity_id*, &Element->Carrying), - CSz("Carrying"), - Params - ); + { + + + + cs MemberName = CSz("Carrying"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(entity_id*, &Element->Carrying), + MemberName, + Params + ); @@ -242,24 +352,42 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ + } + + - if (EntityUserDataEditorUi) {EntityUserDataEditorUi(Ui, Window, &Element->UserType, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES);} + + { + + + + cs MemberName = CSz("UserType"); + if (EntityUserDataEditorUi) {EntityUserDataEditorUi(Ui, Window, &Element->UserType, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES);} else {DoEditorUi(Ui, Window, &Element->UserType, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } ; + } PushNewRow(Ui); - if (EntityUserDataEditorUi) { /* User took control, skip this because it's intended */ } + + + { + + + + cs MemberName = CSz("UserData"); + if (EntityUserDataEditorUi) { /* User took control, skip this because it's intended */ } else {DoEditorUi(Ui, Window, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } ; + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index e81a218ad..506587b3d 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:378:0 +// src/engine/editor.cpp:375:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->Index), - CSz("Index"), - Params - ); + + { + + + + cs MemberName = CSz("Index"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->Index), + MemberName, + Params + ); @@ -41,16 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->Generation), - CSz("Generation"), - Params - ); + + { + + + + cs MemberName = CSz("Generation"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->Generation), + MemberName, + Params + ); @@ -58,6 +72,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 6691a8735..14baf762b 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:415:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*, &Element->P), - CSz("P"), - Params - ); + + { + + + + cs MemberName = CSz("P"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cp*, &Element->P), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->_CollisionVolumeRadius), - CSz("_CollisionVolumeRadius"), - Params - ); + { + + + + cs MemberName = CSz("_CollisionVolumeRadius"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->_CollisionVolumeRadius), + MemberName, + Params + ); @@ -57,14 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Scale), - CSz("Scale"), - Params - ); + + + { + + + + cs MemberName = CSz("Scale"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Scale), + MemberName, + Params + ); @@ -72,16 +95,32 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->EulerAngles), - CSz("EulerAngles"), - Params - ); + + + { + + + + cs MemberName = CSz("EulerAngles"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->EulerAngles), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index befd9c305..42a2120a5 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:366:0 +// src/engine/editor.cpp:363:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(file_traversal_type*, &Element->Type), - CSz("Type"), - Params - ); + + { + + + + cs MemberName = CSz("Type"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(file_traversal_type*, &Element->Type), + MemberName, + Params + ); @@ -41,14 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cs*, &Element->Dir), - CSz("Dir"), - Params - ); + + + { + + + + cs MemberName = CSz("Dir"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cs*, &Element->Dir), + MemberName, + Params + ); @@ -56,16 +71,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cs*, &Element->Name), - CSz("Name"), - Params - ); + + + { + + + + cs MemberName = CSz("Name"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cs*, &Element->Name), + MemberName, + Params + ); @@ -73,6 +96,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index fa7562ace..bac85e0b3 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->farClip), - CSz("farClip"), - Params - ); + + { + + + + cs MemberName = CSz("farClip"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->farClip), + MemberName, + Params + ); @@ -41,15 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->nearClip), - CSz("nearClip"), - Params - ); + + + { + + + + cs MemberName = CSz("nearClip"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->nearClip), + MemberName, + Params + ); @@ -57,16 +72,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->width), - CSz("width"), - Params - ); + + + { + + + + cs MemberName = CSz("width"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->width), + MemberName, + Params + ); @@ -74,16 +97,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->FOV), - CSz("FOV"), - Params - ); + + + { + + + + cs MemberName = CSz("FOV"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->FOV), + MemberName, + Params + ); @@ -91,17 +122,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(plane*, &Element->Top), - CSz("Top"), - Params - ); + + { + + + + cs MemberName = CSz("Top"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(plane*, &Element->Top), + MemberName, + Params + ); @@ -109,15 +147,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(plane*, &Element->Bot), - CSz("Bot"), - Params - ); + { + + + + cs MemberName = CSz("Bot"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(plane*, &Element->Bot), + MemberName, + Params + ); @@ -125,14 +171,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(plane*, &Element->Left), - CSz("Left"), - Params - ); + + + { + + + + cs MemberName = CSz("Left"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(plane*, &Element->Left), + MemberName, + Params + ); @@ -140,15 +195,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(plane*, &Element->Right), - CSz("Right"), - Params - ); + + + { + + + + cs MemberName = CSz("Right"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(plane*, &Element->Right), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 92d3e58c6..3815ea67f 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:435:0 +// src/engine/editor.cpp:432:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*, &Element->FBO), - CSz("FBO"), - Params - ); + + { + + + + cs MemberName = CSz("FBO"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(framebuffer*, &Element->FBO), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(g_buffer_textures*, &Element->Textures), - CSz("Textures"), - Params - ); + { + + + + cs MemberName = CSz("Textures"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(g_buffer_textures*, &Element->Textures), + MemberName, + Params + ); @@ -57,14 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->gBufferShader), - CSz("gBufferShader"), - Params - ); + + + { + + + + cs MemberName = CSz("gBufferShader"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->gBufferShader), + MemberName, + Params + ); @@ -72,15 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(m4*, &Element->InverseViewMatrix), - CSz("InverseViewMatrix"), - Params - ); + + + { + + + + cs MemberName = CSz("InverseViewMatrix"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(m4*, &Element->InverseViewMatrix), + MemberName, + Params + ); @@ -88,16 +119,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(m4*, &Element->InverseProjectionMatrix), - CSz("InverseProjectionMatrix"), - Params - ); + + { + + + + cs MemberName = CSz("InverseProjectionMatrix"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(m4*, &Element->InverseProjectionMatrix), + MemberName, + Params + ); @@ -105,15 +143,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(m4*, &Element->ViewProjection), - CSz("ViewProjection"), - Params - ); + { + + + + cs MemberName = CSz("ViewProjection"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(m4*, &Element->ViewProjection), + MemberName, + Params + ); @@ -121,15 +167,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->GlTimerObject), - CSz("GlTimerObject"), - Params - ); + { + + + + cs MemberName = CSz("GlTimerObject"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->GlTimerObject), + MemberName, + Params + ); @@ -137,6 +191,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 9e305f782..215c668b6 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:429:0 +// src/engine/editor.cpp:426:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->ColorTex), - CSz("ColorTex"), - Params - ); + + { + + + + cs MemberName = CSz("ColorTex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->ColorTex), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->PositionTex), - CSz("PositionTex"), - Params - ); + { + + + + cs MemberName = CSz("PositionTex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->PositionTex), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->IndexToUV), - CSz("IndexToUV"), - Params - ); + { + + + + cs MemberName = CSz("IndexToUV"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->IndexToUV), + MemberName, + Params + ); @@ -73,16 +95,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->Count), - CSz("Count"), - Params - ); + + { + + + + cs MemberName = CSz("Count"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->Count), + MemberName, + Params + ); @@ -90,15 +120,32 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(light*, Element->Lights), - CSz("Lights"), - Params - ); + + + { + + + + cs MemberName = CSz("Lights"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(light*, Element->Lights), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index d0e3c7c42..6b1c2f48e 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:348:0 +// src/engine/editor.cpp:345:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->VertexHandle), - CSz("VertexHandle"), - Params - ); + + { + + + + cs MemberName = CSz("VertexHandle"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->VertexHandle), + MemberName, + Params + ); @@ -41,15 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->NormalHandle), - CSz("NormalHandle"), - Params - ); + + + { + + + + cs MemberName = CSz("NormalHandle"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->NormalHandle), + MemberName, + Params + ); @@ -57,16 +72,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->MatHandle), - CSz("MatHandle"), - Params - ); + + + { + + + + cs MemberName = CSz("MatHandle"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->MatHandle), + MemberName, + Params + ); @@ -74,16 +97,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->ElementCount), - CSz("ElementCount"), - Params - ); + + + { + + + + cs MemberName = CSz("ElementCount"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->ElementCount), + MemberName, + Params + ); @@ -91,17 +122,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(data_type*, &Element->ElementType), - CSz("ElementType"), - Params - ); + + { + + + + cs MemberName = CSz("ElementType"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(data_type*, &Element->ElementType), + MemberName, + Params + ); @@ -109,15 +147,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->Mapped), - CSz("Mapped"), - Params - ); + { + + + + cs MemberName = CSz("Mapped"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->Mapped), + MemberName, + Params + ); @@ -125,16 +171,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->Pad), - CSz("Pad"), - Params - ); + + { + + + + cs MemberName = CSz("Pad"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->Pad), + MemberName, + Params + ); @@ -142,16 +196,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u16*, &Element->Flags), - CSz("Flags"), - Params - ); + + { + + + + cs MemberName = CSz("Flags"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u16*, &Element->Flags), + MemberName, + Params + ); @@ -159,6 +221,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 8d8f1c036..e425e7bbb 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:351:0 +// src/engine/editor.cpp:348:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(gpu_element_buffer_handles*, &Element->Handles), - CSz("Handles"), - Params - ); + + { + + + + cs MemberName = CSz("Handles"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(gpu_element_buffer_handles*, &Element->Handles), + MemberName, + Params + ); @@ -41,14 +47,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(untextured_3d_geometry_buffer*, &Element->Buffer), - CSz("Buffer"), - Params - ); + + { + + + + cs MemberName = CSz("Buffer"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(untextured_3d_geometry_buffer*, &Element->Buffer), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 67bddb74d..d01af48c0 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,42 +26,64 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->Initialized), - CSz("Initialized"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("Initialized"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Initialized), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->RenderGate), - CSz("RenderGate"), - &DefaultUiRenderParams_Checkbox - ); + + { + + + + cs MemberName = CSz("RenderGate"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->RenderGate), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(render_settings*, &Element->Settings), - CSz("Settings"), - Params - ); + + { + + + + cs MemberName = CSz("Settings"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(render_settings*, &Element->Settings), + MemberName, + Params + ); @@ -69,15 +91,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(render_settings*, &Element->PrevSettings), - CSz("PrevSettings"), - Params - ); + { + + + + cs MemberName = CSz("PrevSettings"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(render_settings*, &Element->PrevSettings), + MemberName, + Params + ); @@ -85,14 +115,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->OffsetOfWorldCenterToGrid), - CSz("OffsetOfWorldCenterToGrid"), - Params - ); + + + { + + + + cs MemberName = CSz("OffsetOfWorldCenterToGrid"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->OffsetOfWorldCenterToGrid), + MemberName, + Params + ); @@ -100,16 +139,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->SunBasis), - CSz("SunBasis"), - Params - ); + + { + + + + cs MemberName = CSz("SunBasis"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->SunBasis), + MemberName, + Params + ); @@ -117,14 +163,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->FogPower), - CSz("FogPower"), - Params - ); + + + { + + + + cs MemberName = CSz("FogPower"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->FogPower), + MemberName, + Params + ); @@ -132,17 +187,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->FogColor), - CSz("FogColor"), - Params - ); + + { + + + + cs MemberName = CSz("FogColor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->FogColor), + MemberName, + Params + ); @@ -150,15 +212,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->SkyColor), - CSz("SkyColor"), - Params - ); + { + + + + cs MemberName = CSz("SkyColor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->SkyColor), + MemberName, + Params + ); @@ -166,14 +236,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(camera*, &Element->GameCamera), - CSz("GameCamera"), - Params - ); + + + { + + + + cs MemberName = CSz("GameCamera"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(camera*, &Element->GameCamera), + MemberName, + Params + ); @@ -181,16 +260,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(camera*, &Element->DebugCamera), - CSz("DebugCamera"), - Params - ); + + { + + + + cs MemberName = CSz("DebugCamera"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(camera*, &Element->DebugCamera), + MemberName, + Params + ); @@ -198,14 +284,34 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Exposure), - CSz("Exposure"), - Params - ); + + + { + + + + cs MemberName = CSz("Camera"); + + } + + + + + { + + + + cs MemberName = CSz("Exposure"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Exposure), + MemberName, + Params + ); @@ -213,17 +319,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_chunk_ptr_paged_list*, &Element->MainDrawList), - CSz("MainDrawList"), - Params - ); + + { + + + + cs MemberName = CSz("MainDrawList"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_chunk_ptr_paged_list*, &Element->MainDrawList), + MemberName, + Params + ); @@ -231,15 +344,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_chunk_ptr_paged_list*, &Element->ShadowMapDrawList), - CSz("ShadowMapDrawList"), - Params - ); + { + + + + cs MemberName = CSz("ShadowMapDrawList"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_chunk_ptr_paged_list*, &Element->ShadowMapDrawList), + MemberName, + Params + ); @@ -247,14 +368,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->MinClipP_worldspace), - CSz("MinClipP_worldspace"), - Params - ); + + + { + + + + cs MemberName = CSz("MinClipP_worldspace"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->MinClipP_worldspace), + MemberName, + Params + ); @@ -262,16 +392,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->MaxClipP_worldspace), - CSz("MaxClipP_worldspace"), - Params - ); + + { + + + + cs MemberName = CSz("MaxClipP_worldspace"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->MaxClipP_worldspace), + MemberName, + Params + ); @@ -279,14 +416,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(g_buffer_render_group*, Element->gBuffer), - CSz("gBuffer"), - Params - ); + + + { + + + + cs MemberName = CSz("gBuffer"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(g_buffer_render_group*, Element->gBuffer), + MemberName, + Params + ); @@ -294,16 +440,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(ao_render_group*, Element->AoGroup), - CSz("AoGroup"), - Params - ); + + { + + + + cs MemberName = CSz("AoGroup"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(ao_render_group*, Element->AoGroup), + MemberName, + Params + ); @@ -311,15 +464,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shadow_render_group*, Element->SG), - CSz("SG"), - Params - ); + { + + + + cs MemberName = CSz("SG"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shadow_render_group*, Element->SG), + MemberName, + Params + ); @@ -327,15 +488,34 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + + + + + { + + + + cs MemberName = CSz("ColorPalette"); + + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->ColorPaletteTexture), - CSz("ColorPaletteTexture"), - Params - ); + { + + + + cs MemberName = CSz("ColorPaletteTexture"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->ColorPaletteTexture), + MemberName, + Params + ); @@ -343,15 +523,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(transparency_render_group*, &Element->Transparency), - CSz("Transparency"), - Params - ); + { + + + + cs MemberName = CSz("Transparency"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(transparency_render_group*, &Element->Transparency), + MemberName, + Params + ); @@ -359,15 +547,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(lighting_render_group*, &Element->Lighting), - CSz("Lighting"), - Params - ); + { + + + + cs MemberName = CSz("Lighting"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(lighting_render_group*, &Element->Lighting), + MemberName, + Params + ); @@ -375,15 +571,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(gaussian_render_group*, &Element->Gaussian), - CSz("Gaussian"), - Params - ); + { + + + + cs MemberName = CSz("Gaussian"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(gaussian_render_group*, &Element->Gaussian), + MemberName, + Params + ); @@ -391,14 +595,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(composite_render_group*, &Element->CompositeGroup), - CSz("CompositeGroup"), - Params - ); + + + { + + + + cs MemberName = CSz("CompositeGroup"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(composite_render_group*, &Element->CompositeGroup), + MemberName, + Params + ); @@ -406,16 +619,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(terrain_shaping_render_context*, &Element->TerrainShapingRC), - CSz("TerrainShapingRC"), - Params - ); + + { + + + + cs MemberName = CSz("TerrainShapingRC"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(terrain_shaping_render_context*, &Element->TerrainShapingRC), + MemberName, + Params + ); @@ -423,14 +643,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(terrain_decoration_render_context*, &Element->TerrainDecorationRC), - CSz("TerrainDecorationRC"), - Params - ); + + + { + + + + cs MemberName = CSz("TerrainDecorationRC"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(terrain_decoration_render_context*, &Element->TerrainDecorationRC), + MemberName, + Params + ); @@ -438,16 +667,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(terrain_derivs_render_context*, &Element->TerrainDerivsRC), - CSz("TerrainDerivsRC"), - Params - ); + + { + + + + cs MemberName = CSz("TerrainDerivsRC"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(terrain_derivs_render_context*, &Element->TerrainDerivsRC), + MemberName, + Params + ); @@ -455,15 +691,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(terrain_finalize_render_context*, &Element->TerrainFinalizeRC), - CSz("TerrainFinalizeRC"), - Params - ); + { + + + + cs MemberName = CSz("TerrainFinalizeRC"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(terrain_finalize_render_context*, &Element->TerrainFinalizeRC), + MemberName, + Params + ); @@ -471,14 +715,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_render_context*, &Element->WorldEditRC), - CSz("WorldEditRC"), - Params - ); + + + { + + + + cs MemberName = CSz("WorldEditRC"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_render_context*, &Element->WorldEditRC), + MemberName, + Params + ); @@ -486,16 +739,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->NoiseFinalizeJobsPending), - CSz("NoiseFinalizeJobsPending"), - Params - ); + + { + + + + cs MemberName = CSz("NoiseFinalizeJobsPending"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->NoiseFinalizeJobsPending), + MemberName, + Params + ); @@ -503,15 +763,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(dummy_work_queue_entry_build_chunk_mesh_block_array*, &Element->NoiseReadbackJobs), - CSz("NoiseReadbackJobs"), - Params - ); + + + { + + + + cs MemberName = CSz("NoiseReadbackJobs"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(dummy_work_queue_entry_build_chunk_mesh_block_array*, &Element->NoiseReadbackJobs), + MemberName, + Params + ); @@ -519,34 +788,51 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } - if (ToggleButton(Ui, CSz("v GpuBuffers[2]"), CSz("> GpuBuffers[2]"), UiId(Window, "toggle graphics gpu_mapped_element_buffer GpuBuffers", Element->GpuBuffers), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 2) - { - DoEditorUi(Ui, Window, Element->GpuBuffers+ArrayIndex, FSz("GpuBuffers[%d]", ArrayIndex), Params); + - + { + + + + cs MemberName = CSz("GpuBuffers"); + + + if (ToggleButton(Ui, CSz("v GpuBuffers[2]"), CSz("> GpuBuffers[2]"), UiId(Window, "toggle graphics gpu_mapped_element_buffer GpuBuffers", Element->GpuBuffers), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 2) + { + DoEditorUi(Ui, Window, Element->GpuBuffers+ArrayIndex, FSz("GpuBuffers[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->GpuBufferWriteIndex), - CSz("GpuBufferWriteIndex"), - Params - ); + + { + + + + cs MemberName = CSz("GpuBufferWriteIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->GpuBufferWriteIndex), + MemberName, + Params + ); @@ -554,16 +840,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(gpu_timer_block_array*, &Element->GpuTimers), - CSz("GpuTimers"), - Params - ); + + { + + + + cs MemberName = CSz("GpuTimers"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(gpu_timer_block_array*, &Element->GpuTimers), + MemberName, + Params + ); @@ -571,14 +865,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*, Element->Memory), - CSz("Memory"), - Params - ); + + + { + + + + cs MemberName = CSz("Memory"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(memory_arena*, Element->Memory), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index d7f855067..1ae0c4889 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:474:0 +// src/engine/editor.cpp:471:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(resolution_setting*, &Element->Resolution), - CSz("Resolution"), - Params - ); + + { + + + + cs MemberName = CSz("Resolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(resolution_setting*, &Element->Resolution), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shadow_quality_setting*, &Element->ShadowQuality), - CSz("ShadowQuality"), - Params - ); + { + + + + cs MemberName = CSz("ShadowQuality"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shadow_quality_setting*, &Element->ShadowQuality), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(lighting_quality_setting*, &Element->LightingQuality), - CSz("LightingQuality"), - Params - ); + { + + + + cs MemberName = CSz("LightingQuality"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(lighting_quality_setting*, &Element->LightingQuality), + MemberName, + Params + ); @@ -73,15 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader_language_setting*, &Element->ShaderLanguage), - CSz("ShaderLanguage"), - Params - ); + { + + + + cs MemberName = CSz("ShaderLanguage"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader_language_setting*, &Element->ShaderLanguage), + MemberName, + Params + ); @@ -89,14 +119,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(resolution_setting*, &Element->WindowStartingSize), - CSz("WindowStartingSize"), - Params - ); + + + { + + + + cs MemberName = CSz("WindowStartingSize"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(resolution_setting*, &Element->WindowStartingSize), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index e22d0972b..246cee74c 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Enter), - CSz("Enter"), - Params - ); + + { + + + + cs MemberName = CSz("Enter"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Enter), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Escape), - CSz("Escape"), - Params - ); + { + + + + cs MemberName = CSz("Escape"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Escape), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Alt), - CSz("Alt"), - Params - ); + { + + + + cs MemberName = CSz("Alt"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Alt), + MemberName, + Params + ); @@ -73,15 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Ctrl), - CSz("Ctrl"), - Params - ); + { + + + + cs MemberName = CSz("Ctrl"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Ctrl), + MemberName, + Params + ); @@ -89,15 +119,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Shift), - CSz("Shift"), - Params - ); + { + + + + cs MemberName = CSz("Shift"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Shift), + MemberName, + Params + ); @@ -105,15 +143,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Backspace), - CSz("Backspace"), - Params - ); + { + + + + cs MemberName = CSz("Backspace"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Backspace), + MemberName, + Params + ); @@ -121,15 +167,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Delete), - CSz("Delete"), - Params - ); + { + + + + cs MemberName = CSz("Delete"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Delete), + MemberName, + Params + ); @@ -137,15 +191,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F12), - CSz("F12"), - Params - ); + { + + + + cs MemberName = CSz("F12"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F12), + MemberName, + Params + ); @@ -153,15 +215,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F11), - CSz("F11"), - Params - ); + { + + + + cs MemberName = CSz("F11"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F11), + MemberName, + Params + ); @@ -169,15 +239,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F10), - CSz("F10"), - Params - ); + { + + + + cs MemberName = CSz("F10"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F10), + MemberName, + Params + ); @@ -185,15 +263,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F9), - CSz("F9"), - Params - ); + { + + + + cs MemberName = CSz("F9"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F9), + MemberName, + Params + ); @@ -201,15 +287,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F8), - CSz("F8"), - Params - ); + { + + + + cs MemberName = CSz("F8"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F8), + MemberName, + Params + ); @@ -217,15 +311,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F7), - CSz("F7"), - Params - ); + { + + + + cs MemberName = CSz("F7"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F7), + MemberName, + Params + ); @@ -233,15 +335,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F6), - CSz("F6"), - Params - ); + { + + + + cs MemberName = CSz("F6"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F6), + MemberName, + Params + ); @@ -249,15 +359,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F5), - CSz("F5"), - Params - ); + { + + + + cs MemberName = CSz("F5"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F5), + MemberName, + Params + ); @@ -265,15 +383,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F4), - CSz("F4"), - Params - ); + { + + + + cs MemberName = CSz("F4"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F4), + MemberName, + Params + ); @@ -281,15 +407,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F3), - CSz("F3"), - Params - ); + { + + + + cs MemberName = CSz("F3"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F3), + MemberName, + Params + ); @@ -297,15 +431,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F2), - CSz("F2"), - Params - ); + { + + + + cs MemberName = CSz("F2"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F2), + MemberName, + Params + ); @@ -313,15 +455,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F1), - CSz("F1"), - Params - ); + { + + + + cs MemberName = CSz("F1"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F1), + MemberName, + Params + ); @@ -329,15 +479,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Dot), - CSz("Dot"), - Params - ); + { + + + + cs MemberName = CSz("Dot"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Dot), + MemberName, + Params + ); @@ -345,15 +503,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Minus), - CSz("Minus"), - Params - ); + { + + + + cs MemberName = CSz("Minus"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Minus), + MemberName, + Params + ); @@ -361,15 +527,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->FSlash), - CSz("FSlash"), - Params - ); + { + + + + cs MemberName = CSz("FSlash"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->FSlash), + MemberName, + Params + ); @@ -377,15 +551,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Space), - CSz("Space"), - Params - ); + { + + + + cs MemberName = CSz("Space"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Space), + MemberName, + Params + ); @@ -393,15 +575,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Underscore), - CSz("Underscore"), - Params - ); + { + + + + cs MemberName = CSz("Underscore"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Underscore), + MemberName, + Params + ); @@ -409,15 +599,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->N0), - CSz("N0"), - Params - ); + { + + + + cs MemberName = CSz("N0"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->N0), + MemberName, + Params + ); @@ -425,15 +623,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->N1), - CSz("N1"), - Params - ); + { + + + + cs MemberName = CSz("N1"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->N1), + MemberName, + Params + ); @@ -441,15 +647,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->N2), - CSz("N2"), - Params - ); + { + + + + cs MemberName = CSz("N2"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->N2), + MemberName, + Params + ); @@ -457,15 +671,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->N3), - CSz("N3"), - Params - ); + { + + + + cs MemberName = CSz("N3"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->N3), + MemberName, + Params + ); @@ -473,15 +695,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->N4), - CSz("N4"), - Params - ); + { + + + + cs MemberName = CSz("N4"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->N4), + MemberName, + Params + ); @@ -489,15 +719,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->N5), - CSz("N5"), - Params - ); + { + + + + cs MemberName = CSz("N5"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->N5), + MemberName, + Params + ); @@ -505,15 +743,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->N6), - CSz("N6"), - Params - ); + { + + + + cs MemberName = CSz("N6"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->N6), + MemberName, + Params + ); @@ -521,15 +767,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->N7), - CSz("N7"), - Params - ); + { + + + + cs MemberName = CSz("N7"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->N7), + MemberName, + Params + ); @@ -537,15 +791,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->N8), - CSz("N8"), - Params - ); + { + + + + cs MemberName = CSz("N8"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->N8), + MemberName, + Params + ); @@ -553,15 +815,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->N9), - CSz("N9"), - Params - ); + { + + + + cs MemberName = CSz("N9"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->N9), + MemberName, + Params + ); @@ -569,15 +839,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->A), - CSz("A"), - Params - ); + { + + + + cs MemberName = CSz("A"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->A), + MemberName, + Params + ); @@ -585,15 +863,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->B), - CSz("B"), - Params - ); + { + + + + cs MemberName = CSz("B"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->B), + MemberName, + Params + ); @@ -601,15 +887,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->C), - CSz("C"), - Params - ); + { + + + + cs MemberName = CSz("C"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->C), + MemberName, + Params + ); @@ -617,15 +911,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->D), - CSz("D"), - Params - ); + { + + + + cs MemberName = CSz("D"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->D), + MemberName, + Params + ); @@ -633,15 +935,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->E), - CSz("E"), - Params - ); + { + + + + cs MemberName = CSz("E"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->E), + MemberName, + Params + ); @@ -649,15 +959,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->F), - CSz("F"), - Params - ); + { + + + + cs MemberName = CSz("F"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->F), + MemberName, + Params + ); @@ -665,15 +983,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->G), - CSz("G"), - Params - ); + { + + + + cs MemberName = CSz("G"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->G), + MemberName, + Params + ); @@ -681,15 +1007,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->H), - CSz("H"), - Params - ); + { + + + + cs MemberName = CSz("H"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->H), + MemberName, + Params + ); @@ -697,15 +1031,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->I), - CSz("I"), - Params - ); + { + + + + cs MemberName = CSz("I"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->I), + MemberName, + Params + ); @@ -713,15 +1055,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->J), - CSz("J"), - Params - ); + { + + + + cs MemberName = CSz("J"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->J), + MemberName, + Params + ); @@ -729,15 +1079,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->K), - CSz("K"), - Params - ); + { + + + + cs MemberName = CSz("K"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->K), + MemberName, + Params + ); @@ -745,15 +1103,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->L), - CSz("L"), - Params - ); + { + + + + cs MemberName = CSz("L"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->L), + MemberName, + Params + ); @@ -761,15 +1127,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->M), - CSz("M"), - Params - ); + { + + + + cs MemberName = CSz("M"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->M), + MemberName, + Params + ); @@ -777,15 +1151,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->N), - CSz("N"), - Params - ); + { + + + + cs MemberName = CSz("N"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->N), + MemberName, + Params + ); @@ -793,15 +1175,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->O), - CSz("O"), - Params - ); + { + + + + cs MemberName = CSz("O"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->O), + MemberName, + Params + ); @@ -809,15 +1199,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->P), - CSz("P"), - Params - ); + { + + + + cs MemberName = CSz("P"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->P), + MemberName, + Params + ); @@ -825,15 +1223,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Q), - CSz("Q"), - Params - ); + { + + + + cs MemberName = CSz("Q"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Q), + MemberName, + Params + ); @@ -841,15 +1247,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->R), - CSz("R"), - Params - ); + { + + + + cs MemberName = CSz("R"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->R), + MemberName, + Params + ); @@ -857,15 +1271,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->S), - CSz("S"), - Params - ); + { + + + + cs MemberName = CSz("S"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->S), + MemberName, + Params + ); @@ -873,15 +1295,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->T), - CSz("T"), - Params - ); + { + + + + cs MemberName = CSz("T"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->T), + MemberName, + Params + ); @@ -889,15 +1319,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->U), - CSz("U"), - Params - ); + { + + + + cs MemberName = CSz("U"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->U), + MemberName, + Params + ); @@ -905,15 +1343,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->V), - CSz("V"), - Params - ); + { + + + + cs MemberName = CSz("V"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->V), + MemberName, + Params + ); @@ -921,15 +1367,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->W), - CSz("W"), - Params - ); + { + + + + cs MemberName = CSz("W"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->W), + MemberName, + Params + ); @@ -937,15 +1391,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->X), - CSz("X"), - Params - ); + { + + + + cs MemberName = CSz("X"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->X), + MemberName, + Params + ); @@ -953,15 +1415,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Y), - CSz("Y"), - Params - ); + { + + + + cs MemberName = CSz("Y"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Y), + MemberName, + Params + ); @@ -969,15 +1439,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->Z), - CSz("Z"), - Params - ); + { + + + + cs MemberName = CSz("Z"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->Z), + MemberName, + Params + ); @@ -985,15 +1463,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->RMB), - CSz("RMB"), - Params - ); + { + + + + cs MemberName = CSz("RMB"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->RMB), + MemberName, + Params + ); @@ -1001,15 +1487,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->LMB), - CSz("LMB"), - Params - ); + { + + + + cs MemberName = CSz("LMB"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->LMB), + MemberName, + Params + ); @@ -1017,15 +1511,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input_event*, &Element->MMB), - CSz("MMB"), - Params - ); + { + + + + cs MemberName = CSz("MMB"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input_event*, &Element->MMB), + MemberName, + Params + ); @@ -1033,15 +1535,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->MouseWheelDelta), - CSz("MouseWheelDelta"), - Params - ); + { + + + + cs MemberName = CSz("MouseWheelDelta"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->MouseWheelDelta), + MemberName, + Params + ); @@ -1049,6 +1559,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 04656cd16..8175a3bb2 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -26,32 +26,48 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->Clicked), - CSz("Clicked"), - &DefaultUiRenderParams_Checkbox - ); + + { + + + + cs MemberName = CSz("Clicked"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Clicked), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->Pressed), - CSz("Pressed"), - &DefaultUiRenderParams_Checkbox - ); + + { + + + + cs MemberName = CSz("Pressed"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Pressed), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 65acf3ea2..4d8d4ba7e 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->tEnd), - CSz("tEnd"), - Params - ); + + { + + + + cs MemberName = CSz("tEnd"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->tEnd), + MemberName, + Params + ); @@ -41,16 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Value), - CSz("Value"), - Params - ); + + { + + + + cs MemberName = CSz("Value"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Value), + MemberName, + Params + ); @@ -58,6 +72,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 4cf4567ae..44a800127 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:321:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->LayerCount), - CSz("LayerCount"), - Params - ); + + { + + + + cs MemberName = CSz("LayerCount"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->LayerCount), + MemberName, + Params + ); @@ -41,33 +47,52 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na + } + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v Layers[16]"), CSz("> Layers[16]"), UiId(Window, "toggle layered_brush brush_layer Layers", Element->Layers), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 16) - { - DoEditorUi(Ui, Window, Element->Layers+ArrayIndex, FSz("Layers[%d]", ArrayIndex), Params); + - + { + + + + cs MemberName = CSz("Layers"); + + + if (ToggleButton(Ui, CSz("v Layers[16]"), CSz("> Layers[16]"), UiId(Window, "toggle layered_brush brush_layer Layers", Element->Layers), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 16) + { + DoEditorUi(Ui, Window, Element->Layers+ArrayIndex, FSz("Layers[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->SeedBrushWithSelection), - CSz("SeedBrushWithSelection"), - Params - ); + + + { + + + + cs MemberName = CSz("SeedBrushWithSelection"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->SeedBrushWithSelection), + MemberName, + Params + ); @@ -75,17 +100,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->BrushFollowsCursor), - CSz("BrushFollowsCursor"), - Params - ); + + { + + + + cs MemberName = CSz("BrushFollowsCursor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->BrushFollowsCursor), + MemberName, + Params + ); @@ -93,15 +125,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode*, &Element->Mode), - CSz("Mode"), - Params - ); + + + { + + + + cs MemberName = CSz("Mode"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_blend_mode*, &Element->Mode), + MemberName, + Params + ); @@ -109,15 +150,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode_modifier*, &Element->Modifier), - CSz("Modifier"), - Params - ); + + + { + + + + cs MemberName = CSz("Modifier"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_blend_mode_modifier*, &Element->Modifier), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 55c3047d9..5d8770f84 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:465:0 +// src/engine/editor.cpp:462:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*, Element->Memory), - CSz("Memory"), - Params - ); + + { + + + + cs MemberName = CSz("Memory"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(memory_arena*, Element->Memory), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_tool*, &Element->Tool), - CSz("Tool"), - Params - ); + { + + + + cs MemberName = CSz("Tool"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_tool*, &Element->Tool), + MemberName, + Params + ); @@ -57,14 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_tool*, &Element->PreviousTool), - CSz("PreviousTool"), - Params - ); + + + { + + + + cs MemberName = CSz("PreviousTool"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_tool*, &Element->PreviousTool), + MemberName, + Params + ); @@ -72,16 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->SelectionFollowsCursor), - CSz("SelectionFollowsCursor"), - Params - ); + + { + + + + cs MemberName = CSz("SelectionFollowsCursor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->SelectionFollowsCursor), + MemberName, + Params + ); @@ -89,29 +119,46 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->RootChunkNeedsNewMesh), - CSz("RootChunkNeedsNewMesh"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("RootChunkNeedsNewMesh"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->RootChunkNeedsNewMesh), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, &Element->EngineDebugViewModeToggleBits), - CSz("EngineDebugViewModeToggleBits"), - Params - ); + + + { + + + + cs MemberName = CSz("EngineDebugViewModeToggleBits"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, &Element->EngineDebugViewModeToggleBits), + MemberName, + Params + ); @@ -119,16 +166,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u16*, &Element->HoverColorIndex), - CSz("HoverColorIndex"), - Params - ); + + + { + + + + cs MemberName = CSz("HoverColorIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u16*, &Element->HoverColorIndex), + MemberName, + Params + ); @@ -136,17 +191,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(selection_region*, &Element->Selection), - CSz("Selection"), - Params - ); + + { + + + + cs MemberName = CSz("Selection"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(selection_region*, &Element->Selection), + MemberName, + Params + ); @@ -154,15 +216,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(rect3cp*, &Element->CopyRegion), - CSz("CopyRegion"), - Params - ); + { + + + + cs MemberName = CSz("CopyRegion"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(rect3cp*, &Element->CopyRegion), + MemberName, + Params + ); @@ -170,14 +240,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(selection_modification_state*, &Element->Entity), - CSz("Entity"), - Params - ); + + + { + + + + cs MemberName = CSz("Entity"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(selection_modification_state*, &Element->Entity), + MemberName, + Params + ); @@ -185,15 +264,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(asset_thumbnail_block_array*, &Element->AssetThumbnails), - CSz("AssetThumbnails"), - Params - ); + + + { + + + + cs MemberName = CSz("AssetThumbnails"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(asset_thumbnail_block_array*, &Element->AssetThumbnails), + MemberName, + Params + ); @@ -201,63 +288,96 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->NewAssetFromSelection), - CSz("NewAssetFromSelection"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("NewAssetFromSelection"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->NewAssetFromSelection), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v NewAssetFromSelectionFilename[512]"), CSz("> NewAssetFromSelectionFilename[512]"), UiId(Window, "toggle level_editor char NewAssetFromSelectionFilename", Element->NewAssetFromSelectionFilename), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 512) - { - DoEditorUi(Ui, Window, Element->NewAssetFromSelectionFilename+ArrayIndex, FSz("NewAssetFromSelectionFilename[%d]", ArrayIndex), Params); + - PushNewRow(Ui); + { + + + + cs MemberName = CSz("NewAssetFromSelectionFilename"); + + + if (ToggleButton(Ui, CSz("v NewAssetFromSelectionFilename[512]"), CSz("> NewAssetFromSelectionFilename[512]"), UiId(Window, "toggle level_editor char NewAssetFromSelectionFilename", Element->NewAssetFromSelectionFilename), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 512) + { + DoEditorUi(Ui, Window, Element->NewAssetFromSelectionFilename+ArrayIndex, FSz("NewAssetFromSelectionFilename[%d]", ArrayIndex), Params); + + PushNewRow(Ui); + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->MaskSelection), - CSz("MaskSelection"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("MaskSelection"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->MaskSelection), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->NextEditOrdinal), - CSz("NextEditOrdinal"), - Params - ); + + { + + + + cs MemberName = CSz("NextEditOrdinal"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->NextEditOrdinal), + MemberName, + Params + ); @@ -265,16 +385,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_layer_block_array*, &Element->Layers), - CSz("Layers"), - Params - ); + + { + + + + cs MemberName = CSz("Layers"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_layer_block_array*, &Element->Layers), + MemberName, + Params + ); @@ -282,14 +410,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_brush_hashtable*, &Element->LoadedBrushes), - CSz("LoadedBrushes"), - Params - ); + + + { + + + + cs MemberName = CSz("LoadedBrushes"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_brush_hashtable*, &Element->LoadedBrushes), + MemberName, + Params + ); @@ -297,16 +434,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_layer*, Element->CurrentLayer), - CSz("CurrentLayer"), - Params - ); + + { + + + + cs MemberName = CSz("CurrentLayer"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_layer*, Element->CurrentLayer), + MemberName, + Params + ); @@ -314,15 +458,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_layer*, Element->HotLayer), - CSz("HotLayer"), - Params - ); + { + + + + cs MemberName = CSz("HotLayer"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_layer*, Element->HotLayer), + MemberName, + Params + ); @@ -330,14 +482,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit*, Element->CurrentEdit), - CSz("CurrentEdit"), - Params - ); + + + { + + + + cs MemberName = CSz("CurrentEdit"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit*, Element->CurrentEdit), + MemberName, + Params + ); @@ -345,15 +506,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit*, Element->HotEdit), - CSz("HotEdit"), - Params - ); + + + { + + + + cs MemberName = CSz("HotEdit"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit*, Element->HotEdit), + MemberName, + Params + ); @@ -361,15 +530,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_brush*, Element->CurrentBrush), - CSz("CurrentBrush"), - Params - ); + + + { + + + + cs MemberName = CSz("CurrentBrush"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_brush*, Element->CurrentBrush), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 5bd9d4d99..c08b91378 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:432:0 +// src/engine/editor.cpp:429:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(game_lights*, &Element->Lights), - CSz("Lights"), - Params - ); + + { + + + + cs MemberName = CSz("Lights"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(game_lights*, &Element->Lights), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*, &Element->FBO), - CSz("FBO"), - Params - ); + { + + + + cs MemberName = CSz("FBO"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(framebuffer*, &Element->FBO), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->LuminanceTex), - CSz("LuminanceTex"), - Params - ); + { + + + + cs MemberName = CSz("LuminanceTex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->LuminanceTex), + MemberName, + Params + ); @@ -73,15 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->Shader), - CSz("Shader"), - Params - ); + { + + + + cs MemberName = CSz("Shader"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Shader), + MemberName, + Params + ); @@ -89,14 +119,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(bloom_render_group*, &Element->Bloom), - CSz("Bloom"), - Params - ); + + + { + + + + cs MemberName = CSz("Bloom"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bloom_render_group*, &Element->Bloom), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 4b461dacf..645b4b9e5 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->AutoDayNightCycle), - CSz("AutoDayNightCycle"), - Params - ); + + { + + + + cs MemberName = CSz("AutoDayNightCycle"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->AutoDayNightCycle), + MemberName, + Params + ); @@ -41,15 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->tDay), - CSz("tDay"), - Params - , -PI32, PI32 ); + + + { + + + + cs MemberName = CSz("tDay"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->tDay), + MemberName, + Params + , -PI32, PI32 ); @@ -57,16 +72,35 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->DawnIntensity), - CSz("DawnIntensity"), - Params - , 0.f, 3.f ); + + + { + + + + cs MemberName = CSz("SunP"); + + } + + + + + { + + + + cs MemberName = CSz("DawnIntensity"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->DawnIntensity), + MemberName, + Params + , 0.f, 3.f ); @@ -74,16 +108,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->DawnColor), - CSz("DawnColor"), - Params - ); + + + { + + + + cs MemberName = CSz("DawnColor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->DawnColor), + MemberName, + Params + ); @@ -91,16 +133,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->SunIntensity), - CSz("SunIntensity"), - Params - , 0.f, 3.f ); + + { + + + + cs MemberName = CSz("SunIntensity"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->SunIntensity), + MemberName, + Params + , 0.f, 3.f ); @@ -108,16 +157,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->SunColor), - CSz("SunColor"), - Params - ); + + { + + + + cs MemberName = CSz("SunColor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->SunColor), + MemberName, + Params + ); @@ -125,14 +182,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->DuskIntensity), - CSz("DuskIntensity"), - Params - , 0.f, 3.f ); + + + { + + + + cs MemberName = CSz("DuskIntensity"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->DuskIntensity), + MemberName, + Params + , 0.f, 3.f ); @@ -140,16 +206,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->DuskColor), - CSz("DuskColor"), - Params - ); + + + { + + + + cs MemberName = CSz("DuskColor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->DuskColor), + MemberName, + Params + ); @@ -157,15 +231,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->MoonIntensity), - CSz("MoonIntensity"), - Params - , 0.f, 3.f ); + + + { + + + + cs MemberName = CSz("MoonIntensity"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->MoonIntensity), + MemberName, + Params + , 0.f, 3.f ); @@ -173,16 +255,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->MoonColor), - CSz("MoonColor"), - Params - ); + + + { + + + + cs MemberName = CSz("MoonColor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->MoonColor), + MemberName, + Params + ); @@ -190,15 +280,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->CurrentSunColor), - CSz("CurrentSunColor"), - Params - ); + + + { + + + + cs MemberName = CSz("CurrentSunColor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->CurrentSunColor), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 213d9b2eb..59becbcec 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:354:0 +// src/engine/editor.cpp:351:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->MeshMask), - CSz("MeshMask"), - Params - ); + + { + + + + cs MemberName = CSz("MeshMask"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->MeshMask), + MemberName, + Params + ); @@ -41,57 +47,92 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, + } + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v GpuBufferHandles[MeshIndex_Count]"), CSz("> GpuBufferHandles[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer gpu_element_buffer_handles GpuBufferHandles", Element->GpuBufferHandles), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, MeshIndex_Count) - { - DoEditorUi(Ui, Window, Element->GpuBufferHandles+ArrayIndex, FSz("GpuBufferHandles[%d]", ArrayIndex), Params); + + + { + + + + cs MemberName = CSz("GpuBufferHandles"); + - + if (ToggleButton(Ui, CSz("v GpuBufferHandles[MeshIndex_Count]"), CSz("> GpuBufferHandles[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer gpu_element_buffer_handles GpuBufferHandles", Element->GpuBufferHandles), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, MeshIndex_Count) + { + DoEditorUi(Ui, Window, Element->GpuBufferHandles+ArrayIndex, FSz("GpuBufferHandles[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - if (ToggleButton(Ui, CSz("v E[MeshIndex_Count]"), CSz("> E[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer geo_u3d_ptr E", Element->E), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, MeshIndex_Count) - { - DoEditorUi(Ui, Window, Element->E+ArrayIndex, FSz("E[%d]", ArrayIndex), Params); + + + { + + + + cs MemberName = CSz("E"); + - + if (ToggleButton(Ui, CSz("v E[MeshIndex_Count]"), CSz("> E[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer geo_u3d_ptr E", Element->E), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, MeshIndex_Count) + { + DoEditorUi(Ui, Window, Element->E+ArrayIndex, FSz("E[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - if (ToggleButton(Ui, CSz("v Locks[MeshIndex_Count]"), CSz("> Locks[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer bonsai_futex Locks", Element->Locks), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, MeshIndex_Count) - { - DoEditorUi(Ui, Window, Element->Locks+ArrayIndex, FSz("Locks[%d]", ArrayIndex), Params); + + + { + + + + cs MemberName = CSz("Locks"); + - + if (ToggleButton(Ui, CSz("v Locks[MeshIndex_Count]"), CSz("> Locks[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer bonsai_futex Locks", Element->Locks), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, MeshIndex_Count) + { + DoEditorUi(Ui, Window, Element->Locks+ArrayIndex, FSz("Locks[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + + + } - PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index 8a1d6e153..00dada265 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:575:0 +// src/engine/editor.h:585:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(maybe_tag*, &Element->Tag), - CSz("Tag"), - Params - ); + + { + + + + cs MemberName = CSz("Tag"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(maybe_tag*, &Element->Tag), + MemberName, + Params + ); @@ -41,14 +47,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(ray*, &Element->Ray), - CSz("Ray"), - Params - ); + + { + + + + cs MemberName = CSz("Ray"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(ray*, &Element->Ray), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 076af0c73..522a213a0 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:357:0 +// src/engine/editor.cpp:354:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(vox_data*, &Element->Vox), - CSz("Vox"), - Params - ); + + { + + + + cs MemberName = CSz("Vox"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(vox_data*, &Element->Vox), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(lod_element_buffer*, &Element->Meshes), - CSz("Meshes"), - Params - ); + { + + + + cs MemberName = CSz("Meshes"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(lod_element_buffer*, &Element->Meshes), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(gpu_mapped_element_buffer*, &Element->Mesh), - CSz("Mesh"), - Params - ); + { + + + + cs MemberName = CSz("Mesh"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(gpu_mapped_element_buffer*, &Element->Mesh), + MemberName, + Params + ); @@ -73,15 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(untextured_3d_geometry_buffer*, &Element->TransparentMesh), - CSz("TransparentMesh"), - Params - ); + { + + + + cs MemberName = CSz("TransparentMesh"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(untextured_3d_geometry_buffer*, &Element->TransparentMesh), + MemberName, + Params + ); @@ -89,15 +119,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(animation*, &Element->Animation), - CSz("Animation"), - Params - ); + { + + + + cs MemberName = CSz("Animation"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(animation*, &Element->Animation), + MemberName, + Params + ); @@ -105,14 +143,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->Dim), - CSz("Dim"), - Params - ); + + { + + + + cs MemberName = CSz("Dim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*, &Element->Dim), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 33dbf8959..38557de0e 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:315:0 +// src/engine/editor.cpp:103:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(ui_noise_type*, &Element->Type), - CSz("Type"), - Params - ); + + { + + + + cs MemberName = CSz("Noise Type"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(ui_noise_type*, &Element->Type), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(white_noise_params*, &Element->White), - CSz("White"), - Params - ); + if (Element->Type == NoiseType_White) + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(white_noise_params*, &Element->White), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(perlin_noise_params*, &Element->Perlin), - CSz("Perlin"), - Params - ); + if (Element->Type == NoiseType_Perlin) + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(perlin_noise_params*, &Element->Perlin), + MemberName, + Params + ); @@ -73,14 +95,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(voronoi_noise_params*, &Element->Voronoi), - CSz("Voronoi"), - Params - ); + if (Element->Type == NoiseType_Voronoi) + + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(voronoi_noise_params*, &Element->Voronoi), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 5b654c240..fd0d7bfeb 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:391:0 +// src/engine/editor.cpp:388:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(octree_node_type*, &Element->Type), - CSz("Type"), - Params - ); + + { + + + + cs MemberName = CSz("Type"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node_type*, &Element->Type), + MemberName, + Params + ); @@ -41,42 +47,67 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->HadNoVisibleSurface), - CSz("HadNoVisibleSurface"), - &DefaultUiRenderParams_Checkbox - ); + { + + + + cs MemberName = CSz("HadNoVisibleSurface"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->HadNoVisibleSurface), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->Dirty), - CSz("Dirty"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("Dirty"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Dirty), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->WorldP), - CSz("WorldP"), - Params - ); + + + { + + + + cs MemberName = CSz("WorldP"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*, &Element->WorldP), + MemberName, + Params + ); @@ -84,16 +115,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->Resolution), - CSz("Resolution"), - Params - ); + + { + + + + cs MemberName = CSz("Resolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*, &Element->Resolution), + MemberName, + Params + ); @@ -101,15 +139,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_chunk*, Element->Chunk), - CSz("Chunk"), - Params - ); + { + + + + cs MemberName = CSz("Chunk"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_chunk*, Element->Chunk), + MemberName, + Params + ); @@ -117,32 +163,51 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + } + + - if (ToggleButton(Ui, CSz("v Children[8]"), CSz("> Children[8]"), UiId(Window, "toggle octree_node octree_node Children", Element->Children), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 8) - { - if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[ArrayIndex], CSz("Child"), Params);}; - + { + + + + cs MemberName = CSz("Children"); + + + if (ToggleButton(Ui, CSz("v Children[8]"), CSz("> Children[8]"), UiId(Window, "toggle octree_node octree_node Children", Element->Children), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 8) + { + if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[ArrayIndex], CSz("Child"), Params);}; + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(octree_node*, Element->Next), - CSz("Next"), - Params - ); + + + { + + + + cs MemberName = CSz("Next"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node*, Element->Next), + MemberName, + Params + ); @@ -150,16 +215,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_ptr_block_array*, &Element->Edits), - CSz("Edits"), - Params - ); + + { + + + + cs MemberName = CSz("Edits"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_ptr_block_array*, &Element->Edits), + MemberName, + Params + ); @@ -167,14 +239,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(bonsai_futex*, &Element->Lock), - CSz("Lock"), - Params - ); + + + { + + + + cs MemberName = CSz("Lock"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bonsai_futex*, &Element->Lock), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index d6557996d..187b8036f 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Velocity), - CSz("Velocity"), - Params - ); + + { + + + + cs MemberName = CSz("Velocity"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Velocity), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Offset), - CSz("Offset"), - Params - ); + { + + + + cs MemberName = CSz("Offset"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Offset), + MemberName, + Params + ); @@ -57,14 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u8*, &Element->Color), - CSz("Color"), - Params - ); + + { + + + + cs MemberName = CSz("Color"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u8*, &Element->Color), + MemberName, + Params + ); @@ -72,16 +95,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->IsLight), - CSz("IsLight"), - Params - ); + + + { + + + + cs MemberName = CSz("IsLight"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->IsLight), + MemberName, + Params + ); @@ -89,16 +120,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->RemainingLifespan), - CSz("RemainingLifespan"), - Params - ); + + + { + + + + cs MemberName = CSz("RemainingLifespan"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->RemainingLifespan), + MemberName, + Params + ); @@ -106,6 +145,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index f91551777..5a4967e1f 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(random_series*, &Element->Entropy), - CSz("Entropy"), - Params - ); + + { + + + + cs MemberName = CSz("Entropy"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(random_series*, &Element->Entropy), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(particle_spawn_type*, &Element->SpawnType), - CSz("SpawnType"), - Params - ); + { + + + + cs MemberName = CSz("SpawnType"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(particle_spawn_type*, &Element->SpawnType), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Drag), - CSz("Drag"), - Params - ); + { + + + + cs MemberName = CSz("Drag"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Drag), + MemberName, + Params + ); @@ -73,16 +95,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Lifetime), - CSz("Lifetime"), - Params - ); + + { + + + + cs MemberName = CSz("Lifetime"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Lifetime), + MemberName, + Params + ); @@ -90,15 +120,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->EmissionDelay), - CSz("EmissionDelay"), - Params - ); + + + { + + + + cs MemberName = CSz("EmissionDelay"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->EmissionDelay), + MemberName, + Params + ); @@ -106,16 +145,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->EmissionLifespan), - CSz("EmissionLifespan"), - Params - ); + + + { + + + + cs MemberName = CSz("EmissionLifespan"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->EmissionLifespan), + MemberName, + Params + ); @@ -123,17 +170,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->ActiveParticles), - CSz("ActiveParticles"), - Params - ); + + { + + + + cs MemberName = CSz("ActiveParticles"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->ActiveParticles), + MemberName, + Params + ); @@ -141,15 +195,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->LifespanMod), - CSz("LifespanMod"), - Params - ); + + + { + + + + cs MemberName = CSz("LifespanMod"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->LifespanMod), + MemberName, + Params + ); @@ -157,16 +220,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->ParticleLifespan), - CSz("ParticleLifespan"), - Params - ); + + + { + + + + cs MemberName = CSz("ParticleLifespan"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->ParticleLifespan), + MemberName, + Params + ); @@ -174,17 +245,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->ParticlesPerSecond), - CSz("ParticlesPerSecond"), - Params - ); + + { + + + + cs MemberName = CSz("ParticlesPerSecond"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->ParticlesPerSecond), + MemberName, + Params + ); @@ -192,16 +270,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->ParticleLightEmission), - CSz("ParticleLightEmission"), - Params - ); + + { + + + + cs MemberName = CSz("ParticleLightEmission"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->ParticleLightEmission), + MemberName, + Params + ); @@ -209,15 +295,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->ParticleLightEmissionChance), - CSz("ParticleLightEmissionChance"), - Params - ); + + + { + + + + cs MemberName = CSz("ParticleLightEmissionChance"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->ParticleLightEmissionChance), + MemberName, + Params + ); @@ -225,16 +320,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->ParticleStartingTransparency), - CSz("ParticleStartingTransparency"), - Params - ); + + + { + + + + cs MemberName = CSz("ParticleStartingTransparency"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->ParticleStartingTransparency), + MemberName, + Params + ); @@ -242,17 +345,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->ParticleEndingTransparency), - CSz("ParticleEndingTransparency"), - Params - ); + + { + + + + cs MemberName = CSz("ParticleEndingTransparency"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->ParticleEndingTransparency), + MemberName, + Params + ); @@ -260,16 +370,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->ParticleStartingDim), - CSz("ParticleStartingDim"), - Params - ); + + { + + + + cs MemberName = CSz("ParticleStartingDim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ParticleStartingDim), + MemberName, + Params + ); @@ -277,15 +395,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->ParticleEndingDim), - CSz("ParticleEndingDim"), - Params - ); + { + + + + cs MemberName = CSz("ParticleEndingDim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->ParticleEndingDim), + MemberName, + Params + ); @@ -293,16 +419,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->ParticleTurbMin), - CSz("ParticleTurbMin"), - Params - ); + + { + + + + cs MemberName = CSz("ParticleTurbMin"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ParticleTurbMin), + MemberName, + Params + ); @@ -310,15 +444,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->ParticleTurbMax), - CSz("ParticleTurbMax"), - Params - ); + { + + + + cs MemberName = CSz("ParticleTurbMax"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ParticleTurbMax), + MemberName, + Params + ); @@ -326,14 +468,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(aabb*, &Element->SpawnRegion), - CSz("SpawnRegion"), - Params - ); + + + { + + + + cs MemberName = CSz("SpawnRegion"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(aabb*, &Element->SpawnRegion), + MemberName, + Params + ); @@ -341,15 +492,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->SystemMovementCoefficient), - CSz("SystemMovementCoefficient"), - Params - ); + + + { + + + + cs MemberName = CSz("SystemMovementCoefficient"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->SystemMovementCoefficient), + MemberName, + Params + ); @@ -357,17 +516,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->ElapsedSinceLastEmission), - CSz("ElapsedSinceLastEmission"), - Params - ); + + { + + + + cs MemberName = CSz("ElapsedSinceLastEmission"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->ElapsedSinceLastEmission), + MemberName, + Params + ); @@ -375,40 +541,65 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + } + PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v PackedHSVColors[6]"), CSz("> PackedHSVColors[6]"), UiId(Window, "toggle particle_system u16 PackedHSVColors", Element->PackedHSVColors), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 6) - { - DoEditorUi(Ui, Window, Element->PackedHSVColors+ArrayIndex, FSz("PackedHSVColors[%d]", ArrayIndex), Params); + - PushNewRow(Ui); + { + + + + cs MemberName = CSz("PackedHSVColors"); + + + if (ToggleButton(Ui, CSz("v PackedHSVColors[6]"), CSz("> PackedHSVColors[6]"), UiId(Window, "toggle particle_system u16 PackedHSVColors", Element->PackedHSVColors), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 6) + { + DoEditorUi(Ui, Window, Element->PackedHSVColors+ArrayIndex, FSz("PackedHSVColors[%d]", ArrayIndex), Params); + + PushNewRow(Ui); + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } PushNewRow(Ui); - if (ToggleButton(Ui, CSz("v Particles[(4096)]"), CSz("> Particles[(4096)]"), UiId(Window, "toggle particle_system particle Particles", Element->Particles), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, (4096)) - { - DoEditorUi(Ui, Window, Element->Particles+ArrayIndex, FSz("Particles[%d]", ArrayIndex), Params); + - + { + + + + cs MemberName = CSz("Particles"); + + + if (ToggleButton(Ui, CSz("v Particles[(4096)]"), CSz("> Particles[(4096)]"), UiId(Window, "toggle particle_system particle Particles", Element->Particles), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, (4096)) + { + DoEditorUi(Ui, Window, Element->Particles+ArrayIndex, FSz("Particles[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + + + } - PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 01f1117e5..314b93be7 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:100:0 +// src/engine/editor.cpp:99:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Threshold), - CSz("Threshold"), - Params - , 0.f, 1.f ); + + { + + + + cs MemberName = CSz("Threshold"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Threshold), + MemberName, + Params + , 0.f, 1.f ); @@ -41,15 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Period), - CSz("Period"), - Params - , 0.1f, 20.f ); + + + { + + + + cs MemberName = CSz("Period"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Period), + MemberName, + Params + , 0.1f, 20.f ); @@ -57,16 +72,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Amplitude), - CSz("Amplitude"), - Params - , 0.1f, 20.f ); + + { + + + + cs MemberName = CSz("Amplitude"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Amplitude), + MemberName, + Params + , 0.1f, 20.f ); @@ -74,6 +96,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index a250965f3..6a60e459a 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Velocity), - CSz("Velocity"), - Params - ); + + { + + + + cs MemberName = CSz("Velocity"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Velocity), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Force), - CSz("Force"), - Params - ); + { + + + + cs MemberName = CSz("Force"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Force), + MemberName, + Params + ); @@ -57,14 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Delta), - CSz("Delta"), - Params - ); + + { + + + + cs MemberName = CSz("Delta"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Delta), + MemberName, + Params + ); @@ -72,16 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Mass), - CSz("Mass"), - Params - ); + + { + + + + cs MemberName = CSz("Mass"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Mass), + MemberName, + Params + ); @@ -89,15 +119,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Speed), - CSz("Speed"), - Params - ); + + + { + + + + cs MemberName = CSz("Speed"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Speed), + MemberName, + Params + ); @@ -105,6 +144,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index b2f1269e0..b0f05c5de 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->P), - CSz("P"), - Params - ); + + { + + + + cs MemberName = CSz("P"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->P), + MemberName, + Params + ); @@ -41,14 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Normal), - CSz("Normal"), - Params - ); + + + { + + + + cs MemberName = CSz("Normal"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Normal), + MemberName, + Params + ); @@ -56,16 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->d), - CSz("d"), - Params - ); + + { + + + + cs MemberName = CSz("d"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->d), + MemberName, + Params + ); @@ -73,6 +95,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r + } + PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index e03f0d328..02c8a1414 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(work_queue*, &Element->LowPriority), - CSz("LowPriority"), - Params - ); + + { + + + + cs MemberName = CSz("LowPriority"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(work_queue*, &Element->LowPriority), + MemberName, + Params + ); @@ -41,14 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(work_queue*, &Element->HighPriority), - CSz("HighPriority"), - Params - ); + + + { + + + + cs MemberName = CSz("HighPriority"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(work_queue*, &Element->HighPriority), + MemberName, + Params + ); @@ -56,16 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(work_queue*, &Element->RenderQ), - CSz("RenderQ"), - Params - ); + + { + + + + cs MemberName = CSz("RenderQ"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(work_queue*, &Element->RenderQ), + MemberName, + Params + ); @@ -73,14 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(work_queue*, &Element->WorldUpdateQ), - CSz("WorldUpdateQ"), - Params - ); + + + { + + + + cs MemberName = CSz("WorldUpdateQ"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(work_queue*, &Element->WorldUpdateQ), + MemberName, + Params + ); @@ -88,16 +119,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->HighPriorityWorkerCount), - CSz("HighPriorityWorkerCount"), - Params - ); + + { + + + + cs MemberName = CSz("HighPriorityWorkerCount"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->HighPriorityWorkerCount), + MemberName, + Params + ); @@ -105,16 +143,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(bonsai_futex*, &Element->HighPriorityModeFutex), - CSz("HighPriorityModeFutex"), - Params - ); + + { + + + + cs MemberName = CSz("HighPriorityModeFutex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bonsai_futex*, &Element->HighPriorityModeFutex), + MemberName, + Params + ); @@ -122,15 +168,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(bonsai_futex*, &Element->WorkerThreadsSuspendFutex), - CSz("WorkerThreadsSuspendFutex"), - Params - ); + { + + + + cs MemberName = CSz("WorkerThreadsSuspendFutex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bonsai_futex*, &Element->WorkerThreadsSuspendFutex), + MemberName, + Params + ); @@ -138,14 +192,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(bonsai_futex*, &Element->WorkerThreadsExitFutex), - CSz("WorkerThreadsExitFutex"), - Params - ); + + { + + + + cs MemberName = CSz("WorkerThreadsExitFutex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bonsai_futex*, &Element->WorkerThreadsExitFutex), + MemberName, + Params + ); @@ -153,16 +216,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(thread_startup_params*, Element->Threads), - CSz("Threads"), - Params - ); + + { + + + + cs MemberName = CSz("Threads"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(thread_startup_params*, Element->Threads), + MemberName, + Params + ); @@ -170,14 +240,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2*, &Element->MouseP), - CSz("MouseP"), - Params - ); + + + { + + + + cs MemberName = CSz("MouseP"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2*, &Element->MouseP), + MemberName, + Params + ); @@ -185,15 +264,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2*, &Element->MouseDP), - CSz("MouseDP"), - Params - ); + + + { + + + + cs MemberName = CSz("MouseDP"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2*, &Element->MouseDP), + MemberName, + Params + ); @@ -201,16 +288,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*, Element->Memory), - CSz("Memory"), - Params - ); + + { + + + + cs MemberName = CSz("Memory"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(memory_arena*, Element->Memory), + MemberName, + Params + ); @@ -218,15 +312,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->GameTime), - CSz("GameTime"), - Params - ); + { + + + + cs MemberName = CSz("GameTime"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->GameTime), + MemberName, + Params + ); @@ -234,16 +336,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->dt), - CSz("dt"), - Params - ); + + { + + + + cs MemberName = CSz("dt"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->dt), + MemberName, + Params + ); @@ -251,15 +361,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2*, &Element->ScreenDim), - CSz("ScreenDim"), - Params - ); + + + { + + + + cs MemberName = CSz("ScreenDim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2*, &Element->ScreenDim), + MemberName, + Params + ); @@ -267,16 +386,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input*, &Element->Input), - CSz("Input"), - Params - ); + + { + + + + cs MemberName = CSz("Input"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input*, &Element->Input), + MemberName, + Params + ); @@ -284,14 +410,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(server_state*, Element->ServerState), - CSz("ServerState"), - Params - ); + + + { + + + + cs MemberName = CSz("ServerState"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(server_state*, Element->ServerState), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 6cdda8681..c057e6e93 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Na { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, &Element->Seed), - CSz("Seed"), - Params - ); + + { + + + + cs MemberName = CSz("Seed"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, &Element->Seed), + MemberName, + Params + ); @@ -41,6 +47,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Na + } + PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index 33dc33770..9deca696a 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:572:0 +// src/engine/editor.h:582:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Origin), - CSz("Origin"), - Params - ); + + { + + + + cs MemberName = CSz("Origin"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Origin), + MemberName, + Params + ); @@ -41,14 +47,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Dir), - CSz("Dir"), - Params - ); + + { + + + + cs MemberName = CSz("Dir"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Dir), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index 7efb1ecef..354b37f36 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:560:0 +// src/engine/editor.h:570:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Min), - CSz("Min"), - Params - ); + + { + + + + cs MemberName = CSz("Min"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Min), + MemberName, + Params + ); @@ -41,14 +47,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Max), - CSz("Max"), - Params - ); + + { + + + + cs MemberName = CSz("Max"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Max), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index 59ac2c4e0..61c911f41 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:566:0 +// src/engine/editor.h:576:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*, &Element->Min), - CSz("Min"), - Params - ); + + { + + + + cs MemberName = CSz("Min"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cp*, &Element->Min), + MemberName, + Params + ); @@ -41,14 +47,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*, &Element->Max), - CSz("Max"), - Params - ); + + { + + + + cs MemberName = CSz("Max"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cp*, &Element->Max), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 679937bd5..0a7342306 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:563:0 +// src/engine/editor.h:573:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->Min), - CSz("Min"), - Params - ); + + { + + + + cs MemberName = CSz("Min"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*, &Element->Min), + MemberName, + Params + ); @@ -41,14 +47,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->Max), - CSz("Max"), - Params - ); + + { + + + + cs MemberName = CSz("Max"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*, &Element->Max), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 012c761e5..cc5593095 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:423:0 +// src/engine/editor.cpp:420:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->SolidUIVertexBuffer), - CSz("SolidUIVertexBuffer"), - Params - ); + + { + + + + cs MemberName = CSz("SolidUIVertexBuffer"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->SolidUIVertexBuffer), + MemberName, + Params + ); @@ -41,15 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->SolidUIUVBuffer), - CSz("SolidUIUVBuffer"), - Params - ); + + + { + + + + cs MemberName = CSz("SolidUIUVBuffer"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->SolidUIUVBuffer), + MemberName, + Params + ); @@ -57,16 +72,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->SolidUIColorBuffer), - CSz("SolidUIColorBuffer"), - Params - ); + + + { + + + + cs MemberName = CSz("SolidUIColorBuffer"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->SolidUIColorBuffer), + MemberName, + Params + ); @@ -74,16 +97,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->DebugTextureArray), - CSz("DebugTextureArray"), - Params - ); + + + { + + + + cs MemberName = CSz("DebugTextureArray"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->DebugTextureArray), + MemberName, + Params + ); @@ -91,16 +122,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->TextTextureUniform), - CSz("TextTextureUniform"), - Params - ); + + { + + + + cs MemberName = CSz("TextTextureUniform"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->TextTextureUniform), + MemberName, + Params + ); @@ -108,15 +146,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->Text2DShader), - CSz("Text2DShader"), - Params - ); + + + { + + + + cs MemberName = CSz("Text2DShader"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Text2DShader), + MemberName, + Params + ); @@ -124,15 +171,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->SolidUIShader), - CSz("SolidUIShader"), - Params - ); + + + { + + + + cs MemberName = CSz("SolidUIShader"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->SolidUIShader), + MemberName, + Params + ); @@ -140,15 +195,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(textured_2d_geometry_buffer*, &Element->Geo), - CSz("Geo"), - Params - ); + + + { + + + + cs MemberName = CSz("Geo"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(textured_2d_geometry_buffer*, &Element->Geo), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index a61d5016e..69b32ce21 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->BytesSolidGeoLastFrame), - CSz("BytesSolidGeoLastFrame"), - Params - ); + + { + + + + cs MemberName = CSz("BytesSolidGeoLastFrame"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->BytesSolidGeoLastFrame), + MemberName, + Params + ); @@ -41,16 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->BytesTransGeoLastFrame), - CSz("BytesTransGeoLastFrame"), - Params - ); + + { + + + + cs MemberName = CSz("BytesTransGeoLastFrame"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->BytesTransGeoLastFrame), + MemberName, + Params + ); @@ -58,16 +72,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->VertsDrawnLastFrame), - CSz("VertsDrawnLastFrame"), - Params - ); + + { + + + + cs MemberName = CSz("VertsDrawnLastFrame"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->VertsDrawnLastFrame), + MemberName, + Params + ); @@ -75,16 +97,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->DrawCallsLastFrame), - CSz("DrawCallsLastFrame"), - Params - ); + + { + + + + cs MemberName = CSz("DrawCallsLastFrame"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->DrawCallsLastFrame), + MemberName, + Params + ); @@ -92,6 +122,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index bb6805503..fa90286c8 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -26,112 +26,174 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->UseSsao), - CSz("UseSsao"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("UseSsao"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->UseSsao), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->UseShadowMapping), - CSz("UseShadowMapping"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("UseShadowMapping"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->UseShadowMapping), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->UseLightingBloom), - CSz("UseLightingBloom"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("UseLightingBloom"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->UseLightingBloom), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->BravoilMyersOIT), - CSz("BravoilMyersOIT"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("BravoilMyersOIT"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->BravoilMyersOIT), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->BravoilMcGuireOIT), - CSz("BravoilMcGuireOIT"), - &DefaultUiRenderParams_Checkbox - ); + + { + + + + cs MemberName = CSz("BravoilMcGuireOIT"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->BravoilMcGuireOIT), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->DrawMajorGrid), - CSz("DrawMajorGrid"), - &DefaultUiRenderParams_Checkbox - ); + + { + + + + cs MemberName = CSz("DrawMajorGrid"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->DrawMajorGrid), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->DrawMinorGrid), - CSz("DrawMinorGrid"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("DrawMinorGrid"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->DrawMinorGrid), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->MajorGridDim), - CSz("MajorGridDim"), - Params - , 0, 32 ); + + { + + + + cs MemberName = CSz("MajorGridDim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->MajorGridDim), + MemberName, + Params + , 0, 32 ); @@ -139,30 +201,46 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->DrawCameraGhost), - CSz("DrawCameraGhost"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("DrawCameraGhost"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->DrawCameraGhost), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->CameraGhostSize), - CSz("CameraGhostSize"), - Params - , 1, 100 ); + + { + + + + cs MemberName = CSz("CameraGhostSize"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->CameraGhostSize), + MemberName, + Params + , 1, 100 ); @@ -170,20 +248,47 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + } + PushNewRow(Ui); + { + + + + cs MemberName = CSz("Ignored"); + + } + + + + + { + + + + cs MemberName = CSz("Headless"); + + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(tone_mapping_type*, &Element->ToneMappingType), - CSz("ToneMappingType"), - Params - ); + + { + + + + cs MemberName = CSz("ToneMappingType"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(tone_mapping_type*, &Element->ToneMappingType), + MemberName, + Params + ); @@ -191,14 +296,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->GameCameraFOV), - CSz("GameCameraFOV"), - Params - , 5, 250 ); + + + { + + + + cs MemberName = CSz("GameCameraFOV"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->GameCameraFOV), + MemberName, + Params + , 5, 250 ); @@ -206,17 +320,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(lighting_settings*, &Element->Lighting), - CSz("Lighting"), - Params - ); + + { + + + + cs MemberName = CSz("Lighting"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(lighting_settings*, &Element->Lighting), + MemberName, + Params + ); @@ -224,14 +345,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2*, &Element->ApplicationResolution), - CSz("ApplicationResolution"), - Params - ); + + + { + + + + cs MemberName = CSz("ApplicationResolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2*, &Element->ApplicationResolution), + MemberName, + Params + ); @@ -239,16 +369,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2*, &Element->ShadowMapResolution), - CSz("ShadowMapResolution"), - Params - ); + + { + + + + cs MemberName = CSz("ShadowMapResolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2*, &Element->ShadowMapResolution), + MemberName, + Params + ); @@ -256,14 +393,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2*, &Element->LuminanceMapResolution), - CSz("LuminanceMapResolution"), - Params - ); + + + { + + + + cs MemberName = CSz("LuminanceMapResolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2*, &Element->LuminanceMapResolution), + MemberName, + Params + ); @@ -271,16 +417,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2i*, &Element->iApplicationResolution), - CSz("iApplicationResolution"), - Params - ); + + { + + + + cs MemberName = CSz("iApplicationResolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2i*, &Element->iApplicationResolution), + MemberName, + Params + ); @@ -288,15 +441,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2i*, &Element->iShadowMapResolution), - CSz("iShadowMapResolution"), - Params - ); + { + + + + cs MemberName = CSz("iShadowMapResolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2i*, &Element->iShadowMapResolution), + MemberName, + Params + ); @@ -304,14 +465,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2i*, &Element->iLuminanceMapResolution), - CSz("iLuminanceMapResolution"), - Params - ); + + + { + + + + cs MemberName = CSz("iLuminanceMapResolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2i*, &Element->iLuminanceMapResolution), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 0be24363c..ceebe2d2e 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:426:0 +// src/engine/editor.cpp:423:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(render_buffers_2d*, Element->TextGroup), - CSz("TextGroup"), - Params - ); + + { + + + + cs MemberName = CSz("TextGroup"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(render_buffers_2d*, Element->TextGroup), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->SpriteTextureArray), - CSz("SpriteTextureArray"), - Params - ); + { + + + + cs MemberName = CSz("SpriteTextureArray"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->SpriteTextureArray), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, &Element->InteractionStackTop), - CSz("InteractionStackTop"), - Params - ); + { + + + + cs MemberName = CSz("InteractionStackTop"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, &Element->InteractionStackTop), + MemberName, + Params + ); @@ -73,16 +95,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2*, Element->MouseP), - CSz("MouseP"), - Params - ); + + { + + + + cs MemberName = CSz("MouseP"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2*, Element->MouseP), + MemberName, + Params + ); @@ -90,15 +120,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2*, Element->MouseDP), - CSz("MouseDP"), - Params - ); + { + + + + cs MemberName = CSz("MouseDP"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2*, Element->MouseDP), + MemberName, + Params + ); @@ -106,15 +144,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2*, Element->ScreenDim), - CSz("ScreenDim"), - Params - ); + { + + + + cs MemberName = CSz("ScreenDim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2*, Element->ScreenDim), + MemberName, + Params + ); @@ -122,15 +168,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(input*, Element->Input), - CSz("Input"), - Params - ); + { + + + + cs MemberName = CSz("Input"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(input*, Element->Input), + MemberName, + Params + ); @@ -138,15 +192,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(ui_toggle_hashtable*, &Element->ToggleTable), - CSz("ToggleTable"), - Params - ); + { + + + + cs MemberName = CSz("ToggleTable"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(ui_toggle_hashtable*, &Element->ToggleTable), + MemberName, + Params + ); @@ -154,15 +216,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(window_layout_hashtable*, &Element->WindowTable), - CSz("WindowTable"), - Params - ); + { + + + + cs MemberName = CSz("WindowTable"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(window_layout_hashtable*, &Element->WindowTable), + MemberName, + Params + ); @@ -170,33 +240,51 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - if (ToggleButton(Ui, CSz("v MinimizedWindowBuffer[64]"), CSz("> MinimizedWindowBuffer[64]"), UiId(Window, "toggle renderer_2d window_layout MinimizedWindowBuffer", Element->MinimizedWindowBuffer), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 64) - { - DoEditorUi(Ui, Window, Element->MinimizedWindowBuffer+ArrayIndex, FSz("MinimizedWindowBuffer[%d]", ArrayIndex), Params); - + { + + + + cs MemberName = CSz("MinimizedWindowBuffer"); + + + if (ToggleButton(Ui, CSz("v MinimizedWindowBuffer[64]"), CSz("> MinimizedWindowBuffer[64]"), UiId(Window, "toggle renderer_2d window_layout MinimizedWindowBuffer", Element->MinimizedWindowBuffer), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 64) + { + DoEditorUi(Ui, Window, Element->MinimizedWindowBuffer+ArrayIndex, FSz("MinimizedWindowBuffer[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(window_layout*, Element->HighestWindow), - CSz("HighestWindow"), - Params - ); + + { + + + + cs MemberName = CSz("HighestWindow"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(window_layout*, Element->HighestWindow), + MemberName, + Params + ); @@ -204,15 +292,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(interactable*, &Element->Hover), - CSz("Hover"), - Params - ); + { + + + + cs MemberName = CSz("Hover"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(interactable*, &Element->Hover), + MemberName, + Params + ); @@ -220,15 +316,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(interactable*, &Element->Clicked), - CSz("Clicked"), - Params - ); + { + + + + cs MemberName = CSz("Clicked"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(interactable*, &Element->Clicked), + MemberName, + Params + ); @@ -236,15 +340,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(interactable*, &Element->Pressed), - CSz("Pressed"), - Params - ); + { + + + + cs MemberName = CSz("Pressed"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(interactable*, &Element->Pressed), + MemberName, + Params + ); @@ -252,28 +364,45 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->RequestedForceCapture), - CSz("RequestedForceCapture"), - &DefaultUiRenderParams_Checkbox - ); + { + + + + cs MemberName = CSz("RequestedForceCapture"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->RequestedForceCapture), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(text_box_edit_state*, &Element->TextEdit), - CSz("TextEdit"), - Params - ); + + + { + + + + cs MemberName = CSz("TextEdit"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(text_box_edit_state*, &Element->TextEdit), + MemberName, + Params + ); @@ -281,15 +410,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(layer_toolbar_actions*, &Element->LayerToolbarAction), - CSz("LayerToolbarAction"), - Params - ); + + + { + + + + cs MemberName = CSz("LayerToolbarAction"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(layer_toolbar_actions*, &Element->LayerToolbarAction), + MemberName, + Params + ); @@ -297,15 +434,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(untextured_2d_geometry_buffer*, &Element->Geo), - CSz("Geo"), - Params - ); + + + { + + + + cs MemberName = CSz("Geo"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(untextured_2d_geometry_buffer*, &Element->Geo), + MemberName, + Params + ); @@ -313,16 +458,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->TexturedQuadShader), - CSz("TexturedQuadShader"), - Params - ); + + { + + + + cs MemberName = CSz("TexturedQuadShader"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->TexturedQuadShader), + MemberName, + Params + ); @@ -330,14 +482,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(ui_render_command_buffer*, Element->CommandBuffer), - CSz("CommandBuffer"), - Params - ); + + + { + + + + cs MemberName = CSz("CommandBuffer"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(ui_render_command_buffer*, Element->CommandBuffer), + MemberName, + Params + ); @@ -345,16 +506,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*, &Element->RenderCommandArena), - CSz("RenderCommandArena"), - Params - ); + + { + + + + cs MemberName = CSz("RenderCommandArena"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(memory_arena*, &Element->RenderCommandArena), + MemberName, + Params + ); @@ -362,15 +530,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*, &Element->UiToggleArena), - CSz("UiToggleArena"), - Params - ); + { + + + + cs MemberName = CSz("UiToggleArena"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(memory_arena*, &Element->UiToggleArena), + MemberName, + Params + ); @@ -378,15 +554,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*, &Element->WindowTableArena), - CSz("WindowTableArena"), - Params - ); + { + + + + cs MemberName = CSz("WindowTableArena"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(memory_arena*, &Element->WindowTableArena), + MemberName, + Params + ); @@ -394,33 +578,51 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + - if (ToggleButton(Ui, CSz("v DebugColors[128]"), CSz("> DebugColors[128]"), UiId(Window, "toggle renderer_2d v3 DebugColors", Element->DebugColors), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 128) - { - DoEditorUi(Ui, Window, Element->DebugColors+ArrayIndex, FSz("DebugColors[%d]", ArrayIndex), Params); - + { + + + + cs MemberName = CSz("DebugColors"); + + + if (ToggleButton(Ui, CSz("v DebugColors[128]"), CSz("> DebugColors[128]"), UiId(Window, "toggle renderer_2d v3 DebugColors", Element->DebugColors), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 128) + { + DoEditorUi(Ui, Window, Element->DebugColors+ArrayIndex, FSz("DebugColors[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->SolidGeoCountLastFrame), - CSz("SolidGeoCountLastFrame"), - Params - ); + + { + + + + cs MemberName = CSz("SolidGeoCountLastFrame"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->SolidGeoCountLastFrame), + MemberName, + Params + ); @@ -428,16 +630,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->TextGeoCountLastFrame), - CSz("TextGeoCountLastFrame"), - Params - ); + + { + + + + cs MemberName = CSz("TextGeoCountLastFrame"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->TextGeoCountLastFrame), + MemberName, + Params + ); @@ -445,15 +655,32 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3_cursor*, Element->ColorPalette), - CSz("ColorPalette"), - Params - ); + + + { + + + + cs MemberName = CSz("ColorPalette"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3_cursor*, Element->ColorPalette), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index c8670f1d3..85a347b89 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->ID), - CSz("ID"), - Params - ); + + { + + + + cs MemberName = CSz("ID"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->ID), + MemberName, + Params + ); @@ -41,16 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader_uniform_buffer*, &Element->Uniforms), - CSz("Uniforms"), - Params - ); + + { + + + + cs MemberName = CSz("Uniforms"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader_uniform_buffer*, &Element->Uniforms), + MemberName, + Params + ); @@ -58,14 +72,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cs*, &Element->VertexSourceFilename), - CSz("VertexSourceFilename"), - Params - ); + + + { + + + + cs MemberName = CSz("VertexSourceFilename"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cs*, &Element->VertexSourceFilename), + MemberName, + Params + ); @@ -73,16 +96,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cs*, &Element->FragSourceFilename), - CSz("FragSourceFilename"), - Params - ); + + + { + + + + cs MemberName = CSz("FragSourceFilename"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cs*, &Element->FragSourceFilename), + MemberName, + Params + ); @@ -90,17 +121,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s64*, &Element->VertexTimeModifiedWhenLoaded), - CSz("VertexTimeModifiedWhenLoaded"), - Params - ); + + { + + + + cs MemberName = CSz("VertexTimeModifiedWhenLoaded"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s64*, &Element->VertexTimeModifiedWhenLoaded), + MemberName, + Params + ); @@ -108,16 +146,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s64*, &Element->FragmentTimeModifiedWhenLoaded), - CSz("FragmentTimeModifiedWhenLoaded"), - Params - ); + + { + + + + cs MemberName = CSz("FragmentTimeModifiedWhenLoaded"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s64*, &Element->FragmentTimeModifiedWhenLoaded), + MemberName, + Params + ); @@ -125,19 +171,29 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->HotReloaded), - CSz("HotReloaded"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("HotReloaded"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->HotReloaded), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index acf72ed3d..bf91e1b65 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:112:0 +// src/engine/editor.cpp:113:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shape_type*, &Element->Type), - CSz("Type"), - Params - ); + + { + + + + cs MemberName = CSz("Shape Type"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shape_type*, &Element->Type), + MemberName, + Params + ); @@ -41,14 +47,47 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name + } + + + if (Element->Type == ShapeType_Sphere) + + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_update_op_shape_params_sphere*, &Element->Sphere), + MemberName, + Params + ); + + + + + + + + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_update_op_shape_params_sphere*, &Element->Sphere), - CSz("Sphere"), - Params - ); + if (Element->Type == ShapeType_Rect) + + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_update_op_shape_params_rect*, &Element->Rect), + MemberName, + Params + ); @@ -56,16 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_update_op_shape_params_rect*, &Element->Rect), - CSz("Rect"), - Params - ); + if (Element->Type == ShapeType_Cylinder) + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_update_op_shape_params_cylinder*, &Element->Cylinder), + MemberName, + Params + ); @@ -73,15 +119,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_update_op_shape_params_cylinder*, &Element->Cylinder), - CSz("Cylinder"), - Params - ); + { + + + + cs MemberName = CSz("Threshold"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->Threshold), + MemberName, + Params + , 0.f, 1.f ); @@ -89,14 +143,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name + } + + PushNewRow(Ui); + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->Threshold), - CSz("Threshold"), - Params - , 0.f, 1.f ); + + { + + + + cs MemberName = CSz("Power"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->Power), + MemberName, + Params + , 0.f, 25.f ); @@ -104,6 +168,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 80ddb3fd2..e54cf483e 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:438:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->Program), - CSz("Program"), - Params - ); + + { + + + + cs MemberName = CSz("Program"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Program), + MemberName, + Params + ); @@ -41,33 +47,51 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con + } + - if (ToggleButton(Ui, CSz("v Uniforms[4]"), CSz("> Uniforms[4]"), UiId(Window, "toggle terrain_decoration_render_context shader_uniform Uniforms", Element->Uniforms), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 4) - { - DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + { + + + + cs MemberName = CSz("Uniforms"); + - + if (ToggleButton(Ui, CSz("v Uniforms[4]"), CSz("> Uniforms[4]"), UiId(Window, "toggle terrain_decoration_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 4) + { + DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, Element->DestTex), - CSz("DestTex"), - Params - ); + + { + + + + cs MemberName = CSz("DestTex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, Element->DestTex), + MemberName, + Params + ); @@ -75,14 +99,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*, Element->DestFBO), - CSz("DestFBO"), - Params - ); + + + { + + + + cs MemberName = CSz("DestFBO"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(framebuffer*, Element->DestFBO), + MemberName, + Params + ); @@ -90,16 +123,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, Element->DerivsTex), - CSz("DerivsTex"), - Params - ); + + { + + + + cs MemberName = CSz("DerivsTex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, Element->DerivsTex), + MemberName, + Params + ); @@ -107,15 +147,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->ChunkDim), - CSz("ChunkDim"), - Params - ); + { + + + + cs MemberName = CSz("ChunkDim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ChunkDim), + MemberName, + Params + ); @@ -123,14 +171,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->WorldspaceChunkBasis), - CSz("WorldspaceChunkBasis"), - Params - ); + + + { + + + + cs MemberName = CSz("WorldspaceChunkBasis"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->WorldspaceChunkBasis), + MemberName, + Params + ); @@ -138,15 +195,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->ChunkResolution), - CSz("ChunkResolution"), - Params - ); + + + { + + + + cs MemberName = CSz("ChunkResolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ChunkResolution), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index d8624754a..a17c03ca1 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:444:0 +// src/engine/editor.cpp:441:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->Program), - CSz("Program"), - Params - ); + + { + + + + cs MemberName = CSz("Program"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Program), + MemberName, + Params + ); @@ -41,32 +47,51 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte + } + - if (ToggleButton(Ui, CSz("v Uniforms[1]"), CSz("> Uniforms[1]"), UiId(Window, "toggle terrain_finalize_render_context shader_uniform Uniforms", Element->Uniforms), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 1) - { - DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + { + + + + cs MemberName = CSz("Uniforms"); + - + if (ToggleButton(Ui, CSz("v Uniforms[1]"), CSz("> Uniforms[1]"), UiId(Window, "toggle terrain_finalize_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 1) + { + DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->DestTex), - CSz("DestTex"), - Params - ); + + + { + + + + cs MemberName = CSz("DestTex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->DestTex), + MemberName, + Params + ); @@ -74,16 +99,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*, &Element->FBO), - CSz("FBO"), - Params - ); + + { + + + + cs MemberName = CSz("FBO"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(framebuffer*, &Element->FBO), + MemberName, + Params + ); @@ -91,14 +123,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, Element->InputTex), - CSz("InputTex"), - Params - ); + + + { + + + + cs MemberName = CSz("InputTex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, Element->InputTex), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 85f55fc49..558403910 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:438:0 +// src/engine/editor.cpp:435:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->Program), - CSz("Program"), - Params - ); + + { + + + + cs MemberName = CSz("Program"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Program), + MemberName, + Params + ); @@ -41,33 +47,51 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex + } + - if (ToggleButton(Ui, CSz("v Uniforms[3]"), CSz("> Uniforms[3]"), UiId(Window, "toggle terrain_shaping_render_context shader_uniform Uniforms", Element->Uniforms), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 3) - { - DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + { + + + + cs MemberName = CSz("Uniforms"); + - + if (ToggleButton(Ui, CSz("v Uniforms[3]"), CSz("> Uniforms[3]"), UiId(Window, "toggle terrain_shaping_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 3) + { + DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->DestTex), - CSz("DestTex"), - Params - ); + + { + + + + cs MemberName = CSz("DestTex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->DestTex), + MemberName, + Params + ); @@ -75,14 +99,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(framebuffer*, &Element->DestFBO), - CSz("DestFBO"), - Params - ); + + + { + + + + cs MemberName = CSz("DestFBO"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(framebuffer*, &Element->DestFBO), + MemberName, + Params + ); @@ -90,16 +123,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->ChunkDim), - CSz("ChunkDim"), - Params - ); + + { + + + + cs MemberName = CSz("ChunkDim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ChunkDim), + MemberName, + Params + ); @@ -107,15 +147,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->WorldspaceChunkBasis), - CSz("WorldspaceChunkBasis"), - Params - ); + { + + + + cs MemberName = CSz("WorldspaceChunkBasis"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->WorldspaceChunkBasis), + MemberName, + Params + ); @@ -123,14 +171,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->ChunkResolution), - CSz("ChunkResolution"), - Params - ); + + + { + + + + cs MemberName = CSz("ChunkResolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->ChunkResolution), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 6039d5868..6e3204f0a 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:327:0 +// src/engine/editor.cpp:324:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(rect3cp*, &Element->Region), - CSz("Region"), - Params - ); + + { + + + + cs MemberName = CSz("Region"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(rect3cp*, &Element->Region), + MemberName, + Params + ); @@ -41,14 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_brush*, Element->Brush), - CSz("Brush"), - Params - ); + + + { + + + + cs MemberName = CSz("Brush"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_brush*, Element->Brush), + MemberName, + Params + ); @@ -56,16 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->Ordinal), - CSz("Ordinal"), - Params - ); + + { + + + + cs MemberName = CSz("Ordinal"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->Ordinal), + MemberName, + Params + ); @@ -73,6 +95,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index e8ceac6f5..e92a2ebf7 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:324:0 +// src/engine/editor.cpp:321:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,21 +26,35 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("NameBuf"); auto Value = CS(Element->NameBuf); - DoEditorUi(Ui, Window, &Value, CSz("NameBuf"), Params); + DoEditorUi(Ui, Window, &Value, MemberName, Params); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode*, &Element->Mode), - CSz("Mode"), - Params - ); + + { + + + + cs MemberName = CSz("Mode"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_blend_mode*, &Element->Mode), + MemberName, + Params + ); @@ -48,14 +62,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode_modifier*, &Element->Modifier), - CSz("Modifier"), - Params - ); + + + { + + + + cs MemberName = CSz("Modifier"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_blend_mode_modifier*, &Element->Modifier), + MemberName, + Params + ); @@ -63,15 +86,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(layered_brush*, &Element->Layered), - CSz("Layered"), - Params - ); + + + { + + + + cs MemberName = CSz("Layered"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(layered_brush*, &Element->Layered), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index cda067833..bdc0f9104 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:444:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->Program), - CSz("Program"), - Params - ); + + { + + + + cs MemberName = CSz("Program"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Program), + MemberName, + Params + ); @@ -41,69 +47,107 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + } + + - if (ToggleButton(Ui, CSz("v Uniforms[4]"), CSz("> Uniforms[4]"), UiId(Window, "toggle world_edit_render_context shader_uniform Uniforms", Element->Uniforms), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 4) - { - DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); - + { + + + + cs MemberName = CSz("Uniforms"); + + + if (ToggleButton(Ui, CSz("v Uniforms[4]"), CSz("> Uniforms[4]"), UiId(Window, "toggle world_edit_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 4) + { + DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - if (ToggleButton(Ui, CSz("v PingPongFBOs[2]"), CSz("> PingPongFBOs[2]"), UiId(Window, "toggle world_edit_render_context framebuffer PingPongFBOs", Element->PingPongFBOs), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 2) - { - DoEditorUi(Ui, Window, Element->PingPongFBOs+ArrayIndex, FSz("PingPongFBOs[%d]", ArrayIndex), Params); + + + { + + + + cs MemberName = CSz("PingPongFBOs"); + - + if (ToggleButton(Ui, CSz("v PingPongFBOs[2]"), CSz("> PingPongFBOs[2]"), UiId(Window, "toggle world_edit_render_context framebuffer PingPongFBOs", Element->PingPongFBOs), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 2) + { + DoEditorUi(Ui, Window, Element->PingPongFBOs+ArrayIndex, FSz("PingPongFBOs[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - if (ToggleButton(Ui, CSz("v PingPongTextures[2]"), CSz("> PingPongTextures[2]"), UiId(Window, "toggle world_edit_render_context texture PingPongTextures", Element->PingPongTextures), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 2) - { - DoEditorUi(Ui, Window, Element->PingPongTextures+ArrayIndex, FSz("PingPongTextures[%d]", ArrayIndex), Params); + + + { + + + + cs MemberName = CSz("PingPongTextures"); + - + if (ToggleButton(Ui, CSz("v PingPongTextures[2]"), CSz("> PingPongTextures[2]"), UiId(Window, "toggle world_edit_render_context texture PingPongTextures", Element->PingPongTextures), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 2) + { + DoEditorUi(Ui, Window, Element->PingPongTextures+ArrayIndex, FSz("PingPongTextures[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + PushNewRow(Ui); + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, Element->ChunkDim), - CSz("ChunkDim"), - Params - ); + + { + + + + cs MemberName = CSz("ChunkDim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, Element->ChunkDim), + MemberName, + Params + ); @@ -111,15 +155,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, Element->WorldspaceChunkBasis), - CSz("WorldspaceChunkBasis"), - Params - ); + { + + + + cs MemberName = CSz("WorldspaceChunkBasis"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, Element->WorldspaceChunkBasis), + MemberName, + Params + ); @@ -127,15 +179,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, Element->ChunkResolution), - CSz("ChunkResolution"), - Params - ); + { + + + + cs MemberName = CSz("ChunkResolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, Element->ChunkResolution), + MemberName, + Params + ); @@ -143,15 +203,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->Type), - CSz("Type"), - Params - ); + { + + + + cs MemberName = CSz("Type"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->Type), + MemberName, + Params + ); @@ -159,6 +227,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index b50da6027..d53125e20 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->ID), - CSz("ID"), - Params - ); + + { + + + + cs MemberName = CSz("ID"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->ID), + MemberName, + Params + ); @@ -41,16 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v2i*, &Element->Dim), - CSz("Dim"), - Params - ); + + { + + + + cs MemberName = CSz("Dim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2i*, &Element->Dim), + MemberName, + Params + ); @@ -58,15 +72,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->Slices), - CSz("Slices"), - Params - ); + { + + + + cs MemberName = CSz("Slices"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->Slices), + MemberName, + Params + ); @@ -74,16 +96,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->Channels), - CSz("Channels"), - Params - ); + + { + + + + cs MemberName = CSz("Channels"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->Channels), + MemberName, + Params + ); @@ -91,29 +121,46 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->IsDepthTexture), - CSz("IsDepthTexture"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("IsDepthTexture"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->IsDepthTexture), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(texture_storage_format*, &Element->Format), - CSz("Format"), - Params - ); + + + { + + + + cs MemberName = CSz("Format"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture_storage_format*, &Element->Format), + MemberName, + Params + ); @@ -121,15 +168,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cs*, &Element->DebugName), - CSz("DebugName"), - Params - ); + + + { + + + + cs MemberName = CSz("DebugName"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cs*, &Element->DebugName), + MemberName, + Params + ); @@ -137,20 +192,29 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->Queued), - CSz("Queued"), - &DefaultUiRenderParams_Checkbox - ); + + + { + + + + cs MemberName = CSz("Queued"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Queued), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 13f53ef96..f525f6a2c 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:453:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->OutlineUiValues), - CSz("OutlineUiValues"), - Params - ); + + { + + + + cs MemberName = CSz("OutlineUiValues"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->OutlineUiValues), + MemberName, + Params + ); @@ -41,15 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->OutlineUiButtons), - CSz("OutlineUiButtons"), - Params - ); + + + { + + + + cs MemberName = CSz("OutlineUiButtons"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->OutlineUiButtons), + MemberName, + Params + ); @@ -57,16 +72,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->OutlineUiTables), - CSz("OutlineUiTables"), - Params - ); + + + { + + + + cs MemberName = CSz("OutlineUiTables"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->OutlineUiTables), + MemberName, + Params + ); @@ -74,17 +97,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->OutlineUiTableColumns), - CSz("OutlineUiTableColumns"), - Params - ); + + { + + + + cs MemberName = CSz("OutlineUiTableColumns"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->OutlineUiTableColumns), + MemberName, + Params + ); @@ -92,15 +122,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->DebugBreakOnElementClick), - CSz("DebugBreakOnElementClick"), - Params - ); + + + { + + + + cs MemberName = CSz("DebugBreakOnElementClick"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->DebugBreakOnElementClick), + MemberName, + Params + ); @@ -108,16 +147,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->DebugBreakUiCommand), - CSz("DebugBreakUiCommand"), - Params - ); + + + { + + + + cs MemberName = CSz("DebugBreakUiCommand"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->DebugBreakUiCommand), + MemberName, + Params + ); @@ -125,6 +172,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 8c989023b..fba4eac06 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->_Reserved), - CSz("_Reserved"), - Params - ); + + { + + + + cs MemberName = CSz("_Reserved"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->_Reserved), + MemberName, + Params + ); @@ -41,16 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->WindowBits), - CSz("WindowBits"), - Params - ); + + { + + + + cs MemberName = CSz("WindowBits"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->WindowBits), + MemberName, + Params + ); @@ -58,16 +72,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->InteractionBits), - CSz("InteractionBits"), - Params - ); + + { + + + + cs MemberName = CSz("InteractionBits"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->InteractionBits), + MemberName, + Params + ); @@ -75,16 +97,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->ElementBits), - CSz("ElementBits"), - Params - ); + + { + + + + cs MemberName = CSz("ElementBits"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->ElementBits), + MemberName, + Params + ); @@ -92,6 +122,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 17dae8093..6bcc855c4 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(ui_id*, &Element->Id), - CSz("Id"), - Params - ); + + { + + + + cs MemberName = CSz("Id"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(ui_id*, &Element->Id), + MemberName, + Params + ); @@ -41,19 +47,29 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, + } + + - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->ToggledOn), - CSz("ToggledOn"), - &DefaultUiRenderParams_Checkbox - ); + { + + + + cs MemberName = CSz("ToggledOn"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->ToggledOn), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index d398db3d8..1fe2006d1 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(data_type*, &Element->Type), - CSz("Type"), - Params - ); + + { + + + + cs MemberName = CSz("Type"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(data_type*, &Element->Type), + MemberName, + Params + ); @@ -41,18 +47,35 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + } + + { + + + + cs MemberName = CSz("Next"); + + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(void *, Element->Verts), - CSz("Verts"), - Params - ); + + + { + + + + cs MemberName = CSz("Verts"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(void *, Element->Verts), + MemberName, + Params + ); @@ -60,16 +83,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(void *, Element->Normals), - CSz("Normals"), - Params - ); + + + { + + + + cs MemberName = CSz("Normals"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(void *, Element->Normals), + MemberName, + Params + ); @@ -77,17 +108,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(vertex_material*, Element->Mat), - CSz("Mat"), - Params - ); + + { + + + + cs MemberName = CSz("Mat"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(vertex_material*, Element->Mat), + MemberName, + Params + ); @@ -95,15 +133,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->End), - CSz("End"), - Params - ); + { + + + + cs MemberName = CSz("End"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->End), + MemberName, + Params + ); @@ -111,16 +157,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->At), - CSz("At"), - Params - ); + + { + + + + cs MemberName = CSz("At"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->At), + MemberName, + Params + ); @@ -128,15 +182,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(untextured_3d_geometry_buffer*, Element->Parent), - CSz("Parent"), - Params - ); + + + { + + + + cs MemberName = CSz("Parent"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(untextured_3d_geometry_buffer*, Element->Parent), + MemberName, + Params + ); @@ -144,16 +207,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->BufferNeedsToGrow), - CSz("BufferNeedsToGrow"), - Params - ); + + { + + + + cs MemberName = CSz("BufferNeedsToGrow"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->BufferNeedsToGrow), + MemberName, + Params + ); @@ -161,15 +231,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, &Element->Timestamp), - CSz("Timestamp"), - Params - ); + + + { + + + + cs MemberName = CSz("Timestamp"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, &Element->Timestamp), + MemberName, + Params + ); @@ -177,6 +256,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 2a8b35f7f..b277de219 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u16*, &Element->ColorIndex), - CSz("ColorIndex"), - Params - ); + + { + + + + cs MemberName = CSz("ColorIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u16*, &Element->ColorIndex), + MemberName, + Params + ); @@ -41,15 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u8*, &Element->Transparency), - CSz("Transparency"), - Params - ); + + + { + + + + cs MemberName = CSz("Transparency"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u8*, &Element->Transparency), + MemberName, + Params + ); @@ -57,16 +72,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u8*, &Element->Emission), - CSz("Emission"), - Params - ); + + + { + + + + cs MemberName = CSz("Emission"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u8*, &Element->Emission), + MemberName, + Params + ); @@ -74,6 +97,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 68072f203..1a96a4ec8 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:103:0 +// src/engine/editor.cpp:101:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Threshold), - CSz("Threshold"), - Params - , 0.f, 1.f ); + + { + + + + cs MemberName = CSz("Threshold"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Threshold), + MemberName, + Params + , 0.f, 1.f ); @@ -41,16 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Period), - CSz("Period"), - Params - , 0.1f, 20.f ); + + { + + + + cs MemberName = CSz("Period"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Period), + MemberName, + Params + , 0.1f, 20.f ); @@ -58,14 +72,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Amplitude), - CSz("Amplitude"), - Params - , 0.1f, 20.f ); + + { + + + + cs MemberName = CSz("Amplitude"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Amplitude), + MemberName, + Params + , 0.1f, 20.f ); @@ -73,16 +96,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Squareness), - CSz("Squareness"), - Params - ); + + + { + + + + cs MemberName = CSz("Squareness"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Squareness), + MemberName, + Params + ); @@ -90,16 +121,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->MaskChance), - CSz("MaskChance"), - Params - ); + + + { + + + + cs MemberName = CSz("MaskChance"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->MaskChance), + MemberName, + Params + ); @@ -107,6 +146,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index bf4f5bf25..f5fca7591 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:345:0 +// src/engine/editor.cpp:342:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(chunk_data*, Element->ChunkData), - CSz("ChunkData"), - Params - ); + + { + + + + cs MemberName = CSz("ChunkData"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(chunk_data*, Element->ChunkData), + MemberName, + Params + ); @@ -41,6 +47,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index f135ab0fd..e3c146dae 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:336:0 +// src/engine/editor.cpp:333:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u8*, &Element->Transparency), - CSz("Transparency"), - Params - ); + + { + + + + cs MemberName = CSz("Transparency"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u8*, &Element->Transparency), + MemberName, + Params + ); @@ -41,16 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u16*, &Element->Color), - CSz("Color"), - Params - ); + + { + + + + cs MemberName = CSz("Color"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u16*, &Element->Color), + MemberName, + Params + ); @@ -58,6 +72,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 369a10aab..ca36c75e7 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:339:0 +// src/engine/editor.cpp:336:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs N { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u8*, &Element->Emission), - CSz("Emission"), - Params - ); + + { + + + + cs MemberName = CSz("Emission"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u8*, &Element->Emission), + MemberName, + Params + ); @@ -41,6 +47,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs N + } + PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 61a249c6d..a71f623a5 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Threshold), - CSz("Threshold"), - Params - ); + + { + + + + cs MemberName = CSz("Threshold"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Threshold), + MemberName, + Params + ); @@ -41,6 +47,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, + } + PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index f090fcfee..a6316290a 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(bonsai_futex*, &Element->EnqueueFutex), - CSz("EnqueueFutex"), - Params - ); + + { + + + + cs MemberName = CSz("EnqueueFutex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bonsai_futex*, &Element->EnqueueFutex), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->EnqueueIndex), - CSz("EnqueueIndex"), - Params - ); + { + + + + cs MemberName = CSz("EnqueueIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->EnqueueIndex), + MemberName, + Params + ); @@ -57,15 +71,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->DequeueIndex), - CSz("DequeueIndex"), - Params - ); + + + { + + + + cs MemberName = CSz("DequeueIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->DequeueIndex), + MemberName, + Params + ); @@ -73,16 +96,32 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(work_queue_entry*, Element->Entries), - CSz("Entries"), - Params - ); + + + { + + + + cs MemberName = CSz("Entries"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(work_queue_entry*, Element->Entries), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 253a33aed..375b053c6 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(work_queue_entry_type*, &Element->Type), - CSz("Type"), - Params - ); + + { + + + + cs MemberName = CSz("Type"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(work_queue_entry_type*, &Element->Type), + MemberName, + Params + ); @@ -41,8 +47,18 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs + } + + + { + + + + cs MemberName = CSz("(anonymous)"); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 8035658ab..3f5e2e909 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:394:0 +// src/engine/editor.cpp:391:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->Center), - CSz("Center"), - Params - ); + + { + + + + cs MemberName = CSz("Center"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*, &Element->Center), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(visible_region_size*, &Element->VisibleRegionSize), - CSz("VisibleRegionSize"), - Params - ); + { + + + + cs MemberName = CSz("VisibleRegionSize"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(visible_region_size*, &Element->VisibleRegionSize), + MemberName, + Params + ); @@ -57,14 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + } + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(octree_node*, &Element->Root), - CSz("Root"), - Params - ); + + + { + + + + cs MemberName = CSz("Root"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node*, &Element->Root), + MemberName, + Params + ); @@ -72,16 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(memory_arena*, Element->OctreeMemory), - CSz("OctreeMemory"), - Params - ); + + { + + + + cs MemberName = CSz("OctreeMemory"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(memory_arena*, Element->OctreeMemory), + MemberName, + Params + ); @@ -89,15 +119,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(octree_node_freelist*, &Element->OctreeNodeFreelist), - CSz("OctreeNodeFreelist"), - Params - ); + { + + + + cs MemberName = CSz("OctreeNodeFreelist"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node_freelist*, &Element->OctreeNodeFreelist), + MemberName, + Params + ); @@ -105,15 +143,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(octree_node_freelist*, &Element->OctreeNodeDeferFreelist), - CSz("OctreeNodeDeferFreelist"), - Params - ); + { + + + + cs MemberName = CSz("OctreeNodeDeferFreelist"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(octree_node_freelist*, &Element->OctreeNodeDeferFreelist), + MemberName, + Params + ); @@ -121,15 +167,45 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->FreeChunkCount), - CSz("FreeChunkCount"), - Params - ); + { + + + + cs MemberName = CSz("ChunkFreelistFutex"); + + } + + + + + { + + + + cs MemberName = CSz("ChunkFreelistSentinal"); + + } + + + + + { + + + + cs MemberName = CSz("FreeChunkCount"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->FreeChunkCount), + MemberName, + Params + ); @@ -137,9 +213,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + } + PushNewRow(Ui); + + + { + + + + cs MemberName = CSz("ChunkDim"); + + } + + + + { + + + + cs MemberName = CSz("ChunkMemory"); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 338787a73..f6432acd6 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:388:0 +// src/engine/editor.cpp:385:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_chunk*, Element->Next), - CSz("Next"), - Params - ); + + { + + + + cs MemberName = CSz("Next"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_chunk*, Element->Next), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(chunk_flag*, &Element->Flags), - CSz("Flags"), - Params - ); + { + + + + cs MemberName = CSz("Flags"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(chunk_flag*, &Element->Flags), + MemberName, + Params + ); @@ -57,15 +71,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->Dim), - CSz("Dim"), - Params - ); + { + + + + cs MemberName = CSz("Dim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*, &Element->Dim), + MemberName, + Params + ); @@ -73,15 +95,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, Element->Occupancy), - CSz("Occupancy"), - Params - ); + { + + + + cs MemberName = CSz("Occupancy"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, Element->Occupancy), + MemberName, + Params + ); @@ -89,15 +119,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, Element->xOccupancyBorder), - CSz("xOccupancyBorder"), - Params - ); + + + { + + + + cs MemberName = CSz("xOccupancyBorder"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, Element->xOccupancyBorder), + MemberName, + Params + ); @@ -105,16 +144,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, Element->FaceMasks), - CSz("FaceMasks"), - Params - ); + + + { + + + + cs MemberName = CSz("FaceMasks"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u64*, Element->FaceMasks), + MemberName, + Params + ); @@ -122,16 +169,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(voxel*, Element->Voxels), - CSz("Voxels"), - Params - ); + + + { + + + + cs MemberName = CSz("Voxels"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(voxel*, Element->Voxels), + MemberName, + Params + ); @@ -139,16 +194,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(voxel_lighting*, Element->VoxelLighting), - CSz("VoxelLighting"), - Params - ); + + { + + + + cs MemberName = CSz("VoxelLighting"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(voxel_lighting*, Element->VoxelLighting), + MemberName, + Params + ); @@ -156,15 +218,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(gpu_mapped_element_buffer*, &Element->Mesh), - CSz("Mesh"), - Params - ); + { + + + + cs MemberName = CSz("Mesh"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(gpu_mapped_element_buffer*, &Element->Mesh), + MemberName, + Params + ); @@ -172,15 +242,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(voxel_position_cursor*, &Element->StandingSpots), - CSz("StandingSpots"), - Params - ); + { + + + + cs MemberName = CSz("StandingSpots"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(voxel_position_cursor*, &Element->StandingSpots), + MemberName, + Params + ); @@ -188,15 +266,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->DimInChunks), - CSz("DimInChunks"), - Params - ); + { + + + + cs MemberName = CSz("DimInChunks"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*, &Element->DimInChunks), + MemberName, + Params + ); @@ -204,15 +290,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->WorldP), - CSz("WorldP"), - Params - ); + { + + + + cs MemberName = CSz("WorldP"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*, &Element->WorldP), + MemberName, + Params + ); @@ -220,15 +314,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->FilledCount), - CSz("FilledCount"), - Params - ); + { + + + + cs MemberName = CSz("FilledCount"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->FilledCount), + MemberName, + Params + ); @@ -236,15 +338,32 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + } + PushNewRow(Ui); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(entity_ptr_block_array*, &Element->Entities), - CSz("Entities"), - Params - ); + + + { + + + + cs MemberName = CSz("Entities"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(entity_ptr_block_array*, &Element->Entities), + MemberName, + Params + ); + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index d181ddf36..b36afa9f9 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:330:0 +// src/engine/editor.cpp:327:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 639de83b7..b026cef48 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:108:0 +// src/engine/editor.cpp:109:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(rect3*, &Element->Region), - CSz("Region"), - Params - ); + + { + + + + cs MemberName = CSz("Region"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(rect3*, &Element->Region), + MemberName, + Params + ); @@ -41,6 +47,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 6b4d15bd8..6c3028fcb 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:106:0 +// src/engine/editor.cpp:107:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*, &Element->Location), - CSz("Location"), - Params - ); + + { + + + + cs MemberName = CSz("Location"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cp*, &Element->Location), + MemberName, + Params + ); @@ -41,15 +47,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ + } + + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->Radius), - CSz("Radius"), - Params - ); + { + + + + cs MemberName = CSz("Radius"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->Radius), + MemberName, + Params + ); @@ -57,6 +71,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ + } + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } PushTableEnd(Ui); diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index e2bf5834a..4df9108da 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:385:0 +// src/engine/editor.cpp:382:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index c05d64f4d..a7acfb5a1 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:360:0 +// src/engine/editor.cpp:357:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 03321c1d1..1e2bf419b 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:403:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 4cfee51fb..15812dea9 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:333:0 +// src/engine/editor.cpp:330:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 99a34089c..a2796e171 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:557:0 +// src/engine/editor.h:567:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 74b5615d3..0455967a7 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:462:0 +// src/engine/editor.cpp:459:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index e998e5274..ccb0abead 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:363:0 +// src/engine/editor.cpp:360:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index c7d6ad69c..997cdb878 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:552:0 +// src/engine/editor.h:562:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 559ded0b6..056ab9ae4 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:468:0 +// src/engine/editor.cpp:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 961292ec5..a1c814ac8 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:471:0 +// src/engine/editor.cpp:468:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 023fb1e92..4ad7caf5a 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:110:0 +// src/engine/editor.cpp:111:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index f51ab78ed..43a6fa8a0 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:604:0 +// src/engine/editor.h:614:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index d4f344da3..91f9bbe59 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:762:0 +// src/engine/editor.h:772:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index a51f040f3..95e4d3a37 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:953:0 +// src/engine/editor.h:964:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 82732fc10..31668d250 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:768:0 +// src/engine/editor.h:778:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index fe1177c54..342918e15 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:751:0 +// src/engine/editor.h:761:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index f014589ee..f730d98bb 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:780:0 +// src/engine/editor.h:790:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 986a01aec..fcd6306d3 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:773:0 +// src/engine/editor.h:783:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 572ab560a..4b48bce58 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:777:0 +// src/engine/editor.h:787:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index 9800f2a44..eb1cd3c23 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:427:0 +// src/engine/editor.h:437:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index 0e33ec6bc..c114fcc7f 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:539:0 +// src/engine/editor.h:549:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index f30ac44fa..17438d3e7 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1191:0 +// src/engine/editor.h:1202:0 struct world_edit_brush_linked_list_node { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 0dee7d360..1b0c39e42 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:590:0 +// src/engine/editor.h:600:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, level_editor_flags Selection) diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 538a5ad02..92e6f185d 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:602:0 +// src/engine/editor.h:612:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index a526aaf51..b65b3fdb6 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -62,6 +62,13 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Threshold); // default + + + + + + Result &= Serialize(Bytes, &Element->Power); // default + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -116,6 +123,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer *Element, memory_arena * // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Threshold, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Power, Memory); + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 2a3332083..0044da453 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:404:0 +// src/engine/editor.cpp:401:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 8a07ff26f..a1de50d90 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:555:0 +// src/engine/editor.h:565:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_enum.h b/generated/string_and_value_tables_enum.h index a6e9bf2c0..0ec908e83 100644 --- a/generated/string_and_value_tables_enum.h +++ b/generated/string_and_value_tables_enum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:2412:0 +// src/engine/editor.cpp:2416:0 link_internal counted_string ToStringPrefixless(layer_toolbar_actions Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 71d8d6924..cd19e4a56 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:951:0 +// src/engine/editor.h:962:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index 9a824257c..ebd487dee 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:550:0 +// src/engine/editor.h:560:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 22a6596ad..62e34c7a3 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:895:0 +// src/engine/editor.h:905:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 5ca335110..865386efe 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:600:0 +// src/engine/editor.h:610:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 63fcad829..f57b4618f 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:765:0 +// src/engine/editor.h:775:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 1bbe0fca2..ee05c897d 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:748:0 +// src/engine/editor.h:758:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index a657f3380..b15b3db36 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:771:0 +// src/engine/editor.h:781:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 092c98cf2..42a772343 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:634:0 +// src/engine/editor.h:644:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index efd611add..45eebb8ea 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:757:0 +// src/engine/editor.h:767:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/generated/toolbar_for_enum_enum.h b/generated/toolbar_for_enum_enum.h index 90cb74af9..9f4ff9a76 100644 --- a/generated/toolbar_for_enum_enum.h +++ b/generated/toolbar_for_enum_enum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:2415:0 +// src/engine/editor.cpp:2419:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, layer_toolbar_actions Selection) diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index c047af9b54492604878c6baa6265de35b25d73a7..b87dd5cb1e3bf563cb8d533f87405eadd2f78818 100644 GIT binary patch delta 2682 zcmai0O>ARV70z{%XZ!g#wi7$C9XtQAoj8dd=RcE#`RR1R{I`h0bQ~vn$$K;YUGoQLBn;BI?T>%9o)J@BjN>Hf_S_ULo&}tYENGyN_Wrf7K_dQ#~q9T&x z>-X+C_dDl&=R5cCkp1h3y>`0ev$nQ2{4)~6R!T-{B@nn#(TlrzWml``YieOv(bMV% z7#r`~SIXv-e50)GRrFH6+Ni1dgDkc}1Kd7TuT+ZL1wBtM^Gdl<693ZbDQ-XbMfP>& zX1$>+|M!>-x~5VD(d{Q#l^gj|q58iFqhEAFX*R81#2tGA6DwgiMOD?x`=%}a9ue5_ zt7WIhhU87$q}0JPg+g)wZ@a^I zu;j!CJw`J5hUb^MSPpkQQ*yposZ`TD)#^zCGRH0P`$Z=_Sc?`1vc%6=Wg12Ig;A`Y#zn=c&P%%s&xN>Kvm zG7?^MFT>-p;<0~{e%qN!9>(!_<~S33Y&(@APl91^IAdiz9pjjsNr=@f{xTiK+OWt0{FnoVw1o#k0RnEfcRc@n-rP<`X5o%F5#1N9hyNUY79j zG>qew$&KsWtXI zW=0n&o&DHOKGW*FmE;&(;6$`*bBn%wNw zt6)^05WL=Ld}+*2++4Di3Uyt(nO0jwy+7KEon%a~{o1ILof6^1N4@N;0v6>Mza9w? zBlw}tkPX`-;}{Dy(`H3_#L@Eh=iy$W{5;+o?k2CIsk}M`Un%8limp*4)VOBp5FK_2 zqVYm@;k}{YJ?gFUP!A40Nl7W!wfZf*-(z(1Uk77sRakx$@=G;d#7#n!ZZh{NN1?$W z6^#hkDaeIS+{f%#W{EA<1djE%RW3*2GHo>o-gNe;mqoq4LNvZYYPR&tOdl&iW{((2lQQlkv5ARlq# zD4Ik#BD48cp*{=yh|fHvAifvwBJ7lTHy72SqE|`hdEc>k(yHyNb+ZTCNlPhXLt=c~ zAMGLNRaXkMvSc;%_sw!dcOQ1a(YJtgpHx7JF;nTR}tlcWtRi&m;MHWoBVf;9_h{Irple$w7m{(4!tCZedit>y}&DVV%3r!&2 zbXt!Wf9yUBjETBg_KP^zCz?#Cwp;=XFP>d*Jy87)tQ+>Hod}s^M zP&4Am+q><&VR+UJ9pyU$wxOp~^#g0rm^L`Do<+_Yq*IJmPPK;l zrsN`sU#14)Di*NOl&RA#qeiqb6ltq7j7$B-yW delta 2423 zcmYLLS!^5E74@UUeJ3SR5+!r7tcavU%A^)jv}DO~Y}v76$x9s@pNP@n}Gw;%bgfPUnoKwLLLzf#l*8Wd;>qxZcTsRW35 z+r95D=brn%d7HiU7Q4G_{q)eGLoef3YzCjr2XK0!mt8Su33i4?V|eEEV6V%KpU%7S zFqC#xl}_Vkw%TgFD7L%iM{#*Fh6l&fYzps3Q#gCvYf)y*VE`W`(=J_+He`(pVb$J` zz1bxGR35^Q$|;1+e_M zO_gfu_hfvPKC;VP_PN5Kru4zp!!mu9e6>=lZ9B_A?Y zx3wi{QXRQ`ayJ*XHkzs~Zh!);ZmE^88=rV?ED8&hGM+-R%qJJ`-=uvQq_Eljgh6srtwmYw)V zJ`6qo0`mE#-FzNeCT-PaZ9~RnVT3%zIft9QWZsg(*OSj5q~qg=&m%Xs)P`Kykk>m~ zSe<;4mAGO*-QSig)sCh&waTpm_Hw6T8HtfTXG_*iWlfXR1|B4{c-mv@ z7WuvxP4fw){^N+|JlM@%1S~0vS`c)p({LxNR4EK4zJep!82hd;@`H(Ka)sYy?Wi|8 z>dxZ~j!r}{OA*XP?V4O|XO%gDw8===qAWuiD`92K-%UtcpSkL9_v_w}ZBv$EZhJ91Vj3w>R&UfereGD1%=w&UUWDO3*I3<(Sz_7Ioyn;#Dc zFkMLD$HPNN^z&TXs?Azc)A1lQ?h->Dy$b^OUkpX4GUyO@(SHqtT4UN(jO zI6klsS6`Jt(5%Uox>VJgI@RtnNuM;`aMq=^rrypf*G$pGL9T50euURSj1cI-FUCXI z>zl#9x?^YzIPtJAflGZw0uRN-zp9kx)u43!}i!ZKAh=g430@N-ope7QQQy1o@~}1YfPuc(gy4Ui30!qt;5(b^Xe&8Jx*S=?q6L`r&r%{SoWmfpP zcFcumRtI5s{{ixmHA3i1QF`pCTSNPSHrjc}BuHM3Uv@iqKctrbVRw*_G3O%dDumbS zO-|kXO~79OF3Lv6eA*16(52vW%ZiuLV~GFw_uv^ck)oM}{sH=5Zfl)tdt%{gL)~m@ rb=^v9GsW~wk&8?{Tl@L1-(6U - poof(do_editor_ui_for_compound_type(perlin_noise_params)) #include - poof(do_editor_ui_for_compound_type(voronoi_noise_params)) #include +poof(do_editor_ui_for_compound_type(noise_layer)) +#include + poof(do_editor_ui_for_compound_type(world_update_op_shape_params_sphere)) #include @@ -114,7 +115,6 @@ poof(do_editor_ui_for_compound_type(shape_layer)) poof(do_editor_ui_for_compound_type(brush_settings)) #include - poof(do_editor_ui_for_container(v3_cursor)) #include @@ -312,9 +312,6 @@ poof(do_editor_ui_for_compound_type(asset_thumbnail)) poof(do_editor_ui_for_compound_type(chunk_thumbnail)) #include -poof(do_editor_ui_for_compound_type(noise_layer)) -#include - poof(do_editor_ui_for_compound_type(brush_layer)) #include @@ -1250,12 +1247,14 @@ BrushSettingsForNoiseBrush(engine_resources *Engine, window_layout *Window, nois PushTableEnd(Ui); } +#if 0 link_internal void DoSettingsForBrushLayer(engine_resources *Engine, brush_layer *Layer, window_layout *Window) { UNPACK_ENGINE_RESOURCES(Engine); - brush_settings *Settings = &Layer->Settings; + /* brush_settings *Settings = &Layer->Settings; */ + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); @@ -1321,6 +1320,7 @@ DoSettingsForBrushLayer(engine_resources *Engine, brush_layer *Layer, window_lay /* PushTableEnd(Ui); */ CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } +#endif #if 0 link_internal void @@ -1506,7 +1506,7 @@ DoColorSwatch(renderer_2d *Ui, v2 QuadDim, v3 RGB) } link_internal void -DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_layout *BrushSettingsWindow) +DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_layout *BrushSettingsWindow) { UNPACK_ENGINE_RESOURCES(Engine); @@ -1627,118 +1627,122 @@ DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, win } } - } - { - b32 ReorderUp = False; - b32 ReorderDown = False; - b32 Duplicate = False; - b32 Delete = False; - s32 EditLayerIndex = 0; - PushTableStart(Ui); - - brush_layer *Layers = Brush->Layered.Layers; - RangeIterator(LayerIndex, LayeredBrush->LayerCount) { - brush_layer *Layer = Layers + LayerIndex; - - ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", Layer); - cs LayerDetails = GetLayerUiText(Layer, GetTranArena()); - if (ToggleButton(Ui, FSz("v %d %S", LayerIndex, LayerDetails), FSz("> %d %S", LayerIndex, LayerDetails), ToggleId)) + b32 ReorderUp = False; + b32 ReorderDown = False; + b32 Duplicate = False; + b32 Delete = False; + s32 EditLayerIndex = 0; + PushTableStart(Ui); + + brush_layer *Layers = Brush->Layered.Layers; + RangeIterator(LayerIndex, LayeredBrush->LayerCount) { - if (Button(Ui, CSz("Up"), UiId(BrushSettingsWindow, "layer_reorder_up", Layer))) - { - ReorderUp = True; - EditLayerIndex = LayerIndex; - } + brush_layer *Layer = Layers + LayerIndex; - if (Button(Ui, CSz("Down"), UiId(BrushSettingsWindow, "layer_reorder_down", Layer))) + ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", Layer); + cs LayerDetails = GetLayerUiText(Layer, GetTranArena()); + if (ToggleButton(Ui, FSz("v %d %S", LayerIndex, LayerDetails), FSz("> %d %S", LayerIndex, LayerDetails), ToggleId)) { - ReorderDown = True; - EditLayerIndex = LayerIndex; - } + if (Button(Ui, CSz("Up"), UiId(BrushSettingsWindow, "layer_reorder_up", Layer))) + { + ReorderUp = True; + EditLayerIndex = LayerIndex; + } - if (Button(Ui, CSz("Dup"), UiId(BrushSettingsWindow, "layer_duplicate", Layer))) + if (Button(Ui, CSz("Down"), UiId(BrushSettingsWindow, "layer_reorder_down", Layer))) + { + ReorderDown = True; + EditLayerIndex = LayerIndex; + } + + if (Button(Ui, CSz("Dup"), UiId(BrushSettingsWindow, "layer_duplicate", Layer))) + { + Duplicate = True; + EditLayerIndex = LayerIndex; + } + + if (Button(Ui, CSz("Del"), UiId(BrushSettingsWindow, "layer_delete", Layer))) + { + Delete = True; + EditLayerIndex = LayerIndex; + } + + PushNewRow(Ui); + + /* DoSettingsForBrushLayer(Engine, Layer, BrushSettingsWindow); */ + DoEditorUi(Ui, BrushSettingsWindow, Layer, {}, &DefaultUiRenderParams_Generic); + } + else { - Duplicate = True; - EditLayerIndex = LayerIndex; + DoColorSwatch(Ui, V2(20), HSVtoRGB(Layer->Settings.HSVColor)); } - if (Button(Ui, CSz("Del"), UiId(BrushSettingsWindow, "layer_delete", Layer))) + if (IsNewBrush && LayerIndex == 0) { - Delete = True; - EditLayerIndex = LayerIndex; + SetToggleButton(Ui, ToggleId, True); } - DoSettingsForBrushLayer(Engine, Layer, BrushSettingsWindow); - } - else - { - DoColorSwatch(Ui, V2(20), HSVtoRGB(Layer->Settings.HSVColor)); - } - - if (IsNewBrush && LayerIndex == 0) - { - SetToggleButton(Ui, ToggleId, True); - } - - PushNewRow(Ui); - } - PushTableEnd(Ui); - - if (ReorderUp) - { - if (EditLayerIndex > 0) - { - brush_layer *Layer = Layers + EditLayerIndex; - brush_layer Tmp = Layers[EditLayerIndex-1]; - Layers[EditLayerIndex-1].Settings = Layer->Settings; - Layer->Settings = Tmp.Settings; + PushNewRow(Ui); } - } + PushTableEnd(Ui); - if (ReorderDown) - { - if (LayeredBrush->LayerCount) + if (ReorderUp) { - if (EditLayerIndex < LayeredBrush->LayerCount-1) + if (EditLayerIndex > 0) { brush_layer *Layer = Layers + EditLayerIndex; - brush_layer Tmp = Layers[EditLayerIndex+1]; - Layers[EditLayerIndex+1].Settings = Layer->Settings; + brush_layer Tmp = Layers[EditLayerIndex-1]; + Layers[EditLayerIndex-1].Settings = Layer->Settings; Layer->Settings = Tmp.Settings; } } - } - if (Duplicate) - { - if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) + if (ReorderDown) { - LayeredBrush->LayerCount += 1; - - // Shuffle layers forward. This conveniently duplicates the EditLayerIndex - RangeIteratorReverseRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) + if (LayeredBrush->LayerCount) { - Layers[LayerIndex].Settings = Layers[LayerIndex-1].Settings; + if (EditLayerIndex < LayeredBrush->LayerCount-1) + { + brush_layer *Layer = Layers + EditLayerIndex; + brush_layer Tmp = Layers[EditLayerIndex+1]; + Layers[EditLayerIndex+1].Settings = Layer->Settings; + Layer->Settings = Tmp.Settings; + } } } - } - if (Delete) - { - if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) + if (Duplicate) { - // Shuffle layers backwards, overwriting EditLayerIndex - RangeIteratorRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) + if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) { - Layers[LayerIndex-1].Settings = Layers[LayerIndex].Settings; + LayeredBrush->LayerCount += 1; + + // Shuffle layers forward. This conveniently duplicates the EditLayerIndex + RangeIteratorReverseRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) + { + Layers[LayerIndex].Settings = Layers[LayerIndex-1].Settings; + } } + } + + if (Delete) + { + if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) + { + // Shuffle layers backwards, overwriting EditLayerIndex + RangeIteratorRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) + { + Layers[LayerIndex-1].Settings = Layers[LayerIndex].Settings; + } - LayeredBrush->LayerCount -= 1; + LayeredBrush->LayerCount -= 1; + } } } } + } #endif @@ -1928,7 +1932,7 @@ DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, win #if 0 link_internal void -DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_tool WorldEditTool, world_edit_brush_type WorldEditBrushType) +DoBrushSettingsWindow(engine_resources *Engine, world_edit_tool WorldEditTool, world_edit_brush_type WorldEditBrushType) { UNPACK_ENGINE_RESOURCES(Engine); @@ -1953,7 +1957,7 @@ DoWorldEditSettingsWindow(engine_resources *Engine, world_edit_tool WorldEditToo case WorldEdit_BrushType_Layered: { - DoWorldEditSettingsWindow(Engine, &Engine->Editor.Brush.Layered, &Window); + DoBrushSettingsWindow(Engine, &Engine->Editor.Brush.Layered, &Window); } break; } @@ -2780,7 +2784,7 @@ DoWorldEditor(engine_resources *Engine) // the Select tool is active, doesn't update any of the brush stuff, then // the preview gets drawn because we pop back to the Layered brush tool and // there's a frame of lag. - /* DoWorldEditSettingsWindow(Engine, Editor->Tool, Editor->Brush.Type); */ + /* DoBrushSettingsWindow(Engine, Editor->Tool, Editor->Brush.Type); */ @@ -2881,7 +2885,7 @@ DoWorldEditor(engine_resources *Engine) if (Editor->CurrentBrush) { local_persist window_layout BrushSettingsWindow = WindowLayout("Brush Settings", WindowLayoutFlag_Align_Right); - DoWorldEditSettingsWindow(Engine, Editor->CurrentBrush, &BrushSettingsWindow); + DoBrushSettingsWindow(Engine, Editor->CurrentBrush, &BrushSettingsWindow); // NOTE(Jesse): Must come after the settings window draws because the // settings window detects and initializes new brushes diff --git a/src/engine/editor.h b/src/engine/editor.h index d9c99da0f..e4c991d78 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -214,80 +214,90 @@ poof( if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } type.map(member) { - member.has_tag(ui_skip)? - { - } - { - member.has_tag(ui_display_as)? + member.has_tag(ui_display_condition)? { if ((member.tag_value(ui_display_condition))) }{} + + { /// NOTE(Jesse): this scope is here for the ui_display_condition if above.. + /// Yes, it's pretty janky, but it's the best I could come up with in a few minutes. + /// + /// It also hides the MemberName local, which .. is fine .. + cs MemberName = member.has_tag(ui_display_name)? {member.tag_value(ui_display_name)}{CSz("member.name")}; + member.has_tag(ui_skip)? { - auto Value = member.tag_value(ui_display_as)(Element->member.name); - DoEditorUi(Ui, Window, &Value, CSz("member.name"), Params); } { - member.is_array? + member.has_tag(ui_construct_as)? { - if (ToggleButton(Ui, CSz("v member.name[member.array]"), CSz("> member.name[member.array]"), UiId(Window, "toggle type.name member.type member.name", Element->(member.name)), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, member.array) - { - member.has_tag(custom_ui)? - { - member.tag_value(custom_ui); - } - { - DoEditorUi(Ui, Window, Element->(member.name)+ArrayIndex, FSz("member.name[%d]", ArrayIndex), Params); - } - member.is_primitive? { PushNewRow(Ui); } - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); + auto Value = member.tag_value(ui_construct_as)(Element->member.name); + DoEditorUi(Ui, Window, &Value, MemberName, Params); } { - member.has_tag(custom_ui)? + member.is_array? { - member.tag_value(custom_ui); + member.has_tag(ui_display_name)? {poof_error(ui_display_name tag is incompatible with array members )} + + if (ToggleButton(Ui, CSz("v member.name[member.array]"), CSz("> member.name[member.array]"), UiId(Window, "toggle type.name member.type member.name", Element->(member.name)), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, member.array) + { + member.has_tag(custom_ui)? + { + member.tag_value(custom_ui); + } + { + DoEditorUi(Ui, Window, Element->(member.name)+ArrayIndex, FSz("member.name[%d]", ArrayIndex), Params); + } + member.is_primitive? { PushNewRow(Ui); } + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); } { - member.is_type(b32)? + member.has_tag(custom_ui)? { - DoEditorUi(Ui, - Window, - Cast(b8*, member.is_pointer?{}{&}Element->(member.name)), - CSz("member.name"), - &DefaultUiRenderParams_Checkbox - member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); + member.tag_value(custom_ui); } { - member.is_union? + member.is_type(b32)? { - member.name? - { - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast((member.type)*, member.is_pointer?{}{&}Element->(member.name)), - CSz("member.name"), - Params - member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); - } - { - } + DoEditorUi(Ui, + Window, + Cast(b8*, member.is_pointer?{}{&}Element->(member.name)), + MemberName, + &DefaultUiRenderParams_Checkbox + member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); } { - member.is_function? + member.is_union? { + member.name? + { + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast((member.type)*, member.is_pointer?{}{&}Element->(member.name)), + MemberName, + Params + member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); + } + { + } } { - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast((member.type)*, member.is_pointer?{}{&}Element->(member.name)), - CSz("member.name"), - Params - member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); + member.is_function? + { + } + { + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast((member.type)*, member.is_pointer?{}{&}Element->(member.name)), + MemberName, + Params + member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); + } } } } @@ -437,7 +447,7 @@ DebugSlider(renderer_2d *Ui, window_layout *Window, r32 *Value, cs Name, r32 Min auto Range = Max-Min; r32 PercFilled = ((*Value)-Min)/Range; - r32 Width = 100.f; + r32 Width = 50.f; if (Value) { @@ -897,29 +907,30 @@ poof(string_and_value_tables(shape_type)) struct shape_layer { - shape_type Type = ShapeType_Sphere; + shape_type Type; poof(@ui_display_name(CSz("Shape Type"))) // NOTE(Jesse): Intentionally not a d-union such that you can toggle between // them and your parameter selections stay intact. - world_update_op_shape_params_sphere Sphere; - world_update_op_shape_params_rect Rect; - world_update_op_shape_params_cylinder Cylinder; + world_update_op_shape_params_sphere Sphere; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Sphere)) + world_update_op_shape_params_rect Rect; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Rect)) + world_update_op_shape_params_cylinder Cylinder; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Cylinder)) // @dottedboxguy (Step5) Add an instance of the new shape here // - f32 Threshold = 0.f; poof(@ui_value_range(0.f, 1.f)) + f32 Threshold = 0.f; poof(@ui_value_range(0.f, 1.f)) + f32 Power = 10.f; poof(@ui_value_range(0.f, 25.f)) }; // NOTE(Jesse): This is intentionally not a d_union such that you can flip // between different noise selections and your parameters stay intact. struct noise_layer poof(@version(1)) { - ui_noise_type Type; + ui_noise_type Type; poof(@ui_display_name(CSz("Noise Type"))) - white_noise_params White; - perlin_noise_params Perlin; - voronoi_noise_params Voronoi; + white_noise_params White; poof(@ui_display_name({}) @ui_display_condition(Element->Type == NoiseType_White)) + perlin_noise_params Perlin; poof(@ui_display_name({}) @ui_display_condition(Element->Type == NoiseType_Perlin)) + voronoi_noise_params Voronoi; poof(@ui_display_name({}) @ui_display_condition(Element->Type == NoiseType_Voronoi)) }; struct noise_layer_0 @@ -955,10 +966,10 @@ poof(do_editor_ui_for_radio_enum(brush_layer_type)) struct brush_settings poof(@version(3)) { - brush_layer_type Type; + brush_layer_type Type; poof(@ui_display_name(CSz("BrushType"))) - noise_layer Noise; - shape_layer Shape; + noise_layer Noise; poof(@ui_display_name({}) @ui_display_condition(Element->Type == BrushLayerType_Noise)) + shape_layer Shape; poof(@ui_display_name({}) @ui_display_condition(Element->Type == BrushLayerType_Shape)) // // Common across brush types @@ -1016,8 +1027,8 @@ struct brush_settings_1 { brush_layer_type Type; - noise_layer Noise; - shape_layer Shape; + noise_layer Noise; poof(@ui_display_name({}) @ui_display_condition(Element->Type == BrushLayerType_Noise)) + shape_layer Shape; poof(@ui_display_name({}) @ui_display_condition(Element->Type == BrushLayerType_Sphere)) // // Common across brush types @@ -1080,7 +1091,7 @@ Marshal(brush_settings_0 *Stored, brush_settings *Live) struct brush_layer { - brush_settings Settings; + brush_settings Settings; poof(@ui_display_name({})) brush_settings PrevSettings; poof(@no_serialize @ui_skip) // Change detection }; @@ -1162,7 +1173,7 @@ struct world_edit_brush // NOTE(Jesse): This is so we can just copy the name of the brush in here and // not fuck around with allocating a single string when we load these in. #define NameBuf_Len (256) - char NameBuf[NameBuf_Len+1]; poof(@ui_text_box @ui_display_as(CS)) + char NameBuf[NameBuf_Len+1]; poof(@ui_text_box @ui_construct_as(CS)) /* world_edit_shape Shape; */ world_edit_blend_mode Mode; From 7d2c68e255cc5735f4212f432a2d5eb19319c306 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 6 May 2025 10:34:59 -0700 Subject: [PATCH 229/421] Add a ui_test example and do some tweaks to improve display of brush layers --- examples/blank_project/game.cpp | 4 +- examples/blank_project/game_constants.h | 8 - examples/ui_test/game.cpp | 116 ++++++ examples/ui_test/game_constants.h | 13 + examples/ui_test/game_types.h | 6 + external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_ui_toggle.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/d_union_ui_render_command.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 5 +- .../do_editor_ui_for_compound_type_asset.h | 5 +- .../do_editor_ui_for_compound_type_asset_id.h | 5 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 5 +- ...editor_ui_for_compound_type_bonsai_futex.h | 5 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 5 +- ..._editor_ui_for_compound_type_brush_layer.h | 5 +- ...itor_ui_for_compound_type_brush_settings.h | 5 +- .../do_editor_ui_for_compound_type_camera.h | 5 +- ...o_editor_ui_for_compound_type_chunk_data.h | 5 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 5 +- ...tor_ui_for_compound_type_collision_event.h | 5 +- ..._editor_ui_for_compound_type_debug_state.h | 5 +- ...editor_ui_for_compound_type_engine_debug.h | 5 +- ...or_ui_for_compound_type_engine_resources.h | 5 +- ...tor_ui_for_compound_type_engine_settings.h | 5 +- .../do_editor_ui_for_compound_type_entity.h | 5 +- ...do_editor_ui_for_compound_type_entity_id.h | 5 +- ...i_for_compound_type_entity_position_info.h | 5 +- ...ui_for_compound_type_file_traversal_node.h | 5 +- .../do_editor_ui_for_compound_type_frustum.h | 5 +- ..._for_compound_type_g_buffer_render_group.h | 5 +- ..._editor_ui_for_compound_type_game_lights.h | 5 +- ...compound_type_gpu_element_buffer_handles.h | 5 +- ..._compound_type_gpu_mapped_element_buffer.h | 5 +- .../do_editor_ui_for_compound_type_graphics.h | 5 +- ...r_ui_for_compound_type_graphics_settings.h | 5 +- .../do_editor_ui_for_compound_type_input.h | 5 +- ..._editor_ui_for_compound_type_input_event.h | 5 +- .../do_editor_ui_for_compound_type_keyframe.h | 5 +- ...ditor_ui_for_compound_type_layered_brush.h | 5 +- ...editor_ui_for_compound_type_level_editor.h | 5 +- ..._for_compound_type_lighting_render_group.h | 5 +- ...r_ui_for_compound_type_lighting_settings.h | 5 +- ..._ui_for_compound_type_lod_element_buffer.h | 5 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 7 +- .../do_editor_ui_for_compound_type_model.h | 5 +- ..._editor_ui_for_compound_type_nested_type.h | 125 ++++++ ..._editor_ui_for_compound_type_noise_layer.h | 5 +- ..._editor_ui_for_compound_type_octree_node.h | 5 +- .../do_editor_ui_for_compound_type_particle.h | 5 +- ...tor_ui_for_compound_type_particle_system.h | 5 +- ...ui_for_compound_type_perlin_noise_params.h | 5 +- .../do_editor_ui_for_compound_type_physics.h | 5 +- .../do_editor_ui_for_compound_type_plane.h | 5 +- .../do_editor_ui_for_compound_type_platform.h | 5 +- ...ditor_ui_for_compound_type_random_series.h | 5 +- .../do_editor_ui_for_compound_type_ray.h | 7 +- .../do_editor_ui_for_compound_type_rect3.h | 7 +- .../do_editor_ui_for_compound_type_rect3cp.h | 7 +- .../do_editor_ui_for_compound_type_rect3i.h | 7 +- ...r_ui_for_compound_type_render_buffers_2d.h | 5 +- ...editor_ui_for_compound_type_render_debug.h | 5 +- ...tor_ui_for_compound_type_render_settings.h | 5 +- ..._editor_ui_for_compound_type_renderer_2d.h | 5 +- .../do_editor_ui_for_compound_type_shader.h | 5 +- ..._editor_ui_for_compound_type_shape_layer.h | 5 +- .../do_editor_ui_for_compound_type_struct.h | 95 ++++- ...struct_terrain_decoration_render_context.h | 5 +- ...e_struct_terrain_finalize_render_context.h | 5 +- ...pe_struct_terrain_shaping_render_context.h | 5 +- ...r_ui_for_compound_type_struct_world_edit.h | 5 +- ...or_compound_type_struct_world_edit_brush.h | 5 +- ...nd_type_struct_world_edit_render_context.h | 5 +- ...do_editor_ui_for_compound_type_test_type.h | 238 +++++++++++ .../do_editor_ui_for_compound_type_texture.h | 5 +- .../do_editor_ui_for_compound_type_ui_debug.h | 5 +- .../do_editor_ui_for_compound_type_ui_id.h | 5 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 5 +- ...pound_type_untextured_3d_geometry_buffer.h | 5 +- ...tor_ui_for_compound_type_vertex_material.h | 5 +- ...i_for_compound_type_voronoi_noise_params.h | 5 +- .../do_editor_ui_for_compound_type_vox_data.h | 5 +- .../do_editor_ui_for_compound_type_voxel.h | 5 +- ...itor_ui_for_compound_type_voxel_lighting.h | 5 +- ..._ui_for_compound_type_white_noise_params.h | 5 +- ...o_editor_ui_for_compound_type_work_queue.h | 5 +- ...or_ui_for_compound_type_work_queue_entry.h | 5 +- .../do_editor_ui_for_compound_type_world.h | 5 +- ..._editor_ui_for_compound_type_world_chunk.h | 5 +- ...d_type_world_update_op_shape_params_rect.h | 5 +- ...type_world_update_op_shape_params_sphere.h | 5 +- generated/do_editor_ui_for_enum_asset_type.h | 1 + .../do_editor_ui_for_enum_bitfield_enum.h | 89 ++++ generated/do_editor_ui_for_enum_chunk_flag.h | 1 + generated/do_editor_ui_for_enum_data_type.h | 3 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 1 + ...editor_ui_for_enum_entity_behavior_flags.h | 1 + .../do_editor_ui_for_enum_entity_state.h | 1 + generated/do_editor_ui_for_enum_enum.h | 380 +----------------- ...o_editor_ui_for_enum_file_traversal_type.h | 1 + generated/do_editor_ui_for_enum_maybe_tag.h | 3 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 1 + generated/do_editor_ui_for_enum_radio_enum.h | 51 +++ ...do_editor_ui_for_enum_resolution_setting.h | 1 + ...itor_ui_for_enum_shader_language_setting.h | 1 + generated/do_editor_ui_for_enum_shape_type.h | 1 + generated/do_editor_ui_for_enum_test_enum.h | 47 +++ .../do_editor_ui_for_enum_tone_mapping_type.h | 1 + .../do_editor_ui_for_enum_ui_noise_type.h | 3 +- ...o_editor_ui_for_enum_visible_region_size.h | 1 + ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 3 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 3 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + ...erate_string_table_entity_behavior_flags.h | 30 +- generated/hashtable_struct_ui_toggle.h | 2 +- generated/hashtable_struct_window_layout.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- generated/maybe_ui_toggle.h | 2 +- generated/maybe_ui_toggle_ptr.h | 2 +- generated/maybe_window_layout.h | 2 +- generated/maybe_window_layout_ptr.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- .../string_and_value_tables_bitfield_enum.h | 92 +++++ .../string_and_value_tables_chunk_flag.h | 30 +- generated/string_and_value_tables_data_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 30 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_radio_enum.h | 47 +++ .../string_and_value_tables_shape_type.h | 2 +- generated/string_and_value_tables_test_enum.h | 47 +++ .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 32 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- jesse.bonsai.rdbg | Bin 16885 -> 15975 bytes jesse.make.sh | 6 +- make.sh | 7 +- src/engine/editor.cpp | 4 +- src/engine/editor.h | 69 ++-- 165 files changed, 1389 insertions(+), 696 deletions(-) create mode 100644 examples/ui_test/game.cpp create mode 100644 examples/ui_test/game_constants.h create mode 100644 examples/ui_test/game_types.h create mode 100644 generated/do_editor_ui_for_compound_type_nested_type.h create mode 100644 generated/do_editor_ui_for_compound_type_test_type.h create mode 100644 generated/do_editor_ui_for_enum_bitfield_enum.h create mode 100644 generated/do_editor_ui_for_enum_radio_enum.h create mode 100644 generated/do_editor_ui_for_enum_test_enum.h create mode 100644 generated/string_and_value_tables_bitfield_enum.h create mode 100644 generated/string_and_value_tables_radio_enum.h create mode 100644 generated/string_and_value_tables_test_enum.h diff --git a/examples/blank_project/game.cpp b/examples/blank_project/game.cpp index 4107a018f..a6eefb37f 100644 --- a/examples/blank_project/game.cpp +++ b/examples/blank_project/game.cpp @@ -32,6 +32,8 @@ BONSAI_API_WORKER_THREAD_CALLBACK() // NOTE(Jesse): Render commands should never end up on a general purpose work queue InvalidCase(type_work_queue_entry__bonsai_render_command); + case type_work_queue_entry_build_chunk_mesh: + case type_work_queue_entry_finalize_noise_values: case type_work_queue_entry_async_function_call: /* case type_work_queue_entry_update_world_region: */ case type_work_queue_entry_rebuild_mesh: @@ -70,7 +72,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() StandardCamera(Graphics->Camera, 30000.0f, 1000.0f); - AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); + AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, VisibleRegionSize_128); GameState = Allocate(game_state, Resources->GameMemory, 1); return GameState; diff --git a/examples/blank_project/game_constants.h b/examples/blank_project/game_constants.h index b37e9fadf..db1e55d09 100644 --- a/examples/blank_project/game_constants.h +++ b/examples/blank_project/game_constants.h @@ -6,14 +6,6 @@ g_VisibleRegion = Chunk_Dimension(32, 32, 8); global_variable chunk_dimension WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); #else -global_variable chunk_dimension -/* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ -/* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ -/* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ -/* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ -/* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ -g_VisibleRegion = Chunk_Dimension(256, 256, 256); // 1.63km -/* g_VisibleRegion = Chunk_Dimension(1024, 1024, 1024); */ global_variable chunk_dimension WORLD_CHUNK_DIM = Chunk_Dimension(64, 64, 64); diff --git a/examples/ui_test/game.cpp b/examples/ui_test/game.cpp new file mode 100644 index 000000000..fd910c6b9 --- /dev/null +++ b/examples/ui_test/game.cpp @@ -0,0 +1,116 @@ +// NOTE(Jesse): This includes implementations for performace profiling and debug tracing +#define BONSAI_DEBUG_SYSTEM_API 1 + +#include + +#include +#include + +BONSAI_API_MAIN_THREAD_INIT_CALLBACK() +{ + UNPACK_ENGINE_RESOURCES(Resources); + Global_AssetPrefixPath = CSz("examples/ui_test/assets"); + + world_position WorldCenter = {}; + canonical_position CameraTargetP = {}; + + StandardCamera(Graphics->Camera, 30000.0f, 1000.0f); + AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, VisibleRegionSize_128); + + GameState = Allocate(game_state, Resources->GameMemory, 1); + return GameState; +} + +enum test_enum +{ + TestEnum_Foo, + TestEnum_Bar, + TestEnum_Baz, +}; + +poof(string_and_value_tables(test_enum)) +#include +poof(do_editor_ui_for_enum(test_enum)) +#include + +enum radio_enum poof(@ui_display_radio) +{ + RadioEnum_Foo, + RadioEnum_Bar, + RadioEnum_Baz, +}; + +poof(string_and_value_tables(radio_enum)) +#include +poof(do_editor_ui_for_enum(radio_enum)) +#include + + +enum bitfield_enum poof(@bitfield) +{ + // Can put this in for testing the 0 path, or take it out to test the unset error path + /* BitfieldEnum_Unset = (0), */ + + BitfieldEnum_Foo = (1<<0), + BitfieldEnum_Bar = (1<<1), + BitfieldEnum_Baz = (1<<2), +}; + +poof(string_and_value_tables(bitfield_enum)) +#include +poof(do_editor_ui_for_enum(bitfield_enum)) +#include + + +struct nested_type +{ + s32 NestedFoo; + f32 NestedBar; + u32 Array[4]; +}; + +poof(do_editor_ui_for_compound_type(nested_type)) +#include + +struct test_type +{ + + u32 UnsignedNumber; + f32 FloatNumber; + s32 SignedNumber; + b32 Boolean; + + nested_type Nested; poof(@ui_display_name({})) + + test_enum BasicEnum; + bitfield_enum BitfieldEnum; + radio_enum RadioEnum; +}; + +poof(do_editor_ui_for_compound_type(test_type)) +#include + +BONSAI_API_MAIN_THREAD_CALLBACK() +{ + Assert(ThreadLocal_ThreadIndex == 0); + + TIMED_FUNCTION(); + UNPACK_ENGINE_RESOURCES(Resources); + + debug_global test_type Test = {}; + debug_global nested_type Nested = {}; + + window_layout *Window = GetOrCreateWindow(Ui, UiId(Cast(window_layout*, 0), "Test Window", 0u)); + + PushWindowStart(Ui, Window); + DoEditorUi(Ui, Window, &Test, CSz("Test Thing")); + + PushNewRow(Ui); + PushNewRow(Ui); + PushNewRow(Ui); + + DoEditorUi(Ui, Window, &Nested, CSz("Test Nested")); + PushWindowEnd(Ui, Window); + + +} diff --git a/examples/ui_test/game_constants.h b/examples/ui_test/game_constants.h new file mode 100644 index 000000000..db1e55d09 --- /dev/null +++ b/examples/ui_test/game_constants.h @@ -0,0 +1,13 @@ + +#if 0 +global_variable chunk_dimension +g_VisibleRegion = Chunk_Dimension(32, 32, 8); + +global_variable chunk_dimension +WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); +#else + +global_variable chunk_dimension +WORLD_CHUNK_DIM = Chunk_Dimension(64, 64, 64); + +#endif diff --git a/examples/ui_test/game_types.h b/examples/ui_test/game_types.h new file mode 100644 index 000000000..db1e8ec36 --- /dev/null +++ b/examples/ui_test/game_types.h @@ -0,0 +1,6 @@ + +// NOTE(Jesse): This is where you put data that's specific to your game +struct game_state +{ +}; + diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 9901935a3..2fcf3ccde 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 9901935a33bb53cb583bb22a6a7ac7434996ce07 +Subproject commit 2fcf3ccde1fa28f4cf78b0d34ddd4431b182094a diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 621258091..b49881e93 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2375:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2405:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index fce085062..cc0191ec1 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3355:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3385:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index f798d7c65..107a0e819 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2328:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2358:0 case type_ui_render_command_window_start: { diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index e32fd4e4a..858082ff3 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1022:0 +// src/engine/editor.h:1029:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 13526e95f..3f36bddcc 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:744:0 +// src/engine/editor.h:751:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_ui_toggle.h b/generated/are_equal_ui_toggle.h index dee15f4e4..e0f1067f3 100644 --- a/generated/are_equal_ui_toggle.h +++ b/generated/are_equal_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:144:0 +// external/bonsai_stdlib/src/ui/ui.h:155:0 link_internal b32 AreEqual(ui_toggle *Thing1, ui_toggle *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index ad8f9941b..715601807 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1199:0 +// src/engine/editor.h:1206:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 2a7a87642..fff9d144a 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:579:0 +// src/engine/editor.h:586:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 12b72b6bf..57f42d626 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1214:0 +// src/engine/editor.h:1221:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 893930c4a..3816ecf76 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1225:0 +// src/engine/editor.h:1232:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index a1ef0f35a..7119f3e8a 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1217:0 +// src/engine/editor.h:1224:0 diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index cd2285cf5..0daf69567 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:832:0 +// external/bonsai_stdlib/src/ui/ui.h:850:0 enum ui_render_command_type { diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index 096663bff..3cf6d5f02 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1087:0 +// src/engine/editor.h:1094:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index ee4e87551..d865a67a1 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1080:0 +// src/engine/editor.h:1087:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index 8beba961a..1b3ba80ec 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1073:0 +// src/engine/editor.h:1080:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index d90eaecbb..51abf8e7b 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:948:0 +// src/engine/editor.h:955:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index dfda6de86..941c3dfbb 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -222,7 +223,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index a930fb185..4b8867105 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -133,7 +134,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 3dec154d6..b82570d22 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -74,7 +75,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index f9711c82d..19c5bd3b5 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -73,7 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index f4a03009c..13d1406d4 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -98,7 +99,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 9e025c8cb..f2e49a62e 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -169,7 +170,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index f00c2456f..00eac04b6 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -60,7 +61,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index bd9ea8e88..8ae9c4daa 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -292,7 +293,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 4d00af101..88f849ed9 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -418,7 +419,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index f9cf1f7f3..0aac97daf 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -196,7 +197,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 92611ca10..097c35124 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -73,7 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index a228d0b8a..8ede0c300 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -123,7 +124,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 6685fabc8..4c16a5796 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -961,7 +962,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 10524d222..d419234ac 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -714,7 +715,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index e2967456b..f021eff6d 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -650,7 +651,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 33617a388..05ce299ef 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -52,7 +53,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 01ac1e35a..f14c05ba8 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -391,7 +392,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 506587b3d..80707bd7c 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -76,7 +77,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 14baf762b..7934abd2f 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -122,7 +123,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 42a2120a5..a942c94b9 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -100,7 +101,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index bac85e0b3..1ccff1767 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -221,7 +222,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 3815ea67f..3a92eb6ad 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -195,7 +196,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 215c668b6..295f6f018 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -147,7 +148,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 6b1c2f48e..4f9937d52 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -225,7 +226,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index e425e7bbb..80589ea78 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -73,7 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index d01af48c0..667543d69 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -891,7 +892,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 1ae0c4889..1783d2f6f 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -145,7 +146,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 246cee74c..965cbf4d1 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -1563,7 +1564,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 8175a3bb2..fcd3e5bb5 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -70,7 +71,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 4d8d4ba7e..23e90c94a 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -76,7 +77,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 44a800127..25a282b0d 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -176,7 +177,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 5d8770f84..5d1bc008f 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -556,7 +557,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index c08b91378..e8726b9b2 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -145,7 +146,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 645b4b9e5..f7e69f371 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -306,7 +307,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 59becbcec..013876492 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -134,7 +135,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index 00dada265..424b8a1db 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:585:0 +// src/engine/editor.h:592:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -73,7 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 522a213a0..f87cca622 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -169,7 +170,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_nested_type.h b/generated/do_editor_ui_for_compound_type_nested_type.h new file mode 100644 index 000000000..803f4d1e2 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_nested_type.h @@ -0,0 +1,125 @@ +// examples/ui_test/game.cpp:72:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, nested_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle nested_type", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("NestedFoo"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->NestedFoo), + MemberName, + Params + ); + + + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("NestedBar"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->NestedBar), + MemberName, + Params + ); + + + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("Array"); + + + if (ToggleButton(Ui, CSz("v Array[4]"), CSz("> Array[4]"), UiId(Window, "toggle nested_type u32 Array", Element->Array), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 4) + { + DoEditorUi(Ui, Window, Element->Array+ArrayIndex, FSz("Array[%d]", ArrayIndex), Params); + + PushNewRow(Ui); + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + } + + PushNewRow(Ui); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 38557de0e..a45502a16 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -121,7 +122,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index fd0d7bfeb..9ff5445a7 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -265,7 +266,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 187b8036f..89e2be6d7 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -149,7 +150,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 5a4967e1f..ea3a0c89a 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -601,7 +602,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 314b93be7..9e7fa096a 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -100,7 +101,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 6a60e459a..b456d812a 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -148,7 +149,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index b0f05c5de..2f35df590 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -101,7 +102,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 02c8a1414..c23c57cef 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -436,7 +437,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index c057e6e93..353bba7b1 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Na if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -53,7 +54,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Na if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index 9deca696a..d398bbb0b 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:582:0 +// src/engine/editor.h:589:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -73,7 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index 354b37f36..e39e95fe1 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:570:0 +// src/engine/editor.h:577:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -73,7 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index 61c911f41..502294c29 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:576:0 +// src/engine/editor.h:583:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -73,7 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 0a7342306..af7cfe156 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:573:0 +// src/engine/editor.h:580:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -73,7 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index cc5593095..4c6381ea7 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -221,7 +222,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 69b32ce21..de0974a60 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -126,7 +127,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index fa90286c8..6b5e16d9e 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -491,7 +492,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index ceebe2d2e..1bba17390 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -682,7 +683,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 85a347b89..8fbf9a2b6 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -197,7 +198,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index bf91e1b65..f2307ae7f 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -172,7 +173,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_struct.h b/generated/do_editor_ui_for_compound_type_struct.h index c2085ffa0..41954fc71 100644 --- a/generated/do_editor_ui_for_compound_type_struct.h +++ b/generated/do_editor_ui_for_compound_type_struct.h @@ -1,7 +1,7 @@ -// src/engine/editor.cpp:93:0 +// examples/ui_test/game.cpp:33:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, test_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) { if (Element) { @@ -11,7 +11,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs N b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle shader_uniform", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle test_type", Element), Params)) { DidToggle = True; PushNewRow(Ui); @@ -26,14 +26,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs N { PushTableStart(Ui); if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader_uniform_type*, &Element->Type), - CSz("Type"), - Params - ); + + { + + + + cs MemberName = CSz("UnsignedNumber"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->UnsignedNumber), + MemberName, + Params + ); @@ -41,14 +47,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs N + } + + PushNewRow(Ui); + - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->ID), - CSz("ID"), - Params - ); + + { + + + + cs MemberName = CSz("SignedNumber"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->SignedNumber), + MemberName, + Params + ); @@ -56,13 +72,54 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs N + } PushNewRow(Ui); - auto Value = CS(Element->Name); - DoEditorUi(Ui, Window, &Value, CSz("Name"), Params); + + + { + + + + cs MemberName = CSz("FloatNumber"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->FloatNumber), + MemberName, + Params + ); + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("Boolean"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Boolean), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + + } PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index e54cf483e..2689f3ad1 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -221,7 +222,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index a17c03ca1..608ca8673 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -149,7 +150,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 558403910..a23b81008 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -197,7 +198,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 6e3204f0a..e00249d75 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -99,7 +100,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index e92a2ebf7..87b0a7e02 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -112,7 +113,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index bdc0f9104..0a2011046 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -231,7 +232,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_test_type.h b/generated/do_editor_ui_for_compound_type_test_type.h new file mode 100644 index 000000000..c571f8b32 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_test_type.h @@ -0,0 +1,238 @@ +// examples/ui_test/game.cpp:90:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, test_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle test_type", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("UnsignedNumber"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->UnsignedNumber), + MemberName, + Params + ); + + + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("FloatNumber"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->FloatNumber), + MemberName, + Params + ); + + + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("SignedNumber"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->SignedNumber), + MemberName, + Params + ); + + + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("Boolean"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Boolean), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(nested_type*, &Element->Nested), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("BasicEnum"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(test_enum*, &Element->BasicEnum), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("BitfieldEnum"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bitfield_enum*, &Element->BitfieldEnum), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("RadioEnum"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(radio_enum*, &Element->RadioEnum), + MemberName, + Params + ); + + + + + + + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index d53125e20..0291acedf 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -218,7 +219,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index f525f6a2c..f4460bea4 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -176,7 +177,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index fba4eac06..02ed4d692 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -126,7 +127,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 6bcc855c4..9ab3a0e75 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -72,7 +73,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 1fe2006d1..e6799ad19 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -260,7 +261,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index b277de219..24c75132c 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -101,7 +102,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 1a96a4ec8..c8bb86875 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -150,7 +151,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index f5fca7591..e6e9714da 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -52,7 +53,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index e3c146dae..dfed52fa7 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -76,7 +77,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index ca36c75e7..cc505310a 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs N if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -53,7 +54,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs N if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index a71f623a5..70d36d16a 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -53,7 +54,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index a6316290a..8751146c5 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -123,7 +124,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 375b053c6..905b6d192 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -60,7 +61,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 3f5e2e909..cb3dfd4b7 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -238,7 +239,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index f6432acd6..36ed0341d 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -365,7 +366,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index b026cef48..a185f98de 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -52,7 +53,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 6c3028fcb..104541972 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -24,7 +24,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -75,7 +76,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 1e2bf419b..86752fa09 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -44,3 +44,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, } } + diff --git a/generated/do_editor_ui_for_enum_bitfield_enum.h b/generated/do_editor_ui_for_enum_bitfield_enum.h new file mode 100644 index 000000000..097231877 --- /dev/null +++ b/generated/do_editor_ui_for_enum_bitfield_enum.h @@ -0,0 +1,89 @@ +// examples/ui_test/game.cpp:61:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, bitfield_enum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + { + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Foo"), UiId(Window, "enum BitfieldEnum_Foo", Element), Params)) + { + if (BitfieldEnum_Foo == bitfield_enum(0)) + { + *Element = bitfield_enum(0); + } + else + { + if ((*Element & BitfieldEnum_Foo) == BitfieldEnum_Foo) + { + *Element = bitfield_enum(*Element&~BitfieldEnum_Foo); + } + else + { + *Element = bitfield_enum(*Element|BitfieldEnum_Foo); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Bar"), UiId(Window, "enum BitfieldEnum_Bar", Element), Params)) + { + if (BitfieldEnum_Bar == bitfield_enum(0)) + { + *Element = bitfield_enum(0); + } + else + { + if ((*Element & BitfieldEnum_Bar) == BitfieldEnum_Bar) + { + *Element = bitfield_enum(*Element&~BitfieldEnum_Bar); + } + else + { + *Element = bitfield_enum(*Element|BitfieldEnum_Bar); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Baz"), UiId(Window, "enum BitfieldEnum_Baz", Element), Params)) + { + if (BitfieldEnum_Baz == bitfield_enum(0)) + { + *Element = bitfield_enum(0); + } + else + { + if ((*Element & BitfieldEnum_Baz) == BitfieldEnum_Baz) + { + *Element = bitfield_enum(*Element&~BitfieldEnum_Baz); + } + else + { + *Element = bitfield_enum(*Element|BitfieldEnum_Baz); + } + } + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + } + else + { + PushNewRow(Ui); + } +} + + diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 15812dea9..52f4d05ec 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -155,3 +155,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, } } + diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index a2796e171..2f113cf9a 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:567:0 +// src/engine/editor.h:574:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) @@ -44,3 +44,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, } } + diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 0455967a7..2ed5bab28 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -201,3 +201,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme } } + diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index c5ed43303..29d16db11 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -224,3 +224,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen } } + diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 496dd78f8..b9965f32b 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -53,3 +53,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Nam } } + diff --git a/generated/do_editor_ui_for_enum_enum.h b/generated/do_editor_ui_for_enum_enum.h index 640bb3a56..97719e6fd 100644 --- a/generated/do_editor_ui_for_enum_enum.h +++ b/generated/do_editor_ui_for_enum_enum.h @@ -1,7 +1,7 @@ -// src/engine/editor.cpp:91:0 +// examples/ui_test/game.cpp:32:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, test_enum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) { if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } @@ -11,391 +11,27 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("1"), UiId(Window, "enum VisibleRegionSize_1", Element), Params)) + if (Button(Ui, CSz("Foo"), UiId(Window, "enum TestEnum_Foo", Element), Params)) { - if (VisibleRegionSize_1 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_1) == VisibleRegionSize_1) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_1); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_1); - } - } + *Element = TestEnum_Foo; SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("2"), UiId(Window, "enum VisibleRegionSize_2", Element), Params)) + if (Button(Ui, CSz("Bar"), UiId(Window, "enum TestEnum_Bar", Element), Params)) { - if (VisibleRegionSize_2 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_2) == VisibleRegionSize_2) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_2); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_2); - } - } + *Element = TestEnum_Bar; SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("4"), UiId(Window, "enum VisibleRegionSize_4", Element), Params)) + if (Button(Ui, CSz("Baz"), UiId(Window, "enum TestEnum_Baz", Element), Params)) { - if (VisibleRegionSize_4 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_4) == VisibleRegionSize_4) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_4); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_4); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("8"), UiId(Window, "enum VisibleRegionSize_8", Element), Params)) - { - if (VisibleRegionSize_8 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_8) == VisibleRegionSize_8) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_8); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_8); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("16"), UiId(Window, "enum VisibleRegionSize_16", Element), Params)) - { - if (VisibleRegionSize_16 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_16) == VisibleRegionSize_16) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_16); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_16); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("32"), UiId(Window, "enum VisibleRegionSize_32", Element), Params)) - { - if (VisibleRegionSize_32 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_32) == VisibleRegionSize_32) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_32); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_32); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("64"), UiId(Window, "enum VisibleRegionSize_64", Element), Params)) - { - if (VisibleRegionSize_64 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_64) == VisibleRegionSize_64) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_64); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_64); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("128"), UiId(Window, "enum VisibleRegionSize_128", Element), Params)) - { - if (VisibleRegionSize_128 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_128) == VisibleRegionSize_128) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_128); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_128); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("256"), UiId(Window, "enum VisibleRegionSize_256", Element), Params)) - { - if (VisibleRegionSize_256 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_256) == VisibleRegionSize_256) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_256); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_256); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("512"), UiId(Window, "enum VisibleRegionSize_512", Element), Params)) - { - if (VisibleRegionSize_512 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_512) == VisibleRegionSize_512) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_512); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_512); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("1024"), UiId(Window, "enum VisibleRegionSize_1024", Element), Params)) - { - if (VisibleRegionSize_1024 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_1024) == VisibleRegionSize_1024) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_1024); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_1024); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("2048"), UiId(Window, "enum VisibleRegionSize_2048", Element), Params)) - { - if (VisibleRegionSize_2048 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_2048) == VisibleRegionSize_2048) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_2048); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_2048); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("4096"), UiId(Window, "enum VisibleRegionSize_4096", Element), Params)) - { - if (VisibleRegionSize_4096 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_4096) == VisibleRegionSize_4096) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_4096); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_4096); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("8192"), UiId(Window, "enum VisibleRegionSize_8192", Element), Params)) - { - if (VisibleRegionSize_8192 == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_8192) == VisibleRegionSize_8192) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_8192); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_8192); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("16k"), UiId(Window, "enum VisibleRegionSize_16k", Element), Params)) - { - if (VisibleRegionSize_16k == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_16k) == VisibleRegionSize_16k) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_16k); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_16k); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("32k"), UiId(Window, "enum VisibleRegionSize_32k", Element), Params)) - { - if (VisibleRegionSize_32k == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_32k) == VisibleRegionSize_32k) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_32k); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_32k); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("64k"), UiId(Window, "enum VisibleRegionSize_64k", Element), Params)) - { - if (VisibleRegionSize_64k == visible_region_size(0)) - { - *Element = visible_region_size(0); - } - else - { - if ((*Element & VisibleRegionSize_64k) == VisibleRegionSize_64k) - { - *Element = visible_region_size(*Element&~VisibleRegionSize_64k); - } - else - { - *Element = visible_region_size(*Element|VisibleRegionSize_64k); - } - } + *Element = TestEnum_Baz; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index ccb0abead..eef9563aa 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -44,3 +44,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, } } + diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 997cdb878..a891c23a0 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:562:0 +// src/engine/editor.h:569:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) @@ -35,3 +35,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, } } + diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 0a321c5d8..4746d5832 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -53,3 +53,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, } } + diff --git a/generated/do_editor_ui_for_enum_radio_enum.h b/generated/do_editor_ui_for_enum_radio_enum.h new file mode 100644 index 000000000..36900b1b7 --- /dev/null +++ b/generated/do_editor_ui_for_enum_radio_enum.h @@ -0,0 +1,51 @@ +// examples/ui_test/game.cpp:45:0 + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, radio_enum Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} + +link_internal ui_toggle_button_group +RadioButtonGroup_radio_enum( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + radio_enum *Element, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_handle ButtonHandles[] = + { + { CSz("Foo"), UiId(Window, Cast(void*, Element), Cast(void*, "radio_enum RadioEnum_Foo")), RadioEnum_Foo }, + { CSz("Bar"), UiId(Window, Cast(void*, Element), Cast(void*, "radio_enum RadioEnum_Bar")), RadioEnum_Bar }, + { CSz("Baz"), UiId(Window, Cast(void*, Element), Cast(void*, "radio_enum RadioEnum_Baz")), RadioEnum_Baz }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); + return Result; +} + + + + +link_internal ui_toggle_button_group +DoEditorUi( renderer_2d *Ui, + window_layout *Window, + radio_enum *Element, + cs GroupName, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_group RadioGroup = RadioButtonGroup_radio_enum(Ui, Window, GroupName, Element, Params, ExtraFlags); + return RadioGroup; +} + + + diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 056ab9ae4..2f71cdb4f 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -44,3 +44,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, } } + diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index a1c814ac8..a6448877c 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -35,3 +35,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Elem } } + diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 4ad7caf5a..bc7d1222b 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -44,3 +44,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, } } + diff --git a/generated/do_editor_ui_for_enum_test_enum.h b/generated/do_editor_ui_for_enum_test_enum.h new file mode 100644 index 000000000..bb98bb530 --- /dev/null +++ b/generated/do_editor_ui_for_enum_test_enum.h @@ -0,0 +1,47 @@ +// examples/ui_test/game.cpp:33:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, test_enum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + { + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Foo"), UiId(Window, "enum TestEnum_Foo", Element), Params)) + { + *Element = TestEnum_Foo; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Bar"), UiId(Window, "enum TestEnum_Bar", Element), Params)) + { + *Element = TestEnum_Bar; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Baz"), UiId(Window, "enum TestEnum_Baz", Element), Params)) + { + *Element = TestEnum_Baz; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + } + else + { + PushNewRow(Ui); + } +} + + diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index be120cdf1..8e672f2ce 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -71,3 +71,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c } } + diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 43a6fa8a0..8535ae0b3 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:614:0 +// src/engine/editor.h:621:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) @@ -44,3 +44,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Na } } + diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index 2ab53ea9b..3f335d416 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -170,3 +170,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } } + diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 91f9bbe59..ed8364cb6 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:772:0 +// src/engine/editor.h:779:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 95e4d3a37..1a9a808f4 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:964:0 +// src/engine/editor.h:971:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 31668d250..b4c34f8e4 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:778:0 +// src/engine/editor.h:785:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 342918e15..dae71c177 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:761:0 +// src/engine/editor.h:768:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) @@ -132,3 +132,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifie } } + diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index f730d98bb..033064f01 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:790:0 +// src/engine/editor.h:797:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index fcd6306d3..4f111e4bd 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:783:0 +// src/engine/editor.h:790:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) @@ -89,3 +89,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode * } } + diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 4b48bce58..0a3a6ae26 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:787:0 +// src/engine/editor.h:794:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index eb1cd3c23..61ef5f7c4 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:437:0 +// src/engine/editor.h:444:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index c114fcc7f..133d32a88 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:549:0 +// src/engine/editor.h:556:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index dc4632e3d..4042e7217 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -225,6 +225,7 @@ + struct render_to_texture_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 449e3ba91..a19a85182 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -225,6 +225,7 @@ + render_to_texture_async_params render_to_texture_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 40ceec33e..b84de4900 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -225,6 +225,7 @@ + type_render_to_texture_async_params, diff --git a/generated/generate_string_table_entity_behavior_flags.h b/generated/generate_string_table_entity_behavior_flags.h index efe934a44..61b2ec88b 100644 --- a/generated/generate_string_table_entity_behavior_flags.h +++ b/generated/generate_string_table_entity_behavior_flags.h @@ -22,21 +22,27 @@ ToStringPrefixless(entity_behavior_flags Type) { u32 CurrentFlags = u32(Type); - if (CountBitsSet_Kernighan(CurrentFlags) == 1) + u32 BitsSet = CountBitsSet_Kernighan(CurrentFlags); + switch(BitsSet) { - Result = FSz("(invalid value for entity_behavior_flags (%d))", CurrentFlags); - } - else - { - u32 FirstValue = UnsetLeastSignificantSetBit(&CurrentFlags); - Result = ToStringPrefixless(entity_behavior_flags(FirstValue)); + case 0: // We likely passed 0 into this function, and the enum didn't have a 0 value + case 1: // The value we passed in was outside the range of the valid enum values + { + Result = FSz("(invalid value (%d))", CurrentFlags); + } break; - while (CurrentFlags) + default: { - u32 Value = UnsetLeastSignificantSetBit(&CurrentFlags); - cs Next = ToStringPrefixless(entity_behavior_flags(Value)); - Result = FSz("%S | %S", Result, Next); - } + u32 FirstValue = UnsetLeastSignificantSetBit(&CurrentFlags); + Result = ToStringPrefixless(entity_behavior_flags(FirstValue)); + + while (CurrentFlags) + { + u32 Value = UnsetLeastSignificantSetBit(&CurrentFlags); + cs Next = ToStringPrefixless(entity_behavior_flags(Value)); + Result = FSz("%S | %S", Result, Next); + } + } break; } } break; diff --git a/generated/hashtable_struct_ui_toggle.h b/generated/hashtable_struct_ui_toggle.h index a079e3282..91e7b0583 100644 --- a/generated/hashtable_struct_ui_toggle.h +++ b/generated/hashtable_struct_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:218:0 +// external/bonsai_stdlib/src/ui/ui.h:236:0 struct ui_toggle_linked_list_node { diff --git a/generated/hashtable_struct_window_layout.h b/generated/hashtable_struct_window_layout.h index 9bf794ec8..601f5f1ae 100644 --- a/generated/hashtable_struct_window_layout.h +++ b/generated/hashtable_struct_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:133:0 +// external/bonsai_stdlib/src/ui/ui.h:144:0 struct window_layout_linked_list_node { diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 17438d3e7..15f226d0d 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1202:0 +// src/engine/editor.h:1209:0 struct world_edit_brush_linked_list_node { diff --git a/generated/maybe_ui_toggle.h b/generated/maybe_ui_toggle.h index 086f3424e..dcede88f3 100644 --- a/generated/maybe_ui_toggle.h +++ b/generated/maybe_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:212:0 +// external/bonsai_stdlib/src/ui/ui.h:230:0 struct maybe_ui_toggle { diff --git a/generated/maybe_ui_toggle_ptr.h b/generated/maybe_ui_toggle_ptr.h index bb96cf33f..574bc2a74 100644 --- a/generated/maybe_ui_toggle_ptr.h +++ b/generated/maybe_ui_toggle_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:215:0 +// external/bonsai_stdlib/src/ui/ui.h:233:0 struct maybe_ui_toggle_ptr { diff --git a/generated/maybe_window_layout.h b/generated/maybe_window_layout.h index 8ad8dc96c..8db67d8a1 100644 --- a/generated/maybe_window_layout.h +++ b/generated/maybe_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:127:0 +// external/bonsai_stdlib/src/ui/ui.h:138:0 struct maybe_window_layout { diff --git a/generated/maybe_window_layout_ptr.h b/generated/maybe_window_layout_ptr.h index 56ce02a37..2a63b683c 100644 --- a/generated/maybe_window_layout_ptr.h +++ b/generated/maybe_window_layout_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:130:0 +// external/bonsai_stdlib/src/ui/ui.h:141:0 struct maybe_window_layout_ptr { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 1b0c39e42..734bcded9 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:600:0 +// src/engine/editor.h:607:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, level_editor_flags Selection) diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 92e6f185d..739417925 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:612:0 +// src/engine/editor.h:619:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/string_and_value_tables_bitfield_enum.h b/generated/string_and_value_tables_bitfield_enum.h new file mode 100644 index 000000000..2429d29f1 --- /dev/null +++ b/generated/string_and_value_tables_bitfield_enum.h @@ -0,0 +1,92 @@ +// examples/ui_test/game.cpp:59:0 + +link_internal counted_string +ToStringPrefixless(bitfield_enum Type) +{ + counted_string Result = {}; + switch (Type) + { + case BitfieldEnum_Foo: { Result = CSz("Foo"); } break; + case BitfieldEnum_Bar: { Result = CSz("Bar"); } break; + case BitfieldEnum_Baz: { Result = CSz("Baz"); } break; + + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, + // but the metaprogram might have to be a bit fancier.. + default: + { + u32 CurrentFlags = u32(Type); + + u32 BitsSet = CountBitsSet_Kernighan(CurrentFlags); + switch(BitsSet) + { + case 0: // We likely passed 0 into this function, and the enum didn't have a 0 value + case 1: // The value we passed in was outside the range of the valid enum values + { + Result = FSz("(invalid value (%d))", CurrentFlags); + } break; + + default: + { + u32 FirstValue = UnsetLeastSignificantSetBit(&CurrentFlags); + Result = ToStringPrefixless(bitfield_enum(FirstValue)); + + while (CurrentFlags) + { + u32 Value = UnsetLeastSignificantSetBit(&CurrentFlags); + cs Next = ToStringPrefixless(bitfield_enum(Value)); + Result = FSz("%S | %S", Result, Next); + } + } break; + } + } break; + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(bitfield_enum Type) +{ + counted_string Result = {}; + switch (Type) + { + case BitfieldEnum_Foo: { Result = CSz("BitfieldEnum_Foo"); } break; + case BitfieldEnum_Bar: { Result = CSz("BitfieldEnum_Bar"); } break; + case BitfieldEnum_Baz: { Result = CSz("BitfieldEnum_Baz"); } break; + + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, + // but the metaprogram might have to be a bit fancier.. + default: + { + u32 CurrentFlags = u32(Type); + + u32 FirstValue = UnsetLeastSignificantSetBit(&CurrentFlags); + Result = ToString(bitfield_enum(FirstValue)); + + while (CurrentFlags) + { + u32 Value = UnsetLeastSignificantSetBit(&CurrentFlags); + cs Next = ToString(bitfield_enum(Value)); + Result = FSz("%S | %S", Result, Next); + } + } break; + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal bitfield_enum +BitfieldEnum(counted_string S) +{ + bitfield_enum Result = {}; + + if (StringsMatch(S, CSz("BitfieldEnum_Foo"))) { return BitfieldEnum_Foo; } + if (StringsMatch(S, CSz("BitfieldEnum_Bar"))) { return BitfieldEnum_Bar; } + if (StringsMatch(S, CSz("BitfieldEnum_Baz"))) { return BitfieldEnum_Baz; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_chunk_flag.h b/generated/string_and_value_tables_chunk_flag.h index 99c389991..491b6c45b 100644 --- a/generated/string_and_value_tables_chunk_flag.h +++ b/generated/string_and_value_tables_chunk_flag.h @@ -19,21 +19,27 @@ ToStringPrefixless(chunk_flag Type) { u32 CurrentFlags = u32(Type); - if (CountBitsSet_Kernighan(CurrentFlags) == 1) + u32 BitsSet = CountBitsSet_Kernighan(CurrentFlags); + switch(BitsSet) { - Result = FSz("(invalid value for chunk_flag (%d))", CurrentFlags); - } - else - { - u32 FirstValue = UnsetLeastSignificantSetBit(&CurrentFlags); - Result = ToStringPrefixless(chunk_flag(FirstValue)); + case 0: // We likely passed 0 into this function, and the enum didn't have a 0 value + case 1: // The value we passed in was outside the range of the valid enum values + { + Result = FSz("(invalid value (%d))", CurrentFlags); + } break; - while (CurrentFlags) + default: { - u32 Value = UnsetLeastSignificantSetBit(&CurrentFlags); - cs Next = ToStringPrefixless(chunk_flag(Value)); - Result = FSz("%S | %S", Result, Next); - } + u32 FirstValue = UnsetLeastSignificantSetBit(&CurrentFlags); + Result = ToStringPrefixless(chunk_flag(FirstValue)); + + while (CurrentFlags) + { + u32 Value = UnsetLeastSignificantSetBit(&CurrentFlags); + cs Next = ToStringPrefixless(chunk_flag(Value)); + Result = FSz("%S | %S", Result, Next); + } + } break; } } break; diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index a1de50d90..7215707fa 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:565:0 +// src/engine/editor.h:572:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 6e6a9827e..6e895bd57 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -21,21 +21,27 @@ ToStringPrefixless(engine_debug_view_mode Type) { u32 CurrentFlags = u32(Type); - if (CountBitsSet_Kernighan(CurrentFlags) == 1) + u32 BitsSet = CountBitsSet_Kernighan(CurrentFlags); + switch(BitsSet) { - Result = FSz("(invalid value for engine_debug_view_mode (%d))", CurrentFlags); - } - else - { - u32 FirstValue = UnsetLeastSignificantSetBit(&CurrentFlags); - Result = ToStringPrefixless(engine_debug_view_mode(FirstValue)); + case 0: // We likely passed 0 into this function, and the enum didn't have a 0 value + case 1: // The value we passed in was outside the range of the valid enum values + { + Result = FSz("(invalid value (%d))", CurrentFlags); + } break; - while (CurrentFlags) + default: { - u32 Value = UnsetLeastSignificantSetBit(&CurrentFlags); - cs Next = ToStringPrefixless(engine_debug_view_mode(Value)); - Result = FSz("%S | %S", Result, Next); - } + u32 FirstValue = UnsetLeastSignificantSetBit(&CurrentFlags); + Result = ToStringPrefixless(engine_debug_view_mode(FirstValue)); + + while (CurrentFlags) + { + u32 Value = UnsetLeastSignificantSetBit(&CurrentFlags); + cs Next = ToStringPrefixless(engine_debug_view_mode(Value)); + Result = FSz("%S | %S", Result, Next); + } + } break; } } break; diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index cd19e4a56..d2c51d945 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:962:0 +// src/engine/editor.h:969:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index ebd487dee..d9517a248 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:560:0 +// src/engine/editor.h:567:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_radio_enum.h b/generated/string_and_value_tables_radio_enum.h new file mode 100644 index 000000000..7f59ff573 --- /dev/null +++ b/generated/string_and_value_tables_radio_enum.h @@ -0,0 +1,47 @@ +// examples/ui_test/game.cpp:43:0 + +link_internal counted_string +ToStringPrefixless(radio_enum Type) +{ + counted_string Result = {}; + switch (Type) + { + case RadioEnum_Foo: { Result = CSz("Foo"); } break; + case RadioEnum_Bar: { Result = CSz("Bar"); } break; + case RadioEnum_Baz: { Result = CSz("Baz"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(radio_enum Type) +{ + counted_string Result = {}; + switch (Type) + { + case RadioEnum_Foo: { Result = CSz("RadioEnum_Foo"); } break; + case RadioEnum_Bar: { Result = CSz("RadioEnum_Bar"); } break; + case RadioEnum_Baz: { Result = CSz("RadioEnum_Baz"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal radio_enum +RadioEnum(counted_string S) +{ + radio_enum Result = {}; + + if (StringsMatch(S, CSz("RadioEnum_Foo"))) { return RadioEnum_Foo; } + if (StringsMatch(S, CSz("RadioEnum_Bar"))) { return RadioEnum_Bar; } + if (StringsMatch(S, CSz("RadioEnum_Baz"))) { return RadioEnum_Baz; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 62e34c7a3..2ea8463c9 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:905:0 +// src/engine/editor.h:912:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_test_enum.h b/generated/string_and_value_tables_test_enum.h new file mode 100644 index 000000000..d8120f186 --- /dev/null +++ b/generated/string_and_value_tables_test_enum.h @@ -0,0 +1,47 @@ +// examples/ui_test/game.cpp:31:0 + +link_internal counted_string +ToStringPrefixless(test_enum Type) +{ + counted_string Result = {}; + switch (Type) + { + case TestEnum_Foo: { Result = CSz("Foo"); } break; + case TestEnum_Bar: { Result = CSz("Bar"); } break; + case TestEnum_Baz: { Result = CSz("Baz"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(test_enum Type) +{ + counted_string Result = {}; + switch (Type) + { + case TestEnum_Foo: { Result = CSz("TestEnum_Foo"); } break; + case TestEnum_Bar: { Result = CSz("TestEnum_Bar"); } break; + case TestEnum_Baz: { Result = CSz("TestEnum_Baz"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal test_enum +TestEnum(counted_string S) +{ + test_enum Result = {}; + + if (StringsMatch(S, CSz("TestEnum_Foo"))) { return TestEnum_Foo; } + if (StringsMatch(S, CSz("TestEnum_Bar"))) { return TestEnum_Bar; } + if (StringsMatch(S, CSz("TestEnum_Baz"))) { return TestEnum_Baz; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 865386efe..43d7341b5 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:610:0 +// src/engine/editor.h:617:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index f57b4618f..057f3d428 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:775:0 +// src/engine/editor.h:782:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index ee05c897d..181e3633f 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:758:0 +// src/engine/editor.h:765:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) @@ -18,21 +18,27 @@ ToStringPrefixless(world_edit_blend_mode_modifier Type) { u32 CurrentFlags = u32(Type); - if (CountBitsSet_Kernighan(CurrentFlags) == 1) + u32 BitsSet = CountBitsSet_Kernighan(CurrentFlags); + switch(BitsSet) { - Result = FSz("(invalid value for world_edit_blend_mode_modifier (%d))", CurrentFlags); - } - else - { - u32 FirstValue = UnsetLeastSignificantSetBit(&CurrentFlags); - Result = ToStringPrefixless(world_edit_blend_mode_modifier(FirstValue)); + case 0: // We likely passed 0 into this function, and the enum didn't have a 0 value + case 1: // The value we passed in was outside the range of the valid enum values + { + Result = FSz("(invalid value (%d))", CurrentFlags); + } break; - while (CurrentFlags) + default: { - u32 Value = UnsetLeastSignificantSetBit(&CurrentFlags); - cs Next = ToStringPrefixless(world_edit_blend_mode_modifier(Value)); - Result = FSz("%S | %S", Result, Next); - } + u32 FirstValue = UnsetLeastSignificantSetBit(&CurrentFlags); + Result = ToStringPrefixless(world_edit_blend_mode_modifier(FirstValue)); + + while (CurrentFlags) + { + u32 Value = UnsetLeastSignificantSetBit(&CurrentFlags); + cs Next = ToStringPrefixless(world_edit_blend_mode_modifier(Value)); + Result = FSz("%S | %S", Result, Next); + } + } break; } } break; diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index b15b3db36..38580c634 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:781:0 +// src/engine/editor.h:788:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 42a772343..1a061ca6b 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:644:0 +// src/engine/editor.h:651:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 45eebb8ea..25ec0041b 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:767:0 +// src/engine/editor.h:774:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index b87dd5cb1e3bf563cb8d533f87405eadd2f78818..30c8ef2747baa28afa6c0fe22e30d3de19331501 100644 GIT binary patch delta 2355 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, CSz("Tool"), &Params, ToggleButtonGroupFlags_DrawVertical); - CurrentRef = WorldEditToolButtonGroup.UiRef; + /* CurrentRef = WorldEditToolButtonGroup.UiRef; */ } #if 0 diff --git a/src/engine/editor.h b/src/engine/editor.h index e4c991d78..53cc7cdab 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -210,7 +210,8 @@ poof( if (DrawChildren) { - PushTableStart(Ui); + if (Name.Count) { PushTableStart(Ui); } + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } type.map(member) { @@ -312,7 +313,7 @@ poof( } } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } - PushTableEnd(Ui); + if (Name.Count) { PushTableEnd(Ui); } } else { @@ -334,52 +335,58 @@ poof( poof( func do_editor_ui_for_enum(enum_t) { - link_internal void - DoEditorUi(renderer_2d *Ui, window_layout *Window, enum_t.name *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) + enum_t.has_tag(ui_display_radio)? { - if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } - - cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); - if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + do_editor_ui_for_radio_enum(enum_t) + } + { + link_internal void + DoEditorUi(renderer_2d *Ui, window_layout *Window, enum_t.name *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) { - PushNewRow(Ui); - enum_t.map(value) + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("value.name.strip_all_prefix"), UiId(Window, "enum value.name", Element), Params)) + PushNewRow(Ui); + enum_t.map(value) { - enum_t.has_tag(bitfield)? + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("value.name.strip_all_prefix"), UiId(Window, "enum value.name", Element), Params)) { - if ((value.name) == enum_t.name(0)) - { - *Element = enum_t.name(0); - } - else + enum_t.has_tag(bitfield)? { - if ((*Element & value.name) == value.name) + if ((value.name) == enum_t.name(0)) { - *Element = enum_t.name(*Element&~value.name); + *Element = enum_t.name(0); } else { - *Element = enum_t.name(*Element|value.name); + if ((*Element & value.name) == value.name) + { + *Element = enum_t.name(*Element&~value.name); + } + else + { + *Element = enum_t.name(*Element|value.name); + } } } - } - { - *Element = value.name; - } + { + *Element = value.name; + } - SetToggleButton(Ui, ToggleButtonId, False); + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); } + } + else + { PushNewRow(Ui); } } - else - { - PushNewRow(Ui); - } } } ) From 68e9754c55dce88f147dc3a5033dd079bd950627 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 6 May 2025 21:32:27 -0700 Subject: [PATCH 230/421] Rewrite some groups of buttons with toolbar enums --- brushes/orb.brush | Bin 837 -> 1695 bytes ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/d_union_ui_render_command.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 11 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_ray.h | 2 +- .../do_editor_ui_for_compound_type_rect3.h | 2 +- .../do_editor_ui_for_compound_type_rect3cp.h | 2 +- .../do_editor_ui_for_compound_type_rect3i.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 28 ++++- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/hashtable_struct_ui_toggle.h | 2 +- generated/maybe_ui_toggle.h | 2 +- generated/maybe_ui_toggle_ptr.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- ...value_tables_enum_ui_brush_layer_actions.h | 53 +++++++++ generated/string_and_value_tables_maybe_tag.h | 2 +- ...nd_value_tables_ui_layer_toolbar_actions.h | 47 ++++++++ .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- .../toolbar_for_enum_ui_brush_layer_actions.h | 74 ++++++++++++ ...oolbar_for_enum_ui_layer_toolbar_actions.h | 70 ++++++++++++ src/engine/editor.cpp | 107 ++++++++++-------- src/engine/editor.h | 13 ++- 92 files changed, 422 insertions(+), 147 deletions(-) create mode 100644 generated/string_and_value_tables_enum_ui_brush_layer_actions.h create mode 100644 generated/string_and_value_tables_ui_layer_toolbar_actions.h create mode 100644 generated/toolbar_for_enum_ui_brush_layer_actions.h create mode 100644 generated/toolbar_for_enum_ui_layer_toolbar_actions.h diff --git a/brushes/orb.brush b/brushes/orb.brush index 326fb8c1fa9b73b6eb47d6a05cee8b6c3fb9b62a..76335a6d45401b4d22416fe514238146549a407f 100644 GIT binary patch delta 52 zcmX@gHlKGw37cM0QE73;#KxZ!C$KXzZ?0zCz__`Nv4fF&v(9O|_j}9jqqB7<3o=Uq I1&=cV02kpCsQ>@~ delta 35 rcmbQwdz5WL$;8H=6DRPpGBPkQFi%ckk=i_yaT4QXc^0n8{cHjN*_sNc diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index b49881e93..724c2c284 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2405:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2418:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index cc0191ec1..c019f7d3d 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3385:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3400:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 107a0e819..c3db9651e 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2358:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2371:0 case type_ui_render_command_window_start: { diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 3f36bddcc..744a0a84c 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:751:0 +// src/engine/editor.h:752:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index fff9d144a..be175c71c 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:586:0 +// src/engine/editor.h:587:0 diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 0daf69567..f389c34a5 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:850:0 +// external/bonsai_stdlib/src/ui/ui.h:860:0 enum ui_render_command_type { diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 4b8867105..917f52f59 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:421:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index b82570d22..58e10c1ef 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:398:0 +// src/engine/editor.cpp:413:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 00eac04b6..2372de88a 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:315:0 +// src/engine/editor.cpp:330:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 8ae9c4daa..bb69c9459 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -251,16 +251,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N cs MemberName = CSz("HSVColor"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->HSVColor), - MemberName, - Params - ); - - - + DoColorPicker(Ui, Window, &Element->HSVColor, False); diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 0aac97daf..3e76c4ba4 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:339:0 +// src/engine/editor.cpp:354:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 8ede0c300..e592b8205 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:424:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index d419234ac..16f467a1e 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:471:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index f021eff6d..7e638f673 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:477:0 +// src/engine/editor.cpp:492:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 05ce299ef..9edb6d7a4 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:474:0 +// src/engine/editor.cpp:489:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index f14c05ba8..33bf75f61 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:378:0 +// src/engine/editor.cpp:393:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 80707bd7c..707cdc259 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:375:0 +// src/engine/editor.cpp:390:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 7934abd2f..b6f3f0a87 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:412:0 +// src/engine/editor.cpp:427:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index a942c94b9..e5d294674 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:363:0 +// src/engine/editor.cpp:378:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 3a92eb6ad..dbd5a737a 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:432:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 295f6f018..3077f4008 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:426:0 +// src/engine/editor.cpp:441:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 4f9937d52..01f0ee0a3 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:345:0 +// src/engine/editor.cpp:360:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 80589ea78..040c4108a 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:348:0 +// src/engine/editor.cpp:363:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 667543d69..1ef8715da 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:462:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 1783d2f6f..031d5867e 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:471:0 +// src/engine/editor.cpp:486:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 25a282b0d..589a01a25 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:333:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 5d1bc008f..2b0f25d15 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:462:0 +// src/engine/editor.cpp:477:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index e8726b9b2..576caef1b 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:429:0 +// src/engine/editor.cpp:444:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 013876492..b18161b06 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:351:0 +// src/engine/editor.cpp:366:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index 424b8a1db..09dad5360 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:592:0 +// src/engine/editor.h:593:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index f87cca622..d871a0daa 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:354:0 +// src/engine/editor.cpp:369:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 9ff5445a7..62327d76d 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:388:0 +// src/engine/editor.cpp:403:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index d398bbb0b..31299cc32 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:589:0 +// src/engine/editor.h:590:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index e39e95fe1..3e9e937cd 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:577:0 +// src/engine/editor.h:578:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index 502294c29..f5c28167d 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:583:0 +// src/engine/editor.h:584:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index af7cfe156..16c03361c 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:580:0 +// src/engine/editor.h:581:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 4c6381ea7..73a500fc8 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:420:0 +// src/engine/editor.cpp:435:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index de0974a60..81a6959b4 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 1bba17390..cf010155b 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:423:0 +// src/engine/editor.cpp:438:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -424,7 +424,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(layer_toolbar_actions*, &Element->LayerToolbarAction), + Cast(ui_layer_toolbar_actions*, &Element->LayerToolbarAction), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("UiBrushLayerAction"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(ui_brush_layer_actions*, &Element->UiBrushLayerAction), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 2689f3ad1..5fd6f2c54 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:438:0 +// src/engine/editor.cpp:453:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 608ca8673..72f02b61c 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:456:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index a23b81008..23e5119cf 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:435:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index e00249d75..ed5d06867 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:324:0 +// src/engine/editor.cpp:339:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 87b0a7e02..09bfc8667 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:321:0 +// src/engine/editor.cpp:336:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 0a2011046..89b521bf9 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:444:0 +// src/engine/editor.cpp:459:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index f4460bea4..f729c55e7 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:468:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index e6e9714da..b3ad5dd99 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:342:0 +// src/engine/editor.cpp:357:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index dfed52fa7..f8e9fbfaa 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:333:0 +// src/engine/editor.cpp:348:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index cc505310a..0562f0484 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:336:0 +// src/engine/editor.cpp:351:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index cb3dfd4b7..7703bef40 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:391:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 36ed0341d..791f1dd3e 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:385:0 +// src/engine/editor.cpp:400:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index b36afa9f9..2e3b61fa8 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:327:0 +// src/engine/editor.cpp:342:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 4df9108da..db5b9dc92 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:382:0 +// src/engine/editor.cpp:397:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index a7acfb5a1..6895d95ac 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:357:0 +// src/engine/editor.cpp:372:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 86752fa09..d15f0a6f4 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:403:0 +// src/engine/editor.cpp:418:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 52f4d05ec..94102cbe7 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:330:0 +// src/engine/editor.cpp:345:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 2f113cf9a..0e3589a15 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:574:0 +// src/engine/editor.h:575:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 2ed5bab28..2c2bbe220 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:459:0 +// src/engine/editor.cpp:474:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index eef9563aa..96565237b 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:360:0 +// src/engine/editor.cpp:375:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index a891c23a0..7fa7dd43e 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:569:0 +// src/engine/editor.h:570:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 2f71cdb4f..021ce63ab 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:465:0 +// src/engine/editor.cpp:480:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index a6448877c..f6da41a09 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:468:0 +// src/engine/editor.cpp:483:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 8535ae0b3..33f9a7180 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:621:0 +// src/engine/editor.h:622:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index ed8364cb6..87d3ed51a 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:779:0 +// src/engine/editor.h:780:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index b4c34f8e4..9721128cb 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:785:0 +// src/engine/editor.h:786:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index dae71c177..ac2263830 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:768:0 +// src/engine/editor.h:769:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 033064f01..2d1c355cb 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:797:0 +// src/engine/editor.h:798:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 4f111e4bd..601c8c64a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:790:0 +// src/engine/editor.h:791:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 0a3a6ae26..74cd2a343 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:794:0 +// src/engine/editor.h:795:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index 61ef5f7c4..bf83e066c 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:444:0 +// src/engine/editor.h:445:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index 133d32a88..faa900000 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:556:0 +// src/engine/editor.h:557:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/hashtable_struct_ui_toggle.h b/generated/hashtable_struct_ui_toggle.h index 91e7b0583..f53968191 100644 --- a/generated/hashtable_struct_ui_toggle.h +++ b/generated/hashtable_struct_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:236:0 +// external/bonsai_stdlib/src/ui/ui.h:243:0 struct ui_toggle_linked_list_node { diff --git a/generated/maybe_ui_toggle.h b/generated/maybe_ui_toggle.h index dcede88f3..efe976588 100644 --- a/generated/maybe_ui_toggle.h +++ b/generated/maybe_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:230:0 +// external/bonsai_stdlib/src/ui/ui.h:237:0 struct maybe_ui_toggle { diff --git a/generated/maybe_ui_toggle_ptr.h b/generated/maybe_ui_toggle_ptr.h index 574bc2a74..1048cbf1d 100644 --- a/generated/maybe_ui_toggle_ptr.h +++ b/generated/maybe_ui_toggle_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:233:0 +// external/bonsai_stdlib/src/ui/ui.h:240:0 struct maybe_ui_toggle_ptr { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 734bcded9..e7fb08904 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:607:0 +// src/engine/editor.h:608:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, level_editor_flags Selection) diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 739417925..43a6e5a2b 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:619:0 +// src/engine/editor.h:620:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 0044da453..c3b87625a 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:401:0 +// src/engine/editor.cpp:416:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 7215707fa..2139cf942 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:572:0 +// src/engine/editor.h:573:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_enum_ui_brush_layer_actions.h b/generated/string_and_value_tables_enum_ui_brush_layer_actions.h new file mode 100644 index 000000000..d9c923aa2 --- /dev/null +++ b/generated/string_and_value_tables_enum_ui_brush_layer_actions.h @@ -0,0 +1,53 @@ +// src/engine/editor.cpp:322:0 + +link_internal counted_string +ToStringPrefixless(ui_brush_layer_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiBrushLayerAction_NoAction: { Result = CSz("NoAction"); } break; + case UiBrushLayerAction_MoveUp: { Result = CSz("MoveUp"); } break; + case UiBrushLayerAction_MoveDown: { Result = CSz("MoveDown"); } break; + case UiBrushLayerAction_Duplicate: { Result = CSz("Duplicate"); } break; + case UiBrushLayerAction_Delete: { Result = CSz("Delete"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(ui_brush_layer_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiBrushLayerAction_NoAction: { Result = CSz("UiBrushLayerAction_NoAction"); } break; + case UiBrushLayerAction_MoveUp: { Result = CSz("UiBrushLayerAction_MoveUp"); } break; + case UiBrushLayerAction_MoveDown: { Result = CSz("UiBrushLayerAction_MoveDown"); } break; + case UiBrushLayerAction_Duplicate: { Result = CSz("UiBrushLayerAction_Duplicate"); } break; + case UiBrushLayerAction_Delete: { Result = CSz("UiBrushLayerAction_Delete"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal ui_brush_layer_actions +UiBrushLayerActions(counted_string S) +{ + ui_brush_layer_actions Result = {}; + + if (StringsMatch(S, CSz("UiBrushLayerAction_NoAction"))) { return UiBrushLayerAction_NoAction; } + if (StringsMatch(S, CSz("UiBrushLayerAction_MoveUp"))) { return UiBrushLayerAction_MoveUp; } + if (StringsMatch(S, CSz("UiBrushLayerAction_MoveDown"))) { return UiBrushLayerAction_MoveDown; } + if (StringsMatch(S, CSz("UiBrushLayerAction_Duplicate"))) { return UiBrushLayerAction_Duplicate; } + if (StringsMatch(S, CSz("UiBrushLayerAction_Delete"))) { return UiBrushLayerAction_Delete; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index d9517a248..ecf011b6a 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:567:0 +// src/engine/editor.h:568:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_ui_layer_toolbar_actions.h b/generated/string_and_value_tables_ui_layer_toolbar_actions.h new file mode 100644 index 000000000..3de1a63c8 --- /dev/null +++ b/generated/string_and_value_tables_ui_layer_toolbar_actions.h @@ -0,0 +1,47 @@ +// src/engine/editor.cpp:317:0 + +link_internal counted_string +ToStringPrefixless(ui_layer_toolbar_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case LayerToolbarActions_New: { Result = CSz("New"); } break; + case LayerToolbarActions_Delete: { Result = CSz("Delete"); } break; + case LayerToolbarActions_Rename: { Result = CSz("Rename"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(ui_layer_toolbar_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case LayerToolbarActions_New: { Result = CSz("LayerToolbarActions_New"); } break; + case LayerToolbarActions_Delete: { Result = CSz("LayerToolbarActions_Delete"); } break; + case LayerToolbarActions_Rename: { Result = CSz("LayerToolbarActions_Rename"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal ui_layer_toolbar_actions +UiLayerToolbarActions(counted_string S) +{ + ui_layer_toolbar_actions Result = {}; + + if (StringsMatch(S, CSz("LayerToolbarActions_New"))) { return LayerToolbarActions_New; } + if (StringsMatch(S, CSz("LayerToolbarActions_Delete"))) { return LayerToolbarActions_Delete; } + if (StringsMatch(S, CSz("LayerToolbarActions_Rename"))) { return LayerToolbarActions_Rename; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 43d7341b5..87aa07bae 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:617:0 +// src/engine/editor.h:618:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 057f3d428..2d455a82a 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:782:0 +// src/engine/editor.h:783:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 181e3633f..aca904629 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:765:0 +// src/engine/editor.h:766:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 38580c634..3e6c6315b 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:788:0 +// src/engine/editor.h:789:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 1a061ca6b..338709ba6 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:651:0 +// src/engine/editor.h:652:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 25ec0041b..26980ae9c 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:774:0 +// src/engine/editor.h:775:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/generated/toolbar_for_enum_ui_brush_layer_actions.h b/generated/toolbar_for_enum_ui_brush_layer_actions.h new file mode 100644 index 000000000..fc6a90ef5 --- /dev/null +++ b/generated/toolbar_for_enum_ui_brush_layer_actions.h @@ -0,0 +1,74 @@ +// src/engine/editor.cpp:324:0 + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, ui_brush_layer_actions Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} + +link_internal ui_toggle_button_group +RadioButtonGroup_ui_brush_layer_actions( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_brush_layer_actions *Element, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_handle ButtonHandles[] = + { + { CSz("NoAction"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_NoAction")), UiBrushLayerAction_NoAction }, + { CSz("MoveUp"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveUp")), UiBrushLayerAction_MoveUp }, + { CSz("MoveDown"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveDown")), UiBrushLayerAction_MoveDown }, + { CSz("Duplicate"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Duplicate")), UiBrushLayerAction_Duplicate }, + { CSz("Delete"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Delete")), UiBrushLayerAction_Delete }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); + return Result; +} + + + + +link_internal ui_toggle_button_group +PushToolbar( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_brush_layer_actions *Element, + u64 Index = 0, + ui_render_params *Params = &DefaultUiRenderParams_Toolbar, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + /* auto Result = RadioButtonGroup_(enum_t.name)(Ui, Window, GroupName, Element, Params, ExtraFlags); */ + + ui_toggle_button_handle ButtonHandles[] = + { + /* enum_v.has_tag(ui_skip)?{} */ { CSz("NoAction"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_NoAction"), Cast(void*, Index)), UiBrushLayerAction_NoAction }, + /* enum_v.has_tag(ui_skip)?{} */ { CSz("MoveUp"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveUp"), Cast(void*, Index)), UiBrushLayerAction_MoveUp }, + /* enum_v.has_tag(ui_skip)?{} */ { CSz("MoveDown"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveDown"), Cast(void*, Index)), UiBrushLayerAction_MoveDown }, + /* enum_v.has_tag(ui_skip)?{} */ { CSz("Duplicate"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Duplicate"), Cast(void*, Index)), UiBrushLayerAction_Duplicate }, + /* enum_v.has_tag(ui_skip)?{} */ { CSz("Delete"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Delete"), Cast(void*, Index)), UiBrushLayerAction_Delete }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = {}; + Result.Ui = Ui; + Result.Flags = ToggleButtonGroupFlags_TypeClickButton; + Result.Buttons = ButtonBuffer; + Result.EnumStorage = Cast(u32*, Element); + + DrawButtonGroup(&Result, GroupName); + return Result; +} + diff --git a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h new file mode 100644 index 000000000..843fcc923 --- /dev/null +++ b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h @@ -0,0 +1,70 @@ +// src/engine/editor.cpp:319:0 + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, ui_layer_toolbar_actions Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} + +link_internal ui_toggle_button_group +RadioButtonGroup_ui_layer_toolbar_actions( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_layer_toolbar_actions *Element, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_handle ButtonHandles[] = + { + { CSz("New"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_New")), LayerToolbarActions_New }, + { CSz("Delete"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete")), LayerToolbarActions_Delete }, + { CSz("Rename"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename")), LayerToolbarActions_Rename }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); + return Result; +} + + + + +link_internal ui_toggle_button_group +PushToolbar( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_layer_toolbar_actions *Element, + u64 Index = 0, + ui_render_params *Params = &DefaultUiRenderParams_Toolbar, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + /* auto Result = RadioButtonGroup_(enum_t.name)(Ui, Window, GroupName, Element, Params, ExtraFlags); */ + + ui_toggle_button_handle ButtonHandles[] = + { + /* enum_v.has_tag(ui_skip)?{} */ { CSz("New"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_New"), Cast(void*, Index)), LayerToolbarActions_New }, + /* enum_v.has_tag(ui_skip)?{} */ { CSz("Delete"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete"), Cast(void*, Index)), LayerToolbarActions_Delete }, + /* enum_v.has_tag(ui_skip)?{} */ { CSz("Rename"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename"), Cast(void*, Index)), LayerToolbarActions_Rename }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = {}; + Result.Ui = Ui; + Result.Flags = ToggleButtonGroupFlags_TypeClickButton; + Result.Buttons = ButtonBuffer; + Result.EnumStorage = Cast(u32*, Element); + + DrawButtonGroup(&Result, GroupName); + return Result; +} + diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 48c4c2b37..4de6e3564 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -312,6 +312,21 @@ poof(do_editor_ui_for_compound_type(asset_thumbnail)) poof(do_editor_ui_for_compound_type(chunk_thumbnail)) #include + + +poof(string_and_value_tables(ui_layer_toolbar_actions)) +#include +poof(toolbar_for_enum(ui_layer_toolbar_actions)) +#include + +poof(string_and_value_tables(ui_brush_layer_actions)) +#include +poof(toolbar_for_enum(ui_brush_layer_actions)) +#include + + + + poof(do_editor_ui_for_compound_type(brush_layer)) #include @@ -1629,50 +1644,56 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } { - b32 ReorderUp = False; - b32 ReorderDown = False; - b32 Duplicate = False; - b32 Delete = False; s32 EditLayerIndex = 0; + PushTableStart(Ui); + Ui->UiBrushLayerAction = {}; + brush_layer *Layers = Brush->Layered.Layers; RangeIterator(LayerIndex, LayeredBrush->LayerCount) { brush_layer *Layer = Layers + LayerIndex; - ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", Layer); + ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", u32(LayerIndex)); cs LayerDetails = GetLayerUiText(Layer, GetTranArena()); + if (ToggleButton(Ui, FSz("v %d %S", LayerIndex, LayerDetails), FSz("> %d %S", LayerIndex, LayerDetails), ToggleId)) { - if (Button(Ui, CSz("Up"), UiId(BrushSettingsWindow, "layer_reorder_up", Layer))) + ui_toggle_button_group Toolbar = PushToolbar(Ui, BrushSettingsWindow, CSz(""), &Ui->UiBrushLayerAction, u64(LayerIndex)); + if (Toolbar.AnyElementClicked) { - ReorderUp = True; EditLayerIndex = LayerIndex; - } - if (Button(Ui, CSz("Down"), UiId(BrushSettingsWindow, "layer_reorder_down", Layer))) - { - ReorderDown = True; - EditLayerIndex = LayerIndex; - } + if (Ui->UiBrushLayerAction == UiBrushLayerAction_Delete) { SetToggleButton(Ui, ToggleId, False); } - if (Button(Ui, CSz("Dup"), UiId(BrushSettingsWindow, "layer_duplicate", Layer))) - { - Duplicate = True; - EditLayerIndex = LayerIndex; - } + b32 ThisState = GetToggleState(Ui, ToggleId); - if (Button(Ui, CSz("Del"), UiId(BrushSettingsWindow, "layer_delete", Layer))) - { - Delete = True; - EditLayerIndex = LayerIndex; - } + if (Ui->UiBrushLayerAction == UiBrushLayerAction_MoveUp) + { + ui_id NextId = ToggleId; + NextId.ElementBits -= 1; + b32 NextState = GetToggleState(Ui, NextId); - PushNewRow(Ui); + SetToggleButton(Ui, ToggleId, NextState); + SetToggleButton(Ui, NextId, ThisState); + } + + if (Ui->UiBrushLayerAction == UiBrushLayerAction_MoveDown) + { + ui_id NextId = ToggleId; + NextId.ElementBits += 1; + b32 NextState = GetToggleState(Ui, NextId); + + SetToggleButton(Ui, ToggleId, NextState); + SetToggleButton(Ui, NextId, ThisState); + } - /* DoSettingsForBrushLayer(Engine, Layer, BrushSettingsWindow); */ - DoEditorUi(Ui, BrushSettingsWindow, Layer, {}, &DefaultUiRenderParams_Generic); + } + + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + DoEditorUi(Ui, BrushSettingsWindow, Layer, {}); + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } else { @@ -1688,7 +1709,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } PushTableEnd(Ui); - if (ReorderUp) + if (Ui->UiBrushLayerAction == UiBrushLayerAction_MoveUp) { if (EditLayerIndex > 0) { @@ -1699,12 +1720,13 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } } - if (ReorderDown) + if (Ui->UiBrushLayerAction == UiBrushLayerAction_MoveDown) { if (LayeredBrush->LayerCount) { if (EditLayerIndex < LayeredBrush->LayerCount-1) { + Info("SwippySwap"); brush_layer *Layer = Layers + EditLayerIndex; brush_layer Tmp = Layers[EditLayerIndex+1]; Layers[EditLayerIndex+1].Settings = Layer->Settings; @@ -1713,7 +1735,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } } - if (Duplicate) + if (Ui->UiBrushLayerAction == UiBrushLayerAction_Duplicate) { if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) { @@ -1727,13 +1749,14 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } } - if (Delete) + if (Ui->UiBrushLayerAction == UiBrushLayerAction_Delete) { if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) { // Shuffle layers backwards, overwriting EditLayerIndex RangeIteratorRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) { + Assert(LayerIndex >= 0 && LayerIndex < MAX_BRUSH_LAYERS); Layers[LayerIndex-1].Settings = Layers[LayerIndex].Settings; } @@ -2204,10 +2227,8 @@ ColorIndexToV3(u16 ColorIndex) link_internal void -DoColorPickerSection(engine_resources *Engine, window_layout *Window, v3 *HSVDest, u32 ElementIndex, u32 Slices, v2 WidgetDim) +DoColorPickerSection(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, u32 ElementIndex, u32 Slices, v2 WidgetDim) { - UNPACK_ENGINE_RESOURCES(Engine); - v2 QuadDim = V2(WidgetDim.x/r32(Slices), WidgetDim.y); v4 Padding = V4(0); v3 HSV = *HSVDest; @@ -2241,7 +2262,7 @@ DoColorPickerSection(engine_resources *Engine, window_layout *Window, v3 *HSVDes PushTooltip(Ui, FSz("%d %.2V3", ColorIndex, &RGB)); } - if (ButtonHover && Input->LMB.Pressed) + if (Clicked(Ui, &ColorPickerButton)) { HSVDest->E[ElementIndex] = Value; } @@ -2251,10 +2272,8 @@ DoColorPickerSection(engine_resources *Engine, window_layout *Window, v3 *HSVDes } link_internal void -DoColorPicker(engine_resources *Engine, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch) +DoColorPicker(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch) { - UNPACK_ENGINE_RESOURCES(Engine); - /* u8 FourBits = 0b1111; */ u8 FiveBits = 0b11111; u8 SixBits = 0b111111; @@ -2266,9 +2285,9 @@ DoColorPicker(engine_resources *Engine, window_layout *Window, v3 *HSVDest, b32 v2 ColorPickerSectionDim = V2(256, 30); - DoColorPickerSection(Engine, Window, HSVDest, 0, HueSlices, ColorPickerSectionDim); - DoColorPickerSection(Engine, Window, HSVDest, 1, SaturationSlices, ColorPickerSectionDim); - DoColorPickerSection(Engine, Window, HSVDest, 2, ValueSlices, ColorPickerSectionDim); + DoColorPickerSection(Ui, Window, HSVDest, 0, HueSlices, ColorPickerSectionDim); + DoColorPickerSection(Ui, Window, HSVDest, 1, SaturationSlices, ColorPickerSectionDim); + DoColorPickerSection(Ui, Window, HSVDest, 2, ValueSlices, ColorPickerSectionDim); PushNewRow(Ui); @@ -2296,7 +2315,7 @@ ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowC if (window_layout *Window = ModalIsActive(Ui, ModalId)) { - DoColorPicker(Engine, Window, HSVDest, ShowColorSwatch); + DoColorPicker(Ui, Window, HSVDest, ShowColorSwatch); PushNewRow(Ui); @@ -2413,12 +2432,6 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo ApplyEditToOctree(Engine, Edit, TempMemory); } -poof(string_and_value_tables(layer_toolbar_actions)) -#include - -poof(toolbar_for_enum(layer_toolbar_actions)) -#include - link_internal void DoWorldEditor(engine_resources *Engine) { diff --git a/src/engine/editor.h b/src/engine/editor.h index 53cc7cdab..f3184e5a2 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -79,6 +79,7 @@ poof( window_layout *Window, cs GroupName, enum_t.name *Element, + u64 Index = 0, ui_render_params *Params = &DefaultUiRenderParams_Toolbar, ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) { @@ -88,7 +89,7 @@ poof( { enum_t.map(enum_v) { - { CSz("enum_v.name.strip_all_prefix"), UiId(Window, Cast(void*, Element), Cast(void*, "enum_t.name enum_v.name")), enum_v.name }, + /* enum_v.has_tag(ui_skip)?{} */ { CSz("enum_v.name.strip_all_prefix"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "enum_t.name enum_v.name"), Cast(void*, Index)), enum_v.name }, } }; @@ -99,11 +100,11 @@ poof( ui_toggle_button_group Result = {}; Result.Ui = Ui; - Result.Flags = ToggleButtonGroupFlags_TypePlainButton; + Result.Flags = ToggleButtonGroupFlags_TypeClickButton; Result.Buttons = ButtonBuffer; Result.EnumStorage = Cast(u32*, Element); - DrawButtonGroup(&Result, CSz("Uhh")); + DrawButtonGroup(&Result, GroupName); return Result; } } @@ -899,7 +900,6 @@ poof(do_editor_ui_for_compound_type(world_edit_brush_constraints)) - enum shape_type { ShapeType_Sphere, @@ -995,7 +995,7 @@ struct brush_settings poof(@version(3)) v3i NoiseBasisOffset; // NOTE(Jesse): The color picker operates in HSV, so we need this to be HSV for now - v3 HSVColor = DEFAULT_HSV_COLOR; + v3 HSVColor = DEFAULT_HSV_COLOR; poof(@custom_ui(DoColorPicker(Ui, Window, &Element->HSVColor, False))) /* v3 RGBColor = DEFAULT_RGB_COLOR; */ b8 Invert; }; @@ -1352,3 +1352,6 @@ GetSmallestMinOffset(layered_brush *LayeredBrush, v3i *LargestLayerDim = 0); link_internal void ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowColorSwatch = True); + +link_internal void +DoColorPicker(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch); From 13da189f10851e1e87a6ad2c41cde129ca79ea2d Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 11 May 2025 10:57:29 -0700 Subject: [PATCH 231/421] Update stdlib --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 2fcf3ccde..aa471ed65 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 2fcf3ccde1fa28f4cf78b0d34ddd4431b182094a +Subproject commit aa471ed65a1d6b210d4dd4e928580743d597861c From 1b85c81d170da14b1bf265c5e51207b4cc070818 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 11 May 2025 10:59:24 -0700 Subject: [PATCH 232/421] Respect ui_skip in toggle buttons for enums --- generated/toolbar_for_enum_ui_brush_layer_actions.h | 9 ++++----- generated/toolbar_for_enum_ui_layer_toolbar_actions.h | 6 +++--- src/engine/editor.h | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/generated/toolbar_for_enum_ui_brush_layer_actions.h b/generated/toolbar_for_enum_ui_brush_layer_actions.h index fc6a90ef5..60088963a 100644 --- a/generated/toolbar_for_enum_ui_brush_layer_actions.h +++ b/generated/toolbar_for_enum_ui_brush_layer_actions.h @@ -50,11 +50,10 @@ PushToolbar( renderer_2d *Ui, ui_toggle_button_handle ButtonHandles[] = { - /* enum_v.has_tag(ui_skip)?{} */ { CSz("NoAction"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_NoAction"), Cast(void*, Index)), UiBrushLayerAction_NoAction }, - /* enum_v.has_tag(ui_skip)?{} */ { CSz("MoveUp"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveUp"), Cast(void*, Index)), UiBrushLayerAction_MoveUp }, - /* enum_v.has_tag(ui_skip)?{} */ { CSz("MoveDown"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveDown"), Cast(void*, Index)), UiBrushLayerAction_MoveDown }, - /* enum_v.has_tag(ui_skip)?{} */ { CSz("Duplicate"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Duplicate"), Cast(void*, Index)), UiBrushLayerAction_Duplicate }, - /* enum_v.has_tag(ui_skip)?{} */ { CSz("Delete"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Delete"), Cast(void*, Index)), UiBrushLayerAction_Delete }, + {CSz("MoveUp"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveUp"), Cast(void*, Index)), UiBrushLayerAction_MoveUp }, + {CSz("MoveDown"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveDown"), Cast(void*, Index)), UiBrushLayerAction_MoveDown }, + {CSz("Duplicate"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Duplicate"), Cast(void*, Index)), UiBrushLayerAction_Duplicate }, + {CSz("Delete"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Delete"), Cast(void*, Index)), UiBrushLayerAction_Delete }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h index 843fcc923..00b8c6a95 100644 --- a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h +++ b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h @@ -48,9 +48,9 @@ PushToolbar( renderer_2d *Ui, ui_toggle_button_handle ButtonHandles[] = { - /* enum_v.has_tag(ui_skip)?{} */ { CSz("New"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_New"), Cast(void*, Index)), LayerToolbarActions_New }, - /* enum_v.has_tag(ui_skip)?{} */ { CSz("Delete"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete"), Cast(void*, Index)), LayerToolbarActions_Delete }, - /* enum_v.has_tag(ui_skip)?{} */ { CSz("Rename"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename"), Cast(void*, Index)), LayerToolbarActions_Rename }, + {CSz("New"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_New"), Cast(void*, Index)), LayerToolbarActions_New }, + {CSz("Delete"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete"), Cast(void*, Index)), LayerToolbarActions_Delete }, + {CSz("Rename"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename"), Cast(void*, Index)), LayerToolbarActions_Rename }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/src/engine/editor.h b/src/engine/editor.h index f3184e5a2..d003719bf 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -89,7 +89,7 @@ poof( { enum_t.map(enum_v) { - /* enum_v.has_tag(ui_skip)?{} */ { CSz("enum_v.name.strip_all_prefix"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "enum_t.name enum_v.name"), Cast(void*, Index)), enum_v.name }, + enum_v.has_tag(ui_skip)?{} { {CSz("enum_v.name.strip_all_prefix"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "enum_t.name enum_v.name"), Cast(void*, Index)), enum_v.name }, } } }; From 464489725e838e564b76c9a5c538b5d2450dbb4b Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 11 May 2025 11:09:57 -0700 Subject: [PATCH 233/421] Fix Color Picker interaction id collision --- src/engine/editor.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 4de6e3564..ce52954be 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2227,25 +2227,27 @@ ColorIndexToV3(u16 ColorIndex) link_internal void -DoColorPickerSection(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, u32 ElementIndex, u32 Slices, v2 WidgetDim) +DoColorPickerSection(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, u32 HSVElementIndex, u32 Slices, v2 WidgetDim) { v2 QuadDim = V2(WidgetDim.x/r32(Slices), WidgetDim.y); v4 Padding = V4(0); v3 HSV = *HSVDest; - r32 CurrentValue = HSVDest->E[ElementIndex]; + r32 CurrentValue = HSVDest->E[HSVElementIndex]; ui_element_reference SaturationTable = PushTableStart(Ui); RangeIterator_t(u8, ColorIndex, Slices) { r32 Value = r32(ColorIndex)/r32(Slices); - HSV.E[ElementIndex] = Value; + HSV.E[HSVElementIndex] = Value; v3 RGB = HSVtoRGB(HSV); b32 Selected = Value == CurrentValue; ui_style Style = FlatUiStyle(RGB); - interactable_handle ColorPickerButton = PushButtonStart(Ui, UiId(Window, "ColorPicker value button", Cast(void*, u64(ColorIndex) | u64(ElementIndex<<16))) ); + ui_id Id = UiId(Window, Cast(void*, "ColorPicker value button"), Cast(void*, HSVDest), Cast(void*, u64(ColorIndex) | u64(HSVElementIndex<<16))); + + interactable_handle ColorPickerButton = PushButtonStart(Ui, Id); PushUntexturedQuad(Ui, {}, QuadDim, zDepth_Text, &Style, Padding ); PushButtonEnd(Ui); @@ -2264,7 +2266,7 @@ DoColorPickerSection(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, u32 El if (Clicked(Ui, &ColorPickerButton)) { - HSVDest->E[ElementIndex] = Value; + HSVDest->E[HSVElementIndex] = Value; } } PushTableEnd(Ui); From 08b9fedc009890666ed2fbd9af894ab5bb910b95 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 11 May 2025 12:12:15 -0700 Subject: [PATCH 234/421] Improve color picker in brush_settings somewhat --- brushes/orb.brush | Bin 1695 -> 0 bytes brushes/perlin.brush | Bin 837 -> 0 bytes external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/are_equal_struct.h | 10 +- generated/are_equal_world_edit_brush.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 43 ++++--- generated/for_datatypes_0XxWqGSZ.h | 3 - generated/for_datatypes_fkubhsYl.h | 3 - generated/for_datatypes_kv3WBTai.h | 3 - generated/hashtable_world_edit_brush.h | 2 +- generated/serdes_struct_brush_layer.h | 2 +- generated/serdes_struct_brush_settings.h | 80 +++---------- generated/serdes_struct_layered_brush.h | 2 +- generated/serdes_struct_world_edit.h | 2 +- generated/serdes_struct_world_edit_brush.h | 2 +- src/engine/editor.cpp | 31 +++++- src/engine/editor.h | 105 ++---------------- src/engine/serdes.cpp | 7 +- 24 files changed, 87 insertions(+), 224 deletions(-) delete mode 100644 brushes/orb.brush delete mode 100644 brushes/perlin.brush diff --git a/brushes/orb.brush b/brushes/orb.brush deleted file mode 100644 index 76335a6d45401b4d22416fe514238146549a407f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1695 zcmZQ%fB+^a%?PFWpmb7EX>mq;acW6PW?p(RGgK5rt@#6i+)%N+{LJFi_?*Pb)FPN6 z$jV^K^NW)7z=lG#jaUj4mdN3W9B4o(dsu)$1IQ6bgE5l0BN7`ZtpJpVU?g#n9x#B3 z!DyH`jK(Go6NAwp^AT*APDENjh#R~iCHQ2;Z)nm7p5m_UUjj9JC2@`|S$XbxZ z?1ADy+<*vom?VrIjVwq=U<*K47(wJ{8(EumPTRfTTW%kntvec7uz&~A*dhj-7)%d6 RA`55-;hcqVB+O|r8URH@GNu3k diff --git a/brushes/perlin.brush b/brushes/perlin.brush deleted file mode 100644 index 4f5a598a7fcb4ce15e7e702b9a0ae702cfdb3a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 837 zcmd^-K?=e!5JinH1<&9Kyh768cMB|Y3Sq_iFM#QHI3xDot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index c3db9651e..93fcad567 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2371:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2377:0 case type_ui_render_command_window_start: { diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 14aac37cb..f4356d639 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,11 +1,11 @@ -// src/engine/editor.h:1140:0 +// src/engine/editor.h:1002:0 link_internal b32 -AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) +AreEqual(brush_settings *Thing1, brush_settings *Thing2) { if (Thing1 && Thing2) { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( world_edit_brush ) ); + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( brush_settings ) ); return Result; } @@ -16,9 +16,9 @@ AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) } link_internal b32 -AreEqual(world_edit_brush Thing1, world_edit_brush Thing2) +AreEqual(brush_settings Thing1, brush_settings Thing2) { - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( world_edit_brush ) ); + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( brush_settings ) ); return Result; } diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 715601807..4aa335439 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1206:0 +// src/engine/editor.h:1112:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 57f42d626..a11473690 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1221:0 +// src/engine/editor.h:1127:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 3816ecf76..36e1026cd 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1232:0 +// src/engine/editor.h:1138:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 7119f3e8a..f2ff8c410 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1224:0 +// src/engine/editor.h:1130:0 diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index bb69c9459..5c8061e9b 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -177,11 +177,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - cs MemberName = CSz("Iterations"); + cs MemberName = CSz("Invert"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->Iterations), + Cast(b8*, &Element->Invert), MemberName, Params ); @@ -202,11 +202,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - cs MemberName = CSz("Offset"); + cs MemberName = CSz("Iterations"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(rect3i*, &Element->Offset), + Cast(s32*, &Element->Iterations), MemberName, Params ); @@ -219,18 +219,19 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N } - + PushNewRow(Ui); + { - cs MemberName = CSz("NoiseBasisOffset"); + cs MemberName = CSz("Offset"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->NoiseBasisOffset), + Cast(rect3i*, &Element->Offset), MemberName, Params ); @@ -250,8 +251,17 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - cs MemberName = CSz("HSVColor"); - DoColorPicker(Ui, Window, &Element->HSVColor, False); + cs MemberName = CSz("NoiseBasisOffset"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3i*, &Element->NoiseBasisOffset), + MemberName, + Params + ); + + + @@ -265,24 +275,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - cs MemberName = CSz("Invert"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->Invert), - MemberName, - Params - ); - - - + cs MemberName = CSz("HSVColor"); + PushColumn(Ui, CSz("HSVColor")); DoColorPickerToggle(Ui, Window, &Element->HSVColor, False); } - - PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 4042e7217..43ad2d4c9 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -223,8 +223,6 @@ - - @@ -744,7 +742,6 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) - struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index a19a85182..6421709f8 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -223,8 +223,6 @@ - - @@ -734,7 +732,6 @@ render_to_texture_async_params render_to_texture_async_params; - draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index b84de4900..9b3860b05 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -223,8 +223,6 @@ - - @@ -734,7 +732,6 @@ type_render_to_texture_async_params, - type_draw_lod_async_params, diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 15f226d0d..f8e9c178b 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1209:0 +// src/engine/editor.h:1115:0 struct world_edit_brush_linked_list_node { diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index 4d839ba1c..5796e3b88 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:440:0 +// src/engine/serdes.cpp:435:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index f00e4f500..3e3dcffd9 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:437:0 +// src/engine/serdes.cpp:432:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) @@ -6,7 +6,7 @@ TypeInfo(brush_settings *Ignored) bonsai_type_info Result = {}; Result.Name = CSz("brush_settings"); - Result.Version = 3 ; + Result.Version = 0 ; /* type.map(member) */ /* { */ @@ -29,10 +29,7 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings *BaseElement, umm Count = b32 Result = True; - Upsert(TypeInfo(BaseElement), &Global_SerializeTypeTable, Global_SerializeTypeTableArena ); - u64 VersionNumber = 3; - Serialize(Bytes, &VersionNumber); - + RangeIterator_t(umm, ElementIndex, Count) { @@ -71,35 +68,35 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings *BaseElement, umm Count = - Result &= Serialize(Bytes, &Element->Iterations); // default + Result &= Serialize(Bytes, &Element->Invert); // default - Result &= Serialize(Bytes, &Element->Offset); // default + Result &= Serialize(Bytes, &Element->Iterations); // default - Result &= Serialize(Bytes, &Element->NoiseBasisOffset); // default + Result &= Serialize(Bytes, &Element->Offset); // default - Result &= Serialize(Bytes, &Element->HSVColor); // default + Result &= Serialize(Bytes, &Element->NoiseBasisOffset); // default - Result &= Serialize(Bytes, &Element->Invert); // default + Result &= Serialize(Bytes, &Element->HSVColor); // default @@ -116,40 +113,6 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_arena *Memory); -link_internal b32 -DeserializeVersioned(u8_cursor *Bytes, brush_settings *Element, bonsai_type_info *TypeInfo, memory_arena *Memory) -{ - Assert(TypeInfo->Version <= 3); - - b32 Result = True; - - if (TypeInfo->Version == 0) - { - brush_settings_0 T0 = {}; - Result &= Deserialize(Bytes, &T0, Memory); - Marshal(&T0, Element); - } - if (TypeInfo->Version == 1) - { - brush_settings_1 T1 = {}; - Result &= Deserialize(Bytes, &T1, Memory); - Marshal(&T1, Element); - } - if (TypeInfo->Version == 2) - { - brush_settings_2 T2 = {}; - Result &= Deserialize(Bytes, &T2, Memory); - Marshal(&T2, Element); - } - - - if (TypeInfo->Version == 3) - { - Result &= DeserializeCurrentVersion(Bytes, Element, Memory); - } - - return Result; -} link_internal b32 @@ -194,7 +157,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Iterations, Memory); + Result &= Deserialize(Bytes, &Element->Invert, Memory); @@ -202,7 +165,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Offset, Memory); + Result &= Deserialize(Bytes, &Element->Iterations, Memory); @@ -210,7 +173,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->NoiseBasisOffset, Memory); + Result &= Deserialize(Bytes, &Element->Offset, Memory); @@ -218,7 +181,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->HSVColor, Memory); + Result &= Deserialize(Bytes, &Element->NoiseBasisOffset, Memory); @@ -226,7 +189,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Invert, Memory); + Result &= Deserialize(Bytes, &Element->HSVColor, Memory); @@ -242,22 +205,7 @@ Deserialize(u8_cursor *Bytes, brush_settings *Element, memory_arena *Memory, umm b32 Result = True; RangeIterator_t(umm, ElementIndex, Count) { - maybe_bonsai_type_info MaybeSerializedType = GetByName(&Global_SerializeTypeTable, CSz("brush_settings")); - - if (MaybeSerializedType.Tag) - { - u64 OldIgnoredVersionNumber; - if (MaybeSerializedType.Value.Version > 0) - { - Deserialize(Bytes, &OldIgnoredVersionNumber, Memory); - } - Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &MaybeSerializedType.Value, Memory); - } - else - { - bonsai_type_info T0TypeInfo = {}; - Result &= DeserializeVersioned(Bytes, Element+ElementIndex, &T0TypeInfo, Memory); - } + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); } diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 999da198c..5fe5a232e 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:446:0 +// src/engine/serdes.cpp:441:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index bb0a845be..66a4b2422 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:452:0 +// src/engine/serdes.cpp:447:0 link_internal bonsai_type_info TypeInfo(world_edit *Ignored) diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index 062ddfc44..a0275357d 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:449:0 +// src/engine/serdes.cpp:444:0 link_internal bonsai_type_info TypeInfo(world_edit_brush *Ignored) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index ce52954be..cbacec747 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2310,6 +2310,32 @@ DoColorPicker(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColor PushNewRow(Ui); } +link_internal void +DoColorPickerToggle(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch) +{ + ui_id InteractionId = UiId(Window, "ColorPicker toggle button", HSVDest); + + u32 ColumnIndex = StartColumn(Ui); + if (ToggledOn(Ui, InteractionId)) + { + // NOTE(Jesse): Gotta use a discrete button id for this + if (Button(Ui, CSz("Done"), UiId(Window, "ColorPicker toggle close", HSVDest))) { SetToggleButton(Ui, InteractionId, False); } + PushNewRow(Ui); + DoColorPicker(Ui, Window, HSVDest, ShowColorSwatch); + } + else + { + ui_style BStyle = UiStyleFromLightestColor(HSVtoRGB(*HSVDest)); + interactable_handle Handle = ToggleButtonStart(Ui, InteractionId, &BStyle); //, Padding, AlignFlags); + v2 Dim = V2(25); + PushUntexturedQuad(Ui, V2(0), Dim, zDepth_Text, &BStyle); + ToggleButtonEnd(Ui); + } + EndColumn(Ui, ColumnIndex); + + PushNewRow(Ui); +} + link_internal void ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowColorSwatch /* = True */) { @@ -2319,8 +2345,6 @@ ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowC { DoColorPicker(Ui, Window, HSVDest, ShowColorSwatch); - PushNewRow(Ui); - if (Button(Ui, CSz("Close"), UiId(Window, "modal close button", 0u))) { CompleteModal(Ui, ModalId); @@ -2474,9 +2498,6 @@ DoWorldEditor(engine_resources *Engine) #endif PushTableEnd(Ui); - - /* DoColorPicker(Engine, &Window, &Editor->HSVColorSelection); */ - PushWindowEnd(Ui, &Window); } diff --git a/src/engine/editor.h b/src/engine/editor.h index d003719bf..7c77015c2 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -971,7 +971,7 @@ poof(string_and_value_tables(brush_layer_type)) poof(do_editor_ui_for_radio_enum(brush_layer_type)) #include -struct brush_settings poof(@version(3)) +struct brush_settings { brush_layer_type Type; poof(@ui_display_name(CSz("BrushType"))) @@ -984,6 +984,7 @@ struct brush_settings poof(@version(3)) world_edit_blend_mode Mode; world_edit_blend_mode_modifier Modifier; world_edit_color_blend_mode ColorMode; + b8 Invert; s32 Iterations = 1; // NOTE(Jesse): How many times to do the filter. // NOTE(Jesse): This is the relative offset from the base selection. @@ -995,106 +996,11 @@ struct brush_settings poof(@version(3)) v3i NoiseBasisOffset; // NOTE(Jesse): The color picker operates in HSV, so we need this to be HSV for now - v3 HSVColor = DEFAULT_HSV_COLOR; poof(@custom_ui(DoColorPicker(Ui, Window, &Element->HSVColor, False))) - /* v3 RGBColor = DEFAULT_RGB_COLOR; */ - b8 Invert; + v3 HSVColor = DEFAULT_HSV_COLOR; poof(@custom_ui(PushColumn(Ui, CSz("HSVColor")); DoColorPickerToggle(Ui, Window, &Element->HSVColor, False))) }; -// TODO(Jesse): Rename to `brush` ..? -struct brush_settings_2 -{ - brush_layer_type Type; - - noise_layer Noise; - shape_layer Shape; - - // - // Common across brush types - // - world_edit_blend_mode Mode; - world_edit_blend_mode_modifier Modifier; - s32 Iterations = 1; // NOTE(Jesse): How many times to do the filter. - - // NOTE(Jesse): This is the relative offset from the base selection. - // Used to inflate or contract the area affected by the brush. - // - // TODO(Jesse): Rename to dilation - rect3i Offset; - - v3i NoiseBasisOffset; - - u16 Color = 1; poof(@custom_marshal(Live->HSVColor = MagicaVoxelDefaultPaletteToHSV(Stored->Color);)) // Default to white - b8 Invert; -}; poof(are_equal(brush_settings)) -#include - - -struct brush_settings_1 -{ - brush_layer_type Type; - - noise_layer Noise; poof(@ui_display_name({}) @ui_display_condition(Element->Type == BrushLayerType_Noise)) - shape_layer Shape; poof(@ui_display_name({}) @ui_display_condition(Element->Type == BrushLayerType_Sphere)) - - // - // Common across brush types - // - world_edit_blend_mode Mode; - world_edit_blend_mode_modifier Modifier; - s32 Iterations = 1; // NOTE(Jesse): How many times to do the filter. - - // NOTE(Jesse): This is the relative offset from the base selection. - // Used to inflate or contract the area affected by the brush. - rect3i Offset; - - v3i NoiseBasisOffset; - - u16 Color = 1; poof(@custom_marshal(Live->HSVColor = MagicaVoxelDefaultPaletteToHSV(Stored->Color);)) // Default to white -}; - -struct brush_settings_0 -{ - brush_layer_type Type; - - noise_layer Noise; - shape_layer Shape; - - // - // Common across brush types - // - world_edit_blend_mode Mode; - world_edit_blend_mode_modifier Modifier; - s32 Iterations = 1; // NOTE(Jesse): How many times to do the filter. - - // NOTE(Jesse): This is the relative offset from the base selection. - // Used to inflate or contract the area affected by the brush. - rect3i Offset; - - u16 Color = 1; poof(@custom_marshal(Live->HSVColor = MagicaVoxelDefaultPaletteToHSV(Stored->Color);)) // Default to white -}; - -link_internal void -Marshal(brush_settings_2 *Stored, brush_settings *Live) -{ - poof(default_marshal(brush_settings_2)) -#include -} - -link_internal void -Marshal(brush_settings_1 *Stored, brush_settings *Live) -{ - poof(default_marshal(brush_settings_1)) -#include -} - -link_internal void -Marshal(brush_settings_0 *Stored, brush_settings *Live) -{ - poof(default_marshal(brush_settings_0)) -#include -} - +#include struct brush_layer { @@ -1355,3 +1261,6 @@ ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowC link_internal void DoColorPicker(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch); + +link_internal void +DoColorPickerToggle(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch); diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index 453dba38f..a10b08e06 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -428,12 +428,7 @@ poof(serdes_struct(world_update_op_shape_params_chunk_data)) poof(serdes_struct(shape_layer)) #include -poof(serdes_struct(brush_settings_0)) -#include -poof(serdes_struct(brush_settings_1)) -#include -poof(serdes_struct(brush_settings_2)) -#include + poof(serdes_struct(brush_settings)) #include From b71b2b7a1793d840723759911f4a82395b12ac59 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 11 May 2025 13:55:50 -0700 Subject: [PATCH 235/421] Update stdlib --- external/bonsai_stdlib | 2 +- jesse.make.sh | 4 ++-- src/engine/render_loop.cpp | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 15e8e05d3..ddf29f4f7 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 15e8e05d384eb1725bae19f6104a5efbd5b719e9 +Subproject commit ddf29f4f74e9f36df00a9cc674296d0490e8fb40 diff --git a/jesse.make.sh b/jesse.make.sh index fcd30c398..a1c4dfa2e 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -10,9 +10,9 @@ # ./make.sh RunTests ./make.sh $OPT \ - BuildSingleExample examples/ui_test \ BuildExecutables \ - # BuildSingleExample examples/terrain_gen \ + BuildSingleExample examples/terrain_gen \ + # BuildSingleExample examples/ui_test \ # BuildSingleExample examples/blank_project \ # BuildTests \ # BuildSingleExample examples/blank_project \ diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 64bbadc46..039632c05 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -16,6 +16,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) WORKER_THREAD_ADVANCE_DEBUG_SYSTEM(); WorkerThread_BeforeJobStart(ThreadParams); + AssertNoGlErrors; + while (work_queue_entry *Job = PopWorkQueueEntry(RenderQ)) { /* TIMED_NAMED_BLOCK(RENDER_LOOP); */ From 4efaf96b8e0a9ff3480cf88a37b086807fa07389 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 11 May 2025 14:21:47 -0700 Subject: [PATCH 236/421] WIP debugging with dottedboxguy --- external/bonsai_stdlib | 2 +- .../shader_magic_bloom_downsample_shader.h | 2 +- .../shader_magic_bloom_upsample_shader.h | 2 +- generated/shader_magic_shadow_map_shader.h | 8 ++++---- ...r_magic_struct_terrain_decoration_shader.h | 8 ++++---- ...gic_struct_terrain_derivs_render_context.h | 2 +- ...c_struct_terrain_finalize_render_context.h | 2 +- ...ader_magic_struct_terrain_shaping_shader.h | 6 +++--- .../shader_magic_struct_world_edit_shader.h | 8 ++++---- jesse.bonsai.rdbg | Bin 15975 -> 16444 bytes src/engine/render/render_init.cpp | 17 +++++++++++------ src/engine/render_loop.cpp | 2 +- src/game_loader.cpp | 2 -- 13 files changed, 32 insertions(+), 29 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index ddf29f4f7..1a8c174a0 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit ddf29f4f74e9f36df00a9cc674296d0490e8fb40 +Subproject commit 1a8c174a0c5d1cf33d7c8b7b6106749b544e85dc diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index 9ef00eff5..d95b39c86 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -30,7 +30,7 @@ UseShader( bloom_downsample_shader *Struct ) s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index 853b0b334..37251e93a 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -30,7 +30,7 @@ UseShader( bloom_upsample_shader *Struct ) s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index 84a3edd6c..30a7d2598 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -37,16 +37,16 @@ UseShader( shadow_map_shader *Struct ) s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; if (UniformIndex != 4 ) diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index 2f271675c..178839370 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -37,16 +37,16 @@ UseShader( terrain_decoration_render_context *Struct ) s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; if (UniformIndex != 4 ) diff --git a/generated/shader_magic_struct_terrain_derivs_render_context.h b/generated/shader_magic_struct_terrain_derivs_render_context.h index 91dc1b6b7..a0785718d 100644 --- a/generated/shader_magic_struct_terrain_derivs_render_context.h +++ b/generated/shader_magic_struct_terrain_derivs_render_context.h @@ -30,7 +30,7 @@ UseShader( terrain_derivs_render_context *Struct ) s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index 1fd706119..7909618e1 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -30,7 +30,7 @@ UseShader( terrain_finalize_render_context *Struct ) s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index 9d3066fb1..133d18602 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -34,13 +34,13 @@ UseShader( terrain_shaping_render_context *Struct ) s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; if (UniformIndex != 3 ) diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index f2dd31f66..b08ae673c 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -37,16 +37,16 @@ UseShader( world_edit_render_context *Struct ) s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUnifromById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; if (UniformIndex != 4 ) diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 30c8ef2747baa28afa6c0fe22e30d3de19331501..92f1ba4067f01712063604eb95754f6b700ab9c7 100644 GIT binary patch delta 305 zcmaD}v!{V^f(OfW1_p-7j5?Z=V=ee5vswx<`b}nJ)R=tUQc$uqGd`)Pv^XO^C$TcM zC_XW{Br`v+STDnWvZA6pPf2QVNqk9VL8@Mc*W`_?mLjQnrMdA*nI&nNsW~a}Af8^v zWJYyOjpCA`%)IpY#JrUFvc#Oy)cBIbq@2`ZbhQy+i(@ThHcqs)V04`PQC(+pr=`f| z2uo!~UM8S3L4Xm64JJ3rX-msyoFF|tgSvsLB>34kyoBje;oTlL9Bwr_dBihyDu008~IR3HEV delta 125 zcmdnf!1%mof(OfG1_p-7i7J|tW0~YO%QIP9FuG1YXlXXFS!lATmE-2wR?3Xpj6gLY zzy!pTk2hcWUeCY)5@Q46;EcqS)FPM)#?56mInitialized == False); + + shadow_render_group *SG = Allocate(shadow_render_group, GraphicsMemory, 1); + { + v2i SR = V2i(1024*2); + if (!InitializeShadowRenderGroup(Result, SG, SR)) + { + SoftError("Initializing Shadow Buffer");// return False; + } + } + + Init_Global_QuadVertexBuffer(); Result->Memory = GraphicsMemory; @@ -587,12 +598,6 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Error("Initializing g_buffer_render_group"); return False; } - shadow_render_group *SG = Allocate(shadow_render_group, GraphicsMemory, 1); - if (!InitializeShadowRenderGroup(Result, SG, Result->Settings.iShadowMapResolution)) - { - SoftError("Initializing Shadow Buffer");// return False; - } - ao_render_group *AoGroup = CreateAoRenderGroup(GraphicsMemory); if (!InitAoRenderGroup(Result->Settings.iApplicationResolution, AoGroup)) { diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 039632c05..a89d3aaa4 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -239,7 +239,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) shader_uniform *Uniform = &Command->Uniform; if (Uniform->ID >= 0) { - BindUnifromById(Uniform, &Command->TextureUnit); + BindUniformById(Uniform, &Command->TextureUnit); } else { diff --git a/src/game_loader.cpp b/src/game_loader.cpp index 924f74635..5e5d08550 100644 --- a/src/game_loader.cpp +++ b/src/game_loader.cpp @@ -189,12 +189,10 @@ main( s32 ArgCount, const char ** Args ) InitQueue(&Plat->RenderQ, WorkQueueMemory); InitQueue(&Plat->WorldUpdateQ, WorkQueueMemory); - DEBUG_REGISTER_ARENA(GameMemory, 0); DEBUG_REGISTER_ARENA(WorkQueueMemory, 0); DEBUG_REGISTER_ARENA(&BootstrapArena, 0); - thread_local_state *MainThread = GetThreadLocalState(ThreadLocal_ThreadIndex); if (GameApi->GameInit) From ce8e22c2d9e65b57ce4dfe6e4bfbae2f48a96d46 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 11 May 2025 14:37:47 -0700 Subject: [PATCH 237/421] WIP debugging with dbg --- external/bonsai_stdlib | 2 +- generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- shaders/DepthRTT.fragmentshader | 24 ++++++++++----------- shaders/DepthRTT.vertexshader | 14 ++++++------ src/engine/render.cpp | 4 +++- 11 files changed, 30 insertions(+), 28 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 1a8c174a0..08214b4b5 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 1a8c174a0c5d1cf33d7c8b7b6106749b544e85dc +Subproject commit 08214b4b5ab8ef7d889f419022178a3915cc315a diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 92b0a1b64..d01f72ba7 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:320:0 +// external/bonsai_stdlib/src/shader.cpp:321:0 b32 SetShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 43aa9e0d7..4df44bd5b 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:335:0 +// external/bonsai_stdlib/src/shader.cpp:336:0 b32 SetShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index bc2ba9fa1..1220a94cf 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:332:0 +// external/bonsai_stdlib/src/shader.cpp:333:0 b32 SetShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index e8cc2f373..dd003ce2e 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:317:0 +// external/bonsai_stdlib/src/shader.cpp:318:0 b32 SetShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 5e3161673..9c6bc5115 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:329:0 +// external/bonsai_stdlib/src/shader.cpp:330:0 b32 SetShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index 4a4b48e31..cae7eafe3 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:323:0 +// external/bonsai_stdlib/src/shader.cpp:324:0 b32 SetShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index d850a488a..eace11523 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:326:0 +// external/bonsai_stdlib/src/shader.cpp:327:0 b32 SetShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) diff --git a/shaders/DepthRTT.fragmentshader b/shaders/DepthRTT.fragmentshader index d98f9bec7..be6aef5fd 100644 --- a/shaders/DepthRTT.fragmentshader +++ b/shaders/DepthRTT.fragmentshader @@ -1,22 +1,22 @@ /* out vec4 color; */ -uniform vec3 MinClipP_worldspace; -uniform vec3 MaxClipP_worldspace; +/* uniform vec3 MinClipP_worldspace; */ +/* uniform vec3 MaxClipP_worldspace; */ -in vec3 vertexP_worldspace; +/* in vec3 vertexP_worldspace; */ void main() { - if (vertexP_worldspace.x >= MinClipP_worldspace.x && - vertexP_worldspace.y >= MinClipP_worldspace.y && - vertexP_worldspace.z >= MinClipP_worldspace.z && + /* if (vertexP_worldspace.x >= MinClipP_worldspace.x && */ + /* vertexP_worldspace.y >= MinClipP_worldspace.y && */ + /* vertexP_worldspace.z >= MinClipP_worldspace.z && */ - vertexP_worldspace.x < MaxClipP_worldspace.x && - vertexP_worldspace.y < MaxClipP_worldspace.y && - vertexP_worldspace.z < MaxClipP_worldspace.z) - { - discard; - } + /* vertexP_worldspace.x < MaxClipP_worldspace.x && */ + /* vertexP_worldspace.y < MaxClipP_worldspace.y && */ + /* vertexP_worldspace.z < MaxClipP_worldspace.z) */ + /* { */ + /* discard; */ + /* } */ /* Depth is written linearized to the texture; our projection is orthographic */ /* color = vec4(1,0,0,1); */ diff --git a/shaders/DepthRTT.vertexshader b/shaders/DepthRTT.vertexshader index 9728cf8be..f73a2e185 100644 --- a/shaders/DepthRTT.vertexshader +++ b/shaders/DepthRTT.vertexshader @@ -1,14 +1,14 @@ -layout(location = 0) in vec3 vertexPosition_modelspace; +in vec3 vertexPosition_modelspace; -// NOTE(Jesse): Camera transform -uniform mat4 MVP; -uniform mat4 ModelMatrix; +/* // NOTE(Jesse): Camera transform */ +/* uniform mat4 MVP; */ +/* uniform mat4 ModelMatrix; */ -out vec3 vertexP_worldspace; +/* out vec3 vertexP_worldspace; */ void main() { - vertexP_worldspace = (ModelMatrix * vec4(vertexPosition_modelspace, 1)).xyz; // ?? - gl_Position = MVP * V4(vertexP_worldspace, 1); + /* vertexP_worldspace = (ModelMatrix * vec4(vertexPosition_modelspace, 1)).xyz; // ?? */ + gl_Position = vec4(vertexPosition_modelspace, 1); } diff --git a/src/engine/render.cpp b/src/engine/render.cpp index 41c1ebf2d..ccdeba4f8 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1172,7 +1172,9 @@ DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Mes m4 NormalMatrix = Transpose(Inverse(LocalTransform)); // @janky_model_matrix_bs - Ensure(TryBindUniform(Shader, "ModelMatrix", &LocalTransform)); + // nopush + TryBindUniform(Shader, "ModelMatrix", &LocalTransform); + /* Ensure(TryBindUniform(Shader, "ModelMatrix", &LocalTransform)); */ AssertNoGlErrors; TryBindUniform(Shader, "NormalMatrix", &NormalMatrix); // NOTE(Jesse): Not all shaders that use this path draw normals (namely, DepthRTT) AssertNoGlErrors; From 23ab60c773db16d18ebf503658e41662a0c9c3d7 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 11 May 2025 14:43:46 -0700 Subject: [PATCH 238/421] WIP --- external/bonsai_stdlib | 2 +- shaders/DepthRTT.fragmentshader | 24 ++++++++++++------------ shaders/DepthRTT.vertexshader | 14 +++++++------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 08214b4b5..f030afdef 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 08214b4b5ab8ef7d889f419022178a3915cc315a +Subproject commit f030afdef5f750ffec9a20e6e1773dc61ce6b574 diff --git a/shaders/DepthRTT.fragmentshader b/shaders/DepthRTT.fragmentshader index be6aef5fd..d98f9bec7 100644 --- a/shaders/DepthRTT.fragmentshader +++ b/shaders/DepthRTT.fragmentshader @@ -1,22 +1,22 @@ /* out vec4 color; */ -/* uniform vec3 MinClipP_worldspace; */ -/* uniform vec3 MaxClipP_worldspace; */ +uniform vec3 MinClipP_worldspace; +uniform vec3 MaxClipP_worldspace; -/* in vec3 vertexP_worldspace; */ +in vec3 vertexP_worldspace; void main() { - /* if (vertexP_worldspace.x >= MinClipP_worldspace.x && */ - /* vertexP_worldspace.y >= MinClipP_worldspace.y && */ - /* vertexP_worldspace.z >= MinClipP_worldspace.z && */ + if (vertexP_worldspace.x >= MinClipP_worldspace.x && + vertexP_worldspace.y >= MinClipP_worldspace.y && + vertexP_worldspace.z >= MinClipP_worldspace.z && - /* vertexP_worldspace.x < MaxClipP_worldspace.x && */ - /* vertexP_worldspace.y < MaxClipP_worldspace.y && */ - /* vertexP_worldspace.z < MaxClipP_worldspace.z) */ - /* { */ - /* discard; */ - /* } */ + vertexP_worldspace.x < MaxClipP_worldspace.x && + vertexP_worldspace.y < MaxClipP_worldspace.y && + vertexP_worldspace.z < MaxClipP_worldspace.z) + { + discard; + } /* Depth is written linearized to the texture; our projection is orthographic */ /* color = vec4(1,0,0,1); */ diff --git a/shaders/DepthRTT.vertexshader b/shaders/DepthRTT.vertexshader index f73a2e185..9728cf8be 100644 --- a/shaders/DepthRTT.vertexshader +++ b/shaders/DepthRTT.vertexshader @@ -1,14 +1,14 @@ -in vec3 vertexPosition_modelspace; +layout(location = 0) in vec3 vertexPosition_modelspace; -/* // NOTE(Jesse): Camera transform */ -/* uniform mat4 MVP; */ -/* uniform mat4 ModelMatrix; */ +// NOTE(Jesse): Camera transform +uniform mat4 MVP; +uniform mat4 ModelMatrix; -/* out vec3 vertexP_worldspace; */ +out vec3 vertexP_worldspace; void main() { - /* vertexP_worldspace = (ModelMatrix * vec4(vertexPosition_modelspace, 1)).xyz; // ?? */ - gl_Position = vec4(vertexPosition_modelspace, 1); + vertexP_worldspace = (ModelMatrix * vec4(vertexPosition_modelspace, 1)).xyz; // ?? + gl_Position = MVP * V4(vertexP_worldspace, 1); } From 7da7eeae5e42c993f7538113318e30bab237e7ba Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 11 May 2025 15:51:50 -0700 Subject: [PATCH 239/421] Cleanup on my machine from the dottedboxguy debug session --- generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- shaders/terrain/shaping/terrain_shaping.fragmentshader | 1 - shaders/terrain/world_edit.fragmentshader | 2 -- 9 files changed, 7 insertions(+), 10 deletions(-) diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index d01f72ba7..92b0a1b64 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:321:0 +// external/bonsai_stdlib/src/shader.cpp:320:0 b32 SetShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 4df44bd5b..43aa9e0d7 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:336:0 +// external/bonsai_stdlib/src/shader.cpp:335:0 b32 SetShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index 1220a94cf..bc2ba9fa1 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:333:0 +// external/bonsai_stdlib/src/shader.cpp:332:0 b32 SetShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index dd003ce2e..e8cc2f373 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:318:0 +// external/bonsai_stdlib/src/shader.cpp:317:0 b32 SetShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 9c6bc5115..5e3161673 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:330:0 +// external/bonsai_stdlib/src/shader.cpp:329:0 b32 SetShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index cae7eafe3..4a4b48e31 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:324:0 +// external/bonsai_stdlib/src/shader.cpp:323:0 b32 SetShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index eace11523..d850a488a 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:327:0 +// external/bonsai_stdlib/src/shader.cpp:326:0 b32 SetShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index 51492a551..5ce366629 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -3,7 +3,6 @@ uniform v3 ChunkResolution; in vec2 UV; out v4 Output; -/* layout (location = 0) out float Output; */ // https://www.shadertoy.com/view/4dffRH diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 32575b428..23bf70ffc 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -1,5 +1,3 @@ -#extension GL_ARB_explicit_uniform_location : enable - uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; From 65439b801ba44cb12a6cf8057615d7aa938f0b6e Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 12 May 2025 07:24:59 -0700 Subject: [PATCH 240/421] Start implementing layer actions toolbar --- external/bonsai_stdlib | 2 +- generated/block_array_bitmap_688853862.h | 12 +++++ .../block_array_c_asset_thumbnail_688856411.h | 14 ++++- ...ntity_ptr_688856411_struct_struct_struct.h | 12 +++++ generated/block_array_c_gpu_timer_688735882.h | 12 +++++ .../block_array_c_shader_ptr_688853971.h | 12 +++++ generated/block_array_c_texture_688856411.h | 12 +++++ generated/block_array_c_u32_688856411.h | 12 +++++ generated/block_array_c_u8_cursor_688856411.h | 12 +++++ ...k_queue_entry_build_chunk_mesh_688853862.h | 12 +++++ generated/block_array_entity_688856407.h | 12 +++++ ...lock_array_file_traversal_node_688853862.h | 12 +++++ ...lock_array_gpu_readback_buffer_688853862.h | 12 +++++ generated/block_array_member_info_688856411.h | 12 +++++ generated/block_array_model_688856411.h | 12 +++++ .../block_array_octree_node_ptr_688853862.h | 12 +++++ ...block_array_picked_octree_node_688853862.h | 12 +++++ .../block_array_standing_spot_688853862.h | 12 +++++ generated/block_array_texture_ptr_688856411.h | 12 +++++ generated/block_array_vox_data_688856411.h | 12 +++++ ...lock_array_voxel_stack_element_688853862.h | 12 +++++ .../block_array_world_chunk_ptr_688853862.h | 12 +++++ generated/block_array_world_edit_688735882.h | 12 +++++ .../block_array_world_edit_layer_688735882.h | 12 +++++ .../block_array_world_edit_ptr_688735882.h | 12 +++++ generated/d_union_ui_render_command.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 27 +++++++++- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...value_tables_enum_ui_brush_layer_actions.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...nd_value_tables_ui_layer_toolbar_actions.h | 5 +- ...ing_and_value_tables_visible_region_size.h | 2 +- .../toolbar_for_enum_ui_brush_layer_actions.h | 2 +- ...oolbar_for_enum_ui_layer_toolbar_actions.h | 4 +- shaders/terrain/world_edit.fragmentshader | 10 ++-- src/engine/editor.cpp | 54 ++++++++++++++----- src/engine/editor.h | 1 + src/engine/render_loop.cpp | 5 +- 133 files changed, 473 insertions(+), 127 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index f030afdef..d51ef0f8f 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit f030afdef5f750ffec9a20e6e1773dc61ce6b574 +Subproject commit d51ef0f8fe46e5da25c968ad04c7ddd8471503c5 diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index a0de84576..bbc7313b0 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -240,6 +240,18 @@ Set( bitmap_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( bitmap_block_array *Array, bitmap_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( bitmap_block_array *Array, bitmap *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( bitmap_block_array *Array, bitmap_block_array_index Index) { diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index a567342a7..cfb01c4cf 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:80:0 +// src/engine/editor.cpp:86:0 @@ -35,6 +35,18 @@ Set( asset_thumbnail_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( asset_thumbnail_block_array *Array, asset_thumbnail *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index) { diff --git a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h index 3f7036ac2..7abb20f5b 100644 --- a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h +++ b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h @@ -35,6 +35,18 @@ Set( entity_ptr_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( entity_ptr_block_array *Array, entity_ptr_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( entity_ptr_block_array *Array, entity_ptr *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( entity_ptr_block_array *Array, entity_ptr_block_array_index Index) { diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index e091a360e..ef8154989 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -35,6 +35,18 @@ Set( gpu_timer_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( gpu_timer_block_array *Array, gpu_timer *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index) { diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index 654e5b465..c99bad876 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -35,6 +35,18 @@ Set( shader_ptr_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( shader_ptr_block_array *Array, shader_ptr_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( shader_ptr_block_array *Array, shader_ptr *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( shader_ptr_block_array *Array, shader_ptr_block_array_index Index) { diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index 5c4884629..1e2b99571 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -35,6 +35,18 @@ Set( texture_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( texture_block_array *Array, texture_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( texture_block_array *Array, texture *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( texture_block_array *Array, texture_block_array_index Index) { diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index d974fa5e6..dd8a5c7c3 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -35,6 +35,18 @@ Set( u32_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( u32_block_array *Array, u32_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( u32_block_array *Array, u32 *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( u32_block_array *Array, u32_block_array_index Index) { diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index 745cdbe1f..bb0566ac2 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -35,6 +35,18 @@ Set( u8_cursor_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( u8_cursor_block_array *Array, u8_cursor *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index) { diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 61ecb92d2..1b158b107 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -240,6 +240,18 @@ Set( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) { diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index cb7501c6a..2be7f5a03 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -240,6 +240,18 @@ Set( entity_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( entity_block_array *Array, entity_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( entity_block_array *Array, entity *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( entity_block_array *Array, entity_block_array_index Index) { diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index faa1fa313..d1f0f04e8 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -240,6 +240,18 @@ Set( file_traversal_node_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( file_traversal_node_block_array *Array, file_traversal_node *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index) { diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 634447412..cdcdc4284 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -240,6 +240,18 @@ Set( gpu_readback_buffer_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) { diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index 3edc22675..e9c372560 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -240,6 +240,18 @@ Set( member_info_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( member_info_block_array *Array, member_info_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( member_info_block_array *Array, member_info *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( member_info_block_array *Array, member_info_block_array_index Index) { diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 2281ef27d..1fea0cc0c 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -240,6 +240,18 @@ Set( model_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( model_block_array *Array, model_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( model_block_array *Array, model *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( model_block_array *Array, model_block_array_index Index) { diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 20d7484c4..ddea093b9 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -240,6 +240,18 @@ Set( octree_node_ptr_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( octree_node_ptr_block_array *Array, octree_node_ptr *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) { diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index fc525b539..ebbeb8281 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -240,6 +240,18 @@ Set( picked_octree_node_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( picked_octree_node_block_array *Array, picked_octree_node *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index bb0f888f7..d422d5185 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -240,6 +240,18 @@ Set( standing_spot_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( standing_spot_block_array *Array, standing_spot_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( standing_spot_block_array *Array, standing_spot *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( standing_spot_block_array *Array, standing_spot_block_array_index Index) { diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index 5b8a2f620..79ddd6d27 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -35,6 +35,18 @@ Set( texture_ptr_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( texture_ptr_block_array *Array, texture_ptr_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( texture_ptr_block_array *Array, texture_ptr *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( texture_ptr_block_array *Array, texture_ptr_block_array_index Index) { diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index 9e7d40d0d..1151c283a 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -240,6 +240,18 @@ Set( vox_data_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( vox_data_block_array *Array, vox_data_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( vox_data_block_array *Array, vox_data *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( vox_data_block_array *Array, vox_data_block_array_index Index) { diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index 9123c3d30..48378b622 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -240,6 +240,18 @@ Set( voxel_stack_element_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( voxel_stack_element_block_array *Array, voxel_stack_element *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index) { diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index 6a2e82e18..0b3849a4c 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -35,6 +35,18 @@ Set( world_chunk_ptr_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( world_chunk_ptr_block_array *Array, world_chunk_ptr *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index) { diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index a11473690..2e38cd0e7 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -240,6 +240,18 @@ Set( world_edit_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( world_edit_block_array *Array, world_edit_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( world_edit_block_array *Array, world_edit *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( world_edit_block_array *Array, world_edit_block_array_index Index) { diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 36e1026cd..d69760ab4 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -240,6 +240,18 @@ Set( world_edit_layer_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( world_edit_layer_block_array *Array, world_edit_layer_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( world_edit_layer_block_array *Array, world_edit_layer *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( world_edit_layer_block_array *Array, world_edit_layer_block_array_index Index) { diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index f2ff8c410..cd7b233b9 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -240,6 +240,18 @@ Set( world_edit_ptr_block_array *Arr, return Result; } +link_internal void +RemoveOrdered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index Index) +{ + NotImplemented; +} + +link_internal void +RemoveOrdered( world_edit_ptr_block_array *Array, world_edit_ptr *Element ) +{ + NotImplemented; +} + link_internal void RemoveUnordered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index Index) { diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index f389c34a5..da0a8f47a 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:860:0 +// external/bonsai_stdlib/src/ui/ui.h:862:0 enum ui_render_command_type { diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 941c3dfbb..8a591b277 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:270:0 +// src/engine/editor.cpp:276:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 917f52f59..936eb30c4 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:421:0 +// src/engine/editor.cpp:427:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 58e10c1ef..8e77106de 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:413:0 +// src/engine/editor.cpp:419:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 19c5bd3b5..95d885f01 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:309:0 +// src/engine/editor.cpp:315:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 13d1406d4..7a9063f79 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:276:0 +// src/engine/editor.cpp:282:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index f2e49a62e..6320cf668 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:209:0 +// src/engine/editor.cpp:215:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 2372de88a..d25d43c1b 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:330:0 +// src/engine/editor.cpp:336:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 5c8061e9b..16257a667 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:115:0 +// src/engine/editor.cpp:121:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 88f849ed9..792a7c6fe 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:303:0 +// src/engine/editor.cpp:309:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 3e76c4ba4..0ca21545b 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:354:0 +// src/engine/editor.cpp:360:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 097c35124..f5c996146 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:312:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index e592b8205..968ed1b7e 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:424:0 +// src/engine/editor.cpp:430:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 4c16a5796..fbc2355a3 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:205:0 +// src/engine/editor.cpp:211:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 16f467a1e..e0ab8bccc 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:471:0 +// src/engine/editor.cpp:477:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 7e638f673..6d6e96838 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:492:0 +// src/engine/editor.cpp:498:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 9edb6d7a4..d9fd5f207 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:489:0 +// src/engine/editor.cpp:495:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 33bf75f61..dc04a71f5 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:393:0 +// src/engine/editor.cpp:399:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 707cdc259..b8d9b5980 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:390:0 +// src/engine/editor.cpp:396:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index b6f3f0a87..00a1f8815 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:427:0 +// src/engine/editor.cpp:433:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index e5d294674..bc7a1b38c 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:378:0 +// src/engine/editor.cpp:384:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 1ccff1767..49fe4b473 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:300:0 +// src/engine/editor.cpp:306:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index dbd5a737a..dff083edc 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:453:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 3077f4008..2eb4a7387 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 01f0ee0a3..acb247bf0 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:360:0 +// src/engine/editor.cpp:366:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 040c4108a..7c5cc8f00 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:363:0 +// src/engine/editor.cpp:369:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 1ef8715da..29dd5853f 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:462:0 +// src/engine/editor.cpp:468:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 031d5867e..f2a6b7fd8 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:486:0 +// src/engine/editor.cpp:492:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 965cbf4d1..cc88e5bb6 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:198:0 +// src/engine/editor.cpp:204:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index fcd3e5bb5..8acfce4da 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:195:0 +// src/engine/editor.cpp:201:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 23e90c94a..27e9a8bf9 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:267:0 +// src/engine/editor.cpp:273:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 589a01a25..7da977b28 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:333:0 +// src/engine/editor.cpp:339:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 2b0f25d15..14485358e 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:477:0 +// src/engine/editor.cpp:483:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -386,6 +386,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("NextLayerIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->NextLayerIndex), + MemberName, + Params + ); + + + + + + + } PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 576caef1b..248f8b949 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:444:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index f7e69f371..441d048bd 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:246:0 +// src/engine/editor.cpp:252:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index b18161b06..e83dae1f7 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:366:0 +// src/engine/editor.cpp:372:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index d871a0daa..8ecfa1f74 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:369:0 +// src/engine/editor.cpp:375:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index a45502a16..78541adbe 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:103:0 +// src/engine/editor.cpp:109:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 62327d76d..b58dd87bf 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:403:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 89e2be6d7..edca5a089 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:261:0 +// src/engine/editor.cpp:267:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index ea3a0c89a..a95dc7af7 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:264:0 +// src/engine/editor.cpp:270:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 9e7fa096a..9222527f1 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:99:0 +// src/engine/editor.cpp:105:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index b456d812a..a80368bf9 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:252:0 +// src/engine/editor.cpp:258:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 2f35df590..fccc9677a 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:297:0 +// src/engine/editor.cpp:303:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index c23c57cef..beda63b02 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:201:0 +// src/engine/editor.cpp:207:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 353bba7b1..4c4c130e4 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:255:0 +// src/engine/editor.cpp:261:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 73a500fc8..61395f8de 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:435:0 +// src/engine/editor.cpp:441:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 81a6959b4..dc98345c5 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:465:0 +// src/engine/editor.cpp:471:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 6b5e16d9e..50fb9d0b8 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:249:0 +// src/engine/editor.cpp:255:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index cf010155b..0d6a9a41b 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:438:0 +// src/engine/editor.cpp:444:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 8fbf9a2b6..b5839a88d 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:181:0 +// src/engine/editor.cpp:187:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index f2307ae7f..eb0c32e49 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:113:0 +// src/engine/editor.cpp:119:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 5fd6f2c54..445a6e06b 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:459:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 72f02b61c..aa133f45e 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:462:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 23e5119cf..65bf0f601 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:456:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index ed5d06867..a93796288 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:339:0 +// src/engine/editor.cpp:345:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 09bfc8667..28917a1b8 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:336:0 +// src/engine/editor.cpp:342:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 89b521bf9..3a68a9785 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:459:0 +// src/engine/editor.cpp:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 0291acedf..4d3158c88 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:306:0 +// src/engine/editor.cpp:312:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index f729c55e7..e5ab104d8 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:468:0 +// src/engine/editor.cpp:474:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 02ed4d692..f534a73b4 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:121:0 +// src/engine/editor.cpp:127:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 9ab3a0e75..c2daff3ed 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:124:0 +// src/engine/editor.cpp:130:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index e6799ad19..2dd45f448 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:279:0 +// src/engine/editor.cpp:285:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 24c75132c..31bc0795a 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:273:0 +// src/engine/editor.cpp:279:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index c8bb86875..0a15e9b4f 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:101:0 +// src/engine/editor.cpp:107:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index b3ad5dd99..593628e4b 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:357:0 +// src/engine/editor.cpp:363:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index f8e9fbfaa..b42c978a1 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:348:0 +// src/engine/editor.cpp:354:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 0562f0484..10d75659c 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:351:0 +// src/engine/editor.cpp:357:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 70d36d16a..148cc555d 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:97:0 +// src/engine/editor.cpp:103:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 8751146c5..e0a2f0106 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:192:0 +// src/engine/editor.cpp:198:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 905b6d192..1d2447d22 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:189:0 +// src/engine/editor.cpp:195:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 7703bef40..d2443fe08 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 791f1dd3e..ce011171d 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:400:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index 2e3b61fa8..e8f15cc94 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:342:0 +// src/engine/editor.cpp:348:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index a185f98de..809d2e525 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:109:0 +// src/engine/editor.cpp:115:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 104541972..2e54a51d3 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:107:0 +// src/engine/editor.cpp:113:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index db5b9dc92..6fca4b8a3 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:397:0 +// src/engine/editor.cpp:403:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 6895d95ac..e46056614 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:372:0 +// src/engine/editor.cpp:378:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index 3859e4a6f..bcfb5f024 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:184:0 +// src/engine/editor.cpp:190:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 6c1a5db9b..031a8c744 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:178:0 +// src/engine/editor.cpp:184:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index fc523fa4d..ca8f11145 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:133:0 +// src/engine/editor.cpp:139:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 6d5f4539f..f06d4ed1d 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:118:0 +// src/engine/editor.cpp:124:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index d15f0a6f4..66e85fa0f 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:418:0 +// src/engine/editor.cpp:424:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 94102cbe7..a884e3b18 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:345:0 +// src/engine/editor.cpp:351:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 2c2bbe220..9af5309c7 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:474:0 +// src/engine/editor.cpp:480:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 29d16db11..9ef88a1ab 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:237:0 +// src/engine/editor.cpp:243:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index b9965f32b..b142bd6d6 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:234:0 +// src/engine/editor.cpp:240:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 96565237b..56777761b 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:375:0 +// src/engine/editor.cpp:381:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 4746d5832..09de96c4a 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:258:0 +// src/engine/editor.cpp:264:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 021ce63ab..421c5584d 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:480:0 +// src/engine/editor.cpp:486:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index f6da41a09..61ae90150 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:483:0 +// src/engine/editor.cpp:489:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index bc7d1222b..a93ffcb49 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:111:0 +// src/engine/editor.cpp:117:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 8e672f2ce..bd8f6a8a2 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:240:0 +// src/engine/editor.cpp:246:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index 3f335d416..9975766da 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:93:0 +// src/engine/editor.cpp:99:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index c3b87625a..f2c01137a 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:416:0 +// src/engine/editor.cpp:422:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 6e895bd57..919f83690 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:230:0 +// src/engine/editor.cpp:236:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_enum_ui_brush_layer_actions.h b/generated/string_and_value_tables_enum_ui_brush_layer_actions.h index d9c923aa2..65dfee9f3 100644 --- a/generated/string_and_value_tables_enum_ui_brush_layer_actions.h +++ b/generated/string_and_value_tables_enum_ui_brush_layer_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:322:0 +// src/engine/editor.cpp:328:0 link_internal counted_string ToStringPrefixless(ui_brush_layer_actions Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 04279d9fd..4d996c602 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:224:0 +// src/engine/editor.cpp:230:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 1c9a3f391..77ce7c88f 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:221:0 +// src/engine/editor.cpp:227:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index fca336199..686e4f11b 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:227:0 +// src/engine/editor.cpp:233:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_ui_layer_toolbar_actions.h b/generated/string_and_value_tables_ui_layer_toolbar_actions.h index 3de1a63c8..a7082fb95 100644 --- a/generated/string_and_value_tables_ui_layer_toolbar_actions.h +++ b/generated/string_and_value_tables_ui_layer_toolbar_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:317:0 +// src/engine/editor.cpp:323:0 link_internal counted_string ToStringPrefixless(ui_layer_toolbar_actions Type) @@ -9,6 +9,7 @@ ToStringPrefixless(ui_layer_toolbar_actions Type) case LayerToolbarActions_New: { Result = CSz("New"); } break; case LayerToolbarActions_Delete: { Result = CSz("Delete"); } break; case LayerToolbarActions_Rename: { Result = CSz("Rename"); } break; + case LayerToolbarActions_Duplicate: { Result = CSz("Duplicate"); } break; } @@ -25,6 +26,7 @@ ToString(ui_layer_toolbar_actions Type) case LayerToolbarActions_New: { Result = CSz("LayerToolbarActions_New"); } break; case LayerToolbarActions_Delete: { Result = CSz("LayerToolbarActions_Delete"); } break; case LayerToolbarActions_Rename: { Result = CSz("LayerToolbarActions_Rename"); } break; + case LayerToolbarActions_Duplicate: { Result = CSz("LayerToolbarActions_Duplicate"); } break; } @@ -40,6 +42,7 @@ UiLayerToolbarActions(counted_string S) if (StringsMatch(S, CSz("LayerToolbarActions_New"))) { return LayerToolbarActions_New; } if (StringsMatch(S, CSz("LayerToolbarActions_Delete"))) { return LayerToolbarActions_Delete; } if (StringsMatch(S, CSz("LayerToolbarActions_Rename"))) { return LayerToolbarActions_Rename; } + if (StringsMatch(S, CSz("LayerToolbarActions_Duplicate"))) { return LayerToolbarActions_Duplicate; } return Result; } diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index ced23a627..1106df6c9 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:91:0 +// src/engine/editor.cpp:97:0 link_internal counted_string ToStringPrefixless(visible_region_size Type) diff --git a/generated/toolbar_for_enum_ui_brush_layer_actions.h b/generated/toolbar_for_enum_ui_brush_layer_actions.h index 60088963a..3e64619be 100644 --- a/generated/toolbar_for_enum_ui_brush_layer_actions.h +++ b/generated/toolbar_for_enum_ui_brush_layer_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:324:0 +// src/engine/editor.cpp:330:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_brush_layer_actions Selection) diff --git a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h index 00b8c6a95..beedabde3 100644 --- a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h +++ b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:319:0 +// src/engine/editor.cpp:325:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_layer_toolbar_actions Selection) @@ -21,6 +21,7 @@ RadioButtonGroup_ui_layer_toolbar_actions( renderer_2d *Ui, { CSz("New"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_New")), LayerToolbarActions_New }, { CSz("Delete"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete")), LayerToolbarActions_Delete }, { CSz("Rename"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename")), LayerToolbarActions_Rename }, + { CSz("Duplicate"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Duplicate")), LayerToolbarActions_Duplicate }, }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -51,6 +52,7 @@ PushToolbar( renderer_2d *Ui, {CSz("New"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_New"), Cast(void*, Index)), LayerToolbarActions_New }, {CSz("Delete"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete"), Cast(void*, Index)), LayerToolbarActions_Delete }, {CSz("Rename"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename"), Cast(void*, Index)), LayerToolbarActions_Rename }, + {CSz("Duplicate"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Duplicate"), Cast(void*, Index)), LayerToolbarActions_Duplicate }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 23bf70ffc..2284dc9d7 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -8,6 +8,7 @@ uniform int Modifiers; uniform int GenerateNormals; +uniform f32 Power; // // Clipping params @@ -34,7 +35,6 @@ uniform f32 Radius; uniform int NoiseType; uniform v3 RGBColor; uniform v3 Period; -uniform f32 Amplitude; uniform f32 Threshold; uniform bool Invert; @@ -116,8 +116,8 @@ void main() case 0: { f32 Dist = distance(ChunkRelLocation, xyz); - if (Dist < Radius) { NoiseSample = 1.f; } - } break; + if (Dist < Radius) { NoiseSample = ((Radius-Dist)/Radius)*Power; } + } break; // ShapeType_Rect case 1: { NoiseSample = 1.f; } break; @@ -192,9 +192,7 @@ void main() NoiseSample *= -1.f; } - f32 Amp = max(Amplitude, 1.f); - NoiseSample *= Amp; - /* NoiseSample *= Amplitude; */ + NoiseSample *= max(Power, 1.f); switch (BlendMode) { diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index cbacec747..4cdd57e87 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -18,6 +18,16 @@ LoadBrushFromFile(level_editor *Editor, file_traversal_node *FileNode, memory_ar FinalizeDeserialization(&Bytes); } +link_internal void +NewLayer(level_editor *Editor) +{ + Editor->CurrentLayer = Push(&Editor->Layers); + Editor->CurrentLayer->Edits = WorldEditBlockArray(Editor->Memory); + + cs DefaultName = FSz("layer_%d", Editor->NextLayerIndex++); + CopyString(DefaultName.Start, Editor->CurrentLayer->NameBuf, DefaultName.Count); +} + link_internal b32 InitEditor(level_editor *Editor) { @@ -25,12 +35,8 @@ InitEditor(level_editor *Editor) Editor->Memory = AllocateArena(); Editor->Layers = WorldEditLayerBlockArray(Editor->Memory); - - Editor->CurrentLayer = Push(&Editor->Layers); - Editor->CurrentLayer->Edits = WorldEditBlockArray(Editor->Memory); - - cs DefaultName = CSz("layer_0"); - CopyString(DefaultName.Start, Editor->CurrentLayer->NameBuf, DefaultName.Count); + Assert(Editor->NextLayerIndex == 0); + NewLayer(Editor); Editor->AssetThumbnails = AssetThumbnailBlockArray(Editor->Memory); @@ -2956,13 +2962,35 @@ DoWorldEditor(engine_resources *Engine) PushWindowStart(Ui, &AllEditsWindow); - ui_toggle_button_group Toolbar = PushToolbar(Ui, &AllEditsWindow, {}, &Ui->LayerToolbarAction); - if (Toolbar.AnyElementClicked) - { - Info("%S", ToString(Ui->LayerToolbarAction)); - } + ui_toggle_button_group Toolbar = PushToolbar(Ui, &AllEditsWindow, {}, &Ui->LayerToolbarAction); + + if (Toolbar.AnyElementClicked) + { + switch(Ui->LayerToolbarAction) + { + case LayerToolbarActions_New: + { + NewLayer(Editor); + } break; + + case LayerToolbarActions_Delete: + { + RemoveOrdered(&Editor->Layers, Editor->CurrentLayer); + } break; - /* if ( */ + case LayerToolbarActions_Rename: + { + NotImplemented; + ui_id Id = {}; + TextBox(Ui, {}, CS(Editor->CurrentLayer->NameBuf, NameBuf_Len), NameBuf_Len, Id); + } break; + + case LayerToolbarActions_Duplicate: + { + NotImplemented; + } break; + } + } PushTableStart(Ui); IterateOver(&Editor->Layers, Layer, LayerIndex) @@ -3006,7 +3034,7 @@ DoWorldEditor(engine_resources *Engine) Editor->HotEdit = Edit; } - if (Button(Ui, FSz("(UpdateBrush)", I, NameBuf), UiId(&AllEditsWindow, "edit brush select", Edit))) + if (Button(Ui, FSz("SetBrush", I, NameBuf), UiId(&AllEditsWindow, "edit brush select", Edit))) { Edit->Brush = Editor->CurrentBrush; UpdateWorldEdit(Engine, Edit, Edit->Region, GetTranArena()); diff --git a/src/engine/editor.h b/src/engine/editor.h index 7c77015c2..f8e76ce64 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1169,6 +1169,7 @@ struct level_editor b32 MaskSelection; u32 NextEditOrdinal; + u32 NextLayerIndex; /* world_edit_block_array WorldEdits; */ world_edit_layer_block_array Layers; world_edit_brush_hashtable LoadedBrushes; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index a89d3aaa4..948036000 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -431,7 +431,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) auto *Perlin = &Noise->Perlin; BindUniformByName(&WorldEditRC->Program, "Threshold", Perlin->Threshold); BindUniformByName(&WorldEditRC->Program, "Period", &Perlin->Period); - BindUniformByName(&WorldEditRC->Program, "Amplitude", Perlin->Amplitude); + BindUniformByName(&WorldEditRC->Program, "Power", Perlin->Amplitude); } break; case NoiseType_Voronoi: @@ -440,7 +440,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "Squareness", Voronoi->Squareness); BindUniformByName(&WorldEditRC->Program, "Threshold", Voronoi->Threshold); BindUniformByName(&WorldEditRC->Program, "Period", &Voronoi->Period); - BindUniformByName(&WorldEditRC->Program, "Amplitude", Voronoi->Amplitude); + BindUniformByName(&WorldEditRC->Program, "Power", Voronoi->Amplitude); } break; case NoiseType_White: @@ -454,6 +454,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) shape_layer *Shape = &Layer->Settings.Shape; BindUniformByName(&WorldEditRC->Program, "ShapeType", Shape->Type); BindUniformByName(&WorldEditRC->Program, "Threshold", Shape->Threshold); + BindUniformByName(&WorldEditRC->Program, "Power", Shape->Power); switch(Shape->Type) { case ShapeType_Sphere: From 3fe6a7fc778e199ca35e707947fb52b61ab0510c Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 12 May 2025 10:30:29 -0700 Subject: [PATCH 241/421] Improve layer UI --- external/bonsai_stdlib | 2 +- src/engine/editor.cpp | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index d51ef0f8f..793fc3dc4 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit d51ef0f8fe46e5da25c968ad04c7ddd8471503c5 +Subproject commit 793fc3dc44e546f6b47921daf726277ffcb9a567 diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 4cdd57e87..ea7b1dc08 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2980,9 +2980,11 @@ DoWorldEditor(engine_resources *Engine) case LayerToolbarActions_Rename: { - NotImplemented; - ui_id Id = {}; - TextBox(Ui, {}, CS(Editor->CurrentLayer->NameBuf, NameBuf_Len), NameBuf_Len, Id); + if (Editor->CurrentLayer) + { + ui_id Id = UiId(&AllEditsWindow, "rename current layer", Editor->CurrentLayer->NameBuf); + TextBox(Ui, {}, CS(Editor->CurrentLayer->NameBuf), NameBuf_Len, Id); + } } break; case LayerToolbarActions_Duplicate: @@ -2996,7 +2998,15 @@ DoWorldEditor(engine_resources *Engine) IterateOver(&Editor->Layers, Layer, LayerIndex) { cs Name = CS(Layer->NameBuf); - if (ToggleButton(Ui, Name, Name, UiId(&AllEditsWindow, Layer, Layer), &DefaultSelectedStyle)) + b32 Selected = Editor->CurrentLayer == Layer; + + ui_style *Style = Selected ? &DefaultSelectedStyle : &DefaultStyle; + if (Button(Ui, Name, UiId(&AllEditsWindow, Layer, Layer), Style)) + { + Editor->CurrentLayer = Layer; + } + + /* if (ToggleButton(Ui, Name, Name, UiId(&AllEditsWindow, Layer, Layer), &DefaultSelectedStyle)) */ { PushNewRow(Ui); IterateOver(&Layer->Edits, Edit, BrushIndex) @@ -3047,7 +3057,10 @@ DoWorldEditor(engine_resources *Engine) } } + PushNewRow(Ui); } + + PushNewRow(Ui); PushTableEnd(Ui); PushWindowEnd(Ui, &AllEditsWindow); From 4baa154c65d887384e4287709981a14ae6346ba4 Mon Sep 17 00:00:00 2001 From: Jesse Hughes Date: Wed, 14 May 2025 13:00:15 -0600 Subject: [PATCH 242/421] Update readme.md --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 741da327f..87415ab91 100644 --- a/readme.md +++ b/readme.md @@ -21,7 +21,7 @@ compiler, and a few appropriate system headers. # Quickstart Grab pre-built binaries & assets from the [Latest Releases](../../releases/latest) -for your platform of choice (as long as it's Windows or Linux ;) +for your platform of your choice (as long as your platform of choice is Windows or Linux) ;) ## Build from Source @@ -68,7 +68,7 @@ See the docs on the [build process](docs/01_build_process.md). ## Editing * CSG-like SDF world editing -* Library of primitive shapes (sphere, rectangular prism, pyramid, cone, etc) +* Library of primitive shapes (rect, sphere, line, cylinder .. etc) * SDF brush-based texturing of primitives ![banner](screenshots/ork_aerial.png) From c5e707a337e11b850e0135f52fd18855e66c8fb3 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 13 May 2025 12:02:17 -0700 Subject: [PATCH 243/421] Random fafing in world gen shader --- examples/terrain_gen/game.cpp | 2 +- examples/terrain_gen/game_constants.h | 35 ----------- generated/are_equal_octree_node.h | 2 +- .../block_array_octree_node_ptr_688853862.h | 2 +- ...block_array_picked_octree_node_688853862.h | 2 +- generated/buffer_octree_node_ptr.h | 2 +- generated/freelist_allocator_octree_node.h | 2 +- generated/freelist_allocator_world_chunk.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- jesse.make.sh | 2 +- .../shaping/terrain_shaping.fragmentshader | 60 +++++++++++++++---- src/engine/world.h | 3 + 13 files changed, 61 insertions(+), 57 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 755b75ee5..24a7311cd 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -764,7 +764,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() world_position WorldCenter = V3i(100, 100, 0); canonical_position CameraTargetP = {}; - auto VisibleRegionSize = VisibleRegionSize_32; + auto VisibleRegionSize = VisibleRegionSize_128; v3i VisibleRegion = V3i(VisibleRegionSize); f32 DistanceFromTarget = Length(VisibleRegion/2.f); f32 FarClip = 150000.f; diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h index 961bf18dc..e69de29bb 100644 --- a/examples/terrain_gen/game_constants.h +++ b/examples/terrain_gen/game_constants.h @@ -1,35 +0,0 @@ - -#if 0 -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(32, 32, 8); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); - -#else - -/* global_variable chunk_dimension */ -/* g_VisibleRegion = Chunk_Dimension(8192*32, 8192*32, 8192*32); // 1677km */ -/* g_VisibleRegion = Chunk_Dimension(8192*8, 8192*8, 8192*8); // 416km */ -/* g_VisibleRegion = Chunk_Dimension(8192*4, 8192*4, 8192*4); // 208km */ -/* g_VisibleRegion = Chunk_Dimension(8192*2, 8192*2, 8192*2); // 104km */ -/* g_VisibleRegion = Chunk_Dimension(8192, 8192, 8192); // 52km */ -/* g_VisibleRegion = Chunk_Dimension(4096, 4096, 4096); // 26km */ -/* g_VisibleRegion = Chunk_Dimension(2048, 2048, 2048); // 13.11 km */ -/* g_VisibleRegion = Chunk_Dimension(1024, 1024, 1024); */ -/* g_VisibleRegion = Chunk_Dimension(512, 512, 512); // 3.28 km */ -/* g_VisibleRegion = Chunk_Dimension(256, 256, 256); */ -/* g_VisibleRegion = Chunk_Dimension(128, 128, 128); */ -/* g_VisibleRegion = Chunk_Dimension(64, 64, 64); */ -/* g_VisibleRegion = Chunk_Dimension(32, 32, 32); */ -/* g_VisibleRegion = Chunk_Dimension(16, 16, 16); */ -/* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ -/* g_VisibleRegion = Chunk_Dimension(4, 4, 4); */ -/* g_VisibleRegion = Chunk_Dimension(2, 2, 2); */ - - - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(64, 64, 64); - -#endif diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index 0011eec00..23c35d599 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:68:0 +// src/engine/world.h:71:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index ddea093b9..75e91e24a 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:82:0 +// src/engine/world.h:85:0 diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index ebbeb8281..f0b4e8e31 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:85:0 +// src/engine/world.h:88:0 diff --git a/generated/buffer_octree_node_ptr.h b/generated/buffer_octree_node_ptr.h index acf29ddd5..f1e18abae 100644 --- a/generated/buffer_octree_node_ptr.h +++ b/generated/buffer_octree_node_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world.h:59:0 +// src/engine/world.h:62:0 struct octree_node_ptr_buffer { diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index 978abbd54..7a8db890d 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:73:0 +// src/engine/world.h:76:0 struct octree_node_freelist { diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h index 0b9bb9b7e..e6840fd64 100644 --- a/generated/freelist_allocator_world_chunk.h +++ b/generated/freelist_allocator_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/world.h:76:0 +// src/engine/world.h:79:0 struct world_chunk_freelist { diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index 1ec348541..a805eac9e 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:79:0 +// src/engine/world.h:82:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index 78654987a..951975919 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:70:0 +// src/engine/world.h:73:0 struct octree_node_ptr_stack { diff --git a/jesse.make.sh b/jesse.make.sh index a1c4dfa2e..eeb22fa59 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index 5ce366629..0ead48788 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -272,24 +272,60 @@ void main() // -- user code -- // { -#if 1 - v3 Period = V3(200.f); - float Amplitude = 150.f; f32 StartingZDepth = 800.f; + NoiseValue = StartingZDepth - Basis.z; + + f32 CliffMask = 1.f; +#if 1 + { + v3 Period = V3(12000.f); + float Amplitude = 2000.f; + + v3 xyz = Basis / Period; + v4 gn = gradient_noise_derivs(xyz); - NoiseValue = StartingZDepth; + CliffMask = (gn.x+1.f)/2.f; + CliffMask += 0.3f; + CliffMask = min(CliffMask, 1.f); + CliffMask = pow(CliffMask, 8); + CliffMask = max(CliffMask, 0.f); + CliffMask = CliffMask; - v3 xyz = Basis / Period; - v4 gn = gradient_noise_derivs(xyz); + NoiseValue += CliffMask * Amplitude; + } +#endif - /* NoiseValue += (CosineInterpolatePointSet((gn.x+1.f)/2.f)*2.f-1.f) * Amplitude; */ - NoiseValue += gn.x * Amplitude; +#if 1 + { + v3 Period = V3(2000.f); + float Amplitude = 1200.f; - /* NoiseValue += Smoothstep(pow(Clamp01(gn.x), 0.1)) * Amplitude; */ + v3 xyz = Basis / Period; + v4 gn = gradient_noise_derivs(xyz); - f32 xyContrib = 0.2f*(max(abs(Basis.x), abs(Basis.y))); - /* f32 xyContrib = 0.f; */ - NoiseValue -= Basis.z - xyContrib; + f32 N = 0.33f+(1.f+gn.x)/2.f; + NoiseValue += pow(N, 5) * Amplitude * CliffMask; + } +#endif + +#if 0 + { + v3 Period = V3(200.f); + float Amplitude = 150.f; + + v3 xyz = Basis / Period; + v4 gn = gradient_noise_derivs(xyz); + + /* NoiseValue += (CosineInterpolatePointSet((gn.x+1.f)/2.f)*2.f-1.f) * Amplitude; */ + f32 N = 0.20f+(1.f+gn.x)/2.f; + NoiseValue += pow(N, 5) * Amplitude; + + /* NoiseValue += Smoothstep(pow(Clamp01(gn.x), 0.1)) * Amplitude; */ + + f32 xyContrib = 0.2f*(max(abs(Basis.x), abs(Basis.y))); + /* f32 xyContrib = 0.f; */ + NoiseValue -= Basis.z - xyContrib; + } #endif } diff --git a/src/engine/world.h b/src/engine/world.h index 4f892365b..50c044e61 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -1,3 +1,6 @@ +global_variable chunk_dimension +WORLD_CHUNK_DIM = Chunk_Dimension(64, 64, 64); + enum visible_region_size { VisibleRegionSize_1 = (1 << 0), From f2e5c2dc72004b85418b9a9df561363f55fc697e Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 13 May 2025 13:49:22 -0700 Subject: [PATCH 244/421] Implement SDF line --- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 28 ++++- generated/do_editor_ui_for_enum_shape_type.h | 13 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + generated/hashtable_world_edit_brush.h | 2 +- generated/serdes_struct_brush_layer.h | 2 +- generated/serdes_struct_brush_settings.h | 2 +- generated/serdes_struct_layered_brush.h | 2 +- generated/serdes_struct_shape_layer.h | 21 +++- generated/serdes_struct_world_edit.h | 2 +- generated/serdes_struct_world_edit_brush.h | 2 +- ...truct_world_update_op_shape_params_asset.h | 2 +- ..._world_update_op_shape_params_chunk_data.h | 2 +- ...ct_world_update_op_shape_params_cylinder.h | 17 ++- ...struct_world_update_op_shape_params_line.h | 115 ++++++++++++++++++ ...g_and_value_tables_enum_brush_layer_type.h | 2 +- .../string_and_value_tables_shape_type.h | 17 +-- shaders/terrain/world_edit.fragmentshader | 39 ++++-- src/engine/editor.cpp | 10 ++ src/engine/editor.h | 39 +++--- src/engine/render_loop.cpp | 14 ++- src/engine/serdes.cpp | 4 +- 30 files changed, 291 insertions(+), 61 deletions(-) create mode 100644 generated/serdes_struct_world_update_op_shape_params_line.h diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index f4356d639..ef433af7a 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1002:0 +// src/engine/editor.h:1013:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 4aa335439..6aee92909 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1112:0 +// src/engine/editor.h:1123:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 2e38cd0e7..a67eb3672 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1127:0 +// src/engine/editor.h:1138:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index d69760ab4..e2c35fe65 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1138:0 +// src/engine/editor.h:1149:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index cd7b233b9..886436d74 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1130:0 +// src/engine/editor.h:1141:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 51abf8e7b..12cca1d67 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:955:0 +// src/engine/editor.h:966:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index eb0c32e49..3c6324cc1 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -48,6 +48,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name + } + + + if (Element->Type == ShapeType_Rect) + + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_update_op_shape_params_rect*, &Element->Rect), + MemberName, + Params + ); + + + + + + + } @@ -75,7 +99,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name } - if (Element->Type == ShapeType_Rect) + if (Element->Type == ShapeType_Line) { @@ -85,7 +109,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_update_op_shape_params_rect*, &Element->Rect), + Cast(world_update_op_shape_params_sphere*, &Element->Line), MemberName, Params ); diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index a93ffcb49..81ac95b0a 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -11,6 +11,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Rect"), UiId(Window, "enum ShapeType_Rect", Element), Params)) + { + *Element = ShapeType_Rect; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column if (Button(Ui, CSz("Sphere"), UiId(Window, "enum ShapeType_Sphere", Element), Params)) { *Element = ShapeType_Sphere; @@ -20,9 +29,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Rect"), UiId(Window, "enum ShapeType_Rect", Element), Params)) + if (Button(Ui, CSz("Line"), UiId(Window, "enum ShapeType_Line", Element), Params)) { - *Element = ShapeType_Rect; + *Element = ShapeType_Line; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 1a9a808f4..277a00e71 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:971:0 +// src/engine/editor.h:982:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 43ad2d4c9..b278fa914 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -742,6 +742,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 6421709f8..38eeda829 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -732,6 +732,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 9b3860b05..fa785d11c 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -732,6 +732,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index f8e9c178b..3cde51059 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1115:0 +// src/engine/editor.h:1126:0 struct world_edit_brush_linked_list_node { diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index 5796e3b88..a12217d50 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:435:0 +// src/engine/serdes.cpp:437:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index 3e3dcffd9..7fda92243 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:432:0 +// src/engine/serdes.cpp:434:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 5fe5a232e..d0b84002b 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:441:0 +// src/engine/serdes.cpp:443:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index b65b3fdb6..48c7f0699 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:428:0 +// src/engine/serdes.cpp:430:0 link_internal bonsai_type_info TypeInfo(shape_layer *Ignored) @@ -39,6 +39,13 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) + Result &= Serialize(Bytes, &Element->Rect); // default + + + + + + Result &= Serialize(Bytes, &Element->Sphere); // default @@ -46,7 +53,7 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) - Result &= Serialize(Bytes, &Element->Rect); // default + Result &= Serialize(Bytes, &Element->Line); // default @@ -95,6 +102,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer *Element, memory_arena * + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Rect, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Sphere, Memory); @@ -105,7 +120,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer *Element, memory_arena * // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Rect, Memory); + Result &= Deserialize(Bytes, &Element->Line, Memory); diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index 66a4b2422..8b4f16dcf 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:447:0 +// src/engine/serdes.cpp:449:0 link_internal bonsai_type_info TypeInfo(world_edit *Ignored) diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index a0275357d..6d33559ac 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:444:0 +// src/engine/serdes.cpp:446:0 link_internal bonsai_type_info TypeInfo(world_edit_brush *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_asset.h b/generated/serdes_struct_world_update_op_shape_params_asset.h index f3fc07283..d57614804 100644 --- a/generated/serdes_struct_world_update_op_shape_params_asset.h +++ b/generated/serdes_struct_world_update_op_shape_params_asset.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:421:0 +// src/engine/serdes.cpp:423:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_asset *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h index 3f803d596..a62add8e6 100644 --- a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h +++ b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:423:0 +// src/engine/serdes.cpp:425:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_chunk_data *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_cylinder.h b/generated/serdes_struct_world_update_op_shape_params_cylinder.h index 1233a1da5..cfd40ddfa 100644 --- a/generated/serdes_struct_world_update_op_shape_params_cylinder.h +++ b/generated/serdes_struct_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:419:0 +// src/engine/serdes.cpp:421:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_cylinder *Ignored) @@ -43,6 +43,13 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_cylinder *B Result &= Serialize(Bytes, &Element->P1); // default + + + + + + Result &= Serialize(Bytes, &Element->Radius); // default + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -76,6 +83,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_cylinde // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->P1, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Radius, Memory); + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/serdes_struct_world_update_op_shape_params_line.h b/generated/serdes_struct_world_update_op_shape_params_line.h new file mode 100644 index 000000000..4e5a102df --- /dev/null +++ b/generated/serdes_struct_world_update_op_shape_params_line.h @@ -0,0 +1,115 @@ +// src/engine/serdes.cpp:419:0 + +link_internal bonsai_type_info +TypeInfo(world_update_op_shape_params_line *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("world_update_op_shape_params_line"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_line *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + world_update_op_shape_params_line *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->P0); // default + + + + + + + Result &= Serialize(Bytes, &Element->P1); // default + + + + + + + Result &= Serialize(Bytes, &Element->Radius); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_line *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_line *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_line *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->P0, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->P1, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Radius, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_line *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index d2c51d945..f13bbae37 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:969:0 +// src/engine/editor.h:980:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 2ea8463c9..53b7d151a 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:912:0 +// src/engine/editor.h:922:0 link_internal counted_string ToStringPrefixless(shape_type Type) @@ -6,8 +6,9 @@ ToStringPrefixless(shape_type Type) counted_string Result = {}; switch (Type) { - case ShapeType_Sphere: { Result = CSz("Sphere"); } break; - case ShapeType_Rect: { Result = CSz("Rect"); } break; + case ShapeType_Rect: { Result = CSz("Rect"); } break; + case ShapeType_Sphere: { Result = CSz("Sphere"); } break; + case ShapeType_Line: { Result = CSz("Line"); } break; case ShapeType_Cylinder: { Result = CSz("Cylinder"); } break; @@ -22,8 +23,9 @@ ToString(shape_type Type) counted_string Result = {}; switch (Type) { - case ShapeType_Sphere: { Result = CSz("ShapeType_Sphere"); } break; - case ShapeType_Rect: { Result = CSz("ShapeType_Rect"); } break; + case ShapeType_Rect: { Result = CSz("ShapeType_Rect"); } break; + case ShapeType_Sphere: { Result = CSz("ShapeType_Sphere"); } break; + case ShapeType_Line: { Result = CSz("ShapeType_Line"); } break; case ShapeType_Cylinder: { Result = CSz("ShapeType_Cylinder"); } break; @@ -37,8 +39,9 @@ ShapeType(counted_string S) { shape_type Result = {}; - if (StringsMatch(S, CSz("ShapeType_Sphere"))) { return ShapeType_Sphere; } - if (StringsMatch(S, CSz("ShapeType_Rect"))) { return ShapeType_Rect; } + if (StringsMatch(S, CSz("ShapeType_Rect"))) { return ShapeType_Rect; } + if (StringsMatch(S, CSz("ShapeType_Sphere"))) { return ShapeType_Sphere; } + if (StringsMatch(S, CSz("ShapeType_Line"))) { return ShapeType_Line; } if (StringsMatch(S, CSz("ShapeType_Cylinder"))) { return ShapeType_Cylinder; } return Result; diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 2284dc9d7..88de27df3 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -1,5 +1,5 @@ -uniform v3 WorldspaceChunkBasis; -uniform v3 ChunkResolution; +uniform v3 WorldspaceChunkBasis; +uniform v3 ChunkResolution; uniform int BrushType; uniform int BlendMode; @@ -25,17 +25,17 @@ uniform int ShapeType; // // Sphere Params // -uniform v3 ChunkRelLocation; +uniform v3 ChunkRelLocation; uniform f32 Radius; // // Noise params // -uniform int NoiseType; -uniform v3 RGBColor; -uniform v3 Period; -uniform f32 Threshold; +uniform int NoiseType; +uniform v3 RGBColor; +uniform v3 Period; +uniform f32 Threshold; uniform bool Invert; // @@ -64,6 +64,7 @@ void main() f32 y = floor(gl_FragCoord.y - (z*66)); v3 xyz = V3(x,y,z) * ChunkResolution; + // TODO(Jesse): I have no idea why this works out to > Min and <= Max. I // think it should be >= Min and < Max .. but I'm just going to leave it for now.. if ( @@ -76,6 +77,7 @@ void main() xyz.z <= ChunkRelEditMax.z ) { v3 Basis = WorldspaceChunkBasis + xyz; + v3 EditRelPosition = xyz - ChunkRelEditMin; { @@ -112,20 +114,33 @@ void main() { switch (ShapeType) { + // ShapeType_Rect + case 0: { NoiseSample = 1.f; } break; + // ShapeType_Sphere - case 0: + case 1: { f32 Dist = distance(ChunkRelLocation, xyz); if (Dist < Radius) { NoiseSample = ((Radius-Dist)/Radius)*Power; } } break; - // ShapeType_Rect - case 1: { NoiseSample = 1.f; } break; + // ShapeType_Line + case 2: + { + // TODO(Jesse): Mr. Jippity said this is how to do distance to + // line and it works, although I'm not sure it's necessarily a very good way to do it .. + v3 Line = normalize(ChunkRelEditMax-ChunkRelEditMin); + v3 X = cross(Line, EditRelPosition); + f32 Dist = length(X)/length(Line); + /* if (Dist < Radius) { NoiseSample = ((Radius-Dist)/Radius)*Power; } */ + /* if (Dist < Radius) { NoiseSample = Dist*Power; } */ + if (Dist < Radius) { NoiseSample = Power; } + } break; // ShapeType_Cylinder - case 2: { } break; + case 3: { } break; - // @dottedboxguy (Step6) Add more cases and implementations here + // @sdf_shape_step(6): Add more cases and implementations here // for shape types added in Step 1 // } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index ea7b1dc08..876d56a30 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -979,8 +979,11 @@ link_internal v3i GetShapeDim(shape_layer *Layer) { v3i Result = {}; + NotImplemented; +#if 0 switch (Layer->Type) { + case ShapeType_: { NotImplemented; } break; case ShapeType_Cylinder: { NotImplemented; } break; case ShapeType_Sphere: { @@ -993,6 +996,7 @@ GetShapeDim(shape_layer *Layer) Result = V3i(GetDim(Layer->Rect.Region)); } break; } +#endif return Result; } @@ -1001,6 +1005,8 @@ link_internal v3i GetRequiredDimForLayer(v3i SelectionDim, brush_layer *Layer) { v3i Request = GetDim(Layer->Settings.Offset); + NotImplemented; +#if 0 switch (Layer->Settings.Type) { case BrushLayerType_Noise: @@ -1027,6 +1033,7 @@ GetRequiredDimForLayer(v3i SelectionDim, brush_layer *Layer) } } break; } +#endif v3i Result = Max(V3i(0), Request); return Result; @@ -1212,6 +1219,8 @@ BrushSettingsForShapeBrush(engine_resources *Engine, window_layout *Window, shap { UNPACK_ENGINE_RESOURCES(Engine); + NotImplemented; +#if 0 DoEditorUi(Ui, Window, &Layer->Type, CSz("ShapeType")); v3 SelectionDim = GetDim(GetSelectionRect(World, Editor)); @@ -1228,6 +1237,7 @@ BrushSettingsForShapeBrush(engine_resources *Engine, window_layout *Window, shap DoEditorUi(Ui, Window, &Layer->Sphere, CSz("")); } break; } +#endif } diff --git a/src/engine/editor.h b/src/engine/editor.h index f8e76ce64..77ea9cd21 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -822,12 +822,6 @@ poof(do_editor_ui_for_radio_enum(world_edit_brush_type)) /* #include */ -struct world_update_op_shape_params_rect -{ - // Sim-space positions - rect3 Region; poof(@ui_disable) -}; - struct asset; struct world_update_op_shape_params_asset { @@ -842,20 +836,35 @@ struct world_update_op_shape_params_chunk_data v3 SimSpaceOrigin; }; +struct world_update_op_shape_params_rect +{ + // Sim-space positions + rect3 Region; poof(@ui_disable) +}; + struct world_update_op_shape_params_sphere { - cp Location; poof(@ui_disable) + cp Location; poof(@ui_disable) f32 Radius = 10.f; }; +struct world_update_op_shape_params_line +{ + cp P0; poof(@ui_disable) + cp P1; poof(@ui_disable) + r32 Radius = 10.f; +}; + struct world_update_op_shape_params_cylinder { - v3 P0; - v3 P1; + cp P0; poof(@ui_disable) + cp P1; poof(@ui_disable) + r32 Radius = 10.f; }; -// @dottedboxguy (Step2) Add new asset struct here + +// @sdf_shape_step(2): Add new asset struct here // #if 0 @@ -902,11 +911,12 @@ poof(do_editor_ui_for_compound_type(world_edit_brush_constraints)) enum shape_type { - ShapeType_Sphere, ShapeType_Rect, + ShapeType_Sphere, + ShapeType_Line, ShapeType_Cylinder, - // @dottedboxguy (Step1) Add shape types here + // @sdf_shape_step(1): Add shape types here // }; poof(string_and_value_tables(shape_type)) @@ -918,11 +928,12 @@ struct shape_layer // NOTE(Jesse): Intentionally not a d-union such that you can toggle between // them and your parameter selections stay intact. - world_update_op_shape_params_sphere Sphere; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Sphere)) world_update_op_shape_params_rect Rect; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Rect)) + world_update_op_shape_params_sphere Sphere; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Sphere)) + world_update_op_shape_params_sphere Line; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Line)) world_update_op_shape_params_cylinder Cylinder; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Cylinder)) - // @dottedboxguy (Step5) Add an instance of the new shape here + // @sdf_shape_step(5): Add an instance of the new shape here // f32 Threshold = 0.f; poof(@ui_value_range(0.f, 1.f)) diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 948036000..9c5d5eadc 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -457,6 +457,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "Power", Shape->Power); switch(Shape->Type) { + case ShapeType_Rect: { /* No special uniforms needed for Rect .. */ } break; + case ShapeType_Sphere: { auto Sphere = &Shape->Sphere; @@ -468,11 +470,17 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "Radius", Sphere->Radius); } break; - case ShapeType_Rect: { /* No special uniforms needed for Rect .. */ } break; + case ShapeType_Line: + { + auto Line = &Shape->Line; + BindUniformByName(&WorldEditRC->Program, "Radius", Line->Radius); + } break; - case ShapeType_Cylinder: { } break; + case ShapeType_Cylinder: + { + } break; - // @dottedboxguy (Step4) Calculate values and bind uniform variables for the new shape + // @sdf_shape_step(4): Calculate values and bind uniform variables for the new shape // } } break; diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index a10b08e06..fc6b97b2b 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -416,13 +416,15 @@ poof(serdes_struct(world_update_op_shape_params_rect)) #include poof(serdes_struct(world_update_op_shape_params_sphere)) #include +poof(serdes_struct(world_update_op_shape_params_line)) +#include poof(serdes_struct(world_update_op_shape_params_cylinder)) #include poof(serdes_struct(world_update_op_shape_params_asset)) #include poof(serdes_struct(world_update_op_shape_params_chunk_data)) #include -// @dottedboxguy (Step3) Add new asset struct here to generate serialization code +// @sdf_shape_step(3): Add new asset struct here to generate serialization code // poof(serdes_struct(shape_layer)) From bf3af5ea1034ddccb417b4dfce86e4c60106edb6 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 13 May 2025 19:26:45 -0700 Subject: [PATCH 245/421] Implement sdf Cylinder --- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- ...lock_array_voxel_stack_element_688853862.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- .../do_editor_ui_for_compound_type_ray.h | 2 +- .../do_editor_ui_for_compound_type_rect3.h | 2 +- .../do_editor_ui_for_compound_type_rect3cp.h | 2 +- .../do_editor_ui_for_compound_type_rect3i.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 95 +++++++++++++++++++ ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- .../gen_constructor_voxel_stack_element.h | 2 +- .../generate_cursor_voxel_stack_element.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- generated/serdes_struct_brush_layer.h | 2 +- generated/serdes_struct_brush_settings.h | 2 +- generated/serdes_struct_layered_brush.h | 2 +- generated/serdes_struct_shape_layer.h | 2 +- generated/serdes_struct_world_edit.h | 2 +- generated/serdes_struct_world_edit_brush.h | 2 +- ...truct_world_update_op_shape_params_asset.h | 2 +- ..._world_update_op_shape_params_chunk_data.h | 2 +- ...ct_world_update_op_shape_params_cylinder.h | 26 +---- ...struct_world_update_op_shape_params_line.h | 2 +- ...struct_world_update_op_shape_params_rect.h | 2 +- ...ruct_world_update_op_shape_params_sphere.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- ...value_tables_enum_ui_brush_layer_actions.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...nd_value_tables_ui_layer_toolbar_actions.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- .../toolbar_for_enum_ui_brush_layer_actions.h | 2 +- ...oolbar_for_enum_ui_layer_toolbar_actions.h | 2 +- shaders/terrain/world_edit.fragmentshader | 49 +++++++++- src/engine/editor.cpp | 10 +- src/engine/editor.h | 24 ++++- src/engine/render_loop.cpp | 5 +- src/engine/serdes.cpp | 9 +- src/engine/world_update.h | 17 ---- 157 files changed, 331 insertions(+), 202 deletions(-) create mode 100644 generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 744a0a84c..bbac6a179 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:752:0 +// src/engine/editor.h:771:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index ef433af7a..e20d4e38b 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1013:0 +// src/engine/editor.h:1031:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 6aee92909..56869fcaa 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1123:0 +// src/engine/editor.h:1141:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index be175c71c..059424d37 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:587:0 +// src/engine/editor.h:606:0 diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index 48378b622..823209690 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_update.h:35:0 +// src/engine/world_update.h:18:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index a67eb3672..4ea268f63 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1138:0 +// src/engine/editor.h:1156:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index e2c35fe65..cc02a9f2b 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1149:0 +// src/engine/editor.h:1167:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 886436d74..263c1dfa9 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1141:0 +// src/engine/editor.h:1159:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 12cca1d67..695446687 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:966:0 +// src/engine/editor.h:984:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 8a591b277..b48de4cf5 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:276:0 +// src/engine/editor.cpp:282:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 936eb30c4..dbe829446 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:427:0 +// src/engine/editor.cpp:433:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 8e77106de..edc2f0417 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:419:0 +// src/engine/editor.cpp:425:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 95d885f01..622c75fb4 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:315:0 +// src/engine/editor.cpp:321:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 7a9063f79..4976b5ae3 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:282:0 +// src/engine/editor.cpp:288:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 6320cf668..b1e604500 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:215:0 +// src/engine/editor.cpp:221:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index d25d43c1b..c653e4a40 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:336:0 +// src/engine/editor.cpp:342:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 16257a667..dcec47be2 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:121:0 +// src/engine/editor.cpp:127:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 792a7c6fe..ee1fa2380 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:309:0 +// src/engine/editor.cpp:315:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 0ca21545b..5822ae798 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:360:0 +// src/engine/editor.cpp:366:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index f5c996146..2a0147f53 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:324:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 968ed1b7e..84d744523 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:430:0 +// src/engine/editor.cpp:436:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index fbc2355a3..e2d6e87f3 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:211:0 +// src/engine/editor.cpp:217:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index e0ab8bccc..e26fb53e2 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:477:0 +// src/engine/editor.cpp:483:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 6d6e96838..59315204a 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:498:0 +// src/engine/editor.cpp:504:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index d9fd5f207..7a0c4708d 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:495:0 +// src/engine/editor.cpp:501:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index dc04a71f5..718bd39c9 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:399:0 +// src/engine/editor.cpp:405:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index b8d9b5980..e4371adf9 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:396:0 +// src/engine/editor.cpp:402:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 00a1f8815..cf99bb65a 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:433:0 +// src/engine/editor.cpp:439:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index bc7a1b38c..12ebd8cc4 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:384:0 +// src/engine/editor.cpp:390:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 49fe4b473..bde68d1fe 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:306:0 +// src/engine/editor.cpp:312:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index dff083edc..262487451 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:459:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 2eb4a7387..df758f79b 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:453:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index acb247bf0..1b463af7a 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:366:0 +// src/engine/editor.cpp:372:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 7c5cc8f00..2193a4c8c 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:369:0 +// src/engine/editor.cpp:375:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 29dd5853f..bf465f730 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:468:0 +// src/engine/editor.cpp:474:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index f2a6b7fd8..83af4b316 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:492:0 +// src/engine/editor.cpp:498:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index cc88e5bb6..bccad15a2 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:204:0 +// src/engine/editor.cpp:210:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 8acfce4da..38d10fcc1 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:201:0 +// src/engine/editor.cpp:207:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 27e9a8bf9..a1b4278ab 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:273:0 +// src/engine/editor.cpp:279:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 7da977b28..822d536d9 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:339:0 +// src/engine/editor.cpp:345:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 14485358e..c9f77d612 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:483:0 +// src/engine/editor.cpp:489:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 248f8b949..cf7a8459d 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:456:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 441d048bd..8ba6beeb9 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:252:0 +// src/engine/editor.cpp:258:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index e83dae1f7..9ea84e5b0 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:372:0 +// src/engine/editor.cpp:378:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index 09dad5360..3ca243006 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:593:0 +// src/engine/editor.h:612:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 8ecfa1f74..d1042c450 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:375:0 +// src/engine/editor.cpp:381:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index b58dd87bf..179c4659e 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:415:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index edca5a089..5b3e8caa6 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:267:0 +// src/engine/editor.cpp:273:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index a95dc7af7..a28d1dc7c 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:270:0 +// src/engine/editor.cpp:276:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index a80368bf9..cd23febca 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:258:0 +// src/engine/editor.cpp:264:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index fccc9677a..910038b2a 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:303:0 +// src/engine/editor.cpp:309:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index beda63b02..b9ce7d792 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:207:0 +// src/engine/editor.cpp:213:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 4c4c130e4..1032e618e 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:261:0 +// src/engine/editor.cpp:267:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index 31299cc32..2111ae469 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:590:0 +// src/engine/editor.h:609:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index 3e9e937cd..2bafe73c9 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:578:0 +// src/engine/editor.h:597:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index f5c28167d..226b2d15b 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:584:0 +// src/engine/editor.h:603:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 16c03361c..8e3954d81 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:581:0 +// src/engine/editor.h:600:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 61395f8de..7bf7233af 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index dc98345c5..a6694ae37 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:471:0 +// src/engine/editor.cpp:477:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 50fb9d0b8..8b3c416b5 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:255:0 +// src/engine/editor.cpp:261:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 0d6a9a41b..5ab28b2b3 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:444:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index b5839a88d..4fd7bce74 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:187:0 +// src/engine/editor.cpp:193:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 3c6324cc1..2af2f3a1b 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:119:0 +// src/engine/editor.cpp:125:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 445a6e06b..20f8e41b4 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:459:0 +// src/engine/editor.cpp:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index aa133f45e..faf31d0ea 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:462:0 +// src/engine/editor.cpp:468:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 65bf0f601..94f5b3ed7 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:462:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index a93796288..a7cf48b1f 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:345:0 +// src/engine/editor.cpp:351:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 28917a1b8..0de0be75f 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:342:0 +// src/engine/editor.cpp:348:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 3a68a9785..037f1428a 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:465:0 +// src/engine/editor.cpp:471:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 4d3158c88..efc120a47 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:312:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index e5ab104d8..8ae61bc0a 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:474:0 +// src/engine/editor.cpp:480:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index f534a73b4..5011fe7bd 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:127:0 +// src/engine/editor.cpp:133:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index c2daff3ed..fad847a90 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:130:0 +// src/engine/editor.cpp:136:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 2dd45f448..e31928858 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:285:0 +// src/engine/editor.cpp:291:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 31bc0795a..d1b69894c 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:279:0 +// src/engine/editor.cpp:285:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 593628e4b..68970884e 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:363:0 +// src/engine/editor.cpp:369:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index b42c978a1..89a5e50a8 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:354:0 +// src/engine/editor.cpp:360:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 10d75659c..9d09180f8 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:357:0 +// src/engine/editor.cpp:363:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index e0a2f0106..e0116501e 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:198:0 +// src/engine/editor.cpp:204:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 1d2447d22..8b32dab19 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:195:0 +// src/engine/editor.cpp:201:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index d2443fe08..f7713a5cd 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:412:0 +// src/engine/editor.cpp:418:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index ce011171d..993654a71 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index e8f15cc94..ec6648c9c 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:348:0 +// src/engine/editor.cpp:354:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h new file mode 100644 index 000000000..30d107a56 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -0,0 +1,95 @@ +// src/engine/editor.cpp:117:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_cylinder", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("Axis"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(voxel_rule_direction*, &Element->Axis), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("Radius"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Radius), + MemberName, + Params + ); + + + + + + + + } + + PushNewRow(Ui); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 809d2e525..4cbf39bff 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:115:0 +// src/engine/editor.cpp:113:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 2e54a51d3..ab2a27a8d 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:113:0 +// src/engine/editor.cpp:115:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 6fca4b8a3..08c2493be 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:403:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index e46056614..53f62a835 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:378:0 +// src/engine/editor.cpp:384:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index bcfb5f024..18160549f 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:190:0 +// src/engine/editor.cpp:196:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 031a8c744..9c459809a 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:184:0 +// src/engine/editor.cpp:190:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index ca8f11145..bcec72b1f 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:139:0 +// src/engine/editor.cpp:145:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index f06d4ed1d..b69eb8559 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:124:0 +// src/engine/editor.cpp:130:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 66e85fa0f..34eabb29e 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:424:0 +// src/engine/editor.cpp:430:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index a884e3b18..7d3c05a3e 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:351:0 +// src/engine/editor.cpp:357:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 0e3589a15..51d98574e 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:575:0 +// src/engine/editor.h:594:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 9af5309c7..be90caa2c 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:480:0 +// src/engine/editor.cpp:486:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 9ef88a1ab..ff0b32f7a 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:243:0 +// src/engine/editor.cpp:249:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index b142bd6d6..3be9d98f8 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:240:0 +// src/engine/editor.cpp:246:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 56777761b..ee0d29d75 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:381:0 +// src/engine/editor.cpp:387:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 7fa7dd43e..594fd6df6 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:570:0 +// src/engine/editor.h:589:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 09de96c4a..dfb96d764 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:264:0 +// src/engine/editor.cpp:270:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 421c5584d..eeb5af33f 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:486:0 +// src/engine/editor.cpp:492:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 61ae90150..b36f23b0e 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:489:0 +// src/engine/editor.cpp:495:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 81ac95b0a..74dbef4a3 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:117:0 +// src/engine/editor.cpp:123:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index bd8f6a8a2..a5d7fafc9 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:246:0 +// src/engine/editor.cpp:252:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 33f9a7180..2e5c7eeea 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:622:0 +// src/engine/editor.h:641:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 87d3ed51a..306e40696 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:780:0 +// src/engine/editor.h:799:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 277a00e71..7f3981d9a 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:982:0 +// src/engine/editor.h:1000:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 9721128cb..77774cd7a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:786:0 +// src/engine/editor.h:805:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index ac2263830..67c133860 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:769:0 +// src/engine/editor.h:788:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 2d1c355cb..26350e44a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:798:0 +// src/engine/editor.h:817:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 601c8c64a..cd827f906 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:791:0 +// src/engine/editor.h:810:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 74cd2a343..ecb4172aa 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:795:0 +// src/engine/editor.h:814:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index bf83e066c..b1dbf93ad 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:445:0 +// src/engine/editor.h:464:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index faa900000..227a4fa58 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:557:0 +// src/engine/editor.h:576:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/gen_constructor_voxel_stack_element.h b/generated/gen_constructor_voxel_stack_element.h index 23f04be5c..707bcbd9b 100644 --- a/generated/gen_constructor_voxel_stack_element.h +++ b/generated/gen_constructor_voxel_stack_element.h @@ -1,4 +1,4 @@ -// src/engine/world_update.h:32:0 +// src/engine/world_update.h:15:0 link_internal voxel_stack_element VoxelStackElement( v3i VoxSimP , voxel_rule_direction Dir ) diff --git a/generated/generate_cursor_voxel_stack_element.h b/generated/generate_cursor_voxel_stack_element.h index d66e55f46..d310fe7d6 100644 --- a/generated/generate_cursor_voxel_stack_element.h +++ b/generated/generate_cursor_voxel_stack_element.h @@ -1,4 +1,4 @@ -// src/engine/world_update.h:38:0 +// src/engine/world_update.h:21:0 struct voxel_stack_element_cursor { diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 3cde51059..4754d1fdd 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1126:0 +// src/engine/editor.h:1144:0 struct world_edit_brush_linked_list_node { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index e7fb08904..c5a0ab8f7 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:608:0 +// src/engine/editor.h:627:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, level_editor_flags Selection) diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 43a6e5a2b..73d4a63c2 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:620:0 +// src/engine/editor.h:639:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index a12217d50..41668a729 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:437:0 +// src/engine/serdes.cpp:438:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index 7fda92243..992de8665 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:434:0 +// src/engine/serdes.cpp:435:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index d0b84002b..b72ad7f96 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:443:0 +// src/engine/serdes.cpp:444:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index 48c7f0699..4aff903ae 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:430:0 +// src/engine/serdes.cpp:431:0 link_internal bonsai_type_info TypeInfo(shape_layer *Ignored) diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index 8b4f16dcf..ad1403b23 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:449:0 +// src/engine/serdes.cpp:450:0 link_internal bonsai_type_info TypeInfo(world_edit *Ignored) diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index 6d33559ac..14560e18f 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:446:0 +// src/engine/serdes.cpp:447:0 link_internal bonsai_type_info TypeInfo(world_edit_brush *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_asset.h b/generated/serdes_struct_world_update_op_shape_params_asset.h index d57614804..b1155b8a1 100644 --- a/generated/serdes_struct_world_update_op_shape_params_asset.h +++ b/generated/serdes_struct_world_update_op_shape_params_asset.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:423:0 +// src/engine/serdes.cpp:415:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_asset *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h index a62add8e6..3921fc277 100644 --- a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h +++ b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:425:0 +// src/engine/serdes.cpp:417:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_chunk_data *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_cylinder.h b/generated/serdes_struct_world_update_op_shape_params_cylinder.h index cfd40ddfa..26538624e 100644 --- a/generated/serdes_struct_world_update_op_shape_params_cylinder.h +++ b/generated/serdes_struct_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:421:0 +// src/engine/serdes.cpp:426:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_cylinder *Ignored) @@ -34,16 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_cylinder *B RangeIterator_t(umm, ElementIndex, Count) { world_update_op_shape_params_cylinder *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->P0); // default - - - - - - - Result &= Serialize(Bytes, &Element->P1); // default - - + Result &= Serialize(Bytes, (u32*)&Element->Axis); // enum @@ -71,18 +62,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_cylinder *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->P0, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->P1, Memory); - + Element->Axis = Cast(voxel_rule_direction, Read_u32(Bytes)); diff --git a/generated/serdes_struct_world_update_op_shape_params_line.h b/generated/serdes_struct_world_update_op_shape_params_line.h index 4e5a102df..76d7e728a 100644 --- a/generated/serdes_struct_world_update_op_shape_params_line.h +++ b/generated/serdes_struct_world_update_op_shape_params_line.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:419:0 +// src/engine/serdes.cpp:424:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_line *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_rect.h b/generated/serdes_struct_world_update_op_shape_params_rect.h index f9640f21e..014cb0e82 100644 --- a/generated/serdes_struct_world_update_op_shape_params_rect.h +++ b/generated/serdes_struct_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:415:0 +// src/engine/serdes.cpp:420:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_rect *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_sphere.h b/generated/serdes_struct_world_update_op_shape_params_sphere.h index 6e4faf683..fdf903b30 100644 --- a/generated/serdes_struct_world_update_op_shape_params_sphere.h +++ b/generated/serdes_struct_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:417:0 +// src/engine/serdes.cpp:422:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_sphere *Ignored) diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index f2c01137a..4bb2ad84e 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:422:0 +// src/engine/editor.cpp:428:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 2139cf942..7af55a173 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:573:0 +// src/engine/editor.h:592:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 919f83690..b433fe088 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:236:0 +// src/engine/editor.cpp:242:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index f13bbae37..0a34404b0 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:980:0 +// src/engine/editor.h:998:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_enum_ui_brush_layer_actions.h b/generated/string_and_value_tables_enum_ui_brush_layer_actions.h index 65dfee9f3..d2d0e79cf 100644 --- a/generated/string_and_value_tables_enum_ui_brush_layer_actions.h +++ b/generated/string_and_value_tables_enum_ui_brush_layer_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:328:0 +// src/engine/editor.cpp:334:0 link_internal counted_string ToStringPrefixless(ui_brush_layer_actions Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 4d996c602..492fcf4a5 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:230:0 +// src/engine/editor.cpp:236:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index ecf011b6a..2047cc6d4 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:568:0 +// src/engine/editor.h:587:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 77ce7c88f..abb324de5 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:227:0 +// src/engine/editor.cpp:233:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 53b7d151a..f5711109b 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:922:0 +// src/engine/editor.h:940:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 686e4f11b..e90df7042 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:233:0 +// src/engine/editor.cpp:239:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_ui_layer_toolbar_actions.h b/generated/string_and_value_tables_ui_layer_toolbar_actions.h index a7082fb95..58dc6ee53 100644 --- a/generated/string_and_value_tables_ui_layer_toolbar_actions.h +++ b/generated/string_and_value_tables_ui_layer_toolbar_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:323:0 +// src/engine/editor.cpp:329:0 link_internal counted_string ToStringPrefixless(ui_layer_toolbar_actions Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 87aa07bae..7f9b38e27 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:618:0 +// src/engine/editor.h:637:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 2d455a82a..f62e9c0dd 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:783:0 +// src/engine/editor.h:802:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index aca904629..bb03dc8f2 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:766:0 +// src/engine/editor.h:785:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 3e6c6315b..e4f059c69 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:789:0 +// src/engine/editor.h:808:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 338709ba6..bfb98a7e6 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:652:0 +// src/engine/editor.h:671:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 26980ae9c..351fe22d0 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:775:0 +// src/engine/editor.h:794:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/generated/toolbar_for_enum_ui_brush_layer_actions.h b/generated/toolbar_for_enum_ui_brush_layer_actions.h index 3e64619be..7c5a2aeb4 100644 --- a/generated/toolbar_for_enum_ui_brush_layer_actions.h +++ b/generated/toolbar_for_enum_ui_brush_layer_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:330:0 +// src/engine/editor.cpp:336:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_brush_layer_actions Selection) diff --git a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h index beedabde3..c6400b320 100644 --- a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h +++ b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:325:0 +// src/engine/editor.cpp:331:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_layer_toolbar_actions Selection) diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 88de27df3..9bb639c70 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -20,7 +20,7 @@ uniform v3 ChunkRelEditMax; // // Shape params // -uniform int ShapeType; +uniform s32 ShapeType; // shape_type // // Sphere Params @@ -28,6 +28,12 @@ uniform int ShapeType; uniform v3 ChunkRelLocation; uniform f32 Radius; +// +// Cylinder Params +// + +uniform s32 Axis; // voxel_rule_direction + // // Noise params @@ -138,9 +144,46 @@ void main() } break; // ShapeType_Cylinder - case 3: { } break; + case 3: + { + switch (Axis) + { + case 0: // VoxelRuleDir_PosX + case 1: // VoxelRuleDir_NegX + { + v3 AxisMask = V3(1,0,0); + v3 InvAxisMask = V3(0.f,1.f,1.f)*0.5f; + v3 EditDim = ChunkRelEditMax-ChunkRelEditMin; + + v3 MajorAxis = EditDim*AxisMask; + v3 MinorAxies = EditDim*InvAxisMask; + + v3 ChunkRelP0 = MinorAxies; + v3 ChunkRelP1 = MinorAxies + MajorAxis; + + v3 Line = ChunkRelP1 - ChunkRelP0; + v3 LineRelativeXYZ = EditRelPosition - ChunkRelP0; + + v3 X = cross(Line, LineRelativeXYZ); + f32 Dist = length(X)/length(Line); + if (Dist < Radius) { NoiseSample = Power; } + + } break; + + case 2: // VoxelRuleDir_PosY + case 3: // VoxelRuleDir_NegY + { + } break; + + case 4: // VoxelRuleDir_PosZ + case 5: // VoxelRuleDir_NegZ + { + } break; + } + + } break; - // @sdf_shape_step(6): Add more cases and implementations here + // @sdf_shape_step(7): Add more cases and implementations here // for shape types added in Step 1 // } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 876d56a30..1bf7646dc 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -110,10 +110,16 @@ poof(do_editor_ui_for_compound_type(noise_layer)) #include -poof(do_editor_ui_for_compound_type(world_update_op_shape_params_sphere)) -#include poof(do_editor_ui_for_compound_type(world_update_op_shape_params_rect)) #include +poof(do_editor_ui_for_compound_type(world_update_op_shape_params_sphere)) +#include +poof(do_editor_ui_for_compound_type(world_update_op_shape_params_cylinder)) +#include + +// @sdf_shape_step(4): Add the editor shit here .. + + poof(do_editor_ui_for_enum(shape_type)) #include poof(do_editor_ui_for_compound_type(shape_layer)) diff --git a/src/engine/editor.h b/src/engine/editor.h index 77ea9cd21..1c1c52eba 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1,3 +1,22 @@ +// NOTE(Jesse): This is more-or-less duplicated in the face_index enum. Coalesce them? +// @duplicate_face_index_enum +// +// TODO(Jesse): Rename this to `axis_dir` or something.. +enum voxel_rule_direction +{ + VoxelRuleDir_PosX, + VoxelRuleDir_NegX, + + VoxelRuleDir_PosY, + VoxelRuleDir_NegY, + + VoxelRuleDir_PosZ, + VoxelRuleDir_NegZ, + + VoxelRuleDir_Count, +}; +CAssert(VoxelRuleDir_Count == 6); + struct world; #define EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS r32 MinValue = 0.f, r32 MaxValue = 1.f @@ -858,8 +877,7 @@ struct world_update_op_shape_params_line struct world_update_op_shape_params_cylinder { - cp P0; poof(@ui_disable) - cp P1; poof(@ui_disable) + voxel_rule_direction Axis; r32 Radius = 10.f; }; @@ -933,7 +951,7 @@ struct shape_layer world_update_op_shape_params_sphere Line; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Line)) world_update_op_shape_params_cylinder Cylinder; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Cylinder)) - // @sdf_shape_step(5): Add an instance of the new shape here + // @sdf_shape_step(6): Add an instance of the new shape here // f32 Threshold = 0.f; poof(@ui_value_range(0.f, 1.f)) diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 9c5d5eadc..8add6ac40 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -478,9 +478,12 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case ShapeType_Cylinder: { + auto Cylinder = &Shape->Cylinder; + BindUniformByName(&WorldEditRC->Program, "Axis", Cylinder->Axis); + BindUniformByName(&WorldEditRC->Program, "Radius", Cylinder->Radius); } break; - // @sdf_shape_step(4): Calculate values and bind uniform variables for the new shape + // @sdf_shape_step(5): Calculate values and bind uniform variables for the new shape // } } break; diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index fc6b97b2b..3c84b30e4 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -412,6 +412,11 @@ poof(serdes_struct(noise_layer_0)) poof(serdes_struct(noise_layer)) #include +poof(serdes_struct(world_update_op_shape_params_asset)) +#include +poof(serdes_struct(world_update_op_shape_params_chunk_data)) +#include + poof(serdes_struct(world_update_op_shape_params_rect)) #include poof(serdes_struct(world_update_op_shape_params_sphere)) @@ -420,10 +425,6 @@ poof(serdes_struct(world_update_op_shape_params_line)) #include poof(serdes_struct(world_update_op_shape_params_cylinder)) #include -poof(serdes_struct(world_update_op_shape_params_asset)) -#include -poof(serdes_struct(world_update_op_shape_params_chunk_data)) -#include // @sdf_shape_step(3): Add new asset struct here to generate serialization code // diff --git a/src/engine/world_update.h b/src/engine/world_update.h index 81130547d..218beb4a5 100644 --- a/src/engine/world_update.h +++ b/src/engine/world_update.h @@ -1,20 +1,3 @@ -// NOTE(Jesse): This is more-or-less duplicated in the face_index enum. Coalesce them? -// @duplicate_face_index_enum -enum voxel_rule_direction -{ - VoxelRuleDir_PosX, - VoxelRuleDir_NegX, - - VoxelRuleDir_PosY, - VoxelRuleDir_NegY, - - VoxelRuleDir_PosZ, - VoxelRuleDir_NegZ, - - VoxelRuleDir_Count, -}; -CAssert(VoxelRuleDir_Count == 6); - struct voxel_stack_element { From 209440b556c34210ef28c9cef4edead22e591c53 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 13 May 2025 19:37:30 -0700 Subject: [PATCH 246/421] Fix additional axes on Cylinder --- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 2 +- .../do_editor_ui_for_compound_type_ray.h | 2 +- .../do_editor_ui_for_compound_type_rect3.h | 2 +- .../do_editor_ui_for_compound_type_rect3cp.h | 2 +- .../do_editor_ui_for_compound_type_rect3i.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ..._editor_ui_for_enum_voxel_rule_direction.h | 83 +++++++++++++++++++ ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...ng_and_value_tables_voxel_rule_direction.h | 59 +++++++++++++ ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- shaders/terrain/world_edit.fragmentshader | 42 ++++++---- src/engine/editor.h | 6 ++ 42 files changed, 211 insertions(+), 55 deletions(-) create mode 100644 generated/do_editor_ui_for_enum_voxel_rule_direction.h create mode 100644 generated/string_and_value_tables_voxel_rule_direction.h diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index bbac6a179..afe2bce8d 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:771:0 +// src/engine/editor.h:776:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index e20d4e38b..f5ae57448 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1031:0 +// src/engine/editor.h:1036:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 56869fcaa..289343703 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1141:0 +// src/engine/editor.h:1146:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 059424d37..dcb200e75 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:606:0 +// src/engine/editor.h:611:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 4ea268f63..c572ee0a5 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1156:0 +// src/engine/editor.h:1161:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index cc02a9f2b..0fe9553a6 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1167:0 +// src/engine/editor.h:1172:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 263c1dfa9..27b8ee10a 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1159:0 +// src/engine/editor.h:1164:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 695446687..8815cb511 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:984:0 +// src/engine/editor.h:989:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index 3ca243006..b3e3ae295 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:612:0 +// src/engine/editor.h:617:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index 2111ae469..cb24532f5 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:609:0 +// src/engine/editor.h:614:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index 2bafe73c9..a1cede379 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:597:0 +// src/engine/editor.h:602:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index 226b2d15b..a64a53d04 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:603:0 +// src/engine/editor.h:608:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 8e3954d81..108d4cfa5 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:600:0 +// src/engine/editor.h:605:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 51d98574e..af1ede3d8 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:594:0 +// src/engine/editor.h:596:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 594fd6df6..34b0fbeea 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:589:0 +// src/engine/editor.h:591:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 2e5c7eeea..3ced45760 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:641:0 +// src/engine/editor.h:646:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_voxel_rule_direction.h b/generated/do_editor_ui_for_enum_voxel_rule_direction.h new file mode 100644 index 000000000..5dfb96437 --- /dev/null +++ b/generated/do_editor_ui_for_enum_voxel_rule_direction.h @@ -0,0 +1,83 @@ +// src/engine/editor.h:599:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + { + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("PosX"), UiId(Window, "enum VoxelRuleDir_PosX", Element), Params)) + { + *Element = VoxelRuleDir_PosX; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("NegX"), UiId(Window, "enum VoxelRuleDir_NegX", Element), Params)) + { + *Element = VoxelRuleDir_NegX; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("PosY"), UiId(Window, "enum VoxelRuleDir_PosY", Element), Params)) + { + *Element = VoxelRuleDir_PosY; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("NegY"), UiId(Window, "enum VoxelRuleDir_NegY", Element), Params)) + { + *Element = VoxelRuleDir_NegY; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("PosZ"), UiId(Window, "enum VoxelRuleDir_PosZ", Element), Params)) + { + *Element = VoxelRuleDir_PosZ; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("NegZ"), UiId(Window, "enum VoxelRuleDir_NegZ", Element), Params)) + { + *Element = VoxelRuleDir_NegZ; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Count"), UiId(Window, "enum VoxelRuleDir_Count", Element), Params)) + { + *Element = VoxelRuleDir_Count; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + } + else + { + PushNewRow(Ui); + } +} + + diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 306e40696..cd5266513 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:799:0 +// src/engine/editor.h:804:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 7f3981d9a..a7caf995f 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1000:0 +// src/engine/editor.h:1005:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 77774cd7a..3105a5779 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:805:0 +// src/engine/editor.h:810:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 67c133860..f03848aa0 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:788:0 +// src/engine/editor.h:793:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 26350e44a..e704d24b4 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:817:0 +// src/engine/editor.h:822:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index cd827f906..b2152668d 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:810:0 +// src/engine/editor.h:815:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index ecb4172aa..847fc0e53 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:814:0 +// src/engine/editor.h:819:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index b1dbf93ad..cc66fa651 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:464:0 +// src/engine/editor.h:466:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index 227a4fa58..943049e88 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:576:0 +// src/engine/editor.h:578:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 4754d1fdd..fee41ae8f 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1144:0 +// src/engine/editor.h:1149:0 struct world_edit_brush_linked_list_node { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index c5a0ab8f7..6e4437f33 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:627:0 +// src/engine/editor.h:632:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, level_editor_flags Selection) diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 73d4a63c2..d13c1a858 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:639:0 +// src/engine/editor.h:644:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 7af55a173..88966f3f2 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:592:0 +// src/engine/editor.h:594:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 0a34404b0..4a55d0ec3 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:998:0 +// src/engine/editor.h:1003:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index 2047cc6d4..e3f0977de 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:587:0 +// src/engine/editor.h:589:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index f5711109b..c825c9194 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:940:0 +// src/engine/editor.h:945:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 7f9b38e27..dd08863b0 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:637:0 +// src/engine/editor.h:642:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_voxel_rule_direction.h b/generated/string_and_value_tables_voxel_rule_direction.h new file mode 100644 index 000000000..004e582ac --- /dev/null +++ b/generated/string_and_value_tables_voxel_rule_direction.h @@ -0,0 +1,59 @@ +// src/engine/editor.h:20:0 + +link_internal counted_string +ToStringPrefixless(voxel_rule_direction Type) +{ + counted_string Result = {}; + switch (Type) + { + case VoxelRuleDir_PosX: { Result = CSz("PosX"); } break; + case VoxelRuleDir_NegX: { Result = CSz("NegX"); } break; + case VoxelRuleDir_PosY: { Result = CSz("PosY"); } break; + case VoxelRuleDir_NegY: { Result = CSz("NegY"); } break; + case VoxelRuleDir_PosZ: { Result = CSz("PosZ"); } break; + case VoxelRuleDir_NegZ: { Result = CSz("NegZ"); } break; + case VoxelRuleDir_Count: { Result = CSz("Count"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(voxel_rule_direction Type) +{ + counted_string Result = {}; + switch (Type) + { + case VoxelRuleDir_PosX: { Result = CSz("VoxelRuleDir_PosX"); } break; + case VoxelRuleDir_NegX: { Result = CSz("VoxelRuleDir_NegX"); } break; + case VoxelRuleDir_PosY: { Result = CSz("VoxelRuleDir_PosY"); } break; + case VoxelRuleDir_NegY: { Result = CSz("VoxelRuleDir_NegY"); } break; + case VoxelRuleDir_PosZ: { Result = CSz("VoxelRuleDir_PosZ"); } break; + case VoxelRuleDir_NegZ: { Result = CSz("VoxelRuleDir_NegZ"); } break; + case VoxelRuleDir_Count: { Result = CSz("VoxelRuleDir_Count"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal voxel_rule_direction +VoxelRuleDirection(counted_string S) +{ + voxel_rule_direction Result = {}; + + if (StringsMatch(S, CSz("VoxelRuleDir_PosX"))) { return VoxelRuleDir_PosX; } + if (StringsMatch(S, CSz("VoxelRuleDir_NegX"))) { return VoxelRuleDir_NegX; } + if (StringsMatch(S, CSz("VoxelRuleDir_PosY"))) { return VoxelRuleDir_PosY; } + if (StringsMatch(S, CSz("VoxelRuleDir_NegY"))) { return VoxelRuleDir_NegY; } + if (StringsMatch(S, CSz("VoxelRuleDir_PosZ"))) { return VoxelRuleDir_PosZ; } + if (StringsMatch(S, CSz("VoxelRuleDir_NegZ"))) { return VoxelRuleDir_NegZ; } + if (StringsMatch(S, CSz("VoxelRuleDir_Count"))) { return VoxelRuleDir_Count; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index f62e9c0dd..50480f2cf 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:802:0 +// src/engine/editor.h:807:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index bb03dc8f2..4691e612d 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:785:0 +// src/engine/editor.h:790:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index e4f059c69..3bb717585 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:808:0 +// src/engine/editor.h:813:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index bfb98a7e6..c8ee2cd56 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:671:0 +// src/engine/editor.h:676:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 351fe22d0..ab77db28b 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:794:0 +// src/engine/editor.h:799:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 9bb639c70..968ecf9a1 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -146,41 +146,49 @@ void main() // ShapeType_Cylinder case 3: { + + v3 AxisMask; + v3 InvAxisMask; + v3 EditDim = ChunkRelEditMax-ChunkRelEditMin; switch (Axis) { case 0: // VoxelRuleDir_PosX case 1: // VoxelRuleDir_NegX { - v3 AxisMask = V3(1,0,0); - v3 InvAxisMask = V3(0.f,1.f,1.f)*0.5f; - v3 EditDim = ChunkRelEditMax-ChunkRelEditMin; - - v3 MajorAxis = EditDim*AxisMask; - v3 MinorAxies = EditDim*InvAxisMask; - - v3 ChunkRelP0 = MinorAxies; - v3 ChunkRelP1 = MinorAxies + MajorAxis; - - v3 Line = ChunkRelP1 - ChunkRelP0; - v3 LineRelativeXYZ = EditRelPosition - ChunkRelP0; - - v3 X = cross(Line, LineRelativeXYZ); - f32 Dist = length(X)/length(Line); - if (Dist < Radius) { NoiseSample = Power; } - + AxisMask = V3(1,0,0); + InvAxisMask = V3(0.f,1.f,1.f)*0.5f; } break; case 2: // VoxelRuleDir_PosY case 3: // VoxelRuleDir_NegY { + AxisMask = V3(0,1,0); + InvAxisMask = V3(1.f,0.f,1.f)*0.5f; } break; case 4: // VoxelRuleDir_PosZ case 5: // VoxelRuleDir_NegZ { + AxisMask = V3(0,0,1); + InvAxisMask = V3(1.f,1.f,0.f)*0.5f; } break; + } + v3 MajorAxis = EditDim*AxisMask; + v3 MinorAxies = EditDim*InvAxisMask; + + v3 ChunkRelP0 = MinorAxies; + v3 ChunkRelP1 = MinorAxies + MajorAxis; + + v3 Line = ChunkRelP1 - ChunkRelP0; + v3 LineRelativeXYZ = EditRelPosition - ChunkRelP0; + + v3 X = cross(Line, LineRelativeXYZ); + f32 Dist = length(X)/length(Line); + if (Dist < Radius) { NoiseSample = Power; } + + } break; // @sdf_shape_step(7): Add more cases and implementations here diff --git a/src/engine/editor.h b/src/engine/editor.h index 1c1c52eba..0e5cb84da 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -17,6 +17,9 @@ enum voxel_rule_direction }; CAssert(VoxelRuleDir_Count == 6); +poof(string_and_value_tables(voxel_rule_direction)) +#include + struct world; #define EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS r32 MinValue = 0.f, r32 MaxValue = 1.f @@ -594,6 +597,9 @@ poof(string_and_value_tables(data_type)) poof(do_editor_ui_for_enum(data_type)) #include +poof(do_editor_ui_for_enum(voxel_rule_direction)) +#include + poof(do_editor_ui_for_compound_type(rect3)) #include From b69befd9eef381b91f2dbcc322cdc8a00f856595 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 19 May 2025 06:56:11 -0700 Subject: [PATCH 247/421] Improve layers panel -- pretty solid at this point --- external/bonsai_stdlib | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- generated/block_array_bitmap_688853862.h | 47 ++++-- .../block_array_c_asset_thumbnail_688856411.h | 47 ++++-- ...ntity_ptr_688856411_struct_struct_struct.h | 47 ++++-- generated/block_array_c_gpu_timer_688735882.h | 47 ++++-- .../block_array_c_shader_ptr_688853971.h | 47 ++++-- generated/block_array_c_texture_688856411.h | 47 ++++-- generated/block_array_c_u32_688856411.h | 47 ++++-- generated/block_array_c_u8_cursor_688856411.h | 47 ++++-- ...k_queue_entry_build_chunk_mesh_688853862.h | 47 ++++-- generated/block_array_entity_688856407.h | 47 ++++-- ...lock_array_file_traversal_node_688853862.h | 47 ++++-- ...lock_array_gpu_readback_buffer_688853862.h | 47 ++++-- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/block_array_member_info_688856411.h | 47 ++++-- generated/block_array_model_688856411.h | 47 ++++-- .../block_array_octree_node_ptr_688853862.h | 47 ++++-- ...block_array_picked_octree_node_688853862.h | 47 ++++-- .../block_array_standing_spot_688853862.h | 47 ++++-- generated/block_array_texture_ptr_688856411.h | 47 ++++-- generated/block_array_vox_data_688856411.h | 47 ++++-- ...lock_array_voxel_stack_element_688853862.h | 47 ++++-- .../block_array_world_chunk_ptr_688853862.h | 47 ++++-- generated/block_array_world_edit_688735882.h | 49 ++++-- .../block_array_world_edit_layer_688735882.h | 49 ++++-- .../block_array_world_edit_ptr_688735882.h | 49 ++++-- generated/buffer_sort_key.h | 87 ++++++++++ generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 2 +- .../do_editor_ui_for_compound_type_ray.h | 2 +- .../do_editor_ui_for_compound_type_rect3.h | 2 +- .../do_editor_ui_for_compound_type_rect3cp.h | 2 +- .../do_editor_ui_for_compound_type_rect3i.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ..._editor_ui_for_enum_voxel_rule_direction.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 2 + generated/for_datatypes_fkubhsYl.h | 2 + generated/for_datatypes_kv3WBTai.h | 2 + generated/hashtable_world_edit_brush.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- shaders/terrain/world_edit.fragmentshader | 2 +- src/engine/editor.cpp | 156 +++++++++++++----- src/engine/editor.h | 8 +- src/engine/render_loop.cpp | 10 +- 69 files changed, 1105 insertions(+), 372 deletions(-) create mode 100644 generated/buffer_sort_key.h diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 793fc3dc4..6759444b8 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 793fc3dc44e546f6b47921daf726277ffcb9a567 +Subproject commit 6759444b8890d80926f6e52af71e61ca2a916544 diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index afe2bce8d..ef371975d 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:776:0 +// src/engine/editor.h:777:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index f5ae57448..2abbe8722 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1036:0 +// src/engine/editor.h:1037:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 289343703..59889e529 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1146:0 +// src/engine/editor.h:1147:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index bbc7313b0..b2fbf6a00 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -240,18 +240,6 @@ Set( bitmap_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( bitmap_block_array *Array, bitmap_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( bitmap_block_array *Array, bitmap *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( bitmap_block_array *Array, bitmap_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( bitmap_block_array *Array, bitmap_block_array_index Index) } } +link_internal void +RemoveOrdered( bitmap_block_array *Array, bitmap_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( bitmap_block_array *Array, bitmap *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal bitmap_block_array_index Find( bitmap_block_array *Array, bitmap *Query) { diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index cfb01c4cf..3810a43e9 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -35,18 +35,6 @@ Set( asset_thumbnail_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( asset_thumbnail_block_array *Array, asset_thumbnail *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index) { @@ -91,6 +79,41 @@ RemoveUnordered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array } } +link_internal void +RemoveOrdered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( asset_thumbnail_block_array *Array, asset_thumbnail *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal asset_thumbnail_block_array_index Find( asset_thumbnail_block_array *Array, asset_thumbnail *Query) { diff --git a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h index 7abb20f5b..3c4108a31 100644 --- a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h +++ b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h @@ -35,18 +35,6 @@ Set( entity_ptr_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( entity_ptr_block_array *Array, entity_ptr_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( entity_ptr_block_array *Array, entity_ptr *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( entity_ptr_block_array *Array, entity_ptr_block_array_index Index) { @@ -91,6 +79,41 @@ RemoveUnordered( entity_ptr_block_array *Array, entity_ptr_block_array_index Ind } } +link_internal void +RemoveOrdered( entity_ptr_block_array *Array, entity_ptr_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( entity_ptr_block_array *Array, entity_ptr Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal entity_ptr_block_array_index Find( entity_ptr_block_array *Array, entity_ptr Query) { diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index ef8154989..28353a348 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -35,18 +35,6 @@ Set( gpu_timer_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( gpu_timer_block_array *Array, gpu_timer *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index) { @@ -91,6 +79,41 @@ RemoveUnordered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index } } +link_internal void +RemoveOrdered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( gpu_timer_block_array *Array, gpu_timer *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal gpu_timer_block_array_index Find( gpu_timer_block_array *Array, gpu_timer *Query) { diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index c99bad876..92af153b5 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -35,18 +35,6 @@ Set( shader_ptr_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( shader_ptr_block_array *Array, shader_ptr_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( shader_ptr_block_array *Array, shader_ptr *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( shader_ptr_block_array *Array, shader_ptr_block_array_index Index) { @@ -91,6 +79,41 @@ RemoveUnordered( shader_ptr_block_array *Array, shader_ptr_block_array_index Ind } } +link_internal void +RemoveOrdered( shader_ptr_block_array *Array, shader_ptr_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( shader_ptr_block_array *Array, shader_ptr Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal shader_ptr_block_array_index Find( shader_ptr_block_array *Array, shader_ptr Query) { diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index 1e2b99571..37c428788 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -35,18 +35,6 @@ Set( texture_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( texture_block_array *Array, texture_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( texture_block_array *Array, texture *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( texture_block_array *Array, texture_block_array_index Index) { @@ -91,6 +79,41 @@ RemoveUnordered( texture_block_array *Array, texture_block_array_index Index) } } +link_internal void +RemoveOrdered( texture_block_array *Array, texture_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( texture_block_array *Array, texture *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal texture_block_array_index Find( texture_block_array *Array, texture *Query) { diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index dd8a5c7c3..53bddfe76 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -35,18 +35,6 @@ Set( u32_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( u32_block_array *Array, u32_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( u32_block_array *Array, u32 *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( u32_block_array *Array, u32_block_array_index Index) { @@ -91,6 +79,41 @@ RemoveUnordered( u32_block_array *Array, u32_block_array_index Index) } } +link_internal void +RemoveOrdered( u32_block_array *Array, u32_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( u32_block_array *Array, u32 *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal u32_block_array_index Find( u32_block_array *Array, u32 *Query) { diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index bb0566ac2..26cd6d007 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -35,18 +35,6 @@ Set( u8_cursor_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( u8_cursor_block_array *Array, u8_cursor *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index) { @@ -91,6 +79,41 @@ RemoveUnordered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index } } +link_internal void +RemoveOrdered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( u8_cursor_block_array *Array, u8_cursor *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal u8_cursor_block_array_index Find( u8_cursor_block_array *Array, u8_cursor *Query) { diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 1b158b107..afd32e856 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -240,18 +240,6 @@ Set( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dum } } +link_internal void +RemoveOrdered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index Find( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Query) { diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index 2be7f5a03..cf5fba96d 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -240,18 +240,6 @@ Set( entity_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( entity_block_array *Array, entity_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( entity_block_array *Array, entity *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( entity_block_array *Array, entity_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( entity_block_array *Array, entity_block_array_index Index) } } +link_internal void +RemoveOrdered( entity_block_array *Array, entity_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( entity_block_array *Array, entity *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal entity_block_array_index Find( entity_block_array *Array, entity *Query) { diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index d1f0f04e8..e366a6543 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -240,18 +240,6 @@ Set( file_traversal_node_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( file_traversal_node_block_array *Array, file_traversal_node *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( file_traversal_node_block_array *Array, file_traversal_node_blo } } +link_internal void +RemoveOrdered( file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( file_traversal_node_block_array *Array, file_traversal_node *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal file_traversal_node_block_array_index Find( file_traversal_node_block_array *Array, file_traversal_node *Query) { diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index cdcdc4284..59c2dec45 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -240,18 +240,6 @@ Set( gpu_readback_buffer_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_blo } } +link_internal void +RemoveOrdered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal gpu_readback_buffer_block_array_index Find( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Query) { diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index dcb200e75..ee6828292 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:611:0 +// src/engine/editor.h:612:0 diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index e9c372560..4403fcaa9 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -240,18 +240,6 @@ Set( member_info_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( member_info_block_array *Array, member_info_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( member_info_block_array *Array, member_info *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( member_info_block_array *Array, member_info_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( member_info_block_array *Array, member_info_block_array_index I } } +link_internal void +RemoveOrdered( member_info_block_array *Array, member_info_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( member_info_block_array *Array, member_info *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal member_info_block_array_index Find( member_info_block_array *Array, member_info *Query) { diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 1fea0cc0c..bd0ecd04f 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -240,18 +240,6 @@ Set( model_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( model_block_array *Array, model_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( model_block_array *Array, model *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( model_block_array *Array, model_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( model_block_array *Array, model_block_array_index Index) } } +link_internal void +RemoveOrdered( model_block_array *Array, model_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( model_block_array *Array, model *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal model_block_array_index Find( model_block_array *Array, model *Query) { diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 75e91e24a..b4fe86dac 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -240,18 +240,6 @@ Set( octree_node_ptr_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( octree_node_ptr_block_array *Array, octree_node_ptr *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array } } +link_internal void +RemoveOrdered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( octree_node_ptr_block_array *Array, octree_node_ptr Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal octree_node_ptr_block_array_index Find( octree_node_ptr_block_array *Array, octree_node_ptr Query) { diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index f0b4e8e31..68876f6b9 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -240,18 +240,6 @@ Set( picked_octree_node_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( picked_octree_node_block_array *Array, picked_octree_node *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( picked_octree_node_block_array *Array, picked_octree_node_block } } +link_internal void +RemoveOrdered( picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( picked_octree_node_block_array *Array, picked_octree_node *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal picked_octree_node_block_array_index Find( picked_octree_node_block_array *Array, picked_octree_node *Query) { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index d422d5185..9965b9c33 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -240,18 +240,6 @@ Set( standing_spot_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( standing_spot_block_array *Array, standing_spot_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( standing_spot_block_array *Array, standing_spot *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( standing_spot_block_array *Array, standing_spot_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( standing_spot_block_array *Array, standing_spot_block_array_ind } } +link_internal void +RemoveOrdered( standing_spot_block_array *Array, standing_spot_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( standing_spot_block_array *Array, standing_spot *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal standing_spot_block_array_index Find( standing_spot_block_array *Array, standing_spot *Query) { diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index 79ddd6d27..f489319de 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -35,18 +35,6 @@ Set( texture_ptr_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( texture_ptr_block_array *Array, texture_ptr_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( texture_ptr_block_array *Array, texture_ptr *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( texture_ptr_block_array *Array, texture_ptr_block_array_index Index) { @@ -91,6 +79,41 @@ RemoveUnordered( texture_ptr_block_array *Array, texture_ptr_block_array_index I } } +link_internal void +RemoveOrdered( texture_ptr_block_array *Array, texture_ptr_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( texture_ptr_block_array *Array, texture_ptr Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal texture_ptr_block_array_index Find( texture_ptr_block_array *Array, texture_ptr Query) { diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index 1151c283a..e7020c9eb 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -240,18 +240,6 @@ Set( vox_data_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( vox_data_block_array *Array, vox_data_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( vox_data_block_array *Array, vox_data *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( vox_data_block_array *Array, vox_data_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( vox_data_block_array *Array, vox_data_block_array_index Index) } } +link_internal void +RemoveOrdered( vox_data_block_array *Array, vox_data_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( vox_data_block_array *Array, vox_data *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal vox_data_block_array_index Find( vox_data_block_array *Array, vox_data *Query) { diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index 823209690..b45acb1a8 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -240,18 +240,6 @@ Set( voxel_stack_element_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( voxel_stack_element_block_array *Array, voxel_stack_element *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( voxel_stack_element_block_array *Array, voxel_stack_element_blo } } +link_internal void +RemoveOrdered( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( voxel_stack_element_block_array *Array, voxel_stack_element *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal voxel_stack_element_block_array_index Find( voxel_stack_element_block_array *Array, voxel_stack_element *Query) { diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index 0b3849a4c..c1586a279 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -35,18 +35,6 @@ Set( world_chunk_ptr_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( world_chunk_ptr_block_array *Array, world_chunk_ptr *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index) { @@ -91,6 +79,41 @@ RemoveUnordered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array } } +link_internal void +RemoveOrdered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( world_chunk_ptr_block_array *Array, world_chunk_ptr Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal world_chunk_ptr_block_array_index Find( world_chunk_ptr_block_array *Array, world_chunk_ptr Query) { diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index c572ee0a5..b343325c3 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1161:0 +// src/engine/editor.h:1162:0 @@ -240,18 +240,6 @@ Set( world_edit_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( world_edit_block_array *Array, world_edit_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( world_edit_block_array *Array, world_edit *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( world_edit_block_array *Array, world_edit_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( world_edit_block_array *Array, world_edit_block_array_index Ind } } +link_internal void +RemoveOrdered( world_edit_block_array *Array, world_edit_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( world_edit_block_array *Array, world_edit *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal world_edit_block_array_index Find( world_edit_block_array *Array, world_edit *Query) { diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 0fe9553a6..edef4b949 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1172:0 +// src/engine/editor.h:1173:0 @@ -240,18 +240,6 @@ Set( world_edit_layer_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( world_edit_layer_block_array *Array, world_edit_layer_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( world_edit_layer_block_array *Array, world_edit_layer *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( world_edit_layer_block_array *Array, world_edit_layer_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( world_edit_layer_block_array *Array, world_edit_layer_block_arr } } +link_internal void +RemoveOrdered( world_edit_layer_block_array *Array, world_edit_layer_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( world_edit_layer_block_array *Array, world_edit_layer *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal world_edit_layer_block_array_index Find( world_edit_layer_block_array *Array, world_edit_layer *Query) { diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 27b8ee10a..b6abd9340 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1164:0 +// src/engine/editor.h:1165:0 @@ -240,18 +240,6 @@ Set( world_edit_ptr_block_array *Arr, return Result; } -link_internal void -RemoveOrdered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index Index) -{ - NotImplemented; -} - -link_internal void -RemoveOrdered( world_edit_ptr_block_array *Array, world_edit_ptr *Element ) -{ - NotImplemented; -} - link_internal void RemoveUnordered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index Index) { @@ -296,6 +284,41 @@ RemoveUnordered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_i } } +link_internal void +RemoveOrdered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index Index) +{ + auto End = AtElements(Array); + auto AtI = Index; + auto NextI = Index; + ++NextI; + + while (NextI < End) + { + auto At = GetPtr(Array, AtI); + auto NextV = *GetPtr(Array, NextI); + + *At = NextV; + + ++AtI; + ++NextI; + } + + RemoveUnordered(Array, NextI); +} + +link_internal void +RemoveOrdered( world_edit_ptr_block_array *Array, world_edit_ptr Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + link_internal world_edit_ptr_block_array_index Find( world_edit_ptr_block_array *Array, world_edit_ptr Query) { diff --git a/generated/buffer_sort_key.h b/generated/buffer_sort_key.h new file mode 100644 index 000000000..2b681cdc5 --- /dev/null +++ b/generated/buffer_sort_key.h @@ -0,0 +1,87 @@ +// external/bonsai_stdlib/src/sort.cpp:1:0 + +struct sort_key_buffer +{ + umm Count; + sort_key *Start; poof(@array_length(Element->Count)) +}; + +link_internal sort_key_buffer +SortKeyBuffer( umm ElementCount, memory_arena* Memory); + +link_internal sort_key_buffer +SortKeyBuffer( sort_key *Start, umm ElementCount) +{ + sort_key_buffer Result = {ElementCount, Start}; + return Result; +} + +link_inline umm +LastIndex(sort_key_buffer *Buf) +{ + umm Result = Buf->Count > 0? Buf->Count-1 : 0; + return Result; +} + +link_inline umm +ZerothIndex(sort_key_buffer *Buf) +{ + umm Result = 0; + return Result; +} + +link_inline umm +AtElements(sort_key_buffer *Buf) +{ + umm Result = Buf->Count; + return Result; +} + +link_inline umm +TotalElements(sort_key_buffer *Buf) +{ + umm Result = Buf->Count; + return Result; +} + +link_inline umm +CurrentCount(sort_key_buffer *Buf) +{ + umm Result = Buf->Count; + return Result; +} + +link_inline sort_key * +GetPtr(sort_key_buffer *Buf, umm Index) +{ + sort_key *Result = 0; + if (Index < Buf->Count) { Result = Buf->Start + Index; } + return Result; +} + +link_inline sort_key * +Get(sort_key_buffer *Buf, umm Index) +{ + sort_key *Result = GetPtr(Buf, Index); + return Result; +} + +link_internal sort_key_buffer +SortKeyBuffer( umm ElementCount, memory_arena* Memory) +{ + sort_key_buffer Result = {}; + + if (ElementCount) + { + Result.Start = Allocate( sort_key, Memory, ElementCount ); + Result.Count = ElementCount; + } + else + { + Warn("Attempted to allocate sort_key_buffer of 0 length."); + } + + return Result; +} + + diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 8815cb511..78014e904 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:989:0 +// src/engine/editor.h:990:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index b3e3ae295..07b9cc2fc 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:617:0 +// src/engine/editor.h:618:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index cb24532f5..6850de30e 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:614:0 +// src/engine/editor.h:615:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index a1cede379..c5bb3cc1b 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:602:0 +// src/engine/editor.h:603:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index a64a53d04..72f95be5f 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:608:0 +// src/engine/editor.h:609:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 108d4cfa5..14f3af594 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:605:0 +// src/engine/editor.h:606:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index af1ede3d8..4da439597 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:596:0 +// src/engine/editor.h:597:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 34b0fbeea..47a433b87 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:591:0 +// src/engine/editor.h:592:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 3ced45760..6392622bb 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:646:0 +// src/engine/editor.h:647:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_voxel_rule_direction.h b/generated/do_editor_ui_for_enum_voxel_rule_direction.h index 5dfb96437..c73248acc 100644 --- a/generated/do_editor_ui_for_enum_voxel_rule_direction.h +++ b/generated/do_editor_ui_for_enum_voxel_rule_direction.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:599:0 +// src/engine/editor.h:600:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index cd5266513..0e40bdbb2 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:804:0 +// src/engine/editor.h:805:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index a7caf995f..4b9fb5141 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1005:0 +// src/engine/editor.h:1006:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 3105a5779..37081a6cc 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:810:0 +// src/engine/editor.h:811:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index f03848aa0..f82e10d9a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:793:0 +// src/engine/editor.h:794:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index e704d24b4..4dd14a046 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:822:0 +// src/engine/editor.h:823:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index b2152668d..c906ce170 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:815:0 +// src/engine/editor.h:816:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 847fc0e53..bb7f43357 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:819:0 +// src/engine/editor.h:820:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index cc66fa651..5e946fb4d 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:466:0 +// src/engine/editor.h:467:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index 943049e88..e67d3d552 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:578:0 +// src/engine/editor.h:579:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index b278fa914..33d104765 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -742,6 +742,8 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 38eeda829..f7010f20a 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -732,6 +732,8 @@ render_to_texture_async_params render_to_texture_async_params; + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index fa785d11c..99c0304a3 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -732,6 +732,8 @@ type_render_to_texture_async_params, + + diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index fee41ae8f..bfff14360 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1149:0 +// src/engine/editor.h:1150:0 struct world_edit_brush_linked_list_node { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 6e4437f33..41a873808 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:632:0 +// src/engine/editor.h:633:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, level_editor_flags Selection) diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index d13c1a858..09200fd83 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:644:0 +// src/engine/editor.h:645:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 88966f3f2..6e1a2ee1f 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:594:0 +// src/engine/editor.h:595:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 4a55d0ec3..b8d1e3471 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1003:0 +// src/engine/editor.h:1004:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index e3f0977de..fa07bba58 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:589:0 +// src/engine/editor.h:590:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index c825c9194..f637bb929 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:945:0 +// src/engine/editor.h:946:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index dd08863b0..7b1e223a6 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:642:0 +// src/engine/editor.h:643:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 50480f2cf..e4539a95c 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:807:0 +// src/engine/editor.h:808:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 4691e612d..d1b79c72a 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:790:0 +// src/engine/editor.h:791:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 3bb717585..cb60ac53e 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:813:0 +// src/engine/editor.h:814:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index c8ee2cd56..0487cdb41 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:676:0 +// src/engine/editor.h:677:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index ab77db28b..7cd99fd93 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:799:0 +// src/engine/editor.h:800:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 968ecf9a1..742e47498 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -146,10 +146,10 @@ void main() // ShapeType_Cylinder case 3: { - v3 AxisMask; v3 InvAxisMask; v3 EditDim = ChunkRelEditMax-ChunkRelEditMin; + switch (Axis) { case 0: // VoxelRuleDir_PosX diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 1bf7646dc..dcf9e8029 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1520,6 +1520,14 @@ NewBrush(world_edit_brush *Brush) CheckSettingsChanged(&Brush->Layered); } +link_internal world_edit_brush +NewBrush() +{ + world_edit_brush Brush = {}; + NewBrush(&Brush); + return Brush; +} + link_internal cs GetLayerUiText(brush_layer *Layer, memory_arena *TempMem) { @@ -1551,8 +1559,8 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ b32 IsNewBrush = False; #if 1 { - cs BrushNameBuf = CS(Brush->NameBuf, NameBuf_Len); - if (Brush->NameBuf[0] == 0 && Brush->Layered.LayerCount == 0) + b32 BrushUninitialized = Brush->NameBuf[0] == 0 && Brush->Layered.LayerCount == 0; + if (BrushUninitialized) { NewBrush(Brush); IsNewBrush = True; @@ -1625,8 +1633,8 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ { if (Button(Ui, CSz("New"), UiId(BrushSettingsWindow, "brush new", 0u))) { - NewBrush(Brush); - IsNewBrush = True; + world_edit_brush ThisBrush = NewBrush(); + Editor->CurrentBrush = Insert(ThisBrush, &Editor->LoadedBrushes, Editor->Memory); } if (LayeredBrush->LayerCount) @@ -2404,7 +2412,11 @@ link_internal void ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *TempMemory) { UNPACK_ENGINE_RESOURCES(Engine); + + Info("Updating Edit(%p)", Edit); + // Gather newly overlapping nodes and add the edit + { octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); @@ -2448,36 +2460,72 @@ ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Temp } link_internal void -UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memory_arena *TempMemory) +DropEditFromOctree(engine_resources *Engine, world_edit *Edit, memory_arena *TempMemory) { UNPACK_ENGINE_RESOURCES(Engine); - // First, gather the currently edited nodes and remove the edit + octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); + GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Edit->Region, &Nodes); + + IterateOver(&Nodes, Node, NodeIndex) { - octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); - GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Edit->Region, &Nodes); + AcquireFutex(&Node->Lock); + auto Index = Find(&Node->Edits, Edit); + Assert(IsValid(&Index)); // There shouldn't be a node that doesn't contain the edit + RemoveUnordered(&Node->Edits, Index); - IterateOver(&Nodes, Node, NodeIndex) - { - AcquireFutex(&Node->Lock); - auto Index = Find(&Node->Edits, Edit); - Assert(IsValid(&Index)); // There shouldn't be a node that doesn't contain the edit - RemoveUnordered(&Node->Edits, Index); + // Need to reinitialize chunks that no longer have the edit so that it + // doesn't stay intact in chunks that lose it entirely + Node->Dirty = True;; + ReleaseFutex(&Node->Lock); + } +} - // Need to reinitialize chunks that no longer have the edit so that it - // doesn't stay intact in chunks that lose it entirely - Node->Dirty = True;; - ReleaseFutex(&Node->Lock); +link_internal void +UpdateWorldEditBounds(engine_resources *Engine, world_edit *Edit, rect3cp Region, memory_arena *TempMemory) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + DropEditFromOctree(Engine, Edit, TempMemory); + + Edit->Region = Region; + + ApplyEditToOctree(Engine, Edit, TempMemory); +} + + +link_internal void +IncrementAllEditOrdinalsAbove(world_edit_layer_block_array *Layers, u32 Ordinal) +{ + IterateOver(Layers, Layer, LayerIndex) + { + IterateOver(&Layer->Edits, Edit, EditIndex) + { + if (Edit->Ordinal >= Ordinal) + { + ++Edit->Ordinal; + } } } +} - // - // Update the edit - // - Editor->CurrentEdit->Region = Region; // TODO(Jesse): I feel like this should be happening more automagically, but .. +// NOTE(Jesse): @duplicated_edit_ordinal_sort_code +link_internal sort_key_buffer +GetEditsSortedByOrdianl(world_edit_block_array *Edits, memory_arena *TempMem) +{ + umm EditCount = TotalElements(Edits); + sort_key *Keys = Allocate(sort_key, TempMem, EditCount); - ApplyEditToOctree(Engine, Edit, TempMemory); + IterateOver(Edits, Edit, EditIndex) + { + u32 KeyIndex = u32(GetIndex(&EditIndex)); + Keys[KeyIndex] = {u64(Edit), u64(Edit->Ordinal)}; + } + + BubbleSort_descending(Keys, u32(EditCount)); + + return {EditCount, Keys}; } link_internal void @@ -2911,8 +2959,7 @@ DoWorldEditor(engine_resources *Engine) if (Button(Ui, CSz("New"), UiId(&BrushSettingsWindow, "brush new", 0u))) { - world_edit_brush Brush = {}; - NewBrush(&Brush); + world_edit_brush Brush = NewBrush(); Editor->CurrentBrush = Insert(Brush, &Editor->LoadedBrushes, Editor->Memory); } PushNewRow(Ui); @@ -2951,7 +2998,7 @@ DoWorldEditor(engine_resources *Engine) { if (Editor->Selection.Changed && Editor->CurrentEdit) { - UpdateWorldEdit(Engine, Editor->CurrentEdit, Editor->Selection.Region, GetTranArena()); + UpdateWorldEditBounds(Engine, Editor->CurrentEdit, Editor->Selection.Region, GetTranArena()); } b32 SettingsChanged = CheckSettingsChanged(&Editor->CurrentBrush->Layered); @@ -2963,7 +3010,7 @@ DoWorldEditor(engine_resources *Engine) { if (Edit->Brush == Editor->CurrentBrush) { - UpdateWorldEdit(Engine, Edit, Editor->Selection.Region, GetTranArena()); + UpdateWorldEditBounds(Engine, Edit, Editor->Selection.Region, GetTranArena()); } } } @@ -2974,7 +3021,7 @@ DoWorldEditor(engine_resources *Engine) } { - local_persist window_layout AllEditsWindow = WindowLayout("All Edits", WindowLayoutFlag_Align_Bottom); + local_persist window_layout AllEditsWindow = WindowLayout("Layers", WindowLayoutFlag_Align_Bottom); PushWindowStart(Ui, &AllEditsWindow); @@ -3025,21 +3072,22 @@ DoWorldEditor(engine_resources *Engine) /* if (ToggleButton(Ui, Name, Name, UiId(&AllEditsWindow, Layer, Layer), &DefaultSelectedStyle)) */ { PushNewRow(Ui); - IterateOver(&Layer->Edits, Edit, BrushIndex) + + sort_key_buffer Keys = GetEditsSortedByOrdianl(&Layer->Edits, GetTranArena()); + + IterateOver(&Keys, Key, KeyIndex) { - umm I = GetIndex(&BrushIndex); + world_edit *Edit = Cast(world_edit*, Key->Index); + const char *NameBuf = Edit->Brush ? Edit->Brush->NameBuf : "no brush"; + ui_render_params Params = DefaultUiRenderParams_Button; if (Edit == Editor->CurrentEdit) { - PushColumn(Ui, CSz("*"), &DefaultSelectedStyle); - } - else - { - PushColumn(Ui, CSz(" "), &DefaultSelectedStyle); + Params.FStyle = &DefaultSelectedStyle; } - auto EditSelectButton = PushSimpleButton(Ui, FSz("(%d) (%s)", I, NameBuf), UiId(&AllEditsWindow, "edit select", Edit)); + auto EditSelectButton = PushSimpleButton(Ui, FSz("(%d)(%d) (%s)", KeyIndex, Key->Value, NameBuf), UiId(&AllEditsWindow, "edit select", Edit), &Params); if (Clicked(Ui, &EditSelectButton)) { Editor->Selection.Clicks = 2; @@ -3060,12 +3108,44 @@ DoWorldEditor(engine_resources *Engine) Editor->HotEdit = Edit; } - if (Button(Ui, FSz("SetBrush", I, NameBuf), UiId(&AllEditsWindow, "edit brush select", Edit))) + ui_id SetBrushEditId = UiId(&AllEditsWindow, "edit set_brush", Edit); + ui_id DupEditId = UiId(&AllEditsWindow, "edit duplicate", Edit); + ui_id DelEditId = UiId(&AllEditsWindow, "edit delete", Edit); + + if (Hover(Ui, &SetBrushEditId)) { PushTooltip(Ui, CSz("Set Brush")); } + if (Hover(Ui, &DupEditId)) { PushTooltip(Ui, CSz("Duplicatate")); } + if (Hover(Ui, &DelEditId)) { PushTooltip(Ui, CSz("Delete")); } + + if (Button(Ui, CSz("S"), SetBrushEditId)) { Edit->Brush = Editor->CurrentBrush; - UpdateWorldEdit(Engine, Edit, Edit->Region, GetTranArena()); + UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); + } + + if (Button(Ui, CSz("D"), DupEditId)) + { + IncrementAllEditOrdinalsAbove(&Editor->Layers, Edit->Ordinal+1); + + auto *Duplicated = Push(&Layer->Edits, Edit); + ++Duplicated->Ordinal; + + ApplyEditToOctree(Engine, Duplicated, GetTranArena()); + Editor->CurrentEdit = Duplicated; } + if (Button(Ui, CSz("X"), DelEditId)) + { + /* DropEditFromOctree(Engine, Edit, GetTranArena()); */ + if (Editor->CurrentEdit == Edit) + { + Editor->CurrentEdit = 0; + } + + RemoveOrdered(&Layer->Edits, Edit); + } + + + PushNewRow(Ui); /* DoEditorUi(Ui, &AllEditsWindow, Edit, {}); */ diff --git a/src/engine/editor.h b/src/engine/editor.h index 0e5cb84da..10da48038 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1205,10 +1205,9 @@ struct level_editor u32 NextEditOrdinal; u32 NextLayerIndex; - /* world_edit_block_array WorldEdits; */ - world_edit_layer_block_array Layers; - world_edit_brush_hashtable LoadedBrushes; + world_edit_layer_block_array Layers; + world_edit_brush_hashtable LoadedBrushes; world_edit_layer *CurrentLayer; world_edit_layer *HotLayer; @@ -1300,3 +1299,6 @@ DoColorPicker(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColor link_internal void DoColorPickerToggle(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch); + +link_internal sort_key_buffer +GetEditsSortedByOrdianl(world_edit_block_array *Edits, memory_arena *TempMem); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 8add6ac40..8d230dc87 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -363,6 +363,11 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; + // NOTE(Jesse): @duplicated_edit_ordinal_sort_code + // Was too lazy to make a templated overload for the sort + // function.. so here we are. Hopefully I don't pay for this + // in the future. + // { s32 EditCount = s32(TotalElements(&Node->Edits)); sort_key *Keys = Allocate(sort_key, GetTranArena(), EditCount); @@ -370,16 +375,17 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) IterateOver(&Node->Edits, Edit, EditIndex) { u32 KeyIndex = u32(GetIndex(&EditIndex)); - Keys[KeyIndex] = {u64(Edit->Ordinal), u64(Edit)}; + Keys[KeyIndex] = {u64(Edit), u64(Edit->Ordinal)}; } BubbleSort_descending(Keys, u32(EditCount)); + // } RangeIterator(KeyIndex, EditCount) { TIMED_NAMED_BLOCK(WorldEditDrawCall); - world_edit *Edit = Cast(world_edit*, Keys[KeyIndex].Value); + world_edit *Edit = Cast(world_edit*, Keys[KeyIndex].Index); if (Edit->Brush) // NOTE(Jesse): Don't necessarily have to have a brush if we created the edit before we created a brush. { layered_brush *Brush = &Edit->Brush->Layered; From b3f9a5f159b2fcd3416579e38420ee8cf2b0e033 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 19 May 2025 13:41:19 -0700 Subject: [PATCH 248/421] Tombstone world_edits instead of removing them, refine brush_layer options code --- external/bonsai_stdlib | 2 +- .../block_array_c_asset_thumbnail_688856411.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/d_union_ui_render_command.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 30 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...value_tables_enum_ui_brush_layer_actions.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...string_and_value_tables_ui_brush_actions.h | 50 +++ ...nd_value_tables_ui_layer_toolbar_actions.h | 2 +- ...ing_and_value_tables_visible_region_size.h | 2 +- ....h => toolbar_for_enum_ui_brush_actions.h} | 28 +- .../toolbar_for_enum_ui_brush_layer_actions.h | 2 +- ...oolbar_for_enum_ui_layer_toolbar_actions.h | 2 +- jesse.make.sh | 2 +- src/engine/api.cpp | 10 +- src/engine/editor.cpp | 294 +++++++++++------- src/engine/editor.h | 1 + src/engine/world.h | 2 +- 117 files changed, 390 insertions(+), 245 deletions(-) create mode 100644 generated/string_and_value_tables_ui_brush_actions.h rename generated/{toolbar_for_enum_enum.h => toolbar_for_enum_ui_brush_actions.h} (51%) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 6759444b8..99c9cead3 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 6759444b8890d80926f6e52af71e61ca2a916544 +Subproject commit 99c9cead334aefc3f94c5f5432471301dbdc724b diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 3810a43e9..5b5cd7e0a 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:86:0 +// src/engine/editor.cpp:105:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index b343325c3..1257bcc4a 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1162:0 +// src/engine/editor.h:1163:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index edef4b949..df59cf8e9 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1173:0 +// src/engine/editor.h:1174:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index b6abd9340..5bd739742 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1165:0 +// src/engine/editor.h:1166:0 diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index da0a8f47a..ffa132869 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:862:0 +// external/bonsai_stdlib/src/ui/ui.h:872:0 enum ui_render_command_type { diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index b48de4cf5..b40348a06 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:282:0 +// src/engine/editor.cpp:301:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index dbe829446..c6441e5c0 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:433:0 +// src/engine/editor.cpp:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index edc2f0417..5976f082c 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:425:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 622c75fb4..a36937037 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:321:0 +// src/engine/editor.cpp:340:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 4976b5ae3..bb4ce37e4 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:288:0 +// src/engine/editor.cpp:307:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index b1e604500..41aba0565 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:221:0 +// src/engine/editor.cpp:240:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index c653e4a40..2008dfec8 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:342:0 +// src/engine/editor.cpp:367:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index dcec47be2..8fc52a5d7 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:127:0 +// src/engine/editor.cpp:146:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index ee1fa2380..0d59bada2 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:315:0 +// src/engine/editor.cpp:334:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 5822ae798..72ba2f6c0 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:366:0 +// src/engine/editor.cpp:391:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 2a0147f53..746db3925 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:324:0 +// src/engine/editor.cpp:343:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 84d744523..2b173f847 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:436:0 +// src/engine/editor.cpp:461:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index e2d6e87f3..2ddd4be47 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:217:0 +// src/engine/editor.cpp:236:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index e26fb53e2..81dd90c7e 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:483:0 +// src/engine/editor.cpp:508:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 59315204a..571064f5c 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:504:0 +// src/engine/editor.cpp:529:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 7a0c4708d..c1f31c316 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:501:0 +// src/engine/editor.cpp:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 718bd39c9..7f94149d9 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:405:0 +// src/engine/editor.cpp:430:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index e4371adf9..8227b8c2e 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:402:0 +// src/engine/editor.cpp:427:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index cf99bb65a..d6916d593 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:439:0 +// src/engine/editor.cpp:464:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 12ebd8cc4..4781813da 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:390:0 +// src/engine/editor.cpp:415:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index bde68d1fe..cca9433d1 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:312:0 +// src/engine/editor.cpp:331:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 262487451..5ba64602d 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:459:0 +// src/engine/editor.cpp:484:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index df758f79b..8943c898e 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:478:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 1b463af7a..7a7607e4e 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:372:0 +// src/engine/editor.cpp:397:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 2193a4c8c..4b5032aad 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:375:0 +// src/engine/editor.cpp:400:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index bf465f730..c06c0a7ee 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:474:0 +// src/engine/editor.cpp:499:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 83af4b316..b75b09d8e 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:498:0 +// src/engine/editor.cpp:523:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index bccad15a2..cfb6170fd 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:210:0 +// src/engine/editor.cpp:229:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 38d10fcc1..6990927ad 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:207:0 +// src/engine/editor.cpp:226:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index a1b4278ab..1701653ef 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:279:0 +// src/engine/editor.cpp:298:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 822d536d9..c1a4230f2 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:345:0 +// src/engine/editor.cpp:370:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index c9f77d612..8ca692112 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:489:0 +// src/engine/editor.cpp:514:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index cf7a8459d..3ad848667 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:481:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 8ba6beeb9..fc12dee10 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:258:0 +// src/engine/editor.cpp:277:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 9ea84e5b0..ef5b5e729 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:378:0 +// src/engine/editor.cpp:403:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index d1042c450..782b1ba14 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:381:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 78541adbe..7278751a3 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:109:0 +// src/engine/editor.cpp:128:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 179c4659e..38d32f3c9 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:415:0 +// src/engine/editor.cpp:440:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 5b3e8caa6..a9e68f7c9 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:273:0 +// src/engine/editor.cpp:292:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index a28d1dc7c..61ea0cf4b 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:276:0 +// src/engine/editor.cpp:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 9222527f1..266885763 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:105:0 +// src/engine/editor.cpp:124:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index cd23febca..406546b4f 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:264:0 +// src/engine/editor.cpp:283:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 910038b2a..c03ca8bae 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:309:0 +// src/engine/editor.cpp:328:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index b9ce7d792..c4e0b7262 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:213:0 +// src/engine/editor.cpp:232:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 1032e618e..1630ecfef 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:267:0 +// src/engine/editor.cpp:286:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 7bf7233af..1c252ce45 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:472:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index a6694ae37..d8fbe45cd 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:477:0 +// src/engine/editor.cpp:502:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 8b3c416b5..f8148b5f4 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:261:0 +// src/engine/editor.cpp:280:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 5ab28b2b3..2ef75209f 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:475:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -444,11 +444,35 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - cs MemberName = CSz("UiBrushLayerAction"); + cs MemberName = CSz("BrushAction"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(ui_brush_layer_actions*, &Element->UiBrushLayerAction), + Cast(ui_brush_actions*, &Element->BrushAction), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("BrushLayerAction"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(ui_brush_layer_actions*, &Element->BrushLayerAction), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 4fd7bce74..a73ec46bd 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:193:0 +// src/engine/editor.cpp:212:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 2af2f3a1b..a2d8481ee 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:125:0 +// src/engine/editor.cpp:144:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 20f8e41b4..416dbff0c 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:465:0 +// src/engine/editor.cpp:490:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index faf31d0ea..53f966318 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:468:0 +// src/engine/editor.cpp:493:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 94f5b3ed7..3f9ab1470 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:462:0 +// src/engine/editor.cpp:487:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index a7cf48b1f..c81e9aa38 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:351:0 +// src/engine/editor.cpp:376:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 0de0be75f..40df299a8 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:348:0 +// src/engine/editor.cpp:373:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 037f1428a..0d6f685c8 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:471:0 +// src/engine/editor.cpp:496:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index efc120a47..84a5ce2fa 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:337:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 8ae61bc0a..bae9cebf1 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:480:0 +// src/engine/editor.cpp:505:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 5011fe7bd..209a85bd6 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:133:0 +// src/engine/editor.cpp:152:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index fad847a90..35ffd3ca0 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:136:0 +// src/engine/editor.cpp:155:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index e31928858..ac8e2413e 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:291:0 +// src/engine/editor.cpp:310:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index d1b69894c..aad594ca7 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:285:0 +// src/engine/editor.cpp:304:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 0a15e9b4f..9b592e91f 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:107:0 +// src/engine/editor.cpp:126:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 68970884e..fae3bb63c 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:369:0 +// src/engine/editor.cpp:394:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 89a5e50a8..f4d8bd5e9 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:360:0 +// src/engine/editor.cpp:385:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 9d09180f8..96ab47051 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:363:0 +// src/engine/editor.cpp:388:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 148cc555d..5da1262e5 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:103:0 +// src/engine/editor.cpp:122:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index e0116501e..a36db7171 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:204:0 +// src/engine/editor.cpp:223:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 8b32dab19..0e2608e06 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:201:0 +// src/engine/editor.cpp:220:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index f7713a5cd..8025adc34 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:418:0 +// src/engine/editor.cpp:443:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 993654a71..714f0fef6 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:412:0 +// src/engine/editor.cpp:437:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index ec6648c9c..a55527209 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:354:0 +// src/engine/editor.cpp:379:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 30d107a56..7d1c347c4 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:117:0 +// src/engine/editor.cpp:136:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 4cbf39bff..ce3e80042 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:113:0 +// src/engine/editor.cpp:132:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index ab2a27a8d..aa28cfdb9 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:115:0 +// src/engine/editor.cpp:134:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 08c2493be..5e5f8ca74 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:434:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 53f62a835..13d4f779b 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:384:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index 18160549f..fb299a7ce 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:196:0 +// src/engine/editor.cpp:215:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 9c459809a..e6d1b0ea5 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:190:0 +// src/engine/editor.cpp:209:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index bcec72b1f..bf2b3476b 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:145:0 +// src/engine/editor.cpp:164:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index b69eb8559..8d3f14a7b 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:130:0 +// src/engine/editor.cpp:149:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 34eabb29e..3f9e3db2a 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:430:0 +// src/engine/editor.cpp:455:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 7d3c05a3e..7f5903622 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:357:0 +// src/engine/editor.cpp:382:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index be90caa2c..6824b748d 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:486:0 +// src/engine/editor.cpp:511:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index ff0b32f7a..6e2db4ec3 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:249:0 +// src/engine/editor.cpp:268:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 3be9d98f8..dd91ba46a 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:246:0 +// src/engine/editor.cpp:265:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index ee0d29d75..1263954c3 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:387:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index dfb96d764..37836f0bc 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:270:0 +// src/engine/editor.cpp:289:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index eeb5af33f..9513f26f8 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:492:0 +// src/engine/editor.cpp:517:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index b36f23b0e..8c68c0cc3 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:495:0 +// src/engine/editor.cpp:520:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 74dbef4a3..1e7baa118 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:123:0 +// src/engine/editor.cpp:142:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index a5d7fafc9..4391f2f20 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:252:0 +// src/engine/editor.cpp:271:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index 9975766da..c0c806626 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:99:0 +// src/engine/editor.cpp:118:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 4bb2ad84e..0efec8e20 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:428:0 +// src/engine/editor.cpp:453:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index b433fe088..e63d445a5 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:242:0 +// src/engine/editor.cpp:261:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_enum_ui_brush_layer_actions.h b/generated/string_and_value_tables_enum_ui_brush_layer_actions.h index d2d0e79cf..871f4e04c 100644 --- a/generated/string_and_value_tables_enum_ui_brush_layer_actions.h +++ b/generated/string_and_value_tables_enum_ui_brush_layer_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:334:0 +// src/engine/editor.cpp:359:0 link_internal counted_string ToStringPrefixless(ui_brush_layer_actions Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 492fcf4a5..be291a53e 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:236:0 +// src/engine/editor.cpp:255:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index abb324de5..425602ac1 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:233:0 +// src/engine/editor.cpp:252:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index e90df7042..b4291f2f5 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:239:0 +// src/engine/editor.cpp:258:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_ui_brush_actions.h b/generated/string_and_value_tables_ui_brush_actions.h new file mode 100644 index 000000000..d916c0870 --- /dev/null +++ b/generated/string_and_value_tables_ui_brush_actions.h @@ -0,0 +1,50 @@ +// src/engine/editor.cpp:354:0 + +link_internal counted_string +ToStringPrefixless(ui_brush_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiBrushAction_NoAction: { Result = CSz("NoAction"); } break; + case UiBrushAction_New: { Result = CSz("New"); } break; + case UiBrushAction_Save: { Result = CSz("Save"); } break; + case UiBrushAction_Duplicate: { Result = CSz("Duplicate"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(ui_brush_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiBrushAction_NoAction: { Result = CSz("UiBrushAction_NoAction"); } break; + case UiBrushAction_New: { Result = CSz("UiBrushAction_New"); } break; + case UiBrushAction_Save: { Result = CSz("UiBrushAction_Save"); } break; + case UiBrushAction_Duplicate: { Result = CSz("UiBrushAction_Duplicate"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal ui_brush_actions +UiBrushActions(counted_string S) +{ + ui_brush_actions Result = {}; + + if (StringsMatch(S, CSz("UiBrushAction_NoAction"))) { return UiBrushAction_NoAction; } + if (StringsMatch(S, CSz("UiBrushAction_New"))) { return UiBrushAction_New; } + if (StringsMatch(S, CSz("UiBrushAction_Save"))) { return UiBrushAction_Save; } + if (StringsMatch(S, CSz("UiBrushAction_Duplicate"))) { return UiBrushAction_Duplicate; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_ui_layer_toolbar_actions.h b/generated/string_and_value_tables_ui_layer_toolbar_actions.h index 58dc6ee53..9c79d4ea0 100644 --- a/generated/string_and_value_tables_ui_layer_toolbar_actions.h +++ b/generated/string_and_value_tables_ui_layer_toolbar_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:329:0 +// src/engine/editor.cpp:349:0 link_internal counted_string ToStringPrefixless(ui_layer_toolbar_actions Type) diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index 1106df6c9..4ba0fed92 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:97:0 +// src/engine/editor.cpp:116:0 link_internal counted_string ToStringPrefixless(visible_region_size Type) diff --git a/generated/toolbar_for_enum_enum.h b/generated/toolbar_for_enum_ui_brush_actions.h similarity index 51% rename from generated/toolbar_for_enum_enum.h rename to generated/toolbar_for_enum_ui_brush_actions.h index 9f4ff9a76..196d1d64a 100644 --- a/generated/toolbar_for_enum_enum.h +++ b/generated/toolbar_for_enum_ui_brush_actions.h @@ -1,7 +1,7 @@ -// src/engine/editor.cpp:2419:0 +// src/engine/editor.cpp:356:0 link_internal void -RadioSelect(ui_toggle_button_group *RadioGroup, layer_toolbar_actions Selection) +RadioSelect(ui_toggle_button_group *RadioGroup, ui_brush_actions Selection) { ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; SetRadioButton(RadioGroup, ToggleHandle, True); @@ -9,18 +9,19 @@ RadioSelect(ui_toggle_button_group *RadioGroup, layer_toolbar_actions Selection) } link_internal ui_toggle_button_group -RadioButtonGroup_layer_toolbar_actions( renderer_2d *Ui, +RadioButtonGroup_ui_brush_actions( renderer_2d *Ui, window_layout *Window, cs GroupName, - layer_toolbar_actions *Element, + ui_brush_actions *Element, ui_render_params *Params = &DefaultUiRenderParams_Generic, ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) { ui_toggle_button_handle ButtonHandles[] = { - { CSz("New"), UiId(Window, Cast(void*, Element), Cast(void*, "layer_toolbar_actions LayerToolbarActions_New")), LayerToolbarActions_New }, - { CSz("Delete"), UiId(Window, Cast(void*, Element), Cast(void*, "layer_toolbar_actions LayerToolbarActions_Delete")), LayerToolbarActions_Delete }, - { CSz("Rename"), UiId(Window, Cast(void*, Element), Cast(void*, "layer_toolbar_actions LayerToolbarActions_Rename")), LayerToolbarActions_Rename }, + { CSz("NoAction"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_NoAction")), UiBrushAction_NoAction }, + { CSz("New"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_New")), UiBrushAction_New }, + { CSz("Save"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Save")), UiBrushAction_Save }, + { CSz("Duplicate"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Duplicate")), UiBrushAction_Duplicate }, }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -39,7 +40,8 @@ link_internal ui_toggle_button_group PushToolbar( renderer_2d *Ui, window_layout *Window, cs GroupName, - layer_toolbar_actions *Element, + ui_brush_actions *Element, + u64 Index = 0, ui_render_params *Params = &DefaultUiRenderParams_Toolbar, ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) { @@ -47,9 +49,9 @@ PushToolbar( renderer_2d *Ui, ui_toggle_button_handle ButtonHandles[] = { - { CSz("New"), UiId(Window, Cast(void*, Element), Cast(void*, "layer_toolbar_actions LayerToolbarActions_New")), LayerToolbarActions_New }, - { CSz("Delete"), UiId(Window, Cast(void*, Element), Cast(void*, "layer_toolbar_actions LayerToolbarActions_Delete")), LayerToolbarActions_Delete }, - { CSz("Rename"), UiId(Window, Cast(void*, Element), Cast(void*, "layer_toolbar_actions LayerToolbarActions_Rename")), LayerToolbarActions_Rename }, + {CSz("New"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_New"), Cast(void*, Index)), UiBrushAction_New }, + {CSz("Save"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Save"), Cast(void*, Index)), UiBrushAction_Save }, + {CSz("Duplicate"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Duplicate"), Cast(void*, Index)), UiBrushAction_Duplicate }, }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -59,11 +61,11 @@ PushToolbar( renderer_2d *Ui, ui_toggle_button_group Result = {}; Result.Ui = Ui; - Result.Flags = ToggleButtonGroupFlags_TypePlainButton; + Result.Flags = ToggleButtonGroupFlags_TypeClickButton; Result.Buttons = ButtonBuffer; Result.EnumStorage = Cast(u32*, Element); - DrawButtonGroup(&Result, CSz("Uhh")); + DrawButtonGroup(&Result, GroupName); return Result; } diff --git a/generated/toolbar_for_enum_ui_brush_layer_actions.h b/generated/toolbar_for_enum_ui_brush_layer_actions.h index 7c5a2aeb4..c72a30c38 100644 --- a/generated/toolbar_for_enum_ui_brush_layer_actions.h +++ b/generated/toolbar_for_enum_ui_brush_layer_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:336:0 +// src/engine/editor.cpp:361:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_brush_layer_actions Selection) diff --git a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h index c6400b320..1d93226c8 100644 --- a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h +++ b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:331:0 +// src/engine/editor.cpp:351:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_layer_toolbar_actions Selection) diff --git a/jesse.make.sh b/jesse.make.sh index eeb22fa59..77e15a5d4 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -10,8 +10,8 @@ OPT="-O2" # ./make.sh RunTests ./make.sh $OPT \ - BuildExecutables \ BuildSingleExample examples/terrain_gen \ + BuildExecutables \ # BuildSingleExample examples/ui_test \ # BuildSingleExample examples/blank_project \ # BuildTests \ diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 386453667..228c674ba 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -96,11 +96,11 @@ Bonsai_FrameBegin(engine_resources *Resources) }); - if (VRChanged || - Resources->Graphics.WorldEditRC.Program.HotReloaded || - Resources->Graphics.TerrainShapingRC.Program.HotReloaded || - Resources->Graphics.TerrainDerivsRC.Program.HotReloaded || - Resources->Graphics.TerrainDecorationRC.Program.HotReloaded) + if ( VRChanged || + Resources->Graphics.WorldEditRC.Program.HotReloaded || + Resources->Graphics.TerrainShapingRC.Program.HotReloaded || + Resources->Graphics.TerrainDerivsRC.Program.HotReloaded || + Resources->Graphics.TerrainDecorationRC.Program.HotReloaded ) { auto Plat = &Resources->Stdlib.Plat; diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index dcf9e8029..5b5c134a0 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -18,14 +18,33 @@ LoadBrushFromFile(level_editor *Editor, file_traversal_node *FileNode, memory_ar FinalizeDeserialization(&Bytes); } -link_internal void +link_internal world_edit* +NewEdit(world_edit_layer *Layer) +{ + world_edit *Result = {}; + IterateOver(&Layer->Edits, Edit, EditIndex) + { + if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) + { + Result = Edit; + } + } + + if (Result == 0) Result = Push(&Layer->Edits); + return Result; +} + +link_internal world_edit_layer* NewLayer(level_editor *Editor) { - Editor->CurrentLayer = Push(&Editor->Layers); - Editor->CurrentLayer->Edits = WorldEditBlockArray(Editor->Memory); + auto Result = Push(&Editor->Layers); + Result->Edits = WorldEditBlockArray(Editor->Memory); cs DefaultName = FSz("layer_%d", Editor->NextLayerIndex++); - CopyString(DefaultName.Start, Editor->CurrentLayer->NameBuf, DefaultName.Count); + CopyString(DefaultName.Start, Result->NameBuf, DefaultName.Count); + + Editor->CurrentLayer = Result; + return Result; } link_internal b32 @@ -326,11 +345,17 @@ poof(do_editor_ui_for_compound_type(chunk_thumbnail)) + poof(string_and_value_tables(ui_layer_toolbar_actions)) #include poof(toolbar_for_enum(ui_layer_toolbar_actions)) #include +poof(string_and_value_tables(ui_brush_actions)) +#include +poof(toolbar_for_enum(ui_brush_actions)) +#include + poof(string_and_value_tables(ui_brush_layer_actions)) #include poof(toolbar_for_enum(ui_brush_layer_actions)) @@ -1478,6 +1503,12 @@ GetFilenameForBrush(cs Name, s32 Version = 0) link_internal void SaveBrush(world_edit_brush *Brush, const char *FilenameZ) { + ZeroMemory(Brush->NameBuf, NameBuf_Len); + cs BrushNameBuf = CS(Brush->NameBuf, NameBuf_Len); + + cs BrushBasename = Basename(CS(FilenameZ)); + CopyString(&BrushBasename, &BrushNameBuf); + u8_cursor_block_array OutputStream = BeginSerialization(); Serialize(&OutputStream, Brush); @@ -1485,14 +1516,6 @@ SaveBrush(world_edit_brush *Brush, const char *FilenameZ) { SoftError("Unable to serialize brush (%s) to file (%s).", Brush->NameBuf, FilenameZ); } - else - { - ZeroMemory(Brush->NameBuf, NameBuf_Len); - cs BrushNameBuf = CS(Brush->NameBuf, NameBuf_Len); - - cs BrushBasename = Basename(CS(FilenameZ)); - CopyString(&BrushBasename, &BrushNameBuf); - } } @@ -1578,64 +1601,81 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ if (LayeredBrush->LayerCount) { - if (Button(Ui, CSz("Save"), UiId(BrushSettingsWindow, "brush save", 0u))) + Ui->BrushAction = {}; + ui_toggle_button_group Toolbar = PushToolbar(Ui, BrushSettingsWindow, CSz(""), &Ui->BrushAction); + switch (Ui->BrushAction) { - cs BrushFilepath = GetFilenameForBrush(CS(Brush->NameBuf)); - SaveBrush(Brush, BrushFilepath.Start); - } + case UiBrushAction_NoAction: {} break; - if (Button(Ui, CSz("Duplicate"), UiId(BrushSettingsWindow, "brush dup", 0u))) - { - cs_buffer Pieces = Split( CS(Brush->NameBuf), '.', Tran); + case UiBrushAction_New: + { + world_edit_brush ThisBrush = NewBrush(); + Editor->CurrentBrush = Insert(ThisBrush, &Editor->LoadedBrushes, Editor->Memory); + } break; - if (Pieces.Count > 2) + case UiBrushAction_Save: { - cs BrushNameString = Pieces.Start[0]; - cs VersionString = Pieces.Start[Pieces.Count-2]; + cs BrushFilepath = GetFilenameForBrush(CS(Brush->NameBuf)); + SaveBrush(Brush, BrushFilepath.Start); + } break; + + case UiBrushAction_Duplicate: + { + world_edit_brush Duplicated = *Brush; - s32 VersionNumber; - if ( ParseInteger(VersionString, &VersionNumber) ) + cs_buffer Pieces = Split( CS(Duplicated.NameBuf), '.', Tran); + + if (Pieces.Count > 2) { - cs BrushFilepath = GetFilenameForBrush(BrushNameString, VersionNumber); - while (FileExists(BrushFilepath.Start)) + cs BrushNameString = Pieces.Start[0]; + cs VersionString = Pieces.Start[Pieces.Count-2]; + + s32 VersionNumber; + if ( ParseInteger(VersionString, &VersionNumber) ) { - ++VersionNumber; - BrushFilepath = GetFilenameForBrush(BrushNameString, VersionNumber); - } + cs BrushFilepath = GetFilenameForBrush(BrushNameString, VersionNumber); + while (FileExists(BrushFilepath.Start)) + { + ++VersionNumber; + BrushFilepath = GetFilenameForBrush(BrushNameString, VersionNumber); + } - SaveBrush(Brush, BrushFilepath.Start); + SaveBrush(&Duplicated, BrushFilepath.Start); + } + } + else + { + cs BrushFilepath = GetFilenameForBrush(CS(Duplicated.NameBuf), 1); + SaveBrush(&Duplicated, BrushFilepath.Start); } - } - else - { - cs BrushFilepath = GetFilenameForBrush(CS(Brush->NameBuf), 1); - SaveBrush(Brush, BrushFilepath.Start); - } - } - } + Editor->CurrentBrush = Insert(Duplicated, &Editor->LoadedBrushes, Editor->Memory); + } break; - ui_id ImportToggleId = UiId(BrushSettingsWindow, "brush import", 0u); - if (ToggleButton(Ui, CSz("Import"), CSz("Import"), ImportToggleId)) - { - PushNewRow(Ui); +#if 0 + case UiBrushAction_Import: + { + ui_id ImportToggleId = UiId(BrushSettingsWindow, "brush import", 0u); + if (ToggleButton(Ui, CSz("Import"), CSz("Import"), ImportToggleId)) + { + PushNewRow(Ui); - filtered_file_traversal_helper_params HelperParams = {BrushSettingsWindow, 0}; - maybe_file_traversal_node ClickedFileNode = PlatformTraverseDirectoryTreeUnordered(CSz("brushes"), EngineDrawFileNodesFilteredHelper, u64(&HelperParams) ); + filtered_file_traversal_helper_params HelperParams = {BrushSettingsWindow, 0}; + maybe_file_traversal_node ClickedFileNode = PlatformTraverseDirectoryTreeUnordered(CSz("brushes"), EngineDrawFileNodesFilteredHelper, u64(&HelperParams) ); + + if (ClickedFileNode.Tag) + { + LoadBrushFromFile(Editor, &ClickedFileNode.Value, Tran); + SetToggleButton(Ui, ImportToggleId, False); + } + } + } break; +#endif - if (ClickedFileNode.Tag) - { - LoadBrushFromFile(Editor, &ClickedFileNode.Value, Tran); - SetToggleButton(Ui, ImportToggleId, False); } } - else + { - if (Button(Ui, CSz("New"), UiId(BrushSettingsWindow, "brush new", 0u))) - { - world_edit_brush ThisBrush = NewBrush(); - Editor->CurrentBrush = Insert(ThisBrush, &Editor->LoadedBrushes, Editor->Memory); - } if (LayeredBrush->LayerCount) { @@ -1678,28 +1718,28 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ PushTableStart(Ui); - Ui->UiBrushLayerAction = {}; + Ui->BrushLayerAction = {}; - brush_layer *Layers = Brush->Layered.Layers; + brush_layer *BrushLayers = Brush->Layered.Layers; RangeIterator(LayerIndex, LayeredBrush->LayerCount) { - brush_layer *Layer = Layers + LayerIndex; + brush_layer *BrushLayer = BrushLayers + LayerIndex; ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", u32(LayerIndex)); - cs LayerDetails = GetLayerUiText(Layer, GetTranArena()); + cs LayerDetails = GetLayerUiText(BrushLayer, GetTranArena()); if (ToggleButton(Ui, FSz("v %d %S", LayerIndex, LayerDetails), FSz("> %d %S", LayerIndex, LayerDetails), ToggleId)) { - ui_toggle_button_group Toolbar = PushToolbar(Ui, BrushSettingsWindow, CSz(""), &Ui->UiBrushLayerAction, u64(LayerIndex)); + ui_toggle_button_group Toolbar = PushToolbar(Ui, BrushSettingsWindow, CSz(""), &Ui->BrushLayerAction, u64(LayerIndex)); if (Toolbar.AnyElementClicked) { EditLayerIndex = LayerIndex; - if (Ui->UiBrushLayerAction == UiBrushLayerAction_Delete) { SetToggleButton(Ui, ToggleId, False); } + if (Ui->BrushLayerAction == UiBrushLayerAction_Delete) { SetToggleButton(Ui, ToggleId, False); } b32 ThisState = GetToggleState(Ui, ToggleId); - if (Ui->UiBrushLayerAction == UiBrushLayerAction_MoveUp) + if (Ui->BrushLayerAction == UiBrushLayerAction_MoveUp) { ui_id NextId = ToggleId; NextId.ElementBits -= 1; @@ -1709,7 +1749,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ SetToggleButton(Ui, NextId, ThisState); } - if (Ui->UiBrushLayerAction == UiBrushLayerAction_MoveDown) + if (Ui->BrushLayerAction == UiBrushLayerAction_MoveDown) { ui_id NextId = ToggleId; NextId.ElementBits += 1; @@ -1722,12 +1762,12 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - DoEditorUi(Ui, BrushSettingsWindow, Layer, {}); + DoEditorUi(Ui, BrushSettingsWindow, BrushLayer, {}); CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } else { - DoColorSwatch(Ui, V2(20), HSVtoRGB(Layer->Settings.HSVColor)); + DoColorSwatch(Ui, V2(20), HSVtoRGB(BrushLayer->Settings.HSVColor)); } if (IsNewBrush && LayerIndex == 0) @@ -1739,33 +1779,32 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } PushTableEnd(Ui); - if (Ui->UiBrushLayerAction == UiBrushLayerAction_MoveUp) + if (Ui->BrushLayerAction == UiBrushLayerAction_MoveUp) { if (EditLayerIndex > 0) { - brush_layer *Layer = Layers + EditLayerIndex; - brush_layer Tmp = Layers[EditLayerIndex-1]; - Layers[EditLayerIndex-1].Settings = Layer->Settings; - Layer->Settings = Tmp.Settings; + brush_layer *BrushLayer = BrushLayers + EditLayerIndex; + brush_layer Tmp = BrushLayers[EditLayerIndex-1]; + BrushLayers[EditLayerIndex-1].Settings = BrushLayer->Settings; + BrushLayer->Settings = Tmp.Settings; } } - if (Ui->UiBrushLayerAction == UiBrushLayerAction_MoveDown) + if (Ui->BrushLayerAction == UiBrushLayerAction_MoveDown) { if (LayeredBrush->LayerCount) { if (EditLayerIndex < LayeredBrush->LayerCount-1) { - Info("SwippySwap"); - brush_layer *Layer = Layers + EditLayerIndex; - brush_layer Tmp = Layers[EditLayerIndex+1]; - Layers[EditLayerIndex+1].Settings = Layer->Settings; - Layer->Settings = Tmp.Settings; + brush_layer *BrushLayer = BrushLayers + EditLayerIndex; + brush_layer Tmp = BrushLayers[EditLayerIndex+1]; + BrushLayers[EditLayerIndex+1].Settings = BrushLayer->Settings; + BrushLayer->Settings = Tmp.Settings; } } } - if (Ui->UiBrushLayerAction == UiBrushLayerAction_Duplicate) + if (Ui->BrushLayerAction == UiBrushLayerAction_Duplicate) { if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) { @@ -1774,24 +1813,25 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ // Shuffle layers forward. This conveniently duplicates the EditLayerIndex RangeIteratorReverseRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) { - Layers[LayerIndex].Settings = Layers[LayerIndex-1].Settings; + BrushLayers[LayerIndex].Settings = BrushLayers[LayerIndex-1].Settings; } } } - if (Ui->UiBrushLayerAction == UiBrushLayerAction_Delete) + if (Ui->BrushLayerAction == UiBrushLayerAction_Delete) { - if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) - { - // Shuffle layers backwards, overwriting EditLayerIndex - RangeIteratorRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) - { - Assert(LayerIndex >= 0 && LayerIndex < MAX_BRUSH_LAYERS); - Layers[LayerIndex-1].Settings = Layers[LayerIndex].Settings; - } + // NOTE(Jesse): Not an `if` because we shouldn't be able to ask to + // delete a layer if there aren't any to delete! + Assert(LayeredBrush->LayerCount < 0); - LayeredBrush->LayerCount -= 1; + // Shuffle layers backwards, overwriting EditLayerIndex + RangeIteratorRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) + { + Assert(LayerIndex >= 0 && LayerIndex < MAX_BRUSH_LAYERS); + BrushLayers[LayerIndex-1].Settings = BrushLayers[LayerIndex].Settings; } + + LayeredBrush->LayerCount -= 1; } } } @@ -2412,6 +2452,7 @@ link_internal void ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *TempMemory) { UNPACK_ENGINE_RESOURCES(Engine); + Assert(Edit->Ordinal != EDIT_ORDINAL_TOMBSTONE); Info("Updating Edit(%p)", Edit); @@ -2463,6 +2504,7 @@ link_internal void DropEditFromOctree(engine_resources *Engine, world_edit *Edit, memory_arena *TempMemory) { UNPACK_ENGINE_RESOURCES(Engine); + Assert(Edit->Ordinal != EDIT_ORDINAL_TOMBSTONE); octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Edit->Region, &Nodes); @@ -2485,6 +2527,7 @@ link_internal void UpdateWorldEditBounds(engine_resources *Engine, world_edit *Edit, rect3cp Region, memory_arena *TempMemory) { UNPACK_ENGINE_RESOURCES(Engine); + Assert(Edit->Ordinal != EDIT_ORDINAL_TOMBSTONE); DropEditFromOctree(Engine, Edit, TempMemory); @@ -2501,8 +2544,10 @@ IncrementAllEditOrdinalsAbove(world_edit_layer_block_array *Layers, u32 Ordinal) { IterateOver(&Layer->Edits, Edit, EditIndex) { - if (Edit->Ordinal >= Ordinal) + if (Edit->Ordinal >= Ordinal) { + if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + ++Edit->Ordinal; } } @@ -2957,27 +3002,17 @@ DoWorldEditor(engine_resources *Engine) local_persist window_layout BrushSettingsWindow = WindowLayout("All Brushes", WindowLayoutFlag_Align_BottomRight); PushWindowStart(Ui, &BrushSettingsWindow); - if (Button(Ui, CSz("New"), UiId(&BrushSettingsWindow, "brush new", 0u))) - { - world_edit_brush Brush = NewBrush(); - Editor->CurrentBrush = Insert(Brush, &Editor->LoadedBrushes, Editor->Memory); - } - PushNewRow(Ui); - IterateOver(&Editor->LoadedBrushes, Brush, BrushIndex) { if (Brush) { + ui_style *Style = &DefaultStyle; if (Brush == Editor->CurrentBrush) { - PushColumn(Ui, CSz("*"), &DefaultSelectedStyle); - } - else - { - PushColumn(Ui, CSz(" "), &DefaultSelectedStyle); + Style = &DefaultSelectedStyle; } - if (Button(Ui, CS(Brush->NameBuf), UiId(&BrushSettingsWindow, "brush select", Brush))) + if (Button(Ui, CS(Brush->NameBuf), UiId(&BrushSettingsWindow, "brush select", Brush), Style)) { Editor->CurrentBrush = Brush; CheckSettingsChanged(&Brush->Layered); // Prevent firing a change event @prevent_change_event @@ -3008,6 +3043,8 @@ DoWorldEditor(engine_resources *Engine) { IterateOver(&Layer->Edits, Edit, EditIndex) { + if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + if (Edit->Brush == Editor->CurrentBrush) { UpdateWorldEditBounds(Engine, Edit, Editor->Selection.Region, GetTranArena()); @@ -3038,7 +3075,14 @@ DoWorldEditor(engine_resources *Engine) case LayerToolbarActions_Delete: { - RemoveOrdered(&Editor->Layers, Editor->CurrentLayer); + auto Layer = Editor->CurrentLayer; + IterateOver(&Layer->Edits, Edit, EditIndex) + { + if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + + DropEditFromOctree(Engine, Edit, GetTranArena()); + } + RemoveOrdered(&Editor->Layers, Layer); } break; case LayerToolbarActions_Rename: @@ -3052,7 +3096,26 @@ DoWorldEditor(engine_resources *Engine) case LayerToolbarActions_Duplicate: { - NotImplemented; + auto SrcLayer = Editor->CurrentLayer; + auto DstLayer = NewLayer(Editor); + + IterateOver(&SrcLayer->Edits, Edit, EditIndex) + { + if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + + auto *Duplicated = NewEdit(DstLayer); + *Duplicated = *Edit; + Duplicated->Ordinal = Editor->NextEditOrdinal++; + + ApplyEditToOctree(Engine, Duplicated, GetTranArena()); + + if (Editor->CurrentEdit == Edit) + { + Editor->CurrentEdit = Duplicated; + } + } + + } break; } } @@ -3078,6 +3141,7 @@ DoWorldEditor(engine_resources *Engine) IterateOver(&Keys, Key, KeyIndex) { world_edit *Edit = Cast(world_edit*, Key->Index); + if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } const char *NameBuf = Edit->Brush ? Edit->Brush->NameBuf : "no brush"; @@ -3095,6 +3159,7 @@ DoWorldEditor(engine_resources *Engine) Editor->Selection.PrevRegion = Edit->Region; Editor->CurrentEdit = Edit; + Editor->CurrentLayer = Layer; if (Edit->Brush) { @@ -3126,7 +3191,8 @@ DoWorldEditor(engine_resources *Engine) { IncrementAllEditOrdinalsAbove(&Editor->Layers, Edit->Ordinal+1); - auto *Duplicated = Push(&Layer->Edits, Edit); + auto *Duplicated = NewEdit(Layer); + *Duplicated = *Edit; ++Duplicated->Ordinal; ApplyEditToOctree(Engine, Duplicated, GetTranArena()); @@ -3135,21 +3201,16 @@ DoWorldEditor(engine_resources *Engine) if (Button(Ui, CSz("X"), DelEditId)) { - /* DropEditFromOctree(Engine, Edit, GetTranArena()); */ if (Editor->CurrentEdit == Edit) { Editor->CurrentEdit = 0; } - RemoveOrdered(&Layer->Edits, Edit); + DropEditFromOctree(Engine, Edit, GetTranArena()); + Edit->Ordinal = EDIT_ORDINAL_TOMBSTONE; } - - PushNewRow(Ui); - - /* DoEditorUi(Ui, &AllEditsWindow, Edit, {}); */ - /* PushNewRow(Ui); */ } } @@ -3193,14 +3254,20 @@ DoWorldEditor(engine_resources *Engine) { IterateOver(&Layer->Edits, Edit, BrushIndex) { + if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + auto EditAABB = GetSimSpaceAABB(World, Edit->Region); random_series S = {u64(Edit)}; v3 BaseColor = RandomV3Unilateral(&S); f32 Size = DEFAULT_LINE_THICKNESS; - if (Edit == Editor->CurrentEdit) + + if (Layer == Editor->CurrentLayer) { - Size = 3.f*DEFAULT_LINE_THICKNESS; + if (Edit == Editor->CurrentEdit) + { + Size = 3.f*DEFAULT_LINE_THICKNESS; + } } if (Edit == Editor->HotEdit) @@ -3321,6 +3388,7 @@ DoLevelWindow(engine_resources *Engine) Serialize(&OutputStream, &EditCount); IterateOver(&Layer->Edits, Edit, EditIndex) { + if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } Serialize(&OutputStream, Edit); } } diff --git a/src/engine/editor.h b/src/engine/editor.h index 10da48038..1a642bed8 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1150,6 +1150,7 @@ poof(are_equal(world_edit_brush)) poof(hashtable(world_edit_brush)) #include +#define EDIT_ORDINAL_TOMBSTONE (u32_MAX) struct world_edit { rect3cp Region; // TODO(Jesse): Rename to bounds diff --git a/src/engine/world.h b/src/engine/world.h index 50c044e61..e9dac3c0a 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -249,7 +249,7 @@ TryGetVoxel(world *World, cp P) #define OCTREE_PRIORITY_QUEUE_LIST_COUNT (512) #define OCTREE_PRIORITY_QUEUE_LIST_LENGTH (128) -#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (25) +#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (72) struct octree_node_priority_queue { octree_node_ptr_cursor Lists[OCTREE_PRIORITY_QUEUE_LIST_COUNT]; From b8a9f8a20a0a1bfccaaf9c9c50052e5aa4b3059d Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 19 May 2025 13:58:42 -0700 Subject: [PATCH 249/421] Add shape_axis --- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 2 +- .../do_editor_ui_for_compound_type_ray.h | 2 +- .../do_editor_ui_for_compound_type_rect3.h | 2 +- .../do_editor_ui_for_compound_type_rect3cp.h | 2 +- .../do_editor_ui_for_compound_type_rect3i.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- generated/do_editor_ui_for_enum_shape_axis.h | 92 +++++++++++++++++++ .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ..._editor_ui_for_enum_voxel_rule_direction.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- ...ct_world_update_op_shape_params_cylinder.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_shape_axis.h | 62 +++++++++++++ .../string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- src/engine/editor.h | 41 ++++++++- src/engine/render_loop.cpp | 13 ++- 45 files changed, 244 insertions(+), 46 deletions(-) create mode 100644 generated/do_editor_ui_for_enum_shape_axis.h create mode 100644 generated/string_and_value_tables_shape_axis.h diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index ef371975d..8e50d129f 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:777:0 +// src/engine/editor.h:800:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 2abbe8722..582e7c15c 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1037:0 +// src/engine/editor.h:1060:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 59889e529..ff5b5c169 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1147:0 +// src/engine/editor.h:1170:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index ee6828292..f6c97a991 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:612:0 +// src/engine/editor.h:635:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 1257bcc4a..2152c0642 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1163:0 +// src/engine/editor.h:1186:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index df59cf8e9..4a9ad6d9a 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1174:0 +// src/engine/editor.h:1197:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 5bd739742..734d7b714 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1166:0 +// src/engine/editor.h:1189:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 78014e904..a603c12b6 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:990:0 +// src/engine/editor.h:1013:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index 07b9cc2fc..a4c44024c 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:618:0 +// src/engine/editor.h:641:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index 6850de30e..72e75fd46 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:615:0 +// src/engine/editor.h:638:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index c5bb3cc1b..4e9e3d4bb 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:603:0 +// src/engine/editor.h:626:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index 72f95be5f..b66aecde6 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:609:0 +// src/engine/editor.h:632:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 14f3af594..72433050f 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:606:0 +// src/engine/editor.h:629:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 7d1c347c4..4faaad66b 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -37,7 +37,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(voxel_rule_direction*, &Element->Axis), + Cast(shape_axis*, &Element->Axis), MemberName, Params ); diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 4da439597..719768ddc 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:597:0 +// src/engine/editor.h:617:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 47a433b87..4760d3091 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:592:0 +// src/engine/editor.h:612:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_axis.h b/generated/do_editor_ui_for_enum_shape_axis.h new file mode 100644 index 000000000..fbe455af2 --- /dev/null +++ b/generated/do_editor_ui_for_enum_shape_axis.h @@ -0,0 +1,92 @@ +// src/engine/editor.h:620:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + { + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("InferFromMajorAxis"), UiId(Window, "enum ShapeAxis_InferFromMajorAxis", Element), Params)) + { + *Element = ShapeAxis_InferFromMajorAxis; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("PosX"), UiId(Window, "enum ShapeAxis_PosX", Element), Params)) + { + *Element = ShapeAxis_PosX; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("NegX"), UiId(Window, "enum ShapeAxis_NegX", Element), Params)) + { + *Element = ShapeAxis_NegX; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("PosY"), UiId(Window, "enum ShapeAxis_PosY", Element), Params)) + { + *Element = ShapeAxis_PosY; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("NegY"), UiId(Window, "enum ShapeAxis_NegY", Element), Params)) + { + *Element = ShapeAxis_NegY; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("PosZ"), UiId(Window, "enum ShapeAxis_PosZ", Element), Params)) + { + *Element = ShapeAxis_PosZ; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("NegZ"), UiId(Window, "enum ShapeAxis_NegZ", Element), Params)) + { + *Element = ShapeAxis_NegZ; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Count"), UiId(Window, "enum ShapeAxis_Count", Element), Params)) + { + *Element = ShapeAxis_Count; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + } + else + { + PushNewRow(Ui); + } +} + + diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 6392622bb..99e57f876 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:647:0 +// src/engine/editor.h:670:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_voxel_rule_direction.h b/generated/do_editor_ui_for_enum_voxel_rule_direction.h index c73248acc..816272b4e 100644 --- a/generated/do_editor_ui_for_enum_voxel_rule_direction.h +++ b/generated/do_editor_ui_for_enum_voxel_rule_direction.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:600:0 +// src/engine/editor.h:623:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 0e40bdbb2..55e9a296b 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:805:0 +// src/engine/editor.h:828:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 4b9fb5141..74b84b0fd 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1006:0 +// src/engine/editor.h:1029:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 37081a6cc..5a599eb72 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:811:0 +// src/engine/editor.h:834:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index f82e10d9a..df061bc5a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:794:0 +// src/engine/editor.h:817:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 4dd14a046..643245011 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:823:0 +// src/engine/editor.h:846:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index c906ce170..6211fdb8c 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:816:0 +// src/engine/editor.h:839:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index bb7f43357..064f44a94 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:820:0 +// src/engine/editor.h:843:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index 5e946fb4d..7af43eeb2 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:467:0 +// src/engine/editor.h:487:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index e67d3d552..ac8669ebb 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:579:0 +// src/engine/editor.h:599:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index bfff14360..95d4f748f 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1150:0 +// src/engine/editor.h:1173:0 struct world_edit_brush_linked_list_node { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 41a873808..0c701f213 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:633:0 +// src/engine/editor.h:656:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, level_editor_flags Selection) diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 09200fd83..c9a7bb8e7 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:645:0 +// src/engine/editor.h:668:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/serdes_struct_world_update_op_shape_params_cylinder.h b/generated/serdes_struct_world_update_op_shape_params_cylinder.h index 26538624e..201d87bd1 100644 --- a/generated/serdes_struct_world_update_op_shape_params_cylinder.h +++ b/generated/serdes_struct_world_update_op_shape_params_cylinder.h @@ -62,7 +62,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_cylinder *Element, memory_arena *Memory) { b32 Result = True; - Element->Axis = Cast(voxel_rule_direction, Read_u32(Bytes)); + Element->Axis = Cast(shape_axis, Read_u32(Bytes)); diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 6e1a2ee1f..d6a657cbd 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:595:0 +// src/engine/editor.h:615:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index b8d1e3471..83ebf09ec 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1004:0 +// src/engine/editor.h:1027:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index fa07bba58..284b52e5f 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:590:0 +// src/engine/editor.h:610:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_shape_axis.h b/generated/string_and_value_tables_shape_axis.h new file mode 100644 index 000000000..7519875e1 --- /dev/null +++ b/generated/string_and_value_tables_shape_axis.h @@ -0,0 +1,62 @@ +// src/engine/editor.h:40:0 + +link_internal counted_string +ToStringPrefixless(shape_axis Type) +{ + counted_string Result = {}; + switch (Type) + { + case ShapeAxis_InferFromMajorAxis: { Result = CSz("InferFromMajorAxis"); } break; + case ShapeAxis_PosX: { Result = CSz("PosX"); } break; + case ShapeAxis_NegX: { Result = CSz("NegX"); } break; + case ShapeAxis_PosY: { Result = CSz("PosY"); } break; + case ShapeAxis_NegY: { Result = CSz("NegY"); } break; + case ShapeAxis_PosZ: { Result = CSz("PosZ"); } break; + case ShapeAxis_NegZ: { Result = CSz("NegZ"); } break; + case ShapeAxis_Count: { Result = CSz("Count"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(shape_axis Type) +{ + counted_string Result = {}; + switch (Type) + { + case ShapeAxis_InferFromMajorAxis: { Result = CSz("ShapeAxis_InferFromMajorAxis"); } break; + case ShapeAxis_PosX: { Result = CSz("ShapeAxis_PosX"); } break; + case ShapeAxis_NegX: { Result = CSz("ShapeAxis_NegX"); } break; + case ShapeAxis_PosY: { Result = CSz("ShapeAxis_PosY"); } break; + case ShapeAxis_NegY: { Result = CSz("ShapeAxis_NegY"); } break; + case ShapeAxis_PosZ: { Result = CSz("ShapeAxis_PosZ"); } break; + case ShapeAxis_NegZ: { Result = CSz("ShapeAxis_NegZ"); } break; + case ShapeAxis_Count: { Result = CSz("ShapeAxis_Count"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal shape_axis +ShapeAxis(counted_string S) +{ + shape_axis Result = {}; + + if (StringsMatch(S, CSz("ShapeAxis_InferFromMajorAxis"))) { return ShapeAxis_InferFromMajorAxis; } + if (StringsMatch(S, CSz("ShapeAxis_PosX"))) { return ShapeAxis_PosX; } + if (StringsMatch(S, CSz("ShapeAxis_NegX"))) { return ShapeAxis_NegX; } + if (StringsMatch(S, CSz("ShapeAxis_PosY"))) { return ShapeAxis_PosY; } + if (StringsMatch(S, CSz("ShapeAxis_NegY"))) { return ShapeAxis_NegY; } + if (StringsMatch(S, CSz("ShapeAxis_PosZ"))) { return ShapeAxis_PosZ; } + if (StringsMatch(S, CSz("ShapeAxis_NegZ"))) { return ShapeAxis_NegZ; } + if (StringsMatch(S, CSz("ShapeAxis_Count"))) { return ShapeAxis_Count; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index f637bb929..16ebc76c8 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:946:0 +// src/engine/editor.h:969:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 7b1e223a6..710896a53 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:643:0 +// src/engine/editor.h:666:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index e4539a95c..9b62e464c 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:808:0 +// src/engine/editor.h:831:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index d1b79c72a..2ac1f9d4e 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:791:0 +// src/engine/editor.h:814:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index cb60ac53e..96c0f5ad3 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:814:0 +// src/engine/editor.h:837:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 0487cdb41..e5ec56eed 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:677:0 +// src/engine/editor.h:700:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 7cd99fd93..8a770bb62 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:800:0 +// src/engine/editor.h:823:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/src/engine/editor.h b/src/engine/editor.h index 1a642bed8..714a8d034 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -13,13 +13,33 @@ enum voxel_rule_direction VoxelRuleDir_PosZ, VoxelRuleDir_NegZ, - VoxelRuleDir_Count, + VoxelRuleDir_Count poof(@ui_skip), }; CAssert(VoxelRuleDir_Count == 6); poof(string_and_value_tables(voxel_rule_direction)) #include + +enum shape_axis +{ + ShapeAxis_InferFromMajorAxis, + + ShapeAxis_PosX, + ShapeAxis_NegX, + + ShapeAxis_PosY, + ShapeAxis_NegY, + + ShapeAxis_PosZ, + ShapeAxis_NegZ, + + ShapeAxis_Count poof(@ui_skip), +}; + +poof(string_and_value_tables(shape_axis)) +#include + struct world; #define EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS r32 MinValue = 0.f, r32 MaxValue = 1.f @@ -597,6 +617,9 @@ poof(string_and_value_tables(data_type)) poof(do_editor_ui_for_enum(data_type)) #include +poof(do_editor_ui_for_enum(shape_axis)) +#include + poof(do_editor_ui_for_enum(voxel_rule_direction)) #include @@ -883,7 +906,7 @@ struct world_update_op_shape_params_line struct world_update_op_shape_params_cylinder { - voxel_rule_direction Axis; + shape_axis Axis; r32 Radius = 10.f; }; @@ -1268,6 +1291,20 @@ GetSelectionDim(world *World, level_editor *Editor) return Result; } +link_internal shape_axis +ComputeShapeAxisFromEditDim(v3 Dim) +{ + shape_axis Result = ShapeAxis_Count; + + f32 MaxAxisValue = Max(Max(Dim.x, Dim.y), Dim.z); + if (MaxAxisValue == Dim.x) { Result = ShapeAxis_PosX; } + if (MaxAxisValue == Dim.y) { Result = ShapeAxis_PosY; } + if (MaxAxisValue == Dim.z) { Result = ShapeAxis_PosZ; } + + Assert(Result != ShapeAxis_Count); + + return Result; +} link_internal b32 CheckSettingsChanged(layered_brush *); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 8d230dc87..2fe3e6b3f 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -419,10 +419,12 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &ChunkRelEditMin); AssertNoGlErrors; - v3 Mx = SimEditRect.Max - SimChunkMin; - BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &Mx); + v3 ChunkRelEditMax = SimEditRect.Max - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &ChunkRelEditMax); AssertNoGlErrors; + v3 EditDim = ChunkRelEditMax - ChunkRelEditMin; + switch (Layer->Settings.Type) { case BrushLayerType_Noise: @@ -485,7 +487,12 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case ShapeType_Cylinder: { auto Cylinder = &Shape->Cylinder; - BindUniformByName(&WorldEditRC->Program, "Axis", Cylinder->Axis); + shape_axis Axis = Cylinder->Axis; + if (Axis == ShapeAxis_InferFromMajorAxis) + { + Axis = ComputeShapeAxisFromEditDim(EditDim); + } + BindUniformByName(&WorldEditRC->Program, "Axis", Axis); BindUniformByName(&WorldEditRC->Program, "Radius", Cylinder->Radius); } break; From 7c75723ec0546341a921e3660b7ead9db216ebaa Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 20 May 2025 17:31:34 -0700 Subject: [PATCH 250/421] Improve layers UX further --- examples/terrain_gen/game.cpp | 1 - examples/terrain_gen/game_constants.h | 0 external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_ui_toggle.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/d_union_ui_render_command.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 2 +- .../do_editor_ui_for_compound_type_ray.h | 2 +- .../do_editor_ui_for_compound_type_rect3.h | 2 +- .../do_editor_ui_for_compound_type_rect3cp.h | 2 +- .../do_editor_ui_for_compound_type_rect3i.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 25 ++++ generated/do_editor_ui_for_enum_data_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- generated/do_editor_ui_for_enum_radio_enum.h | 6 +- generated/do_editor_ui_for_enum_shape_axis.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ..._editor_ui_for_enum_voxel_rule_direction.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 6 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 6 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 10 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 12 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 10 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 - generated/for_datatypes_fkubhsYl.h | 1 - generated/for_datatypes_kv3WBTai.h | 1 - generated/hashtable_struct_ui_toggle.h | 2 +- generated/hashtable_struct_window_layout.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- generated/maybe_ui_toggle.h | 2 +- generated/maybe_ui_toggle_ptr.h | 2 +- generated/maybe_window_layout.h | 2 +- generated/maybe_window_layout_ptr.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 4 +- ...group_for_bitfield_enum_terrain_gen_type.h | 34 ++--- ...on_group_for_bitfield_enum_ui_noise_type.h | 8 +- generated/string_and_value_tables_data_type.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ...nd_value_tables_ui_layer_toolbar_actions.h | 12 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 18 +-- generated/toolbar_for_enum_ui_brush_actions.h | 46 +++++-- .../toolbar_for_enum_ui_brush_layer_actions.h | 61 +++++++-- ...oolbar_for_enum_ui_layer_toolbar_actions.h | 47 +++++-- make.sh | 8 +- shaders/terrain/world_edit.fragmentshader | 14 +-- src/engine/editor.cpp | 119 ++++++++++++++---- src/engine/editor.h | 17 ++- 68 files changed, 385 insertions(+), 170 deletions(-) delete mode 100644 examples/terrain_gen/game_constants.h diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 24a7311cd..0e5528ef4 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -2,7 +2,6 @@ #include -#include "game_constants.h" #include "game_types.h" link_internal u32 diff --git a/examples/terrain_gen/game_constants.h b/examples/terrain_gen/game_constants.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 99c9cead3..340f22fdf 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 99c9cead334aefc3f94c5f5432471301dbdc724b +Subproject commit 340f22fdfc8b2d5c50a720b17f3cf1626d3d2474 diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 0a237071e..7cb87d232 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2424:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2426:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index af3c9fbb8..a2427a9fa 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3406:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3408:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 93fcad567..7507ab7f5 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2377:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2379:0 case type_ui_render_command_window_start: { diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 8e50d129f..593a764d7 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:800:0 +// src/engine/editor.h:813:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 582e7c15c..64af26e08 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1060:0 +// src/engine/editor.h:1073:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_ui_toggle.h b/generated/are_equal_ui_toggle.h index e0f1067f3..8e73588da 100644 --- a/generated/are_equal_ui_toggle.h +++ b/generated/are_equal_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:155:0 +// external/bonsai_stdlib/src/ui/ui.h:157:0 link_internal b32 AreEqual(ui_toggle *Thing1, ui_toggle *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index ff5b5c169..1e92215ba 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1170:0 +// src/engine/editor.h:1183:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index f6c97a991..560564506 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:635:0 +// src/engine/editor.h:648:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 2152c0642..e763836b6 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1186:0 +// src/engine/editor.h:1199:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 4a9ad6d9a..c0bd75e72 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1197:0 +// src/engine/editor.h:1210:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 734d7b714..bb7863ab3 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1189:0 +// src/engine/editor.h:1202:0 diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index ffa132869..218b23379 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:872:0 +// external/bonsai_stdlib/src/ui/ui.h:880:0 enum ui_render_command_type { diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index a603c12b6..56b199963 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1013:0 +// src/engine/editor.h:1026:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index a4c44024c..904582c9d 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:641:0 +// src/engine/editor.h:654:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index 72e75fd46..13ec34a04 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:638:0 +// src/engine/editor.h:651:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index 4e9e3d4bb..c6bbda633 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:626:0 +// src/engine/editor.h:639:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index b66aecde6..a54bd34a0 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:632:0 +// src/engine/editor.h:645:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 72433050f..09c72a245 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:629:0 +// src/engine/editor.h:642:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index bae9cebf1..30f73548b 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -173,6 +173,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("LogClickEvents"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->LogClickEvents), + MemberName, + Params + ); + + + + + + + } PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 719768ddc..d8908be8e 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:617:0 +// src/engine/editor.h:630:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 4760d3091..355651360 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:612:0 +// src/engine/editor.h:625:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_radio_enum.h b/generated/do_editor_ui_for_enum_radio_enum.h index 36900b1b7..a51b3334d 100644 --- a/generated/do_editor_ui_for_enum_radio_enum.h +++ b/generated/do_editor_ui_for_enum_radio_enum.h @@ -18,9 +18,9 @@ RadioButtonGroup_radio_enum( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Foo"), UiId(Window, Cast(void*, Element), Cast(void*, "radio_enum RadioEnum_Foo")), RadioEnum_Foo }, - { CSz("Bar"), UiId(Window, Cast(void*, Element), Cast(void*, "radio_enum RadioEnum_Bar")), RadioEnum_Bar }, - { CSz("Baz"), UiId(Window, Cast(void*, Element), Cast(void*, "radio_enum RadioEnum_Baz")), RadioEnum_Baz }, + { CSz("Foo"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "radio_enum RadioEnum_Foo")), RadioEnum_Foo }, + { CSz("Bar"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "radio_enum RadioEnum_Bar")), RadioEnum_Bar }, + { CSz("Baz"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "radio_enum RadioEnum_Baz")), RadioEnum_Baz }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/do_editor_ui_for_enum_shape_axis.h b/generated/do_editor_ui_for_enum_shape_axis.h index fbe455af2..a1570cd7b 100644 --- a/generated/do_editor_ui_for_enum_shape_axis.h +++ b/generated/do_editor_ui_for_enum_shape_axis.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:620:0 +// src/engine/editor.h:633:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 99e57f876..07659976f 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:670:0 +// src/engine/editor.h:683:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_voxel_rule_direction.h b/generated/do_editor_ui_for_enum_voxel_rule_direction.h index 816272b4e..1010b79ba 100644 --- a/generated/do_editor_ui_for_enum_voxel_rule_direction.h +++ b/generated/do_editor_ui_for_enum_voxel_rule_direction.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:623:0 +// src/engine/editor.h:636:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 55e9a296b..a323deae9 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:828:0 +// src/engine/editor.h:841:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) @@ -18,8 +18,8 @@ RadioButtonGroup_asset_window_view_mode( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("AssetFiles"), UiId(Window, Cast(void*, Element), Cast(void*, "asset_window_view_mode AssetWindowViewMode_AssetFiles")), AssetWindowViewMode_AssetFiles }, - { CSz("AssetTable"), UiId(Window, Cast(void*, Element), Cast(void*, "asset_window_view_mode AssetWindowViewMode_AssetTable")), AssetWindowViewMode_AssetTable }, + { CSz("AssetFiles"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "asset_window_view_mode AssetWindowViewMode_AssetFiles")), AssetWindowViewMode_AssetFiles }, + { CSz("AssetTable"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "asset_window_view_mode AssetWindowViewMode_AssetTable")), AssetWindowViewMode_AssetTable }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 74b84b0fd..79044c70f 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1029:0 +// src/engine/editor.h:1042:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) @@ -18,8 +18,8 @@ RadioButtonGroup_brush_layer_type( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Noise"), UiId(Window, Cast(void*, Element), Cast(void*, "brush_layer_type BrushLayerType_Noise")), BrushLayerType_Noise }, - { CSz("Shape"), UiId(Window, Cast(void*, Element), Cast(void*, "brush_layer_type BrushLayerType_Shape")), BrushLayerType_Shape }, + { CSz("Noise"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "brush_layer_type BrushLayerType_Noise")), BrushLayerType_Noise }, + { CSz("Shape"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "brush_layer_type BrushLayerType_Shape")), BrushLayerType_Shape }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 5a599eb72..67bda9a54 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:834:0 +// src/engine/editor.h:847:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) @@ -18,10 +18,10 @@ RadioButtonGroup_world_edit_blend_mode( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Additive"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Additive")), WorldEdit_Mode_Additive }, - { CSz("Subtractive"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Subtractive")), WorldEdit_Mode_Subtractive }, - { CSz("Threshold"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Threshold")), WorldEdit_Mode_Threshold }, - { CSz("Disabled"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Disabled")), WorldEdit_Mode_Disabled }, + { CSz("Additive"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Additive")), WorldEdit_Mode_Additive }, + { CSz("Subtractive"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Subtractive")), WorldEdit_Mode_Subtractive }, + { CSz("Threshold"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Threshold")), WorldEdit_Mode_Threshold }, + { CSz("Disabled"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Disabled")), WorldEdit_Mode_Disabled }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index df061bc5a..c57c7752a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:817:0 +// src/engine/editor.h:830:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 643245011..cae2bf289 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:846:0 +// src/engine/editor.h:859:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) @@ -18,11 +18,11 @@ RadioButtonGroup_world_edit_brush_type( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Disabled"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Disabled")), WorldEdit_BrushType_Disabled }, - { CSz("Single"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Single")), WorldEdit_BrushType_Single }, - { CSz("Asset"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Asset")), WorldEdit_BrushType_Asset }, - { CSz("Entity"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Entity")), WorldEdit_BrushType_Entity }, - { CSz("Layered"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Layered")), WorldEdit_BrushType_Layered }, + { CSz("Disabled"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Disabled")), WorldEdit_BrushType_Disabled }, + { CSz("Single"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Single")), WorldEdit_BrushType_Single }, + { CSz("Asset"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Asset")), WorldEdit_BrushType_Asset }, + { CSz("Entity"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Entity")), WorldEdit_BrushType_Entity }, + { CSz("Layered"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Layered")), WorldEdit_BrushType_Layered }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 6211fdb8c..0f355cf00 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:839:0 +// src/engine/editor.h:852:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 064f44a94..cd0e6b84a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:843:0 +// src/engine/editor.h:856:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) @@ -18,10 +18,10 @@ RadioButtonGroup_world_edit_tool( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Disabled"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Disabled")), WorldEdit_Tool_Disabled }, - { CSz("Select"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Select")), WorldEdit_Tool_Select }, - { CSz("Eyedropper"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Eyedropper")), WorldEdit_Tool_Eyedropper }, - { CSz("BlitEntity"), UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_BlitEntity")), WorldEdit_Tool_BlitEntity }, + { CSz("Disabled"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Disabled")), WorldEdit_Tool_Disabled }, + { CSz("Select"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Select")), WorldEdit_Tool_Select }, + { CSz("Eyedropper"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Eyedropper")), WorldEdit_Tool_Eyedropper }, + { CSz("BlitEntity"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_BlitEntity")), WorldEdit_Tool_BlitEntity }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index 7af43eeb2..f86346e3b 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:487:0 +// src/engine/editor.h:500:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index ac8669ebb..b84619cb0 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:599:0 +// src/engine/editor.h:612:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 33d104765..0f0183b36 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -223,7 +223,6 @@ - struct render_to_texture_async_params; diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index f7010f20a..b2c398d2d 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -223,7 +223,6 @@ - render_to_texture_async_params render_to_texture_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 99c0304a3..9e0f11018 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -223,7 +223,6 @@ - type_render_to_texture_async_params, diff --git a/generated/hashtable_struct_ui_toggle.h b/generated/hashtable_struct_ui_toggle.h index f53968191..acd84e5b4 100644 --- a/generated/hashtable_struct_ui_toggle.h +++ b/generated/hashtable_struct_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:243:0 +// external/bonsai_stdlib/src/ui/ui.h:246:0 struct ui_toggle_linked_list_node { diff --git a/generated/hashtable_struct_window_layout.h b/generated/hashtable_struct_window_layout.h index 601f5f1ae..36e24976b 100644 --- a/generated/hashtable_struct_window_layout.h +++ b/generated/hashtable_struct_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:144:0 +// external/bonsai_stdlib/src/ui/ui.h:146:0 struct window_layout_linked_list_node { diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 95d4f748f..fdd67f93a 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1173:0 +// src/engine/editor.h:1186:0 struct world_edit_brush_linked_list_node { diff --git a/generated/maybe_ui_toggle.h b/generated/maybe_ui_toggle.h index efe976588..9412c50d0 100644 --- a/generated/maybe_ui_toggle.h +++ b/generated/maybe_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:237:0 +// external/bonsai_stdlib/src/ui/ui.h:240:0 struct maybe_ui_toggle { diff --git a/generated/maybe_ui_toggle_ptr.h b/generated/maybe_ui_toggle_ptr.h index 1048cbf1d..4c1db3cf4 100644 --- a/generated/maybe_ui_toggle_ptr.h +++ b/generated/maybe_ui_toggle_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:240:0 +// external/bonsai_stdlib/src/ui/ui.h:243:0 struct maybe_ui_toggle_ptr { diff --git a/generated/maybe_window_layout.h b/generated/maybe_window_layout.h index 8db67d8a1..00545c037 100644 --- a/generated/maybe_window_layout.h +++ b/generated/maybe_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:138:0 +// external/bonsai_stdlib/src/ui/ui.h:140:0 struct maybe_window_layout { diff --git a/generated/maybe_window_layout_ptr.h b/generated/maybe_window_layout_ptr.h index 2a63b683c..93f048b73 100644 --- a/generated/maybe_window_layout_ptr.h +++ b/generated/maybe_window_layout_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:141:0 +// external/bonsai_stdlib/src/ui/ui.h:143:0 struct maybe_window_layout_ptr { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 0c701f213..801ec8120 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:656:0 +// src/engine/editor.h:669:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, level_editor_flags Selection) @@ -18,7 +18,7 @@ RadioButtonGroup_level_editor_flags( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Noop"), UiId(Window, Cast(void*, Element), Cast(void*, "level_editor_flags LevelEditorFlags_Noop")), LevelEditorFlags_Noop }, + { CSz("Noop"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "level_editor_flags LevelEditorFlags_Noop")), LevelEditorFlags_Noop }, }; diff --git a/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h b/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h index b8b1e725b..533f122da 100644 --- a/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h +++ b/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h @@ -18,23 +18,23 @@ RadioButtonGroup_terrain_gen_type( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Flat"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Flat")), TerrainGenType_Flat }, - { CSz("Checkerboard"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Checkerboard")), TerrainGenType_Checkerboard }, - { CSz("SinCos"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_SinCos")), TerrainGenType_SinCos }, - { CSz("Voronoi"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Voronoi")), TerrainGenType_Voronoi }, - { CSz("Perlin2D"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Perlin2D")), TerrainGenType_Perlin2D }, - { CSz("Perlin3D"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Perlin3D")), TerrainGenType_Perlin3D }, - { CSz("FBM2D"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_FBM2D")), TerrainGenType_FBM2D }, - { CSz("TerracedTerrain"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_TerracedTerrain")), TerrainGenType_TerracedTerrain }, - { CSz("GrassyTerracedTerrain"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyTerracedTerrain")), TerrainGenType_GrassyTerracedTerrain }, - { CSz("GrassyLargeTerracedTerrain"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyLargeTerracedTerrain")), TerrainGenType_GrassyLargeTerracedTerrain }, - { CSz("GrassyTerracedTerrain2"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyTerracedTerrain2")), TerrainGenType_GrassyTerracedTerrain2 }, - { CSz("GrassyTerracedTerrain3"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyTerracedTerrain3")), TerrainGenType_GrassyTerracedTerrain3 }, - { CSz("GrassyTerracedTerrain4"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyTerracedTerrain4")), TerrainGenType_GrassyTerracedTerrain4 }, - { CSz("GrassyIsland"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyIsland")), TerrainGenType_GrassyIsland }, - { CSz("Hoodoo"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Hoodoo")), TerrainGenType_Hoodoo }, - { CSz("Warped"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Warped")), TerrainGenType_Warped }, - { CSz("Debug"), UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Debug")), TerrainGenType_Debug }, + { CSz("Flat"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Flat")), TerrainGenType_Flat }, + { CSz("Checkerboard"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Checkerboard")), TerrainGenType_Checkerboard }, + { CSz("SinCos"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_SinCos")), TerrainGenType_SinCos }, + { CSz("Voronoi"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Voronoi")), TerrainGenType_Voronoi }, + { CSz("Perlin2D"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Perlin2D")), TerrainGenType_Perlin2D }, + { CSz("Perlin3D"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Perlin3D")), TerrainGenType_Perlin3D }, + { CSz("FBM2D"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_FBM2D")), TerrainGenType_FBM2D }, + { CSz("TerracedTerrain"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_TerracedTerrain")), TerrainGenType_TerracedTerrain }, + { CSz("GrassyTerracedTerrain"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyTerracedTerrain")), TerrainGenType_GrassyTerracedTerrain }, + { CSz("GrassyLargeTerracedTerrain"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyLargeTerracedTerrain")), TerrainGenType_GrassyLargeTerracedTerrain }, + { CSz("GrassyTerracedTerrain2"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyTerracedTerrain2")), TerrainGenType_GrassyTerracedTerrain2 }, + { CSz("GrassyTerracedTerrain3"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyTerracedTerrain3")), TerrainGenType_GrassyTerracedTerrain3 }, + { CSz("GrassyTerracedTerrain4"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyTerracedTerrain4")), TerrainGenType_GrassyTerracedTerrain4 }, + { CSz("GrassyIsland"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_GrassyIsland")), TerrainGenType_GrassyIsland }, + { CSz("Hoodoo"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Hoodoo")), TerrainGenType_Hoodoo }, + { CSz("Warped"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Warped")), TerrainGenType_Warped }, + { CSz("Debug"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "terrain_gen_type TerrainGenType_Debug")), TerrainGenType_Debug }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index c9a7bb8e7..9a2bbe47f 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:668:0 +// src/engine/editor.h:681:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) @@ -18,9 +18,9 @@ RadioButtonGroup_ui_noise_type( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Perlin"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_Perlin")), NoiseType_Perlin }, - { CSz("Voronoi"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_Voronoi")), NoiseType_Voronoi }, - { CSz("White"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_White")), NoiseType_White }, + { CSz("Perlin"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_Perlin")), NoiseType_Perlin }, + { CSz("Voronoi"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_Voronoi")), NoiseType_Voronoi }, + { CSz("White"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_White")), NoiseType_White }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index d6a657cbd..77fd29dd9 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:615:0 +// src/engine/editor.h:628:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 83ebf09ec..56b570267 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1027:0 +// src/engine/editor.h:1040:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index 284b52e5f..03fd8a32b 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:610:0 +// src/engine/editor.h:623:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 16ebc76c8..79c6b51bd 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:969:0 +// src/engine/editor.h:982:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_layer_toolbar_actions.h b/generated/string_and_value_tables_ui_layer_toolbar_actions.h index 9c79d4ea0..806614d7c 100644 --- a/generated/string_and_value_tables_ui_layer_toolbar_actions.h +++ b/generated/string_and_value_tables_ui_layer_toolbar_actions.h @@ -6,10 +6,10 @@ ToStringPrefixless(ui_layer_toolbar_actions Type) counted_string Result = {}; switch (Type) { - case LayerToolbarActions_New: { Result = CSz("New"); } break; - case LayerToolbarActions_Delete: { Result = CSz("Delete"); } break; + case LayerToolbarActions_NoAction: { Result = CSz("NoAction"); } break; case LayerToolbarActions_Rename: { Result = CSz("Rename"); } break; case LayerToolbarActions_Duplicate: { Result = CSz("Duplicate"); } break; + case LayerToolbarActions_Delete: { Result = CSz("Delete"); } break; } @@ -23,10 +23,10 @@ ToString(ui_layer_toolbar_actions Type) counted_string Result = {}; switch (Type) { - case LayerToolbarActions_New: { Result = CSz("LayerToolbarActions_New"); } break; - case LayerToolbarActions_Delete: { Result = CSz("LayerToolbarActions_Delete"); } break; + case LayerToolbarActions_NoAction: { Result = CSz("LayerToolbarActions_NoAction"); } break; case LayerToolbarActions_Rename: { Result = CSz("LayerToolbarActions_Rename"); } break; case LayerToolbarActions_Duplicate: { Result = CSz("LayerToolbarActions_Duplicate"); } break; + case LayerToolbarActions_Delete: { Result = CSz("LayerToolbarActions_Delete"); } break; } @@ -39,10 +39,10 @@ UiLayerToolbarActions(counted_string S) { ui_layer_toolbar_actions Result = {}; - if (StringsMatch(S, CSz("LayerToolbarActions_New"))) { return LayerToolbarActions_New; } - if (StringsMatch(S, CSz("LayerToolbarActions_Delete"))) { return LayerToolbarActions_Delete; } + if (StringsMatch(S, CSz("LayerToolbarActions_NoAction"))) { return LayerToolbarActions_NoAction; } if (StringsMatch(S, CSz("LayerToolbarActions_Rename"))) { return LayerToolbarActions_Rename; } if (StringsMatch(S, CSz("LayerToolbarActions_Duplicate"))) { return LayerToolbarActions_Duplicate; } + if (StringsMatch(S, CSz("LayerToolbarActions_Delete"))) { return LayerToolbarActions_Delete; } return Result; } diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 710896a53..24a2846ef 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:666:0 +// src/engine/editor.h:679:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 9b62e464c..f9a8e9b22 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:831:0 +// src/engine/editor.h:844:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 2ac1f9d4e..d6b3ad15e 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:814:0 +// src/engine/editor.h:827:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 96c0f5ad3..57fb92807 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:837:0 +// src/engine/editor.h:850:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index e5ec56eed..5fec9a15e 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:700:0 +// src/engine/editor.h:713:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 8a770bb62..562f110af 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:823:0 +// src/engine/editor.h:836:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, @@ -10,14 +10,14 @@ ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("Level"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Level")), EngineDebugViewMode_Level }, - { CSz("WorldEdit"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_WorldEdit")), EngineDebugViewMode_WorldEdit }, - { CSz("Entities"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Entities")), EngineDebugViewMode_Entities }, - { CSz("Assets"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Assets")), EngineDebugViewMode_Assets }, - { CSz("WorldChunks"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_WorldChunks")), EngineDebugViewMode_WorldChunks }, - { CSz("Textures"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Textures")), EngineDebugViewMode_Textures }, - { CSz("RenderSettings"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_RenderSettings")), EngineDebugViewMode_RenderSettings }, - { CSz("EngineDebug"), UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_EngineDebug")), EngineDebugViewMode_EngineDebug }, + { CSz("Level"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Level")), EngineDebugViewMode_Level }, + { CSz("WorldEdit"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_WorldEdit")), EngineDebugViewMode_WorldEdit }, + { CSz("Entities"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Entities")), EngineDebugViewMode_Entities }, + { CSz("Assets"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Assets")), EngineDebugViewMode_Assets }, + { CSz("WorldChunks"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_WorldChunks")), EngineDebugViewMode_WorldChunks }, + { CSz("Textures"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Textures")), EngineDebugViewMode_Textures }, + { CSz("RenderSettings"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_RenderSettings")), EngineDebugViewMode_RenderSettings }, + { CSz("EngineDebug"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_EngineDebug")), EngineDebugViewMode_EngineDebug }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/toolbar_for_enum_ui_brush_actions.h b/generated/toolbar_for_enum_ui_brush_actions.h index 196d1d64a..7d3ad2057 100644 --- a/generated/toolbar_for_enum_ui_brush_actions.h +++ b/generated/toolbar_for_enum_ui_brush_actions.h @@ -18,10 +18,10 @@ RadioButtonGroup_ui_brush_actions( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("NoAction"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_NoAction")), UiBrushAction_NoAction }, - { CSz("New"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_New")), UiBrushAction_New }, - { CSz("Save"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Save")), UiBrushAction_Save }, - { CSz("Duplicate"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Duplicate")), UiBrushAction_Duplicate }, + { CSz("NoAction"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_NoAction")), UiBrushAction_NoAction }, + { CSz("New"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_New")), UiBrushAction_New }, + { CSz("Save"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Save")), UiBrushAction_Save }, + { CSz("Duplicate"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Duplicate")), UiBrushAction_Duplicate }, }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -49,9 +49,41 @@ PushToolbar( renderer_2d *Ui, ui_toggle_button_handle ButtonHandles[] = { - {CSz("New"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_New"), Cast(void*, Index)), UiBrushAction_New }, - {CSz("Save"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Save"), Cast(void*, Index)), UiBrushAction_Save }, - {CSz("Duplicate"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Duplicate"), Cast(void*, Index)), UiBrushAction_Duplicate }, + { + CSz("New"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_actions UiBrushAction_New"), + Cast(void*, Index) + ), + UiBrushAction_New, + }, + + { + CSz("Save"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_actions UiBrushAction_Save"), + Cast(void*, Index) + ), + UiBrushAction_Save, + }, + + { + CSz("Duplicate"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_actions UiBrushAction_Duplicate"), + Cast(void*, Index) + ), + UiBrushAction_Duplicate, + }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/toolbar_for_enum_ui_brush_layer_actions.h b/generated/toolbar_for_enum_ui_brush_layer_actions.h index c72a30c38..a3fdd563e 100644 --- a/generated/toolbar_for_enum_ui_brush_layer_actions.h +++ b/generated/toolbar_for_enum_ui_brush_layer_actions.h @@ -18,11 +18,11 @@ RadioButtonGroup_ui_brush_layer_actions( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("NoAction"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_NoAction")), UiBrushLayerAction_NoAction }, - { CSz("MoveUp"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveUp")), UiBrushLayerAction_MoveUp }, - { CSz("MoveDown"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveDown")), UiBrushLayerAction_MoveDown }, - { CSz("Duplicate"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Duplicate")), UiBrushLayerAction_Duplicate }, - { CSz("Delete"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Delete")), UiBrushLayerAction_Delete }, + { CSz("NoAction"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_NoAction")), UiBrushLayerAction_NoAction }, + { CSz("MoveUp"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveUp")), UiBrushLayerAction_MoveUp }, + { CSz("MoveDown"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveDown")), UiBrushLayerAction_MoveDown }, + { CSz("Duplicate"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Duplicate")), UiBrushLayerAction_Duplicate }, + { CSz("Delete"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Delete")), UiBrushLayerAction_Delete }, }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -50,10 +50,53 @@ PushToolbar( renderer_2d *Ui, ui_toggle_button_handle ButtonHandles[] = { - {CSz("MoveUp"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveUp"), Cast(void*, Index)), UiBrushLayerAction_MoveUp }, - {CSz("MoveDown"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveDown"), Cast(void*, Index)), UiBrushLayerAction_MoveDown }, - {CSz("Duplicate"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Duplicate"), Cast(void*, Index)), UiBrushLayerAction_Duplicate }, - {CSz("Delete"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Delete"), Cast(void*, Index)), UiBrushLayerAction_Delete }, + { + CSz("MoveUp"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveUp"), + Cast(void*, Index) + ), + UiBrushLayerAction_MoveUp, + }, + + { + CSz("MoveDown"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveDown"), + Cast(void*, Index) + ), + UiBrushLayerAction_MoveDown, + }, + + { + CSz("Duplicate"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Duplicate"), + Cast(void*, Index) + ), + UiBrushLayerAction_Duplicate, + }, + + { + CSz("Delete"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Delete"), + Cast(void*, Index) + ), + UiBrushLayerAction_Delete, + }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h index 1d93226c8..3cedf6972 100644 --- a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h +++ b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h @@ -18,10 +18,10 @@ RadioButtonGroup_ui_layer_toolbar_actions( renderer_2d *Ui, { ui_toggle_button_handle ButtonHandles[] = { - { CSz("New"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_New")), LayerToolbarActions_New }, - { CSz("Delete"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete")), LayerToolbarActions_Delete }, - { CSz("Rename"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename")), LayerToolbarActions_Rename }, - { CSz("Duplicate"), UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Duplicate")), LayerToolbarActions_Duplicate }, + { CSz("NoAction"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_NoAction")), LayerToolbarActions_NoAction }, + { CSz("Rename"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename")), LayerToolbarActions_Rename }, + { CSz("Duplicate"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Duplicate")), LayerToolbarActions_Duplicate }, + { CSz("Delete"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete")), LayerToolbarActions_Delete }, }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -49,10 +49,41 @@ PushToolbar( renderer_2d *Ui, ui_toggle_button_handle ButtonHandles[] = { - {CSz("New"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_New"), Cast(void*, Index)), LayerToolbarActions_New }, - {CSz("Delete"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete"), Cast(void*, Index)), LayerToolbarActions_Delete }, - {CSz("Rename"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename"), Cast(void*, Index)), LayerToolbarActions_Rename }, - {CSz("Duplicate"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Duplicate"), Cast(void*, Index)), LayerToolbarActions_Duplicate }, + { + CSz("R"), + CSz("Rename"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename"), + Cast(void*, Index) + ), + LayerToolbarActions_Rename, + }, + + { + CSz("D"), + CSz("Duplicate"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Duplicate"), + Cast(void*, Index) + ), + LayerToolbarActions_Duplicate, + }, + + { + CSz("X"), + CSz("Delete"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete"), + Cast(void*, Index) + ), + LayerToolbarActions_Delete, + }, }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/make.sh b/make.sh index fed4d9334..6e70dec7d 100755 --- a/make.sh +++ b/make.sh @@ -324,8 +324,8 @@ function RunPoof # [ -d src/generated ] && rm -Rf src/generated # [ -d generated ] && rm -Rf generated - RunPoofHelper examples/ui_test/game.cpp && echo -e "$Success poofed examples/ui_test/game.cpp" & - TrackPid "" $! + # RunPoofHelper examples/ui_test/game.cpp && echo -e "$Success poofed examples/ui_test/game.cpp" & + # TrackPid "" $! # RunPoofHelper src/game_loader.cpp && echo -e "$Success poofed src/game_loader.cpp" & # TrackPid "" $! @@ -333,8 +333,8 @@ function RunPoof # RunPoofHelper examples/turn_based/game.cpp && echo -e "$Success poofed examples/turn_based/game.cpp" & # TrackPid "" $! - # RunPoofHelper examples/terrain_gen/game.cpp && echo -e "$Success poofed examples/terrain_gen/game.cpp" & - # TrackPid "" $! + RunPoofHelper examples/terrain_gen/game.cpp && echo -e "$Success poofed examples/terrain_gen/game.cpp" & + TrackPid "" $! # RunPoofHelper examples/the_wanderer/game.cpp && echo -e "$Success poofed examples/the_wanderer/game.cpp" & # TrackPid "" $! diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 742e47498..fa3c310d9 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -126,7 +126,7 @@ void main() // ShapeType_Sphere case 1: { - f32 Dist = distance(ChunkRelLocation, xyz); + f32 Dist = 0.5f+distance(ChunkRelLocation, xyz); if (Dist < Radius) { NoiseSample = ((Radius-Dist)/Radius)*Power; } } break; @@ -216,14 +216,14 @@ void main() if (ThisCell < 0.f) { // only consider cells that are air - s32 IsSurface = s32(ThisCell < sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(1, 0), 0).a)); - IsSurface |= s32(ThisCell < sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(1, 0), 0).a)); + s32 IsSurface = s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(1, 0), 0).a ) > 0.f); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(1, 0), 0).a ) > 0.f); - IsSurface |= s32(ThisCell < sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 1), 0).a)); - IsSurface |= s32(ThisCell < sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 1), 0).a)); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 1), 0).a ) > 0.f); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 1), 0).a ) > 0.f); - IsSurface |= s32(ThisCell < sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 66), 0).a)); - IsSurface |= s32(ThisCell < sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 66), 0).a)); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 66), 0).a) > 0.f); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 66), 0).a) > 0.f); if (IsSurface == 0) { NoiseSample = 0.f; ColorSample = V3(0,0,0); } } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 5b5c134a0..069a3db95 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2406,6 +2406,7 @@ DoColorPickerToggle(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 Sho PushNewRow(Ui); } +#if 0 link_internal void ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowColorSwatch /* = True */) { @@ -2423,6 +2424,7 @@ ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowC PushNewRow(Ui); } } +#endif link_internal b32 CheckSettingsChanged(layered_brush *Brush) @@ -2954,14 +2956,17 @@ DoWorldEditor(engine_resources *Engine) if (Input->Ctrl.Pressed && Input->S.Clicked) { - Editor->PreviousTool = Editor->Tool; - Editor->Tool = WorldEdit_Tool_Select; - ResetSelection(Editor); + if (Editor->CurrentLayer) + { + Editor->PreviousTool = Editor->Tool; + Editor->Tool = WorldEdit_Tool_Select; + ResetSelection(Editor); - Editor->CurrentEdit = Push(&Editor->CurrentLayer->Edits); - Editor->CurrentEdit->Ordinal = Editor->NextEditOrdinal++; + Editor->CurrentEdit = Push(&Editor->CurrentLayer->Edits); + Editor->CurrentEdit->Ordinal = Editor->NextEditOrdinal++; - Editor->CurrentEdit->Brush = Editor->CurrentBrush; + Editor->CurrentEdit->Brush = Editor->CurrentBrush; + } } #if 0 @@ -3047,7 +3052,9 @@ DoWorldEditor(engine_resources *Engine) if (Edit->Brush == Editor->CurrentBrush) { - UpdateWorldEditBounds(Engine, Edit, Editor->Selection.Region, GetTranArena()); + // TODO(Jesse): We should be able to just mark the overlapping + // nodes dirty because we're not actually updating the edit bounds here.. + UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); } } } @@ -3058,11 +3065,12 @@ DoWorldEditor(engine_resources *Engine) } { - local_persist window_layout AllEditsWindow = WindowLayout("Layers", WindowLayoutFlag_Align_Bottom); - PushWindowStart(Ui, &AllEditsWindow); + local_persist window_layout LayersWindow = WindowLayout("Layers", WindowLayoutFlag_Align_Bottom); + PushWindowStart(Ui, &LayersWindow); - ui_toggle_button_group Toolbar = PushToolbar(Ui, &AllEditsWindow, {}, &Ui->LayerToolbarAction); +#if 0 + ui_toggle_button_group Toolbar = PushToolbar(Ui, &LayersWindow, {}, &Ui->LayerToolbarAction); if (Toolbar.AnyElementClicked) { @@ -3089,7 +3097,7 @@ DoWorldEditor(engine_resources *Engine) { if (Editor->CurrentLayer) { - ui_id Id = UiId(&AllEditsWindow, "rename current layer", Editor->CurrentLayer->NameBuf); + ui_id Id = UiId(&LayersWindow, "rename current layer", Editor->CurrentLayer->NameBuf); TextBox(Ui, {}, CS(Editor->CurrentLayer->NameBuf), NameBuf_Len, Id); } } break; @@ -3119,6 +3127,14 @@ DoWorldEditor(engine_resources *Engine) } break; } } +#endif + if (Button(Ui, CSz("New Layer"), UiId(&LayersWindow, "new layer", 0ull))) + { + NewLayer(Editor); + } + + PushNewRow(Ui); + PushNewRow(Ui); PushTableStart(Ui); IterateOver(&Editor->Layers, Layer, LayerIndex) @@ -3126,18 +3142,76 @@ DoWorldEditor(engine_resources *Engine) cs Name = CS(Layer->NameBuf); b32 Selected = Editor->CurrentLayer == Layer; - ui_style *Style = Selected ? &DefaultSelectedStyle : &DefaultStyle; - if (Button(Ui, Name, UiId(&AllEditsWindow, Layer, Layer), Style)) + PushTableStart(Ui); { - Editor->CurrentLayer = Layer; + ui_style *Style = Selected ? &DefaultSelectedStyle : &DefaultStyle; + if (Button(Ui, Name, UiId(&LayersWindow, Layer, Layer), Style)) + { + Editor->CurrentLayer = Layer; + } + + ui_layer_toolbar_actions LayerToolbarAction = {}; + ui_toggle_button_group Toolbar = PushToolbar(Ui, &LayersWindow, {}, &LayerToolbarAction, u64(Layer)); + if (Toolbar.AnyElementClicked) + { + switch (LayerToolbarAction) + { + case LayerToolbarActions_NoAction: {} break; + + case LayerToolbarActions_Rename: + { + } break; + + case LayerToolbarActions_Duplicate: + { + auto SrcLayer = Editor->CurrentLayer; + auto DstLayer = NewLayer(Editor); + + IterateOver(&SrcLayer->Edits, Edit, EditIndex) + { + if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + + auto *Duplicated = NewEdit(DstLayer); + *Duplicated = *Edit; + Duplicated->Ordinal = Editor->NextEditOrdinal++; + + ApplyEditToOctree(Engine, Duplicated, GetTranArena()); + + if (Editor->CurrentEdit == Edit) + { + Editor->CurrentEdit = Duplicated; + } + } + } break; + + case LayerToolbarActions_Delete: + { + IterateOver(&Layer->Edits, Edit, EditIndex) + { + if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + + DropEditFromOctree(Engine, Edit, GetTranArena()); + } + RemoveOrdered(&Editor->Layers, Layer); + Editor->CurrentLayer = 0; + } break; + } + } + } + PushTableEnd(Ui); - /* if (ToggleButton(Ui, Name, Name, UiId(&AllEditsWindow, Layer, Layer), &DefaultSelectedStyle)) */ + auto I = AtElements(&Layer->Edits); + if (GetIndex(&I) == 0) { + PushColumn(Ui, CSz("--- no edits ---")); PushNewRow(Ui); + } - sort_key_buffer Keys = GetEditsSortedByOrdianl(&Layer->Edits, GetTranArena()); + PushTableStart(Ui); + { + sort_key_buffer Keys = GetEditsSortedByOrdianl(&Layer->Edits, GetTranArena()); IterateOver(&Keys, Key, KeyIndex) { world_edit *Edit = Cast(world_edit*, Key->Index); @@ -3151,7 +3225,7 @@ DoWorldEditor(engine_resources *Engine) Params.FStyle = &DefaultSelectedStyle; } - auto EditSelectButton = PushSimpleButton(Ui, FSz("(%d)(%d) (%s)", KeyIndex, Key->Value, NameBuf), UiId(&AllEditsWindow, "edit select", Edit), &Params); + auto EditSelectButton = PushSimpleButton(Ui, FSz("(%d)(%d) (%s)", KeyIndex, Key->Value, NameBuf), UiId(&LayersWindow, "edit select", Edit), &Params); if (Clicked(Ui, &EditSelectButton)) { Editor->Selection.Clicks = 2; @@ -3173,9 +3247,9 @@ DoWorldEditor(engine_resources *Engine) Editor->HotEdit = Edit; } - ui_id SetBrushEditId = UiId(&AllEditsWindow, "edit set_brush", Edit); - ui_id DupEditId = UiId(&AllEditsWindow, "edit duplicate", Edit); - ui_id DelEditId = UiId(&AllEditsWindow, "edit delete", Edit); + ui_id SetBrushEditId = UiId(&LayersWindow, "edit set_brush", Edit); + ui_id DupEditId = UiId(&LayersWindow, "edit duplicate", Edit); + ui_id DelEditId = UiId(&LayersWindow, "edit delete", Edit); if (Hover(Ui, &SetBrushEditId)) { PushTooltip(Ui, CSz("Set Brush")); } if (Hover(Ui, &DupEditId)) { PushTooltip(Ui, CSz("Duplicatate")); } @@ -3213,13 +3287,13 @@ DoWorldEditor(engine_resources *Engine) PushNewRow(Ui); } } - + PushTableEnd(Ui); PushNewRow(Ui); } PushNewRow(Ui); PushTableEnd(Ui); - PushWindowEnd(Ui, &AllEditsWindow); + PushWindowEnd(Ui, &LayersWindow); } @@ -3327,6 +3401,7 @@ ApplyEditBufferToOctree(engine_resources *Engine, world_edit_paged_list *Edits) { IterateOver(Edits, Edit, EditIndex) { + if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } ApplyEditToOctree(Engine, Edit, GetTranArena()); } } diff --git a/src/engine/editor.h b/src/engine/editor.h index 714a8d034..12baa4cda 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -60,7 +60,7 @@ poof( { enum_t.map(enum_v) { - { CSz("enum_v.name.strip_all_prefix"), UiId(Window, Cast(void*, Element), Cast(void*, "enum_t.name enum_v.name")), enum_v.name }, + { CSz("enum_v.name.strip_all_prefix"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "enum_t.name enum_v.name")), enum_v.name }, } }; @@ -131,7 +131,20 @@ poof( { enum_t.map(enum_v) { - enum_v.has_tag(ui_skip)?{} { {CSz("enum_v.name.strip_all_prefix"), UiId(Cast(void*, Window), Cast(void*, Element), Cast(void*, "enum_t.name enum_v.name"), Cast(void*, Index)), enum_v.name }, } + enum_v.has_tag(ui_skip)?{} + { + { + enum_v.has_tag(ui_display_name)? {enum_v.tag_value(ui_display_name)} {CSz("enum_v.name.strip_all_prefix")}, + enum_v.has_tag(ui_display_name)? {CSz("enum_v.name.strip_all_prefix")} {{}}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "enum_t.name enum_v.name"), + Cast(void*, Index) + ), + enum_v.name, + }, + } } }; From 9564a729cb797bf8494a2a20f5814108d43af04d Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 20 May 2025 21:09:08 -0700 Subject: [PATCH 251/421] Move toolbar enums into bonsai from stdlib --- external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/d_union_ui_render_command.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_ray.h | 2 +- .../do_editor_ui_for_compound_type_rect3.h | 2 +- .../do_editor_ui_for_compound_type_rect3cp.h | 2 +- .../do_editor_ui_for_compound_type_rect3i.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 74 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_axis.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ..._editor_ui_for_enum_voxel_rule_direction.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/for_datatypes_kh9dwrCf.h | 837 ++++++++++++++++++ generated/hashtable_world_edit_brush.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- ...value_tables_enum_ui_brush_layer_actions.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_shape_axis.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ...string_and_value_tables_ui_brush_actions.h | 2 +- ...g_and_value_tables_ui_layer_edit_actions.h | 47 + ...nd_value_tables_ui_layer_toolbar_actions.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...ng_and_value_tables_voxel_rule_direction.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- generated/toolbar_for_enum_ui_brush_actions.h | 2 +- .../toolbar_for_enum_ui_brush_layer_actions.h | 2 +- .../toolbar_for_enum_ui_layer_edit_actions.h | 102 +++ ...oolbar_for_enum_ui_layer_toolbar_actions.h | 2 +- src/engine/editor.cpp | 116 ++- src/engine/editor.h | 54 +- 107 files changed, 1198 insertions(+), 234 deletions(-) create mode 100644 generated/for_datatypes_kh9dwrCf.h create mode 100644 generated/string_and_value_tables_ui_layer_edit_actions.h create mode 100644 generated/toolbar_for_enum_ui_layer_edit_actions.h diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 340f22fdf..f681e61d6 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 340f22fdfc8b2d5c50a720b17f3cf1626d3d2474 +Subproject commit f681e61d6b842b46b5c21f4e4ec55d63e1b424ac diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 7cb87d232..9f4bd672e 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2426:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2434:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index a2427a9fa..b132047c2 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3408:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3416:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 7507ab7f5..660a1329b 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2379:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2387:0 case type_ui_render_command_window_start: { diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 593a764d7..9925d4dbc 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:813:0 +// src/engine/editor.h:865:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 64af26e08..ad98b38b7 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1073:0 +// src/engine/editor.h:1125:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 1e92215ba..d0d47088f 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1183:0 +// src/engine/editor.h:1235:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 560564506..d1431f592 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:648:0 +// src/engine/editor.h:700:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index e763836b6..d4fbf0ddf 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1199:0 +// src/engine/editor.h:1251:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index c0bd75e72..751706b35 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1210:0 +// src/engine/editor.h:1262:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index bb7863ab3..f12f0f248 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1202:0 +// src/engine/editor.h:1254:0 diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 218b23379..0daf69567 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:880:0 +// external/bonsai_stdlib/src/ui/ui.h:850:0 enum ui_render_command_type { diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 56b199963..be65b3a79 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1026:0 +// src/engine/editor.h:1078:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index c6441e5c0..8c56c3ccb 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:458:0 +// src/engine/editor.cpp:456:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 5976f082c..28cc0a794 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:448:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 2008dfec8..873f248b1 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:367:0 +// src/engine/editor.cpp:365:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 72ba2f6c0..dd3848698 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:391:0 +// src/engine/editor.cpp:389:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 2b173f847..1bb084142 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:461:0 +// src/engine/editor.cpp:459:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 81dd90c7e..02ece16f0 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:508:0 +// src/engine/editor.cpp:506:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 571064f5c..0f0ec9182 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:529:0 +// src/engine/editor.cpp:527:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index c1f31c316..487565f8c 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:526:0 +// src/engine/editor.cpp:524:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 7f94149d9..3e0943dc2 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:430:0 +// src/engine/editor.cpp:428:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 8227b8c2e..5b0563f63 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:427:0 +// src/engine/editor.cpp:425:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index d6916d593..5deb37016 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:464:0 +// src/engine/editor.cpp:462:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 4781813da..d9c449fe4 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:415:0 +// src/engine/editor.cpp:413:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 5ba64602d..591ece0f7 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:484:0 +// src/engine/editor.cpp:482:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 8943c898e..63aaa31c9 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:478:0 +// src/engine/editor.cpp:476:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 7a7607e4e..74f29f0cc 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:397:0 +// src/engine/editor.cpp:395:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 4b5032aad..bb160fd67 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:400:0 +// src/engine/editor.cpp:398:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index c06c0a7ee..89c40be18 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:499:0 +// src/engine/editor.cpp:497:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index b75b09d8e..3e384c19f 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:523:0 +// src/engine/editor.cpp:521:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index c1a4230f2..347b63bc6 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:370:0 +// src/engine/editor.cpp:368:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 8ca692112..59d5b5de7 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:514:0 +// src/engine/editor.cpp:512:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 3ad848667..72efb1b15 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:481:0 +// src/engine/editor.cpp:479:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index ef5b5e729..7ceed840f 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:403:0 +// src/engine/editor.cpp:401:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index 904582c9d..d048091b9 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:654:0 +// src/engine/editor.h:706:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 782b1ba14..a01baa893 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:404:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 38d32f3c9..de203041c 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:440:0 +// src/engine/editor.cpp:438:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index 13ec34a04..def9097d9 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:651:0 +// src/engine/editor.h:703:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index c6bbda633..422c590b8 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:639:0 +// src/engine/editor.h:691:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index a54bd34a0..0ff820b90 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:645:0 +// src/engine/editor.h:697:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 09c72a245..f891b086e 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:642:0 +// src/engine/editor.h:694:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 1c252ce45..4c932eca3 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:472:0 +// src/engine/editor.cpp:470:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index d8fbe45cd..ac42346ed 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:502:0 +// src/engine/editor.cpp:500:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 2ef75209f..cc964d9c1 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:475:0 +// src/engine/editor.cpp:473:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -411,78 +411,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - - - - - { - - - - cs MemberName = CSz("LayerToolbarAction"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(ui_layer_toolbar_actions*, &Element->LayerToolbarAction), - MemberName, - Params - ); - - - - - - - - } - - - - - { - - - - cs MemberName = CSz("BrushAction"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(ui_brush_actions*, &Element->BrushAction), - MemberName, - Params - ); - - - - - - - - } - - - - - { - - - - cs MemberName = CSz("BrushLayerAction"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(ui_brush_layer_actions*, &Element->BrushLayerAction), - MemberName, - Params - ); - - - - - - - } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 416dbff0c..b42bf97ce 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:490:0 +// src/engine/editor.cpp:488:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 53f966318..2a196c64e 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:493:0 +// src/engine/editor.cpp:491:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 3f9ab1470..e1098dc79 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:487:0 +// src/engine/editor.cpp:485:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index c81e9aa38..5468b533a 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:376:0 +// src/engine/editor.cpp:374:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 40df299a8..b206fb390 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:373:0 +// src/engine/editor.cpp:371:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 0d6f685c8..9ec3ad7eb 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:496:0 +// src/engine/editor.cpp:494:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 30f73548b..fdf640294 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:505:0 +// src/engine/editor.cpp:503:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index fae3bb63c..62465da57 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:394:0 +// src/engine/editor.cpp:392:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index f4d8bd5e9..69d672c76 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:385:0 +// src/engine/editor.cpp:383:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 96ab47051..fa41c9fa8 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:388:0 +// src/engine/editor.cpp:386:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 8025adc34..fc84f06a5 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:443:0 +// src/engine/editor.cpp:441:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 714f0fef6..983246c50 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:437:0 +// src/engine/editor.cpp:435:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index a55527209..0efe8ba34 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:379:0 +// src/engine/editor.cpp:377:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 5e5f8ca74..78ba37e78 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:434:0 +// src/engine/editor.cpp:432:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 13d4f779b..387cd6f1e 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:407:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 3f9e3db2a..a690f862c 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:455:0 +// src/engine/editor.cpp:453:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 7f5903622..98f34ac0e 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:382:0 +// src/engine/editor.cpp:380:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index d8908be8e..f8f0db393 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:630:0 +// src/engine/editor.h:682:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 6824b748d..6b2dfb01c 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:511:0 +// src/engine/editor.cpp:509:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 1263954c3..b059e7e17 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:412:0 +// src/engine/editor.cpp:410:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 355651360..1f7e189eb 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:625:0 +// src/engine/editor.h:677:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 9513f26f8..fa27a472e 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:517:0 +// src/engine/editor.cpp:515:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 8c68c0cc3..b0c09cf11 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:520:0 +// src/engine/editor.cpp:518:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_axis.h b/generated/do_editor_ui_for_enum_shape_axis.h index a1570cd7b..bfeb48f06 100644 --- a/generated/do_editor_ui_for_enum_shape_axis.h +++ b/generated/do_editor_ui_for_enum_shape_axis.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:633:0 +// src/engine/editor.h:685:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 07659976f..b044a9010 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:683:0 +// src/engine/editor.h:735:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_voxel_rule_direction.h b/generated/do_editor_ui_for_enum_voxel_rule_direction.h index 1010b79ba..d5bbd7f94 100644 --- a/generated/do_editor_ui_for_enum_voxel_rule_direction.h +++ b/generated/do_editor_ui_for_enum_voxel_rule_direction.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:636:0 +// src/engine/editor.h:688:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index a323deae9..3eaa4dd92 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:841:0 +// src/engine/editor.h:893:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 79044c70f..272d55b6b 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1042:0 +// src/engine/editor.h:1094:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 67bda9a54..6eecab61e 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:847:0 +// src/engine/editor.h:899:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index c57c7752a..d6fb60a9c 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:830:0 +// src/engine/editor.h:882:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index cae2bf289..72c9cc682 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:859:0 +// src/engine/editor.h:911:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 0f355cf00..458926631 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:852:0 +// src/engine/editor.h:904:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index cd0e6b84a..cb1b6e00a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:856:0 +// src/engine/editor.h:908:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index f86346e3b..1811769b6 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:500:0 +// src/engine/editor.h:552:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index b84619cb0..966e45114 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:612:0 +// src/engine/editor.h:664:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h new file mode 100644 index 000000000..abb5d3739 --- /dev/null +++ b/generated/for_datatypes_kh9dwrCf.h @@ -0,0 +1,837 @@ +// src/engine/editor.cpp:350:0 + + + + + + + + + + + + + + + + + +link_internal counted_string +ToStringPrefixless(ui_brush_layer_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiBrushLayerAction_NoAction: { Result = CSz("NoAction"); } break; + case UiBrushLayerAction_MoveUp: { Result = CSz("MoveUp"); } break; + case UiBrushLayerAction_MoveDown: { Result = CSz("MoveDown"); } break; + case UiBrushLayerAction_Duplicate: { Result = CSz("Duplicate"); } break; + case UiBrushLayerAction_Delete: { Result = CSz("Delete"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(ui_brush_layer_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiBrushLayerAction_NoAction: { Result = CSz("UiBrushLayerAction_NoAction"); } break; + case UiBrushLayerAction_MoveUp: { Result = CSz("UiBrushLayerAction_MoveUp"); } break; + case UiBrushLayerAction_MoveDown: { Result = CSz("UiBrushLayerAction_MoveDown"); } break; + case UiBrushLayerAction_Duplicate: { Result = CSz("UiBrushLayerAction_Duplicate"); } break; + case UiBrushLayerAction_Delete: { Result = CSz("UiBrushLayerAction_Delete"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal ui_brush_layer_actions +UiBrushLayerActions(counted_string S) +{ + ui_brush_layer_actions Result = {}; + + if (StringsMatch(S, CSz("UiBrushLayerAction_NoAction"))) { return UiBrushLayerAction_NoAction; } + if (StringsMatch(S, CSz("UiBrushLayerAction_MoveUp"))) { return UiBrushLayerAction_MoveUp; } + if (StringsMatch(S, CSz("UiBrushLayerAction_MoveDown"))) { return UiBrushLayerAction_MoveDown; } + if (StringsMatch(S, CSz("UiBrushLayerAction_Duplicate"))) { return UiBrushLayerAction_Duplicate; } + if (StringsMatch(S, CSz("UiBrushLayerAction_Delete"))) { return UiBrushLayerAction_Delete; } + + return Result; +} + + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, ui_brush_layer_actions Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} + +link_internal ui_toggle_button_group +RadioButtonGroup_ui_brush_layer_actions( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_brush_layer_actions *Element, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_handle ButtonHandles[] = + { + { CSz("NoAction"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_NoAction")), UiBrushLayerAction_NoAction }, + { CSz("MoveUp"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveUp")), UiBrushLayerAction_MoveUp }, + { CSz("MoveDown"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveDown")), UiBrushLayerAction_MoveDown }, + { CSz("Duplicate"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Duplicate")), UiBrushLayerAction_Duplicate }, + { CSz("Delete"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Delete")), UiBrushLayerAction_Delete }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); + return Result; +} + + + + +link_internal ui_toggle_button_group +PushToolbar( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_brush_layer_actions *Element, + u64 Index = 0, + ui_render_params *Params = &DefaultUiRenderParams_Toolbar, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + /* auto Result = RadioButtonGroup_(enum_t.name)(Ui, Window, GroupName, Element, Params, ExtraFlags); */ + + ui_toggle_button_handle ButtonHandles[] = + { + { + CSz("MoveUp"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveUp"), + Cast(void*, Index) + ), + UiBrushLayerAction_MoveUp, + }, + + { + CSz("MoveDown"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveDown"), + Cast(void*, Index) + ), + UiBrushLayerAction_MoveDown, + }, + + { + CSz("Duplicate"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Duplicate"), + Cast(void*, Index) + ), + UiBrushLayerAction_Duplicate, + }, + + { + CSz("Delete"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Delete"), + Cast(void*, Index) + ), + UiBrushLayerAction_Delete, + }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = {}; + Result.Ui = Ui; + Result.Flags = ui_toggle_button_group_flags(ToggleButtonGroupFlags_TypeClickButton | ExtraFlags); + Result.Buttons = ButtonBuffer; + Result.EnumStorage = Cast(u32*, Element); + + DrawButtonGroup(&Result, GroupName); + return Result; +} + + + + + + + +link_internal counted_string +ToStringPrefixless(ui_layer_edit_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiLayerEditAction_NoAction: { Result = CSz("NoAction"); } break; + case UiLayerEditAction_SetBrush: { Result = CSz("SetBrush"); } break; + case UiLayerEditAction_Duplicate: { Result = CSz("Duplicate"); } break; + case UiLayerEditAction_Delete: { Result = CSz("Delete"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(ui_layer_edit_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiLayerEditAction_NoAction: { Result = CSz("UiLayerEditAction_NoAction"); } break; + case UiLayerEditAction_SetBrush: { Result = CSz("UiLayerEditAction_SetBrush"); } break; + case UiLayerEditAction_Duplicate: { Result = CSz("UiLayerEditAction_Duplicate"); } break; + case UiLayerEditAction_Delete: { Result = CSz("UiLayerEditAction_Delete"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal ui_layer_edit_actions +UiLayerEditActions(counted_string S) +{ + ui_layer_edit_actions Result = {}; + + if (StringsMatch(S, CSz("UiLayerEditAction_NoAction"))) { return UiLayerEditAction_NoAction; } + if (StringsMatch(S, CSz("UiLayerEditAction_SetBrush"))) { return UiLayerEditAction_SetBrush; } + if (StringsMatch(S, CSz("UiLayerEditAction_Duplicate"))) { return UiLayerEditAction_Duplicate; } + if (StringsMatch(S, CSz("UiLayerEditAction_Delete"))) { return UiLayerEditAction_Delete; } + + return Result; +} + + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, ui_layer_edit_actions Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} + +link_internal ui_toggle_button_group +RadioButtonGroup_ui_layer_edit_actions( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_layer_edit_actions *Element, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_handle ButtonHandles[] = + { + { CSz("NoAction"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_edit_actions UiLayerEditAction_NoAction")), UiLayerEditAction_NoAction }, + { CSz("SetBrush"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_edit_actions UiLayerEditAction_SetBrush")), UiLayerEditAction_SetBrush }, + { CSz("Duplicate"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_edit_actions UiLayerEditAction_Duplicate")), UiLayerEditAction_Duplicate }, + { CSz("Delete"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_edit_actions UiLayerEditAction_Delete")), UiLayerEditAction_Delete }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); + return Result; +} + + + + +link_internal ui_toggle_button_group +PushToolbar( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_layer_edit_actions *Element, + u64 Index = 0, + ui_render_params *Params = &DefaultUiRenderParams_Toolbar, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + /* auto Result = RadioButtonGroup_(enum_t.name)(Ui, Window, GroupName, Element, Params, ExtraFlags); */ + + ui_toggle_button_handle ButtonHandles[] = + { + { + CSz("S"), + CSz("SetBrush"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_layer_edit_actions UiLayerEditAction_SetBrush"), + Cast(void*, Index) + ), + UiLayerEditAction_SetBrush, + }, + + { + CSz("D"), + CSz("Duplicate"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_layer_edit_actions UiLayerEditAction_Duplicate"), + Cast(void*, Index) + ), + UiLayerEditAction_Duplicate, + }, + + { + CSz("X"), + CSz("Delete"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_layer_edit_actions UiLayerEditAction_Delete"), + Cast(void*, Index) + ), + UiLayerEditAction_Delete, + }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = {}; + Result.Ui = Ui; + Result.Flags = ui_toggle_button_group_flags(ToggleButtonGroupFlags_TypeClickButton | ExtraFlags); + Result.Buttons = ButtonBuffer; + Result.EnumStorage = Cast(u32*, Element); + + DrawButtonGroup(&Result, GroupName); + return Result; +} + + +link_internal counted_string +ToStringPrefixless(ui_reorder_action Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiReorderAction_NoAction: { Result = CSz("NoAction"); } break; + case UiReorderAction_ReorderUp: { Result = CSz("ReorderUp"); } break; + case UiReorderAction_ReorderDown: { Result = CSz("ReorderDown"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(ui_reorder_action Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiReorderAction_NoAction: { Result = CSz("UiReorderAction_NoAction"); } break; + case UiReorderAction_ReorderUp: { Result = CSz("UiReorderAction_ReorderUp"); } break; + case UiReorderAction_ReorderDown: { Result = CSz("UiReorderAction_ReorderDown"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal ui_reorder_action +UiReorderAction(counted_string S) +{ + ui_reorder_action Result = {}; + + if (StringsMatch(S, CSz("UiReorderAction_NoAction"))) { return UiReorderAction_NoAction; } + if (StringsMatch(S, CSz("UiReorderAction_ReorderUp"))) { return UiReorderAction_ReorderUp; } + if (StringsMatch(S, CSz("UiReorderAction_ReorderDown"))) { return UiReorderAction_ReorderDown; } + + return Result; +} + + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, ui_reorder_action Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} + +link_internal ui_toggle_button_group +RadioButtonGroup_ui_reorder_action( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_reorder_action *Element, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_handle ButtonHandles[] = + { + { CSz("NoAction"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_reorder_action UiReorderAction_NoAction")), UiReorderAction_NoAction }, + { CSz("ReorderUp"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_reorder_action UiReorderAction_ReorderUp")), UiReorderAction_ReorderUp }, + { CSz("ReorderDown"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_reorder_action UiReorderAction_ReorderDown")), UiReorderAction_ReorderDown }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); + return Result; +} + + + + +link_internal ui_toggle_button_group +PushToolbar( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_reorder_action *Element, + u64 Index = 0, + ui_render_params *Params = &DefaultUiRenderParams_Toolbar, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + /* auto Result = RadioButtonGroup_(enum_t.name)(Ui, Window, GroupName, Element, Params, ExtraFlags); */ + + ui_toggle_button_handle ButtonHandles[] = + { + { + CSz("^"), + CSz("ReorderUp"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_reorder_action UiReorderAction_ReorderUp"), + Cast(void*, Index) + ), + UiReorderAction_ReorderUp, + }, + + { + CSz("v"), + CSz("ReorderDown"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_reorder_action UiReorderAction_ReorderDown"), + Cast(void*, Index) + ), + UiReorderAction_ReorderDown, + }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = {}; + Result.Ui = Ui; + Result.Flags = ui_toggle_button_group_flags(ToggleButtonGroupFlags_TypeClickButton | ExtraFlags); + Result.Buttons = ButtonBuffer; + Result.EnumStorage = Cast(u32*, Element); + + DrawButtonGroup(&Result, GroupName); + return Result; +} + + + + + + + + + + + +link_internal counted_string +ToStringPrefixless(ui_brush_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiBrushAction_NoAction: { Result = CSz("NoAction"); } break; + case UiBrushAction_New: { Result = CSz("New"); } break; + case UiBrushAction_Save: { Result = CSz("Save"); } break; + case UiBrushAction_Duplicate: { Result = CSz("Duplicate"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(ui_brush_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiBrushAction_NoAction: { Result = CSz("UiBrushAction_NoAction"); } break; + case UiBrushAction_New: { Result = CSz("UiBrushAction_New"); } break; + case UiBrushAction_Save: { Result = CSz("UiBrushAction_Save"); } break; + case UiBrushAction_Duplicate: { Result = CSz("UiBrushAction_Duplicate"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal ui_brush_actions +UiBrushActions(counted_string S) +{ + ui_brush_actions Result = {}; + + if (StringsMatch(S, CSz("UiBrushAction_NoAction"))) { return UiBrushAction_NoAction; } + if (StringsMatch(S, CSz("UiBrushAction_New"))) { return UiBrushAction_New; } + if (StringsMatch(S, CSz("UiBrushAction_Save"))) { return UiBrushAction_Save; } + if (StringsMatch(S, CSz("UiBrushAction_Duplicate"))) { return UiBrushAction_Duplicate; } + + return Result; +} + + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, ui_brush_actions Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} + +link_internal ui_toggle_button_group +RadioButtonGroup_ui_brush_actions( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_brush_actions *Element, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_handle ButtonHandles[] = + { + { CSz("NoAction"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_NoAction")), UiBrushAction_NoAction }, + { CSz("New"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_New")), UiBrushAction_New }, + { CSz("Save"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Save")), UiBrushAction_Save }, + { CSz("Duplicate"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Duplicate")), UiBrushAction_Duplicate }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); + return Result; +} + + + + +link_internal ui_toggle_button_group +PushToolbar( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_brush_actions *Element, + u64 Index = 0, + ui_render_params *Params = &DefaultUiRenderParams_Toolbar, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + /* auto Result = RadioButtonGroup_(enum_t.name)(Ui, Window, GroupName, Element, Params, ExtraFlags); */ + + ui_toggle_button_handle ButtonHandles[] = + { + { + CSz("New"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_actions UiBrushAction_New"), + Cast(void*, Index) + ), + UiBrushAction_New, + }, + + { + CSz("Save"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_actions UiBrushAction_Save"), + Cast(void*, Index) + ), + UiBrushAction_Save, + }, + + { + CSz("Duplicate"), + {}, + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_brush_actions UiBrushAction_Duplicate"), + Cast(void*, Index) + ), + UiBrushAction_Duplicate, + }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = {}; + Result.Ui = Ui; + Result.Flags = ui_toggle_button_group_flags(ToggleButtonGroupFlags_TypeClickButton | ExtraFlags); + Result.Buttons = ButtonBuffer; + Result.EnumStorage = Cast(u32*, Element); + + DrawButtonGroup(&Result, GroupName); + return Result; +} + + + + + + + + + + + + + +link_internal counted_string +ToStringPrefixless(ui_layer_toolbar_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case LayerToolbarActions_NoAction: { Result = CSz("NoAction"); } break; + case LayerToolbarActions_Rename: { Result = CSz("Rename"); } break; + case LayerToolbarActions_Duplicate: { Result = CSz("Duplicate"); } break; + case LayerToolbarActions_Delete: { Result = CSz("Delete"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(ui_layer_toolbar_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case LayerToolbarActions_NoAction: { Result = CSz("LayerToolbarActions_NoAction"); } break; + case LayerToolbarActions_Rename: { Result = CSz("LayerToolbarActions_Rename"); } break; + case LayerToolbarActions_Duplicate: { Result = CSz("LayerToolbarActions_Duplicate"); } break; + case LayerToolbarActions_Delete: { Result = CSz("LayerToolbarActions_Delete"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal ui_layer_toolbar_actions +UiLayerToolbarActions(counted_string S) +{ + ui_layer_toolbar_actions Result = {}; + + if (StringsMatch(S, CSz("LayerToolbarActions_NoAction"))) { return LayerToolbarActions_NoAction; } + if (StringsMatch(S, CSz("LayerToolbarActions_Rename"))) { return LayerToolbarActions_Rename; } + if (StringsMatch(S, CSz("LayerToolbarActions_Duplicate"))) { return LayerToolbarActions_Duplicate; } + if (StringsMatch(S, CSz("LayerToolbarActions_Delete"))) { return LayerToolbarActions_Delete; } + + return Result; +} + + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, ui_layer_toolbar_actions Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} + +link_internal ui_toggle_button_group +RadioButtonGroup_ui_layer_toolbar_actions( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_layer_toolbar_actions *Element, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_handle ButtonHandles[] = + { + { CSz("NoAction"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_NoAction")), LayerToolbarActions_NoAction }, + { CSz("Rename"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename")), LayerToolbarActions_Rename }, + { CSz("Duplicate"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Duplicate")), LayerToolbarActions_Duplicate }, + { CSz("Delete"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete")), LayerToolbarActions_Delete }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); + return Result; +} + + + + +link_internal ui_toggle_button_group +PushToolbar( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_layer_toolbar_actions *Element, + u64 Index = 0, + ui_render_params *Params = &DefaultUiRenderParams_Toolbar, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + /* auto Result = RadioButtonGroup_(enum_t.name)(Ui, Window, GroupName, Element, Params, ExtraFlags); */ + + ui_toggle_button_handle ButtonHandles[] = + { + { + CSz("R"), + CSz("Rename"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename"), + Cast(void*, Index) + ), + LayerToolbarActions_Rename, + }, + + { + CSz("D"), + CSz("Duplicate"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Duplicate"), + Cast(void*, Index) + ), + LayerToolbarActions_Duplicate, + }, + + { + CSz("X"), + CSz("Delete"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete"), + Cast(void*, Index) + ), + LayerToolbarActions_Delete, + }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = {}; + Result.Ui = Ui; + Result.Flags = ui_toggle_button_group_flags(ToggleButtonGroupFlags_TypeClickButton | ExtraFlags); + Result.Buttons = ButtonBuffer; + Result.EnumStorage = Cast(u32*, Element); + + DrawButtonGroup(&Result, GroupName); + return Result; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index fdd67f93a..ccdcadbbd 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1186:0 +// src/engine/editor.h:1238:0 struct world_edit_brush_linked_list_node { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 801ec8120..a631eb064 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:669:0 +// src/engine/editor.h:721:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, level_editor_flags Selection) diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 9a2bbe47f..9f1e2c1b1 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:681:0 +// src/engine/editor.h:733:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 0efec8e20..99ba8e3c4 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:451:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 77fd29dd9..b00857e71 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:628:0 +// src/engine/editor.h:680:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 56b570267..936d72a79 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1040:0 +// src/engine/editor.h:1092:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_enum_ui_brush_layer_actions.h b/generated/string_and_value_tables_enum_ui_brush_layer_actions.h index 871f4e04c..50bb9431f 100644 --- a/generated/string_and_value_tables_enum_ui_brush_layer_actions.h +++ b/generated/string_and_value_tables_enum_ui_brush_layer_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:359:0 +// src/engine/editor.cpp:377:0 link_internal counted_string ToStringPrefixless(ui_brush_layer_actions Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index 03fd8a32b..db4ebf876 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:623:0 +// src/engine/editor.h:675:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_shape_axis.h b/generated/string_and_value_tables_shape_axis.h index 7519875e1..63630a454 100644 --- a/generated/string_and_value_tables_shape_axis.h +++ b/generated/string_and_value_tables_shape_axis.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:40:0 +// src/engine/editor.h:92:0 link_internal counted_string ToStringPrefixless(shape_axis Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 79c6b51bd..6e5651a07 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:982:0 +// src/engine/editor.h:1034:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_brush_actions.h b/generated/string_and_value_tables_ui_brush_actions.h index d916c0870..11068fc16 100644 --- a/generated/string_and_value_tables_ui_brush_actions.h +++ b/generated/string_and_value_tables_ui_brush_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:354:0 +// src/engine/editor.cpp:367:0 link_internal counted_string ToStringPrefixless(ui_brush_actions Type) diff --git a/generated/string_and_value_tables_ui_layer_edit_actions.h b/generated/string_and_value_tables_ui_layer_edit_actions.h new file mode 100644 index 000000000..7092bbb6f --- /dev/null +++ b/generated/string_and_value_tables_ui_layer_edit_actions.h @@ -0,0 +1,47 @@ +// src/engine/editor.cpp:372:0 + +link_internal counted_string +ToStringPrefixless(ui_layer_edit_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiLayerEditAction_SetBrush: { Result = CSz("SetBrush"); } break; + case UiLayerEditAction_Duplicate: { Result = CSz("Duplicate"); } break; + case UiLayerEditAction_Delete: { Result = CSz("Delete"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(ui_layer_edit_actions Type) +{ + counted_string Result = {}; + switch (Type) + { + case UiLayerEditAction_SetBrush: { Result = CSz("UiLayerEditAction_SetBrush"); } break; + case UiLayerEditAction_Duplicate: { Result = CSz("UiLayerEditAction_Duplicate"); } break; + case UiLayerEditAction_Delete: { Result = CSz("UiLayerEditAction_Delete"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal ui_layer_edit_actions +UiLayerEditActions(counted_string S) +{ + ui_layer_edit_actions Result = {}; + + if (StringsMatch(S, CSz("UiLayerEditAction_SetBrush"))) { return UiLayerEditAction_SetBrush; } + if (StringsMatch(S, CSz("UiLayerEditAction_Duplicate"))) { return UiLayerEditAction_Duplicate; } + if (StringsMatch(S, CSz("UiLayerEditAction_Delete"))) { return UiLayerEditAction_Delete; } + + return Result; +} + + diff --git a/generated/string_and_value_tables_ui_layer_toolbar_actions.h b/generated/string_and_value_tables_ui_layer_toolbar_actions.h index 806614d7c..21858dde7 100644 --- a/generated/string_and_value_tables_ui_layer_toolbar_actions.h +++ b/generated/string_and_value_tables_ui_layer_toolbar_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:349:0 +// src/engine/editor.cpp:362:0 link_internal counted_string ToStringPrefixless(ui_layer_toolbar_actions Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 24a2846ef..cdbd64dfe 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:679:0 +// src/engine/editor.h:731:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_voxel_rule_direction.h b/generated/string_and_value_tables_voxel_rule_direction.h index 004e582ac..38c48840e 100644 --- a/generated/string_and_value_tables_voxel_rule_direction.h +++ b/generated/string_and_value_tables_voxel_rule_direction.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:20:0 +// src/engine/editor.h:72:0 link_internal counted_string ToStringPrefixless(voxel_rule_direction Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index f9a8e9b22..95126c827 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:844:0 +// src/engine/editor.h:896:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index d6b3ad15e..3e9b797ab 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:827:0 +// src/engine/editor.h:879:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 57fb92807..f674fe236 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:850:0 +// src/engine/editor.h:902:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 5fec9a15e..72fc116b3 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:713:0 +// src/engine/editor.h:765:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 562f110af..402f55995 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:836:0 +// src/engine/editor.h:888:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/generated/toolbar_for_enum_ui_brush_actions.h b/generated/toolbar_for_enum_ui_brush_actions.h index 7d3ad2057..e626af575 100644 --- a/generated/toolbar_for_enum_ui_brush_actions.h +++ b/generated/toolbar_for_enum_ui_brush_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:356:0 +// src/engine/editor.cpp:369:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_brush_actions Selection) diff --git a/generated/toolbar_for_enum_ui_brush_layer_actions.h b/generated/toolbar_for_enum_ui_brush_layer_actions.h index a3fdd563e..d7559898b 100644 --- a/generated/toolbar_for_enum_ui_brush_layer_actions.h +++ b/generated/toolbar_for_enum_ui_brush_layer_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:361:0 +// src/engine/editor.cpp:379:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_brush_layer_actions Selection) diff --git a/generated/toolbar_for_enum_ui_layer_edit_actions.h b/generated/toolbar_for_enum_ui_layer_edit_actions.h new file mode 100644 index 000000000..160bc4af1 --- /dev/null +++ b/generated/toolbar_for_enum_ui_layer_edit_actions.h @@ -0,0 +1,102 @@ +// src/engine/editor.cpp:374:0 + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, ui_layer_edit_actions Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} + +link_internal ui_toggle_button_group +RadioButtonGroup_ui_layer_edit_actions( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_layer_edit_actions *Element, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_handle ButtonHandles[] = + { + { CSz("SetBrush"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_edit_actions UiLayerEditAction_SetBrush")), UiLayerEditAction_SetBrush }, + { CSz("Duplicate"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_edit_actions UiLayerEditAction_Duplicate")), UiLayerEditAction_Duplicate }, + { CSz("Delete"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_edit_actions UiLayerEditAction_Delete")), UiLayerEditAction_Delete }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); + return Result; +} + + + + +link_internal ui_toggle_button_group +PushToolbar( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + ui_layer_edit_actions *Element, + u64 Index = 0, + ui_render_params *Params = &DefaultUiRenderParams_Toolbar, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + /* auto Result = RadioButtonGroup_(enum_t.name)(Ui, Window, GroupName, Element, Params, ExtraFlags); */ + + ui_toggle_button_handle ButtonHandles[] = + { + { + CSz("S"), + CSz("SetBrush"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_layer_edit_actions UiLayerEditAction_SetBrush"), + Cast(void*, Index) + ), + UiLayerEditAction_SetBrush, + }, + + { + CSz("D"), + CSz("Duplicate"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_layer_edit_actions UiLayerEditAction_Duplicate"), + Cast(void*, Index) + ), + UiLayerEditAction_Duplicate, + }, + + { + CSz("X"), + CSz("Delete"), + UiId( + Cast(void*, Window), + Cast(void*, Element), + Cast(void*, "ui_layer_edit_actions UiLayerEditAction_Delete"), + Cast(void*, Index) + ), + UiLayerEditAction_Delete, + }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = {}; + Result.Ui = Ui; + Result.Flags = ToggleButtonGroupFlags_TypeClickButton; + Result.Buttons = ButtonBuffer; + Result.EnumStorage = Cast(u32*, Element); + + DrawButtonGroup(&Result, GroupName); + return Result; +} + diff --git a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h index 3cedf6972..69bb0719b 100644 --- a/generated/toolbar_for_enum_ui_layer_toolbar_actions.h +++ b/generated/toolbar_for_enum_ui_layer_toolbar_actions.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:351:0 +// src/engine/editor.cpp:364:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_layer_toolbar_actions Selection) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 069a3db95..7163007e5 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -346,20 +346,18 @@ poof(do_editor_ui_for_compound_type(chunk_thumbnail)) -poof(string_and_value_tables(ui_layer_toolbar_actions)) -#include -poof(toolbar_for_enum(ui_layer_toolbar_actions)) -#include - -poof(string_and_value_tables(ui_brush_actions)) -#include -poof(toolbar_for_enum(ui_brush_actions)) -#include - -poof(string_and_value_tables(ui_brush_layer_actions)) -#include -poof(toolbar_for_enum(ui_brush_layer_actions)) -#include +poof( + for_datatypes(all) + func (struct_t) {} + func (enum_t) { + enum_t.has_tag(gen_ui_toolbar)? + { + string_and_value_tables(enum_t) + toolbar_for_enum(enum_t) + } + } +) +#include @@ -1601,9 +1599,9 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ if (LayeredBrush->LayerCount) { - Ui->BrushAction = {}; - ui_toggle_button_group Toolbar = PushToolbar(Ui, BrushSettingsWindow, CSz(""), &Ui->BrushAction); - switch (Ui->BrushAction) + ui_brush_actions BrushAction = {}; + ui_toggle_button_group Toolbar = PushToolbar(Ui, BrushSettingsWindow, CSz(""), &BrushAction); + switch (BrushAction) { case UiBrushAction_NoAction: {} break; @@ -1715,11 +1713,10 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ { s32 EditLayerIndex = 0; + ui_brush_layer_actions BrushLayerAction = {}; PushTableStart(Ui); - Ui->BrushLayerAction = {}; - brush_layer *BrushLayers = Brush->Layered.Layers; RangeIterator(LayerIndex, LayeredBrush->LayerCount) { @@ -1730,16 +1727,16 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ if (ToggleButton(Ui, FSz("v %d %S", LayerIndex, LayerDetails), FSz("> %d %S", LayerIndex, LayerDetails), ToggleId)) { - ui_toggle_button_group Toolbar = PushToolbar(Ui, BrushSettingsWindow, CSz(""), &Ui->BrushLayerAction, u64(LayerIndex)); + ui_toggle_button_group Toolbar = PushToolbar(Ui, BrushSettingsWindow, CSz(""), &BrushLayerAction, u64(LayerIndex)); if (Toolbar.AnyElementClicked) { EditLayerIndex = LayerIndex; - if (Ui->BrushLayerAction == UiBrushLayerAction_Delete) { SetToggleButton(Ui, ToggleId, False); } + if (BrushLayerAction == UiBrushLayerAction_Delete) { SetToggleButton(Ui, ToggleId, False); } b32 ThisState = GetToggleState(Ui, ToggleId); - if (Ui->BrushLayerAction == UiBrushLayerAction_MoveUp) + if (BrushLayerAction == UiBrushLayerAction_MoveUp) { ui_id NextId = ToggleId; NextId.ElementBits -= 1; @@ -1749,7 +1746,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ SetToggleButton(Ui, NextId, ThisState); } - if (Ui->BrushLayerAction == UiBrushLayerAction_MoveDown) + if (BrushLayerAction == UiBrushLayerAction_MoveDown) { ui_id NextId = ToggleId; NextId.ElementBits += 1; @@ -1779,7 +1776,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } PushTableEnd(Ui); - if (Ui->BrushLayerAction == UiBrushLayerAction_MoveUp) + if (BrushLayerAction == UiBrushLayerAction_MoveUp) { if (EditLayerIndex > 0) { @@ -1790,7 +1787,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } } - if (Ui->BrushLayerAction == UiBrushLayerAction_MoveDown) + if (BrushLayerAction == UiBrushLayerAction_MoveDown) { if (LayeredBrush->LayerCount) { @@ -1804,7 +1801,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } } - if (Ui->BrushLayerAction == UiBrushLayerAction_Duplicate) + if (BrushLayerAction == UiBrushLayerAction_Duplicate) { if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) { @@ -1818,7 +1815,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } } - if (Ui->BrushLayerAction == UiBrushLayerAction_Delete) + if (BrushLayerAction == UiBrushLayerAction_Delete) { // NOTE(Jesse): Not an `if` because we shouldn't be able to ask to // delete a layer if there aren't any to delete! @@ -3164,7 +3161,7 @@ DoWorldEditor(engine_resources *Engine) case LayerToolbarActions_Duplicate: { - auto SrcLayer = Editor->CurrentLayer; + auto SrcLayer = Layer; auto DstLayer = NewLayer(Editor); IterateOver(&SrcLayer->Edits, Edit, EditIndex) @@ -3225,7 +3222,11 @@ DoWorldEditor(engine_resources *Engine) Params.FStyle = &DefaultSelectedStyle; } - auto EditSelectButton = PushSimpleButton(Ui, FSz("(%d)(%d) (%s)", KeyIndex, Key->Value, NameBuf), UiId(&LayersWindow, "edit select", Edit), &Params); + ui_reorder_action EditReorderAction = {}; + PushToolbar(Ui, &LayersWindow, {}, &EditReorderAction, u64(Edit), &DefaultUiRenderParams_Toolbar, ToggleButtonGroupFlags_NoNewRow); + + /* auto EditSelectButton = PushSimpleButton(Ui, FSz("(%d)(%d) (%s)", KeyIndex, Key->Value, NameBuf), UiId(&LayersWindow, "edit select", Edit), &Params); */ + auto EditSelectButton = PushSimpleButton(Ui, FSz("(%s)", NameBuf), UiId(&LayersWindow, "edit select", Edit), &Params); if (Clicked(Ui, &EditSelectButton)) { Editor->Selection.Clicks = 2; @@ -3247,44 +3248,41 @@ DoWorldEditor(engine_resources *Engine) Editor->HotEdit = Edit; } - ui_id SetBrushEditId = UiId(&LayersWindow, "edit set_brush", Edit); - ui_id DupEditId = UiId(&LayersWindow, "edit duplicate", Edit); - ui_id DelEditId = UiId(&LayersWindow, "edit delete", Edit); - - if (Hover(Ui, &SetBrushEditId)) { PushTooltip(Ui, CSz("Set Brush")); } - if (Hover(Ui, &DupEditId)) { PushTooltip(Ui, CSz("Duplicatate")); } - if (Hover(Ui, &DelEditId)) { PushTooltip(Ui, CSz("Delete")); } - - if (Button(Ui, CSz("S"), SetBrushEditId)) + ui_layer_edit_actions LayerEditAction = {}; + PushToolbar( Ui, &LayersWindow, {}, &LayerEditAction, u64(Edit)); + switch (LayerEditAction) { - Edit->Brush = Editor->CurrentBrush; - UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); - } + case UiLayerEditAction_NoAction: {} break; - if (Button(Ui, CSz("D"), DupEditId)) - { - IncrementAllEditOrdinalsAbove(&Editor->Layers, Edit->Ordinal+1); + case UiLayerEditAction_SetBrush: + { + Edit->Brush = Editor->CurrentBrush; + UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); + } break; - auto *Duplicated = NewEdit(Layer); - *Duplicated = *Edit; - ++Duplicated->Ordinal; + case UiLayerEditAction_Duplicate: + { + IncrementAllEditOrdinalsAbove(&Editor->Layers, Edit->Ordinal+1); - ApplyEditToOctree(Engine, Duplicated, GetTranArena()); - Editor->CurrentEdit = Duplicated; - } + auto *Duplicated = NewEdit(Layer); + *Duplicated = *Edit; + ++Duplicated->Ordinal; - if (Button(Ui, CSz("X"), DelEditId)) - { - if (Editor->CurrentEdit == Edit) + ApplyEditToOctree(Engine, Duplicated, GetTranArena()); + Editor->CurrentEdit = Duplicated; + } break; + + case UiLayerEditAction_Delete: { - Editor->CurrentEdit = 0; - } + if (Editor->CurrentEdit == Edit) + { + Editor->CurrentEdit = 0; + } - DropEditFromOctree(Engine, Edit, GetTranArena()); - Edit->Ordinal = EDIT_ORDINAL_TOMBSTONE; + DropEditFromOctree(Engine, Edit, GetTranArena()); + Edit->Ordinal = EDIT_ORDINAL_TOMBSTONE; + } break; } - - PushNewRow(Ui); } } PushTableEnd(Ui); diff --git a/src/engine/editor.h b/src/engine/editor.h index 12baa4cda..59aea8238 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1,3 +1,55 @@ +enum ui_layer_toolbar_actions +poof(@gen_ui_toolbar) +{ + LayerToolbarActions_NoAction poof(@ui_skip), + + LayerToolbarActions_Rename poof(@ui_display_name(CSz("R"))), + LayerToolbarActions_Duplicate poof(@ui_display_name(CSz("D"))), + LayerToolbarActions_Delete poof(@ui_display_name(CSz("X"))), + // + // .. ? +}; + +enum ui_brush_actions +poof(@gen_ui_toolbar) +{ + UiBrushAction_NoAction poof(@ui_skip), + + UiBrushAction_New, + UiBrushAction_Save, + UiBrushAction_Duplicate, +}; + +enum ui_reorder_action +poof(@gen_ui_toolbar) +{ + UiReorderAction_NoAction poof(@ui_skip), + UiReorderAction_ReorderUp poof(@ui_display_name(CSz("^"))), + UiReorderAction_ReorderDown poof(@ui_display_name(CSz("v"))), +}; + +enum ui_layer_edit_actions +poof(@gen_ui_toolbar) +{ + UiLayerEditAction_NoAction poof(@ui_skip), + + UiLayerEditAction_SetBrush poof(@ui_display_name(CSz("S"))), + UiLayerEditAction_Duplicate poof(@ui_display_name(CSz("D"))), + UiLayerEditAction_Delete poof(@ui_display_name(CSz("X"))), +}; + +enum ui_brush_layer_actions +poof(@gen_ui_toolbar) +{ + UiBrushLayerAction_NoAction poof(@ui_skip), + + UiBrushLayerAction_MoveUp, + UiBrushLayerAction_MoveDown, + UiBrushLayerAction_Duplicate, + UiBrushLayerAction_Delete, +}; + +// // NOTE(Jesse): This is more-or-less duplicated in the face_index enum. Coalesce them? // @duplicate_face_index_enum // @@ -155,7 +207,7 @@ poof( ui_toggle_button_group Result = {}; Result.Ui = Ui; - Result.Flags = ToggleButtonGroupFlags_TypeClickButton; + Result.Flags = ui_toggle_button_group_flags(ToggleButtonGroupFlags_TypeClickButton | ExtraFlags); Result.Buttons = ButtonBuffer; Result.EnumStorage = Cast(u32*, Element); From f48e6d4428d0f871fc33b78be36836b8202a2b41 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 20 May 2025 21:40:04 -0700 Subject: [PATCH 252/421] Remove a pile of dead editor code --- generated/d_union_ui_render_command.h | 2 +- src/engine/editor.cpp | 1182 +------------------------ 2 files changed, 49 insertions(+), 1135 deletions(-) diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 0daf69567..183d81d40 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:850:0 +// external/bonsai_stdlib/src/ui/ui.h:846:0 enum ui_render_command_type { diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 7163007e5..f26061007 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -602,20 +602,6 @@ GetMax(v3 *SelectionRegion) return Result; } -#if 0 -link_internal void -ApplyEditToRegion(engine_resources *Engine, rect3 *SelectionAABB, v3 HSVColor, b32 PersistWhitespace, world_edit_blend_mode WorldEditMode, world_edit_blend_mode_modifier Modifier) -{ - world_edit_shape Shape = { - .Type = type_world_update_op_shape_params_rect, - .world_update_op_shape_params_rect.Region = *SelectionAABB - }; - - QueueWorldUpdateForRegion(Engine, WorldEditMode, Modifier, &Shape, HSVColor, PersistWhitespace, Engine->WorldUpdateMemory); -} -#endif - - link_internal v3 ConstrainUpdateVector(v3 UpdateVector, face_index Face, world_edit_selection_mode SelectionMode) { @@ -971,305 +957,6 @@ GetHotVoxelForEditMode(engine_resources *Engine, world_edit_blend_mode WorldEdit return Result; } -link_internal v3 -GetHotVoxelForFlood(engine_resources *Engine, world_edit_blend_mode WorldEditMode, world_edit_blend_mode_modifier Modifier) -{ - v3 Result = {}; - picked_voxel_position Pos = {}; - - NotImplemented; - -#if 0 - if (Modifier == WorldEdit_Modifier_Flood) - { - switch (WorldEditMode) - { - case WorldEdit_Mode_Disabled: {} break; - case WorldEdit_Mode_Additive: - { - Pos = PickedVoxel_FirstFilled; - } break; - - /* case WorldEdit_Mode_Paint: */ - case WorldEdit_Mode_Subtractive: - { - Pos = PickedVoxel_LastEmpty; - } break; - } - - Result = Floor(GetSimSpaceP(Engine->World, &Engine->MousedOverVoxel.Value, Pos)); - } -#endif - - return Result; -} - -link_internal v3i -GetShapeDim(shape_layer *Layer) -{ - v3i Result = {}; - NotImplemented; -#if 0 - switch (Layer->Type) - { - case ShapeType_: { NotImplemented; } break; - case ShapeType_Cylinder: { NotImplemented; } break; - case ShapeType_Sphere: - { - // NOTE(Jesse): This can't have a +1 because that dialates it outside the selection region. - Result = V3i(Layer->Sphere.Radius*2.f); - } break; - - case ShapeType_Rect: - { - Result = V3i(GetDim(Layer->Rect.Region)); - } break; - } -#endif - - return Result; -} - -link_internal v3i -GetRequiredDimForLayer(v3i SelectionDim, brush_layer *Layer) -{ - v3i Request = GetDim(Layer->Settings.Offset); - NotImplemented; -#if 0 - switch (Layer->Settings.Type) - { - case BrushLayerType_Noise: - { - Request += SelectionDim; - } break; - - case BrushLayerType_Shape: - { - - shape_layer *Shape = &Layer->Settings.Shape; - switch (Shape->Type) - { - case ShapeType_Cylinder: { NotImplemented; } break; - case ShapeType_Sphere: - { - Request += V3i(Shape->Sphere.Radius*2.f); - } break; - - case ShapeType_Rect: - { - Request += SelectionDim; - } break; - } - } break; - } -#endif - - v3i Result = Max(V3i(0), Request); - return Result; -} - -// NOTE(Jesse): This is a little wacky, and I actually don't quite know why the -// preview chunk dimension is primal for noise layers, but .. there you go. -link_internal v3i -GetLayerDim(brush_layer *Layer) -{ - v3i Result = GetDim(Layer->Settings.Offset); - switch (Layer->Settings.Type) - { - case BrushLayerType_Shape: - { - Result += GetShapeDim(&Layer->Settings.Shape); - } break; - - case BrushLayerType_Noise: - { - Result += GetSelectionDim(GetWorld(), GetLevelEditor()); //Preview->Chunk.Dim; - } break; - } - return Result; -} - -link_internal b32 -CheckForChangesAndUpdate_ThenRenderToPreviewTexture(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *Preview) -{ - NotImplemented; - return False; -#if 0 - UNPACK_ENGINE_RESOURCES(Engine); - - // Leaving this function here as a reference for what used to happen, but migrating the functionality - NotImplemented; - - brush_settings *Settings = &Layer->Settings; - brush_settings *PrevSettings = &Layer->PrevSettings; - - v3i SelectionDim = GetSelectionDim(World, Editor); - v3i RequiredLayerDim = GetRequiredDimForLayer(SelectionDim, Layer); - - b32 ReallocChunk = Editor->Selection.Changed || Preview->Chunk.Dim != RequiredLayerDim; - b32 SettingsChanged = !AreEqual(Settings, PrevSettings); - b32 UpdateVoxels = ReallocChunk || SettingsChanged; - - *PrevSettings = *Settings; - - - - world_chunk *Chunk = &Preview->Chunk; - if (ReallocChunk) - { - // TODO(Jesse)(leak, stability): Figure out exactly how this works. We - // can't allocate from the Editor memory pool because the goemetry buffers - // get freed to a freelist, and the editor memory pool gets cleared on game reload - // - // @editor_chunk_memory_question - // - /* DeallocateWorldChunk(Chunk, MeshFreelist); */ - /* DeallocateGpuBuffers(RenderQ, Chunk); */ - PushDeallocateBuffersCommand(RenderQ, &Chunk->Mesh.Handles); - AllocateWorldChunk(Chunk, {}, RequiredLayerDim, {}, Editor->Memory); - } - - if (UpdateVoxels) - { - /* Info("Detected changes to settings, updating voxels. ReallocChunk(%b) SettingsChanged(%b)", ReallocChunk, SettingsChanged); */ - - switch (Settings->Type) - { - case BrushLayerType_Shape: - { - shape_layer *Shape = &Settings->Shape; - switch (Shape->Type) - { - - case ShapeType_Rect: - { - rect3 Region = RectMinDim({}, V3(SelectionDim)); - - Region.Min += V3(Settings->Offset.Min); - Region.Max += V3(Settings->Offset.Max); - - Sanitize(&Region); - - Shape->Rect.Region.Min = Min(Region.Min, Region.Max); - Shape->Rect.Region.Max = Max(Region.Min, Region.Max); - - Assert(GetDim(Shape->Rect.Region) == V3(RequiredLayerDim)); - Assert(Chunk->Dim == RequiredLayerDim); - - } break; - - case ShapeType_Cylinder: { NotImplemented; } break; - case ShapeType_Sphere: - { - // NOTE(Jesse): Constrain maximum sphere radius to minimum selection dimension - r32 MaxSphereRadius = Min(Min(SelectionDim.x, SelectionDim.y), SelectionDim.z)/2.f; - Shape->Sphere.Radius = MaxSphereRadius; - Shape->Sphere.Location = Canonical_Position(V3(MaxSphereRadius), {}); - - } break; - } - - if (LengthSq(GetShapeDim(Shape)) > 0) - { - NotImplemented; - /* ApplyBrushLayer(Engine, Layer, Preview, Chunk, Settings->Offset.Min); */ - /* FinalizeChunkInitialization(Chunk); */ - /* QueueChunkForMeshRebuild(&Plat->LowPriority, Chunk); */ - } - - } break; - - case BrushLayerType_Noise: - { - noise_layer *Noise = &Settings->Noise; - chunk_init_callback NoiseFunc = {}; - - generic_noise_params NoiseParams = {}; - void *UserData = {}; - - NoiseParams.RGBColor = HSVtoRGB(Settings->HSVColor); - switch (Noise->Type) - { - case NoiseType_White: - { - NoiseFunc = Terrain_WhiteNoise; - NoiseParams.Threshold = Noise->White.Threshold; - } break; - - case NoiseType_Perlin: - { - NoiseFunc = Terrain_Perlin3D; - NoiseParams.Threshold = Noise->Perlin.Threshold; - NoiseParams.Period = Noise->Perlin.Period; - NoiseParams.Amplitude = Noise->Perlin.Amplitude; - } break; - - case NoiseType_Voronoi: - { - NoiseFunc = Terrain_Voronoi3D; - NoiseParams.Threshold = Noise->Voronoi.Threshold; - NoiseParams.Period = Noise->Voronoi.Period; - NoiseParams.Amplitude = Noise->Voronoi.Amplitude; - UserData = Cast(void*, &Noise->Voronoi); - } break; - } - - Assert(NoiseFunc); - - Chunk->Flags = Chunk_Queued; - - InitializeChunkWithNoise( NoiseFunc, - GetThreadLocalState(ThreadLocal_ThreadIndex), - Chunk, - Cast(void*, &NoiseParams), - ChunkInitFlag_Noop, - UserData, - True, - Settings->NoiseBasisOffset + V3i(GetAbsoluteP(Editor->Selection.Region.Min, GetWorldChunkDim()))); - } break; - } - - // TODO(Jesse): Do we do this here still? - NotImplemented; - /* SyncGpuBuffersAsync(Engine, &Chunk->Meshes); */ - } - - if (Preview->Thumbnail.Texture.ID) // NOTE(Jesse): Avoid spamming a warning to console - { - RenderToTexture_Async(&Plat->RenderQ, Engine, &Preview->Thumbnail, &Chunk->Mesh, V3(Chunk->Dim)/-2.f, 0); - } - - return UpdateVoxels; -#endif -} - -link_internal void -BrushSettingsForShapeBrush(engine_resources *Engine, window_layout *Window, shape_layer *Layer) -{ - UNPACK_ENGINE_RESOURCES(Engine); - - NotImplemented; -#if 0 - DoEditorUi(Ui, Window, &Layer->Type, CSz("ShapeType")); - - v3 SelectionDim = GetDim(GetSelectionRect(World, Editor)); - switch (Layer->Type) - { - case ShapeType_Rect: - { - DoEditorUi(Ui, Window, &Layer->Rect, CSz("")); - } break; - - case ShapeType_Cylinder: { NotImplemented; } break; - case ShapeType_Sphere: - { - DoEditorUi(Ui, Window, &Layer->Sphere, CSz("")); - } break; - } -#endif - -} - link_internal void BrushSettingsForNoiseBrush(engine_resources *Engine, window_layout *Window, noise_layer *Layer) { @@ -1307,178 +994,6 @@ BrushSettingsForNoiseBrush(engine_resources *Engine, window_layout *Window, nois PushTableEnd(Ui); } -#if 0 -link_internal void -DoSettingsForBrushLayer(engine_resources *Engine, brush_layer *Layer, window_layout *Window) -{ - UNPACK_ENGINE_RESOURCES(Engine); - - /* brush_settings *Settings = &Layer->Settings; */ - - - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - - PushNewRow(Ui); - DoEditorUi(Ui, Window, &Settings->Type, CSz("Type"), &DefaultUiRenderParams_Generic); - - - switch (Layer->Settings.Type) - { - case BrushLayerType_Noise: - { - BrushSettingsForNoiseBrush(Engine, Window, &Settings->Noise); - } break; - - case BrushLayerType_Shape: - { - BrushSettingsForShapeBrush(Engine, Window, &Settings->Shape); - } break; - } - - - // TODO(Jesse): do enum selector for Mode/Modifier/iterations - DoEditorUi(Ui, Window, &Settings->Mode, CSz("Mode")); - DoEditorUi(Ui, Window, &Settings->Modifier, CSz("Modifier")); - DoEditorUi(Ui, Window, &Settings->ColorMode, CSz("ColorMode")); - if (Settings->Modifier == WorldEdit_ValueModifier_Surface) // || Settings->Modifier == WorldEdit_Modifier_Flood) - { - DoEditorUi(Ui, Window, &Settings->Iterations, CSz("Iterations")); - PushNewRow(Ui); // Primitives require a new row.. I forget why, but there's a good reason. - } - - DoEditorUi(Ui, Window, &Settings->Offset, CSz("Dilation")); - DoEditorUi(Ui, Window, &Settings->NoiseBasisOffset, CSz("Basis"), &DefaultUiRenderParams_Generic); - - DoEditorUi(Ui, Window, &Settings->Invert, CSz("Invert"), &DefaultUiRenderParams_Generic); - PushNewRow(Ui); - - // NOTE(Jesse): These are only stricly necessary if Modifier is Flood or Surface .. do we care? - /* Settings->Offset.Min = Min(V3i(-Settings->Iterations), Settings->Offset.Min); */ - /* Settings->Offset.Max = Max(V3i( Settings->Iterations), Settings->Offset.Max); */ - - { - ui_style Style = UiStyleFromLightestColor(HSVtoRGB(Settings->HSVColor)); - PushUntexturedQuad(Ui, {}, V2(Global_Font.Size.y), zDepth_Text, &Style, DefaultGenericPadding); - - - ui_id ColorPickerModalId = UiId(Window, "color modal interaction", Cast(void*, Settings)); - - if (Button(Ui, CSz("Set Color"), UiId(Window, "set color interaction", Cast(void*, Settings)))) - { - ToggleModal(Ui, "Color Picker", ColorPickerModalId); - } - PushNewRow(Ui); - - ColorPickerModal(Engine, ColorPickerModalId, &Settings->HSVColor, False); - - PushNewRow(Ui); - } - - /* PushTableStart(Ui); */ - /* InteractWithThumbnailTexture(Engine, Ui, Window, "noise preview interaction", &Preview->Thumbnail); */ - /* PushNewRow(Ui); */ - /* PushTableEnd(Ui); */ - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); -} -#endif - -#if 0 -link_internal void -ApplyBrushLayer(engine_resources *Engine, brush_layer *Layer, chunk_thumbnail *Preview, world_chunk *DestChunk, v3i SmallestMinOffset) -{ - UNPACK_ENGINE_RESOURCES(Engine); - - if (LengthSq(DestChunk->Dim) > 0) - { - brush_settings *Settings = &Layer->Settings; - - world_edit_blend_mode Mode = Settings->Mode; - world_edit_blend_mode_modifier Modifier = Settings->Modifier; - - - rect3i UpdateBounds = {{}, DestChunk->Dim}; - - world_edit_shape Shape = {}; - switch (Settings->Type) - { - case BrushLayerType_Shape: - { - Shape.Type = world_update_op_shape_type(Settings->Shape.Type); - - switch (Settings->Shape.Type) - { - case ShapeType_Cylinder: { NotImplemented; } break; - case ShapeType_Sphere: - { - Shape.world_update_op_shape_params_sphere = Settings->Shape.Sphere; - Shape.world_update_op_shape_params_sphere.Location.Offset = ((DestChunk->Dim/2.f) - V3(SmallestMinOffset)); - } break; - - case ShapeType_Rect: - { - Shape.world_update_op_shape_params_rect = Settings->Shape.Rect; - - Shape.world_update_op_shape_params_rect.Region.Min -= V3(SmallestMinOffset); - Shape.world_update_op_shape_params_rect.Region.Max -= V3(SmallestMinOffset); - } break; - } - - } break; - - case BrushLayerType_Noise: - { - noise_layer *Noise = &Settings->Noise; - world_chunk *SrcChunk = &Preview->Chunk; - v3i SrcOffsetMin = Settings->Offset.Min; - - v3i DestRelativeMinCorner = (-1*SmallestMinOffset) + SrcOffsetMin; - - chunk_data D = {SrcChunk->Flags, SrcChunk->Dim, SrcChunk->Occupancy, SrcChunk->xOccupancyBorder, SrcChunk->FaceMasks, SrcChunk->Voxels, SrcChunk->VoxelLighting}; - world_update_op_shape_params_chunk_data ChunkDataShape = { D, V3(DestRelativeMinCorner) }; - - Assert(SrcChunk->Dim <= DestChunk->Dim); - - Shape.Type = type_world_update_op_shape_params_chunk_data; - Shape.world_update_op_shape_params_chunk_data = ChunkDataShape; - } break; - } - - v3 SimFloodOrigin = V3(0); - - s32 Iterations = Settings->Iterations; - if (Iterations > 1) { Info("%d", Iterations); } - RangeIterator(IterIndex, Iterations) - { - NotImplemented; -#if 0 - work_queue_entry_update_world_region Job = WorkQueueEntryUpdateWorldRegion(Mode, Modifier, SimFloodOrigin, &Shape, HSVtoRGB(Layer->Settings.HSVColor), {}, {}, {}, {}, 0); - ApplyUpdateToRegion(GetThreadLocalState(ThreadLocal_ThreadIndex), &Job, UpdateBounds, DestChunk, Layer->Settings.Invert); - DestChunk->FilledCount = MarkBoundaryVoxels_MakeExteriorFaces( DestChunk->Occupancy, DestChunk->Voxels, DestChunk->Dim, {{}}, DestChunk->Dim ); -#endif - } - } - -} -#endif - -link_internal v3i -GetSmallestMinOffset(layered_brush *LayeredBrush, v3i *LargestLayerDim) -{ - v3i SmallestMinOffset = V3i(s32_MAX); - - brush_layer *Layers = LayeredBrush->Layers; - RangeIterator(LayerIndex, LayeredBrush->LayerCount) - { - brush_layer *Layer = Layers + LayerIndex; - - if (LargestLayerDim) { v3i LayerDim = GetLayerDim(Layer); *LargestLayerDim = Max(LayerDim, *LargestLayerDim); } - SmallestMinOffset = Min(Layer->Settings.Offset.Min, SmallestMinOffset); - } - - return SmallestMinOffset; -} - - link_internal cs GetFilenameForBrush(cs Name, s32 Version = 0) { @@ -1592,7 +1107,6 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ // // Brush toolbar buttons // -#if 1 { PushWindowStart(Ui, BrushSettingsWindow); memory_arena *Tran = GetTranArena(); @@ -1767,309 +1281,75 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ DoColorSwatch(Ui, V2(20), HSVtoRGB(BrushLayer->Settings.HSVColor)); } - if (IsNewBrush && LayerIndex == 0) - { - SetToggleButton(Ui, ToggleId, True); - } - - PushNewRow(Ui); - } - PushTableEnd(Ui); - - if (BrushLayerAction == UiBrushLayerAction_MoveUp) - { - if (EditLayerIndex > 0) - { - brush_layer *BrushLayer = BrushLayers + EditLayerIndex; - brush_layer Tmp = BrushLayers[EditLayerIndex-1]; - BrushLayers[EditLayerIndex-1].Settings = BrushLayer->Settings; - BrushLayer->Settings = Tmp.Settings; - } - } - - if (BrushLayerAction == UiBrushLayerAction_MoveDown) - { - if (LayeredBrush->LayerCount) - { - if (EditLayerIndex < LayeredBrush->LayerCount-1) - { - brush_layer *BrushLayer = BrushLayers + EditLayerIndex; - brush_layer Tmp = BrushLayers[EditLayerIndex+1]; - BrushLayers[EditLayerIndex+1].Settings = BrushLayer->Settings; - BrushLayer->Settings = Tmp.Settings; - } - } - } - - if (BrushLayerAction == UiBrushLayerAction_Duplicate) - { - if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) - { - LayeredBrush->LayerCount += 1; - - // Shuffle layers forward. This conveniently duplicates the EditLayerIndex - RangeIteratorReverseRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) - { - BrushLayers[LayerIndex].Settings = BrushLayers[LayerIndex-1].Settings; - } - } - } - - if (BrushLayerAction == UiBrushLayerAction_Delete) - { - // NOTE(Jesse): Not an `if` because we shouldn't be able to ask to - // delete a layer if there aren't any to delete! - Assert(LayeredBrush->LayerCount < 0); - - // Shuffle layers backwards, overwriting EditLayerIndex - RangeIteratorRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) - { - Assert(LayerIndex >= 0 && LayerIndex < MAX_BRUSH_LAYERS); - BrushLayers[LayerIndex-1].Settings = BrushLayers[LayerIndex].Settings; - } - - LayeredBrush->LayerCount -= 1; - } - } - } - - } -#endif - - -#if 0 - if (SelectionComplete(Editor->Selection.Clicks)) - { - b32 AnyChanges = False; - RangeIterator(LayerIndex, LayeredBrush->LayerCount) - { - brush_layer *Layer = Layers + LayerIndex; - chunk_thumbnail *Preview = Previews + LayerIndex; - AnyChanges |= CheckForChangesAndUpdate_ThenRenderToPreviewTexture(Engine, Layer, Preview); - } - - if (AnyChanges) - { - Editor->RootChunkNeedsNewMesh = True; - Editor->MostRecentSelectionRegionMin = Editor->SelectionRegion.Min; - } - } -#endif - - - - - { - /* local_persist window_layout LayersWindow = WindowLayout("Layers", WindowLayoutFlag_Align_Right); */ - /* PushWindowStart(Ui, BrushSettingsWindow); */ - - // NOTE(Jesse): Debug -#if 0 - if (LayeredBrush->SeedBrushWithSelection) - { - PushTableStart(Ui); - world_chunk *SeedChunk = &LayeredBrush->SeedLayer.Chunk; - chunk_thumbnail *SeedPreview = &LayeredBrush->SeedLayer; - if (SeedPreview->Thumbnail.Texture.ID) { RenderToTexture_Async(&Plat->RenderQ, Engine, &SeedPreview->Thumbnail, &SeedChunk->Meshes, V3(SeedChunk->Dim)/-2.f, 0); } - InteractWithThumbnailTexture(Engine, Ui, BrushSettingsWindow, "seed preview interaction", &Editor->LayeredBrush.SeedLayer.Thumbnail); - PushNewRow(Ui); - PushTableEnd(Ui); - - PushTableStart(Ui); - world_chunk *Root_LayeredBrushPreview = &LayeredBrush->Preview.Chunk; - if (SeedPreview->Thumbnail.Texture.ID) { RenderToTexture_Async(&Plat->RenderQ, Engine, &LayeredBrush->Preview.Thumbnail, &Root_LayeredBrushPreview->Meshes, V3(Root_LayeredBrushPreview->Dim)/-2.f, 0); } - InteractWithThumbnailTexture(Engine, Ui, BrushSettingsWindow, "root preview interaction", &Editor->LayeredBrush.Preview.Thumbnail); - PushNewRow(Ui); - PushTableEnd(Ui); - } -#endif - - // NOTE(Jesse): This is old code for maintaining the world edit memory. We - // no longer need this, but I'm keeping it around for a bit in case I want to - // read it for some reason.. -#if 0 - { - - { - world_chunk *Root_LayeredBrushPreview = &LayeredBrush->Preview.Chunk; - Assert( (Root_LayeredBrushPreview->Flags&Chunk_Queued) == False ); - - // - // TODO(Jesse)(async, speed): It would be kinda nice if this ran async.. - if ( Editor->RootChunkNeedsNewMesh ) - { - // TODO(Jesse): Shouldn't the LargestLayerDim take into account the largest Offset too..? - v3i LargestLayerDim = GetSelectionDim(World, Editor) + 2; - v3i SmallestMinOffset = GetSmallestMinOffset(LayeredBrush, &LargestLayerDim); - /* if (SmallestMinOffset == V3i(0)) */ - /* {SmallestMinOffset = V3i(1);} */ - - // Clear the voxels if the size didn't change, otherwise realloc - if (Root_LayeredBrushPreview->Dim == LargestLayerDim) - { - // TODO(Jesse): Actually necessary?? I think maybe not - ClearChunkVoxels(Root_LayeredBrushPreview->Voxels, Root_LayeredBrushPreview->Dim); - } - else - { - // @editor_chunk_memory_question - AllocateWorldChunk(Root_LayeredBrushPreview, {}, LargestLayerDim, {}, Editor->Memory); - } - - world_chunk *SeedChunk = &LayeredBrush->SeedLayer.Chunk; - if (SeedChunk->Dim == LargestLayerDim) - { - ClearChunkVoxels(SeedChunk->Voxels, SeedChunk->Dim); - } - else - { - AllocateWorldChunk(SeedChunk, {}, LargestLayerDim, {}, Editor->Memory); - } - + if (IsNewBrush && LayerIndex == 0) + { + SetToggleButton(Ui, ToggleId, True); + } + PushNewRow(Ui); + } + PushTableEnd(Ui); + if (BrushLayerAction == UiBrushLayerAction_MoveUp) + { + if (EditLayerIndex > 0) + { + brush_layer *BrushLayer = BrushLayers + EditLayerIndex; + brush_layer Tmp = BrushLayers[EditLayerIndex-1]; + BrushLayers[EditLayerIndex-1].Settings = BrushLayer->Settings; + BrushLayer->Settings = Tmp.Settings; + } + } -#if 0 - auto Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); - if (LayeredBrush->SeedBrushWithSelection) + if (BrushLayerAction == UiBrushLayerAction_MoveDown) + { + if (LayeredBrush->LayerCount) { - if (SelectionComplete(Editor->Selection.Clicks)) + if (EditLayerIndex < LayeredBrush->LayerCount-1) { - rect3cp GatherRegion = Editor->SelectionRegion; - GatherRegion.Min.Offset -= V3(1); - GatherRegion.Max.Offset += V3(1); - Canonicalize(World, &GatherRegion.Min); - Canonicalize(World, &GatherRegion.Max); - - world_chunk Seed = GatherVoxelsOverlappingArea(Engine, GatherRegion, GetTranArena()); - /* CopyChunkOffset(&Seed, Seed.Dim, Root_LayeredBrushPreview, Root_LayeredBrushPreview->Dim, -1*SmallestMinOffset); */ - CopyChunkOffset(&Seed, Seed.Dim, SeedChunk, SeedChunk->Dim, {}); - - /* // NOTE(Jesse): Zero out everything on the exterior edge */ - /* RangeIterator (z, SeedChunk->Dim.z) */ - /* RangeIterator (y, SeedChunk->Dim.y) */ - /* RangeIterator (x, SeedChunk->Dim.x) */ - /* { */ - /* if (z == 0 || y == 0 || x == 0 || */ - /* z == (SeedChunk->Dim.z-1) || y == (SeedChunk->Dim.y-1) || x == (SeedChunk->Dim.x-1)) */ - /* /1* if (z == 0 || y == 0 || x == 0) *1/ */ - /* { */ - /* s32 Index = GetIndex(x,y,z, SeedChunk->Dim); */ - /* SeedChunk->Voxels[Index] = {}; */ - /* } */ - /* } */ - - MarkBoundaryVoxels_MakeExteriorFaces(SeedChunk->Occupancy, SeedChunk->Voxels, SeedChunk->Dim, {}, SeedChunk->Dim); - - FinalizeChunkInitialization(SeedChunk); - - data_type Type = GetMeshDatatypeForDimension(SeedChunk->Dim); - auto *TempMesh = AllocateTempMesh(Thread->TempMemory, Type); - RebuildWorldChunkMesh(Thread, SeedChunk, {}, SeedChunk->Dim, MeshBit_Lod0, TempMesh, Thread->TempMemory); - // TODO(Jesse): Do we still do this here? - NotImplemented; - /* SyncGpuBuffersAsync(Engine, &SeedChunk->Meshes); */ - - CopyChunkOffset(SeedChunk, SeedChunk->Dim, Root_LayeredBrushPreview, Root_LayeredBrushPreview->Dim, {}); + brush_layer *BrushLayer = BrushLayers + EditLayerIndex; + brush_layer Tmp = BrushLayers[EditLayerIndex+1]; + BrushLayers[EditLayerIndex+1].Settings = BrushLayer->Settings; + BrushLayer->Settings = Tmp.Settings; } } -#endif + } - RangeIterator(LayerIndex, LayeredBrush->LayerCount) + if (BrushLayerAction == UiBrushLayerAction_Duplicate) + { + if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) { - brush_layer *Layer = Layers + LayerIndex; - chunk_thumbnail *Preview = Previews + LayerIndex; - ApplyBrushLayer(Engine, Layer, Preview, Root_LayeredBrushPreview, SmallestMinOffset+V3i(-1)); + LayeredBrush->LayerCount += 1; + + // Shuffle layers forward. This conveniently duplicates the EditLayerIndex + RangeIteratorReverseRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) + { + BrushLayers[LayerIndex].Settings = BrushLayers[LayerIndex-1].Settings; + } } + } - FinalizeChunkInitialization(Root_LayeredBrushPreview); + if (BrushLayerAction == UiBrushLayerAction_Delete) + { + // NOTE(Jesse): Not an `if` because we shouldn't be able to ask to + // delete a layer if there aren't any to delete! + Assert(LayeredBrush->LayerCount < 0); + // Shuffle layers backwards, overwriting EditLayerIndex + RangeIteratorRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) { - auto Chunk = Root_LayeredBrushPreview; - - data_type Type = GetMeshDatatypeForDimension(Chunk->Dim); - auto *TempMesh = AllocateTempMesh(Thread->TempMemory, Type); - - MarkBoundaryVoxels_MakeExteriorFaces( Root_LayeredBrushPreview->Occupancy, - Root_LayeredBrushPreview->Voxels, - Root_LayeredBrushPreview->Dim, - {}, - Root_LayeredBrushPreview->Dim-V3i(2)); - - RebuildWorldChunkMesh(Thread, Chunk, {}, Chunk->Dim, MeshBit_Lod0, TempMesh, Thread->TempMemory); + Assert(LayerIndex >= 0 && LayerIndex < MAX_BRUSH_LAYERS); + BrushLayers[LayerIndex-1].Settings = BrushLayers[LayerIndex].Settings; } - Editor->RootChunkNeedsNewMesh = False; - Editor->NextSelectionRegionMin = Editor->MostRecentSelectionRegionMin; - - // TODO(Jesse): Do we still do this here? - NotImplemented; - /* if (SyncGpuBuffersAsync(Engine, &Root_LayeredBrushPreview->Meshes)) */ - /* { */ - /* Editor->EditorPreviewRegionMin = Editor->NextSelectionRegionMin; */ - /* } */ + LayeredBrush->LayerCount -= 1; } - - - } } -#endif - - PushWindowEnd(Ui, BrushSettingsWindow); - } -} - -#if 0 -link_internal void -DoBrushSettingsWindow(engine_resources *Engine, world_edit_tool WorldEditTool, world_edit_brush_type WorldEditBrushType) -{ - UNPACK_ENGINE_RESOURCES(Engine); - - local_persist window_layout Window = WindowLayout("Brush Settings", WindowLayoutFlag_Align_Right); - switch (WorldEditTool) - { - case WorldEdit_Tool_Disabled: - case WorldEdit_Tool_Select: - case WorldEdit_Tool_Eyedropper: - case WorldEdit_Tool_BlitEntity: - { - } break; - - case WorldEdit_Tool_Brush: - { - switch (WorldEditBrushType) - { - case WorldEdit_BrushType_Disabled: {} break; - case WorldEdit_BrushType_Single: {} break; - case WorldEdit_BrushType_Entity: {} break; - case WorldEdit_BrushType_Asset: {} break; - - case WorldEdit_BrushType_Layered: - { - DoBrushSettingsWindow(Engine, &Engine->Editor.Brush.Layered, &Window); - } break; - } - } break; } -} -#endif -link_internal b32 -CurrentToolIs(level_editor *Editor, world_edit_tool Tool, world_edit_brush_type BrushType) -{ - b32 Result = False; - NotImplemented; - /* if (Editor->Tool == Tool) */ - /* { */ - /* Result = True; */ - /* if (Editor->Tool == WorldEdit_Tool_Brush) */ - /* { */ - /* Result = (Editor->Brush.Type == BrushType); */ - /* } */ - /* } */ - return Result; + PushWindowEnd(Ui, BrushSettingsWindow); } link_internal aabb_intersect_result @@ -2101,33 +1381,6 @@ EditWorldSelection(engine_resources *Engine) Thickness = 0.20f; } -#if 0 - if (CurrentToolIs(Editor, WorldEdit_Tool_Brush, WorldEdit_BrushType_Layered)) - { - layered_brush *Brush = &Editor->Brush.Layered; - if (Brush->BrushFollowsCursor) - { - if (Engine->MousedOverVoxel.Tag) - { - cp MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value, PickedVoxel_LastEmpty); - - v3 SelectionDim = GetDim(GetSimSpaceRect(World, Editor->Selection.Region)); - v3 SelectionRad = SelectionDim / 2.f; - - Editor->Selection.Region.Min = MouseP - SelectionRad; - Editor->Selection.Region.Max = MouseP + SelectionRad; - - Canonicalize(World, &Editor->Selection.Region.Min); - Canonicalize(World, &Editor->Selection.Region.Max); - - Truncate(&Editor->Selection.Region.Min.Offset); - Truncate(&Editor->Selection.Region.Max.Offset); - - } - } - } -#endif - aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); { if (Engine->MaybeMouseRay.Tag == Maybe_Yes) @@ -2247,37 +1500,6 @@ InputStateIsValidToApplyEdit(input *Input) return Result; } -#if 0 -link_internal world_edit_blend_mode -GetEditModeForSelectedTool(level_editor *Editor) -{ - // Default is attach for tools/brushes that don't have a mode in their settings - world_edit_blend_mode Result = WorldEdit_Mode_Additive; - - switch(Editor->Tool) - { - case WorldEdit_Tool_Disabled: {} break; - case WorldEdit_Tool_Select: {} break; - case WorldEdit_Tool_Eyedropper: {} break; - case WorldEdit_Tool_BlitEntity: {} break; - - case WorldEdit_Tool_Brush: - { - switch(Editor->Brush.Type) - { - case WorldEdit_BrushType_Disabled: {} break; - case WorldEdit_BrushType_Entity: {} break; - case WorldEdit_BrushType_Single: { Result = Editor->Brush.Single.Mode; } break; - case WorldEdit_BrushType_Asset: { Result = Editor->Brush.Asset.Mode; } break; - case WorldEdit_BrushType_Layered: { Result = Editor->Brush.Layered.Mode;} break; - } - } break; - } - - return Result; -} -#endif - link_internal v3 ColorIndexToV3(u16 ColorIndex) { @@ -2403,26 +1625,6 @@ DoColorPickerToggle(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 Sho PushNewRow(Ui); } -#if 0 -link_internal void -ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowColorSwatch /* = True */) -{ - UNPACK_ENGINE_RESOURCES(Engine); - - if (window_layout *Window = ModalIsActive(Ui, ModalId)) - { - DoColorPicker(Ui, Window, HSVDest, ShowColorSwatch); - - if (Button(Ui, CSz("Close"), UiId(Window, "modal close button", 0u))) - { - CompleteModal(Ui, ModalId); - } - - PushNewRow(Ui); - } -} -#endif - link_internal b32 CheckSettingsChanged(layered_brush *Brush) { @@ -2601,16 +1803,6 @@ DoWorldEditor(engine_resources *Engine) /* CurrentRef = WorldEditToolButtonGroup.UiRef; */ } -#if 0 - if (Editor->Tool == WorldEdit_Tool_Brush) - { - Params.RelativePosition.Position = Position_RightOf; - Params.RelativePosition.RelativeTo = CurrentRef; - WorldEditBrushTypeButtonGroup = DoEditorUi(Ui, &Window, &Editor->Brush.Type, CSz("Brush Type"), &Params, ToggleButtonGroupFlags_DrawVertical); - CurrentRef = WorldEditBrushTypeButtonGroup.UiRef; - } -#endif - PushTableEnd(Ui); PushWindowEnd(Ui, &Window); } @@ -2660,161 +1852,6 @@ DoWorldEditor(engine_resources *Engine) { case WorldEdit_Tool_Disabled: -#if 0 - case WorldEdit_Tool_Brush: - { - switch (Editor->Brush.Type) - { - case WorldEdit_BrushType_Disabled: - {} break; - - case WorldEdit_BrushType_Entity: - case WorldEdit_BrushType_Asset: - { - if (Input->LMB.Clicked) - { - if (EngineDebug->SelectedAsset.FileNode.Type) - { - cp EntityOrigin = Canonical_Position(&Engine->MousedOverVoxel.Value); - EntityOrigin.Offset = Round(EntityOrigin.Offset); - - maybe_asset_ptr MaybeAsset = GetAssetPtr(Engine, &EngineDebug->SelectedAsset); - if (MaybeAsset.Tag) - { - asset *Asset = MaybeAsset.Value; - - switch (Asset->Type) - { - InvalidCase(AssetType_Undefined); - - case AssetType_WorldChunk: - case AssetType_Models: - { - // TODO(Jesse): There should be an unsafe version of this function, and rename this one to TryGetDimForAssetModel ..? - maybe_v3i MaybeDim = GetDimForAssetModel(Asset, u32(EngineDebug->ModelIndex)); - if (MaybeDim.Tag) - { - v3 AssetHalfDim = MaybeDim.Value / 2.f; - world_update_op_shape_params_asset AssetUpdateShape = - { - EngineDebug->SelectedAsset, - EngineDebug->ModelIndex, - Canonicalize(World, EntityOrigin - V3(AssetHalfDim.xy, 0.f)) - }; - - if (Editor->Brush.Type == WorldEdit_BrushType_Asset) - { - world_edit_shape Shape = - { - type_world_update_op_shape_params_asset, - .world_update_op_shape_params_asset = AssetUpdateShape, - }; - QueueWorldUpdateForRegion(Engine, Editor->Brush.Asset.Mode, Editor->Brush.Asset.Modifier, &Shape, {}, {}, Engine->WorldUpdateMemory); - } - else if (Editor->Brush.Type == WorldEdit_BrushType_Entity) - { - entity *E = TryGetFreeEntityPtr(Engine->EntityTable); - if (E) - { - SpawnEntity(E, &EngineDebug->SelectedAsset, EngineDebug->ModelIndex, EntityBehaviorFlags_Default, 0, &AssetUpdateShape.Origin, AssetHalfDim); - } - } - else - { - InvalidCodePath(); // NOTE(Jesse): This is redundant because we already checked it's one of these, - // but I'm going to keep it here in case we ever move this code.. or the checks. - } - } - else - { - BUG("Somehow requested a ModelIndex from an Asset that did not have one!"); - } - } break; - - } - - } - } - } - } break; - - case WorldEdit_BrushType_Single: - { - // NOTE(Jesse): This is kind of an optimization to jump directly to - // rebuilding the chunk mesh instead of doing all the hoop-jumping - // related to editing. I'm not really sure if it's worth the extra - // complexity here, and/or the slight bit of jank it introduces. I - // expect that once I serialize the world edits this should go away - // and we can just collapse world edits automatically in the edit thread. - // - // When my laptop is unplugged running on battery power, this is _much_ faster. - NotImplemented; -#if 0 - if (Editor->Params.Mode == WorldEdit_Mode_Paint) - { - - b32 DoPaint = Input->LMB.Pressed; - if (DoPaint) - { - Ui->RequestedForceCapture = True;; - if (Engine->MousedOverVoxel.Tag) - { - if (voxel *V = GetVoxelPointer(&Engine->MousedOverVoxel.Value, PickedVoxel_FirstFilled)) - { - V->Color = Engine->Editor.SelectedColorIndex; - QueueChunkForMeshRebuild(&Plat->LowPriority, Engine->MousedOverVoxel.Value.Chunks[PickedVoxel_FirstFilled].Chunk); - } - } - } - } - else - { - b32 DoPaint = Input->LMB.Clicked; - if (DoPaint) - { - Ui->RequestedForceCapture = True; - if (Engine->MousedOverVoxel.Tag) - { - v3 P0 = GetHotVoxelForEditMode(Engine, Editor->Params.Mode); - rect3 AABB = RectMinMax(P0, P0+1.f); - ApplyEditToRegion(Engine, &AABB, Engine->Editor.SelectedColorIndex, {}, Editor->Params.Mode, Editor->Params.Modifier); - } - } - } -#endif - } break; - - case WorldEdit_BrushType_Layered: - { - layered_brush *Layered = &Editor->Brush.Layered; - if (AABBTest.Face && InputStateIsValidToApplyEdit(Input)) - { - v3i Offset = V3i(s32_MAX); - world_chunk *Chunk = &Layered->Preview.Chunk; - - // TODO(Jesse): Call GetSmallestMinOffset here - RangeIterator(LayerIndex, Layered->LayerCount) - { - brush_layer *Layer = Layered->Layers + LayerIndex; - Offset = Min(Layer->Settings.Offset.Min, Offset); - } - - chunk_data D = {Chunk->Flags, Chunk->Dim, Chunk->Occupancy, Chunk->xOccupancyBorder, Chunk->FaceMasks, Chunk->Voxels, Chunk->VoxelLighting}; - world_update_op_shape_params_chunk_data ChunkDataShape = { D, V3(Offset) + GetSimSpaceP(World, Editor->Selection.Region.Min) - V3i(1) }; - - world_edit_shape Shape = - { - type_world_update_op_shape_params_chunk_data, - .world_update_op_shape_params_chunk_data = ChunkDataShape, - }; - QueueWorldUpdateForRegion(Engine, Layered->Mode, Layered->Modifier, &Shape, DEFAULT_HSV_COLOR, Layered->SeedBrushWithSelection, Engine->WorldUpdateMemory); - } - } break; - - } - } break; -#endif - case WorldEdit_Tool_Select: { if (Input->LMB.Clicked) @@ -2907,22 +1944,6 @@ DoWorldEditor(engine_resources *Engine) } } break; -#if 0 - case WorldEdit_Tool_StandingSpots: - { - NotImplemented; - if (Input->LMB.Clicked && AABBTest.Face && !Input->Shift.Pressed && !Input->Ctrl.Pressed) - { - world_edit_shape Shape = { - .Type = type_world_update_op_shape_params_rect, - .world_update_op_shape_params_rect.P0 = SelectionAABB.Min, - .world_update_op_shape_params_rect.P1 = SelectionAABB.Max, - }; - QueueWorldUpdateForRegion(Engine, WorldUpdateOperationMode_StandingSpots, &Shape, Editor->SelectedColorIndex, Engine->WorldUpdateMemory); - } - } break; -#endif - } } @@ -3065,66 +2086,6 @@ DoWorldEditor(engine_resources *Engine) local_persist window_layout LayersWindow = WindowLayout("Layers", WindowLayoutFlag_Align_Bottom); PushWindowStart(Ui, &LayersWindow); - -#if 0 - ui_toggle_button_group Toolbar = PushToolbar(Ui, &LayersWindow, {}, &Ui->LayerToolbarAction); - - if (Toolbar.AnyElementClicked) - { - switch(Ui->LayerToolbarAction) - { - case LayerToolbarActions_New: - { - NewLayer(Editor); - } break; - - case LayerToolbarActions_Delete: - { - auto Layer = Editor->CurrentLayer; - IterateOver(&Layer->Edits, Edit, EditIndex) - { - if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } - - DropEditFromOctree(Engine, Edit, GetTranArena()); - } - RemoveOrdered(&Editor->Layers, Layer); - } break; - - case LayerToolbarActions_Rename: - { - if (Editor->CurrentLayer) - { - ui_id Id = UiId(&LayersWindow, "rename current layer", Editor->CurrentLayer->NameBuf); - TextBox(Ui, {}, CS(Editor->CurrentLayer->NameBuf), NameBuf_Len, Id); - } - } break; - - case LayerToolbarActions_Duplicate: - { - auto SrcLayer = Editor->CurrentLayer; - auto DstLayer = NewLayer(Editor); - - IterateOver(&SrcLayer->Edits, Edit, EditIndex) - { - if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } - - auto *Duplicated = NewEdit(DstLayer); - *Duplicated = *Edit; - Duplicated->Ordinal = Editor->NextEditOrdinal++; - - ApplyEditToOctree(Engine, Duplicated, GetTranArena()); - - if (Editor->CurrentEdit == Edit) - { - Editor->CurrentEdit = Duplicated; - } - } - - - } break; - } - } -#endif if (Button(Ui, CSz("New Layer"), UiId(&LayersWindow, "new layer", 0ull))) { NewLayer(Editor); @@ -3357,43 +2318,6 @@ DoWorldEditor(engine_resources *Engine) link_internal void DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Mesh, r32 DistanceSquared, v3 Basis, Quaternion Rotation, v3 Scale ); -#if 0 -link_internal void -DrawEditorPreview(engine_resources *Engine, shader *Shader) -{ - UNPACK_ENGINE_RESOURCES(Engine); - - world_chunk *Chunk = {}; - v3 Basis = {}; - - switch (Editor->Tool) - { - case WorldEdit_Tool_Brush: - { - switch (Editor->Brush.Type) - { - case WorldEdit_BrushType_Layered: - { - layered_brush *LayeredBrush = &Editor->Brush.Layered; - v3i SmallestMinOffset = GetSmallestMinOffset(LayeredBrush); - Chunk = &LayeredBrush->Preview.Chunk; - Basis = V3(SmallestMinOffset) - V3i(1); - } break; - - default: {} break; - } - } break; - - default: {} break; - } - - if (Chunk) - { - DrawLod(Engine, Shader, &Chunk->Mesh, 0.f, Basis, Quaternion(), V3(1.f)); - } -} -#endif - link_internal void ApplyEditBufferToOctree(engine_resources *Engine, world_edit_paged_list *Edits) { @@ -3454,7 +2378,6 @@ DoLevelWindow(engine_resources *Engine) u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; Ensure(Serialize(&OutputStream, &Delimeter)); -#if 1 IterateOver(&Editor->Layers, Layer, LayerIndex) { u32 EditCount = u32(TotalElements(&Layer->Edits)); @@ -3465,15 +2388,6 @@ DoLevelWindow(engine_resources *Engine) Serialize(&OutputStream, Edit); } } -#else - RangeIterator(HashIndex, s32(World->HashSize)) - { - if (world_chunk *Chunk = World->ChunkHash[HashIndex]) - { - SerializeChunk(Chunk, &OutputStream); - } - } -#endif Ensure(Serialize(&OutputStream, &Delimeter)); From 9897cadd0f8b6ad3ed96e6dea6464a529444c0d5 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 21 May 2025 18:41:35 -0700 Subject: [PATCH 253/421] Fix editor highlighting --- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 2 +- .../do_editor_ui_for_compound_type_ray.h | 2 +- .../do_editor_ui_for_compound_type_rect3.h | 2 +- .../do_editor_ui_for_compound_type_rect3cp.h | 2 +- .../do_editor_ui_for_compound_type_rect3i.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- generated/do_editor_ui_for_enum_shape_axis.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ..._editor_ui_for_enum_voxel_rule_direction.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_shape_axis.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...ng_and_value_tables_voxel_rule_direction.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- src/engine/editor.cpp | 37 +++++++------------ src/engine/editor.h | 2 + 44 files changed, 58 insertions(+), 65 deletions(-) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 9925d4dbc..93963bb47 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:865:0 +// src/engine/editor.h:867:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index ad98b38b7..4951db9ff 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1125:0 +// src/engine/editor.h:1127:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index d0d47088f..ae2fba3fc 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1235:0 +// src/engine/editor.h:1237:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index d1431f592..eccd6bbbb 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:700:0 +// src/engine/editor.h:702:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index d4fbf0ddf..0f308d3bf 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1251:0 +// src/engine/editor.h:1253:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 751706b35..7fe426b9e 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1262:0 +// src/engine/editor.h:1264:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index f12f0f248..800870878 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1254:0 +// src/engine/editor.h:1256:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index be65b3a79..f6b00588a 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1078:0 +// src/engine/editor.h:1080:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index d048091b9..4efaf9f5c 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:706:0 +// src/engine/editor.h:708:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index def9097d9..b28e2e794 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:703:0 +// src/engine/editor.h:705:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index 422c590b8..a12f7bbbf 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:691:0 +// src/engine/editor.h:693:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index 0ff820b90..0324c8ecb 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:697:0 +// src/engine/editor.h:699:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index f891b086e..a22084b3e 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:694:0 +// src/engine/editor.h:696:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index f8f0db393..0d805e5ff 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:682:0 +// src/engine/editor.h:684:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 1f7e189eb..6ee36169c 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:677:0 +// src/engine/editor.h:679:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_axis.h b/generated/do_editor_ui_for_enum_shape_axis.h index bfeb48f06..59c1abff1 100644 --- a/generated/do_editor_ui_for_enum_shape_axis.h +++ b/generated/do_editor_ui_for_enum_shape_axis.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:685:0 +// src/engine/editor.h:687:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index b044a9010..1eeed0409 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:735:0 +// src/engine/editor.h:737:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_voxel_rule_direction.h b/generated/do_editor_ui_for_enum_voxel_rule_direction.h index d5bbd7f94..96b7ba13a 100644 --- a/generated/do_editor_ui_for_enum_voxel_rule_direction.h +++ b/generated/do_editor_ui_for_enum_voxel_rule_direction.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:688:0 +// src/engine/editor.h:690:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 3eaa4dd92..7952d8c9a 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:893:0 +// src/engine/editor.h:895:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 272d55b6b..c43d2a545 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1094:0 +// src/engine/editor.h:1096:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 6eecab61e..ab347a826 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:899:0 +// src/engine/editor.h:901:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index d6fb60a9c..01ca32221 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:882:0 +// src/engine/editor.h:884:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 72c9cc682..41c139325 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:911:0 +// src/engine/editor.h:913:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 458926631..4fb51d646 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:904:0 +// src/engine/editor.h:906:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index cb1b6e00a..29a448633 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:908:0 +// src/engine/editor.h:910:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index 1811769b6..7ec90c182 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:552:0 +// src/engine/editor.h:554:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index 966e45114..bb41f62c9 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:664:0 +// src/engine/editor.h:666:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index ccdcadbbd..2e1d6d8f7 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1238:0 +// src/engine/editor.h:1240:0 struct world_edit_brush_linked_list_node { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index a631eb064..51d92c079 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:721:0 +// src/engine/editor.h:723:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, level_editor_flags Selection) diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 9f1e2c1b1..ccb12e3c8 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:733:0 +// src/engine/editor.h:735:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index b00857e71..e90308bd0 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:680:0 +// src/engine/editor.h:682:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 936d72a79..2cabdde9c 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1092:0 +// src/engine/editor.h:1094:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index db4ebf876..566eecaf3 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:675:0 +// src/engine/editor.h:677:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_shape_axis.h b/generated/string_and_value_tables_shape_axis.h index 63630a454..9236d2a85 100644 --- a/generated/string_and_value_tables_shape_axis.h +++ b/generated/string_and_value_tables_shape_axis.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:92:0 +// src/engine/editor.h:94:0 link_internal counted_string ToStringPrefixless(shape_axis Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 6e5651a07..843962e58 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1034:0 +// src/engine/editor.h:1036:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index cdbd64dfe..ce9e684ea 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:731:0 +// src/engine/editor.h:733:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_voxel_rule_direction.h b/generated/string_and_value_tables_voxel_rule_direction.h index 38c48840e..197696a0d 100644 --- a/generated/string_and_value_tables_voxel_rule_direction.h +++ b/generated/string_and_value_tables_voxel_rule_direction.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:72:0 +// src/engine/editor.h:74:0 link_internal counted_string ToStringPrefixless(voxel_rule_direction Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 95126c827..4c4f27fc9 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:896:0 +// src/engine/editor.h:898:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 3e9b797ab..45d3d29c4 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:879:0 +// src/engine/editor.h:881:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index f674fe236..d43945934 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:902:0 +// src/engine/editor.h:904:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 72fc116b3..499736524 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:765:0 +// src/engine/editor.h:767:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 402f55995..52c7dbdc7 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:888:0 +// src/engine/editor.h:890:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index f26061007..3a648bcfd 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -761,7 +761,7 @@ DoSelectonModification( engine_resources *Engine, // Draw selection modification region // rect3 Draw = Rect3(&Result); - DEBUG_DrawSimSpaceAABB(Engine, &Draw, RGB_GREEN, 0.1f); + DEBUG_DrawSimSpaceAABB(Engine, &Draw, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS); Assert(Result.Min <= Result.Max); @@ -1361,7 +1361,6 @@ EditWorldSelection(engine_resources *Engine) if (Editor->Selection.Clicks) { - r32 Thickness = 0.10f; if (SelectionIncomplete(Editor->Selection.Clicks)) { @@ -1376,10 +1375,6 @@ EditWorldSelection(engine_resources *Engine) Editor->Selection.Region = RectMinMax(MinP, MaxP); } } - else - { - Thickness = 0.20f; - } aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); { @@ -1399,7 +1394,7 @@ EditWorldSelection(engine_resources *Engine) /* r32 InsetWidth = 0.25f; */ r32 InsetWidth = 0.f; v3 HiColor = RGB_GREEN; - r32 HiThickness = Thickness*1.2f; + r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS; HighlightFace(Engine, Face, SelectionAABB, InsetWidth, HiColor, HiThickness); @@ -1459,12 +1454,6 @@ EditWorldSelection(engine_resources *Engine) } } } - - // Draw selection box - // - - v3 BaseColor = RGB_WHITE; - DEBUG_DrawSimSpaceAABB(Engine, &SelectionAABB, BaseColor, Thickness); } @@ -2293,22 +2282,24 @@ DoWorldEditor(engine_resources *Engine) random_series S = {u64(Edit)}; v3 BaseColor = RandomV3Unilateral(&S); - f32 Size = DEFAULT_LINE_THICKNESS; + f32 Size = EDITOR_DEFAULT_SELECTION_THICKNESS; - if (Layer == Editor->CurrentLayer) - { - if (Edit == Editor->CurrentEdit) - { - Size = 3.f*DEFAULT_LINE_THICKNESS; - } - } + // Always highlight the hot edit if (Edit == Editor->HotEdit) { - Size = 5.f*DEFAULT_LINE_THICKNESS; + Size *= 3.f; + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); + } + else + { // But otherwise only highlight the edits on the current layer. + if (Layer == Editor->CurrentLayer) + { + if (Edit == Editor->CurrentEdit) { Size *= 2.f; } + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); + } } - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); } } Editor->HotEdit = 0; diff --git a/src/engine/editor.h b/src/engine/editor.h index 59aea8238..40d48ffeb 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1,3 +1,5 @@ +#define EDITOR_DEFAULT_SELECTION_THICKNESS (0.5f) + enum ui_layer_toolbar_actions poof(@gen_ui_toolbar) { From 5460850964f06dbb6c55341257eeb6d1622aa727 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 31 May 2025 17:03:26 -0700 Subject: [PATCH 254/421] Update stdlib; block_array change; layers panel working --- external/bonsai_stdlib | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- generated/block_array_bitmap_688853862.h | 314 +++++++--------- .../block_array_c_asset_thumbnail_688856411.h | 154 ++++---- ...ntity_ptr_688856411_struct_struct_struct.h | 160 ++++---- generated/block_array_c_gpu_timer_688735882.h | 152 ++++---- .../block_array_c_shader_ptr_688853971.h | 160 ++++---- generated/block_array_c_texture_688856411.h | 152 ++++---- generated/block_array_c_u32_688856411.h | 152 ++++---- generated/block_array_c_u8_cursor_688856411.h | 152 ++++---- ...k_queue_entry_build_chunk_mesh_688853862.h | 314 +++++++--------- generated/block_array_entity_688856407.h | 314 +++++++--------- .../block_array_entity_ptr_688856411_h.h | 162 ++++---- ...lock_array_file_traversal_node_688853862.h | 314 +++++++--------- ...lock_array_gpu_readback_buffer_688853862.h | 314 +++++++--------- .../block_array_h_asset_thumbnail_688856411.h | 162 ++++---- .../block_array_h_gpu_timer_688735882_0.h | 162 ++++---- .../block_array_h_shader_ptr_688853971_0.h | 162 ++++---- generated/block_array_h_texture_688856411.h | 162 ++++---- generated/block_array_h_texture_688856411_0.h | 162 ++++---- generated/block_array_h_u32_688856411.h | 162 ++++---- generated/block_array_h_u8_cursor_688856411.h | 162 ++++---- ...lock_array_h_world_chunk_ptr_688853862_0.h | 162 ++++---- generated/block_array_member_info_688856411.h | 314 +++++++--------- generated/block_array_model_688856411.h | 314 +++++++--------- .../block_array_octree_node_ptr_688853862.h | 322 ++++++++-------- ...block_array_picked_octree_node_688853862.h | 314 +++++++--------- .../block_array_standing_spot_688853862.h | 314 +++++++--------- generated/block_array_struct_688735882.h | 343 ----------------- generated/block_array_texture_ptr_688856411.h | 160 ++++---- generated/block_array_vox_data_688856411.h | 314 +++++++--------- ...lock_array_voxel_stack_element_688853862.h | 314 +++++++--------- .../block_array_world_chunk_ptr_688853862.h | 160 ++++---- generated/block_array_world_edit_688735882.h | 316 +++++++--------- ...y_world_edit_block_array_index_688735882.h | 354 ++++++++++++++++++ .../block_array_world_edit_layer_688735882.h | 316 +++++++--------- .../block_array_world_edit_ptr_688735882.h | 324 ++++++++-------- generated/buffer_asset.h | 6 + generated/buffer_bitmap.h | 6 + generated/buffer_bonsai_type_info.h | 6 + generated/buffer_c_token.h | 6 + generated/buffer_c_token_buffer.h | 6 + generated/buffer_counted_string.h | 6 + generated/buffer_file_traversal_node.h | 6 + generated/buffer_h_struct_u32.h | 6 + generated/buffer_model.h | 6 + generated/buffer_octree_node_ptr.h | 6 + generated/buffer_rect3i.h | 6 + generated/buffer_sort_key.h | 6 + generated/buffer_standing_spot.h | 6 + generated/buffer_thread_main_callback_type.h | 6 + generated/buffer_tile_ruleset.h | 6 + generated/buffer_u32.h | 6 + generated/buffer_u64.h | 6 + generated/buffer_ui_toggle_button_handle.h | 6 + generated/buffer_v3i.h | 6 + generated/buffer_voxel_synth_tile.h | 6 + generated/buffer_world_chunk_ptr.h | 6 + generated/cursor_v3i.h | 6 + generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 37 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 28 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 8 + generated/for_datatypes_fkubhsYl.h | 8 + generated/for_datatypes_kh9dwrCf.h | 3 +- generated/for_datatypes_kv3WBTai.h | 8 + .../generate_cursor_debug_profile_scope.h | 6 + ...generate_cursor_functions_c_token_cursor.h | 6 + generated/generate_cursor_functions_u64.h | 6 + generated/generate_cursor_octree_node.h | 6 + generated/generate_cursor_parser.h | 6 + generated/generate_cursor_texture.h | 6 + generated/generate_cursor_u8.h | 6 + generated/generate_cursor_v3.h | 6 + .../generate_cursor_voxel_stack_element.h | 6 + generated/hashtable_bonsai_type_info.h | 6 + generated/hashtable_counted_string.h | 6 + generated/hashtable_impl_ui_toggle.h | 6 + generated/hashtable_impl_window_layout.h | 6 + generated/hashtable_impl_xml_tag.h | 6 + generated/hashtable_parser.h | 6 + generated/hashtable_voxel_synth_tile.h | 6 + generated/hashtable_world_edit_brush.h | 8 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- generated/scalar_math_fuctions_451039071.h | 2 +- generated/serdes_struct_world_edit.h | 19 +- .../staticbuffer_u32_cursor_ptr_961996651.h | 6 + generated/stream_and_cursor_counted_string.h | 6 + generated/stream_and_cursor_s32.h | 6 + generated/stream_and_cursor_u32.h | 6 + .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...ing_and_value_tables_visible_region_size.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- generated/tiered_mesh_freelist.h | 6 + ...on_group_for_enum_engine_debug_view_mode.h | 2 +- jesse.bonsai.rdbg | Bin 16444 -> 16663 bytes jesse.make.sh | 4 +- jesse.tests.rdbg | Bin 7429 -> 7524 bytes make.sh | 2 +- src/engine/api.cpp | 5 +- src/engine/debug_draw.cpp | 2 +- src/engine/editor.cpp | 206 ++++++---- src/engine/editor.h | 34 +- src/engine/entity.cpp | 2 +- src/engine/loaders/vox.cpp | 2 +- src/engine/render_loop.cpp | 9 +- src/engine/world.cpp | 23 +- src/engine/world_update.cpp | 2 +- src/tests/containers/block_array.cpp | 135 ++----- 221 files changed, 4478 insertions(+), 4856 deletions(-) delete mode 100644 generated/block_array_struct_688735882.h create mode 100644 generated/block_array_world_edit_block_array_index_688735882.h diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index f681e61d6..83c5b6947 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit f681e61d6b842b46b5c21f4e4ec55d63e1b424ac +Subproject commit 83c5b6947d209d9126778efcd0b0cffba27f5000 diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 93963bb47..85809581f 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:867:0 +// src/engine/editor.h:858:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 4951db9ff..8ed9c0752 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1127:0 +// src/engine/editor.h:1118:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index ae2fba3fc..7f7b02eed 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1237:0 +// src/engine/editor.h:1228:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index b2fbf6a00..34e6c175d 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -6,23 +6,24 @@ struct bitmap_block { - u32 Index; - u32 At; - bitmap *Elements; - bitmap_block *Next; + /* u32 Index; */ + umm At; + bitmap Elements[8]; }; struct bitmap_block_array_index { - bitmap_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct bitmap_block_array { - bitmap_block *First; - bitmap_block *Current; + bitmap_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef bitmap_block_array bitmap_paged_list; link_internal bitmap_block_array_index operator++( bitmap_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( bitmap_block_array_index I0, bitmap_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( bitmap_block_array_index I0, bitmap_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( bitmap_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal bitmap_block_array_index -ZerothIndex( bitmap_block_array *Arr) +ZerothIndex( bitmap_block_array *Arr ) { - bitmap_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( bitmap_block_array *Arr) +link_internal bitmap_block_array_index +Capacity( bitmap_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + bitmap_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal bitmap_block_array_index -LastIndex( bitmap_block_array *Arr) +AtElements( bitmap_block_array *Arr ) { - bitmap_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + bitmap_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( bitmap_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal bitmap_block_array_index -AtElements( bitmap_block_array *Arr) +LastIndex( bitmap_block_array *Arr ) { bitmap_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( bitmap_block_array *Arr) +Count( bitmap_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal bitmap * -GetPtr(bitmap_block_array *Arr, bitmap_block_array_index Index) +link_internal bitmap_block * +GetBlock( bitmap_block_array *Arr, bitmap_block_array_index Index ) { - bitmap *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + bitmap_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal bitmap * -GetPtr(bitmap_block *Block, umm Index) +GetPtr( bitmap_block_array *Arr, bitmap_block_array_index Index ) { - bitmap *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + bitmap_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + bitmap *Result = (Block->Elements + ElementIndex); return Result; } link_internal bitmap * -GetPtr(bitmap_block_array *Arr, umm Index) +TryGetPtr(bitmap_block_array *Arr, bitmap_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - bitmap_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + bitmap * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - bitmap *Result = (Block->Elements+ElementIndex); return Result; } + link_internal bitmap * -TryGetPtr(bitmap_block_array *Arr, umm Index) +GetPtr( bitmap_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - bitmap *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + bitmap_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(bitmap_block *Block) +link_internal bitmap * +TryGetPtr(bitmap_block_array *Arr, umm Index) { - return Block->At; + bitmap * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + bitmap_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal bitmap_block * -Allocate_bitmap_block(memory_arena *Memory) -{ - bitmap_block *Result = Allocate( bitmap_block, Memory, 1); - Result->Elements = Allocate( bitmap, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( bitmap_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal bitmap * @@ -228,82 +211,63 @@ Set( bitmap_block_array *Arr, bitmap *Element, bitmap_block_array_index Index ) { - bitmap *Result = {}; - if (Index.Block) - { - bitmap *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + bitmap_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( bitmap_block_array *Array, bitmap_block_array_index Index) +NewBlock( bitmap_block_array *Arr ) { - bitmap_block_array_index LastI = LastIndex(Array); - - bitmap *Element = GetPtr(Array, Index); - bitmap *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + bitmap_block *NewBlock = Allocate( bitmap_block , Arr->Memory, 1); + bitmap_block **NewBlockPtrs = Allocate( bitmap_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - bitmap_block *Current = Array->First; - bitmap_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( bitmap_block_array *Array, bitmap_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( bitmap_block_array *Array, bitmap_block_array_index Index) +RemoveOrdered( bitmap_block_array *Array, bitmap_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + bitmap *Prev = {}; - while (NextI < End) + bitmap_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + bitmap *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( bitmap_block_array *Array, bitmap *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_bitmap_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - bitmap_block *Next = Allocate_bitmap_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - bitmap *Result = Array->Current->Elements + Array->Current->At; + bitmap *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( bitmap_block_array *Array ) return Result; } +link_internal void +Shift( bitmap_block_array *Array, bitmap *Element ) +{ + Assert(Array->Memory); + bitmap *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 5b5cd7e0a..9a70f1322 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,21 +1,20 @@ -// src/engine/editor.cpp:105:0 +// src/engine/editor.cpp:119:0 -link_internal asset_thumbnail_block * -Allocate_asset_thumbnail_block(memory_arena *Memory) -{ - asset_thumbnail_block *Result = Allocate( asset_thumbnail_block, Memory, 1); - Result->Elements = Allocate( asset_thumbnail, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( asset_thumbnail_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal asset_thumbnail * @@ -23,82 +22,63 @@ Set( asset_thumbnail_block_array *Arr, asset_thumbnail *Element, asset_thumbnail_block_array_index Index ) { - asset_thumbnail *Result = {}; - if (Index.Block) - { - asset_thumbnail *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + asset_thumbnail_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index) +NewBlock( asset_thumbnail_block_array *Arr ) { - asset_thumbnail_block_array_index LastI = LastIndex(Array); - - asset_thumbnail *Element = GetPtr(Array, Index); - asset_thumbnail *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); + asset_thumbnail_block *NewBlock = Allocate( asset_thumbnail_block , Arr->Memory, 1); + asset_thumbnail_block **NewBlockPtrs = Allocate( asset_thumbnail_block*, Arr->Memory, Arr->BlockCount+1); - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - asset_thumbnail_block *Current = Array->First; - asset_thumbnail_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index) +RemoveOrdered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + asset_thumbnail *Prev = {}; - while (NextI < End) + asset_thumbnail_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + asset_thumbnail *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -142,28 +122,14 @@ Push( asset_thumbnail_block_array *Array, asset_thumbnail *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_asset_thumbnail_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - asset_thumbnail_block *Next = Allocate_asset_thumbnail_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - asset_thumbnail *Result = Array->Current->Elements + Array->Current->At; + asset_thumbnail *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -176,3 +142,23 @@ Push( asset_thumbnail_block_array *Array ) return Result; } +link_internal void +Shift( asset_thumbnail_block_array *Array, asset_thumbnail *Element ) +{ + Assert(Array->Memory); + asset_thumbnail *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h index 3c4108a31..08971c621 100644 --- a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h +++ b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h @@ -4,18 +4,17 @@ -link_internal entity_ptr_block * -Allocate_entity_ptr_block(memory_arena *Memory) -{ - entity_ptr_block *Result = Allocate( entity_ptr_block, Memory, 1); - Result->Elements = Allocate( entity_ptr, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( entity_ptr_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal entity_ptr @@ -23,82 +22,63 @@ Set( entity_ptr_block_array *Arr, entity_ptr Element, entity_ptr_block_array_index Index ) { - entity_ptr Result = {}; - if (Index.Block) - { - entity_ptr *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = Element; - - Result = *Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + entity_ptr_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = Element; + return *Slot; } link_internal void -RemoveUnordered( entity_ptr_block_array *Array, entity_ptr_block_array_index Index) +NewBlock( entity_ptr_block_array *Arr ) { - entity_ptr_block_array_index LastI = LastIndex(Array); - - entity_ptr Element = GetPtr(Array, Index); - entity_ptr LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); + entity_ptr_block *NewBlock = Allocate( entity_ptr_block , Arr->Memory, 1); + entity_ptr_block **NewBlockPtrs = Allocate( entity_ptr_block*, Arr->Memory, Arr->BlockCount+1); - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - entity_ptr_block *Current = Array->First; - entity_ptr_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( entity_ptr_block_array *Array, entity_ptr_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( entity_ptr_block_array *Array, entity_ptr_block_array_index Index) +RemoveOrdered( entity_ptr_block_array *Array, entity_ptr_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + entity_ptr Prev = {}; - while (NextI < End) + entity_ptr_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + entity_ptr E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -137,42 +117,48 @@ IsValid(entity_ptr_block_array_index *Index) return Result; } -link_internal entity_ptr * -Push( entity_ptr_block_array *Array, entity_ptr *Element) +link_internal entity_ptr +Push( entity_ptr_block_array *Array, entity_ptr Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_entity_ptr_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - entity_ptr_block *Next = Allocate_entity_ptr_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - entity_ptr *Result = Array->Current->Elements + Array->Current->At; + entity_ptr Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } -link_internal entity_ptr * +link_internal entity_ptr Push( entity_ptr_block_array *Array ) { entity_ptr Element = {}; - auto Result = Push(Array, &Element); + auto Result = Push(Array, Element); return Result; } +link_internal void +Shift( entity_ptr_block_array *Array, entity_ptr Element ) +{ + Assert(Array->Memory); + entity_ptr Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index 28353a348..4b1e452e3 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -4,18 +4,17 @@ -link_internal gpu_timer_block * -Allocate_gpu_timer_block(memory_arena *Memory) -{ - gpu_timer_block *Result = Allocate( gpu_timer_block, Memory, 1); - Result->Elements = Allocate( gpu_timer, Memory, 128); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( gpu_timer_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal gpu_timer * @@ -23,82 +22,63 @@ Set( gpu_timer_block_array *Arr, gpu_timer *Element, gpu_timer_block_array_index Index ) { - gpu_timer *Result = {}; - if (Index.Block) - { - gpu_timer *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + gpu_timer_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 128; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index) +NewBlock( gpu_timer_block_array *Arr ) { - gpu_timer_block_array_index LastI = LastIndex(Array); - - gpu_timer *Element = GetPtr(Array, Index); - gpu_timer *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); + gpu_timer_block *NewBlock = Allocate( gpu_timer_block , Arr->Memory, 1); + gpu_timer_block **NewBlockPtrs = Allocate( gpu_timer_block*, Arr->Memory, Arr->BlockCount+1); - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - gpu_timer_block *Current = Array->First; - gpu_timer_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index) +RemoveOrdered( gpu_timer_block_array *Array, gpu_timer_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + gpu_timer *Prev = {}; - while (NextI < End) + gpu_timer_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + gpu_timer *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -142,28 +122,14 @@ Push( gpu_timer_block_array *Array, gpu_timer *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_gpu_timer_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 128) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - gpu_timer_block *Next = Allocate_gpu_timer_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - gpu_timer *Result = Array->Current->Elements + Array->Current->At; + gpu_timer *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -176,3 +142,23 @@ Push( gpu_timer_block_array *Array ) return Result; } +link_internal void +Shift( gpu_timer_block_array *Array, gpu_timer *Element ) +{ + Assert(Array->Memory); + gpu_timer *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index 92af153b5..47118df36 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -4,18 +4,17 @@ -link_internal shader_ptr_block * -Allocate_shader_ptr_block(memory_arena *Memory) -{ - shader_ptr_block *Result = Allocate( shader_ptr_block, Memory, 1); - Result->Elements = Allocate( shader_ptr, Memory, 64); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( shader_ptr_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal shader_ptr @@ -23,82 +22,63 @@ Set( shader_ptr_block_array *Arr, shader_ptr Element, shader_ptr_block_array_index Index ) { - shader_ptr Result = {}; - if (Index.Block) - { - shader_ptr *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = Element; - - Result = *Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + shader_ptr_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 64; + auto Slot = Block->Elements+ElementIndex; + *Slot = Element; + return *Slot; } link_internal void -RemoveUnordered( shader_ptr_block_array *Array, shader_ptr_block_array_index Index) +NewBlock( shader_ptr_block_array *Arr ) { - shader_ptr_block_array_index LastI = LastIndex(Array); - - shader_ptr Element = GetPtr(Array, Index); - shader_ptr LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); + shader_ptr_block *NewBlock = Allocate( shader_ptr_block , Arr->Memory, 1); + shader_ptr_block **NewBlockPtrs = Allocate( shader_ptr_block*, Arr->Memory, Arr->BlockCount+1); - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - shader_ptr_block *Current = Array->First; - shader_ptr_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( shader_ptr_block_array *Array, shader_ptr_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( shader_ptr_block_array *Array, shader_ptr_block_array_index Index) +RemoveOrdered( shader_ptr_block_array *Array, shader_ptr_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + shader_ptr Prev = {}; - while (NextI < End) + shader_ptr_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + shader_ptr E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -137,42 +117,48 @@ IsValid(shader_ptr_block_array_index *Index) return Result; } -link_internal shader_ptr * -Push( shader_ptr_block_array *Array, shader_ptr *Element) +link_internal shader_ptr +Push( shader_ptr_block_array *Array, shader_ptr Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_shader_ptr_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 64) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - shader_ptr_block *Next = Allocate_shader_ptr_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - shader_ptr *Result = Array->Current->Elements + Array->Current->At; + shader_ptr Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } -link_internal shader_ptr * +link_internal shader_ptr Push( shader_ptr_block_array *Array ) { shader_ptr Element = {}; - auto Result = Push(Array, &Element); + auto Result = Push(Array, Element); return Result; } +link_internal void +Shift( shader_ptr_block_array *Array, shader_ptr Element ) +{ + Assert(Array->Memory); + shader_ptr Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index 37c428788..2a9bde8e6 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -4,18 +4,17 @@ -link_internal texture_block * -Allocate_texture_block(memory_arena *Memory) -{ - texture_block *Result = Allocate( texture_block, Memory, 1); - Result->Elements = Allocate( texture, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( texture_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal texture * @@ -23,82 +22,63 @@ Set( texture_block_array *Arr, texture *Element, texture_block_array_index Index ) { - texture *Result = {}; - if (Index.Block) - { - texture *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + texture_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( texture_block_array *Array, texture_block_array_index Index) +NewBlock( texture_block_array *Arr ) { - texture_block_array_index LastI = LastIndex(Array); - - texture *Element = GetPtr(Array, Index); - texture *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); + texture_block *NewBlock = Allocate( texture_block , Arr->Memory, 1); + texture_block **NewBlockPtrs = Allocate( texture_block*, Arr->Memory, Arr->BlockCount+1); - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - texture_block *Current = Array->First; - texture_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( texture_block_array *Array, texture_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( texture_block_array *Array, texture_block_array_index Index) +RemoveOrdered( texture_block_array *Array, texture_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + texture *Prev = {}; - while (NextI < End) + texture_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + texture *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -142,28 +122,14 @@ Push( texture_block_array *Array, texture *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_texture_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - texture_block *Next = Allocate_texture_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - texture *Result = Array->Current->Elements + Array->Current->At; + texture *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -176,3 +142,23 @@ Push( texture_block_array *Array ) return Result; } +link_internal void +Shift( texture_block_array *Array, texture *Element ) +{ + Assert(Array->Memory); + texture *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index 53bddfe76..a7e79f3d8 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -4,18 +4,17 @@ -link_internal u32_block * -Allocate_u32_block(memory_arena *Memory) -{ - u32_block *Result = Allocate( u32_block, Memory, 1); - Result->Elements = Allocate( u32, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( u32_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal u32 * @@ -23,82 +22,63 @@ Set( u32_block_array *Arr, u32 *Element, u32_block_array_index Index ) { - u32 *Result = {}; - if (Index.Block) - { - u32 *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + u32_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( u32_block_array *Array, u32_block_array_index Index) +NewBlock( u32_block_array *Arr ) { - u32_block_array_index LastI = LastIndex(Array); - - u32 *Element = GetPtr(Array, Index); - u32 *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); + u32_block *NewBlock = Allocate( u32_block , Arr->Memory, 1); + u32_block **NewBlockPtrs = Allocate( u32_block*, Arr->Memory, Arr->BlockCount+1); - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - u32_block *Current = Array->First; - u32_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( u32_block_array *Array, u32_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( u32_block_array *Array, u32_block_array_index Index) +RemoveOrdered( u32_block_array *Array, u32_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + u32 *Prev = {}; - while (NextI < End) + u32_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + u32 *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -142,28 +122,14 @@ Push( u32_block_array *Array, u32 *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_u32_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - u32_block *Next = Allocate_u32_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - u32 *Result = Array->Current->Elements + Array->Current->At; + u32 *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -176,3 +142,23 @@ Push( u32_block_array *Array ) return Result; } +link_internal void +Shift( u32_block_array *Array, u32 *Element ) +{ + Assert(Array->Memory); + u32 *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index 26cd6d007..5a4ce6db0 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -4,18 +4,17 @@ -link_internal u8_cursor_block * -Allocate_u8_cursor_block(memory_arena *Memory) -{ - u8_cursor_block *Result = Allocate( u8_cursor_block, Memory, 1); - Result->Elements = Allocate( u8_cursor, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( u8_cursor_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal u8_cursor * @@ -23,82 +22,63 @@ Set( u8_cursor_block_array *Arr, u8_cursor *Element, u8_cursor_block_array_index Index ) { - u8_cursor *Result = {}; - if (Index.Block) - { - u8_cursor *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + u8_cursor_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index) +NewBlock( u8_cursor_block_array *Arr ) { - u8_cursor_block_array_index LastI = LastIndex(Array); - - u8_cursor *Element = GetPtr(Array, Index); - u8_cursor *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); + u8_cursor_block *NewBlock = Allocate( u8_cursor_block , Arr->Memory, 1); + u8_cursor_block **NewBlockPtrs = Allocate( u8_cursor_block*, Arr->Memory, Arr->BlockCount+1); - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - u8_cursor_block *Current = Array->First; - u8_cursor_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index) +RemoveOrdered( u8_cursor_block_array *Array, u8_cursor_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + u8_cursor *Prev = {}; - while (NextI < End) + u8_cursor_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + u8_cursor *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -142,28 +122,14 @@ Push( u8_cursor_block_array *Array, u8_cursor *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_u8_cursor_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - u8_cursor_block *Next = Allocate_u8_cursor_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - u8_cursor *Result = Array->Current->Elements + Array->Current->At; + u8_cursor *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -176,3 +142,23 @@ Push( u8_cursor_block_array *Array ) return Result; } +link_internal void +Shift( u8_cursor_block_array *Array, u8_cursor *Element ) +{ + Assert(Array->Memory); + u8_cursor *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index afd32e856..2a203c903 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -6,23 +6,24 @@ struct dummy_work_queue_entry_build_chunk_mesh_block { - u32 Index; - u32 At; - dummy_work_queue_entry_build_chunk_mesh *Elements; - dummy_work_queue_entry_build_chunk_mesh_block *Next; + /* u32 Index; */ + umm At; + dummy_work_queue_entry_build_chunk_mesh Elements[8]; }; struct dummy_work_queue_entry_build_chunk_mesh_block_array_index { - dummy_work_queue_entry_build_chunk_mesh_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct dummy_work_queue_entry_build_chunk_mesh_block_array { - dummy_work_queue_entry_build_chunk_mesh_block *First; - dummy_work_queue_entry_build_chunk_mesh_block *Current; + dummy_work_queue_entry_build_chunk_mesh_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef dummy_work_queue_entry_build_chunk_mesh_block_array dummy_work_queue_ent link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index operator++( dummy_work_queue_entry_build_chunk_mesh_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( dummy_work_queue_entry_build_chunk_mesh_block_array_index I0, dummy_work_queue_entry_build_chunk_mesh_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( dummy_work_queue_entry_build_chunk_mesh_block_array_index I0, dummy_work_queue_entry_build_chunk_mesh_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( dummy_work_queue_entry_build_chunk_mesh_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index -ZerothIndex( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +ZerothIndex( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr ) { - dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index +Capacity( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index -LastIndex( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +AtElements( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr ) { - dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index -AtElements( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +LastIndex( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr ) { dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr) +Count( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal dummy_work_queue_entry_build_chunk_mesh * -GetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) +link_internal dummy_work_queue_entry_build_chunk_mesh_block * +GetBlock( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index ) { - dummy_work_queue_entry_build_chunk_mesh *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + dummy_work_queue_entry_build_chunk_mesh_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal dummy_work_queue_entry_build_chunk_mesh * -GetPtr(dummy_work_queue_entry_build_chunk_mesh_block *Block, umm Index) +GetPtr( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index ) { - dummy_work_queue_entry_build_chunk_mesh *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + dummy_work_queue_entry_build_chunk_mesh_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + dummy_work_queue_entry_build_chunk_mesh *Result = (Block->Elements + ElementIndex); return Result; } link_internal dummy_work_queue_entry_build_chunk_mesh * -GetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) +TryGetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - dummy_work_queue_entry_build_chunk_mesh_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + dummy_work_queue_entry_build_chunk_mesh * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - dummy_work_queue_entry_build_chunk_mesh *Result = (Block->Elements+ElementIndex); return Result; } + link_internal dummy_work_queue_entry_build_chunk_mesh * -TryGetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) +GetPtr( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - dummy_work_queue_entry_build_chunk_mesh *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + dummy_work_queue_entry_build_chunk_mesh_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(dummy_work_queue_entry_build_chunk_mesh_block *Block) +link_internal dummy_work_queue_entry_build_chunk_mesh * +TryGetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) { - return Block->At; + dummy_work_queue_entry_build_chunk_mesh * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + dummy_work_queue_entry_build_chunk_mesh_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal dummy_work_queue_entry_build_chunk_mesh_block * -Allocate_dummy_work_queue_entry_build_chunk_mesh_block(memory_arena *Memory) -{ - dummy_work_queue_entry_build_chunk_mesh_block *Result = Allocate( dummy_work_queue_entry_build_chunk_mesh_block, Memory, 1); - Result->Elements = Allocate( dummy_work_queue_entry_build_chunk_mesh, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( dummy_work_queue_entry_build_chunk_mesh_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal dummy_work_queue_entry_build_chunk_mesh * @@ -228,82 +211,63 @@ Set( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, dummy_work_queue_entry_build_chunk_mesh *Element, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index ) { - dummy_work_queue_entry_build_chunk_mesh *Result = {}; - if (Index.Block) - { - dummy_work_queue_entry_build_chunk_mesh *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + dummy_work_queue_entry_build_chunk_mesh_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) +NewBlock( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr ) { - dummy_work_queue_entry_build_chunk_mesh_block_array_index LastI = LastIndex(Array); - - dummy_work_queue_entry_build_chunk_mesh *Element = GetPtr(Array, Index); - dummy_work_queue_entry_build_chunk_mesh *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + dummy_work_queue_entry_build_chunk_mesh_block *NewBlock = Allocate( dummy_work_queue_entry_build_chunk_mesh_block , Arr->Memory, 1); + dummy_work_queue_entry_build_chunk_mesh_block **NewBlockPtrs = Allocate( dummy_work_queue_entry_build_chunk_mesh_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - dummy_work_queue_entry_build_chunk_mesh_block *Current = Array->First; - dummy_work_queue_entry_build_chunk_mesh_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) +RemoveOrdered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + dummy_work_queue_entry_build_chunk_mesh *Prev = {}; - while (NextI < End) + dummy_work_queue_entry_build_chunk_mesh_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + dummy_work_queue_entry_build_chunk_mesh *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_que { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_dummy_work_queue_entry_build_chunk_mesh_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - dummy_work_queue_entry_build_chunk_mesh_block *Next = Allocate_dummy_work_queue_entry_build_chunk_mesh_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - dummy_work_queue_entry_build_chunk_mesh *Result = Array->Current->Elements + Array->Current->At; + dummy_work_queue_entry_build_chunk_mesh *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( dummy_work_queue_entry_build_chunk_mesh_block_array *Array ) return Result; } +link_internal void +Shift( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Element ) +{ + Assert(Array->Memory); + dummy_work_queue_entry_build_chunk_mesh *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index cf5fba96d..507974d3f 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -6,23 +6,24 @@ struct entity_block { - u32 Index; - u32 At; - entity *Elements; - entity_block *Next; + /* u32 Index; */ + umm At; + entity Elements[8]; }; struct entity_block_array_index { - entity_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct entity_block_array { - entity_block *First; - entity_block *Current; + entity_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef entity_block_array entity_paged_list; link_internal entity_block_array_index operator++( entity_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( entity_block_array_index I0, entity_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( entity_block_array_index I0, entity_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( entity_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal entity_block_array_index -ZerothIndex( entity_block_array *Arr) +ZerothIndex( entity_block_array *Arr ) { - entity_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( entity_block_array *Arr) +link_internal entity_block_array_index +Capacity( entity_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + entity_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal entity_block_array_index -LastIndex( entity_block_array *Arr) +AtElements( entity_block_array *Arr ) { - entity_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + entity_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( entity_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal entity_block_array_index -AtElements( entity_block_array *Arr) +LastIndex( entity_block_array *Arr ) { entity_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( entity_block_array *Arr) +Count( entity_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal entity * -GetPtr(entity_block_array *Arr, entity_block_array_index Index) +link_internal entity_block * +GetBlock( entity_block_array *Arr, entity_block_array_index Index ) { - entity *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + entity_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal entity * -GetPtr(entity_block *Block, umm Index) +GetPtr( entity_block_array *Arr, entity_block_array_index Index ) { - entity *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + entity_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + entity *Result = (Block->Elements + ElementIndex); return Result; } link_internal entity * -GetPtr(entity_block_array *Arr, umm Index) +TryGetPtr(entity_block_array *Arr, entity_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - entity_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + entity * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - entity *Result = (Block->Elements+ElementIndex); return Result; } + link_internal entity * -TryGetPtr(entity_block_array *Arr, umm Index) +GetPtr( entity_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - entity *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + entity_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(entity_block *Block) +link_internal entity * +TryGetPtr(entity_block_array *Arr, umm Index) { - return Block->At; + entity * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + entity_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal entity_block * -Allocate_entity_block(memory_arena *Memory) -{ - entity_block *Result = Allocate( entity_block, Memory, 1); - Result->Elements = Allocate( entity, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( entity_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal entity * @@ -228,82 +211,63 @@ Set( entity_block_array *Arr, entity *Element, entity_block_array_index Index ) { - entity *Result = {}; - if (Index.Block) - { - entity *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + entity_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( entity_block_array *Array, entity_block_array_index Index) +NewBlock( entity_block_array *Arr ) { - entity_block_array_index LastI = LastIndex(Array); - - entity *Element = GetPtr(Array, Index); - entity *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + entity_block *NewBlock = Allocate( entity_block , Arr->Memory, 1); + entity_block **NewBlockPtrs = Allocate( entity_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - entity_block *Current = Array->First; - entity_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( entity_block_array *Array, entity_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( entity_block_array *Array, entity_block_array_index Index) +RemoveOrdered( entity_block_array *Array, entity_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + entity *Prev = {}; - while (NextI < End) + entity_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + entity *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( entity_block_array *Array, entity *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_entity_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - entity_block *Next = Allocate_entity_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - entity *Result = Array->Current->Elements + Array->Current->At; + entity *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( entity_block_array *Array ) return Result; } +link_internal void +Shift( entity_block_array *Array, entity *Element ) +{ + Assert(Array->Memory); + entity *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_entity_ptr_688856411_h.h b/generated/block_array_entity_ptr_688856411_h.h index 23f5454eb..65c9f99f0 100644 --- a/generated/block_array_entity_ptr_688856411_h.h +++ b/generated/block_array_entity_ptr_688856411_h.h @@ -6,23 +6,24 @@ struct entity_ptr_block { - u32 Index; - u32 At; - entity_ptr *Elements; - entity_ptr_block *Next; + /* u32 Index; */ + umm At; + entity_ptr Elements[8]; }; struct entity_ptr_block_array_index { - entity_ptr_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct entity_ptr_block_array { - entity_ptr_block *First; - entity_ptr_block *Current; + entity_ptr_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,144 +65,127 @@ typedef entity_ptr_block_array entity_ptr_paged_list; link_internal entity_ptr_block_array_index operator++( entity_ptr_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( entity_ptr_block_array_index I0, entity_ptr_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( entity_ptr_block_array_index I0, entity_ptr_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( entity_ptr_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal entity_ptr_block_array_index -ZerothIndex( entity_ptr_block_array *Arr) +ZerothIndex( entity_ptr_block_array *Arr ) { - entity_ptr_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( entity_ptr_block_array *Arr) +link_internal entity_ptr_block_array_index +Capacity( entity_ptr_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + entity_ptr_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal entity_ptr_block_array_index -LastIndex( entity_ptr_block_array *Arr) +AtElements( entity_ptr_block_array *Arr ) { - entity_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + entity_ptr_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( entity_ptr_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; return Result; } + link_internal entity_ptr_block_array_index -AtElements( entity_ptr_block_array *Arr) +LastIndex( entity_ptr_block_array *Arr ) { entity_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( entity_ptr_block_array *Arr) +Count( entity_ptr_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal entity_ptr -GetPtr(entity_ptr_block_array *Arr, entity_ptr_block_array_index Index) +link_internal entity_ptr_block * +GetBlock( entity_ptr_block_array *Arr, entity_ptr_block_array_index Index ) { - entity_ptr Result = {}; - if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + entity_ptr_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal entity_ptr -GetPtr(entity_ptr_block *Block, umm Index) +GetPtr( entity_ptr_block_array *Arr, entity_ptr_block_array_index Index ) { - entity_ptr Result = {}; - if (Index < Block->At) { Result = *(Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + entity_ptr_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + entity_ptr Result = *(Block->Elements + ElementIndex); return Result; } link_internal entity_ptr -GetPtr(entity_ptr_block_array *Arr, umm Index) +TryGetPtr(entity_ptr_block_array *Arr, entity_ptr_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - entity_ptr_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + entity_ptr Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - entity_ptr Result = *(Block->Elements+ElementIndex); return Result; } + link_internal entity_ptr -TryGetPtr(entity_ptr_block_array *Arr, umm Index) +GetPtr( entity_ptr_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - entity_ptr Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + entity_ptr_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(entity_ptr_block *Block) +link_internal entity_ptr +TryGetPtr(entity_ptr_block_array *Arr, umm Index) { - return Block->At; + entity_ptr Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + entity_ptr_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index e366a6543..4725de218 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -6,23 +6,24 @@ struct file_traversal_node_block { - u32 Index; - u32 At; - file_traversal_node *Elements; - file_traversal_node_block *Next; + /* u32 Index; */ + umm At; + file_traversal_node Elements[8]; }; struct file_traversal_node_block_array_index { - file_traversal_node_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct file_traversal_node_block_array { - file_traversal_node_block *First; - file_traversal_node_block *Current; + file_traversal_node_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef file_traversal_node_block_array file_traversal_node_paged_list; link_internal file_traversal_node_block_array_index operator++( file_traversal_node_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( file_traversal_node_block_array_index I0, file_traversal_node_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( file_traversal_node_block_array_index I0, file_traversal_node_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( file_traversal_node_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal file_traversal_node_block_array_index -ZerothIndex( file_traversal_node_block_array *Arr) +ZerothIndex( file_traversal_node_block_array *Arr ) { - file_traversal_node_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( file_traversal_node_block_array *Arr) +link_internal file_traversal_node_block_array_index +Capacity( file_traversal_node_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + file_traversal_node_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal file_traversal_node_block_array_index -LastIndex( file_traversal_node_block_array *Arr) +AtElements( file_traversal_node_block_array *Arr ) { - file_traversal_node_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + file_traversal_node_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( file_traversal_node_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal file_traversal_node_block_array_index -AtElements( file_traversal_node_block_array *Arr) +LastIndex( file_traversal_node_block_array *Arr ) { file_traversal_node_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( file_traversal_node_block_array *Arr) +Count( file_traversal_node_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal file_traversal_node * -GetPtr(file_traversal_node_block_array *Arr, file_traversal_node_block_array_index Index) +link_internal file_traversal_node_block * +GetBlock( file_traversal_node_block_array *Arr, file_traversal_node_block_array_index Index ) { - file_traversal_node *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + file_traversal_node_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal file_traversal_node * -GetPtr(file_traversal_node_block *Block, umm Index) +GetPtr( file_traversal_node_block_array *Arr, file_traversal_node_block_array_index Index ) { - file_traversal_node *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + file_traversal_node_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + file_traversal_node *Result = (Block->Elements + ElementIndex); return Result; } link_internal file_traversal_node * -GetPtr(file_traversal_node_block_array *Arr, umm Index) +TryGetPtr(file_traversal_node_block_array *Arr, file_traversal_node_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - file_traversal_node_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + file_traversal_node * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - file_traversal_node *Result = (Block->Elements+ElementIndex); return Result; } + link_internal file_traversal_node * -TryGetPtr(file_traversal_node_block_array *Arr, umm Index) +GetPtr( file_traversal_node_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - file_traversal_node *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + file_traversal_node_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(file_traversal_node_block *Block) +link_internal file_traversal_node * +TryGetPtr(file_traversal_node_block_array *Arr, umm Index) { - return Block->At; + file_traversal_node * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + file_traversal_node_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal file_traversal_node_block * -Allocate_file_traversal_node_block(memory_arena *Memory) -{ - file_traversal_node_block *Result = Allocate( file_traversal_node_block, Memory, 1); - Result->Elements = Allocate( file_traversal_node, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( file_traversal_node_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal file_traversal_node * @@ -228,82 +211,63 @@ Set( file_traversal_node_block_array *Arr, file_traversal_node *Element, file_traversal_node_block_array_index Index ) { - file_traversal_node *Result = {}; - if (Index.Block) - { - file_traversal_node *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + file_traversal_node_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index) +NewBlock( file_traversal_node_block_array *Arr ) { - file_traversal_node_block_array_index LastI = LastIndex(Array); - - file_traversal_node *Element = GetPtr(Array, Index); - file_traversal_node *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + file_traversal_node_block *NewBlock = Allocate( file_traversal_node_block , Arr->Memory, 1); + file_traversal_node_block **NewBlockPtrs = Allocate( file_traversal_node_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - file_traversal_node_block *Current = Array->First; - file_traversal_node_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index) +RemoveOrdered( file_traversal_node_block_array *Array, file_traversal_node_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + file_traversal_node *Prev = {}; - while (NextI < End) + file_traversal_node_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + file_traversal_node *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( file_traversal_node_block_array *Array, file_traversal_node *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_file_traversal_node_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - file_traversal_node_block *Next = Allocate_file_traversal_node_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - file_traversal_node *Result = Array->Current->Elements + Array->Current->At; + file_traversal_node *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( file_traversal_node_block_array *Array ) return Result; } +link_internal void +Shift( file_traversal_node_block_array *Array, file_traversal_node *Element ) +{ + Assert(Array->Memory); + file_traversal_node *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 59c2dec45..dcd00acee 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -6,23 +6,24 @@ struct gpu_readback_buffer_block { - u32 Index; - u32 At; - gpu_readback_buffer *Elements; - gpu_readback_buffer_block *Next; + /* u32 Index; */ + umm At; + gpu_readback_buffer Elements[8]; }; struct gpu_readback_buffer_block_array_index { - gpu_readback_buffer_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct gpu_readback_buffer_block_array { - gpu_readback_buffer_block *First; - gpu_readback_buffer_block *Current; + gpu_readback_buffer_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef gpu_readback_buffer_block_array gpu_readback_buffer_paged_list; link_internal gpu_readback_buffer_block_array_index operator++( gpu_readback_buffer_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( gpu_readback_buffer_block_array_index I0, gpu_readback_buffer_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( gpu_readback_buffer_block_array_index I0, gpu_readback_buffer_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( gpu_readback_buffer_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal gpu_readback_buffer_block_array_index -ZerothIndex( gpu_readback_buffer_block_array *Arr) +ZerothIndex( gpu_readback_buffer_block_array *Arr ) { - gpu_readback_buffer_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( gpu_readback_buffer_block_array *Arr) +link_internal gpu_readback_buffer_block_array_index +Capacity( gpu_readback_buffer_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + gpu_readback_buffer_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal gpu_readback_buffer_block_array_index -LastIndex( gpu_readback_buffer_block_array *Arr) +AtElements( gpu_readback_buffer_block_array *Arr ) { - gpu_readback_buffer_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + gpu_readback_buffer_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( gpu_readback_buffer_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal gpu_readback_buffer_block_array_index -AtElements( gpu_readback_buffer_block_array *Arr) +LastIndex( gpu_readback_buffer_block_array *Arr ) { gpu_readback_buffer_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( gpu_readback_buffer_block_array *Arr) +Count( gpu_readback_buffer_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal gpu_readback_buffer * -GetPtr(gpu_readback_buffer_block_array *Arr, gpu_readback_buffer_block_array_index Index) +link_internal gpu_readback_buffer_block * +GetBlock( gpu_readback_buffer_block_array *Arr, gpu_readback_buffer_block_array_index Index ) { - gpu_readback_buffer *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + gpu_readback_buffer_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal gpu_readback_buffer * -GetPtr(gpu_readback_buffer_block *Block, umm Index) +GetPtr( gpu_readback_buffer_block_array *Arr, gpu_readback_buffer_block_array_index Index ) { - gpu_readback_buffer *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + gpu_readback_buffer_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + gpu_readback_buffer *Result = (Block->Elements + ElementIndex); return Result; } link_internal gpu_readback_buffer * -GetPtr(gpu_readback_buffer_block_array *Arr, umm Index) +TryGetPtr(gpu_readback_buffer_block_array *Arr, gpu_readback_buffer_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - gpu_readback_buffer_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + gpu_readback_buffer * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - gpu_readback_buffer *Result = (Block->Elements+ElementIndex); return Result; } + link_internal gpu_readback_buffer * -TryGetPtr(gpu_readback_buffer_block_array *Arr, umm Index) +GetPtr( gpu_readback_buffer_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - gpu_readback_buffer *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + gpu_readback_buffer_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(gpu_readback_buffer_block *Block) +link_internal gpu_readback_buffer * +TryGetPtr(gpu_readback_buffer_block_array *Arr, umm Index) { - return Block->At; + gpu_readback_buffer * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + gpu_readback_buffer_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal gpu_readback_buffer_block * -Allocate_gpu_readback_buffer_block(memory_arena *Memory) -{ - gpu_readback_buffer_block *Result = Allocate( gpu_readback_buffer_block, Memory, 1); - Result->Elements = Allocate( gpu_readback_buffer, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( gpu_readback_buffer_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal gpu_readback_buffer * @@ -228,82 +211,63 @@ Set( gpu_readback_buffer_block_array *Arr, gpu_readback_buffer *Element, gpu_readback_buffer_block_array_index Index ) { - gpu_readback_buffer *Result = {}; - if (Index.Block) - { - gpu_readback_buffer *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + gpu_readback_buffer_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) +NewBlock( gpu_readback_buffer_block_array *Arr ) { - gpu_readback_buffer_block_array_index LastI = LastIndex(Array); - - gpu_readback_buffer *Element = GetPtr(Array, Index); - gpu_readback_buffer *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + gpu_readback_buffer_block *NewBlock = Allocate( gpu_readback_buffer_block , Arr->Memory, 1); + gpu_readback_buffer_block **NewBlockPtrs = Allocate( gpu_readback_buffer_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - gpu_readback_buffer_block *Current = Array->First; - gpu_readback_buffer_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) +RemoveOrdered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + gpu_readback_buffer *Prev = {}; - while (NextI < End) + gpu_readback_buffer_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + gpu_readback_buffer *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_gpu_readback_buffer_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - gpu_readback_buffer_block *Next = Allocate_gpu_readback_buffer_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - gpu_readback_buffer *Result = Array->Current->Elements + Array->Current->At; + gpu_readback_buffer *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( gpu_readback_buffer_block_array *Array ) return Result; } +link_internal void +Shift( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element ) +{ + Assert(Array->Memory); + gpu_readback_buffer *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index eccd6bbbb..425b926b8 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -6,23 +6,24 @@ struct asset_thumbnail_block { - u32 Index; - u32 At; - asset_thumbnail *Elements; - asset_thumbnail_block *Next; + /* u32 Index; */ + umm At; + asset_thumbnail Elements[8]; }; struct asset_thumbnail_block_array_index { - asset_thumbnail_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct asset_thumbnail_block_array { - asset_thumbnail_block *First; - asset_thumbnail_block *Current; + asset_thumbnail_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,144 +65,127 @@ typedef asset_thumbnail_block_array asset_thumbnail_paged_list; link_internal asset_thumbnail_block_array_index operator++( asset_thumbnail_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( asset_thumbnail_block_array_index I0, asset_thumbnail_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( asset_thumbnail_block_array_index I0, asset_thumbnail_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( asset_thumbnail_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal asset_thumbnail_block_array_index -ZerothIndex( asset_thumbnail_block_array *Arr) +ZerothIndex( asset_thumbnail_block_array *Arr ) { - asset_thumbnail_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( asset_thumbnail_block_array *Arr) +link_internal asset_thumbnail_block_array_index +Capacity( asset_thumbnail_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + asset_thumbnail_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal asset_thumbnail_block_array_index -LastIndex( asset_thumbnail_block_array *Arr) +AtElements( asset_thumbnail_block_array *Arr ) { - asset_thumbnail_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + asset_thumbnail_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( asset_thumbnail_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; return Result; } + link_internal asset_thumbnail_block_array_index -AtElements( asset_thumbnail_block_array *Arr) +LastIndex( asset_thumbnail_block_array *Arr ) { asset_thumbnail_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( asset_thumbnail_block_array *Arr) +Count( asset_thumbnail_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal asset_thumbnail * -GetPtr(asset_thumbnail_block_array *Arr, asset_thumbnail_block_array_index Index) +link_internal asset_thumbnail_block * +GetBlock( asset_thumbnail_block_array *Arr, asset_thumbnail_block_array_index Index ) { - asset_thumbnail *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + asset_thumbnail_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal asset_thumbnail * -GetPtr(asset_thumbnail_block *Block, umm Index) +GetPtr( asset_thumbnail_block_array *Arr, asset_thumbnail_block_array_index Index ) { - asset_thumbnail *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + asset_thumbnail_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + asset_thumbnail *Result = (Block->Elements + ElementIndex); return Result; } link_internal asset_thumbnail * -GetPtr(asset_thumbnail_block_array *Arr, umm Index) +TryGetPtr(asset_thumbnail_block_array *Arr, asset_thumbnail_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - asset_thumbnail_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + asset_thumbnail * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - asset_thumbnail *Result = (Block->Elements+ElementIndex); return Result; } + link_internal asset_thumbnail * -TryGetPtr(asset_thumbnail_block_array *Arr, umm Index) +GetPtr( asset_thumbnail_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - asset_thumbnail *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + asset_thumbnail_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(asset_thumbnail_block *Block) +link_internal asset_thumbnail * +TryGetPtr(asset_thumbnail_block_array *Arr, umm Index) { - return Block->At; + asset_thumbnail * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + asset_thumbnail_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } diff --git a/generated/block_array_h_gpu_timer_688735882_0.h b/generated/block_array_h_gpu_timer_688735882_0.h index c0086333d..d498c8e62 100644 --- a/generated/block_array_h_gpu_timer_688735882_0.h +++ b/generated/block_array_h_gpu_timer_688735882_0.h @@ -6,23 +6,24 @@ struct gpu_timer_block { - u32 Index; - u32 At; - gpu_timer *Elements; - gpu_timer_block *Next; + /* u32 Index; */ + umm At; + gpu_timer Elements[128]; }; struct gpu_timer_block_array_index { - gpu_timer_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct gpu_timer_block_array { - gpu_timer_block *First; - gpu_timer_block *Current; + gpu_timer_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,144 +65,127 @@ typedef gpu_timer_block_array gpu_timer_paged_list; link_internal gpu_timer_block_array_index operator++( gpu_timer_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 128-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( gpu_timer_block_array_index I0, gpu_timer_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( gpu_timer_block_array_index I0, gpu_timer_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( gpu_timer_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*128); + umm Result = Index->Index; return Result; } + link_internal gpu_timer_block_array_index -ZerothIndex( gpu_timer_block_array *Arr) +ZerothIndex( gpu_timer_block_array *Arr ) { - gpu_timer_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( gpu_timer_block_array *Arr) +link_internal gpu_timer_block_array_index +Capacity( gpu_timer_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 128) + Arr->Current->At; - } + gpu_timer_block_array_index Result = {Arr->BlockCount * 128}; return Result; } link_internal gpu_timer_block_array_index -LastIndex( gpu_timer_block_array *Arr) +AtElements( gpu_timer_block_array *Arr ) { - gpu_timer_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + gpu_timer_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( gpu_timer_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; return Result; } + link_internal gpu_timer_block_array_index -AtElements( gpu_timer_block_array *Arr) +LastIndex( gpu_timer_block_array *Arr ) { gpu_timer_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( gpu_timer_block_array *Arr) +Count( gpu_timer_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal gpu_timer * -GetPtr(gpu_timer_block_array *Arr, gpu_timer_block_array_index Index) +link_internal gpu_timer_block * +GetBlock( gpu_timer_block_array *Arr, gpu_timer_block_array_index Index ) { - gpu_timer *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 128; + Assert(BlockIndex < Arr->BlockCount); + gpu_timer_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal gpu_timer * -GetPtr(gpu_timer_block *Block, umm Index) +GetPtr( gpu_timer_block_array *Arr, gpu_timer_block_array_index Index ) { - gpu_timer *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + gpu_timer_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 128; + gpu_timer *Result = (Block->Elements + ElementIndex); return Result; } link_internal gpu_timer * -GetPtr(gpu_timer_block_array *Arr, umm Index) +TryGetPtr(gpu_timer_block_array *Arr, gpu_timer_block_array_index Index) { - umm BlockIndex = Index / 128; - umm ElementIndex = Index % 128; - - umm AtBlock = 0; - gpu_timer_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + gpu_timer * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - gpu_timer *Result = (Block->Elements+ElementIndex); return Result; } + link_internal gpu_timer * -TryGetPtr(gpu_timer_block_array *Arr, umm Index) +GetPtr( gpu_timer_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 128; - umm ElementIndex = Index % 128; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - gpu_timer *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + gpu_timer_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(gpu_timer_block *Block) +link_internal gpu_timer * +TryGetPtr(gpu_timer_block_array *Arr, umm Index) { - return Block->At; + gpu_timer * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + gpu_timer_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 965836b8a..7abf282a2 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -6,23 +6,24 @@ struct shader_ptr_block { - u32 Index; - u32 At; - shader_ptr *Elements; - shader_ptr_block *Next; + /* u32 Index; */ + umm At; + shader_ptr Elements[64]; }; struct shader_ptr_block_array_index { - shader_ptr_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct shader_ptr_block_array { - shader_ptr_block *First; - shader_ptr_block *Current; + shader_ptr_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,144 +65,127 @@ typedef shader_ptr_block_array shader_ptr_paged_list; link_internal shader_ptr_block_array_index operator++( shader_ptr_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 64-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( shader_ptr_block_array_index I0, shader_ptr_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( shader_ptr_block_array_index I0, shader_ptr_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( shader_ptr_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*64); + umm Result = Index->Index; return Result; } + link_internal shader_ptr_block_array_index -ZerothIndex( shader_ptr_block_array *Arr) +ZerothIndex( shader_ptr_block_array *Arr ) { - shader_ptr_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( shader_ptr_block_array *Arr) +link_internal shader_ptr_block_array_index +Capacity( shader_ptr_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 64) + Arr->Current->At; - } + shader_ptr_block_array_index Result = {Arr->BlockCount * 64}; return Result; } link_internal shader_ptr_block_array_index -LastIndex( shader_ptr_block_array *Arr) +AtElements( shader_ptr_block_array *Arr ) { - shader_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + shader_ptr_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( shader_ptr_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; return Result; } + link_internal shader_ptr_block_array_index -AtElements( shader_ptr_block_array *Arr) +LastIndex( shader_ptr_block_array *Arr ) { shader_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( shader_ptr_block_array *Arr) +Count( shader_ptr_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal shader_ptr -GetPtr(shader_ptr_block_array *Arr, shader_ptr_block_array_index Index) +link_internal shader_ptr_block * +GetBlock( shader_ptr_block_array *Arr, shader_ptr_block_array_index Index ) { - shader_ptr Result = {}; - if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 64; + Assert(BlockIndex < Arr->BlockCount); + shader_ptr_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal shader_ptr -GetPtr(shader_ptr_block *Block, umm Index) +GetPtr( shader_ptr_block_array *Arr, shader_ptr_block_array_index Index ) { - shader_ptr Result = {}; - if (Index < Block->At) { Result = *(Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + shader_ptr_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 64; + shader_ptr Result = *(Block->Elements + ElementIndex); return Result; } link_internal shader_ptr -GetPtr(shader_ptr_block_array *Arr, umm Index) +TryGetPtr(shader_ptr_block_array *Arr, shader_ptr_block_array_index Index) { - umm BlockIndex = Index / 64; - umm ElementIndex = Index % 64; - - umm AtBlock = 0; - shader_ptr_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + shader_ptr Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - shader_ptr Result = *(Block->Elements+ElementIndex); return Result; } + link_internal shader_ptr -TryGetPtr(shader_ptr_block_array *Arr, umm Index) +GetPtr( shader_ptr_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 64; - umm ElementIndex = Index % 64; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - shader_ptr Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + shader_ptr_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(shader_ptr_block *Block) +link_internal shader_ptr +TryGetPtr(shader_ptr_block_array *Arr, umm Index) { - return Block->At; + shader_ptr Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + shader_ptr_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } diff --git a/generated/block_array_h_texture_688856411.h b/generated/block_array_h_texture_688856411.h index c5c886be4..2070bb669 100644 --- a/generated/block_array_h_texture_688856411.h +++ b/generated/block_array_h_texture_688856411.h @@ -6,23 +6,24 @@ struct texture_ptr_block { - u32 Index; - u32 At; - texture_ptr *Elements; - texture_ptr_block *Next; + /* u32 Index; */ + umm At; + texture_ptr Elements[8]; }; struct texture_ptr_block_array_index { - texture_ptr_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct texture_ptr_block_array { - texture_ptr_block *First; - texture_ptr_block *Current; + texture_ptr_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,144 +65,127 @@ typedef texture_ptr_block_array texture_ptr_paged_list; link_internal texture_ptr_block_array_index operator++( texture_ptr_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( texture_ptr_block_array_index I0, texture_ptr_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( texture_ptr_block_array_index I0, texture_ptr_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( texture_ptr_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal texture_ptr_block_array_index -ZerothIndex( texture_ptr_block_array *Arr) +ZerothIndex( texture_ptr_block_array *Arr ) { - texture_ptr_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( texture_ptr_block_array *Arr) +link_internal texture_ptr_block_array_index +Capacity( texture_ptr_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + texture_ptr_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal texture_ptr_block_array_index -LastIndex( texture_ptr_block_array *Arr) +AtElements( texture_ptr_block_array *Arr ) { - texture_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + texture_ptr_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( texture_ptr_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; return Result; } + link_internal texture_ptr_block_array_index -AtElements( texture_ptr_block_array *Arr) +LastIndex( texture_ptr_block_array *Arr ) { texture_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( texture_ptr_block_array *Arr) +Count( texture_ptr_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal texture_ptr -GetPtr(texture_ptr_block_array *Arr, texture_ptr_block_array_index Index) +link_internal texture_ptr_block * +GetBlock( texture_ptr_block_array *Arr, texture_ptr_block_array_index Index ) { - texture_ptr Result = {}; - if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + texture_ptr_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal texture_ptr -GetPtr(texture_ptr_block *Block, umm Index) +GetPtr( texture_ptr_block_array *Arr, texture_ptr_block_array_index Index ) { - texture_ptr Result = {}; - if (Index < Block->At) { Result = *(Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + texture_ptr_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + texture_ptr Result = *(Block->Elements + ElementIndex); return Result; } link_internal texture_ptr -GetPtr(texture_ptr_block_array *Arr, umm Index) +TryGetPtr(texture_ptr_block_array *Arr, texture_ptr_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - texture_ptr_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + texture_ptr Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - texture_ptr Result = *(Block->Elements+ElementIndex); return Result; } + link_internal texture_ptr -TryGetPtr(texture_ptr_block_array *Arr, umm Index) +GetPtr( texture_ptr_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - texture_ptr Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + texture_ptr_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(texture_ptr_block *Block) +link_internal texture_ptr +TryGetPtr(texture_ptr_block_array *Arr, umm Index) { - return Block->At; + texture_ptr Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + texture_ptr_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } diff --git a/generated/block_array_h_texture_688856411_0.h b/generated/block_array_h_texture_688856411_0.h index b7edfb8c3..753380135 100644 --- a/generated/block_array_h_texture_688856411_0.h +++ b/generated/block_array_h_texture_688856411_0.h @@ -6,23 +6,24 @@ struct texture_block { - u32 Index; - u32 At; - texture *Elements; - texture_block *Next; + /* u32 Index; */ + umm At; + texture Elements[8]; }; struct texture_block_array_index { - texture_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct texture_block_array { - texture_block *First; - texture_block *Current; + texture_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,144 +65,127 @@ typedef texture_block_array texture_paged_list; link_internal texture_block_array_index operator++( texture_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( texture_block_array_index I0, texture_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( texture_block_array_index I0, texture_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( texture_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal texture_block_array_index -ZerothIndex( texture_block_array *Arr) +ZerothIndex( texture_block_array *Arr ) { - texture_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( texture_block_array *Arr) +link_internal texture_block_array_index +Capacity( texture_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + texture_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal texture_block_array_index -LastIndex( texture_block_array *Arr) +AtElements( texture_block_array *Arr ) { - texture_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + texture_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( texture_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; return Result; } + link_internal texture_block_array_index -AtElements( texture_block_array *Arr) +LastIndex( texture_block_array *Arr ) { texture_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( texture_block_array *Arr) +Count( texture_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal texture * -GetPtr(texture_block_array *Arr, texture_block_array_index Index) +link_internal texture_block * +GetBlock( texture_block_array *Arr, texture_block_array_index Index ) { - texture *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + texture_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal texture * -GetPtr(texture_block *Block, umm Index) +GetPtr( texture_block_array *Arr, texture_block_array_index Index ) { - texture *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + texture_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + texture *Result = (Block->Elements + ElementIndex); return Result; } link_internal texture * -GetPtr(texture_block_array *Arr, umm Index) +TryGetPtr(texture_block_array *Arr, texture_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - texture_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + texture * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - texture *Result = (Block->Elements+ElementIndex); return Result; } + link_internal texture * -TryGetPtr(texture_block_array *Arr, umm Index) +GetPtr( texture_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - texture *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + texture_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(texture_block *Block) +link_internal texture * +TryGetPtr(texture_block_array *Arr, umm Index) { - return Block->At; + texture * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + texture_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } diff --git a/generated/block_array_h_u32_688856411.h b/generated/block_array_h_u32_688856411.h index 540b3da2a..8f07cbda0 100644 --- a/generated/block_array_h_u32_688856411.h +++ b/generated/block_array_h_u32_688856411.h @@ -6,23 +6,24 @@ struct u32_block { - u32 Index; - u32 At; - u32 *Elements; - u32_block *Next; + /* u32 Index; */ + umm At; + u32 Elements[8]; }; struct u32_block_array_index { - u32_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct u32_block_array { - u32_block *First; - u32_block *Current; + u32_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,144 +65,127 @@ typedef u32_block_array u32_paged_list; link_internal u32_block_array_index operator++( u32_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( u32_block_array_index I0, u32_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( u32_block_array_index I0, u32_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( u32_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal u32_block_array_index -ZerothIndex( u32_block_array *Arr) +ZerothIndex( u32_block_array *Arr ) { - u32_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( u32_block_array *Arr) +link_internal u32_block_array_index +Capacity( u32_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + u32_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal u32_block_array_index -LastIndex( u32_block_array *Arr) +AtElements( u32_block_array *Arr ) { - u32_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + u32_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( u32_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; return Result; } + link_internal u32_block_array_index -AtElements( u32_block_array *Arr) +LastIndex( u32_block_array *Arr ) { u32_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( u32_block_array *Arr) +Count( u32_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal u32 * -GetPtr(u32_block_array *Arr, u32_block_array_index Index) +link_internal u32_block * +GetBlock( u32_block_array *Arr, u32_block_array_index Index ) { - u32 *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + u32_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal u32 * -GetPtr(u32_block *Block, umm Index) +GetPtr( u32_block_array *Arr, u32_block_array_index Index ) { - u32 *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + u32_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + u32 *Result = (Block->Elements + ElementIndex); return Result; } link_internal u32 * -GetPtr(u32_block_array *Arr, umm Index) +TryGetPtr(u32_block_array *Arr, u32_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - u32_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + u32 * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - u32 *Result = (Block->Elements+ElementIndex); return Result; } + link_internal u32 * -TryGetPtr(u32_block_array *Arr, umm Index) +GetPtr( u32_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - u32 *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + u32_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(u32_block *Block) +link_internal u32 * +TryGetPtr(u32_block_array *Arr, umm Index) { - return Block->At; + u32 * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + u32_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } diff --git a/generated/block_array_h_u8_cursor_688856411.h b/generated/block_array_h_u8_cursor_688856411.h index 851cd8858..eac301a2b 100644 --- a/generated/block_array_h_u8_cursor_688856411.h +++ b/generated/block_array_h_u8_cursor_688856411.h @@ -6,23 +6,24 @@ struct u8_cursor_block { - u32 Index; - u32 At; - u8_cursor *Elements; - u8_cursor_block *Next; + /* u32 Index; */ + umm At; + u8_cursor Elements[8]; }; struct u8_cursor_block_array_index { - u8_cursor_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct u8_cursor_block_array { - u8_cursor_block *First; - u8_cursor_block *Current; + u8_cursor_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) u64 BlockSize; }; @@ -64,144 +65,127 @@ typedef u8_cursor_block_array u8_cursor_paged_list; link_internal u8_cursor_block_array_index operator++( u8_cursor_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( u8_cursor_block_array_index I0, u8_cursor_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( u8_cursor_block_array_index I0, u8_cursor_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( u8_cursor_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal u8_cursor_block_array_index -ZerothIndex( u8_cursor_block_array *Arr) +ZerothIndex( u8_cursor_block_array *Arr ) { - u8_cursor_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( u8_cursor_block_array *Arr) +link_internal u8_cursor_block_array_index +Capacity( u8_cursor_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + u8_cursor_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal u8_cursor_block_array_index -LastIndex( u8_cursor_block_array *Arr) +AtElements( u8_cursor_block_array *Arr ) { - u8_cursor_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + u8_cursor_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( u8_cursor_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; return Result; } + link_internal u8_cursor_block_array_index -AtElements( u8_cursor_block_array *Arr) +LastIndex( u8_cursor_block_array *Arr ) { u8_cursor_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( u8_cursor_block_array *Arr) +Count( u8_cursor_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal u8_cursor * -GetPtr(u8_cursor_block_array *Arr, u8_cursor_block_array_index Index) +link_internal u8_cursor_block * +GetBlock( u8_cursor_block_array *Arr, u8_cursor_block_array_index Index ) { - u8_cursor *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + u8_cursor_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal u8_cursor * -GetPtr(u8_cursor_block *Block, umm Index) +GetPtr( u8_cursor_block_array *Arr, u8_cursor_block_array_index Index ) { - u8_cursor *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + u8_cursor_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + u8_cursor *Result = (Block->Elements + ElementIndex); return Result; } link_internal u8_cursor * -GetPtr(u8_cursor_block_array *Arr, umm Index) +TryGetPtr(u8_cursor_block_array *Arr, u8_cursor_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - u8_cursor_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + u8_cursor * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - u8_cursor *Result = (Block->Elements+ElementIndex); return Result; } + link_internal u8_cursor * -TryGetPtr(u8_cursor_block_array *Arr, umm Index) +GetPtr( u8_cursor_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - u8_cursor *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + u8_cursor_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(u8_cursor_block *Block) +link_internal u8_cursor * +TryGetPtr(u8_cursor_block_array *Arr, umm Index) { - return Block->At; + u8_cursor * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + u8_cursor_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index 9ddf22c15..fd62a613b 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -6,23 +6,24 @@ struct world_chunk_ptr_block { - u32 Index; - u32 At; - world_chunk_ptr *Elements; - world_chunk_ptr_block *Next; + /* u32 Index; */ + umm At; + world_chunk_ptr Elements[32]; }; struct world_chunk_ptr_block_array_index { - world_chunk_ptr_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct world_chunk_ptr_block_array { - world_chunk_ptr_block *First; - world_chunk_ptr_block *Current; + world_chunk_ptr_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,144 +65,127 @@ typedef world_chunk_ptr_block_array world_chunk_ptr_paged_list; link_internal world_chunk_ptr_block_array_index operator++( world_chunk_ptr_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 32-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( world_chunk_ptr_block_array_index I0, world_chunk_ptr_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( world_chunk_ptr_block_array_index I0, world_chunk_ptr_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( world_chunk_ptr_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*32); + umm Result = Index->Index; return Result; } + link_internal world_chunk_ptr_block_array_index -ZerothIndex( world_chunk_ptr_block_array *Arr) +ZerothIndex( world_chunk_ptr_block_array *Arr ) { - world_chunk_ptr_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( world_chunk_ptr_block_array *Arr) +link_internal world_chunk_ptr_block_array_index +Capacity( world_chunk_ptr_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 32) + Arr->Current->At; - } + world_chunk_ptr_block_array_index Result = {Arr->BlockCount * 32}; return Result; } link_internal world_chunk_ptr_block_array_index -LastIndex( world_chunk_ptr_block_array *Arr) +AtElements( world_chunk_ptr_block_array *Arr ) { - world_chunk_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + world_chunk_ptr_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( world_chunk_ptr_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; return Result; } + link_internal world_chunk_ptr_block_array_index -AtElements( world_chunk_ptr_block_array *Arr) +LastIndex( world_chunk_ptr_block_array *Arr ) { world_chunk_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( world_chunk_ptr_block_array *Arr) +Count( world_chunk_ptr_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal world_chunk_ptr -GetPtr(world_chunk_ptr_block_array *Arr, world_chunk_ptr_block_array_index Index) +link_internal world_chunk_ptr_block * +GetBlock( world_chunk_ptr_block_array *Arr, world_chunk_ptr_block_array_index Index ) { - world_chunk_ptr Result = {}; - if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 32; + Assert(BlockIndex < Arr->BlockCount); + world_chunk_ptr_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal world_chunk_ptr -GetPtr(world_chunk_ptr_block *Block, umm Index) +GetPtr( world_chunk_ptr_block_array *Arr, world_chunk_ptr_block_array_index Index ) { - world_chunk_ptr Result = {}; - if (Index < Block->At) { Result = *(Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + world_chunk_ptr_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 32; + world_chunk_ptr Result = *(Block->Elements + ElementIndex); return Result; } link_internal world_chunk_ptr -GetPtr(world_chunk_ptr_block_array *Arr, umm Index) +TryGetPtr(world_chunk_ptr_block_array *Arr, world_chunk_ptr_block_array_index Index) { - umm BlockIndex = Index / 32; - umm ElementIndex = Index % 32; - - umm AtBlock = 0; - world_chunk_ptr_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + world_chunk_ptr Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - world_chunk_ptr Result = *(Block->Elements+ElementIndex); return Result; } + link_internal world_chunk_ptr -TryGetPtr(world_chunk_ptr_block_array *Arr, umm Index) +GetPtr( world_chunk_ptr_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 32; - umm ElementIndex = Index % 32; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - world_chunk_ptr Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + world_chunk_ptr_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(world_chunk_ptr_block *Block) +link_internal world_chunk_ptr +TryGetPtr(world_chunk_ptr_block_array *Arr, umm Index) { - return Block->At; + world_chunk_ptr Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + world_chunk_ptr_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index 4403fcaa9..a38e21c39 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -6,23 +6,24 @@ struct member_info_block { - u32 Index; - u32 At; - member_info *Elements; - member_info_block *Next; + /* u32 Index; */ + umm At; + member_info Elements[8]; }; struct member_info_block_array_index { - member_info_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct member_info_block_array { - member_info_block *First; - member_info_block *Current; + member_info_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef member_info_block_array member_info_paged_list; link_internal member_info_block_array_index operator++( member_info_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( member_info_block_array_index I0, member_info_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( member_info_block_array_index I0, member_info_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( member_info_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal member_info_block_array_index -ZerothIndex( member_info_block_array *Arr) +ZerothIndex( member_info_block_array *Arr ) { - member_info_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( member_info_block_array *Arr) +link_internal member_info_block_array_index +Capacity( member_info_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + member_info_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal member_info_block_array_index -LastIndex( member_info_block_array *Arr) +AtElements( member_info_block_array *Arr ) { - member_info_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + member_info_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( member_info_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal member_info_block_array_index -AtElements( member_info_block_array *Arr) +LastIndex( member_info_block_array *Arr ) { member_info_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( member_info_block_array *Arr) +Count( member_info_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal member_info * -GetPtr(member_info_block_array *Arr, member_info_block_array_index Index) +link_internal member_info_block * +GetBlock( member_info_block_array *Arr, member_info_block_array_index Index ) { - member_info *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + member_info_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal member_info * -GetPtr(member_info_block *Block, umm Index) +GetPtr( member_info_block_array *Arr, member_info_block_array_index Index ) { - member_info *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + member_info_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + member_info *Result = (Block->Elements + ElementIndex); return Result; } link_internal member_info * -GetPtr(member_info_block_array *Arr, umm Index) +TryGetPtr(member_info_block_array *Arr, member_info_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - member_info_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + member_info * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - member_info *Result = (Block->Elements+ElementIndex); return Result; } + link_internal member_info * -TryGetPtr(member_info_block_array *Arr, umm Index) +GetPtr( member_info_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - member_info *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + member_info_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(member_info_block *Block) +link_internal member_info * +TryGetPtr(member_info_block_array *Arr, umm Index) { - return Block->At; + member_info * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + member_info_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal member_info_block * -Allocate_member_info_block(memory_arena *Memory) -{ - member_info_block *Result = Allocate( member_info_block, Memory, 1); - Result->Elements = Allocate( member_info, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( member_info_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal member_info * @@ -228,82 +211,63 @@ Set( member_info_block_array *Arr, member_info *Element, member_info_block_array_index Index ) { - member_info *Result = {}; - if (Index.Block) - { - member_info *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + member_info_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( member_info_block_array *Array, member_info_block_array_index Index) +NewBlock( member_info_block_array *Arr ) { - member_info_block_array_index LastI = LastIndex(Array); - - member_info *Element = GetPtr(Array, Index); - member_info *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + member_info_block *NewBlock = Allocate( member_info_block , Arr->Memory, 1); + member_info_block **NewBlockPtrs = Allocate( member_info_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - member_info_block *Current = Array->First; - member_info_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( member_info_block_array *Array, member_info_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( member_info_block_array *Array, member_info_block_array_index Index) +RemoveOrdered( member_info_block_array *Array, member_info_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + member_info *Prev = {}; - while (NextI < End) + member_info_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + member_info *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( member_info_block_array *Array, member_info *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_member_info_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - member_info_block *Next = Allocate_member_info_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - member_info *Result = Array->Current->Elements + Array->Current->At; + member_info *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( member_info_block_array *Array ) return Result; } +link_internal void +Shift( member_info_block_array *Array, member_info *Element ) +{ + Assert(Array->Memory); + member_info *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index bd0ecd04f..8216efabc 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -6,23 +6,24 @@ struct model_block { - u32 Index; - u32 At; - model *Elements; - model_block *Next; + /* u32 Index; */ + umm At; + model Elements[8]; }; struct model_block_array_index { - model_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct model_block_array { - model_block *First; - model_block *Current; + model_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef model_block_array model_paged_list; link_internal model_block_array_index operator++( model_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( model_block_array_index I0, model_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( model_block_array_index I0, model_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( model_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal model_block_array_index -ZerothIndex( model_block_array *Arr) +ZerothIndex( model_block_array *Arr ) { - model_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( model_block_array *Arr) +link_internal model_block_array_index +Capacity( model_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + model_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal model_block_array_index -LastIndex( model_block_array *Arr) +AtElements( model_block_array *Arr ) { - model_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + model_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( model_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal model_block_array_index -AtElements( model_block_array *Arr) +LastIndex( model_block_array *Arr ) { model_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( model_block_array *Arr) +Count( model_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal model * -GetPtr(model_block_array *Arr, model_block_array_index Index) +link_internal model_block * +GetBlock( model_block_array *Arr, model_block_array_index Index ) { - model *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + model_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal model * -GetPtr(model_block *Block, umm Index) +GetPtr( model_block_array *Arr, model_block_array_index Index ) { - model *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + model_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + model *Result = (Block->Elements + ElementIndex); return Result; } link_internal model * -GetPtr(model_block_array *Arr, umm Index) +TryGetPtr(model_block_array *Arr, model_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - model_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + model * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - model *Result = (Block->Elements+ElementIndex); return Result; } + link_internal model * -TryGetPtr(model_block_array *Arr, umm Index) +GetPtr( model_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - model *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + model_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(model_block *Block) +link_internal model * +TryGetPtr(model_block_array *Arr, umm Index) { - return Block->At; + model * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + model_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal model_block * -Allocate_model_block(memory_arena *Memory) -{ - model_block *Result = Allocate( model_block, Memory, 1); - Result->Elements = Allocate( model, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( model_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal model * @@ -228,82 +211,63 @@ Set( model_block_array *Arr, model *Element, model_block_array_index Index ) { - model *Result = {}; - if (Index.Block) - { - model *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + model_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( model_block_array *Array, model_block_array_index Index) +NewBlock( model_block_array *Arr ) { - model_block_array_index LastI = LastIndex(Array); - - model *Element = GetPtr(Array, Index); - model *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + model_block *NewBlock = Allocate( model_block , Arr->Memory, 1); + model_block **NewBlockPtrs = Allocate( model_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - model_block *Current = Array->First; - model_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( model_block_array *Array, model_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( model_block_array *Array, model_block_array_index Index) +RemoveOrdered( model_block_array *Array, model_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + model *Prev = {}; - while (NextI < End) + model_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + model *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( model_block_array *Array, model *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_model_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - model_block *Next = Allocate_model_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - model *Result = Array->Current->Elements + Array->Current->At; + model *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( model_block_array *Array ) return Result; } +link_internal void +Shift( model_block_array *Array, model *Element ) +{ + Assert(Array->Memory); + model *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index b4fe86dac..1cecc01e5 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -6,23 +6,24 @@ struct octree_node_ptr_block { - u32 Index; - u32 At; - octree_node_ptr *Elements; - octree_node_ptr_block *Next; + /* u32 Index; */ + umm At; + octree_node_ptr Elements[8]; }; struct octree_node_ptr_block_array_index { - octree_node_ptr_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct octree_node_ptr_block_array { - octree_node_ptr_block *First; - octree_node_ptr_block *Current; + octree_node_ptr_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef octree_node_ptr_block_array octree_node_ptr_paged_list; link_internal octree_node_ptr_block_array_index operator++( octree_node_ptr_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( octree_node_ptr_block_array_index I0, octree_node_ptr_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( octree_node_ptr_block_array_index I0, octree_node_ptr_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( octree_node_ptr_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal octree_node_ptr_block_array_index -ZerothIndex( octree_node_ptr_block_array *Arr) +ZerothIndex( octree_node_ptr_block_array *Arr ) { - octree_node_ptr_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( octree_node_ptr_block_array *Arr) +link_internal octree_node_ptr_block_array_index +Capacity( octree_node_ptr_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + octree_node_ptr_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal octree_node_ptr_block_array_index -LastIndex( octree_node_ptr_block_array *Arr) +AtElements( octree_node_ptr_block_array *Arr ) { - octree_node_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + octree_node_ptr_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( octree_node_ptr_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; return Result; } + link_internal octree_node_ptr_block_array_index -AtElements( octree_node_ptr_block_array *Arr) +LastIndex( octree_node_ptr_block_array *Arr ) { octree_node_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( octree_node_ptr_block_array *Arr) +Count( octree_node_ptr_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal octree_node_ptr -GetPtr(octree_node_ptr_block_array *Arr, octree_node_ptr_block_array_index Index) +link_internal octree_node_ptr_block * +GetBlock( octree_node_ptr_block_array *Arr, octree_node_ptr_block_array_index Index ) { - octree_node_ptr Result = {}; - if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + octree_node_ptr_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal octree_node_ptr -GetPtr(octree_node_ptr_block *Block, umm Index) +GetPtr( octree_node_ptr_block_array *Arr, octree_node_ptr_block_array_index Index ) { - octree_node_ptr Result = {}; - if (Index < Block->At) { Result = *(Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + octree_node_ptr_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + octree_node_ptr Result = *(Block->Elements + ElementIndex); return Result; } link_internal octree_node_ptr -GetPtr(octree_node_ptr_block_array *Arr, umm Index) +TryGetPtr(octree_node_ptr_block_array *Arr, octree_node_ptr_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - octree_node_ptr_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + octree_node_ptr Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - octree_node_ptr Result = *(Block->Elements+ElementIndex); return Result; } + link_internal octree_node_ptr -TryGetPtr(octree_node_ptr_block_array *Arr, umm Index) +GetPtr( octree_node_ptr_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - octree_node_ptr Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + octree_node_ptr_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(octree_node_ptr_block *Block) +link_internal octree_node_ptr +TryGetPtr(octree_node_ptr_block_array *Arr, umm Index) { - return Block->At; + octree_node_ptr Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + octree_node_ptr_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal octree_node_ptr_block * -Allocate_octree_node_ptr_block(memory_arena *Memory) -{ - octree_node_ptr_block *Result = Allocate( octree_node_ptr_block, Memory, 1); - Result->Elements = Allocate( octree_node_ptr, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( octree_node_ptr_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal octree_node_ptr @@ -228,82 +211,63 @@ Set( octree_node_ptr_block_array *Arr, octree_node_ptr Element, octree_node_ptr_block_array_index Index ) { - octree_node_ptr Result = {}; - if (Index.Block) - { - octree_node_ptr *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = Element; - - Result = *Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + octree_node_ptr_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = Element; + return *Slot; } link_internal void -RemoveUnordered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) +NewBlock( octree_node_ptr_block_array *Arr ) { - octree_node_ptr_block_array_index LastI = LastIndex(Array); - - octree_node_ptr Element = GetPtr(Array, Index); - octree_node_ptr LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + octree_node_ptr_block *NewBlock = Allocate( octree_node_ptr_block , Arr->Memory, 1); + octree_node_ptr_block **NewBlockPtrs = Allocate( octree_node_ptr_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - octree_node_ptr_block *Current = Array->First; - octree_node_ptr_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) +RemoveOrdered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + octree_node_ptr Prev = {}; - while (NextI < End) + octree_node_ptr_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + octree_node_ptr E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -342,43 +306,49 @@ IsValid(octree_node_ptr_block_array_index *Index) return Result; } -link_internal octree_node_ptr * -Push( octree_node_ptr_block_array *Array, octree_node_ptr *Element) +link_internal octree_node_ptr +Push( octree_node_ptr_block_array *Array, octree_node_ptr Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_octree_node_ptr_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - octree_node_ptr_block *Next = Allocate_octree_node_ptr_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - octree_node_ptr *Result = Array->Current->Elements + Array->Current->At; + octree_node_ptr Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } -link_internal octree_node_ptr * +link_internal octree_node_ptr Push( octree_node_ptr_block_array *Array ) { octree_node_ptr Element = {}; - auto Result = Push(Array, &Element); + auto Result = Push(Array, Element); return Result; } +link_internal void +Shift( octree_node_ptr_block_array *Array, octree_node_ptr Element ) +{ + Assert(Array->Memory); + octree_node_ptr Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 68876f6b9..05bcb442f 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -6,23 +6,24 @@ struct picked_octree_node_block { - u32 Index; - u32 At; - picked_octree_node *Elements; - picked_octree_node_block *Next; + /* u32 Index; */ + umm At; + picked_octree_node Elements[8]; }; struct picked_octree_node_block_array_index { - picked_octree_node_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct picked_octree_node_block_array { - picked_octree_node_block *First; - picked_octree_node_block *Current; + picked_octree_node_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef picked_octree_node_block_array picked_octree_node_paged_list; link_internal picked_octree_node_block_array_index operator++( picked_octree_node_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( picked_octree_node_block_array_index I0, picked_octree_node_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( picked_octree_node_block_array_index I0, picked_octree_node_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( picked_octree_node_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal picked_octree_node_block_array_index -ZerothIndex( picked_octree_node_block_array *Arr) +ZerothIndex( picked_octree_node_block_array *Arr ) { - picked_octree_node_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( picked_octree_node_block_array *Arr) +link_internal picked_octree_node_block_array_index +Capacity( picked_octree_node_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + picked_octree_node_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal picked_octree_node_block_array_index -LastIndex( picked_octree_node_block_array *Arr) +AtElements( picked_octree_node_block_array *Arr ) { - picked_octree_node_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + picked_octree_node_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( picked_octree_node_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal picked_octree_node_block_array_index -AtElements( picked_octree_node_block_array *Arr) +LastIndex( picked_octree_node_block_array *Arr ) { picked_octree_node_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( picked_octree_node_block_array *Arr) +Count( picked_octree_node_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal picked_octree_node * -GetPtr(picked_octree_node_block_array *Arr, picked_octree_node_block_array_index Index) +link_internal picked_octree_node_block * +GetBlock( picked_octree_node_block_array *Arr, picked_octree_node_block_array_index Index ) { - picked_octree_node *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + picked_octree_node_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal picked_octree_node * -GetPtr(picked_octree_node_block *Block, umm Index) +GetPtr( picked_octree_node_block_array *Arr, picked_octree_node_block_array_index Index ) { - picked_octree_node *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + picked_octree_node_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + picked_octree_node *Result = (Block->Elements + ElementIndex); return Result; } link_internal picked_octree_node * -GetPtr(picked_octree_node_block_array *Arr, umm Index) +TryGetPtr(picked_octree_node_block_array *Arr, picked_octree_node_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - picked_octree_node_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + picked_octree_node * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - picked_octree_node *Result = (Block->Elements+ElementIndex); return Result; } + link_internal picked_octree_node * -TryGetPtr(picked_octree_node_block_array *Arr, umm Index) +GetPtr( picked_octree_node_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - picked_octree_node *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + picked_octree_node_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(picked_octree_node_block *Block) +link_internal picked_octree_node * +TryGetPtr(picked_octree_node_block_array *Arr, umm Index) { - return Block->At; + picked_octree_node * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + picked_octree_node_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal picked_octree_node_block * -Allocate_picked_octree_node_block(memory_arena *Memory) -{ - picked_octree_node_block *Result = Allocate( picked_octree_node_block, Memory, 1); - Result->Elements = Allocate( picked_octree_node, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( picked_octree_node_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal picked_octree_node * @@ -228,82 +211,63 @@ Set( picked_octree_node_block_array *Arr, picked_octree_node *Element, picked_octree_node_block_array_index Index ) { - picked_octree_node *Result = {}; - if (Index.Block) - { - picked_octree_node *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + picked_octree_node_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) +NewBlock( picked_octree_node_block_array *Arr ) { - picked_octree_node_block_array_index LastI = LastIndex(Array); - - picked_octree_node *Element = GetPtr(Array, Index); - picked_octree_node *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + picked_octree_node_block *NewBlock = Allocate( picked_octree_node_block , Arr->Memory, 1); + picked_octree_node_block **NewBlockPtrs = Allocate( picked_octree_node_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - picked_octree_node_block *Current = Array->First; - picked_octree_node_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) +RemoveOrdered( picked_octree_node_block_array *Array, picked_octree_node_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + picked_octree_node *Prev = {}; - while (NextI < End) + picked_octree_node_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + picked_octree_node *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( picked_octree_node_block_array *Array, picked_octree_node *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_picked_octree_node_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - picked_octree_node_block *Next = Allocate_picked_octree_node_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - picked_octree_node *Result = Array->Current->Elements + Array->Current->At; + picked_octree_node *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( picked_octree_node_block_array *Array ) return Result; } +link_internal void +Shift( picked_octree_node_block_array *Array, picked_octree_node *Element ) +{ + Assert(Array->Memory); + picked_octree_node *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 9965b9c33..4649ad56f 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -6,23 +6,24 @@ struct standing_spot_block { - u32 Index; - u32 At; - standing_spot *Elements; - standing_spot_block *Next; + /* u32 Index; */ + umm At; + standing_spot Elements[8]; }; struct standing_spot_block_array_index { - standing_spot_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct standing_spot_block_array { - standing_spot_block *First; - standing_spot_block *Current; + standing_spot_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef standing_spot_block_array standing_spot_paged_list; link_internal standing_spot_block_array_index operator++( standing_spot_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( standing_spot_block_array_index I0, standing_spot_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( standing_spot_block_array_index I0, standing_spot_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( standing_spot_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal standing_spot_block_array_index -ZerothIndex( standing_spot_block_array *Arr) +ZerothIndex( standing_spot_block_array *Arr ) { - standing_spot_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( standing_spot_block_array *Arr) +link_internal standing_spot_block_array_index +Capacity( standing_spot_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + standing_spot_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal standing_spot_block_array_index -LastIndex( standing_spot_block_array *Arr) +AtElements( standing_spot_block_array *Arr ) { - standing_spot_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + standing_spot_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( standing_spot_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal standing_spot_block_array_index -AtElements( standing_spot_block_array *Arr) +LastIndex( standing_spot_block_array *Arr ) { standing_spot_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( standing_spot_block_array *Arr) +Count( standing_spot_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal standing_spot * -GetPtr(standing_spot_block_array *Arr, standing_spot_block_array_index Index) +link_internal standing_spot_block * +GetBlock( standing_spot_block_array *Arr, standing_spot_block_array_index Index ) { - standing_spot *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + standing_spot_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal standing_spot * -GetPtr(standing_spot_block *Block, umm Index) +GetPtr( standing_spot_block_array *Arr, standing_spot_block_array_index Index ) { - standing_spot *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + standing_spot_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + standing_spot *Result = (Block->Elements + ElementIndex); return Result; } link_internal standing_spot * -GetPtr(standing_spot_block_array *Arr, umm Index) +TryGetPtr(standing_spot_block_array *Arr, standing_spot_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - standing_spot_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + standing_spot * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - standing_spot *Result = (Block->Elements+ElementIndex); return Result; } + link_internal standing_spot * -TryGetPtr(standing_spot_block_array *Arr, umm Index) +GetPtr( standing_spot_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - standing_spot *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + standing_spot_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(standing_spot_block *Block) +link_internal standing_spot * +TryGetPtr(standing_spot_block_array *Arr, umm Index) { - return Block->At; + standing_spot * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + standing_spot_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal standing_spot_block * -Allocate_standing_spot_block(memory_arena *Memory) -{ - standing_spot_block *Result = Allocate( standing_spot_block, Memory, 1); - Result->Elements = Allocate( standing_spot, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( standing_spot_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal standing_spot * @@ -228,82 +211,63 @@ Set( standing_spot_block_array *Arr, standing_spot *Element, standing_spot_block_array_index Index ) { - standing_spot *Result = {}; - if (Index.Block) - { - standing_spot *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + standing_spot_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( standing_spot_block_array *Array, standing_spot_block_array_index Index) +NewBlock( standing_spot_block_array *Arr ) { - standing_spot_block_array_index LastI = LastIndex(Array); - - standing_spot *Element = GetPtr(Array, Index); - standing_spot *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + standing_spot_block *NewBlock = Allocate( standing_spot_block , Arr->Memory, 1); + standing_spot_block **NewBlockPtrs = Allocate( standing_spot_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - standing_spot_block *Current = Array->First; - standing_spot_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( standing_spot_block_array *Array, standing_spot_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( standing_spot_block_array *Array, standing_spot_block_array_index Index) +RemoveOrdered( standing_spot_block_array *Array, standing_spot_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + standing_spot *Prev = {}; - while (NextI < End) + standing_spot_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + standing_spot *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( standing_spot_block_array *Array, standing_spot *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_standing_spot_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - standing_spot_block *Next = Allocate_standing_spot_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - standing_spot *Result = Array->Current->Elements + Array->Current->At; + standing_spot *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( standing_spot_block_array *Array ) return Result; } +link_internal void +Shift( standing_spot_block_array *Array, standing_spot *Element ) +{ + Assert(Array->Memory); + standing_spot *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_struct_688735882.h b/generated/block_array_struct_688735882.h deleted file mode 100644 index 978f9a76c..000000000 --- a/generated/block_array_struct_688735882.h +++ /dev/null @@ -1,343 +0,0 @@ -// src/engine/editor.h:1155:0 - - - - - -struct world_edit_block -{ - u32 Index; - u32 At; - world_edit *Elements; - world_edit_block *Next; -}; - -struct world_edit_block_array_index -{ - world_edit_block *Block; - u32 BlockIndex; - u32 ElementIndex; -}; - -struct world_edit_block_array -{ - world_edit_block *First; - world_edit_block *Current; - memory_arena *Memory; poof(@no_serialize) - -}; - -link_internal world_edit_block_array -WorldEditBlockArray(memory_arena *Memory) -{ - world_edit_block_array Result = {}; - Result.Memory = Memory; - return Result; -} - -typedef world_edit_block_array world_edit_paged_list; - -link_internal world_edit_block_array_index -operator++( world_edit_block_array_index &I0 ) -{ - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } - return I0; -} - -link_internal b32 -operator<( world_edit_block_array_index I0, world_edit_block_array_index I1 ) -{ - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); - return Result; -} - -link_inline umm -GetIndex( world_edit_block_array_index *Index) -{ - umm Result = Index->ElementIndex + (Index->BlockIndex*8); - return Result; -} - -link_internal world_edit_block_array_index -ZerothIndex( world_edit_block_array *Arr) -{ - world_edit_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; -} - -link_internal umm -TotalElements( world_edit_block_array *Arr) -{ - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } - return Result; -} - -link_internal world_edit_block_array_index -LastIndex( world_edit_block_array *Arr) -{ - world_edit_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } - return Result; -} - -link_internal world_edit_block_array_index -AtElements( world_edit_block_array *Arr) -{ - world_edit_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } - return Result; -} - -link_internal umm -Count( world_edit_block_array *Arr) -{ - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); - return Result; -} - -link_internal world_edit * -GetPtr(world_edit_block_array *Arr, world_edit_block_array_index Index) -{ - world_edit *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; -} - -link_internal world_edit * -GetPtr(world_edit_block *Block, umm Index) -{ - world_edit *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } - return Result; -} - -link_internal world_edit * -GetPtr(world_edit_block_array *Arr, umm Index) -{ - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - world_edit_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) - { - Block = Block->Next; - } - - world_edit *Result = (Block->Elements+ElementIndex); - return Result; -} - -link_internal world_edit * -TryGetPtr(world_edit_block_array *Arr, umm Index) -{ - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - world_edit *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; -} - -link_internal u32 -AtElements(world_edit_block *Block) -{ - return Block->At; -} - - - - - -link_internal world_edit_block * -Allocate_world_edit_block(memory_arena *Memory) -{ - world_edit_block *Result = Allocate( world_edit_block, Memory, 1); - Result->Elements = Allocate( world_edit, Memory, 8); - return Result; -} - - - -link_internal b32 -AreEqual(world_edit_block_array_index *Thing1, world_edit_block_array_index *Thing2) -{ - if (Thing1 && Thing2) - { - b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( world_edit_block_array_index ) ); - - return Result; - } - else - { - return (Thing1 == Thing2); - } -} - -link_internal b32 -AreEqual(world_edit_block_array_index Thing1, world_edit_block_array_index Thing2) -{ - b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( world_edit_block_array_index ) ); - - return Result; -} - - -link_internal cs -CS( world_edit_block_array_index Index ) -{ - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); -} - -link_internal world_edit * -Set( world_edit_block_array *Arr, - world_edit *Element, - world_edit_block_array_index Index ) -{ - world_edit *Result = {}; - if (Index.Block) - { - world_edit *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; -} - -link_internal void -RemoveUnordered( world_edit_block_array *Array, world_edit_block_array_index Index) -{ - world_edit_block_array_index LastI = LastIndex(Array); - - world_edit *Element = GetPtr(Array, Index); - world_edit *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) - { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); - - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - world_edit_block *Current = Array->First; - world_edit_block *LastB = LastI.Block; - - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } - - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } -} - -link_internal world_edit_block_array_index -Find( world_edit_block_array *Array, world_edit *Query) -{ - world_edit_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; - IterateOver(Array, E, Index) - { - if ( E == Query) - { - Result = Index; - break; - } - } - return Result; -} - -link_internal b32 -IsValid(world_edit_block_array_index *Index) -{ - world_edit_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; - b32 Result = (AreEqual(Index, &Test) == False); - return Result; -} - -link_internal world_edit * -Push( world_edit_block_array *Array, world_edit *Element) -{ - Assert(Array->Memory); - - if (Array->First == 0) { Array->First = Allocate_world_edit_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) - { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - world_edit_block *Next = Allocate_world_edit_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } - } - - world_edit *Result = Array->Current->Elements + Array->Current->At; - - Array->Current->Elements[Array->Current->At++] = *Element; - - return Result; -} - - diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index f489319de..5b9123a1f 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -4,18 +4,17 @@ -link_internal texture_ptr_block * -Allocate_texture_ptr_block(memory_arena *Memory) -{ - texture_ptr_block *Result = Allocate( texture_ptr_block, Memory, 1); - Result->Elements = Allocate( texture_ptr, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( texture_ptr_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal texture_ptr @@ -23,82 +22,63 @@ Set( texture_ptr_block_array *Arr, texture_ptr Element, texture_ptr_block_array_index Index ) { - texture_ptr Result = {}; - if (Index.Block) - { - texture_ptr *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = Element; - - Result = *Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + texture_ptr_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = Element; + return *Slot; } link_internal void -RemoveUnordered( texture_ptr_block_array *Array, texture_ptr_block_array_index Index) +NewBlock( texture_ptr_block_array *Arr ) { - texture_ptr_block_array_index LastI = LastIndex(Array); - - texture_ptr Element = GetPtr(Array, Index); - texture_ptr LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); + texture_ptr_block *NewBlock = Allocate( texture_ptr_block , Arr->Memory, 1); + texture_ptr_block **NewBlockPtrs = Allocate( texture_ptr_block*, Arr->Memory, Arr->BlockCount+1); - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - texture_ptr_block *Current = Array->First; - texture_ptr_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( texture_ptr_block_array *Array, texture_ptr_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( texture_ptr_block_array *Array, texture_ptr_block_array_index Index) +RemoveOrdered( texture_ptr_block_array *Array, texture_ptr_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + texture_ptr Prev = {}; - while (NextI < End) + texture_ptr_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + texture_ptr E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -137,42 +117,48 @@ IsValid(texture_ptr_block_array_index *Index) return Result; } -link_internal texture_ptr * -Push( texture_ptr_block_array *Array, texture_ptr *Element) +link_internal texture_ptr +Push( texture_ptr_block_array *Array, texture_ptr Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_texture_ptr_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - texture_ptr_block *Next = Allocate_texture_ptr_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - texture_ptr *Result = Array->Current->Elements + Array->Current->At; + texture_ptr Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } -link_internal texture_ptr * +link_internal texture_ptr Push( texture_ptr_block_array *Array ) { texture_ptr Element = {}; - auto Result = Push(Array, &Element); + auto Result = Push(Array, Element); return Result; } +link_internal void +Shift( texture_ptr_block_array *Array, texture_ptr Element ) +{ + Assert(Array->Memory); + texture_ptr Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index e7020c9eb..3bbecaa17 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -6,23 +6,24 @@ struct vox_data_block { - u32 Index; - u32 At; - vox_data *Elements; - vox_data_block *Next; + /* u32 Index; */ + umm At; + vox_data Elements[8]; }; struct vox_data_block_array_index { - vox_data_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct vox_data_block_array { - vox_data_block *First; - vox_data_block *Current; + vox_data_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef vox_data_block_array vox_data_paged_list; link_internal vox_data_block_array_index operator++( vox_data_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( vox_data_block_array_index I0, vox_data_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( vox_data_block_array_index I0, vox_data_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( vox_data_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal vox_data_block_array_index -ZerothIndex( vox_data_block_array *Arr) +ZerothIndex( vox_data_block_array *Arr ) { - vox_data_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( vox_data_block_array *Arr) +link_internal vox_data_block_array_index +Capacity( vox_data_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + vox_data_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal vox_data_block_array_index -LastIndex( vox_data_block_array *Arr) +AtElements( vox_data_block_array *Arr ) { - vox_data_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + vox_data_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( vox_data_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal vox_data_block_array_index -AtElements( vox_data_block_array *Arr) +LastIndex( vox_data_block_array *Arr ) { vox_data_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( vox_data_block_array *Arr) +Count( vox_data_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal vox_data * -GetPtr(vox_data_block_array *Arr, vox_data_block_array_index Index) +link_internal vox_data_block * +GetBlock( vox_data_block_array *Arr, vox_data_block_array_index Index ) { - vox_data *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + vox_data_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal vox_data * -GetPtr(vox_data_block *Block, umm Index) +GetPtr( vox_data_block_array *Arr, vox_data_block_array_index Index ) { - vox_data *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + vox_data_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + vox_data *Result = (Block->Elements + ElementIndex); return Result; } link_internal vox_data * -GetPtr(vox_data_block_array *Arr, umm Index) +TryGetPtr(vox_data_block_array *Arr, vox_data_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - vox_data_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + vox_data * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - vox_data *Result = (Block->Elements+ElementIndex); return Result; } + link_internal vox_data * -TryGetPtr(vox_data_block_array *Arr, umm Index) +GetPtr( vox_data_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - vox_data *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + vox_data_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(vox_data_block *Block) +link_internal vox_data * +TryGetPtr(vox_data_block_array *Arr, umm Index) { - return Block->At; + vox_data * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + vox_data_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal vox_data_block * -Allocate_vox_data_block(memory_arena *Memory) -{ - vox_data_block *Result = Allocate( vox_data_block, Memory, 1); - Result->Elements = Allocate( vox_data, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( vox_data_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal vox_data * @@ -228,82 +211,63 @@ Set( vox_data_block_array *Arr, vox_data *Element, vox_data_block_array_index Index ) { - vox_data *Result = {}; - if (Index.Block) - { - vox_data *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + vox_data_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( vox_data_block_array *Array, vox_data_block_array_index Index) +NewBlock( vox_data_block_array *Arr ) { - vox_data_block_array_index LastI = LastIndex(Array); - - vox_data *Element = GetPtr(Array, Index); - vox_data *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + vox_data_block *NewBlock = Allocate( vox_data_block , Arr->Memory, 1); + vox_data_block **NewBlockPtrs = Allocate( vox_data_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - vox_data_block *Current = Array->First; - vox_data_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( vox_data_block_array *Array, vox_data_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( vox_data_block_array *Array, vox_data_block_array_index Index) +RemoveOrdered( vox_data_block_array *Array, vox_data_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + vox_data *Prev = {}; - while (NextI < End) + vox_data_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + vox_data *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( vox_data_block_array *Array, vox_data *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_vox_data_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - vox_data_block *Next = Allocate_vox_data_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - vox_data *Result = Array->Current->Elements + Array->Current->At; + vox_data *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( vox_data_block_array *Array ) return Result; } +link_internal void +Shift( vox_data_block_array *Array, vox_data *Element ) +{ + Assert(Array->Memory); + vox_data *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index b45acb1a8..ac3d0ea70 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -6,23 +6,24 @@ struct voxel_stack_element_block { - u32 Index; - u32 At; - voxel_stack_element *Elements; - voxel_stack_element_block *Next; + /* u32 Index; */ + umm At; + voxel_stack_element Elements[8]; }; struct voxel_stack_element_block_array_index { - voxel_stack_element_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct voxel_stack_element_block_array { - voxel_stack_element_block *First; - voxel_stack_element_block *Current; + voxel_stack_element_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef voxel_stack_element_block_array voxel_stack_element_paged_list; link_internal voxel_stack_element_block_array_index operator++( voxel_stack_element_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( voxel_stack_element_block_array_index I0, voxel_stack_element_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( voxel_stack_element_block_array_index I0, voxel_stack_element_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( voxel_stack_element_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal voxel_stack_element_block_array_index -ZerothIndex( voxel_stack_element_block_array *Arr) +ZerothIndex( voxel_stack_element_block_array *Arr ) { - voxel_stack_element_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( voxel_stack_element_block_array *Arr) +link_internal voxel_stack_element_block_array_index +Capacity( voxel_stack_element_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + voxel_stack_element_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal voxel_stack_element_block_array_index -LastIndex( voxel_stack_element_block_array *Arr) +AtElements( voxel_stack_element_block_array *Arr ) { - voxel_stack_element_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + voxel_stack_element_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( voxel_stack_element_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal voxel_stack_element_block_array_index -AtElements( voxel_stack_element_block_array *Arr) +LastIndex( voxel_stack_element_block_array *Arr ) { voxel_stack_element_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( voxel_stack_element_block_array *Arr) +Count( voxel_stack_element_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal voxel_stack_element * -GetPtr(voxel_stack_element_block_array *Arr, voxel_stack_element_block_array_index Index) +link_internal voxel_stack_element_block * +GetBlock( voxel_stack_element_block_array *Arr, voxel_stack_element_block_array_index Index ) { - voxel_stack_element *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + voxel_stack_element_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal voxel_stack_element * -GetPtr(voxel_stack_element_block *Block, umm Index) +GetPtr( voxel_stack_element_block_array *Arr, voxel_stack_element_block_array_index Index ) { - voxel_stack_element *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + voxel_stack_element_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + voxel_stack_element *Result = (Block->Elements + ElementIndex); return Result; } link_internal voxel_stack_element * -GetPtr(voxel_stack_element_block_array *Arr, umm Index) +TryGetPtr(voxel_stack_element_block_array *Arr, voxel_stack_element_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - voxel_stack_element_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + voxel_stack_element * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - voxel_stack_element *Result = (Block->Elements+ElementIndex); return Result; } + link_internal voxel_stack_element * -TryGetPtr(voxel_stack_element_block_array *Arr, umm Index) +GetPtr( voxel_stack_element_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - voxel_stack_element *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + voxel_stack_element_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(voxel_stack_element_block *Block) +link_internal voxel_stack_element * +TryGetPtr(voxel_stack_element_block_array *Arr, umm Index) { - return Block->At; + voxel_stack_element * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + voxel_stack_element_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal voxel_stack_element_block * -Allocate_voxel_stack_element_block(memory_arena *Memory) -{ - voxel_stack_element_block *Result = Allocate( voxel_stack_element_block, Memory, 1); - Result->Elements = Allocate( voxel_stack_element, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( voxel_stack_element_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal voxel_stack_element * @@ -228,82 +211,63 @@ Set( voxel_stack_element_block_array *Arr, voxel_stack_element *Element, voxel_stack_element_block_array_index Index ) { - voxel_stack_element *Result = {}; - if (Index.Block) - { - voxel_stack_element *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + voxel_stack_element_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index) +NewBlock( voxel_stack_element_block_array *Arr ) { - voxel_stack_element_block_array_index LastI = LastIndex(Array); - - voxel_stack_element *Element = GetPtr(Array, Index); - voxel_stack_element *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + voxel_stack_element_block *NewBlock = Allocate( voxel_stack_element_block , Arr->Memory, 1); + voxel_stack_element_block **NewBlockPtrs = Allocate( voxel_stack_element_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - voxel_stack_element_block *Current = Array->First; - voxel_stack_element_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index) +RemoveOrdered( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + voxel_stack_element *Prev = {}; - while (NextI < End) + voxel_stack_element_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + voxel_stack_element *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( voxel_stack_element_block_array *Array, voxel_stack_element *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_voxel_stack_element_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - voxel_stack_element_block *Next = Allocate_voxel_stack_element_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - voxel_stack_element *Result = Array->Current->Elements + Array->Current->At; + voxel_stack_element *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( voxel_stack_element_block_array *Array ) return Result; } +link_internal void +Shift( voxel_stack_element_block_array *Array, voxel_stack_element *Element ) +{ + Assert(Array->Memory); + voxel_stack_element *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index c1586a279..6024672b3 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -4,18 +4,17 @@ -link_internal world_chunk_ptr_block * -Allocate_world_chunk_ptr_block(memory_arena *Memory) -{ - world_chunk_ptr_block *Result = Allocate( world_chunk_ptr_block, Memory, 1); - Result->Elements = Allocate( world_chunk_ptr, Memory, 32); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( world_chunk_ptr_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal world_chunk_ptr @@ -23,82 +22,63 @@ Set( world_chunk_ptr_block_array *Arr, world_chunk_ptr Element, world_chunk_ptr_block_array_index Index ) { - world_chunk_ptr Result = {}; - if (Index.Block) - { - world_chunk_ptr *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = Element; - - Result = *Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + world_chunk_ptr_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 32; + auto Slot = Block->Elements+ElementIndex; + *Slot = Element; + return *Slot; } link_internal void -RemoveUnordered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index) +NewBlock( world_chunk_ptr_block_array *Arr ) { - world_chunk_ptr_block_array_index LastI = LastIndex(Array); - - world_chunk_ptr Element = GetPtr(Array, Index); - world_chunk_ptr LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); + world_chunk_ptr_block *NewBlock = Allocate( world_chunk_ptr_block , Arr->Memory, 1); + world_chunk_ptr_block **NewBlockPtrs = Allocate( world_chunk_ptr_block*, Arr->Memory, Arr->BlockCount+1); - Assert(Array->Current->At); - Array->Current->At -= 1; - - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - world_chunk_ptr_block *Current = Array->First; - world_chunk_ptr_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index) +RemoveOrdered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + world_chunk_ptr Prev = {}; - while (NextI < End) + world_chunk_ptr_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + world_chunk_ptr E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -137,42 +117,48 @@ IsValid(world_chunk_ptr_block_array_index *Index) return Result; } -link_internal world_chunk_ptr * -Push( world_chunk_ptr_block_array *Array, world_chunk_ptr *Element) +link_internal world_chunk_ptr +Push( world_chunk_ptr_block_array *Array, world_chunk_ptr Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_world_chunk_ptr_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 32) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - world_chunk_ptr_block *Next = Allocate_world_chunk_ptr_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - world_chunk_ptr *Result = Array->Current->Elements + Array->Current->At; + world_chunk_ptr Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } -link_internal world_chunk_ptr * +link_internal world_chunk_ptr Push( world_chunk_ptr_block_array *Array ) { world_chunk_ptr Element = {}; - auto Result = Push(Array, &Element); + auto Result = Push(Array, Element); return Result; } +link_internal void +Shift( world_chunk_ptr_block_array *Array, world_chunk_ptr Element ) +{ + Assert(Array->Memory); + world_chunk_ptr Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 0f308d3bf..80933fe0d 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1253:0 +// src/engine/editor.h:1248:0 @@ -6,23 +6,24 @@ struct world_edit_block { - u32 Index; - u32 At; - world_edit *Elements; - world_edit_block *Next; + /* u32 Index; */ + umm At; + world_edit Elements[8]; }; struct world_edit_block_array_index { - world_edit_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct world_edit_block_array { - world_edit_block *First; - world_edit_block *Current; + world_edit_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef world_edit_block_array world_edit_paged_list; link_internal world_edit_block_array_index operator++( world_edit_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( world_edit_block_array_index I0, world_edit_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( world_edit_block_array_index I0, world_edit_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( world_edit_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal world_edit_block_array_index -ZerothIndex( world_edit_block_array *Arr) +ZerothIndex( world_edit_block_array *Arr ) { - world_edit_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( world_edit_block_array *Arr) +link_internal world_edit_block_array_index +Capacity( world_edit_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + world_edit_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal world_edit_block_array_index -LastIndex( world_edit_block_array *Arr) +AtElements( world_edit_block_array *Arr ) { - world_edit_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + world_edit_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( world_edit_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal world_edit_block_array_index -AtElements( world_edit_block_array *Arr) +LastIndex( world_edit_block_array *Arr ) { world_edit_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( world_edit_block_array *Arr) +Count( world_edit_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal world_edit * -GetPtr(world_edit_block_array *Arr, world_edit_block_array_index Index) +link_internal world_edit_block * +GetBlock( world_edit_block_array *Arr, world_edit_block_array_index Index ) { - world_edit *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + world_edit_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal world_edit * -GetPtr(world_edit_block *Block, umm Index) +GetPtr( world_edit_block_array *Arr, world_edit_block_array_index Index ) { - world_edit *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + world_edit_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + world_edit *Result = (Block->Elements + ElementIndex); return Result; } link_internal world_edit * -GetPtr(world_edit_block_array *Arr, umm Index) +TryGetPtr(world_edit_block_array *Arr, world_edit_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - world_edit_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + world_edit * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - world_edit *Result = (Block->Elements+ElementIndex); return Result; } + link_internal world_edit * -TryGetPtr(world_edit_block_array *Arr, umm Index) +GetPtr( world_edit_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - world_edit *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + world_edit_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(world_edit_block *Block) +link_internal world_edit * +TryGetPtr(world_edit_block_array *Arr, umm Index) { - return Block->At; + world_edit * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + world_edit_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal world_edit_block * -Allocate_world_edit_block(memory_arena *Memory) -{ - world_edit_block *Result = Allocate( world_edit_block, Memory, 1); - Result->Elements = Allocate( world_edit, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( world_edit_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal world_edit * @@ -228,82 +211,63 @@ Set( world_edit_block_array *Arr, world_edit *Element, world_edit_block_array_index Index ) { - world_edit *Result = {}; - if (Index.Block) - { - world_edit *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + world_edit_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( world_edit_block_array *Array, world_edit_block_array_index Index) +NewBlock( world_edit_block_array *Arr ) { - world_edit_block_array_index LastI = LastIndex(Array); - - world_edit *Element = GetPtr(Array, Index); - world_edit *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + world_edit_block *NewBlock = Allocate( world_edit_block , Arr->Memory, 1); + world_edit_block **NewBlockPtrs = Allocate( world_edit_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - world_edit_block *Current = Array->First; - world_edit_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( world_edit_block_array *Array, world_edit_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( world_edit_block_array *Array, world_edit_block_array_index Index) +RemoveOrdered( world_edit_block_array *Array, world_edit_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + world_edit *Prev = {}; - while (NextI < End) + world_edit_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + world_edit *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( world_edit_block_array *Array, world_edit *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_world_edit_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - world_edit_block *Next = Allocate_world_edit_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - world_edit *Result = Array->Current->Elements + Array->Current->At; + world_edit *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( world_edit_block_array *Array ) return Result; } +link_internal void +Shift( world_edit_block_array *Array, world_edit *Element ) +{ + Assert(Array->Memory); + world_edit *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h new file mode 100644 index 000000000..998f57981 --- /dev/null +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -0,0 +1,354 @@ +// src/engine/editor.h:1254:0 + + + + + +struct world_edit_block_array_index_block +{ + /* u32 Index; */ + umm At; + world_edit_block_array_index Elements[8]; +}; + +struct world_edit_block_array_index_block_array_index +{ + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ +}; + +struct world_edit_block_array_index_block_array +{ + world_edit_block_array_index_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; + memory_arena *Memory; poof(@no_serialize) + +}; + +link_internal world_edit_block_array_index_block_array +WorldEditBlockArrayIndexBlockArray(memory_arena *Memory) +{ + world_edit_block_array_index_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal b32 +AreEqual(world_edit_block_array_index_block_array_index *Thing1, world_edit_block_array_index_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( world_edit_block_array_index_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(world_edit_block_array_index_block_array_index Thing1, world_edit_block_array_index_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( world_edit_block_array_index_block_array_index ) ); + + return Result; +} + + +typedef world_edit_block_array_index_block_array world_edit_block_array_index_paged_list; + +link_internal world_edit_block_array_index_block_array_index +operator++( world_edit_block_array_index_block_array_index &I0 ) +{ + I0.Index++; + return I0; +} + +link_internal b32 +operator<( world_edit_block_array_index_block_array_index I0, world_edit_block_array_index_block_array_index I1 ) +{ + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( world_edit_block_array_index_block_array_index I0, world_edit_block_array_index_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; + return Result; +} + +link_inline umm +GetIndex( world_edit_block_array_index_block_array_index *Index) +{ + umm Result = Index->Index; + return Result; +} + + +link_internal world_edit_block_array_index_block_array_index +ZerothIndex( world_edit_block_array_index_block_array *Arr ) +{ + return {}; +} + +link_internal world_edit_block_array_index_block_array_index +Capacity( world_edit_block_array_index_block_array *Arr ) +{ + world_edit_block_array_index_block_array_index Result = {Arr->BlockCount * 8}; + return Result; +} + +link_internal world_edit_block_array_index_block_array_index +AtElements( world_edit_block_array_index_block_array *Arr ) +{ + world_edit_block_array_index_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( world_edit_block_array_index_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + +link_internal world_edit_block_array_index_block_array_index +LastIndex( world_edit_block_array_index_block_array *Arr ) +{ + world_edit_block_array_index_block_array_index Result = {}; + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; + return Result; +} + +link_internal umm +Count( world_edit_block_array_index_block_array *Arr ) +{ + auto Result = AtElements(Arr).Index; + return Result; +} + +link_internal world_edit_block_array_index_block * +GetBlock( world_edit_block_array_index_block_array *Arr, world_edit_block_array_index_block_array_index Index ) +{ + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + world_edit_block_array_index_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; +} + +link_internal world_edit_block_array_index * +GetPtr( world_edit_block_array_index_block_array *Arr, world_edit_block_array_index_block_array_index Index ) +{ + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + world_edit_block_array_index_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + world_edit_block_array_index *Result = (Block->Elements + ElementIndex); + return Result; +} + +link_internal world_edit_block_array_index * +TryGetPtr(world_edit_block_array_index_block_array *Arr, world_edit_block_array_index_block_array_index Index) +{ + world_edit_block_array_index * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) + { + Result = GetPtr(Arr, Index); + } + return Result; +} + + +link_internal world_edit_block_array_index * +GetPtr( world_edit_block_array_index_block_array *Arr, umm Index ) +{ + world_edit_block_array_index_block_array_index I = {Index}; + return GetPtr(Arr, I); +} + +link_internal world_edit_block_array_index * +TryGetPtr(world_edit_block_array_index_block_array *Arr, umm Index) +{ + world_edit_block_array_index * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + world_edit_block_array_index_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; +} + + + + + +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ + +link_internal cs +CS( world_edit_block_array_index_block_array_index Index ) +{ + return FSz("(%u)", Index.Index); +} + +link_internal world_edit_block_array_index * +Set( world_edit_block_array_index_block_array *Arr, + world_edit_block_array_index *Element, + world_edit_block_array_index_block_array_index Index ) +{ + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + world_edit_block_array_index_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; +} + +link_internal void +NewBlock( world_edit_block_array_index_block_array *Arr ) +{ + world_edit_block_array_index_block *NewBlock = Allocate( world_edit_block_array_index_block , Arr->Memory, 1); + world_edit_block_array_index_block **NewBlockPtrs = Allocate( world_edit_block_array_index_block*, Arr->Memory, Arr->BlockCount+1); + + RangeIterator_t(u32, BlockI, Arr->BlockCount) + { + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } + + NewBlockPtrs[Arr->BlockCount] = NewBlock; + + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} + +link_internal void +RemoveUnordered( world_edit_block_array_index_block_array *Array, world_edit_block_array_index_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; +} + +link_internal void +RemoveOrdered( world_edit_block_array_index_block_array *Array, world_edit_block_array_index_block_array_index IndexToRemove) +{ + Assert(IndexToRemove.Index < Array->ElementCount); + + world_edit_block_array_index *Prev = {}; + + world_edit_block_array_index_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) + { + world_edit_block_array_index *E = GetPtr(Array, Index); + + if (Prev) + { + *Prev = *E; + } + + Prev = E; + } + + Array->ElementCount -= 1; +} + +link_internal void +RemoveOrdered( world_edit_block_array_index_block_array *Array, world_edit_block_array_index *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + +link_internal world_edit_block_array_index_block_array_index +Find( world_edit_block_array_index_block_array *Array, world_edit_block_array_index *Query) +{ + world_edit_block_array_index_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + IterateOver(Array, E, Index) + { + if ( E == Query) + { + Result = Index; + break; + } + } + return Result; +} + +link_internal b32 +IsValid(world_edit_block_array_index_block_array_index *Index) +{ + world_edit_block_array_index_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + b32 Result = (AreEqual(Index, &Test) == False); + return Result; +} + +link_internal world_edit_block_array_index * +Push( world_edit_block_array_index_block_array *Array, world_edit_block_array_index *Element) +{ + Assert(Array->Memory); + + if (AtElements(Array) == Capacity(Array)) + { + NewBlock(Array); + } + + world_edit_block_array_index *Result = Set(Array, Element, AtElements(Array)); + + Array->ElementCount += 1; + + return Result; +} + +link_internal world_edit_block_array_index * +Push( world_edit_block_array_index_block_array *Array ) +{ + world_edit_block_array_index Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + +link_internal void +Shift( world_edit_block_array_index_block_array *Array, world_edit_block_array_index *Element ) +{ + Assert(Array->Memory); + world_edit_block_array_index *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + + diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 7fe426b9e..9bb7c34f7 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1264:0 +// src/engine/editor.h:1265:0 @@ -6,23 +6,24 @@ struct world_edit_layer_block { - u32 Index; - u32 At; - world_edit_layer *Elements; - world_edit_layer_block *Next; + /* u32 Index; */ + umm At; + world_edit_layer Elements[8]; }; struct world_edit_layer_block_array_index { - world_edit_layer_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct world_edit_layer_block_array { - world_edit_layer_block *First; - world_edit_layer_block *Current; + world_edit_layer_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef world_edit_layer_block_array world_edit_layer_paged_list; link_internal world_edit_layer_block_array_index operator++( world_edit_layer_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( world_edit_layer_block_array_index I0, world_edit_layer_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( world_edit_layer_block_array_index I0, world_edit_layer_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( world_edit_layer_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal world_edit_layer_block_array_index -ZerothIndex( world_edit_layer_block_array *Arr) +ZerothIndex( world_edit_layer_block_array *Arr ) { - world_edit_layer_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( world_edit_layer_block_array *Arr) +link_internal world_edit_layer_block_array_index +Capacity( world_edit_layer_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + world_edit_layer_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal world_edit_layer_block_array_index -LastIndex( world_edit_layer_block_array *Arr) +AtElements( world_edit_layer_block_array *Arr ) { - world_edit_layer_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + world_edit_layer_block_array_index Result = {Arr->ElementCount}; return Result; } + +link_internal umm +TotalElements( world_edit_layer_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + link_internal world_edit_layer_block_array_index -AtElements( world_edit_layer_block_array *Arr) +LastIndex( world_edit_layer_block_array *Arr ) { world_edit_layer_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( world_edit_layer_block_array *Arr) +Count( world_edit_layer_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal world_edit_layer * -GetPtr(world_edit_layer_block_array *Arr, world_edit_layer_block_array_index Index) +link_internal world_edit_layer_block * +GetBlock( world_edit_layer_block_array *Arr, world_edit_layer_block_array_index Index ) { - world_edit_layer *Result = {}; - if (Index.Block) { Result = (Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + world_edit_layer_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal world_edit_layer * -GetPtr(world_edit_layer_block *Block, umm Index) +GetPtr( world_edit_layer_block_array *Arr, world_edit_layer_block_array_index Index ) { - world_edit_layer *Result = {}; - if (Index < Block->At) { Result = (Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + world_edit_layer_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + world_edit_layer *Result = (Block->Elements + ElementIndex); return Result; } link_internal world_edit_layer * -GetPtr(world_edit_layer_block_array *Arr, umm Index) +TryGetPtr(world_edit_layer_block_array *Arr, world_edit_layer_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - world_edit_layer_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + world_edit_layer * Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - world_edit_layer *Result = (Block->Elements+ElementIndex); return Result; } + link_internal world_edit_layer * -TryGetPtr(world_edit_layer_block_array *Arr, umm Index) +GetPtr( world_edit_layer_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - world_edit_layer *Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + world_edit_layer_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(world_edit_layer_block *Block) +link_internal world_edit_layer * +TryGetPtr(world_edit_layer_block_array *Arr, umm Index) { - return Block->At; + world_edit_layer * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + world_edit_layer_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal world_edit_layer_block * -Allocate_world_edit_layer_block(memory_arena *Memory) -{ - world_edit_layer_block *Result = Allocate( world_edit_layer_block, Memory, 1); - Result->Elements = Allocate( world_edit_layer, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( world_edit_layer_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal world_edit_layer * @@ -228,82 +211,63 @@ Set( world_edit_layer_block_array *Arr, world_edit_layer *Element, world_edit_layer_block_array_index Index ) { - world_edit_layer *Result = {}; - if (Index.Block) - { - world_edit_layer *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = *Element; - - Result = Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + world_edit_layer_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; } link_internal void -RemoveUnordered( world_edit_layer_block_array *Array, world_edit_layer_block_array_index Index) +NewBlock( world_edit_layer_block_array *Arr ) { - world_edit_layer_block_array_index LastI = LastIndex(Array); - - world_edit_layer *Element = GetPtr(Array, Index); - world_edit_layer *LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + world_edit_layer_block *NewBlock = Allocate( world_edit_layer_block , Arr->Memory, 1); + world_edit_layer_block **NewBlockPtrs = Allocate( world_edit_layer_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - world_edit_layer_block *Current = Array->First; - world_edit_layer_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( world_edit_layer_block_array *Array, world_edit_layer_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( world_edit_layer_block_array *Array, world_edit_layer_block_array_index Index) +RemoveOrdered( world_edit_layer_block_array *Array, world_edit_layer_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + world_edit_layer *Prev = {}; - while (NextI < End) + world_edit_layer_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + world_edit_layer *E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -347,28 +311,14 @@ Push( world_edit_layer_block_array *Array, world_edit_layer *Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_world_edit_layer_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - world_edit_layer_block *Next = Allocate_world_edit_layer_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - world_edit_layer *Result = Array->Current->Elements + Array->Current->At; + world_edit_layer *Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } @@ -381,4 +331,24 @@ Push( world_edit_layer_block_array *Array ) return Result; } +link_internal void +Shift( world_edit_layer_block_array *Array, world_edit_layer *Element ) +{ + Assert(Array->Memory); + world_edit_layer *Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 800870878..15b9a49ec 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1256:0 +// src/engine/editor.h:1251:0 @@ -6,23 +6,24 @@ struct world_edit_ptr_block { - u32 Index; - u32 At; - world_edit_ptr *Elements; - world_edit_ptr_block *Next; + /* u32 Index; */ + umm At; + world_edit_ptr Elements[8]; }; struct world_edit_ptr_block_array_index { - world_edit_ptr_block *Block; - u32 BlockIndex; - u32 ElementIndex; + umm Index; + /* block_t *Block; */ + /* u32 BlockIndex; */ + /* u32 ElementIndex; */ }; struct world_edit_ptr_block_array { - world_edit_ptr_block *First; - world_edit_ptr_block *Current; + world_edit_ptr_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; memory_arena *Memory; poof(@no_serialize) }; @@ -64,163 +65,145 @@ typedef world_edit_ptr_block_array world_edit_ptr_paged_list; link_internal world_edit_ptr_block_array_index operator++( world_edit_ptr_block_array_index &I0 ) { - if (I0.Block) - { - if (I0.ElementIndex == 8-1) - { - I0.ElementIndex = 0; - I0.BlockIndex++; - I0.Block = I0.Block->Next; - } - else - { - I0.ElementIndex++; - } - } - else - { - I0.ElementIndex++; - } + I0.Index++; return I0; } link_internal b32 operator<( world_edit_ptr_block_array_index I0, world_edit_ptr_block_array_index I1 ) { - b32 Result = I0.BlockIndex < I1.BlockIndex || (I0.BlockIndex == I1.BlockIndex & I0.ElementIndex < I1.ElementIndex); + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( world_edit_ptr_block_array_index I0, world_edit_ptr_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; return Result; } link_inline umm GetIndex( world_edit_ptr_block_array_index *Index) { - umm Result = Index->ElementIndex + (Index->BlockIndex*8); + umm Result = Index->Index; return Result; } + link_internal world_edit_ptr_block_array_index -ZerothIndex( world_edit_ptr_block_array *Arr) +ZerothIndex( world_edit_ptr_block_array *Arr ) { - world_edit_ptr_block_array_index Result = {}; - Result.Block = Arr->First; - return Result; + return {}; } -link_internal umm -TotalElements( world_edit_ptr_block_array *Arr) +link_internal world_edit_ptr_block_array_index +Capacity( world_edit_ptr_block_array *Arr ) { - umm Result = 0; - if (Arr->Current) - { - Result = (Arr->Current->Index * 8) + Arr->Current->At; - } + world_edit_ptr_block_array_index Result = {Arr->BlockCount * 8}; return Result; } link_internal world_edit_ptr_block_array_index -LastIndex( world_edit_ptr_block_array *Arr) +AtElements( world_edit_ptr_block_array *Arr ) { - world_edit_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - Assert(Result.ElementIndex); - Result.ElementIndex--; - } + world_edit_ptr_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( world_edit_ptr_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; return Result; } + link_internal world_edit_ptr_block_array_index -AtElements( world_edit_ptr_block_array *Arr) +LastIndex( world_edit_ptr_block_array *Arr ) { world_edit_ptr_block_array_index Result = {}; - if (Arr->Current) - { - Result.Block = Arr->Current; - Result.BlockIndex = Arr->Current->Index; - Result.ElementIndex = Arr->Current->At; - } + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; return Result; } link_internal umm -Count( world_edit_ptr_block_array *Arr) +Count( world_edit_ptr_block_array *Arr ) { - auto Index = AtElements(Arr); - umm Result = GetIndex(&Index); + auto Result = AtElements(Arr).Index; return Result; } -link_internal world_edit_ptr -GetPtr(world_edit_ptr_block_array *Arr, world_edit_ptr_block_array_index Index) +link_internal world_edit_ptr_block * +GetBlock( world_edit_ptr_block_array *Arr, world_edit_ptr_block_array_index Index ) { - world_edit_ptr Result = {}; - if (Index.Block) { Result = *(Index.Block->Elements + Index.ElementIndex); } - return Result; + umm BlockIndex = Index.Index / 8; + Assert(BlockIndex < Arr->BlockCount); + world_edit_ptr_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; } link_internal world_edit_ptr -GetPtr(world_edit_ptr_block *Block, umm Index) +GetPtr( world_edit_ptr_block_array *Arr, world_edit_ptr_block_array_index Index ) { - world_edit_ptr Result = {}; - if (Index < Block->At) { Result = *(Block->Elements + Index); } + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + world_edit_ptr_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 8; + world_edit_ptr Result = *(Block->Elements + ElementIndex); return Result; } link_internal world_edit_ptr -GetPtr(world_edit_ptr_block_array *Arr, umm Index) +TryGetPtr(world_edit_ptr_block_array *Arr, world_edit_ptr_block_array_index Index) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - umm AtBlock = 0; - world_edit_ptr_block *Block = Arr->First; - while (AtBlock++ < BlockIndex) + world_edit_ptr Result = {}; + if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) { - Block = Block->Next; + Result = GetPtr(Arr, Index); } - - world_edit_ptr Result = *(Block->Elements+ElementIndex); return Result; } + link_internal world_edit_ptr -TryGetPtr(world_edit_ptr_block_array *Arr, umm Index) +GetPtr( world_edit_ptr_block_array *Arr, umm Index ) { - umm BlockIndex = Index / 8; - umm ElementIndex = Index % 8; - - auto AtE = AtElements(Arr); - umm Total = GetIndex(&AtE); - world_edit_ptr Result = {}; - if (Index < Total) { Result = GetPtr(Arr, Index); } - return Result; + world_edit_ptr_block_array_index I = {Index}; + return GetPtr(Arr, I); } -link_internal u32 -AtElements(world_edit_ptr_block *Block) +link_internal world_edit_ptr +TryGetPtr(world_edit_ptr_block_array *Arr, umm Index) { - return Block->At; + world_edit_ptr Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + { + world_edit_ptr_block_array_index I = {Index}; + Result = GetPtr(Arr, I); + } + return Result; } -link_internal world_edit_ptr_block * -Allocate_world_edit_ptr_block(memory_arena *Memory) -{ - world_edit_ptr_block *Result = Allocate( world_edit_ptr_block, Memory, 1); - Result->Elements = Allocate( world_edit_ptr, Memory, 8); - return Result; -} +/* link_internal block_t * */ +/* Allocate_(element_t.name)_block(memory_arena *Memory) */ +/* { */ +/* block_t *Result = Allocate( block_t, Memory, 1); */ +/* return Result; */ +/* } */ link_internal cs CS( world_edit_ptr_block_array_index Index ) { - return FSz("(%u)(%u)", Index.BlockIndex, Index.ElementIndex); + return FSz("(%u)", Index.Index); } link_internal world_edit_ptr @@ -228,82 +211,63 @@ Set( world_edit_ptr_block_array *Arr, world_edit_ptr Element, world_edit_ptr_block_array_index Index ) { - world_edit_ptr Result = {}; - if (Index.Block) - { - world_edit_ptr *Slot = &Index.Block->Elements[Index.ElementIndex]; - *Slot = Element; - - Result = *Slot; - } - - return Result; + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + world_edit_ptr_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 8; + auto Slot = Block->Elements+ElementIndex; + *Slot = Element; + return *Slot; } link_internal void -RemoveUnordered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index Index) +NewBlock( world_edit_ptr_block_array *Arr ) { - world_edit_ptr_block_array_index LastI = LastIndex(Array); - - world_edit_ptr Element = GetPtr(Array, Index); - world_edit_ptr LastElement = GetPtr(Array, LastI); - - Set(Array, LastElement, Index); - - Assert(Array->Current->At); - Array->Current->At -= 1; + world_edit_ptr_block *NewBlock = Allocate( world_edit_ptr_block , Arr->Memory, 1); + world_edit_ptr_block **NewBlockPtrs = Allocate( world_edit_ptr_block*, Arr->Memory, Arr->BlockCount+1); - if (Array->Current->At == 0) + RangeIterator_t(u32, BlockI, Arr->BlockCount) { - // TODO(Jesse): There's obviously a way better way to do this .. - auto AtE = AtElements(Array); - s32 Count = s32(GetIndex(&AtE)); + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } - if (Count == 0) - { - // Nothing to be done, we've popping the last thing off the array - Assert(Index.Block == Array->First); - Assert(Index.Block == Array->Current); - Assert(Index.BlockIndex == 0); - Assert(Index.ElementIndex == 0); - } - else - { - // Walk the chain till we get to the second-last one - world_edit_ptr_block *Current = Array->First; - world_edit_ptr_block *LastB = LastI.Block; + NewBlockPtrs[Arr->BlockCount] = NewBlock; - while (Current->Next && Current->Next != LastB) - { - Current = Current->Next; - } + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} - Assert(Current->Next == LastB || Current->Next == 0); - Array->Current = Current; - } - } +link_internal void +RemoveUnordered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index Index) +{ + auto LastElement = GetPtr(Array, LastIndex(Array)); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; } link_internal void -RemoveOrdered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index Index) +RemoveOrdered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index IndexToRemove) { - auto End = AtElements(Array); - auto AtI = Index; - auto NextI = Index; - ++NextI; + Assert(IndexToRemove.Index < Array->ElementCount); + + world_edit_ptr Prev = {}; - while (NextI < End) + world_edit_ptr_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) { - auto At = GetPtr(Array, AtI); - auto NextV = *GetPtr(Array, NextI); + world_edit_ptr E = GetPtr(Array, Index); - *At = NextV; + if (Prev) + { + *Prev = *E; + } - ++AtI; - ++NextI; + Prev = E; } - RemoveUnordered(Array, NextI); + Array->ElementCount -= 1; } link_internal void @@ -342,43 +306,49 @@ IsValid(world_edit_ptr_block_array_index *Index) return Result; } -link_internal world_edit_ptr * -Push( world_edit_ptr_block_array *Array, world_edit_ptr *Element) +link_internal world_edit_ptr +Push( world_edit_ptr_block_array *Array, world_edit_ptr Element) { Assert(Array->Memory); - if (Array->First == 0) { Array->First = Allocate_world_edit_ptr_block(Array->Memory); Array->Current = Array->First; } - - if (Array->Current->At == 8) + if (AtElements(Array) == Capacity(Array)) { - if (Array->Current->Next) - { - Array->Current = Array->Current->Next; - Assert(Array->Current->At == 0); - } - else - { - world_edit_ptr_block *Next = Allocate_world_edit_ptr_block(Array->Memory); - Next->Index = Array->Current->Index + 1; - - Array->Current->Next = Next; - Array->Current = Next; - } + NewBlock(Array); } - world_edit_ptr *Result = Array->Current->Elements + Array->Current->At; + world_edit_ptr Result = Set(Array, Element, AtElements(Array)); - Array->Current->Elements[Array->Current->At++] = *Element; + Array->ElementCount += 1; return Result; } -link_internal world_edit_ptr * +link_internal world_edit_ptr Push( world_edit_ptr_block_array *Array ) { world_edit_ptr Element = {}; - auto Result = Push(Array, &Element); + auto Result = Push(Array, Element); return Result; } +link_internal void +Shift( world_edit_ptr_block_array *Array, world_edit_ptr Element ) +{ + Assert(Array->Memory); + world_edit_ptr Prev = {}; + + // Alocate a new thingy + Push(Array); + + auto End = AtElements(Array); + RangeIteratorReverse(Index, s32(End.Index)) + { + auto E = GetPtr(Array, umm(Index)); + if (Prev) { *Prev = *E; } + Prev = E; + } + + *Prev = *Element; +} + diff --git a/generated/buffer_asset.h b/generated/buffer_asset.h index bc970c3ab..375b5362b 100644 --- a/generated/buffer_asset.h +++ b/generated/buffer_asset.h @@ -59,6 +59,12 @@ GetPtr(asset_buffer *Buf, umm Index) return Result; } +link_inline asset * +TryGetPtr(asset_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline asset * Get(asset_buffer *Buf, umm Index) { diff --git a/generated/buffer_bitmap.h b/generated/buffer_bitmap.h index fddb05401..600d07ee1 100644 --- a/generated/buffer_bitmap.h +++ b/generated/buffer_bitmap.h @@ -59,6 +59,12 @@ GetPtr(bitmap_buffer *Buf, umm Index) return Result; } +link_inline bitmap * +TryGetPtr(bitmap_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline bitmap * Get(bitmap_buffer *Buf, umm Index) { diff --git a/generated/buffer_bonsai_type_info.h b/generated/buffer_bonsai_type_info.h index 70d9082a4..8d9bab710 100644 --- a/generated/buffer_bonsai_type_info.h +++ b/generated/buffer_bonsai_type_info.h @@ -59,6 +59,12 @@ GetPtr(bonsai_type_info_buffer *Buf, umm Index) return Result; } +link_inline bonsai_type_info * +TryGetPtr(bonsai_type_info_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline bonsai_type_info * Get(bonsai_type_info_buffer *Buf, umm Index) { diff --git a/generated/buffer_c_token.h b/generated/buffer_c_token.h index feefd219f..c27d663d9 100644 --- a/generated/buffer_c_token.h +++ b/generated/buffer_c_token.h @@ -59,6 +59,12 @@ GetPtr(c_token_buffer *Buf, umm Index) return Result; } +link_inline c_token * +TryGetPtr(c_token_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline c_token * Get(c_token_buffer *Buf, umm Index) { diff --git a/generated/buffer_c_token_buffer.h b/generated/buffer_c_token_buffer.h index df452cc64..6f65923bd 100644 --- a/generated/buffer_c_token_buffer.h +++ b/generated/buffer_c_token_buffer.h @@ -59,6 +59,12 @@ GetPtr(c_token_buffer_buffer *Buf, umm Index) return Result; } +link_inline c_token_buffer * +TryGetPtr(c_token_buffer_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline c_token_buffer * Get(c_token_buffer_buffer *Buf, umm Index) { diff --git a/generated/buffer_counted_string.h b/generated/buffer_counted_string.h index dec4b222c..3a87ff20e 100644 --- a/generated/buffer_counted_string.h +++ b/generated/buffer_counted_string.h @@ -59,6 +59,12 @@ GetPtr(counted_string_buffer *Buf, umm Index) return Result; } +link_inline counted_string * +TryGetPtr(counted_string_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline counted_string * Get(counted_string_buffer *Buf, umm Index) { diff --git a/generated/buffer_file_traversal_node.h b/generated/buffer_file_traversal_node.h index ba4321f0b..687b1454f 100644 --- a/generated/buffer_file_traversal_node.h +++ b/generated/buffer_file_traversal_node.h @@ -59,6 +59,12 @@ GetPtr(file_traversal_node_buffer *Buf, umm Index) return Result; } +link_inline file_traversal_node * +TryGetPtr(file_traversal_node_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline file_traversal_node * Get(file_traversal_node_buffer *Buf, umm Index) { diff --git a/generated/buffer_h_struct_u32.h b/generated/buffer_h_struct_u32.h index 21647154b..5bcf1ecd0 100644 --- a/generated/buffer_h_struct_u32.h +++ b/generated/buffer_h_struct_u32.h @@ -59,6 +59,12 @@ GetPtr(shader_uniform_buffer *Buf, u32 Index) return Result; } +link_inline shader_uniform * +TryGetPtr(shader_uniform_buffer *Buf, u32 Index) +{ + return GetPtr(Buf, Index); +} + link_inline shader_uniform * Get(shader_uniform_buffer *Buf, u32 Index) { diff --git a/generated/buffer_model.h b/generated/buffer_model.h index 6f5b0f236..4fdabcce8 100644 --- a/generated/buffer_model.h +++ b/generated/buffer_model.h @@ -59,6 +59,12 @@ GetPtr(model_buffer *Buf, u64 Index) return Result; } +link_inline model * +TryGetPtr(model_buffer *Buf, u64 Index) +{ + return GetPtr(Buf, Index); +} + link_inline model * Get(model_buffer *Buf, u64 Index) { diff --git a/generated/buffer_octree_node_ptr.h b/generated/buffer_octree_node_ptr.h index f1e18abae..cdfbdf23d 100644 --- a/generated/buffer_octree_node_ptr.h +++ b/generated/buffer_octree_node_ptr.h @@ -59,6 +59,12 @@ GetPtr(octree_node_ptr_buffer *Buf, umm Index) return Result; } +link_inline octree_node_ptr * +TryGetPtr(octree_node_ptr_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline octree_node_ptr * Get(octree_node_ptr_buffer *Buf, umm Index) { diff --git a/generated/buffer_rect3i.h b/generated/buffer_rect3i.h index 805a61c90..89e49322f 100644 --- a/generated/buffer_rect3i.h +++ b/generated/buffer_rect3i.h @@ -59,6 +59,12 @@ GetPtr(rect3i_buffer *Buf, umm Index) return Result; } +link_inline rect3i * +TryGetPtr(rect3i_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline rect3i * Get(rect3i_buffer *Buf, umm Index) { diff --git a/generated/buffer_sort_key.h b/generated/buffer_sort_key.h index 2b681cdc5..911566631 100644 --- a/generated/buffer_sort_key.h +++ b/generated/buffer_sort_key.h @@ -59,6 +59,12 @@ GetPtr(sort_key_buffer *Buf, umm Index) return Result; } +link_inline sort_key * +TryGetPtr(sort_key_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline sort_key * Get(sort_key_buffer *Buf, umm Index) { diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 18c345ad9..4ec25fe99 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -59,6 +59,12 @@ GetPtr(standing_spot_buffer *Buf, umm Index) return Result; } +link_inline standing_spot * +TryGetPtr(standing_spot_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline standing_spot * Get(standing_spot_buffer *Buf, umm Index) { diff --git a/generated/buffer_thread_main_callback_type.h b/generated/buffer_thread_main_callback_type.h index f1bcfc45f..140fdafdb 100644 --- a/generated/buffer_thread_main_callback_type.h +++ b/generated/buffer_thread_main_callback_type.h @@ -59,6 +59,12 @@ GetPtr(thread_main_callback_type_buffer *Buf, umm Index) return Result; } +link_inline thread_main_callback_type * +TryGetPtr(thread_main_callback_type_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline thread_main_callback_type * Get(thread_main_callback_type_buffer *Buf, umm Index) { diff --git a/generated/buffer_tile_ruleset.h b/generated/buffer_tile_ruleset.h index b59cd59c5..70e0c31d6 100644 --- a/generated/buffer_tile_ruleset.h +++ b/generated/buffer_tile_ruleset.h @@ -59,6 +59,12 @@ GetPtr(tile_ruleset_buffer *Buf, umm Index) return Result; } +link_inline tile_ruleset * +TryGetPtr(tile_ruleset_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline tile_ruleset * Get(tile_ruleset_buffer *Buf, umm Index) { diff --git a/generated/buffer_u32.h b/generated/buffer_u32.h index 18deb728b..a6ff5cbfc 100644 --- a/generated/buffer_u32.h +++ b/generated/buffer_u32.h @@ -59,6 +59,12 @@ GetPtr(u32_buffer *Buf, umm Index) return Result; } +link_inline u32 * +TryGetPtr(u32_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline u32 * Get(u32_buffer *Buf, umm Index) { diff --git a/generated/buffer_u64.h b/generated/buffer_u64.h index d3496a2f0..a60ca8b23 100644 --- a/generated/buffer_u64.h +++ b/generated/buffer_u64.h @@ -59,6 +59,12 @@ GetPtr(u64_buffer *Buf, umm Index) return Result; } +link_inline u64 * +TryGetPtr(u64_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline u64 * Get(u64_buffer *Buf, umm Index) { diff --git a/generated/buffer_ui_toggle_button_handle.h b/generated/buffer_ui_toggle_button_handle.h index 78f767053..3d5a181a2 100644 --- a/generated/buffer_ui_toggle_button_handle.h +++ b/generated/buffer_ui_toggle_button_handle.h @@ -59,6 +59,12 @@ GetPtr(ui_toggle_button_handle_buffer *Buf, umm Index) return Result; } +link_inline ui_toggle_button_handle * +TryGetPtr(ui_toggle_button_handle_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline ui_toggle_button_handle * Get(ui_toggle_button_handle_buffer *Buf, umm Index) { diff --git a/generated/buffer_v3i.h b/generated/buffer_v3i.h index 61be3abab..1ae9dba72 100644 --- a/generated/buffer_v3i.h +++ b/generated/buffer_v3i.h @@ -59,6 +59,12 @@ GetPtr(v3i_buffer *Buf, umm Index) return Result; } +link_inline v3i * +TryGetPtr(v3i_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline v3i * Get(v3i_buffer *Buf, umm Index) { diff --git a/generated/buffer_voxel_synth_tile.h b/generated/buffer_voxel_synth_tile.h index 9d9df0ab6..fc401451f 100644 --- a/generated/buffer_voxel_synth_tile.h +++ b/generated/buffer_voxel_synth_tile.h @@ -59,6 +59,12 @@ GetPtr(voxel_synth_tile_buffer *Buf, umm Index) return Result; } +link_inline voxel_synth_tile * +TryGetPtr(voxel_synth_tile_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline voxel_synth_tile * Get(voxel_synth_tile_buffer *Buf, umm Index) { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index cd2b7c3f4..e537b4952 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -59,6 +59,12 @@ GetPtr(world_chunk_ptr_buffer *Buf, umm Index) return Result; } +link_inline world_chunk_ptr * +TryGetPtr(world_chunk_ptr_buffer *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline world_chunk_ptr * Get(world_chunk_ptr_buffer *Buf, umm Index) { diff --git a/generated/cursor_v3i.h b/generated/cursor_v3i.h index 266a19a1c..fa4ca5925 100644 --- a/generated/cursor_v3i.h +++ b/generated/cursor_v3i.h @@ -32,6 +32,12 @@ GetPtr(v3i_cursor *Cursor, umm ElementIndex) return Result; } +link_internal v3i* +TryGetPtr(v3i_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal v3i* GetPtrUnsafe(v3i_cursor *Cursor, umm ElementIndex) { diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index f6b00588a..dd342145f 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1080:0 +// src/engine/editor.h:1071:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index b40348a06..5ddd15078 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:301:0 +// src/engine/editor.cpp:315:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 8c56c3ccb..502431f47 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:470:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 28cc0a794..9d7d8f270 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:448:0 +// src/engine/editor.cpp:462:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index a36937037..ee40fe0d4 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:340:0 +// src/engine/editor.cpp:354:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index bb4ce37e4..e7df65dcc 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:307:0 +// src/engine/editor.cpp:321:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 41aba0565..042e75a9c 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:240:0 +// src/engine/editor.cpp:254:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 873f248b1..38d5323a7 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:365:0 +// src/engine/editor.cpp:379:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 8fc52a5d7..3e53de277 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:146:0 +// src/engine/editor.cpp:160:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 0d59bada2..21a3aaece 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:334:0 +// src/engine/editor.cpp:348:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index dd3848698..797514327 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:389:0 +// src/engine/editor.cpp:403:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 746db3925..6f945929d 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:343:0 +// src/engine/editor.cpp:357:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 1bb084142..e95892b55 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:459:0 +// src/engine/editor.cpp:473:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 2ddd4be47..cc1ecb62d 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:236:0 +// src/engine/editor.cpp:250:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 02ece16f0..c3856638a 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:506:0 +// src/engine/editor.cpp:520:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 0f0ec9182..f86dc511d 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:527:0 +// src/engine/editor.cpp:541:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 487565f8c..21273cbbc 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:524:0 +// src/engine/editor.cpp:538:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 3e0943dc2..8f0bb3398 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:428:0 +// src/engine/editor.cpp:442:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 5b0563f63..ae50fac1a 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:425:0 +// src/engine/editor.cpp:439:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 5deb37016..9d13e4ed3 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:462:0 +// src/engine/editor.cpp:476:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index d9c449fe4..0eb7da9ed 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:413:0 +// src/engine/editor.cpp:427:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index cca9433d1..48a838ebe 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:331:0 +// src/engine/editor.cpp:345:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 591ece0f7..91d6f0220 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:482:0 +// src/engine/editor.cpp:496:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 63aaa31c9..ec77824f7 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:476:0 +// src/engine/editor.cpp:490:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 74f29f0cc..61b2f29fc 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:395:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index bb160fd67..ea9c5458a 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:398:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 89c40be18..a0764cb09 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:497:0 +// src/engine/editor.cpp:511:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 3e384c19f..aedaa98e2 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:521:0 +// src/engine/editor.cpp:535:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index cfb6170fd..25720158b 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:229:0 +// src/engine/editor.cpp:243:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 6990927ad..381ac4225 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:226:0 +// src/engine/editor.cpp:240:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 1701653ef..ace0246df 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:298:0 +// src/engine/editor.cpp:312:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 347b63bc6..d471f4ef2 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:368:0 +// src/engine/editor.cpp:382:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 59d5b5de7..eda8b6309 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:512:0 +// src/engine/editor.cpp:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -371,11 +371,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - cs MemberName = CSz("NextEditOrdinal"); + cs MemberName = CSz("NextLayerIndex"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->NextEditOrdinal), + Cast(u32*, &Element->NextLayerIndex), MemberName, Params ); @@ -396,11 +396,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - cs MemberName = CSz("NextLayerIndex"); + cs MemberName = CSz("Layers"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->NextLayerIndex), + Cast(world_edit_layer_block_array*, &Element->Layers), MemberName, Params ); @@ -413,19 +413,18 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam } - PushNewRow(Ui); - + { - cs MemberName = CSz("Layers"); + cs MemberName = CSz("Edits"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_layer_block_array*, &Element->Layers), + Cast(world_edit_block_array*, &Element->Edits), MemberName, Params ); @@ -445,11 +444,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - cs MemberName = CSz("LoadedBrushes"); + cs MemberName = CSz("CurrentLayer"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_brush_hashtable*, &Element->LoadedBrushes), + Cast(world_edit_layer*, Element->CurrentLayer), MemberName, Params ); @@ -469,11 +468,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - cs MemberName = CSz("CurrentLayer"); + cs MemberName = CSz("HotLayer"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_layer*, Element->CurrentLayer), + Cast(world_edit_layer*, Element->HotLayer), MemberName, Params ); @@ -493,11 +492,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - cs MemberName = CSz("HotLayer"); + cs MemberName = CSz("CurrentEdit"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_layer*, Element->HotLayer), + Cast(world_edit*, Element->CurrentEdit), MemberName, Params ); @@ -517,11 +516,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - cs MemberName = CSz("CurrentEdit"); + cs MemberName = CSz("HotEdit"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit*, Element->CurrentEdit), + Cast(world_edit*, Element->HotEdit), MemberName, Params ); @@ -541,11 +540,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - cs MemberName = CSz("HotEdit"); + cs MemberName = CSz("LoadedBrushes"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit*, Element->HotEdit), + Cast(world_edit_brush_hashtable*, &Element->LoadedBrushes), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 72efb1b15..5e6a5e7fd 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:479:0 +// src/engine/editor.cpp:493:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index fc12dee10..13d6671f0 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:277:0 +// src/engine/editor.cpp:291:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 7ceed840f..1bce48932 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:401:0 +// src/engine/editor.cpp:415:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index a01baa893..be7a33d3c 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:404:0 +// src/engine/editor.cpp:418:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 7278751a3..4b7a581ed 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:128:0 +// src/engine/editor.cpp:142:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index de203041c..34c20b054 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:438:0 +// src/engine/editor.cpp:452:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index a9e68f7c9..51e44320a 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:292:0 +// src/engine/editor.cpp:306:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 61ea0cf4b..73d9287e4 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:295:0 +// src/engine/editor.cpp:309:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 266885763..346c053b6 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:124:0 +// src/engine/editor.cpp:138:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 406546b4f..9026f927d 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:283:0 +// src/engine/editor.cpp:297:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index c03ca8bae..b6d186e1c 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:328:0 +// src/engine/editor.cpp:342:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index c4e0b7262..68617fd2b 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:232:0 +// src/engine/editor.cpp:246:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 1630ecfef..455f1e727 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:286:0 +// src/engine/editor.cpp:300:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 4c932eca3..4f8e5cc04 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:470:0 +// src/engine/editor.cpp:484:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index ac42346ed..7cfa05f7f 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:500:0 +// src/engine/editor.cpp:514:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index f8148b5f4..ce46a99e5 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:280:0 +// src/engine/editor.cpp:294:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index cc964d9c1..76066ab92 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:473:0 +// src/engine/editor.cpp:487:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index a73ec46bd..08ae1d3a0 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:212:0 +// src/engine/editor.cpp:226:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index a2d8481ee..a8772be7a 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:144:0 +// src/engine/editor.cpp:158:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index b42bf97ce..8d05fb3ed 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:488:0 +// src/engine/editor.cpp:502:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 2a196c64e..d0cf23c66 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:491:0 +// src/engine/editor.cpp:505:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index e1098dc79..ff4bb5179 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:485:0 +// src/engine/editor.cpp:499:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 5468b533a..ce751ef9e 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:374:0 +// src/engine/editor.cpp:388:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -81,11 +81,33 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, - cs MemberName = CSz("Ordinal"); + cs MemberName = CSz("Tombstone"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Tombstone), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("LayerIndex"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->Ordinal), + Cast(u32*, &Element->LayerIndex), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index b206fb390..048c39f00 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:371:0 +// src/engine/editor.cpp:385:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 9ec3ad7eb..d03d1bc54 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:494:0 +// src/engine/editor.cpp:508:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 84a5ce2fa..73e7a2419 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:337:0 +// src/engine/editor.cpp:351:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index fdf640294..961a65dcd 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:503:0 +// src/engine/editor.cpp:517:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 209a85bd6..9bd1b81cd 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:152:0 +// src/engine/editor.cpp:166:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 35ffd3ca0..44768f5a2 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:155:0 +// src/engine/editor.cpp:169:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index ac8e2413e..75018fb7f 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:310:0 +// src/engine/editor.cpp:324:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index aad594ca7..f79cea862 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:304:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 9b592e91f..460e5ca19 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:126:0 +// src/engine/editor.cpp:140:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 62465da57..195e73d72 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:392:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 69d672c76..1ef303c50 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:383:0 +// src/engine/editor.cpp:397:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index fa41c9fa8..3b4aaba46 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:386:0 +// src/engine/editor.cpp:400:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 5da1262e5..04e5eafa5 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:122:0 +// src/engine/editor.cpp:136:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index a36db7171..c397da32d 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:223:0 +// src/engine/editor.cpp:237:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 0e2608e06..89e02157f 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:220:0 +// src/engine/editor.cpp:234:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index fc84f06a5..0e449eacc 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:455:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 983246c50..558fab730 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:435:0 +// src/engine/editor.cpp:449:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index 0efe8ba34..c06b1831a 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:377:0 +// src/engine/editor.cpp:391:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 4faaad66b..041c9ab2d 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:136:0 +// src/engine/editor.cpp:150:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index ce3e80042..e7064499c 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:132:0 +// src/engine/editor.cpp:146:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index aa28cfdb9..6f31b20de 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:134:0 +// src/engine/editor.cpp:148:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 78ba37e78..46fc3e02a 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:432:0 +// src/engine/editor.cpp:446:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 387cd6f1e..56699dc90 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:407:0 +// src/engine/editor.cpp:421:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index fb299a7ce..bb9b247d4 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:215:0 +// src/engine/editor.cpp:229:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index e6d1b0ea5..157c22c65 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:209:0 +// src/engine/editor.cpp:223:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index bf2b3476b..0bdb56a9f 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:164:0 +// src/engine/editor.cpp:178:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 8d3f14a7b..ee7ed501b 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:149:0 +// src/engine/editor.cpp:163:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index a690f862c..c48e68bb9 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:467:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 98f34ac0e..7a6a65f39 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:380:0 +// src/engine/editor.cpp:394:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 6b2dfb01c..1a41a4fbc 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:509:0 +// src/engine/editor.cpp:523:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 6e2db4ec3..c2f23f785 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:268:0 +// src/engine/editor.cpp:282:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index dd91ba46a..fcc84cf9b 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:265:0 +// src/engine/editor.cpp:279:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index b059e7e17..9ec9d4bed 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:410:0 +// src/engine/editor.cpp:424:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 37836f0bc..5029c8b4c 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:289:0 +// src/engine/editor.cpp:303:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index fa27a472e..3e1e7be77 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:515:0 +// src/engine/editor.cpp:529:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index b0c09cf11..41d78c215 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:518:0 +// src/engine/editor.cpp:532:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 1e7baa118..6d7d6d1bc 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:142:0 +// src/engine/editor.cpp:156:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 4391f2f20..826fd239f 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:271:0 +// src/engine/editor.cpp:285:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 1eeed0409..e5b6beacb 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:737:0 +// src/engine/editor.h:728:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index c0c806626..6aadb04ae 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:118:0 +// src/engine/editor.cpp:132:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 7952d8c9a..a460c9f30 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:895:0 +// src/engine/editor.h:886:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index c43d2a545..fcdb27515 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1096:0 +// src/engine/editor.h:1087:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index ab347a826..dd2c46b22 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:901:0 +// src/engine/editor.h:892:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 01ca32221..f1b8196ef 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:884:0 +// src/engine/editor.h:875:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 41c139325..66237a55f 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:913:0 +// src/engine/editor.h:904:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 4fb51d646..efa38ab8d 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:906:0 +// src/engine/editor.h:897:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 29a448633..64b84bc32 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:910:0 +// src/engine/editor.h:901:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 0f0183b36..1cb1d56cc 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -222,6 +222,8 @@ + + @@ -741,6 +743,10 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + + @@ -766,3 +772,5 @@ WorkQueueEntryAsyncFunction( draw_lod_async_params *Params ) + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index b2c398d2d..092ba02e4 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -222,6 +222,8 @@ + + @@ -731,6 +733,10 @@ render_to_texture_async_params render_to_texture_async_params; + + + + @@ -747,3 +753,5 @@ draw_lod_async_params draw_lod_async_params; + + diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index abb5d3739..02e344023 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:350:0 +// src/engine/editor.cpp:364:0 @@ -832,6 +832,5 @@ PushToolbar( renderer_2d *Ui, - diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 9e0f11018..85655f799 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -222,6 +222,8 @@ + + @@ -731,6 +733,10 @@ type_render_to_texture_async_params, + + + + @@ -747,3 +753,5 @@ type_draw_lod_async_params, + + diff --git a/generated/generate_cursor_debug_profile_scope.h b/generated/generate_cursor_debug_profile_scope.h index f3179f26b..7b5ae0c55 100644 --- a/generated/generate_cursor_debug_profile_scope.h +++ b/generated/generate_cursor_debug_profile_scope.h @@ -32,6 +32,12 @@ GetPtr(debug_profile_scope_cursor *Cursor, umm ElementIndex) return Result; } +link_internal debug_profile_scope* +TryGetPtr(debug_profile_scope_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal debug_profile_scope* GetPtrUnsafe(debug_profile_scope_cursor *Cursor, umm ElementIndex) { diff --git a/generated/generate_cursor_functions_c_token_cursor.h b/generated/generate_cursor_functions_c_token_cursor.h index f71bf2664..0efdf1d9d 100644 --- a/generated/generate_cursor_functions_c_token_cursor.h +++ b/generated/generate_cursor_functions_c_token_cursor.h @@ -22,6 +22,12 @@ GetPtr(c_token_cursor *Cursor, umm ElementIndex) return Result; } +link_internal c_token* +TryGetPtr(c_token_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal c_token* GetPtrUnsafe(c_token_cursor *Cursor, umm ElementIndex) { diff --git a/generated/generate_cursor_functions_u64.h b/generated/generate_cursor_functions_u64.h index 495eea4cd..9abee6807 100644 --- a/generated/generate_cursor_functions_u64.h +++ b/generated/generate_cursor_functions_u64.h @@ -22,6 +22,12 @@ GetPtr(u64_cursor *Cursor, umm ElementIndex) return Result; } +link_internal u64* +TryGetPtr(u64_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal u64* GetPtrUnsafe(u64_cursor *Cursor, umm ElementIndex) { diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index a805eac9e..d94dd13d1 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -32,6 +32,12 @@ GetPtr(octree_node_ptr_cursor *Cursor, umm ElementIndex) return Result; } +link_internal octree_node_ptr* +TryGetPtr(octree_node_ptr_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal octree_node_ptr* GetPtrUnsafe(octree_node_ptr_cursor *Cursor, umm ElementIndex) { diff --git a/generated/generate_cursor_parser.h b/generated/generate_cursor_parser.h index 76c0366de..35a1d3743 100644 --- a/generated/generate_cursor_parser.h +++ b/generated/generate_cursor_parser.h @@ -32,6 +32,12 @@ GetPtr(parser_cursor *Cursor, umm ElementIndex) return Result; } +link_internal parser* +TryGetPtr(parser_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal parser* GetPtrUnsafe(parser_cursor *Cursor, umm ElementIndex) { diff --git a/generated/generate_cursor_texture.h b/generated/generate_cursor_texture.h index c2f45e9eb..394ee1304 100644 --- a/generated/generate_cursor_texture.h +++ b/generated/generate_cursor_texture.h @@ -32,6 +32,12 @@ GetPtr(texture_cursor *Cursor, umm ElementIndex) return Result; } +link_internal texture* +TryGetPtr(texture_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal texture* GetPtrUnsafe(texture_cursor *Cursor, umm ElementIndex) { diff --git a/generated/generate_cursor_u8.h b/generated/generate_cursor_u8.h index 2fa8aaaab..8695ab9f8 100644 --- a/generated/generate_cursor_u8.h +++ b/generated/generate_cursor_u8.h @@ -32,6 +32,12 @@ GetPtr(u8_cursor *Cursor, umm ElementIndex) return Result; } +link_internal u8* +TryGetPtr(u8_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal u8* GetPtrUnsafe(u8_cursor *Cursor, umm ElementIndex) { diff --git a/generated/generate_cursor_v3.h b/generated/generate_cursor_v3.h index 2c0a8fa0b..b1fa3a4a1 100644 --- a/generated/generate_cursor_v3.h +++ b/generated/generate_cursor_v3.h @@ -32,6 +32,12 @@ GetPtr(v3_cursor *Cursor, umm ElementIndex) return Result; } +link_internal v3* +TryGetPtr(v3_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal v3* GetPtrUnsafe(v3_cursor *Cursor, umm ElementIndex) { diff --git a/generated/generate_cursor_voxel_stack_element.h b/generated/generate_cursor_voxel_stack_element.h index d310fe7d6..df9612a90 100644 --- a/generated/generate_cursor_voxel_stack_element.h +++ b/generated/generate_cursor_voxel_stack_element.h @@ -32,6 +32,12 @@ GetPtr(voxel_stack_element_cursor *Cursor, umm ElementIndex) return Result; } +link_internal voxel_stack_element* +TryGetPtr(voxel_stack_element_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal voxel_stack_element* GetPtrUnsafe(voxel_stack_element_cursor *Cursor, umm ElementIndex) { diff --git a/generated/hashtable_bonsai_type_info.h b/generated/hashtable_bonsai_type_info.h index ddb374649..42df0c890 100644 --- a/generated/hashtable_bonsai_type_info.h +++ b/generated/hashtable_bonsai_type_info.h @@ -178,4 +178,10 @@ GetPtr(bonsai_type_info_hashtable *Hashtable, bonsai_type_info_hashtable_iterato } return Result; } + +link_inline bonsai_type_info * +TryGetPtr(bonsai_type_info_hashtable *Hashtable, bonsai_type_info_hashtable_iterator Iterator) +{ + return GetPtr(Hashtable, Iterator); +} diff --git a/generated/hashtable_counted_string.h b/generated/hashtable_counted_string.h index 9b98489ea..1c14dcf81 100644 --- a/generated/hashtable_counted_string.h +++ b/generated/hashtable_counted_string.h @@ -178,4 +178,10 @@ GetPtr(counted_string_hashtable *Hashtable, counted_string_hashtable_iterator It } return Result; } + +link_inline counted_string * +TryGetPtr(counted_string_hashtable *Hashtable, counted_string_hashtable_iterator Iterator) +{ + return GetPtr(Hashtable, Iterator); +} diff --git a/generated/hashtable_impl_ui_toggle.h b/generated/hashtable_impl_ui_toggle.h index 8ae253571..89ed2a8d5 100644 --- a/generated/hashtable_impl_ui_toggle.h +++ b/generated/hashtable_impl_ui_toggle.h @@ -166,3 +166,9 @@ GetPtr(ui_toggle_hashtable *Hashtable, ui_toggle_hashtable_iterator Iterator) return Result; } +link_inline ui_toggle * +TryGetPtr(ui_toggle_hashtable *Hashtable, ui_toggle_hashtable_iterator Iterator) +{ + return GetPtr(Hashtable, Iterator); +} + diff --git a/generated/hashtable_impl_window_layout.h b/generated/hashtable_impl_window_layout.h index 7b613fdc7..eb317ece4 100644 --- a/generated/hashtable_impl_window_layout.h +++ b/generated/hashtable_impl_window_layout.h @@ -166,3 +166,9 @@ GetPtr(window_layout_hashtable *Hashtable, window_layout_hashtable_iterator Iter return Result; } +link_inline window_layout * +TryGetPtr(window_layout_hashtable *Hashtable, window_layout_hashtable_iterator Iterator) +{ + return GetPtr(Hashtable, Iterator); +} + diff --git a/generated/hashtable_impl_xml_tag.h b/generated/hashtable_impl_xml_tag.h index c66a062f6..fec9287ab 100644 --- a/generated/hashtable_impl_xml_tag.h +++ b/generated/hashtable_impl_xml_tag.h @@ -166,3 +166,9 @@ GetPtr(xml_tag_hashtable *Hashtable, xml_tag_hashtable_iterator Iterator) return Result; } +link_inline xml_tag * +TryGetPtr(xml_tag_hashtable *Hashtable, xml_tag_hashtable_iterator Iterator) +{ + return GetPtr(Hashtable, Iterator); +} + diff --git a/generated/hashtable_parser.h b/generated/hashtable_parser.h index 674b4884a..4ee75d839 100644 --- a/generated/hashtable_parser.h +++ b/generated/hashtable_parser.h @@ -178,4 +178,10 @@ GetPtr(parser_hashtable *Hashtable, parser_hashtable_iterator Iterator) } return Result; } + +link_inline parser * +TryGetPtr(parser_hashtable *Hashtable, parser_hashtable_iterator Iterator) +{ + return GetPtr(Hashtable, Iterator); +} diff --git a/generated/hashtable_voxel_synth_tile.h b/generated/hashtable_voxel_synth_tile.h index ee2701b54..4fff2062e 100644 --- a/generated/hashtable_voxel_synth_tile.h +++ b/generated/hashtable_voxel_synth_tile.h @@ -178,4 +178,10 @@ GetPtr(voxel_synth_tile_hashtable *Hashtable, voxel_synth_tile_hashtable_iterato } return Result; } + +link_inline voxel_synth_tile * +TryGetPtr(voxel_synth_tile_hashtable *Hashtable, voxel_synth_tile_hashtable_iterator Iterator) +{ + return GetPtr(Hashtable, Iterator); +} diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 2e1d6d8f7..73d278a7a 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1240:0 +// src/engine/editor.h:1231:0 struct world_edit_brush_linked_list_node { @@ -178,4 +178,10 @@ GetPtr(world_edit_brush_hashtable *Hashtable, world_edit_brush_hashtable_iterato } return Result; } + +link_inline world_edit_brush * +TryGetPtr(world_edit_brush_hashtable *Hashtable, world_edit_brush_hashtable_iterator Iterator) +{ + return GetPtr(Hashtable, Iterator); +} diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index ccb12e3c8..8f2e8c708 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:735:0 +// src/engine/editor.h:726:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/scalar_math_fuctions_451039071.h b/generated/scalar_math_fuctions_451039071.h index ac324e680..935a23f76 100644 --- a/generated/scalar_math_fuctions_451039071.h +++ b/generated/scalar_math_fuctions_451039071.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/maff.h:372:0 +// external/bonsai_stdlib/src/maff.h:379:0 inline r32 Clamp( r32 Min, r32 Value, r32 Max ) diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index ad1403b23..7144b5951 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -46,7 +46,14 @@ Serialize(u8_cursor_block_array *Bytes, world_edit *BaseElement, umm Count = 1) - Result &= Serialize(Bytes, &Element->Ordinal); // default + Result &= Serialize(Bytes, &Element->Tombstone); // default + + + + + + + Result &= Serialize(Bytes, &Element->LayerIndex); // default if (Element->Brush) { Result &= Serialize(Bytes, Element->Brush); } @@ -88,7 +95,15 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit *Element, memory_arena *M // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Ordinal, Memory); + Result &= Deserialize(Bytes, &Element->Tombstone, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->LayerIndex, Memory); if (HadBrushPointer) { diff --git a/generated/staticbuffer_u32_cursor_ptr_961996651.h b/generated/staticbuffer_u32_cursor_ptr_961996651.h index 28798f610..095ae9755 100644 --- a/generated/staticbuffer_u32_cursor_ptr_961996651.h +++ b/generated/staticbuffer_u32_cursor_ptr_961996651.h @@ -16,6 +16,12 @@ GetPtr( entropy_lists *Buf, umm Index) return Result; } +link_inline u32_cursor* +TryGetPtr( entropy_lists *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline u32_cursor Get( entropy_lists *Buf, umm Index) { diff --git a/generated/stream_and_cursor_counted_string.h b/generated/stream_and_cursor_counted_string.h index 1a657f8fd..e96778037 100644 --- a/generated/stream_and_cursor_counted_string.h +++ b/generated/stream_and_cursor_counted_string.h @@ -32,6 +32,12 @@ GetPtr(counted_string_cursor *Cursor, umm ElementIndex) return Result; } +link_internal counted_string* +TryGetPtr(counted_string_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal counted_string* GetPtrUnsafe(counted_string_cursor *Cursor, umm ElementIndex) { diff --git a/generated/stream_and_cursor_s32.h b/generated/stream_and_cursor_s32.h index 5346b0e1b..4243376df 100644 --- a/generated/stream_and_cursor_s32.h +++ b/generated/stream_and_cursor_s32.h @@ -32,6 +32,12 @@ GetPtr(s32_cursor *Cursor, umm ElementIndex) return Result; } +link_internal s32* +TryGetPtr(s32_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal s32* GetPtrUnsafe(s32_cursor *Cursor, umm ElementIndex) { diff --git a/generated/stream_and_cursor_u32.h b/generated/stream_and_cursor_u32.h index 6089546d8..f6064a859 100644 --- a/generated/stream_and_cursor_u32.h +++ b/generated/stream_and_cursor_u32.h @@ -32,6 +32,12 @@ GetPtr(u32_cursor *Cursor, umm ElementIndex) return Result; } +link_internal u32* +TryGetPtr(u32_cursor *Cursor, umm ElementIndex) +{ + return GetPtr(Cursor, ElementIndex); +} + link_internal u32* GetPtrUnsafe(u32_cursor *Cursor, umm ElementIndex) { diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 99ba8e3c4..02850bba1 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:451:0 +// src/engine/editor.cpp:465:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index e63d445a5..574db20ce 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:261:0 +// src/engine/editor.cpp:275:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 2cabdde9c..ca644e95c 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1094:0 +// src/engine/editor.h:1085:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index be291a53e..bc9fa0a89 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:255:0 +// src/engine/editor.cpp:269:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 425602ac1..405eaa435 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:252:0 +// src/engine/editor.cpp:266:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 843962e58..4b5537070 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1036:0 +// src/engine/editor.h:1027:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index b4291f2f5..3b65d729c 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:258:0 +// src/engine/editor.cpp:272:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index ce9e684ea..0308026d8 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:733:0 +// src/engine/editor.h:724:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index 4ba0fed92..f76dc3ff2 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:116:0 +// src/engine/editor.cpp:130:0 link_internal counted_string ToStringPrefixless(visible_region_size Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 4c4f27fc9..a4de3a880 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:898:0 +// src/engine/editor.h:889:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 45d3d29c4..2c22f005a 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:881:0 +// src/engine/editor.h:872:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index d43945934..fa6073010 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:904:0 +// src/engine/editor.h:895:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 499736524..446fff411 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:767:0 +// src/engine/editor.h:758:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/tiered_mesh_freelist.h b/generated/tiered_mesh_freelist.h index 817241870..bfe6c128c 100644 --- a/generated/tiered_mesh_freelist.h +++ b/generated/tiered_mesh_freelist.h @@ -16,6 +16,12 @@ GetPtr( tiered_mesh_freelist *Buf, umm Index) return Result; } +link_inline mesh_freelist* +TryGetPtr( tiered_mesh_freelist *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + link_inline mesh_freelist Get( tiered_mesh_freelist *Buf, umm Index) { diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 52c7dbdc7..a0c43710c 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:890:0 +// src/engine/editor.h:881:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 92f1ba4067f01712063604eb95754f6b700ab9c7..8d62211149cc61015436f9d8c8016ac66f755351 100644 GIT binary patch delta 244 zcmdnfz&O2$ae@cyZ3YGg*U1Mh%{DftSxt84)|~u6l4bH4E0M`r)*+K8Noa~Dl_n+S zq{bKL7nQ`DS(up{SQr=?O`ag3IC+7HG&@LGFT;0op{130YD#8Fd`@CzY7tPOg}Je* zg@ut`M!;l60j-G#ghU}SCHeU|Nr^@AiOD6I`FX{Y53*}do@pth4Az{Klb@U&pIB6s zSQ($0my%k6Y!Kt*{nnxH<)_HZyTFajM8!k!=^RgdvHE ku~8s4!{#vC*-YFZCI~Y!GEO#hP@k;i@RkQG4N?LG04xS30ssI2 diff --git a/jesse.make.sh b/jesse.make.sh index 77e15a5d4..384beb04f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 @@ -12,9 +12,9 @@ OPT="-O2" ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ BuildExecutables \ + # BuildTests \ # BuildSingleExample examples/ui_test \ # BuildSingleExample examples/blank_project \ - # BuildTests \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ diff --git a/jesse.tests.rdbg b/jesse.tests.rdbg index 036c05c6e6f2cecbe9c322dda274fefcc0041aa3..6704338543e3bfe23dbcdd6da2a44f3d5c3962ed 100644 GIT binary patch delta 1145 zcmYjROK%fb810Sid3hcl$Br!mIDmM>fuSViWh%!puTqGV4GY>z>BPRtj5>ZWGmc<` z!h#J#0&~OyiHb$Uwo=^^Fg0m8m+{J+Lnk*vmih@hF%yS# zIdT%+bTQuYT0VX-4xu9K6PO)X4o;1nCo}Bpcxv5l&=tD2Mr&bU)!J>m%FbXbQ4$+8 za4ct*2cexc$#i7RW({&Cvi`|rS!@w^GfAvu=215atiz}rgg&(!mQ!YPSy&d5@&>Ej z@-62$&+FB_v^%Sgd&6U73U=l=##9-L`UJ*?B~)3~YBL z2*V}t>(l6h8ejGahWHZu62 zpT)2GWOtKSQt*>L_b?{H(u|-6Lq@US?>uyDuoV{rQV~Y zoYWbFY5c3mm{dymPB4a?3lS;XLLTqsWjvEB3`Zm>p2%|FRyywY9hWyb#ha);4O$() z#>uWk`Al$ZOA7ghd2{GWS#-1lE~^U8Ng3AkBwvZdx@S4jl!_e$H01RzeolWZnz#@v zO0@1qdxHmQre5ScOqSs(+R&hx(gVg<_keJPl-O7kFoZN);tJ!tf`f@g@@=2*kMU_z z>pMHK0-nVS12x!zyt^jsUJas-4AzTnQ!?7pc1+@Pp&b+BeKy39`o8Tp`=kqP>U+$6 zkv+`y!Tq5st_`VdqLOr@;c?V6>^^I?mgm`Z+iTf%>f^d*;Sm`|HpNvHE`~N=;asyBDWtkuEc`k2}-`?eCV+wbpj5zGQC-C*&-=)Z9 G$NvGaGh`S5 delta 1057 zcmYjQOKTHR6z-i#X67c-Jeo8QTiVhpwxJG9YxG_wd_(>LHaod-9)jArS{M7(C(M%l1yM%i?*}I{UM}vB3U3MHVZz>VS%i*TjS774l9*f z*|asX-pR39^(^mDBYS?Kh_+cUnk*oWL}^$%4ND_StU96w;6);Vme^d`G50);=yY8U zF45{uzU@gQDpEX2z2ONn&0}oTS2fCOwVKP)UcN_N^xf)XnlScIc%L<&} zY;P3JpJO~x6KIatH$_Qx533$AU5nyd>ZlOfnxEFC@ zO5w|hGcJVF@GF?ZyS1uoP#N@gYXTrN2iu`2{KhN)(ewpVnsA9zM$=s_KPVWjP<{&VScy~oKI0dBu_WIaRJ|g#Py}%^_0}D$VtLj9&6$HCNn(Qd{@juj?o?Km(M*R@RUoTfaLqn^hMq>ALvKEPG@4Yqs&>q1nJpem m*>Graphics.NoiseReadbackJobs) == 0); HardResetWorld(Resources); - IterateOver(&Resources->Editor.Layers, Layer, LayerIndex) - { - ApplyEditBufferToOctree(Resources, &Layer->Edits); - } + ApplyEditBufferToOctree(Resources, &Resources->Editor.Edits); /* HardResetEditor(&Resources->Editor); */ UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); diff --git a/src/engine/debug_draw.cpp b/src/engine/debug_draw.cpp index b7abd229f..ebca0e1e6 100644 --- a/src/engine/debug_draw.cpp +++ b/src/engine/debug_draw.cpp @@ -196,7 +196,7 @@ DEBUG_DrawAABB(untextured_3d_geometry_buffer *Mesh, v3 MinP, v3 MaxP, v3 RGBColo // Top #define LINES_PER_AABB (12) #define VERTS_PER_AABB (VERTS_PER_VOXEL*LINES_PER_AABB) -#if 0 +#if 1 DEBUG_DrawLine_Aligned(Mesh, TopRL, TopRR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); DEBUG_DrawLine_Aligned(Mesh, TopFL, TopFR, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); DEBUG_DrawLine_Aligned(Mesh, TopFL, TopRL, RGBColor, Thickness * GLOBAL_RENDER_SCALE_FACTOR); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 3a648bcfd..b828e8e60 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -18,27 +18,39 @@ LoadBrushFromFile(level_editor *Editor, file_traversal_node *FileNode, memory_ar FinalizeDeserialization(&Bytes); } -link_internal world_edit* -NewEdit(world_edit_layer *Layer) +link_internal world_edit * +NewEdit(level_editor *Editor, world_edit_layer *Layer) { + world_edit_block_array_index Index = {}; world_edit *Result = {}; - IterateOver(&Layer->Edits, Edit, EditIndex) + IterateOver(&Editor->Edits, Edit, EditIndex) { - if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) + if (Edit->Tombstone) { + Edit->Tombstone = False; Result = Edit; + Index = EditIndex; } } - if (Result == 0) Result = Push(&Layer->Edits); + + + if (Result == 0) + { + Result = Push(&Editor->Edits); + Index = LastIndex(&Editor->Edits); + } + + Push(&Layer->EditIndices, &Index); + return Result; } link_internal world_edit_layer* NewLayer(level_editor *Editor) { - auto Result = Push(&Editor->Layers); - Result->Edits = WorldEditBlockArray(Editor->Memory); + auto Result = Push(&Editor->Layers); + Result->EditIndices = WorldEditBlockArrayIndexBlockArray(Editor->Memory); cs DefaultName = FSz("layer_%d", Editor->NextLayerIndex++); CopyString(DefaultName.Start, Result->NameBuf, DefaultName.Count); @@ -68,6 +80,8 @@ InitEditor(level_editor *Editor) LoadBrushFromFile(Editor, Node, GetTranArena()); } + Editor->Edits.Memory = Editor->Memory; + /* RangeIterator(LayerIndex, MAX_BRUSH_LAYERS) */ /* { */ /* Editor->LayeredBrush.LayerPreviews[LayerIndex].Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); */ @@ -1394,7 +1408,7 @@ EditWorldSelection(engine_resources *Engine) /* r32 InsetWidth = 0.25f; */ r32 InsetWidth = 0.f; v3 HiColor = RGB_GREEN; - r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS; + r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS*2.5f; HighlightFace(Engine, Face, SelectionAABB, InsetWidth, HiColor, HiThickness); @@ -1642,7 +1656,7 @@ link_internal void ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *TempMemory) { UNPACK_ENGINE_RESOURCES(Engine); - Assert(Edit->Ordinal != EDIT_ORDINAL_TOMBSTONE); + Assert(Edit->Tombstone == False); Info("Updating Edit(%p)", Edit); @@ -1680,7 +1694,7 @@ ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Temp Node->Edits = WorldEditPtrBlockArray(Editor->Memory); } - Push(&Node->Edits, &Edit); + Push(&Node->Edits, Edit); /* Assert(Node->Type == OctreeNodeType_Leaf); */ @@ -1694,7 +1708,7 @@ link_internal void DropEditFromOctree(engine_resources *Engine, world_edit *Edit, memory_arena *TempMemory) { UNPACK_ENGINE_RESOURCES(Engine); - Assert(Edit->Ordinal != EDIT_ORDINAL_TOMBSTONE); + Assert(Edit->Tombstone == False); octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Edit->Region, &Nodes); @@ -1717,7 +1731,7 @@ link_internal void UpdateWorldEditBounds(engine_resources *Engine, world_edit *Edit, rect3cp Region, memory_arena *TempMemory) { UNPACK_ENGINE_RESOURCES(Engine); - Assert(Edit->Ordinal != EDIT_ORDINAL_TOMBSTONE); + Assert(Edit->Tombstone == False); DropEditFromOctree(Engine, Edit, TempMemory); @@ -1726,20 +1740,17 @@ UpdateWorldEditBounds(engine_resources *Engine, world_edit *Edit, rect3cp Region ApplyEditToOctree(Engine, Edit, TempMemory); } +#if 0 link_internal void -IncrementAllEditOrdinalsAbove(world_edit_layer_block_array *Layers, u32 Ordinal) +IncrementAllEditOrdinalsAbove(world_edit_block_array *Edits, u32 Ordinal) { - IterateOver(Layers, Layer, LayerIndex) + IterateOver(Edits, Edit, EditIndex) { - IterateOver(&Layer->Edits, Edit, EditIndex) + if (Edit->Ordinal >= Ordinal) { - if (Edit->Ordinal >= Ordinal) - { - if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } - - ++Edit->Ordinal; - } + if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + ++Edit->Ordinal; } } } @@ -1762,6 +1773,7 @@ GetEditsSortedByOrdianl(world_edit_block_array *Edits, memory_arena *TempMem) return {EditCount, Keys}; } +#endif link_internal void DoWorldEditor(engine_resources *Engine) @@ -1963,17 +1975,18 @@ DoWorldEditor(engine_resources *Engine) if (Input->Ctrl.Pressed && Input->S.Clicked) { - if (Editor->CurrentLayer) + if (Editor->CurrentLayer == 0) { - Editor->PreviousTool = Editor->Tool; - Editor->Tool = WorldEdit_Tool_Select; - ResetSelection(Editor); + NewLayer(Editor); + } - Editor->CurrentEdit = Push(&Editor->CurrentLayer->Edits); - Editor->CurrentEdit->Ordinal = Editor->NextEditOrdinal++; + Editor->PreviousTool = Editor->Tool; + Editor->Tool = WorldEdit_Tool_Select; + ResetSelection(Editor); - Editor->CurrentEdit->Brush = Editor->CurrentBrush; - } + Editor->CurrentEdit = NewEdit(Editor, Editor->CurrentLayer); + + Editor->CurrentEdit->Brush = Editor->CurrentBrush; } #if 0 @@ -2051,18 +2064,15 @@ DoWorldEditor(engine_resources *Engine) b32 SettingsChanged = CheckSettingsChanged(&Editor->CurrentBrush->Layered); if (SettingsChanged) { - IterateOver(&Editor->Layers, Layer, LayerIndex) + IterateOver(&Editor->Edits, Edit, EditIndex) { - IterateOver(&Layer->Edits, Edit, EditIndex) - { - if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + if (Edit->Tombstone) { continue; } - if (Edit->Brush == Editor->CurrentBrush) - { - // TODO(Jesse): We should be able to just mark the overlapping - // nodes dirty because we're not actually updating the edit bounds here.. - UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); - } + if (Edit->Brush == Editor->CurrentBrush) + { + // TODO(Jesse): We should be able to just mark the overlapping + // nodes dirty because we're not actually updating the edit bounds here.. + UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); } } } @@ -2084,6 +2094,9 @@ DoWorldEditor(engine_resources *Engine) PushNewRow(Ui); PushTableStart(Ui); + + world_edit_layer *PrevLayer = {}; + IterateOver(&Editor->Layers, Layer, LayerIndex) { cs Name = CS(Layer->NameBuf); @@ -2114,13 +2127,12 @@ DoWorldEditor(engine_resources *Engine) auto SrcLayer = Layer; auto DstLayer = NewLayer(Editor); - IterateOver(&SrcLayer->Edits, Edit, EditIndex) + IterateOver(&SrcLayer->EditIndices, EditIndex, EditIndexIndex) { - if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); - auto *Duplicated = NewEdit(DstLayer); + auto *Duplicated = NewEdit(Editor, DstLayer); *Duplicated = *Edit; - Duplicated->Ordinal = Editor->NextEditOrdinal++; ApplyEditToOctree(Engine, Duplicated, GetTranArena()); @@ -2133,11 +2145,13 @@ DoWorldEditor(engine_resources *Engine) case LayerToolbarActions_Delete: { - IterateOver(&Layer->Edits, Edit, EditIndex) + IterateOver(&Layer->EditIndices, EditIndex, EditIndexIndex) { - if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); + Assert(Edit->Tombstone == False); DropEditFromOctree(Engine, Edit, GetTranArena()); + Edit->Tombstone = False; } RemoveOrdered(&Editor->Layers, Layer); Editor->CurrentLayer = 0; @@ -2148,21 +2162,22 @@ DoWorldEditor(engine_resources *Engine) } PushTableEnd(Ui); - auto I = AtElements(&Layer->Edits); - if (GetIndex(&I) == 0) { - PushColumn(Ui, CSz("--- no edits ---")); - PushNewRow(Ui); + auto I = AtElements(&Layer->EditIndices); + if (GetIndex(&I) == 0) + { + PushColumn(Ui, CSz("--- no edits ---")); + PushNewRow(Ui); + } } PushTableStart(Ui); { - - sort_key_buffer Keys = GetEditsSortedByOrdianl(&Layer->Edits, GetTranArena()); - IterateOver(&Keys, Key, KeyIndex) + world_edit_block_array_index *PrevEditIndex = {}; + IterateOver(&Layer->EditIndices, EditIndex, EditIndexIndex) { - world_edit *Edit = Cast(world_edit*, Key->Index); - if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); + Assert(Edit->Tombstone == False); const char *NameBuf = Edit->Brush ? Edit->Brush->NameBuf : "no brush"; @@ -2173,7 +2188,61 @@ DoWorldEditor(engine_resources *Engine) } ui_reorder_action EditReorderAction = {}; - PushToolbar(Ui, &LayersWindow, {}, &EditReorderAction, u64(Edit), &DefaultUiRenderParams_Toolbar, ToggleButtonGroupFlags_NoNewRow); + PushToolbar(Ui, &LayersWindow, {}, &EditReorderAction, u64(Edit)^u64(Layer), &DefaultUiRenderParams_Toolbar, ToggleButtonGroupFlags_NoNewRow); + + switch(EditReorderAction) + { + case UiReorderAction_NoAction: break; + + case UiReorderAction_ReorderUp: + { + if (PrevEditIndex) + { + auto Tmp = *PrevEditIndex; + *PrevEditIndex = *EditIndex; + *EditIndex = Tmp; + } + else if (PrevLayer) + { + Push(&PrevLayer->EditIndices, EditIndex); + RemoveOrdered(&Layer->EditIndices, EditIndex); + } + + } break; + + case UiReorderAction_ReorderDown: + { + auto NextEditIndexIndex = EditIndexIndex; + ++NextEditIndexIndex; + + if (NextEditIndexIndex < AtElements(&Layer->EditIndices)) + { + auto NextEditIndex = GetPtr(&Layer->EditIndices, NextEditIndexIndex); + + auto Tmp = *NextEditIndex; + *NextEditIndex = *EditIndex; + *EditIndex = Tmp; + + EditIndexIndex = AtElements(&Layer->EditIndices); + } + else + { + auto NextLayerIndex = LayerIndex; + ++NextLayerIndex; + + auto NextLayer = TryGetPtr(&Editor->Layers, GetIndex(&NextLayerIndex)); + if (NextLayer) + { + RemoveOrdered(&Layer->EditIndices, EditIndex); + Shift(&NextLayer->EditIndices, EditIndex); + } + + EditIndexIndex = AtElements(&Layer->EditIndices); + } + } + + break; + } /* auto EditSelectButton = PushSimpleButton(Ui, FSz("(%d)(%d) (%s)", KeyIndex, Key->Value, NameBuf), UiId(&LayersWindow, "edit select", Edit), &Params); */ auto EditSelectButton = PushSimpleButton(Ui, FSz("(%s)", NameBuf), UiId(&LayersWindow, "edit select", Edit), &Params); @@ -2212,11 +2281,11 @@ DoWorldEditor(engine_resources *Engine) case UiLayerEditAction_Duplicate: { - IncrementAllEditOrdinalsAbove(&Editor->Layers, Edit->Ordinal+1); + /* IncrementAllEditOrdinalsAbove(&Editor->Layers, Edit->Ordinal+1); */ - auto *Duplicated = NewEdit(Layer); + auto *Duplicated = NewEdit(Editor, Layer); *Duplicated = *Edit; - ++Duplicated->Ordinal; + /* ++Duplicated->Ordinal; */ ApplyEditToOctree(Engine, Duplicated, GetTranArena()); Editor->CurrentEdit = Duplicated; @@ -2230,13 +2299,18 @@ DoWorldEditor(engine_resources *Engine) } DropEditFromOctree(Engine, Edit, GetTranArena()); - Edit->Ordinal = EDIT_ORDINAL_TOMBSTONE; + RemoveOrdered(&Layer->EditIndices, EditIndex); + Edit->Tombstone = True; } break; } + + PrevEditIndex = EditIndex; } } PushTableEnd(Ui); PushNewRow(Ui); + + PrevLayer = Layer; } PushNewRow(Ui); @@ -2274,9 +2348,10 @@ DoWorldEditor(engine_resources *Engine) { IterateOver(&Editor->Layers, Layer, LayerIndex) { - IterateOver(&Layer->Edits, Edit, BrushIndex) + IterateOver(&Layer->EditIndices, EditIndex, EditIndexIndex) { - if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); + Assert(Edit->Tombstone == False); auto EditAABB = GetSimSpaceAABB(World, Edit->Region); random_series S = {u64(Edit)}; @@ -2284,7 +2359,6 @@ DoWorldEditor(engine_resources *Engine) f32 Size = EDITOR_DEFAULT_SELECTION_THICKNESS; - // Always highlight the hot edit if (Edit == Editor->HotEdit) { @@ -2314,7 +2388,7 @@ ApplyEditBufferToOctree(engine_resources *Engine, world_edit_paged_list *Edits) { IterateOver(Edits, Edit, EditIndex) { - if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } + if (Edit->Tombstone) { continue; } ApplyEditToOctree(Engine, Edit, GetTranArena()); } } @@ -2369,9 +2443,10 @@ DoLevelWindow(engine_resources *Engine) u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; Ensure(Serialize(&OutputStream, &Delimeter)); +#if 0 IterateOver(&Editor->Layers, Layer, LayerIndex) { - u32 EditCount = u32(TotalElements(&Layer->Edits)); + u32 EditCount = u32(TotalElements(&Layer->EditIndices)); Serialize(&OutputStream, &EditCount); IterateOver(&Layer->Edits, Edit, EditIndex) { @@ -2379,6 +2454,9 @@ DoLevelWindow(engine_resources *Engine) Serialize(&OutputStream, Edit); } } +#else + NotImplemented; +#endif Ensure(Serialize(&OutputStream, &Delimeter)); diff --git a/src/engine/editor.h b/src/engine/editor.h index 40d48ffeb..36d3bbd73 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -714,15 +714,6 @@ struct selection_modification_state v3 ClickedP[2]; }; -enum level_editor_flags -{ - LevelEditorFlags_Noop = (1 << 0), - /* LevelEditorFlags_RecomputeStandingSpotsOnLevelLoad = (1 << 1), */ -}; - -poof(radio_button_group_for_enum(level_editor_flags)); -#include - enum ui_noise_type { NoiseType_Perlin, @@ -1240,12 +1231,16 @@ poof(are_equal(world_edit_brush)) poof(hashtable(world_edit_brush)) #include -#define EDIT_ORDINAL_TOMBSTONE (u32_MAX) struct world_edit { rect3cp Region; // TODO(Jesse): Rename to bounds world_edit_brush *Brush; - u32 Ordinal; // monotonically increasing integer sourced from level_editor::NextEditOrdinal + + // Instance params + + b32 Tombstone; + u32 LayerIndex; + /* u32 Ordinal; // monotonically increasing integer sourced from level_editor::NextEditOrdinal */ }; typedef world_edit* world_edit_ptr; @@ -1256,10 +1251,16 @@ poof(block_array(world_edit, {128})) poof(block_array(world_edit_ptr, {128})) #include +poof(block_array(world_edit_block_array_index, {128})) +#include + struct world_edit_layer { char NameBuf[NameBuf_Len+1]; - world_edit_block_array Edits; + + // NOTE(Jesse): type name is confusing here .. this is an array of indices into + // the world_edit block array + world_edit_block_array_index_block_array EditIndices; }; poof(block_array(world_edit_layer, {128})) #include @@ -1294,11 +1295,13 @@ struct level_editor b32 MaskSelection; - u32 NextEditOrdinal; + /* u32 NextEditOrdinal; */ u32 NextLayerIndex; + + world_edit_layer_block_array Layers; - world_edit_brush_hashtable LoadedBrushes; + world_edit_block_array Edits; world_edit_layer *CurrentLayer; world_edit_layer *HotLayer; @@ -1306,7 +1309,8 @@ struct level_editor world_edit *CurrentEdit; world_edit *HotEdit; - world_edit_brush *CurrentBrush; + world_edit_brush_hashtable LoadedBrushes; + world_edit_brush *CurrentBrush; }; diff --git a/src/engine/entity.cpp b/src/engine/entity.cpp index 07a956f89..ea83c1e52 100644 --- a/src/engine/entity.cpp +++ b/src/engine/entity.cpp @@ -1721,7 +1721,7 @@ InsertEntityIntoChunks(world *World, entity *Entity, memory_arena *TempMemory) world_chunk *Chunk = Chunks.Start[ChunkIndex]; /* Info("Attempting to insert Entity(%p) into Chunk(%p)", Entity, Chunk); */ - Push(&Chunk->Entities, &Entity); + Push(&Chunk->Entities, Entity); } } } diff --git a/src/engine/loaders/vox.cpp b/src/engine/loaders/vox.cpp index 1cd1ff0e7..e0fc78332 100644 --- a/src/engine/loaders/vox.cpp +++ b/src/engine/loaders/vox.cpp @@ -192,7 +192,7 @@ global_variable random_series TMP = {54235432543}; link_internal vox_data_block_array LoadVoxData(v3_cursor *ColorPalette, memory_arena *TempMemory, memory_arena *PermMemory, heap_allocator *Heap, const char *filepath, vox_loader_clip_behavior ClipBehavior, v3i HalfApronMin = {}, v3i HalfApronMax = {}, v3i ModDim = {}) { - vox_data_block_array Result = { {}, {}, TempMemory }; + vox_data_block_array Result = VoxDataBlockArray(TempMemory); v3i ReportedDim = {}; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 2fe3e6b3f..a82dce37b 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -368,6 +368,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) // function.. so here we are. Hopefully I don't pay for this // in the future. // { +#if 0 s32 EditCount = s32(TotalElements(&Node->Edits)); sort_key *Keys = Allocate(sort_key, GetTranArena(), EditCount); @@ -379,13 +380,17 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } BubbleSort_descending(Keys, u32(EditCount)); +#endif // } - RangeIterator(KeyIndex, EditCount) + /* RangeIterator(KeyIndex, EditCount) */ + IterateOver(&Node->Edits, Edit, EditIndex) { TIMED_NAMED_BLOCK(WorldEditDrawCall); - world_edit *Edit = Cast(world_edit*, Keys[KeyIndex].Index); + /* world_edit *Edit = GetPtr(&Editor->Edits, *Edit); */ + + /* world_edit *Edit = Cast(world_edit*, Keys[KeyIndex].Index); */ if (Edit->Brush) // NOTE(Jesse): Don't necessarily have to have a brush if we created the edit before we created a brush. { layered_brush *Brush = &Edit->Brush->Layered; diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 0ddfcd609..87cad2f74 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -326,8 +326,12 @@ ContainsCameraGhost(world *World, entity **EntityTable, octree_node *Node, camer link_internal void -InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks, world_edit_ptr_paged_list *PotentialEdits) +InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks, world_edit_ptr_block_array *PotentialEdits) { + // TODO(Jesse): Should there be a pointer to the editor on the World? + // Or should this just take the editor too..? + level_editor *Editor = &GetEngineResources()->Editor; + *Node = {}; Node->Type = OctreeNodeType_Leaf; Node->WorldP = WorldP; @@ -338,11 +342,14 @@ InitOctreeNode(world *World, octree_node *Node, v3i WorldP, v3i DimInChunks, wor if (PotentialEdits) { Node->Edits.Memory = PotentialEdits->Memory; - IterateOver(PotentialEdits, Edit, EditIndex) + IterateOver(PotentialEdits, Edit, EditIndexIndex) { + /* auto Edit = GetPtr(&Editor->Edits, *Edit); */ + /* Assert(Edit); */ + if (Intersect(World, &NodeBounds, &Edit->Region)) { - Push(&Node->Edits, &Edit); + Push(&Node->Edits, Edit); } } } @@ -913,8 +920,8 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt if (HasGpuMesh(&Chunk->Mesh)) { - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); + Push(MainDrawList, Chunk); + Push(ShadowMapDrawList, Chunk); } } } @@ -946,8 +953,8 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt if (HasGpuMesh(&Chunk->Mesh)) { - Push(MainDrawList, &Chunk); - Push(ShadowMapDrawList, &Chunk); + Push(MainDrawList, Chunk); + Push(ShadowMapDrawList, Chunk); } } } @@ -1151,7 +1158,7 @@ GatherOctreeNodesOverlapping_Recursive(world *World, octree_node *Current, rect3 rect3cp Box = GetBoundingBox(World, Current); if (Intersect(World, &Box, Region)) { - Push(Result, &Current); + Push(Result, Current); switch(Current->Type) { diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 0779e4fa9..713f22e51 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -20,7 +20,7 @@ WorldUpdateThread_Main(void *ThreadStartupParams) WORKER_THREAD_ADVANCE_DEBUG_SYSTEM(); WorkerThread_BeforeJobStart(ThreadParams); - world_chunk_ptr_block_array UpdatedChunks = {0, 0, Thread->TempMemory}; + world_chunk_ptr_block_array UpdatedChunks = WorldChunkPtrBlockArray(Thread->TempMemory); while (work_queue_entry *Entry = PopWorkQueueEntry(WorldUpdateQ)) { diff --git a/src/tests/containers/block_array.cpp b/src/tests/containers/block_array.cpp index 1ed551fa6..8e0aa9a7f 100644 --- a/src/tests/containers/block_array.cpp +++ b/src/tests/containers/block_array.cpp @@ -53,8 +53,7 @@ TrivialAddRemove() RemoveUnordered(&Array, Last); - Assert( AtElements(&Array).BlockIndex == 0); - Assert( AtElements(&Array).ElementIndex == 0); + TestThat( AtElements(&Array).Index == 0); } link_internal void @@ -66,19 +65,21 @@ TwoBlocksRemoveFromEnd() RangeIterator_t(u32, Index, 8) { Push(&Array, &Index); - - TestThat(LastIndex(&Array).BlockIndex == 0); - TestThat(LastIndex(&Array).ElementIndex == Index); + TestThat(LastIndex(&Array).Index == Index); } + TestThat(Array.BlockCount == 1); { u32 Index = 8; Push(&Array, &Index); + TestThat(Array.BlockCount == 2); Index = 9; Push(&Array, &Index); + TestThat(Array.BlockCount == 2); } + TestThat(Array.ElementCount == 10 ); IterateOver(&Array, Value, Index) { @@ -87,48 +88,29 @@ TwoBlocksRemoveFromEnd() TestThat( *P == IntIndex ); } - // 8 elements per block, (10-8 == 2) - TestThat( Array.Current->At == 2 ); - { auto Last = LastIndex(&Array); - - TestThat( Last.BlockIndex == 1 ); - TestThat( Last.ElementIndex == 1 ); - RemoveUnordered(&Array, Last); - TestThat( Array.First->Next == Last.Block ); - TestThat( Array.First->Next == Array.Current ); + TestThat(Array.ElementCount == 9 ); + TestThat(Array.BlockCount == 2); } - TestThat( Array.Current->At == 1 ); - { auto Last = LastIndex(&Array); - - TestThat( Last.BlockIndex == 1 ); - TestThat( Last.ElementIndex == 0 ); - RemoveUnordered(&Array, Last); - TestThat( Array.Current == Array.First); + TestThat(Array.ElementCount == 8 ); + TestThat(Array.BlockCount == 2); } - TestThat( Array.Current->At == 8 ); - { auto Last = LastIndex(&Array); - - TestThat( Last.BlockIndex == 0 ); - TestThat( Last.ElementIndex == 7 ); - RemoveUnordered(&Array, Last); - TestThat( Array.Current == Array.First); + TestThat(Array.ElementCount == 7 ); + TestThat(Array.BlockCount == 2); } - - /* TestThat( Last.ElementIndex = 1 ); */ } link_internal void @@ -140,17 +122,18 @@ TwoBlocksRemoveFromFront() RangeIterator_t(u32, Index, 8) { Push(&Array, &Index); - - TestThat(LastIndex(&Array).BlockIndex == 0); - TestThat(LastIndex(&Array).ElementIndex == Index); + TestThat(LastIndex(&Array).Index == Index); } + TestThat(Array.BlockCount == 1); { u32 Index = 8; Push(&Array, &Index); + TestThat(Array.BlockCount == 2); Index = 9; Push(&Array, &Index); + TestThat(Array.BlockCount == 2); } @@ -161,98 +144,30 @@ TwoBlocksRemoveFromFront() TestThat( *P == IntIndex ); } - // 8 elements per block, (10-8 == 2) - TestThat( Array.Current->At == 2 ); - { auto I = ZerothIndex(&Array); RemoveUnordered(&Array, I); - - auto Last = LastIndex(&Array); - TestThat( Array.First->Next == Last.Block ); - TestThat( Array.First->Next == Array.Current ); - TestThat( Array.Current->At == 1 ); + TestThat(Array.ElementCount == 9); + TestThat(Array.BlockCount == 2); } { auto I = ZerothIndex(&Array); RemoveUnordered(&Array, I); - - TestThat( Array.Current == Array.First); - TestThat( Array.Current->At == 8 ); + TestThat(Array.ElementCount == 8); + TestThat(Array.BlockCount == 2); } { auto I = ZerothIndex(&Array); RemoveUnordered(&Array, I); - - TestThat( Array.Current == Array.First); - TestThat( Array.Current->At == 7 ); - } -} - - -link_internal void -PrintThreeBlocksRemoveFromMiddle() -{ - auto Array = MakeOrderedBlockArray(32); - TestThat( Array.Current->At == 8 ); - - auto I = ZerothIndex(&Array); - - ++I; - - { - RemoveUnordered(&Array, I); - TestThat( Array.Current->At == 7 ); - Print(&Array); - Info("--"); - } - - { - RemoveUnordered(&Array, I); - TestThat( Array.Current->At == 6 ); - Print(&Array); - Info("--"); - } - - { - I.ElementIndex = 7; - RemoveUnordered(&Array, I); - TestThat( Array.Current->At == 5 ); - Print(&Array); - Info("--"); - } - - { - ++I; - RemoveUnordered(&Array, I); - /* TestThat( Array.Current->At == 6 ); */ - Print(&Array); - Info("--"); + TestThat(Array.ElementCount == 7); + TestThat(Array.BlockCount == 2); } - - { - I = LastIndex(&Array);; - RemoveUnordered(&Array, I); - /* TestThat( Array.Current->At == 6 ); */ - Print(&Array); - Info("--"); - } - - { - I.ElementIndex = 0; - RemoveUnordered(&Array, I); - /* TestThat( Array.Current->At == 6 ); */ - Print(&Array); - Info("--"); - } - } - link_internal void RemoveAllBlocks() { @@ -277,6 +192,10 @@ Remove0thElementInTwoElementList() auto Z = ZerothIndex(&Array); RemoveUnordered(&Array, Z); + TestThat(Array.ElementCount == 1); + + RemoveUnordered(&Array, Z); + TestThat(Array.ElementCount == 0); } s32 @@ -290,8 +209,6 @@ main(s32 ArgCount, const char** Args) TwoBlocksRemoveFromFront(); - PrintThreeBlocksRemoveFromMiddle(); - RemoveAllBlocks(); Remove0thElementInTwoElementList(); From 403cbd5cf8625062ad87ed48c7fcb4e9cb439a44 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 2 Jun 2025 14:54:03 -0700 Subject: [PATCH 255/421] Fixes for linux --- examples/terrain_gen/game.cpp | 4 + external/bonsai_stdlib | 2 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 6 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- ...c_struct_terrain_finalize_render_context.h | 8 +- jesse.make.sh | 2 +- make.sh | 15 ++- settings.init | 4 +- .../terrain/TerrainFinalize.fragmentshader | 8 +- .../terrain_decoration.fragmentshader | 6 +- shaders/terrain/derivs.fragmentshader | 2 +- shaders/terrain/world_edit.fragmentshader | 4 +- src/engine/api.cpp | 5 +- src/engine/editor.cpp | 8 +- src/engine/engine.cpp | 2 +- src/engine/graphics.h | 3 +- src/engine/render/render_init.cpp | 8 +- src/engine/render_loop.cpp | 11 +- src/engine/terrain.cpp | 112 ------------------ src/engine/terrain.h | 28 ++--- src/engine/world_chunk.cpp | 112 ++++++++++++++++++ 23 files changed, 191 insertions(+), 165 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 0e5528ef4..d004d9811 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -4,6 +4,7 @@ #include "game_types.h" +#if 0 link_internal u32 Terrain_Debug( world_chunk *Chunk, v3i NoiseBasis, @@ -360,6 +361,7 @@ WarpedTerrain( world_chunk *Chunk, return ChunkSum; } +#endif BONSAI_API_WORKER_THREAD_INIT_CALLBACK() { @@ -396,6 +398,7 @@ BONSAI_API_WORKER_THREAD_CALLBACK() auto Ignored = MeshBit_Lod0; +#if 0 /* Info("%S", ToString(GenType)); */ switch (GenType) { @@ -744,6 +747,7 @@ BONSAI_API_WORKER_THREAD_CALLBACK() } +#endif } diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 83c5b6947..83aca836f 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 83c5b6947d209d9126778efcd0b0cffba27f5000 +Subproject commit 83aca836f61edcd88e1a3d1587878cf868403580 diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 2a203c903..e35f8e89a 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:130:0 +// src/engine/graphics.h:131:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index dcd00acee..e64f7b0a1 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:119:0 +// src/engine/graphics.h:120:0 diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index d0cf23c66..6d96e4948 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -133,11 +133,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte - cs MemberName = CSz("InputTex"); + cs MemberName = CSz("Ignored"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*, Element->InputTex), + Cast(u32*, &Element->Ignored), MemberName, Params ); @@ -149,6 +149,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte } + + PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index b51bd35f4..b9796175d 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:116:0 +// src/engine/graphics.h:117:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index 7909618e1..f7bcbf50a 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -1,15 +1,15 @@ -// src/engine/graphics.h:86:0 +// src/engine/graphics.h:87:0 link_internal void -InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct , texture *InputTex ) +InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct , u32 Ignored ) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/TerrainFinalize.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; - Struct->InputTex = InputTex; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InputTex, "InputTex"); + Struct->Ignored = Ignored; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); diff --git a/jesse.make.sh b/jesse.make.sh index 384beb04f..f2bf333db 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -3,7 +3,7 @@ # OPT="-O2" ./make.sh RunPoof -[ $? -ne 0 ] && exit 1 +# [ $? -ne 0 ] && exit 1 # ./make.sh $OPT BuildAll diff --git a/make.sh b/make.sh index 4e917ac93..cb21a45f8 100755 --- a/make.sh +++ b/make.sh @@ -70,6 +70,9 @@ DEBUG_TESTS_TO_BUILD=" $TESTS/allocation.cpp " +# COMPILER="clang++-19" +COMPILER="clang++" + function BuildExecutables { echo "" @@ -77,7 +80,7 @@ function BuildExecutables for executable in $EXECUTABLES_TO_BUILD; do SetOutputBinaryPathBasename "$executable" "$BIN" echo -e "$Building $executable" - clang++ \ + $COMPILER \ $SANITIZER \ $OPTIMIZATION_LEVEL \ $CXX_OPTIONS \ @@ -104,7 +107,7 @@ function BuildDebugOnlyTests for executable in $DEBUG_TESTS_TO_BUILD; do SetOutputBinaryPathBasename "$executable" "$BIN_TEST" echo -e "$Building $executable" - clang++ \ + $COMPILER \ $CXX_OPTIONS \ $BONSAI_INTERNAL \ $PLATFORM_CXX_OPTIONS \ @@ -129,7 +132,7 @@ function BuildTests for executable in $TESTS_TO_BUILD; do SetOutputBinaryPathBasename "$executable" "$BIN_TEST" echo -e "$Building $executable" - clang++ \ + $COMPILER \ $OPTIMIZATION_LEVEL \ $CXX_OPTIONS \ $BONSAI_INTERNAL \ @@ -153,7 +156,7 @@ function BuildExamples for executable in $EXAMPLES_TO_BUILD; do echo -e "$Building $executable" SetOutputBinaryPathBasename "$executable" "$BIN_GAME_LIBS" - clang++ \ + $COMPILER \ $SANITIZER \ -D BONSAI_DEBUG_SYSTEM_API=1 \ $OPTIMIZATION_LEVEL \ @@ -177,8 +180,8 @@ function BuildExamples function BuildWithClang { - which clang++ > /dev/null - [ $? -ne 0 ] && echo -e "Please install clang++" && exit 1 + which $COMPILER > /dev/null + [ $? -ne 0 ] && echo -e "Please install $COMPILER" && exit 1 echo -e "" echo -e "$Delimeter" diff --git a/settings.init b/settings.init index bcc472832..227fe9211 100644 --- a/settings.init +++ b/settings.init @@ -3,9 +3,9 @@ // NOTE(Jesse): Resolution of the back-buffers the renderer allocates // - resolution = ResolutionSetting_4096x2160 +// resolution = ResolutionSetting_4096x2160 // resolution = ResolutionSetting_1920x1080 -// resolution = ResolutionSetting_1280x720 + resolution = ResolutionSetting_1280x720 diff --git a/shaders/terrain/TerrainFinalize.fragmentshader b/shaders/terrain/TerrainFinalize.fragmentshader index 712db1d94..b3b156b52 100644 --- a/shaders/terrain/TerrainFinalize.fragmentshader +++ b/shaders/terrain/TerrainFinalize.fragmentshader @@ -1,7 +1,7 @@ uniform sampler2D InputTex; in vec2 UV; -out layout(location = 0) uint Output; +out uint Output; void main() @@ -9,12 +9,14 @@ void main() v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); f32 NoiseValue = TexLookup.a; - v3 ColorValue = TexLookup.rgb; + v3 ColorValue = TexLookup.rgb; + /* v3 ColorValue = V3(1.f,0.f,0.f); */ uint SolidBit = NoiseValue > 0.f ? 1u : 0u; uint PackedColor = PackRGB(ColorValue); + + /* uint SolidBit = 1u & uint(white_noise(v3(gl_FragCoord.xy, 1.f)) > 0.f); */ /* uint PackedColor = 3543u; */ Output = (SolidBit << 15) | PackedColor; - /* Output = uint(white_noise(v3(gl_FragCoord.xy, 1.f))*100000.f); */ } diff --git a/shaders/terrain/decoration/terrain_decoration.fragmentshader b/shaders/terrain/decoration/terrain_decoration.fragmentshader index 327130081..432f434ef 100644 --- a/shaders/terrain/decoration/terrain_decoration.fragmentshader +++ b/shaders/terrain/decoration/terrain_decoration.fragmentshader @@ -1,10 +1,8 @@ -#extension GL_ARB_explicit_uniform_location : enable - uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; -uniform layout(location = 0) sampler2D DerivsTex; -uniform layout(location = 1) sampler2D InputTex; +uniform sampler2D DerivsTex; +uniform sampler2D InputTex; in vec2 UV; out v4 Output; diff --git a/shaders/terrain/derivs.fragmentshader b/shaders/terrain/derivs.fragmentshader index f226c2e89..eedfe9339 100644 --- a/shaders/terrain/derivs.fragmentshader +++ b/shaders/terrain/derivs.fragmentshader @@ -4,7 +4,7 @@ uniform v3 ChunkResolution; uniform sampler2D InputTex; in vec2 UV; -out layout(location = 0) vec3 Output; +out vec3 Output; void main() diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index fa3c310d9..780c9b421 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -51,10 +51,10 @@ uniform f32 Squareness; // 0 == not square, 1 == square -uniform layout(location = 1) sampler2D InputTex; +uniform sampler2D InputTex; in vec2 UV; -out layout(location = 0) vec4 Output; +out vec4 Output; void main() diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 2034382cb..4299f6db0 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -731,6 +731,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ s32 FacesRequired = CountRequiredFacesForMesh_Naieve(SynChunk->FaceMasks, SynChunk->Dim); if (FacesRequired) { + /* Info("Chunk faces (%d)", FacesRequired); */ PushBonsaiRenderCommandAllocateAndMapGpuElementBuffer(RenderQ, DataType_v3_u8, u32(FacesRequired*6), &SynChunk->Mesh, SynChunk, DestChunk); } else @@ -745,6 +746,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ } else { + /* Info("Chunk had no mesh : ChunkSum(%d)", ChunkSum); */ if (HasGpuMesh(&DestChunk->Mesh)) { PushDeallocateBuffersCommand(RenderQ, &DestChunk->Mesh.Handles); @@ -824,7 +826,8 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ Assert(Chunk->Dim == World->ChunkDim); u32 Octaves = 1; - InitializeChunkWithNoise( Terrain_Perlin2D, Thread, Chunk, Chunk->Dim, &AssetFile, V3(Period), Amplititude, StartingZDepth, Color, MeshBit_Lod0, ChunkInitFlag_ComputeStandingSpots, &Octaves); + /* InitializeChunkWithNoise( Terrain_Perlin2D, Thread, Chunk, Chunk->Dim, &AssetFile, V3(Period), Amplititude, StartingZDepth, Color, MeshBit_Lod0, ChunkInitFlag_ComputeStandingSpots, &Octaves); */ + NotImplemented; } } break; diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index b828e8e60..e8f8d9ba5 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2024,8 +2024,8 @@ DoWorldEditor(engine_resources *Engine) #endif { // All Brushes Window - local_persist window_layout BrushSettingsWindow = WindowLayout("All Brushes", WindowLayoutFlag_Align_BottomRight); - PushWindowStart(Ui, &BrushSettingsWindow); + local_persist window_layout AllBrushesWindow = WindowLayout("All Brushes", WindowLayoutFlag_Align_BottomRight); + PushWindowStart(Ui, &AllBrushesWindow); IterateOver(&Editor->LoadedBrushes, Brush, BrushIndex) { @@ -2037,7 +2037,7 @@ DoWorldEditor(engine_resources *Engine) Style = &DefaultSelectedStyle; } - if (Button(Ui, CS(Brush->NameBuf), UiId(&BrushSettingsWindow, "brush select", Brush), Style)) + if (Button(Ui, CS(Brush->NameBuf), UiId(&AllBrushesWindow, "brush select", Brush), Style)) { Editor->CurrentBrush = Brush; CheckSettingsChanged(&Brush->Layered); // Prevent firing a change event @prevent_change_event @@ -2045,7 +2045,7 @@ DoWorldEditor(engine_resources *Engine) PushNewRow(Ui); } } - PushWindowEnd(Ui, &BrushSettingsWindow); + PushWindowEnd(Ui, &AllBrushesWindow); if (Editor->CurrentBrush) { diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 83bf64580..891552840 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -51,6 +51,6 @@ #include #include -#include +/* #include */ #include diff --git a/src/engine/graphics.h b/src/engine/graphics.h index f2f3067a6..24aba293e 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -80,7 +80,8 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader texture DestTex; framebuffer FBO; - texture *InputTex; poof(@uniform) + u32 Ignored; poof(@uniform) + /* texture *InputTex; poof(@uniform) */ }; poof(shader_magic(terrain_finalize_render_context)) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 4f7ce05c1..ea3f43128 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -270,6 +270,7 @@ MakeGaussianBlurRenderGroup(v2 *ApplicationResolution, memory_arena *GraphicsMem for (s32 Index = 0; Index < 2; ++Index) { GL.BindFramebuffer(GL_FRAMEBUFFER, Result.FBOs[Index].ID); + AssertNoGlErrors; u32 Channels = 4; u32 Slices = 1; @@ -277,8 +278,12 @@ MakeGaussianBlurRenderGroup(v2 *ApplicationResolution, memory_arena *GraphicsMem Result.Textures[Index] = GenTexture(V2i(*ApplicationResolution), CSz("GaussianBlur"), StorageFormat, Channels, Slices); GL.TexImage2D( GL_TEXTURE_2D, 0, GL_RGBA32F, s32(ApplicationResolution->x), s32(ApplicationResolution->y), 0, GL_RGBA, GL_FLOAT, 0); + AssertNoGlErrors; + FramebufferTexture(&Result.FBOs[Index], Result.Textures+Index); + AssertNoGlErrors; SetDrawBuffers(&Result.FBOs[Index]); + AssertNoGlErrors; Ensure(CheckAndClearFramebuffer()); } @@ -830,7 +835,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr SetDrawBuffers(&Result->TerrainFinalizeRC.FBO); - InitializeTerrainFinalizeRenderContext(TerrainFinalizeRC, &Result->TerrainShapingRC.DestTex); + /* InitializeTerrainFinalizeRenderContext(TerrainFinalizeRC, &Result->TerrainShapingRC.DestTex); */ + InitializeTerrainFinalizeRenderContext(TerrainFinalizeRC, 0); Ensure(CheckAndClearFramebuffer()); } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index a82dce37b..16ad776e7 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -309,6 +309,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TIMED_NAMED_BLOCK(TerrainDrawCall); GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); UseShader(RC); + + // @derivs_texture_binding_to_shader_unit_0 BindUniformByName(&RC->Program, "InputTex", InputTex, 0); v2i DestTextureDim = RC->DestTex.Dim; @@ -334,8 +336,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TIMED_NAMED_BLOCK(TerrainDrawCall); GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO->ID); UseShader(RC); - // Using texture unit 1 because the DerivsTex is automatically bound in - // UseShader to unit 0 + // Using texture unit 1 because the DerivsTex is automatically bound in UseShader to unit 0 + // @derivs_texture_binding_to_shader_unit_0 BindUniformByName(&RC->Program, "InputTex", InputTex, 1); RenderQuad(); @@ -398,6 +400,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[PingPongIndex].ID); + // @derivs_texture_binding_to_shader_unit_0 BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 1); brush_layer *Layer = Brush->Layers + LayerIndex; @@ -534,6 +537,10 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) UseShader(&Graphics->TerrainFinalizeRC); + // NOTE(Jesse): The other inputtex calls bind to texture unit 1 .. it is correct that + // this bind to unit 0 because there's no derivs texture being bound here. + // + // @derivs_texture_binding_to_shader_unit_0 BindUniformByName(&Graphics->TerrainFinalizeRC.Program, "InputTex", InputTex, 0); /* gpu_timer Timer = StartGpuTimer(); */ diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 7d2320974..29039a271 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -1,115 +1,3 @@ -link_internal u32 -FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, u16 *NoiseValues, v3i SrcToDest, s64 zMin) -{ - TIMED_FUNCTION(); - u32 ChunkSum = 0; - TIMED_NAMED_BLOCK(NoiseFinalize); - - { - TIMED_NAMED_BLOCK(NoiseFinalize0); - for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) - { - for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) - { - u64 Mask = 0; - for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) - { - v3i ChunkP = V3i(xChunk, yChunk, zChunk); - v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); - - s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); - s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); - - u16 ThisNoiseV = NoiseValues[NoiseIndex]; - u64 NoiseChoice = (ThisNoiseV >> 15); - Assert(NoiseChoice == 1 || NoiseChoice == 0); - ChunkSum += u32(NoiseChoice); - - u16 NoiseColor = ThisNoiseV & ((1 << 15) -1); - - u32 FiveBits = (1<<5)-1; - u32 R = (ThisNoiseV >> 10) & FiveBits; - u32 G = (ThisNoiseV >> 5) & FiveBits; - u32 B = (ThisNoiseV >> 0) & FiveBits; - - NoiseColor = RGBtoPackedHSV(V3( - f32(R)/f32(FiveBits), - f32(G)/f32(FiveBits), - f32(B)/f32(FiveBits) - )); - - Assert(xChunk < 64); - Mask |= (NoiseChoice << xChunk); - - /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ - /* if (NormalIndex > -1) */ - /* { */ - /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ - /* } */ - - Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); - /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ - if (GetEngineDebug()->MarkChunkBorderVoxels) - { - if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } - if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } - if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } - } - } - - SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); - } - } - } - - Assert(NoiseDim.x >= 66); - Assert(NoiseDim.y >= 66); - Assert(NoiseDim.z >= 66); - - Assert(Chunk->Dim.x == 64); - Assert(Chunk->Dim.y == 66); - Assert(Chunk->Dim.z == 66); - - { - TIMED_NAMED_BLOCK(NoiseFinalize1); - - for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) - { - u64 x0Bits = {}; - u64 x1Bits = {}; - for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) - { - - { - v3i BorderP = V3i(0, yNoise, zNoise); - s32 BorderIndex = GetIndex(BorderP, NoiseDim); - - u16 ThisNoiseV = NoiseValues[BorderIndex]; - u64 NoiseChoice = (ThisNoiseV >> 15); - Assert(NoiseChoice == 1 || NoiseChoice == 0); - u64 Bit = NoiseChoice << (yNoise-1); - x0Bits |= Bit; - } - - { - v3i BorderP = V3i(65, yNoise, zNoise); - s32 BorderIndex = GetIndex(BorderP, NoiseDim); - - u16 ThisNoiseV = NoiseValues[BorderIndex]; - u64 NoiseChoice = (ThisNoiseV >> 15); - Assert(NoiseChoice == 1 || NoiseChoice == 0); - u64 Bit = NoiseChoice << (yNoise-1); - x1Bits |= Bit; - } - - } - Chunk->xOccupancyBorder[(zNoise-1)*2] = x0Bits; - Chunk->xOccupancyBorder[((zNoise-1)*2)+1] = x1Bits; - } - } - return ChunkSum; -} - link_internal u32 Terrain_Flat( world_chunk *Chunk, v3i NoiseBasis, diff --git a/src/engine/terrain.h b/src/engine/terrain.h index 9e571c10a..9a1ad038e 100644 --- a/src/engine/terrain.h +++ b/src/engine/terrain.h @@ -280,28 +280,28 @@ MapNoiseValueToFinal(f32 Value) } -link_internal void -ComputeNormalsForChunkFromNoiseValues( r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim); +/* link_internal void */ +/* ComputeNormalsForChunkFromNoiseValues( r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim); */ -link_internal void -ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim); +/* link_internal void */ +/* ComputeNormalsForChunkFromNoiseValues_avx( r32 *NoiseValues, v3i NoiseDim, v3 *Normals, v3i NormalsDim); */ -link_internal u32 -Terrain_WhiteNoise( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); +/* link_internal u32 */ +/* Terrain_WhiteNoise( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); */ -link_internal u32 -Terrain_Perlin3D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); +/* link_internal u32 */ +/* Terrain_Perlin3D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); */ -link_internal u32 -Terrain_Perlin2D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); +/* link_internal u32 */ +/* Terrain_Perlin2D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); */ -link_internal u32 +/* link_internal u32 */ -Terrain_Voronoi3D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); +/* Terrain_Voronoi3D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); */ -link_internal u32 -Terrain_Voronoi2D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); +/* link_internal u32 */ +/* Terrain_Voronoi2D( world_chunk *Chunk, v3i NoiseBasis, void *NoiseParams, void *UserData ); */ link_internal u32 FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, u16 *NoiseValues, v3i SrcToDest, s64 zMin); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 7f69317af..58a6ea411 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -4756,3 +4756,115 @@ DrawPickedChunks(renderer_2d* Group, render_entity_to_texture_group *PickedChunk } #endif // BONSAI_DEBUG_SYSTEM_API +link_internal u32 +FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, u16 *NoiseValues, v3i SrcToDest, s64 zMin) +{ + TIMED_FUNCTION(); + u32 ChunkSum = 0; + TIMED_NAMED_BLOCK(NoiseFinalize); + + { + TIMED_NAMED_BLOCK(NoiseFinalize0); + for ( s32 zChunk = 0; zChunk < Chunk->Dim.z; ++ zChunk) + { + for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) + { + u64 Mask = 0; + for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) + { + v3i ChunkP = V3i(xChunk, yChunk, zChunk); + v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); + + s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); + s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); + + u16 ThisNoiseV = NoiseValues[NoiseIndex]; + u64 NoiseChoice = (ThisNoiseV >> 15); + Assert(NoiseChoice == 1 || NoiseChoice == 0); + ChunkSum += u32(NoiseChoice); + + u16 NoiseColor = ThisNoiseV & ((1 << 15) -1); + + u32 FiveBits = (1<<5)-1; + u32 R = (ThisNoiseV >> 10) & FiveBits; + u32 G = (ThisNoiseV >> 5) & FiveBits; + u32 B = (ThisNoiseV >> 0) & FiveBits; + + NoiseColor = RGBtoPackedHSV(V3( + f32(R)/f32(FiveBits), + f32(G)/f32(FiveBits), + f32(B)/f32(FiveBits) + )); + + Assert(xChunk < 64); + Mask |= (NoiseChoice << xChunk); + + /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ + /* if (NormalIndex > -1) */ + /* { */ + /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ + /* } */ + + Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); + /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ + if (GetEngineDebug()->MarkChunkBorderVoxels) + { + if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } + if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } + if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } + } + } + + SetOccupancyMask(Chunk, yChunk + zChunk*Chunk->Dim.y, Mask); + } + } + } + + Assert(NoiseDim.x >= 66); + Assert(NoiseDim.y >= 66); + Assert(NoiseDim.z >= 66); + + Assert(Chunk->Dim.x == 64); + Assert(Chunk->Dim.y == 66); + Assert(Chunk->Dim.z == 66); + + { + TIMED_NAMED_BLOCK(NoiseFinalize1); + + for ( s32 zNoise = 1; zNoise < 65; ++ zNoise) + { + u64 x0Bits = {}; + u64 x1Bits = {}; + for ( s32 yNoise = 1; yNoise < 65; ++ yNoise) + { + + { + v3i BorderP = V3i(0, yNoise, zNoise); + s32 BorderIndex = GetIndex(BorderP, NoiseDim); + + u16 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = (ThisNoiseV >> 15); + Assert(NoiseChoice == 1 || NoiseChoice == 0); + u64 Bit = NoiseChoice << (yNoise-1); + x0Bits |= Bit; + } + + { + v3i BorderP = V3i(65, yNoise, zNoise); + s32 BorderIndex = GetIndex(BorderP, NoiseDim); + + u16 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = (ThisNoiseV >> 15); + Assert(NoiseChoice == 1 || NoiseChoice == 0); + u64 Bit = NoiseChoice << (yNoise-1); + x1Bits |= Bit; + } + + } + Chunk->xOccupancyBorder[(zNoise-1)*2] = x0Bits; + Chunk->xOccupancyBorder[((zNoise-1)*2)+1] = x1Bits; + } + } + return ChunkSum; +} + From b6cc3072c100c9505e83e1b7492bb8c4b4c0761f Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 2 Jun 2025 14:55:06 -0700 Subject: [PATCH 256/421] Update stdlib --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 83aca836f..fc120c4b7 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 83aca836f61edcd88e1a3d1587878cf868403580 +Subproject commit fc120c4b7834d5334747637707305f4aa7501b15 From b3154429185fd396134480ca4631104cea693384 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 3 Jun 2025 18:40:43 -0700 Subject: [PATCH 257/421] Multi-select edits nominally working --- dottedboxguy.make.sh | 2 +- external/bonsai_stdlib | 2 +- .../block_array_c_asset_thumbnail_688856411.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 6 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 73 ++++++++++++ ..._for_compound_type_world_edit_paged_list.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- ...world_edit_block_array_index_block_array.h | 26 +++++ generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 2 +- generated/for_datatypes_kh9dwrCf.h | 2 +- generated/gen_rect_helpers_rect2_v2.h | 2 +- generated/gen_rect_helpers_rect3_v3.h | 2 +- generated/gen_rect_helpers_rect3i_v3i.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...ing_and_value_tables_visible_region_size.h | 2 +- jesse.make.sh | 2 +- settings.init | 4 +- src/engine/editor.cpp | 110 +++++++++++++----- src/engine/editor.h | 2 +- 113 files changed, 291 insertions(+), 144 deletions(-) create mode 100644 generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h create mode 100644 generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h diff --git a/dottedboxguy.make.sh b/dottedboxguy.make.sh index 788fbabf0..e7d2c6db9 100644 --- a/dottedboxguy.make.sh +++ b/dottedboxguy.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index fc120c4b7..21497fef2 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit fc120c4b7834d5334747637707305f4aa7501b15 +Subproject commit 21497fef208d32e9e6457ff466c57ecb8f9f03e0 diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 9a70f1322..0b24bd891 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:119:0 +// src/engine/editor.cpp:121:0 diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 5ddd15078..712c2be7b 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:315:0 +// src/engine/editor.cpp:317:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 502431f47..f6e34eba6 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:470:0 +// src/engine/editor.cpp:478:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 9d7d8f270..49cd08ad2 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:462:0 +// src/engine/editor.cpp:470:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index ee40fe0d4..5c0aed48a 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:354:0 +// src/engine/editor.cpp:356:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index e7df65dcc..84b29f5b6 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:321:0 +// src/engine/editor.cpp:323:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 042e75a9c..711051f38 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:254:0 +// src/engine/editor.cpp:256:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 38d5323a7..623e21d60 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:379:0 +// src/engine/editor.cpp:381:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 3e53de277..af8fc526b 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:160:0 +// src/engine/editor.cpp:162:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 21a3aaece..fbb1b4d6f 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:348:0 +// src/engine/editor.cpp:350:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 797514327..56d3ec238 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:403:0 +// src/engine/editor.cpp:411:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 6f945929d..7b03fa724 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:357:0 +// src/engine/editor.cpp:359:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index e95892b55..4cc23f46c 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:473:0 +// src/engine/editor.cpp:481:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index cc1ecb62d..a1f942f2d 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:250:0 +// src/engine/editor.cpp:252:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index c3856638a..53d6192f2 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:520:0 +// src/engine/editor.cpp:528:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index f86dc511d..f9ec880da 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:541:0 +// src/engine/editor.cpp:549:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 21273cbbc..5e596b1cd 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:538:0 +// src/engine/editor.cpp:546:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 8f0bb3398..24a8bbe3e 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:442:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index ae50fac1a..48ff410ba 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:439:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 9d13e4ed3..8515ee2cc 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:476:0 +// src/engine/editor.cpp:484:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 0eb7da9ed..881c543c0 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:427:0 +// src/engine/editor.cpp:435:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 48a838ebe..8dc4d0fa7 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:345:0 +// src/engine/editor.cpp:347:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 91d6f0220..8149b3616 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:496:0 +// src/engine/editor.cpp:504:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index ec77824f7..e06c8e639 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:490:0 +// src/engine/editor.cpp:498:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 61b2f29fc..0fac4e943 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:417:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index ea9c5458a..38a6ebede 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:412:0 +// src/engine/editor.cpp:420:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index a0764cb09..b06ce45ca 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:511:0 +// src/engine/editor.cpp:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index aedaa98e2..8f46012be 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:535:0 +// src/engine/editor.cpp:543:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 25720158b..09cb63da4 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:243:0 +// src/engine/editor.cpp:245:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 381ac4225..2c923904f 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:240:0 +// src/engine/editor.cpp:242:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index ace0246df..aa611a9e1 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:312:0 +// src/engine/editor.cpp:314:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index d471f4ef2..851fa53b9 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:382:0 +// src/engine/editor.cpp:384:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index eda8b6309..b542a9c1c 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:526:0 +// src/engine/editor.cpp:534:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -492,11 +492,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - cs MemberName = CSz("CurrentEdit"); + cs MemberName = CSz("SelectedEdits"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit*, Element->CurrentEdit), + Cast(world_edit_block_array_index_block_array*, &Element->SelectedEdits), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 5e6a5e7fd..f53ae7b24 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:493:0 +// src/engine/editor.cpp:501:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 13d6671f0..55b2d8672 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:291:0 +// src/engine/editor.cpp:293:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 1bce48932..fd12ccd2b 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:415:0 +// src/engine/editor.cpp:423:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index be7a33d3c..3de55283b 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:418:0 +// src/engine/editor.cpp:426:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 4b7a581ed..ae38f425a 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:142:0 +// src/engine/editor.cpp:144:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 34c20b054..4eef62d0f 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:452:0 +// src/engine/editor.cpp:460:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 51e44320a..563076b98 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:306:0 +// src/engine/editor.cpp:308:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 73d9287e4..704016e64 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:309:0 +// src/engine/editor.cpp:311:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 346c053b6..4260d1b23 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:138:0 +// src/engine/editor.cpp:140:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 9026f927d..d9c80145c 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:297:0 +// src/engine/editor.cpp:299:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index b6d186e1c..f1f72c12e 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:342:0 +// src/engine/editor.cpp:344:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 68617fd2b..a17c4b20a 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:246:0 +// src/engine/editor.cpp:248:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 455f1e727..631c95887 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:300:0 +// src/engine/editor.cpp:302:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 4f8e5cc04..7921d375f 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:484:0 +// src/engine/editor.cpp:492:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 7cfa05f7f..c2fb6392e 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:514:0 +// src/engine/editor.cpp:522:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index ce46a99e5..70ca603af 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:294:0 +// src/engine/editor.cpp:296:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 76066ab92..272891258 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:487:0 +// src/engine/editor.cpp:495:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 08ae1d3a0..c623f7bab 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:226:0 +// src/engine/editor.cpp:228:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index a8772be7a..01c59add9 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:158:0 +// src/engine/editor.cpp:160:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 8d05fb3ed..9334825da 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:502:0 +// src/engine/editor.cpp:510:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 6d96e4948..397bc2893 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:505:0 +// src/engine/editor.cpp:513:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index ff4bb5179..da885fe5c 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:499:0 +// src/engine/editor.cpp:507:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index ce751ef9e..227a4dd1b 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:388:0 +// src/engine/editor.cpp:390:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 048c39f00..f4774cb7c 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:385:0 +// src/engine/editor.cpp:387:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index d03d1bc54..99ea2b195 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:508:0 +// src/engine/editor.cpp:516:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 73e7a2419..50b8b3843 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:351:0 +// src/engine/editor.cpp:353:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 961a65dcd..aa6894da8 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:517:0 +// src/engine/editor.cpp:525:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 9bd1b81cd..0f49a9b4b 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:166:0 +// src/engine/editor.cpp:168:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 44768f5a2..9be65b874 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:169:0 +// src/engine/editor.cpp:171:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 75018fb7f..a0af06718 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:324:0 +// src/engine/editor.cpp:326:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index f79cea862..d91b555c0 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:320:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 460e5ca19..8c70a04a4 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:140:0 +// src/engine/editor.cpp:142:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 195e73d72..697626099 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:414:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 1ef303c50..c0cc3eb6d 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:397:0 +// src/engine/editor.cpp:405:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 3b4aaba46..d9a28659a 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:400:0 +// src/engine/editor.cpp:408:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 04e5eafa5..d775718b5 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:136:0 +// src/engine/editor.cpp:138:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index c397da32d..96ca17a84 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:237:0 +// src/engine/editor.cpp:239:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 89e02157f..6c7a0a03a 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:234:0 +// src/engine/editor.cpp:236:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 0e449eacc..ce2b612e1 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:455:0 +// src/engine/editor.cpp:463:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 558fab730..3d4260532 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:449:0 +// src/engine/editor.cpp:457:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h new file mode 100644 index 000000000..f3fa1a4bf --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -0,0 +1,73 @@ +// src/engine/editor.cpp:396:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_block_array_index", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("Index"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(umm*, &Element->Index), + MemberName, + Params + ); + + + + + + + + } + + PushNewRow(Ui); + + + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index c06b1831a..217dff5e8 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:391:0 +// src/engine/editor.cpp:393:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 041c9ab2d..2be5df65e 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:150:0 +// src/engine/editor.cpp:152:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index e7064499c..984c848b0 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:146:0 +// src/engine/editor.cpp:148:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 6f31b20de..9ce87bc6c 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:148:0 +// src/engine/editor.cpp:150:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 46fc3e02a..433d06d6d 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:446:0 +// src/engine/editor.cpp:454:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 56699dc90..c0a157086 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:421:0 +// src/engine/editor.cpp:429:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index bb9b247d4..189740ccf 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:229:0 +// src/engine/editor.cpp:231:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 157c22c65..c37dff0ff 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:223:0 +// src/engine/editor.cpp:225:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 0bdb56a9f..1eef25365 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:178:0 +// src/engine/editor.cpp:180:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index ee7ed501b..44c0750a4 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:163:0 +// src/engine/editor.cpp:165:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h new file mode 100644 index 000000000..49a38674a --- /dev/null +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -0,0 +1,26 @@ +// src/engine/editor.cpp:399:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +{ + if (Container) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + { + PushNewRow(Ui); + IterateOver(Container, Element, ElementIndex) + { + DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushNewRow(Ui); + } + } + PushNewRow(Ui); + } + else + { + PushColumn(Ui, FSz("%S", Name), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushColumn(Ui, CSz("(null)"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushNewRow(Ui); + } +} + diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index c48e68bb9..ce6cd105d 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:467:0 +// src/engine/editor.cpp:475:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 7a6a65f39..ed1043772 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:394:0 +// src/engine/editor.cpp:402:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 1a41a4fbc..99a624c30 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:523:0 +// src/engine/editor.cpp:531:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index c2f23f785..e92e924e9 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:282:0 +// src/engine/editor.cpp:284:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index fcc84cf9b..771e7f460 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:279:0 +// src/engine/editor.cpp:281:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 9ec9d4bed..542801ec2 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:424:0 +// src/engine/editor.cpp:432:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 5029c8b4c..32905c31e 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:303:0 +// src/engine/editor.cpp:305:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 3e1e7be77..3efb10948 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:529:0 +// src/engine/editor.cpp:537:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 41d78c215..de1cc1ec2 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:532:0 +// src/engine/editor.cpp:540:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 6d7d6d1bc..1307e7c6c 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:156:0 +// src/engine/editor.cpp:158:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 826fd239f..e44a10e5a 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:285:0 +// src/engine/editor.cpp:287:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index 6aadb04ae..7805af18c 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:132:0 +// src/engine/editor.cpp:134:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 02e344023..35dddda05 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:364:0 +// src/engine/editor.cpp:366:0 diff --git a/generated/gen_rect_helpers_rect2_v2.h b/generated/gen_rect_helpers_rect2_v2.h index 53c6d995f..e9e106784 100644 --- a/generated/gen_rect_helpers_rect2_v2.h +++ b/generated/gen_rect_helpers_rect2_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/rect.h:137:0 +// external/bonsai_stdlib/src/rect.h:147:0 link_internal rect2 RectMinMax(v2 Min, v2 Max) diff --git a/generated/gen_rect_helpers_rect3_v3.h b/generated/gen_rect_helpers_rect3_v3.h index 308b6e159..480215556 100644 --- a/generated/gen_rect_helpers_rect3_v3.h +++ b/generated/gen_rect_helpers_rect3_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/rect.h:141:0 +// external/bonsai_stdlib/src/rect.h:151:0 link_internal rect3 RectMinMax(v3 Min, v3 Max) diff --git a/generated/gen_rect_helpers_rect3i_v3i.h b/generated/gen_rect_helpers_rect3i_v3i.h index 5814a5cfe..6650ed521 100644 --- a/generated/gen_rect_helpers_rect3i_v3i.h +++ b/generated/gen_rect_helpers_rect3i_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/rect.h:144:0 +// external/bonsai_stdlib/src/rect.h:154:0 link_internal rect3i RectMinMax(v3i Min, v3i Max) diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 02850bba1..706e17e2b 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:465:0 +// src/engine/editor.cpp:473:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 574db20ce..ddd409cb1 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:275:0 +// src/engine/editor.cpp:277:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index bc9fa0a89..1d062da4a 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:269:0 +// src/engine/editor.cpp:271:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 405eaa435..e3bf91f82 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:266:0 +// src/engine/editor.cpp:268:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 3b65d729c..f68d33f3c 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:272:0 +// src/engine/editor.cpp:274:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index f76dc3ff2..72d28226a 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:130:0 +// src/engine/editor.cpp:132:0 link_internal counted_string ToStringPrefixless(visible_region_size Type) diff --git a/jesse.make.sh b/jesse.make.sh index f2bf333db..384beb04f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -3,7 +3,7 @@ # OPT="-O2" ./make.sh RunPoof -# [ $? -ne 0 ] && exit 1 +[ $? -ne 0 ] && exit 1 # ./make.sh $OPT BuildAll diff --git a/settings.init b/settings.init index 227fe9211..bcc472832 100644 --- a/settings.init +++ b/settings.init @@ -3,9 +3,9 @@ // NOTE(Jesse): Resolution of the back-buffers the renderer allocates // -// resolution = ResolutionSetting_4096x2160 + resolution = ResolutionSetting_4096x2160 // resolution = ResolutionSetting_1920x1080 - resolution = ResolutionSetting_1280x720 +// resolution = ResolutionSetting_1280x720 diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index e8f8d9ba5..df70f7242 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -19,7 +19,7 @@ LoadBrushFromFile(level_editor *Editor, file_traversal_node *FileNode, memory_ar } link_internal world_edit * -NewEdit(level_editor *Editor, world_edit_layer *Layer) +NewEdit(level_editor *Editor, world_edit_layer *Layer, world_edit_block_array_index *IndexOut = 0) { world_edit_block_array_index Index = {}; world_edit *Result = {}; @@ -33,8 +33,6 @@ NewEdit(level_editor *Editor, world_edit_layer *Layer) } } - - if (Result == 0) { Result = Push(&Editor->Edits); @@ -43,6 +41,9 @@ NewEdit(level_editor *Editor, world_edit_layer *Layer) Push(&Layer->EditIndices, &Index); + if (IndexOut) + *IndexOut = Index; + return Result; } @@ -81,6 +82,7 @@ InitEditor(level_editor *Editor) } Editor->Edits.Memory = Editor->Memory; + Editor->SelectedEdits.Memory = Editor->Memory; /* RangeIterator(LayerIndex, MAX_BRUSH_LAYERS) */ /* { */ @@ -391,6 +393,12 @@ poof(do_editor_ui_for_compound_type(world_edit)) poof(do_editor_ui_for_container(world_edit_ptr_block_array)) #include +poof(do_editor_ui_for_compound_type(world_edit_block_array_index)) +#include + +poof(do_editor_ui_for_container(world_edit_block_array_index_block_array)) +#include + poof(do_editor_ui_for_enum(chunk_flag)) #include @@ -1373,9 +1381,18 @@ EditWorldSelection(engine_resources *Engine) aabb_intersect_result AABBTest = {}; - if (Editor->Selection.Clicks) +#if 0 + aabb TotalEditAreas = InvertedInfinityRectangle_rect3(); + IterateOver(&Editor->SelectedEdits, EditIndex, EditIndexIndex) { + world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); + aabb EditAABB = GetSimSpaceRect(World, Edit->Region); + TotalEditAreas = Union(&TotalEditAreas, &EditAABB); + } +#endif + if (Editor->Selection.Clicks) + { if (SelectionIncomplete(Editor->Selection.Clicks)) { if (Engine->MousedOverVoxel.Tag) @@ -1391,6 +1408,7 @@ EditWorldSelection(engine_resources *Engine) } aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); + /* SelectionAABB = TotalEditAreas; */ { if (Engine->MaybeMouseRay.Tag == Maybe_Yes) { @@ -1984,9 +2002,12 @@ DoWorldEditor(engine_resources *Engine) Editor->Tool = WorldEdit_Tool_Select; ResetSelection(Editor); - Editor->CurrentEdit = NewEdit(Editor, Editor->CurrentLayer); + world_edit_block_array_index Index; + auto E = NewEdit(Editor, Editor->CurrentLayer, &Index); + E->Brush = Editor->CurrentBrush; - Editor->CurrentEdit->Brush = Editor->CurrentBrush; + Editor->SelectedEdits.ElementCount = 0; + Push(&Editor->SelectedEdits, &Index); } #if 0 @@ -2056,10 +2077,10 @@ DoWorldEditor(engine_resources *Engine) // settings window detects and initializes new brushes if (SelectionComplete(Editor->Selection.Clicks) && Editor->CurrentBrush) { - if (Editor->Selection.Changed && Editor->CurrentEdit) - { - UpdateWorldEditBounds(Engine, Editor->CurrentEdit, Editor->Selection.Region, GetTranArena()); - } + /* if (Editor->Selection.Changed && CurrentEdit(Editor)) */ + /* { */ + /* UpdateWorldEditBounds(Engine, CurrentEdit(Editor), Editor->Selection.Region, GetTranArena()); */ + /* } */ b32 SettingsChanged = CheckSettingsChanged(&Editor->CurrentBrush->Layered); if (SettingsChanged) @@ -2100,11 +2121,11 @@ DoWorldEditor(engine_resources *Engine) IterateOver(&Editor->Layers, Layer, LayerIndex) { cs Name = CS(Layer->NameBuf); - b32 Selected = Editor->CurrentLayer == Layer; + b32 LayerSelected = Editor->CurrentLayer == Layer; PushTableStart(Ui); { - ui_style *Style = Selected ? &DefaultSelectedStyle : &DefaultStyle; + ui_style *Style = LayerSelected ? &DefaultSelectedStyle : &DefaultStyle; if (Button(Ui, Name, UiId(&LayersWindow, Layer, Layer), Style)) { Editor->CurrentLayer = Layer; @@ -2136,10 +2157,11 @@ DoWorldEditor(engine_resources *Engine) ApplyEditToOctree(Engine, Duplicated, GetTranArena()); - if (Editor->CurrentEdit == Edit) - { - Editor->CurrentEdit = Duplicated; - } + NotImplemented; + /* if (Editor->CurrentEdit == Edit) */ + /* { */ + /* Editor->CurrentEdit = Duplicated; */ + /* } */ } } break; @@ -2181,12 +2203,6 @@ DoWorldEditor(engine_resources *Engine) const char *NameBuf = Edit->Brush ? Edit->Brush->NameBuf : "no brush"; - ui_render_params Params = DefaultUiRenderParams_Button; - if (Edit == Editor->CurrentEdit) - { - Params.FStyle = &DefaultSelectedStyle; - } - ui_reorder_action EditReorderAction = {}; PushToolbar(Ui, &LayersWindow, {}, &EditReorderAction, u64(Edit)^u64(Layer), &DefaultUiRenderParams_Toolbar, ToggleButtonGroupFlags_NoNewRow); @@ -2244,15 +2260,47 @@ DoWorldEditor(engine_resources *Engine) break; } - /* auto EditSelectButton = PushSimpleButton(Ui, FSz("(%d)(%d) (%s)", KeyIndex, Key->Value, NameBuf), UiId(&LayersWindow, "edit select", Edit), &Params); */ - auto EditSelectButton = PushSimpleButton(Ui, FSz("(%s)", NameBuf), UiId(&LayersWindow, "edit select", Edit), &Params); + + ui_render_params ButtonParams = DefaultUiRenderParams_Button; + + b32 EditIsSelected = False; + world_edit_block_array_index_block_array_index I; + IterateOver(&Editor->SelectedEdits, SelEditIndex, SEII) + { + if (*SelEditIndex == *EditIndex) + { + ButtonParams.FStyle = &DefaultSelectedStyle; + EditIsSelected = True; + I = SEII; + } + } + + auto EditSelectButton = PushSimpleButton(Ui, FSz("(%s)", NameBuf), UiId(&LayersWindow, "edit select", Edit), &ButtonParams); if (Clicked(Ui, &EditSelectButton)) { Editor->Selection.Clicks = 2; Editor->Selection.Region = Edit->Region; Editor->Selection.PrevRegion = Edit->Region; - Editor->CurrentEdit = Edit; + if (Input->Ctrl.Pressed) + { + if (EditIsSelected) + { + RemoveUnordered(&Editor->SelectedEdits, I); + } + else + { + Push(&Editor->SelectedEdits, EditIndex); + } + } + else + { + Editor->SelectedEdits.ElementCount = 0; + Push(&Editor->SelectedEdits, EditIndex); + } + + + /* Editor->CurrentEdit = Edit; */ Editor->CurrentLayer = Layer; if (Edit->Brush) @@ -2288,15 +2336,15 @@ DoWorldEditor(engine_resources *Engine) /* ++Duplicated->Ordinal; */ ApplyEditToOctree(Engine, Duplicated, GetTranArena()); - Editor->CurrentEdit = Duplicated; + /* Editor->CurrentEdit = Duplicated; */ } break; case UiLayerEditAction_Delete: { - if (Editor->CurrentEdit == Edit) - { - Editor->CurrentEdit = 0; - } + /* if (Editor->CurrentEdit == Edit) */ + /* { */ + /* Editor->CurrentEdit = 0; */ + /* } */ DropEditFromOctree(Engine, Edit, GetTranArena()); RemoveOrdered(&Layer->EditIndices, EditIndex); @@ -2369,7 +2417,7 @@ DoWorldEditor(engine_resources *Engine) { // But otherwise only highlight the edits on the current layer. if (Layer == Editor->CurrentLayer) { - if (Edit == Editor->CurrentEdit) { Size *= 2.f; } + /* if (Edit == Editor->CurrentEdit) { Size *= 2.f; } */ DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); } } diff --git a/src/engine/editor.h b/src/engine/editor.h index 36d3bbd73..66d2a6134 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1306,7 +1306,7 @@ struct level_editor world_edit_layer *CurrentLayer; world_edit_layer *HotLayer; - world_edit *CurrentEdit; + world_edit_block_array_index_block_array SelectedEdits; world_edit *HotEdit; world_edit_brush_hashtable LoadedBrushes; From e183711081730208dc014af27f27ba93bb94b468 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 4 Jun 2025 13:22:45 -0700 Subject: [PATCH 258/421] WIP bulk edit edits --- generated/are_equal_world_edit_brush.h | 2 +- .../block_array_c_asset_thumbnail_688856411.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 2 +- generated/for_datatypes_kh9dwrCf.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...ing_and_value_tables_visible_region_size.h | 2 +- src/engine/editor.cpp | 99 ++++++++++--------- src/engine/editor.h | 38 ++++++- 112 files changed, 202 insertions(+), 155 deletions(-) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 7f7b02eed..a41737417 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1228:0 +// src/engine/editor.h:1230:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 0b24bd891..4f960e50c 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:121:0 +// src/engine/editor.cpp:108:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 80933fe0d..cdc13b01e 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1248:0 +// src/engine/editor.h:1250:0 diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 998f57981..7a4745abf 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1254:0 +// src/engine/editor.h:1256:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 9bb7c34f7..dbbecfad3 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1265:0 +// src/engine/editor.h:1267:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 15b9a49ec..2beb99a59 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1251:0 +// src/engine/editor.h:1253:0 diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 712c2be7b..5f684c5ae 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:317:0 +// src/engine/editor.cpp:304:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index f6e34eba6..9d107952c 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:478:0 +// src/engine/editor.cpp:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 49cd08ad2..c9a5bbb7a 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:470:0 +// src/engine/editor.cpp:457:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 5c0aed48a..92b675ff4 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:356:0 +// src/engine/editor.cpp:343:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 84b29f5b6..fe80ad7e4 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:323:0 +// src/engine/editor.cpp:310:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 711051f38..bc6a06d1b 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:256:0 +// src/engine/editor.cpp:243:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 623e21d60..26439bb31 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:381:0 +// src/engine/editor.cpp:368:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index af8fc526b..48bf55a8d 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:162:0 +// src/engine/editor.cpp:149:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index fbb1b4d6f..2b86d21f1 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:350:0 +// src/engine/editor.cpp:337:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 56d3ec238..e1b979bc5 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:411:0 +// src/engine/editor.cpp:398:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 7b03fa724..c9cffbcde 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:359:0 +// src/engine/editor.cpp:346:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 4cc23f46c..2d81f4467 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:481:0 +// src/engine/editor.cpp:468:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index a1f942f2d..ac7be92df 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:252:0 +// src/engine/editor.cpp:239:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 53d6192f2..39fcff808 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:528:0 +// src/engine/editor.cpp:529:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index f9ec880da..e62c1637c 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:549:0 +// src/engine/editor.cpp:550:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 5e596b1cd..c11562855 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:546:0 +// src/engine/editor.cpp:547:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 24a8bbe3e..e4e1094ff 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:437:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 48ff410ba..b2273c1dc 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:434:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 8515ee2cc..27edd492a 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:484:0 +// src/engine/editor.cpp:471:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 881c543c0..a345d18da 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:435:0 +// src/engine/editor.cpp:422:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 8dc4d0fa7..7085fec60 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:347:0 +// src/engine/editor.cpp:334:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 8149b3616..8b1c38077 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:504:0 +// src/engine/editor.cpp:505:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index e06c8e639..76bb61e50 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:498:0 +// src/engine/editor.cpp:499:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 0fac4e943..d9af536fe 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:417:0 +// src/engine/editor.cpp:404:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 38a6ebede..c3d36002e 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:420:0 +// src/engine/editor.cpp:407:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index b06ce45ca..60208e913 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:519:0 +// src/engine/editor.cpp:520:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 8f46012be..db8f9a3f2 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:543:0 +// src/engine/editor.cpp:544:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 09cb63da4..c9643e632 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:245:0 +// src/engine/editor.cpp:232:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 2c923904f..6ed1f5fbf 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:242:0 +// src/engine/editor.cpp:229:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index aa611a9e1..5ffd9166f 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:314:0 +// src/engine/editor.cpp:301:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 851fa53b9..db18fe64d 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:384:0 +// src/engine/editor.cpp:371:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index b542a9c1c..40aaac067 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:534:0 +// src/engine/editor.cpp:535:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index f53ae7b24..ce5ca13ea 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:501:0 +// src/engine/editor.cpp:502:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 55b2d8672..81a709daf 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:293:0 +// src/engine/editor.cpp:280:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index fd12ccd2b..6019e5082 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:423:0 +// src/engine/editor.cpp:410:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 3de55283b..9adee5256 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:426:0 +// src/engine/editor.cpp:413:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index ae38f425a..e164ee892 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:144:0 +// src/engine/editor.cpp:131:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 4eef62d0f..55cff99b4 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:460:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 563076b98..1c96f32f4 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:308:0 +// src/engine/editor.cpp:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 704016e64..d115478bc 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:311:0 +// src/engine/editor.cpp:298:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 4260d1b23..af7390ef7 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:140:0 +// src/engine/editor.cpp:127:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index d9c80145c..592cb962b 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:299:0 +// src/engine/editor.cpp:286:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index f1f72c12e..32ffef2c6 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:344:0 +// src/engine/editor.cpp:331:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index a17c4b20a..70161b3e4 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:248:0 +// src/engine/editor.cpp:235:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 631c95887..e111f8d02 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:302:0 +// src/engine/editor.cpp:289:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 7921d375f..330ef6c8c 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:492:0 +// src/engine/editor.cpp:493:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index c2fb6392e..1e7d355df 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:522:0 +// src/engine/editor.cpp:523:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 70ca603af..8fce38c87 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:296:0 +// src/engine/editor.cpp:283:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 272891258..60c3fd7f6 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:495:0 +// src/engine/editor.cpp:496:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index c623f7bab..fb756ebac 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:228:0 +// src/engine/editor.cpp:215:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 01c59add9..366af6959 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:160:0 +// src/engine/editor.cpp:147:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 9334825da..f5284ee7d 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:510:0 +// src/engine/editor.cpp:511:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 397bc2893..2efd652c3 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:513:0 +// src/engine/editor.cpp:514:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index da885fe5c..2e1dd16c7 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:507:0 +// src/engine/editor.cpp:508:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 227a4dd1b..77f502690 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:390:0 +// src/engine/editor.cpp:377:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index f4774cb7c..9533a833e 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:387:0 +// src/engine/editor.cpp:374:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 99ea2b195..ef14b342c 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:516:0 +// src/engine/editor.cpp:517:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 50b8b3843..fd2781636 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:353:0 +// src/engine/editor.cpp:340:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index aa6894da8..9436441f1 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:525:0 +// src/engine/editor.cpp:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 0f49a9b4b..89a9e6b0e 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:168:0 +// src/engine/editor.cpp:155:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 9be65b874..028f429d5 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:171:0 +// src/engine/editor.cpp:158:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index a0af06718..88aa5c656 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:326:0 +// src/engine/editor.cpp:313:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index d91b555c0..57776ddce 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:320:0 +// src/engine/editor.cpp:307:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 8c70a04a4..341985561 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:142:0 +// src/engine/editor.cpp:129:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 697626099..9d93cf3f7 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:414:0 +// src/engine/editor.cpp:401:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index c0cc3eb6d..596821b37 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:405:0 +// src/engine/editor.cpp:392:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index d9a28659a..25b79afdf 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:408:0 +// src/engine/editor.cpp:395:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index d775718b5..2ca7b710d 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:138:0 +// src/engine/editor.cpp:125:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 96ca17a84..15f09955b 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:239:0 +// src/engine/editor.cpp:226:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 6c7a0a03a..c94b06c62 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:236:0 +// src/engine/editor.cpp:223:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index ce2b612e1..9ebb9562f 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:463:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 3d4260532..746a54d77 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:457:0 +// src/engine/editor.cpp:444:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index f3fa1a4bf..3e37dcfc8 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:396:0 +// src/engine/editor.cpp:383:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index 217dff5e8..e6111be45 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:393:0 +// src/engine/editor.cpp:380:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 2be5df65e..b1d2e5465 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:152:0 +// src/engine/editor.cpp:139:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 984c848b0..c244a865e 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:148:0 +// src/engine/editor.cpp:135:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 9ce87bc6c..0c1edf443 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:150:0 +// src/engine/editor.cpp:137:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 433d06d6d..50d5a7579 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:454:0 +// src/engine/editor.cpp:441:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index c0a157086..9fe889861 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:429:0 +// src/engine/editor.cpp:416:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index 189740ccf..8dd8d8b2c 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:231:0 +// src/engine/editor.cpp:218:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index c37dff0ff..c6773d6c4 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:225:0 +// src/engine/editor.cpp:212:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 1eef25365..435fcbeb3 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:180:0 +// src/engine/editor.cpp:167:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 44c0750a4..815b73e81 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:165:0 +// src/engine/editor.cpp:152:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index 49a38674a..11d8e3b29 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:399:0 +// src/engine/editor.cpp:386:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index ce6cd105d..0ed26bff5 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:475:0 +// src/engine/editor.cpp:462:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index ed1043772..dae9ed93e 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:402:0 +// src/engine/editor.cpp:389:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 99a624c30..b48ef6d62 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:531:0 +// src/engine/editor.cpp:532:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index e92e924e9..d0fc0650b 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:284:0 +// src/engine/editor.cpp:271:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 771e7f460..051929a3c 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:281:0 +// src/engine/editor.cpp:268:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 542801ec2..875d457ba 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:432:0 +// src/engine/editor.cpp:419:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 32905c31e..3999ab568 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:305:0 +// src/engine/editor.cpp:292:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 3efb10948..4ba3db9b6 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:537:0 +// src/engine/editor.cpp:538:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index de1cc1ec2..3a9c8c3fd 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:540:0 +// src/engine/editor.cpp:541:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 1307e7c6c..f91bdd5f3 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:158:0 +// src/engine/editor.cpp:145:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index e44a10e5a..c3618cbb6 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:287:0 +// src/engine/editor.cpp:274:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index 7805af18c..279233ffb 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:134:0 +// src/engine/editor.cpp:121:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 35dddda05..cd85e3113 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:366:0 +// src/engine/editor.cpp:353:0 diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 73d278a7a..4c57a4561 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1231:0 +// src/engine/editor.h:1233:0 struct world_edit_brush_linked_list_node { diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 706e17e2b..0df7a4214 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:473:0 +// src/engine/editor.cpp:460:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index ddd409cb1..50ecd177b 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:277:0 +// src/engine/editor.cpp:264:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 1d062da4a..62ee8bba6 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:271:0 +// src/engine/editor.cpp:258:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index e3bf91f82..4f23d0385 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:268:0 +// src/engine/editor.cpp:255:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index f68d33f3c..4f50e0fe5 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:274:0 +// src/engine/editor.cpp:261:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index 72d28226a..8603147d2 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:132:0 +// src/engine/editor.cpp:119:0 link_internal counted_string ToStringPrefixless(visible_region_size Type) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index df70f7242..e70772952 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -84,13 +84,6 @@ InitEditor(level_editor *Editor) Editor->Edits.Memory = Editor->Memory; Editor->SelectedEdits.Memory = Editor->Memory; -/* RangeIterator(LayerIndex, MAX_BRUSH_LAYERS) */ -/* { */ -/* Editor->LayeredBrush.LayerPreviews[LayerIndex].Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); */ -/* } */ -/* Editor->LayeredBrush.SeedLayer.Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); */ -/* Editor->LayeredBrush.Preview.Thumbnail.Texture.Dim = V2i(BRUSH_PREVIEW_TEXTURE_DIM); */ - return Result; } @@ -102,12 +95,6 @@ HardResetEditor(level_editor *Editor) DeleteTexture(&Thumb->Texture); } - // @editor_chunk_memory_question - // - // I guess here we can actually just not worry about clearing it because - // it'll get realloc'd in the update path ..? Seems fine.. - /* DeallocateWorldChunk(&Editor->Noise.Chunk, &GetEngineResources()->MeshFreelist); */ - VaporizeArena(Editor->Memory); // NOTE(Jesse): There are some default values in noise params that we want to reset to @@ -488,6 +475,20 @@ poof(do_editor_ui_for_compound_type(entity_position_info)) +poof( + for_datatypes(all) + func (struct_t) { + struct_t.has_tag(do_editor_ui)? + { + do_editor_ui_for_compound_type(struct_t) + } + } + func (enum_t) {} +) +#include + + + poof(do_editor_ui_for_compound_type(render_buffers_2d)) #include @@ -774,6 +775,8 @@ DoSelectonModification( engine_resources *Engine, v3 UpdateVector = ConstrainUpdateVector(RoughUpdateVector, SelectionState->ClickedFace, SelectionMode); Result = ModifySelectionAABB(&SelectionAABB, V3i(UpdateVector), SelectionState->ClickedFace, SelectionMode); + Editor->Selection.Diff = UpdateVector; + { /* DEBUG_HighlightVoxel(Engine, SelectionState->ClickedP[0], RED); */ /* DEBUG_HighlightVoxel(Engine, SelectionState->ClickedP[1], BLUE); */ @@ -1440,57 +1443,37 @@ EditWorldSelection(engine_resources *Engine) if (Editor->Selection.ModState.ClickedFace) { - world_edit_selection_mode SelectionMode = {}; - - // Intentionally an el-if chain from most specific, to least. What's the alternative? - // - // Shift is resize - // Ctrl is move - // - if (Input->Shift.Pressed && Input->Ctrl.Pressed && Input->Alt.Pressed) - { - SelectionMode = SelectionMode_ResizeAllAxies; - } - else if (Input->Shift.Pressed && Input->Alt.Pressed) - { - SelectionMode = SelectionMode_ResizeBothLinearAxies; - } - else if (Input->Ctrl.Pressed && Input->Alt.Pressed) - { - SelectionMode = SelectionMode_TranslateLinear; - } - else if (Input->Shift.Pressed) - { - SelectionMode = SelectionMode_ResizeSingleLinearAxis; - } - else if (Input->Ctrl.Pressed) - { - SelectionMode = SelectionMode_TranslatePlanar; - } + world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); /* Info("%S", ToString(SelectionMode)); */ /* if (SelectionMode) { Ui->RequestedForceCapture = True; } */ rect3i ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB); - if (!Input->LMB.Pressed) +#if 1 + if (Input->LMB.Pressed == False) { // If we actually changed the selection region rect3cp ProposedSelection = SimSpaceToCanonical(World, &ModifiedSelection); // Make ModifiedSelection permanent Editor->Selection.Region = ProposedSelection; - Editor->Selection.ModState.ClickedFace = FaceIndex_None; - + /* Editor->Selection.ModState.ClickedFace = FaceIndex_None; */ } +#endif } } } } + // TODO(Jesse): Can we actually just cache the PrevRegion at the top of this + // function and check if we changed it like that? I guess that's not robust + // if we change it in other ways, but I don't think that's likely.. + // Don't fire selection changed event when dragging selection with selection edit tool if (Editor->Selection.Clicks != 1) + /* if (SelectionComplete(Editor->Selection.Clicks)) */ // NOTE(Jesse): Should be able to be this .. Didn't test { if (AreEqual(Editor->Selection.Region, Editor->Selection.PrevRegion)) { @@ -1676,7 +1659,7 @@ ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Temp UNPACK_ENGINE_RESOURCES(Engine); Assert(Edit->Tombstone == False); - Info("Updating Edit(%p)", Edit); + Info("Applying Edit(%p) to Octree", Edit); // Gather newly overlapping nodes and add the edit @@ -1793,6 +1776,28 @@ GetEditsSortedByOrdianl(world_edit_block_array *Edits, memory_arena *TempMem) } #endif + +link_internal void +ApplyDiffToEditBuffer(engine_resources *Engine, v3 Diff, world_edit_block_array_index_block_array *Edits) +{ + UNPACK_ENGINE_RESOURCES(Engine); + + IterateOver(Edits, EditI, EditII) + { + world_edit *Edit = GetPtr(&Editor->Edits, *EditI); + + world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); + + Assert(Engine->MaybeMouseRay.Tag == Maybe_Yes); + ray *Ray = &Engine->MaybeMouseRay.Ray; + aabb SelectionAABB = GetSimSpaceAABB(World, &Edit->Region); + rect3i ModifiedSelection = DoSelectonModification(Engine, Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB); + + rect3cp NewRegion = SimSpaceToCanonical(World, &ModifiedSelection); + UpdateWorldEditBounds(Engine, Edit, NewRegion, GetTranArena()); + } +} + link_internal void DoWorldEditor(engine_resources *Engine) { @@ -2077,6 +2082,11 @@ DoWorldEditor(engine_resources *Engine) // settings window detects and initializes new brushes if (SelectionComplete(Editor->Selection.Clicks) && Editor->CurrentBrush) { + if (Editor->Selection.Changed) + { + Info("Applying diff to edit buffer"); + ApplyDiffToEditBuffer(Engine, Editor->Selection.Diff, &Editor->SelectedEdits); + } /* if (Editor->Selection.Changed && CurrentEdit(Editor)) */ /* { */ /* UpdateWorldEditBounds(Engine, CurrentEdit(Editor), Editor->Selection.Region, GetTranArena()); */ @@ -2336,6 +2346,7 @@ DoWorldEditor(engine_resources *Engine) /* ++Duplicated->Ordinal; */ ApplyEditToOctree(Engine, Duplicated, GetTranArena()); + /* Editor->CurrentEdit = Duplicated; */ } break; diff --git a/src/engine/editor.h b/src/engine/editor.h index 66d2a6134..f96aca821 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1176,7 +1176,7 @@ struct asset_brush // NOTE(Jesse): This isn't really meant to be used outside the the level_editor // I just packed all the things together such that it's a bit more obvious // they're all for doing the selection -struct selection_region +struct selection_region poof(@do_editor_ui) { u32 Clicks; @@ -1190,6 +1190,8 @@ struct selection_region rect3cp Region; rect3cp PrevRegion; // Change detection + + v3 Diff; // When Changed is set, this should be nonzero. b32 Changed; selection_modification_state ModState; @@ -1377,6 +1379,40 @@ ComputeShapeAxisFromEditDim(v3 Dim) return Result; } +link_internal world_edit_selection_mode +ComputeSelectionMode(input *Input) +{ + world_edit_selection_mode SelectionMode = {}; + + // Intentionally an el-if chain from most specific, to least. What's the alternative? + // + // Shift is resize + // Ctrl is move + // + if (Input->Shift.Pressed && Input->Ctrl.Pressed && Input->Alt.Pressed) + { + SelectionMode = SelectionMode_ResizeAllAxies; + } + else if (Input->Shift.Pressed && Input->Alt.Pressed) + { + SelectionMode = SelectionMode_ResizeBothLinearAxies; + } + else if (Input->Ctrl.Pressed && Input->Alt.Pressed) + { + SelectionMode = SelectionMode_TranslateLinear; + } + else if (Input->Shift.Pressed) + { + SelectionMode = SelectionMode_ResizeSingleLinearAxis; + } + else if (Input->Ctrl.Pressed) + { + SelectionMode = SelectionMode_TranslatePlanar; + } + + return SelectionMode; +} + link_internal b32 CheckSettingsChanged(layered_brush *); From 5adaa4e96662e35955e4eea2ef67af098c07eb77 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 4 Jun 2025 14:34:41 -0700 Subject: [PATCH 259/421] Editor multi-select and edit nominally working --- generated/are_equal_world_edit_brush.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/for_datatypes_Bxw4Q7AW.h | 999 ++++++++++++++++++ generated/hashtable_world_edit_brush.h | 2 +- src/engine/editor.cpp | 20 +- src/engine/editor.h | 1 + 9 files changed, 1022 insertions(+), 10 deletions(-) create mode 100644 generated/for_datatypes_Bxw4Q7AW.h diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index a41737417..e90934c02 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1230:0 +// src/engine/editor.h:1231:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index cdc13b01e..11e62a0a5 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1250:0 +// src/engine/editor.h:1251:0 diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 7a4745abf..c6f663028 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1256:0 +// src/engine/editor.h:1257:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index dbbecfad3..f1d4f6b2a 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1267:0 +// src/engine/editor.h:1268:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 2beb99a59..5abd1d10e 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1253:0 +// src/engine/editor.h:1254:0 diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h new file mode 100644 index 000000000..54e5ee379 --- /dev/null +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -0,0 +1,999 @@ +// src/engine/editor.cpp:479:0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle selection_region", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("Clicks"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->Clicks), + MemberName, + Params + ); + + + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("Base"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cp*, &Element->Base), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("Region"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(rect3cp*, &Element->Region), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("PrevRegion"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(rect3cp*, &Element->PrevRegion), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("Diff"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Diff), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("Changed"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Changed), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("InitialSelect"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->InitialSelect), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("ModState"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(selection_modification_state*, &Element->ModState), + MemberName, + Params + ); + + + + + + + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 4c57a4561..d4535d46f 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1233:0 +// src/engine/editor.h:1234:0 struct world_edit_brush_linked_list_node { diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index e70772952..2fe935faf 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1448,9 +1448,8 @@ EditWorldSelection(engine_resources *Engine) /* Info("%S", ToString(SelectionMode)); */ /* if (SelectionMode) { Ui->RequestedForceCapture = True; } */ - rect3i ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB); - #if 1 + rect3i ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB); if (Input->LMB.Pressed == False) { // If we actually changed the selection region @@ -1458,7 +1457,6 @@ EditWorldSelection(engine_resources *Engine) // Make ModifiedSelection permanent Editor->Selection.Region = ProposedSelection; - /* Editor->Selection.ModState.ClickedFace = FaceIndex_None; */ } #endif } @@ -1481,6 +1479,7 @@ EditWorldSelection(engine_resources *Engine) } else { + Editor->Selection.InitialSelect; Editor->Selection.Changed = True; } Editor->Selection.PrevRegion = Editor->Selection.Region; @@ -1869,6 +1868,7 @@ DoWorldEditor(engine_resources *Engine) // // + Editor->Selection.InitialSelect = False; if ( UiCapturedMouseInput(Ui) == False && UiHoveredMouseInput(Ui) == False ) { @@ -1895,6 +1895,8 @@ DoWorldEditor(engine_resources *Engine) case 1: { Editor->Selection.Clicks += 1; + /* Info("Editor->Selection.InitialSelect"); */ + Editor->Selection.InitialSelect = True; if (Editor->PreviousTool) { @@ -2082,11 +2084,21 @@ DoWorldEditor(engine_resources *Engine) // settings window detects and initializes new brushes if (SelectionComplete(Editor->Selection.Clicks) && Editor->CurrentBrush) { - if (Editor->Selection.Changed) + if (Editor->Selection.InitialSelect) + { + Assert(AtElements(&Editor->SelectedEdits).Index == 1); + + auto EditIndex = GetPtr(&Editor->SelectedEdits, {}); + world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); + UpdateWorldEditBounds(Engine, Edit, Editor->Selection.Region, GetTranArena()); + } + else if (Editor->Selection.Changed) { Info("Applying diff to edit buffer"); ApplyDiffToEditBuffer(Engine, Editor->Selection.Diff, &Editor->SelectedEdits); + Editor->Selection.ModState.ClickedFace = FaceIndex_None; } + /* if (Editor->Selection.Changed && CurrentEdit(Editor)) */ /* { */ /* UpdateWorldEditBounds(Engine, CurrentEdit(Editor), Editor->Selection.Region, GetTranArena()); */ diff --git a/src/engine/editor.h b/src/engine/editor.h index f96aca821..c95cc9114 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1193,6 +1193,7 @@ struct selection_region poof(@do_editor_ui) v3 Diff; // When Changed is set, this should be nonzero. b32 Changed; + b32 InitialSelect; // Set when we go from a partial selection state -> fully selected selection_modification_state ModState; }; From de0198a5fdaeb7ef39be576b05dd621286420309 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 5 Jun 2025 11:02:18 -0700 Subject: [PATCH 260/421] Factor ModState update code out of DoSelectonModification --- src/engine/editor.cpp | 122 +++++++++++++++++++----------------------- 1 file changed, 56 insertions(+), 66 deletions(-) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 2fe935faf..508fb196a 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -724,36 +724,31 @@ HighlightFace(engine_resources *Engine, face_index Face, aabb SelectionAABB, r32 } } -link_internal rect3i -DoSelectonModification( engine_resources *Engine, - ray *MouseRay, - world_edit_selection_mode SelectionMode, - selection_modification_state *SelectionState, - aabb SelectionAABB ) +link_internal void +UpdateSelectionStateForFrame( ray *MouseRay, + camera *Camera, + input *Input, + world_edit_selection_mode SelectionMode, + selection_modification_state *SelectionState) { - UNPACK_ENGINE_RESOURCES(Engine); - rect3i Result = Rect3i(SelectionAABB); - - v3 Normal = {}; + v3 Normal = NormalForFace(SelectionState->ClickedFace); v3 PlaneN = {}; switch (SelectionMode) { - case SelectionMode_Noop: { return Result; } + case SelectionMode_Noop: { return; } case SelectionMode_TranslateLinear: case SelectionMode_ResizeSingleLinearAxis: case SelectionMode_ResizeBothLinearAxies: case SelectionMode_ResizeAllAxies: { - Normal = NormalForFace(SelectionState->ClickedFace); v3 PerpN = Cross(Normal, Camera->Front); PlaneN = Cross(Normal, PerpN); } break; case SelectionMode_TranslatePlanar: { - Normal = NormalForFace(SelectionState->ClickedFace); PlaneN = Normal; } break; } @@ -768,12 +763,21 @@ DoSelectonModification( engine_resources *Engine, SelectionState->ClickedP[1] = PlaneIntersect; } } +} +link_internal rect3i +DoSelectonModification( engine_resources *Engine, + ray *MouseRay, + world_edit_selection_mode SelectionMode, + selection_modification_state *SelectionState, + aabb SelectionAABB ) +{ + UNPACK_ENGINE_RESOURCES(Engine); v3 RoughUpdateVector = (SelectionState->ClickedP[1] - SelectionState->ClickedP[0]); v3 UpdateVector = ConstrainUpdateVector(RoughUpdateVector, SelectionState->ClickedFace, SelectionMode); - Result = ModifySelectionAABB(&SelectionAABB, V3i(UpdateVector), SelectionState->ClickedFace, SelectionMode); + rect3i Result = ModifySelectionAABB(&SelectionAABB, V3i(UpdateVector), SelectionState->ClickedFace, SelectionMode); Editor->Selection.Diff = UpdateVector; @@ -1384,6 +1388,9 @@ EditWorldSelection(engine_resources *Engine) aabb_intersect_result AABBTest = {}; + Editor->Selection.InitialSelect = False; + Editor->Selection.Changed = False; + #if 0 aabb TotalEditAreas = InvertedInfinityRectangle_rect3(); IterateOver(&Editor->SelectedEdits, EditIndex, EditIndexIndex) @@ -1410,20 +1417,14 @@ EditWorldSelection(engine_resources *Engine) } } - aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); - /* SelectionAABB = TotalEditAreas; */ { + aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); if (Engine->MaybeMouseRay.Tag == Maybe_Yes) { ray Ray = Engine->MaybeMouseRay.Ray; - /* Ray.Origin = GetSimSpaceP(World, Canonical_Position(World->ChunkDim, Ray.Origin, {})); */ AABBTest = Intersect(&SelectionAABB, &Ray); - face_index Face = AABBTest.Face; - /* PushColumn(Ui, CS(Face)); */ - /* PushNewRow(Ui); */ - if (Face) { /* r32 InsetWidth = 0.25f; */ @@ -1445,10 +1446,7 @@ EditWorldSelection(engine_resources *Engine) { world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); - /* Info("%S", ToString(SelectionMode)); */ - /* if (SelectionMode) { Ui->RequestedForceCapture = True; } */ - -#if 1 + UpdateSelectionStateForFrame( &Ray, Camera, Input, SelectionMode, &Editor->Selection.ModState ); rect3i ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB); if (Input->LMB.Pressed == False) { @@ -1458,33 +1456,61 @@ EditWorldSelection(engine_resources *Engine) // Make ModifiedSelection permanent Editor->Selection.Region = ProposedSelection; } -#endif } } } } + // Detect changes // TODO(Jesse): Can we actually just cache the PrevRegion at the top of this // function and check if we changed it like that? I guess that's not robust // if we change it in other ways, but I don't think that's likely.. + if (Input->LMB.Clicked) + { + switch (Editor->Selection.Clicks) + { + case 0: + { + if (Engine->MousedOverVoxel.Tag) + { + Editor->Selection.Clicks += 1; + auto MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value); + MouseP.Offset = Floor(MouseP.Offset); + Editor->Selection.Base = MouseP; + } + } break; + + case 1: + { + Editor->Selection.Clicks += 1; + Editor->Selection.InitialSelect = True; + } break; + + } + } + // Don't fire selection changed event when dragging selection with selection edit tool if (Editor->Selection.Clicks != 1) /* if (SelectionComplete(Editor->Selection.Clicks)) */ // NOTE(Jesse): Should be able to be this .. Didn't test { if (AreEqual(Editor->Selection.Region, Editor->Selection.PrevRegion)) { - Editor->Selection.Changed = False; + // Same as prev frame, Changed already reset at top of function } else { - Editor->Selection.InitialSelect; Editor->Selection.Changed = True; } Editor->Selection.PrevRegion = Editor->Selection.Region; } + if (Editor->Selection.InitialSelect) + { + Assert(Editor->Selection.Changed); + } + return AABBTest; } @@ -1868,46 +1894,15 @@ DoWorldEditor(engine_resources *Engine) // // - Editor->Selection.InitialSelect = False; if ( UiCapturedMouseInput(Ui) == False && UiHoveredMouseInput(Ui) == False ) { switch (Editor->Tool) { - case WorldEdit_Tool_Disabled: + case WorldEdit_Tool_Disabled: {} break; case WorldEdit_Tool_Select: { - if (Input->LMB.Clicked) - { switch (Editor->Selection.Clicks) - { - case 0: - { - if (Engine->MousedOverVoxel.Tag) - { - Editor->Selection.Clicks += 1; - auto MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value); - MouseP.Offset = Floor(MouseP.Offset); - Editor->Selection.Base = MouseP; - } - } break; - - case 1: - { - Editor->Selection.Clicks += 1; - /* Info("Editor->Selection.InitialSelect"); */ - Editor->Selection.InitialSelect = True; - - if (Editor->PreviousTool) - { - Editor->Tool = Editor->PreviousTool; - Editor->PreviousTool = {}; - } - } break; - - } - } - } break; case WorldEdit_Tool_Eyedropper: @@ -2086,8 +2081,8 @@ DoWorldEditor(engine_resources *Engine) { if (Editor->Selection.InitialSelect) { + Info("Setting Initial edit state"); Assert(AtElements(&Editor->SelectedEdits).Index == 1); - auto EditIndex = GetPtr(&Editor->SelectedEdits, {}); world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); UpdateWorldEditBounds(Engine, Edit, Editor->Selection.Region, GetTranArena()); @@ -2099,11 +2094,6 @@ DoWorldEditor(engine_resources *Engine) Editor->Selection.ModState.ClickedFace = FaceIndex_None; } - /* if (Editor->Selection.Changed && CurrentEdit(Editor)) */ - /* { */ - /* UpdateWorldEditBounds(Engine, CurrentEdit(Editor), Editor->Selection.Region, GetTranArena()); */ - /* } */ - b32 SettingsChanged = CheckSettingsChanged(&Editor->CurrentBrush->Layered); if (SettingsChanged) { From 0b709fb25f77bed737a310136008ba90f52e2ab8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 5 Jun 2025 11:20:52 -0700 Subject: [PATCH 261/421] Minor code shuffle and comments --- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- src/engine/editor.cpp | 91 +++++++++++-------- src/engine/editor.h | 1 + 28 files changed, 82 insertions(+), 62 deletions(-) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 85809581f..fa9f09fce 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:858:0 +// src/engine/editor.h:859:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 8ed9c0752..ac6d78d9f 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1118:0 +// src/engine/editor.h:1119:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index e90934c02..7be90252a 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1231:0 +// src/engine/editor.h:1232:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 11e62a0a5..cc9a4b903 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1251:0 +// src/engine/editor.h:1252:0 diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index c6f663028..3c58982cb 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1257:0 +// src/engine/editor.h:1258:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index f1d4f6b2a..33e7cad65 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1268:0 +// src/engine/editor.h:1269:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 5abd1d10e..cdef28d67 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1254:0 +// src/engine/editor.h:1255:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index dd342145f..ba8f8c9df 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1071:0 +// src/engine/editor.h:1072:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index e5b6beacb..2fdfb1f91 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:728:0 +// src/engine/editor.h:729:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index a460c9f30..d43e65eb0 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:886:0 +// src/engine/editor.h:887:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index fcdb27515..3ce556787 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1087:0 +// src/engine/editor.h:1088:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index dd2c46b22..76980744a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:892:0 +// src/engine/editor.h:893:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index f1b8196ef..a92ffdc9a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:875:0 +// src/engine/editor.h:876:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 66237a55f..ed8028a7a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:904:0 +// src/engine/editor.h:905:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index efa38ab8d..e5b1c73e3 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:897:0 +// src/engine/editor.h:898:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 64b84bc32..e1162070e 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:901:0 +// src/engine/editor.h:902:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index d4535d46f..b6a99df75 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1234:0 +// src/engine/editor.h:1235:0 struct world_edit_brush_linked_list_node { diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 8f2e8c708..9a28f3097 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:726:0 +// src/engine/editor.h:727:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index ca644e95c..fca13169a 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1085:0 +// src/engine/editor.h:1086:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 4b5537070..f55f69a1f 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1027:0 +// src/engine/editor.h:1028:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 0308026d8..172bd2b19 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:724:0 +// src/engine/editor.h:725:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index a4de3a880..7638330a3 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:889:0 +// src/engine/editor.h:890:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 2c22f005a..403cc05ec 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:872:0 +// src/engine/editor.h:873:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index fa6073010..cc8622bdf 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:895:0 +// src/engine/editor.h:896:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 446fff411..7bfa2af37 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:758:0 +// src/engine/editor.h:759:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index a0c43710c..7e8275a01 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:881:0 +// src/engine/editor.h:882:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 508fb196a..c4f325051 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1403,6 +1403,8 @@ EditWorldSelection(engine_resources *Engine) if (Editor->Selection.Clicks) { + // Hot update selection region before we click the second point + // if (SelectionIncomplete(Editor->Selection.Clicks)) { if (Engine->MousedOverVoxel.Tag) @@ -1417,8 +1419,13 @@ EditWorldSelection(engine_resources *Engine) } } + // Edit the selection region + // + aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); { - aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); + // If we're hovering a face and click, set ClickedFace, which is the + // source of truth that signals we're editing the selection region + // if (Engine->MaybeMouseRay.Tag == Maybe_Yes) { ray Ray = Engine->MaybeMouseRay.Ray; @@ -1427,13 +1434,6 @@ EditWorldSelection(engine_resources *Engine) face_index Face = AABBTest.Face; if (Face) { - /* r32 InsetWidth = 0.25f; */ - r32 InsetWidth = 0.f; - v3 HiColor = RGB_GREEN; - r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS*2.5f; - - HighlightFace(Engine, Face, SelectionAABB, InsetWidth, HiColor, HiThickness); - if ( Input->LMB.Clicked && (Input->Ctrl.Pressed || Input->Shift.Pressed || Input->Alt.Pressed) ) { v3 PlaneBaseP = Ray.Origin + (AABBTest.t*Ray.Dir); @@ -1442,6 +1442,9 @@ EditWorldSelection(engine_resources *Engine) } } + // If we're editing the selection region, Compute the proposed modification + // and make it permanent when we release the LMB + // if (Editor->Selection.ModState.ClickedFace) { world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); @@ -1458,52 +1461,68 @@ EditWorldSelection(engine_resources *Engine) } } } + + // Draw + { + auto Face = Editor->Selection.ModState.ClickedFace; + if (Face) + { + /* r32 InsetWidth = 0.25f; */ + r32 InsetWidth = 0.f; + v3 HiColor = RGB_GREEN; + r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS*2.5f; + + HighlightFace(Engine, Face, SelectionAABB, InsetWidth, HiColor, HiThickness); + } + } } } // Detect changes + // // TODO(Jesse): Can we actually just cache the PrevRegion at the top of this // function and check if we changed it like that? I guess that's not robust // if we change it in other ways, but I don't think that's likely.. - - if (Input->LMB.Clicked) { - switch (Editor->Selection.Clicks) + if (Input->LMB.Clicked) { - case 0: + switch (Editor->Selection.Clicks) { - if (Engine->MousedOverVoxel.Tag) + case 0: { - Editor->Selection.Clicks += 1; - auto MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value); - MouseP.Offset = Floor(MouseP.Offset); - Editor->Selection.Base = MouseP; - } - } break; + if (Engine->MousedOverVoxel.Tag) + { + Editor->Selection.Clicks += 1; + auto MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value); + MouseP.Offset = Floor(MouseP.Offset); + Editor->Selection.Base = MouseP; + } + } break; - case 1: - { - Editor->Selection.Clicks += 1; - Editor->Selection.InitialSelect = True; - } break; + case 1: + { + Editor->Selection.Clicks += 1; + Editor->Selection.InitialSelect = True; + } break; + } } - } - // Don't fire selection changed event when dragging selection with selection edit tool - if (Editor->Selection.Clicks != 1) - /* if (SelectionComplete(Editor->Selection.Clicks)) */ // NOTE(Jesse): Should be able to be this .. Didn't test - { - if (AreEqual(Editor->Selection.Region, Editor->Selection.PrevRegion)) + // Don't fire selection changed event when dragging selection with selection edit tool + if (Editor->Selection.Clicks != 1) + /* if (SelectionComplete(Editor->Selection.Clicks)) */ // NOTE(Jesse): Should be able to be this .. Didn't test { - // Same as prev frame, Changed already reset at top of function - } - else - { - Editor->Selection.Changed = True; + if (AreEqual(Editor->Selection.Region, Editor->Selection.PrevRegion)) + { + // Same as prev frame, Changed already reset at top of function + } + else + { + Editor->Selection.Changed = True; + } + Editor->Selection.PrevRegion = Editor->Selection.Region; } - Editor->Selection.PrevRegion = Editor->Selection.Region; } if (Editor->Selection.InitialSelect) diff --git a/src/engine/editor.h b/src/engine/editor.h index c95cc9114..406c13f3d 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -710,6 +710,7 @@ poof(do_editor_ui_for_compound_type(maybe_ray)) struct selection_modification_state { + // NOTE(Jesse): This is the source of truth for if we're modifying the selection face_index ClickedFace; v3 ClickedP[2]; }; From b46e6aa23146ec049d37bc3ccc352b5f17fafc0f Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 5 Jun 2025 11:25:44 -0700 Subject: [PATCH 262/421] Drawing code shuffle --- src/engine/editor.cpp | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index c4f325051..6f35f3467 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -781,17 +781,6 @@ DoSelectonModification( engine_resources *Engine, Editor->Selection.Diff = UpdateVector; - { - /* DEBUG_HighlightVoxel(Engine, SelectionState->ClickedP[0], RED); */ - /* DEBUG_HighlightVoxel(Engine, SelectionState->ClickedP[1], BLUE); */ - DEBUG_DrawSimSpaceVectorAt(Engine, SelectionState->ClickedP[0], UpdateVector, RGB_GREEN); - } - - // Draw selection modification region - // - rect3 Draw = Rect3(&Result); - DEBUG_DrawSimSpaceAABB(Engine, &Draw, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS); - Assert(Result.Min <= Result.Max); return Result; @@ -1422,6 +1411,7 @@ EditWorldSelection(engine_resources *Engine) // Edit the selection region // aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); + rect3i ModifiedSelection = {}; { // If we're hovering a face and click, set ClickedFace, which is the // source of truth that signals we're editing the selection region @@ -1450,7 +1440,7 @@ EditWorldSelection(engine_resources *Engine) world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); UpdateSelectionStateForFrame( &Ray, Camera, Input, SelectionMode, &Editor->Selection.ModState ); - rect3i ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB); + ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB); if (Input->LMB.Pressed == False) { // If we actually changed the selection region @@ -1474,6 +1464,12 @@ EditWorldSelection(engine_resources *Engine) HighlightFace(Engine, Face, SelectionAABB, InsetWidth, HiColor, HiThickness); } + + // Draw selection modification region + // + rect3 Draw = Rect3(&ModifiedSelection); + DEBUG_DrawSimSpaceAABB(Engine, &Draw, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS); + } } } From cb104a4ff8cb5d08fcd747c299522a4a61639f9f Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 5 Jun 2025 13:43:06 -0700 Subject: [PATCH 263/421] Much bigness -- multiselect with enclosing selection region working --- src/engine/canonical_position.cpp | 9 +++++ src/engine/editor.cpp | 64 +++++++++++++++++++++---------- src/engine/world.cpp | 4 +- src/engine/world_update.cpp | 8 ++-- 4 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src/engine/canonical_position.cpp b/src/engine/canonical_position.cpp index 2544414ee..b01d58abe 100644 --- a/src/engine/canonical_position.cpp +++ b/src/engine/canonical_position.cpp @@ -67,6 +67,15 @@ SimSpaceToCanonical(world *World, v3 P) return Result; } +link_internal rect3cp +SimSpaceToCanonical(world *World, rect3 *Rect) +{ + rect3cp Result = {}; + Result.Min = SimSpaceToCanonical(World, Rect->Min); + Result.Max = SimSpaceToCanonical(World, Rect->Max); + return Result; +} + link_internal rect3cp SimSpaceToCanonical(world *World, rect3i *Rect) { diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 6f35f3467..e169a456f 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -770,7 +770,8 @@ DoSelectonModification( engine_resources *Engine, ray *MouseRay, world_edit_selection_mode SelectionMode, selection_modification_state *SelectionState, - aabb SelectionAABB ) + aabb SelectionAABB, + v3 *Diff = 0) { UNPACK_ENGINE_RESOURCES(Engine); @@ -779,10 +780,12 @@ DoSelectonModification( engine_resources *Engine, v3 UpdateVector = ConstrainUpdateVector(RoughUpdateVector, SelectionState->ClickedFace, SelectionMode); rect3i Result = ModifySelectionAABB(&SelectionAABB, V3i(UpdateVector), SelectionState->ClickedFace, SelectionMode); - Editor->Selection.Diff = UpdateVector; + if (Diff) + { + *Diff = UpdateVector; + } Assert(Result.Min <= Result.Max); - return Result; } @@ -1378,15 +1381,20 @@ EditWorldSelection(engine_resources *Engine) aabb_intersect_result AABBTest = {}; Editor->Selection.InitialSelect = False; - Editor->Selection.Changed = False; + Editor->Selection.Changed = False; + Editor->Selection.Diff = {}; -#if 0 +#if 1 aabb TotalEditAreas = InvertedInfinityRectangle_rect3(); - IterateOver(&Editor->SelectedEdits, EditIndex, EditIndexIndex) + if (AtElements(&Editor->SelectedEdits).Index) { - world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); - aabb EditAABB = GetSimSpaceRect(World, Edit->Region); - TotalEditAreas = Union(&TotalEditAreas, &EditAABB); + IterateOver(&Editor->SelectedEdits, EditIndex, EditIndexIndex) + { + world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); + aabb EditAABB = GetSimSpaceRect(World, Edit->Region); + TotalEditAreas = Union(&TotalEditAreas, &EditAABB); + } + Editor->Selection.Region = SimSpaceToCanonical(World, &TotalEditAreas); } #endif @@ -1440,7 +1448,8 @@ EditWorldSelection(engine_resources *Engine) world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); UpdateSelectionStateForFrame( &Ray, Camera, Input, SelectionMode, &Editor->Selection.ModState ); - ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB); + v3 UpdateVector = {}; + ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB, &UpdateVector); if (Input->LMB.Pressed == False) { // If we actually changed the selection region @@ -1448,21 +1457,26 @@ EditWorldSelection(engine_resources *Engine) // Make ModifiedSelection permanent Editor->Selection.Region = ProposedSelection; + Editor->Selection.Diff = UpdateVector; } } } // Draw { - auto Face = Editor->Selection.ModState.ClickedFace; - if (Face) { - /* r32 InsetWidth = 0.25f; */ - r32 InsetWidth = 0.f; - v3 HiColor = RGB_GREEN; - r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS*2.5f; + auto Face = Editor->Selection.ModState.ClickedFace; + if (Face == FaceIndex_None) { Face = AABBTest.Face; } - HighlightFace(Engine, Face, SelectionAABB, InsetWidth, HiColor, HiThickness); + if (Face) + { + /* r32 InsetWidth = 0.25f; */ + r32 InsetWidth = 0.f; + v3 HiColor = RGB_GREEN; + r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS*2.5f; + + HighlightFace(Engine, Face, SelectionAABB, InsetWidth, HiColor, HiThickness); + } } // Draw selection modification region @@ -1502,6 +1516,9 @@ EditWorldSelection(engine_resources *Engine) Editor->Selection.InitialSelect = True; } break; + case 2: {} break; + + InvalidDefaultCase; } } @@ -2104,9 +2121,16 @@ DoWorldEditor(engine_resources *Engine) } else if (Editor->Selection.Changed) { - Info("Applying diff to edit buffer"); - ApplyDiffToEditBuffer(Engine, Editor->Selection.Diff, &Editor->SelectedEdits); - Editor->Selection.ModState.ClickedFace = FaceIndex_None; + if (LengthSq(Editor->Selection.Diff) > 0.f) + { + Info("Applying diff to edit buffer"); + ApplyDiffToEditBuffer(Engine, Editor->Selection.Diff, &Editor->SelectedEdits); + Editor->Selection.ModState.ClickedFace = FaceIndex_None; + } + else + { + // The selection area was probably just resizing to enclose multiple selected edits + } } b32 SettingsChanged = CheckSettingsChanged(&Editor->CurrentBrush->Layered); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 87cad2f74..4563d7dd8 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -150,7 +150,7 @@ GatherRangesOverlapping(world *World, rect3i SimSpaceAABB, world_chunk_ptr_buffe { world_chunk *Chunk = ChunkBuffer->Start[ChunkIndex]; auto SimSpaceChunkRect = GetSimSpaceAABBi(World, Chunk); - auto SimSpaceIntersectionRect = Union(&SimSpaceChunkRect, &SimSpaceAABB); + auto SimSpaceIntersectionRect = Intersection(&SimSpaceChunkRect, &SimSpaceAABB); auto SimSpaceIntersectionMin = SimSpaceIntersectionRect.Min; auto SimSpaceIntersectionMax = SimSpaceIntersectionRect.Max; @@ -188,7 +188,7 @@ GatherVoxelsOverlappingArea(world *World, rect3i SimSpaceAABB, world_chunk_ptr_b { world_chunk *Chunk = ChunkBuffer->Start[ChunkIndex]; auto SimSpaceChunkRect = GetSimSpaceAABBi(World, Chunk); - auto SimSpaceIntersectionRect = Union(&SimSpaceChunkRect, &SimSpaceAABB); + auto SimSpaceIntersectionRect = Intersection(&SimSpaceChunkRect, &SimSpaceAABB); auto SimSpaceIntersectionMin = SimSpaceIntersectionRect.Min; auto SimSpaceIntersectionMax = SimSpaceIntersectionRect.Max; diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 713f22e51..c307c1d55 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -1115,7 +1115,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ { world_chunk *Chunk = DestChunkBuffer[ChunkIndex]; auto SimSpaceChunkRect = GetSimSpaceAABBi(World, Chunk); - auto SimSpaceIntersectionRect = Union(&SimSpaceChunkRect, &SimSpaceUpdateBounds); + auto SimSpaceIntersectionRect = Intersection(&SimSpaceChunkRect, &SimSpaceUpdateBounds); auto SimSpaceIntersectionMin = SimSpaceIntersectionRect.Min; auto SimSpaceIntersectionMax = SimSpaceIntersectionRect.Max; @@ -1180,7 +1180,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ { world_chunk *Chunk = DestChunkBuffer[ChunkIndex]; auto SimSpaceChunkRect = GetSimSpaceAABBi(World, Chunk); - auto SimSpaceIntersectionRect = Union(&SimSpaceChunkRect, &SimSpaceUpdateBounds); + auto SimSpaceIntersectionRect = Intersection(&SimSpaceChunkRect, &SimSpaceUpdateBounds); auto SimSpaceIntersectionMin = SimSpaceIntersectionRect.Min; auto SimSpaceIntersectionMax = SimSpaceIntersectionRect.Max; @@ -1311,7 +1311,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ /* DrawStandingSpot(Mesh, V3(QueryRelChunkSpot), V3(Global_StandingSpotDim), TEAL, DEFAULT_STANDING_SPOT_THICKNESS*1.5f); */ } - auto SimSpaceSpotUnion = Union(&SimSpotAABB, &SimSpaceUpdateBounds); + auto SimSpaceSpotUnion = Intersection(&SimSpotAABB, &SimSpaceUpdateBounds); auto SimSpaceUnionDim = GetDim(SimSpaceSpotUnion); if (Volume(SimSpaceSpotUnion) == Volume(Global_StandingSpotDim)) // Cull { @@ -1349,7 +1349,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ voxel_position ChunkSpot = Chunk->StandingSpots.Start[ChunkStandingSpotIndex]; voxel_position ChunkSimSpot = ChunkSpot + SimSpaceChunkMin; rect3i ChunkSimSpotAABB = Rect3iMinDim(ChunkSimSpot, Global_StandingSpotDim); - if (Volume(Union(&SimSpotAABB, &ChunkSimSpotAABB))) + if (Volume(Intersection(&SimSpotAABB, &ChunkSimSpotAABB))) { Skip = true; break; From 87dd9a63c1662129e152f776aa07441f21a7bfe5 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 5 Jun 2025 21:34:20 -0700 Subject: [PATCH 264/421] WIP debugging PBO race condition --- external/bonsai_stdlib | 2 +- generated/are_equal_u32_hashtable_wrapper.h | 25 +++ generated/block_array_bitmap_688853862.h | 4 +- .../block_array_c_asset_thumbnail_688856411.h | 4 +- ...ntity_ptr_688856411_struct_struct_struct.h | 4 +- generated/block_array_c_gpu_timer_688735882.h | 4 +- .../block_array_c_shader_ptr_688853971.h | 4 +- generated/block_array_c_texture_688856411.h | 4 +- generated/block_array_c_u32_688856411.h | 4 +- generated/block_array_c_u8_cursor_688856411.h | 4 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 4 +- generated/block_array_entity_688856407.h | 4 +- ...lock_array_file_traversal_node_688853862.h | 4 +- ...lock_array_gpu_readback_buffer_688853862.h | 4 +- generated/block_array_h_u32_688856411.h | 2 +- generated/block_array_member_info_688856411.h | 4 +- generated/block_array_model_688856411.h | 4 +- .../block_array_octree_node_ptr_688853862.h | 4 +- ...block_array_picked_octree_node_688853862.h | 4 +- .../block_array_standing_spot_688853862.h | 4 +- generated/block_array_texture_ptr_688856411.h | 4 +- generated/block_array_vox_data_688856411.h | 4 +- ...lock_array_voxel_stack_element_688853862.h | 4 +- .../block_array_world_chunk_ptr_688853862.h | 4 +- generated/block_array_world_edit_688735882.h | 4 +- ...y_world_edit_block_array_index_688735882.h | 4 +- .../block_array_world_edit_layer_688735882.h | 4 +- .../block_array_world_edit_ptr_688735882.h | 4 +- generated/for_datatypes_0XxWqGSZ.h | 9 + generated/for_datatypes_Bxw4Q7AW.h | 9 + generated/for_datatypes_fkubhsYl.h | 9 + generated/for_datatypes_kv3WBTai.h | 9 + generated/hashtable_bonsai_type_info.h | 1 + generated/hashtable_counted_string.h | 1 + ...table_get_bonsai_type_info_902_689333910.h | 18 +- ...htable_get_ptr_ui_toggle_31501_688856534.h | 6 +- ...et_ptr_window_layout_705671517_599498827.h | 6 +- ...32_hashtable_wrapper_688719149_688856424.h | 67 +++++++ .../hashtable_get_ui_toggle_31501_688856534.h | 18 +- ...le_get_window_layout_705671517_599498827.h | 18 +- generated/hashtable_impl_u32.h | 175 ++++++++++++++++++ generated/hashtable_impl_ui_toggle.h | 1 + generated/hashtable_impl_window_layout.h | 1 + generated/hashtable_impl_xml_tag.h | 1 + generated/hashtable_parser.h | 1 + generated/hashtable_struct_u32.h | 16 ++ generated/hashtable_voxel_synth_tile.h | 1 + generated/hashtable_world_edit_brush.h | 1 + generated/maybe_u32.h | 8 + jesse.bonsai.rdbg | Bin 16663 -> 17178 bytes src/engine/editor.cpp | 10 +- src/engine/render_loop.cpp | 41 +++- 52 files changed, 477 insertions(+), 79 deletions(-) create mode 100644 generated/are_equal_u32_hashtable_wrapper.h create mode 100644 generated/hashtable_get_u32_hashtable_wrapper_688719149_688856424.h create mode 100644 generated/hashtable_impl_u32.h create mode 100644 generated/hashtable_struct_u32.h create mode 100644 generated/maybe_u32.h diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 21497fef2..c6a51d957 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 21497fef208d32e9e6457ff466c57ecb8f9f03e0 +Subproject commit c6a51d9570ba14c671c7a6d0cdc02ac8c09f6148 diff --git a/generated/are_equal_u32_hashtable_wrapper.h b/generated/are_equal_u32_hashtable_wrapper.h new file mode 100644 index 000000000..73e7cf232 --- /dev/null +++ b/generated/are_equal_u32_hashtable_wrapper.h @@ -0,0 +1,25 @@ +// external/bonsai_stdlib/src/primitive_containers.h:29:0 + +link_internal b32 +AreEqual(u32_hashtable_wrapper *Thing1, u32_hashtable_wrapper *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( u32_hashtable_wrapper ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(u32_hashtable_wrapper Thing1, u32_hashtable_wrapper Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( u32_hashtable_wrapper ) ); + + return Result; +} + diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index 34e6c175d..c602cd39c 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -286,7 +286,7 @@ RemoveOrdered( bitmap_block_array *Array, bitmap *Element ) link_internal bitmap_block_array_index Find( bitmap_block_array *Array, bitmap *Query) { - bitmap_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + bitmap_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( bitmap_block_array *Array, bitmap *Query) link_internal b32 IsValid(bitmap_block_array_index *Index) { - bitmap_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + bitmap_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 4f960e50c..aa921acab 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -97,7 +97,7 @@ RemoveOrdered( asset_thumbnail_block_array *Array, asset_thumbnail *Element ) link_internal asset_thumbnail_block_array_index Find( asset_thumbnail_block_array *Array, asset_thumbnail *Query) { - asset_thumbnail_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + asset_thumbnail_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -112,7 +112,7 @@ Find( asset_thumbnail_block_array *Array, asset_thumbnail *Query) link_internal b32 IsValid(asset_thumbnail_block_array_index *Index) { - asset_thumbnail_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + asset_thumbnail_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h index 08971c621..6afe2a27c 100644 --- a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h +++ b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h @@ -97,7 +97,7 @@ RemoveOrdered( entity_ptr_block_array *Array, entity_ptr Element ) link_internal entity_ptr_block_array_index Find( entity_ptr_block_array *Array, entity_ptr Query) { - entity_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + entity_ptr_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -112,7 +112,7 @@ Find( entity_ptr_block_array *Array, entity_ptr Query) link_internal b32 IsValid(entity_ptr_block_array_index *Index) { - entity_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + entity_ptr_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index 4b1e452e3..1a1872ad5 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -97,7 +97,7 @@ RemoveOrdered( gpu_timer_block_array *Array, gpu_timer *Element ) link_internal gpu_timer_block_array_index Find( gpu_timer_block_array *Array, gpu_timer *Query) { - gpu_timer_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + gpu_timer_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -112,7 +112,7 @@ Find( gpu_timer_block_array *Array, gpu_timer *Query) link_internal b32 IsValid(gpu_timer_block_array_index *Index) { - gpu_timer_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + gpu_timer_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index 47118df36..d93eaa7b9 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -97,7 +97,7 @@ RemoveOrdered( shader_ptr_block_array *Array, shader_ptr Element ) link_internal shader_ptr_block_array_index Find( shader_ptr_block_array *Array, shader_ptr Query) { - shader_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + shader_ptr_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -112,7 +112,7 @@ Find( shader_ptr_block_array *Array, shader_ptr Query) link_internal b32 IsValid(shader_ptr_block_array_index *Index) { - shader_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + shader_ptr_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index 2a9bde8e6..81753d0e4 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -97,7 +97,7 @@ RemoveOrdered( texture_block_array *Array, texture *Element ) link_internal texture_block_array_index Find( texture_block_array *Array, texture *Query) { - texture_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + texture_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -112,7 +112,7 @@ Find( texture_block_array *Array, texture *Query) link_internal b32 IsValid(texture_block_array_index *Index) { - texture_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + texture_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index a7e79f3d8..f59a1fb48 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -97,7 +97,7 @@ RemoveOrdered( u32_block_array *Array, u32 *Element ) link_internal u32_block_array_index Find( u32_block_array *Array, u32 *Query) { - u32_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + u32_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -112,7 +112,7 @@ Find( u32_block_array *Array, u32 *Query) link_internal b32 IsValid(u32_block_array_index *Index) { - u32_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + u32_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index 5a4ce6db0..fcb977509 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -97,7 +97,7 @@ RemoveOrdered( u8_cursor_block_array *Array, u8_cursor *Element ) link_internal u8_cursor_block_array_index Find( u8_cursor_block_array *Array, u8_cursor *Query) { - u8_cursor_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + u8_cursor_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -112,7 +112,7 @@ Find( u8_cursor_block_array *Array, u8_cursor *Query) link_internal b32 IsValid(u8_cursor_block_array_index *Index) { - u8_cursor_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + u8_cursor_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index e35f8e89a..435f567f4 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -286,7 +286,7 @@ RemoveOrdered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy link_internal dummy_work_queue_entry_build_chunk_mesh_block_array_index Find( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Query) { - dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_que link_internal b32 IsValid(dummy_work_queue_entry_build_chunk_mesh_block_array_index *Index) { - dummy_work_queue_entry_build_chunk_mesh_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + dummy_work_queue_entry_build_chunk_mesh_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index 507974d3f..9173385d7 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -286,7 +286,7 @@ RemoveOrdered( entity_block_array *Array, entity *Element ) link_internal entity_block_array_index Find( entity_block_array *Array, entity *Query) { - entity_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + entity_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( entity_block_array *Array, entity *Query) link_internal b32 IsValid(entity_block_array_index *Index) { - entity_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + entity_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index 4725de218..cfc36aed6 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -286,7 +286,7 @@ RemoveOrdered( file_traversal_node_block_array *Array, file_traversal_node *Elem link_internal file_traversal_node_block_array_index Find( file_traversal_node_block_array *Array, file_traversal_node *Query) { - file_traversal_node_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + file_traversal_node_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( file_traversal_node_block_array *Array, file_traversal_node *Query) link_internal b32 IsValid(file_traversal_node_block_array_index *Index) { - file_traversal_node_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + file_traversal_node_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index e64f7b0a1..255268434 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -286,7 +286,7 @@ RemoveOrdered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Elem link_internal gpu_readback_buffer_block_array_index Find( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Query) { - gpu_readback_buffer_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + gpu_readback_buffer_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Query) link_internal b32 IsValid(gpu_readback_buffer_block_array_index *Index) { - gpu_readback_buffer_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + gpu_readback_buffer_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_h_u32_688856411.h b/generated/block_array_h_u32_688856411.h index 8f07cbda0..88af9bffb 100644 --- a/generated/block_array_h_u32_688856411.h +++ b/generated/block_array_h_u32_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/primitive_containers.h:2:0 +// external/bonsai_stdlib/src/primitive_containers.h:14:0 diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index a38e21c39..aacf06cb0 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -286,7 +286,7 @@ RemoveOrdered( member_info_block_array *Array, member_info *Element ) link_internal member_info_block_array_index Find( member_info_block_array *Array, member_info *Query) { - member_info_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + member_info_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( member_info_block_array *Array, member_info *Query) link_internal b32 IsValid(member_info_block_array_index *Index) { - member_info_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + member_info_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 8216efabc..8188ffa9a 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -286,7 +286,7 @@ RemoveOrdered( model_block_array *Array, model *Element ) link_internal model_block_array_index Find( model_block_array *Array, model *Query) { - model_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + model_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( model_block_array *Array, model *Query) link_internal b32 IsValid(model_block_array_index *Index) { - model_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + model_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 1cecc01e5..d2516c12d 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -286,7 +286,7 @@ RemoveOrdered( octree_node_ptr_block_array *Array, octree_node_ptr Element ) link_internal octree_node_ptr_block_array_index Find( octree_node_ptr_block_array *Array, octree_node_ptr Query) { - octree_node_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + octree_node_ptr_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( octree_node_ptr_block_array *Array, octree_node_ptr Query) link_internal b32 IsValid(octree_node_ptr_block_array_index *Index) { - octree_node_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + octree_node_ptr_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 05bcb442f..06ecf1670 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -286,7 +286,7 @@ RemoveOrdered( picked_octree_node_block_array *Array, picked_octree_node *Elemen link_internal picked_octree_node_block_array_index Find( picked_octree_node_block_array *Array, picked_octree_node *Query) { - picked_octree_node_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + picked_octree_node_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( picked_octree_node_block_array *Array, picked_octree_node *Query) link_internal b32 IsValid(picked_octree_node_block_array_index *Index) { - picked_octree_node_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + picked_octree_node_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 4649ad56f..d814baf80 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -286,7 +286,7 @@ RemoveOrdered( standing_spot_block_array *Array, standing_spot *Element ) link_internal standing_spot_block_array_index Find( standing_spot_block_array *Array, standing_spot *Query) { - standing_spot_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + standing_spot_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( standing_spot_block_array *Array, standing_spot *Query) link_internal b32 IsValid(standing_spot_block_array_index *Index) { - standing_spot_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + standing_spot_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index 5b9123a1f..ac7170cbb 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -97,7 +97,7 @@ RemoveOrdered( texture_ptr_block_array *Array, texture_ptr Element ) link_internal texture_ptr_block_array_index Find( texture_ptr_block_array *Array, texture_ptr Query) { - texture_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + texture_ptr_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -112,7 +112,7 @@ Find( texture_ptr_block_array *Array, texture_ptr Query) link_internal b32 IsValid(texture_ptr_block_array_index *Index) { - texture_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + texture_ptr_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index 3bbecaa17..e3f88756c 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -286,7 +286,7 @@ RemoveOrdered( vox_data_block_array *Array, vox_data *Element ) link_internal vox_data_block_array_index Find( vox_data_block_array *Array, vox_data *Query) { - vox_data_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + vox_data_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( vox_data_block_array *Array, vox_data *Query) link_internal b32 IsValid(vox_data_block_array_index *Index) { - vox_data_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + vox_data_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index ac3d0ea70..e68ca98fd 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -286,7 +286,7 @@ RemoveOrdered( voxel_stack_element_block_array *Array, voxel_stack_element *Elem link_internal voxel_stack_element_block_array_index Find( voxel_stack_element_block_array *Array, voxel_stack_element *Query) { - voxel_stack_element_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + voxel_stack_element_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( voxel_stack_element_block_array *Array, voxel_stack_element *Query) link_internal b32 IsValid(voxel_stack_element_block_array_index *Index) { - voxel_stack_element_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + voxel_stack_element_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index 6024672b3..4a60c844b 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -97,7 +97,7 @@ RemoveOrdered( world_chunk_ptr_block_array *Array, world_chunk_ptr Element ) link_internal world_chunk_ptr_block_array_index Find( world_chunk_ptr_block_array *Array, world_chunk_ptr Query) { - world_chunk_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + world_chunk_ptr_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -112,7 +112,7 @@ Find( world_chunk_ptr_block_array *Array, world_chunk_ptr Query) link_internal b32 IsValid(world_chunk_ptr_block_array_index *Index) { - world_chunk_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + world_chunk_ptr_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index cc9a4b903..ed7f80724 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -286,7 +286,7 @@ RemoveOrdered( world_edit_block_array *Array, world_edit *Element ) link_internal world_edit_block_array_index Find( world_edit_block_array *Array, world_edit *Query) { - world_edit_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + world_edit_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( world_edit_block_array *Array, world_edit *Query) link_internal b32 IsValid(world_edit_block_array_index *Index) { - world_edit_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + world_edit_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 3c58982cb..b2ad3edd2 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -286,7 +286,7 @@ RemoveOrdered( world_edit_block_array_index_block_array *Array, world_edit_block link_internal world_edit_block_array_index_block_array_index Find( world_edit_block_array_index_block_array *Array, world_edit_block_array_index *Query) { - world_edit_block_array_index_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + world_edit_block_array_index_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( world_edit_block_array_index_block_array *Array, world_edit_block_array_in link_internal b32 IsValid(world_edit_block_array_index_block_array_index *Index) { - world_edit_block_array_index_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + world_edit_block_array_index_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 33e7cad65..298015d43 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -286,7 +286,7 @@ RemoveOrdered( world_edit_layer_block_array *Array, world_edit_layer *Element ) link_internal world_edit_layer_block_array_index Find( world_edit_layer_block_array *Array, world_edit_layer *Query) { - world_edit_layer_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + world_edit_layer_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( world_edit_layer_block_array *Array, world_edit_layer *Query) link_internal b32 IsValid(world_edit_layer_block_array_index *Index) { - world_edit_layer_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + world_edit_layer_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index cdef28d67..409585c57 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -286,7 +286,7 @@ RemoveOrdered( world_edit_ptr_block_array *Array, world_edit_ptr Element ) link_internal world_edit_ptr_block_array_index Find( world_edit_ptr_block_array *Array, world_edit_ptr Query) { - world_edit_ptr_block_array_index Result = INVALID_BLOCK_ARRAY_INDEX; + world_edit_ptr_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { if ( E == Query) @@ -301,7 +301,7 @@ Find( world_edit_ptr_block_array *Array, world_edit_ptr Query) link_internal b32 IsValid(world_edit_ptr_block_array_index *Index) { - world_edit_ptr_block_array_index Test = INVALID_BLOCK_ARRAY_INDEX; + world_edit_ptr_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; b32 Result = (AreEqual(Index, &Test) == False); return Result; } diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 1cb1d56cc..c84a026d5 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -743,6 +743,14 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + + + + + + @@ -774,3 +782,4 @@ WorkQueueEntryAsyncFunction( draw_lod_async_params *Params ) + diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 54e5ee379..7b2b2d6e6 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -351,6 +351,10 @@ + + + + @@ -991,6 +995,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs + + + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 092ba02e4..80b5078ea 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -733,6 +733,14 @@ render_to_texture_async_params render_to_texture_async_params; + + + + + + + + @@ -755,3 +763,4 @@ draw_lod_async_params draw_lod_async_params; + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 85655f799..18a5e9974 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -733,6 +733,14 @@ type_render_to_texture_async_params, + + + + + + + + @@ -755,3 +763,4 @@ type_draw_lod_async_params, + diff --git a/generated/hashtable_bonsai_type_info.h b/generated/hashtable_bonsai_type_info.h index 42df0c890..d1f2d17c0 100644 --- a/generated/hashtable_bonsai_type_info.h +++ b/generated/hashtable_bonsai_type_info.h @@ -184,4 +184,5 @@ TryGetPtr(bonsai_type_info_hashtable *Hashtable, bonsai_type_info_hashtable_iter { return GetPtr(Hashtable, Iterator); } + diff --git a/generated/hashtable_counted_string.h b/generated/hashtable_counted_string.h index 1c14dcf81..3c9b8c41b 100644 --- a/generated/hashtable_counted_string.h +++ b/generated/hashtable_counted_string.h @@ -184,4 +184,5 @@ TryGetPtr(counted_string_hashtable *Hashtable, counted_string_hashtable_iterator { return GetPtr(Hashtable, Iterator); } + diff --git a/generated/hashtable_get_bonsai_type_info_902_689333910.h b/generated/hashtable_get_bonsai_type_info_902_689333910.h index 2eb72319c..6ae218e72 100644 --- a/generated/hashtable_get_bonsai_type_info_902_689333910.h +++ b/generated/hashtable_get_bonsai_type_info_902_689333910.h @@ -1,18 +1,19 @@ // src/engine/bonsai_type_info.h:46:0 bonsai_type_info_linked_list_node* -GetBucketByName( bonsai_type_info_hashtable *Table, cs Name ) +GetBucketByName( bonsai_type_info_hashtable *Table, cs Query ) { /* ENSURE_OWNED_BY_THREAD(Table); */ bonsai_type_info_linked_list_node* Result = {}; - auto *Bucket = GetHashBucket(umm(Hash(&Name)), Table); + auto *Bucket = GetHashBucket(umm(Hash(&Query)), Table); while (Bucket) { auto E = &Bucket->Element; - if (Bucket->Tombstoned == False && AreEqual(E->Name, Name)) + if (Bucket->Tombstoned == False && AreEqual(E->Name, Query)) + { Result = Bucket; break; @@ -27,13 +28,13 @@ GetBucketByName( bonsai_type_info_hashtable *Table, cs Name ) } maybe_bonsai_type_info -GetByName( bonsai_type_info_hashtable *Table, cs Name ) +GetByName( bonsai_type_info_hashtable *Table, cs Query ) { /* ENSURE_OWNED_BY_THREAD(Table); */ maybe_bonsai_type_info Result = {}; - bonsai_type_info_linked_list_node *Bucket = GetBucketByName(Table, Name); + bonsai_type_info_linked_list_node *Bucket = GetBucketByName(Table, Query); if (Bucket) { Result.Tag = Maybe_Yes; @@ -43,6 +44,7 @@ GetByName( bonsai_type_info_hashtable *Table, cs Name ) return Result; } + link_internal b32 Tombstone(cs Key, bonsai_type_info_hashtable *Table, memory_arena *Memory) { @@ -57,3 +59,9 @@ Tombstone(cs Key, bonsai_type_info_hashtable *Table, memory_arena *Memory) return Result; } +link_internal b32 +Drop( bonsai_type_info_hashtable *Table, cs Key ) +{ + return Tombstone(Key, Table, 0); +} + diff --git a/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h b/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h index 1598bf745..670a502fb 100644 --- a/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h +++ b/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h @@ -1,18 +1,18 @@ // external/bonsai_stdlib/src/ui/ui.cpp:13:0 maybe_ui_toggle_ptr -GetPtrById( ui_toggle_hashtable *Table, ui_id Id ) +GetPtrById( ui_toggle_hashtable *Table, ui_id Query ) { /* ENSURE_OWNED_BY_THREAD(Table); */ maybe_ui_toggle_ptr Result = {}; - auto *Bucket = GetHashBucket(umm(Hash(&Id)), Table); + auto *Bucket = GetHashBucket(umm(Hash(&Query)), Table); while (Bucket) { auto E = &Bucket->Element; - if (Bucket->Tombstoned == False && AreEqual(E->Id, Id)) + if (Bucket->Tombstoned == False && AreEqual(E->Id, Query)) { Result.Tag = Maybe_Yes; Result.Value = E; diff --git a/generated/hashtable_get_ptr_window_layout_705671517_599498827.h b/generated/hashtable_get_ptr_window_layout_705671517_599498827.h index 341f383a6..c4a321042 100644 --- a/generated/hashtable_get_ptr_window_layout_705671517_599498827.h +++ b/generated/hashtable_get_ptr_window_layout_705671517_599498827.h @@ -1,18 +1,18 @@ // external/bonsai_stdlib/src/ui/ui.cpp:22:0 maybe_window_layout_ptr -GetPtrByHashtableKey( window_layout_hashtable *Table, ui_id HashtableKey ) +GetPtrByHashtableKey( window_layout_hashtable *Table, ui_id Query ) { /* ENSURE_OWNED_BY_THREAD(Table); */ maybe_window_layout_ptr Result = {}; - auto *Bucket = GetHashBucket(umm(Hash(&HashtableKey)), Table); + auto *Bucket = GetHashBucket(umm(Hash(&Query)), Table); while (Bucket) { auto E = &Bucket->Element; - if (Bucket->Tombstoned == False && AreEqual(E->HashtableKey, HashtableKey)) + if (Bucket->Tombstoned == False && AreEqual(E->HashtableKey, Query)) { Result.Tag = Maybe_Yes; Result.Value = E; diff --git a/generated/hashtable_get_u32_hashtable_wrapper_688719149_688856424.h b/generated/hashtable_get_u32_hashtable_wrapper_688719149_688856424.h new file mode 100644 index 000000000..38fb6256e --- /dev/null +++ b/generated/hashtable_get_u32_hashtable_wrapper_688719149_688856424.h @@ -0,0 +1,67 @@ +// external/bonsai_stdlib/src/primitive_containers.cpp:8:0 + +u32_linked_list_node* +GetBucketByValue( u32_hashtable *Table, u32 Query ) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + u32_linked_list_node* Result = {}; + + auto *Bucket = GetHashBucket(umm(Hash(&Query)), Table); + while (Bucket) + { + auto E = &Bucket->Element; + + if (Bucket->Tombstoned == False && AreEqual(*E, Query)) + + { + Result = Bucket; + break; + } + else + { + Bucket = Bucket->Next; + } + } + + return Result; +} + +maybe_u32 +GetByValue( u32_hashtable *Table, u32 Query ) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + maybe_u32 Result = {}; + + u32_linked_list_node *Bucket = GetBucketByValue(Table, Query); + if (Bucket) + { + Result.Tag = Maybe_Yes; + Result.Value = Bucket->Element; + } + + return Result; +} + + +link_internal b32 +Tombstone(u32 Key, u32_hashtable *Table, memory_arena *Memory) +{ + b32 Result = False; + u32_linked_list_node *Bucket = GetBucketByValue(Table, Key); + if (Bucket) + { + Assert(Bucket->Tombstoned == False); + Bucket->Tombstoned = True; + Result = True; + } + return Result; +} + +link_internal b32 +Drop( u32_hashtable *Table, u32 Key ) +{ + return Tombstone(Key, Table, 0); +} + diff --git a/generated/hashtable_get_ui_toggle_31501_688856534.h b/generated/hashtable_get_ui_toggle_31501_688856534.h index a67d09042..863b4dcbd 100644 --- a/generated/hashtable_get_ui_toggle_31501_688856534.h +++ b/generated/hashtable_get_ui_toggle_31501_688856534.h @@ -1,18 +1,19 @@ // external/bonsai_stdlib/src/ui/ui.cpp:10:0 ui_toggle_linked_list_node* -GetBucketById( ui_toggle_hashtable *Table, ui_id Id ) +GetBucketById( ui_toggle_hashtable *Table, ui_id Query ) { /* ENSURE_OWNED_BY_THREAD(Table); */ ui_toggle_linked_list_node* Result = {}; - auto *Bucket = GetHashBucket(umm(Hash(&Id)), Table); + auto *Bucket = GetHashBucket(umm(Hash(&Query)), Table); while (Bucket) { auto E = &Bucket->Element; - if (Bucket->Tombstoned == False && AreEqual(E->Id, Id)) + if (Bucket->Tombstoned == False && AreEqual(E->Id, Query)) + { Result = Bucket; break; @@ -27,13 +28,13 @@ GetBucketById( ui_toggle_hashtable *Table, ui_id Id ) } maybe_ui_toggle -GetById( ui_toggle_hashtable *Table, ui_id Id ) +GetById( ui_toggle_hashtable *Table, ui_id Query ) { /* ENSURE_OWNED_BY_THREAD(Table); */ maybe_ui_toggle Result = {}; - ui_toggle_linked_list_node *Bucket = GetBucketById(Table, Id); + ui_toggle_linked_list_node *Bucket = GetBucketById(Table, Query); if (Bucket) { Result.Tag = Maybe_Yes; @@ -43,6 +44,7 @@ GetById( ui_toggle_hashtable *Table, ui_id Id ) return Result; } + link_internal b32 Tombstone(ui_id Key, ui_toggle_hashtable *Table, memory_arena *Memory) { @@ -57,3 +59,9 @@ Tombstone(ui_id Key, ui_toggle_hashtable *Table, memory_arena *Memory) return Result; } +link_internal b32 +Drop( ui_toggle_hashtable *Table, ui_id Key ) +{ + return Tombstone(Key, Table, 0); +} + diff --git a/generated/hashtable_get_window_layout_705671517_599498827.h b/generated/hashtable_get_window_layout_705671517_599498827.h index c087aaa46..b71709d3e 100644 --- a/generated/hashtable_get_window_layout_705671517_599498827.h +++ b/generated/hashtable_get_window_layout_705671517_599498827.h @@ -1,18 +1,19 @@ // external/bonsai_stdlib/src/ui/ui.cpp:20:0 window_layout_linked_list_node* -GetBucketByHashtableKey( window_layout_hashtable *Table, ui_id HashtableKey ) +GetBucketByHashtableKey( window_layout_hashtable *Table, ui_id Query ) { /* ENSURE_OWNED_BY_THREAD(Table); */ window_layout_linked_list_node* Result = {}; - auto *Bucket = GetHashBucket(umm(Hash(&HashtableKey)), Table); + auto *Bucket = GetHashBucket(umm(Hash(&Query)), Table); while (Bucket) { auto E = &Bucket->Element; - if (Bucket->Tombstoned == False && AreEqual(E->HashtableKey, HashtableKey)) + if (Bucket->Tombstoned == False && AreEqual(E->HashtableKey, Query)) + { Result = Bucket; break; @@ -27,13 +28,13 @@ GetBucketByHashtableKey( window_layout_hashtable *Table, ui_id HashtableKey ) } maybe_window_layout -GetByHashtableKey( window_layout_hashtable *Table, ui_id HashtableKey ) +GetByHashtableKey( window_layout_hashtable *Table, ui_id Query ) { /* ENSURE_OWNED_BY_THREAD(Table); */ maybe_window_layout Result = {}; - window_layout_linked_list_node *Bucket = GetBucketByHashtableKey(Table, HashtableKey); + window_layout_linked_list_node *Bucket = GetBucketByHashtableKey(Table, Query); if (Bucket) { Result.Tag = Maybe_Yes; @@ -43,6 +44,7 @@ GetByHashtableKey( window_layout_hashtable *Table, ui_id HashtableKey ) return Result; } + link_internal b32 Tombstone(ui_id Key, window_layout_hashtable *Table, memory_arena *Memory) { @@ -57,3 +59,9 @@ Tombstone(ui_id Key, window_layout_hashtable *Table, memory_arena *Memory) return Result; } +link_internal b32 +Drop( window_layout_hashtable *Table, ui_id Key ) +{ + return Tombstone(Key, Table, 0); +} + diff --git a/generated/hashtable_impl_u32.h b/generated/hashtable_impl_u32.h new file mode 100644 index 000000000..86b1eb8a5 --- /dev/null +++ b/generated/hashtable_impl_u32.h @@ -0,0 +1,175 @@ +// external/bonsai_stdlib/src/primitive_containers.cpp:5:0 + +link_internal b32 AreEqual(u32_linked_list_node *Node1, u32_linked_list_node *Node2 ); + +link_internal u32_linked_list_node * +Allocate_u32_linked_list_node(memory_arena *Memory) +{ + u32_linked_list_node *Result = Allocate( u32_linked_list_node, Memory, 1); + return Result; +} + +link_internal u32_hashtable +Allocate_u32_hashtable(umm ElementCount, memory_arena *Memory) +{ + u32_hashtable Result = { + .Elements = Allocate( u32_linked_list_node*, Memory, ElementCount), + .Size = ElementCount, + /* OWNED_BY_THREAD_MEMBER_INIT() */ + }; + return Result; +} + +link_internal u32_linked_list_node * +GetHashBucket(umm HashValue, u32_hashtable *Table) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + Assert(Table->Size); + u32_linked_list_node *Result = Table->Elements[HashValue % Table->Size]; + return Result; +} + +link_internal u32 * +GetFirstAtBucket(umm HashValue, u32_hashtable *Table) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + u32_linked_list_node *Bucket = GetHashBucket(HashValue, Table); + u32 *Result = &Bucket->Element; + return Result; +} + +link_internal u32_linked_list_node** +GetMatchingBucket(u32 Element, u32_hashtable *Table, memory_arena *Memory) +{ + umm HashValue = Hash(&Element) % Table->Size; + u32_linked_list_node **Bucket = Table->Elements + HashValue; + while (*Bucket) + { + if (AreEqual(&Bucket[0]->Element, &Element)) { break; } + Bucket = &(*Bucket)->Next; + } + return Bucket; +} + +link_internal u32 * +Insert(u32_linked_list_node *Node, u32_hashtable *Table) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + Assert(Table->Size); + umm HashValue = Hash(&Node->Element) % Table->Size; + u32_linked_list_node **Bucket = Table->Elements + HashValue; + while (*Bucket) + { + /* Assert(!AreEqual(*Bucket, Node)); */ + Bucket = &(*Bucket)->Next; + } + *Bucket = Node; + return &Bucket[0]->Element; +} + +link_internal u32* +Insert(u32 Element, u32_hashtable *Table, memory_arena *Memory) +{ + /* ENSURE_OWNED_BY_THREAD(Table); */ + + u32_linked_list_node *Bucket = Allocate_u32_linked_list_node(Memory); + Bucket->Element = Element; + Insert(Bucket, Table); + return &Bucket->Element; +} + +link_internal u32* +Upsert(u32 Element, u32_hashtable *Table, memory_arena *Memory) +{ + umm HashValue = Hash(&Element) % Table->Size; + u32_linked_list_node **Bucket = Table->Elements + HashValue; + while (*Bucket) + { + if (AreEqual(&Bucket[0]->Element, &Element)) { break; } + Bucket = &(*Bucket)->Next; + } + + if (*Bucket && Bucket[0]->Tombstoned == False) + { + Bucket[0]->Element = Element; + } + else + { + Insert(Element, Table, Memory); + } + + return &Bucket[0]->Element; +} + + +// +// Iterator impl. +// + +struct u32_hashtable_iterator +{ + umm HashIndex; + u32_hashtable *Table; + u32_linked_list_node *Node; +}; + +link_internal u32_hashtable_iterator +operator++( u32_hashtable_iterator &Iterator ) +{ + if (Iterator.Node) + { + Iterator.Node = Iterator.Node->Next; + } + else + { + Assert (Iterator.HashIndex < Iterator.Table->Size ); + Iterator.Node = Iterator.Table->Elements[++Iterator.HashIndex]; + } + + return Iterator; +} + +link_internal b32 +operator<( u32_hashtable_iterator I0, u32_hashtable_iterator I1) +{ + b32 Result = I0.HashIndex < I1.HashIndex; + return Result; +} + +link_inline u32_hashtable_iterator +ZerothIndex(u32_hashtable *Hashtable) +{ + u32_hashtable_iterator Iterator = {}; + Iterator.Table = Hashtable; + Iterator.Node = Hashtable->Elements[0]; + return Iterator; +} + +link_inline u32_hashtable_iterator +AtElements(u32_hashtable *Hashtable) +{ + u32_hashtable_iterator Result = { Hashtable->Size, 0, 0 }; + return Result; +} + +link_inline u32 * +GetPtr(u32_hashtable *Hashtable, u32_hashtable_iterator Iterator) +{ + u32 *Result = {}; + if (Iterator.Node) + { + Result = &Iterator.Node->Element; + } + return Result; +} + +link_inline u32 * +TryGetPtr(u32_hashtable *Hashtable, u32_hashtable_iterator Iterator) +{ + return GetPtr(Hashtable, Iterator); +} + + diff --git a/generated/hashtable_impl_ui_toggle.h b/generated/hashtable_impl_ui_toggle.h index 89ed2a8d5..7b7d0f6a4 100644 --- a/generated/hashtable_impl_ui_toggle.h +++ b/generated/hashtable_impl_ui_toggle.h @@ -172,3 +172,4 @@ TryGetPtr(ui_toggle_hashtable *Hashtable, ui_toggle_hashtable_iterator Iterator) return GetPtr(Hashtable, Iterator); } + diff --git a/generated/hashtable_impl_window_layout.h b/generated/hashtable_impl_window_layout.h index eb317ece4..797294452 100644 --- a/generated/hashtable_impl_window_layout.h +++ b/generated/hashtable_impl_window_layout.h @@ -172,3 +172,4 @@ TryGetPtr(window_layout_hashtable *Hashtable, window_layout_hashtable_iterator I return GetPtr(Hashtable, Iterator); } + diff --git a/generated/hashtable_impl_xml_tag.h b/generated/hashtable_impl_xml_tag.h index fec9287ab..9a8ae79d6 100644 --- a/generated/hashtable_impl_xml_tag.h +++ b/generated/hashtable_impl_xml_tag.h @@ -172,3 +172,4 @@ TryGetPtr(xml_tag_hashtable *Hashtable, xml_tag_hashtable_iterator Iterator) return GetPtr(Hashtable, Iterator); } + diff --git a/generated/hashtable_parser.h b/generated/hashtable_parser.h index 4ee75d839..5a75f81a8 100644 --- a/generated/hashtable_parser.h +++ b/generated/hashtable_parser.h @@ -184,4 +184,5 @@ TryGetPtr(parser_hashtable *Hashtable, parser_hashtable_iterator Iterator) { return GetPtr(Hashtable, Iterator); } + diff --git a/generated/hashtable_struct_u32.h b/generated/hashtable_struct_u32.h new file mode 100644 index 000000000..572c94cef --- /dev/null +++ b/generated/hashtable_struct_u32.h @@ -0,0 +1,16 @@ +// external/bonsai_stdlib/src/primitive_containers.h:34:0 + +struct u32_linked_list_node +{ + b32 Tombstoned; + u32 Element; + u32_linked_list_node *Next; +}; + +struct u32_hashtable +{ + umm Size; + u32_linked_list_node **Elements; + /* OWNED_BY_THREAD_MEMBER() */ +}; + diff --git a/generated/hashtable_voxel_synth_tile.h b/generated/hashtable_voxel_synth_tile.h index 4fff2062e..d4f7d0f80 100644 --- a/generated/hashtable_voxel_synth_tile.h +++ b/generated/hashtable_voxel_synth_tile.h @@ -184,4 +184,5 @@ TryGetPtr(voxel_synth_tile_hashtable *Hashtable, voxel_synth_tile_hashtable_iter { return GetPtr(Hashtable, Iterator); } + diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index b6a99df75..955d9581f 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -184,4 +184,5 @@ TryGetPtr(world_edit_brush_hashtable *Hashtable, world_edit_brush_hashtable_iter { return GetPtr(Hashtable, Iterator); } + diff --git a/generated/maybe_u32.h b/generated/maybe_u32.h new file mode 100644 index 000000000..80b1025d6 --- /dev/null +++ b/generated/maybe_u32.h @@ -0,0 +1,8 @@ +// external/bonsai_stdlib/src/primitive_containers.h:29:0 + +struct maybe_u32 +{ + maybe_tag Tag; + u32 Value; +}; + diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 8d62211149cc61015436f9d8c8016ac66f755351..4c3594fe730424e941f1796ab36ffb240ddc82c3 100644 GIT binary patch delta 2683 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 diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index e169a456f..bfb0cf19e 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1479,10 +1479,14 @@ EditWorldSelection(engine_resources *Engine) } } - // Draw selection modification region + // Draw proposed modification region // - rect3 Draw = Rect3(&ModifiedSelection); - DEBUG_DrawSimSpaceAABB(Engine, &Draw, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS); + rect3 ModifiedAABB = Rect3(&ModifiedSelection); + DEBUG_DrawSimSpaceAABB(Engine, &ModifiedAABB, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS*0.75f); + + // And finally the selection region + // + DEBUG_DrawSimSpaceAABB(Engine, &SelectionAABB, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS); } } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 16ad776e7..5b1c8e5cf 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -1,6 +1,11 @@ +debug_global u32_hashtable Global_DebugPBOTable = {}; + link_internal void RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { + auto Global_DebugPBOTable_Memory = AllocateArena(); + Global_DebugPBOTable = Allocate_u32_hashtable(4096, Global_DebugPBOTable_Memory); + // Map immediate GPU buffers for first frame MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.GpuBuffers[0]); MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.Transparency.GpuBuffer); @@ -125,13 +130,22 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TIMED_NAMED_BLOCK(bonsai_render_command_unmap_and_deallocate_buffer); gpu_readback_buffer PBOBuf = Command->PBOBuf; + + Info("Binding and Deallocating PBO (%u)", PBOBuf.PBO); GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOBuf.PBO); AssertNoGlErrors; GL.UnmapBuffer(GL_PIXEL_PACK_BUFFER); AssertNoGlErrors; GL.DeleteBuffers(1, &PBOBuf.PBO); + AssertNoGlErrors; GL.DeleteSync(PBOBuf.Fence); AssertNoGlErrors; + + maybe_u32 I = GetByValue(&Global_DebugPBOTable, PBOBuf.PBO); + Assert(I.Tag == Maybe_Yes); + + Drop(&Global_DebugPBOTable, PBOBuf.PBO); + } break; { tmatch(bonsai_render_command_allocate_texture, RenderCommand, Command) @@ -563,6 +577,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) u32 PBO; GL.GenBuffers(1, &PBO); AssertNoGlErrors; + + Info("Allocated PBO (%u)", PBO); + GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); GL.BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); AssertNoGlErrors; @@ -570,6 +587,10 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; GL.BindBuffer(GL_PIXEL_PACK_BUFFER, 0); + maybe_u32 I = GetByValue(&Global_DebugPBOTable, PBO); + Assert(I.Tag == Maybe_No); + Insert(PBO, &Global_DebugPBOTable, Global_DebugPBOTable_Memory); + gl_fence Fence = GL.FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, NoiseDim, Chunk}; @@ -755,6 +776,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TIMED_NAMED_BLOCK(CheckReadbackJobs); IterateOver(&Graphics->NoiseReadbackJobs, PBOJob, JobIndex) { + Assert(PBOJob); + /* Info("0x%x 0x%x", PBOJob->PBOBuf.PBO, PBOJob->PBOBuf.Fence); */ u32 SyncStatus = GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); AssertNoGlErrors; @@ -764,15 +787,19 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case GL_CONDITION_SATISFIED: { TIMED_NAMED_BLOCK(MapBuffer); + + { + maybe_u32 I = GetByValue(&Global_DebugPBOTable, PBOJob->PBOBuf.PBO); + Assert(I.Tag == Maybe_Yes); + } + AssertNoGlErrors; + Info("Binding and Mapping PBO (%u)", PBOJob->PBOBuf.PBO); GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOJob->PBOBuf.PBO); AssertNoGlErrors; u16 *NoiseValues = Cast(u16*, GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); AssertNoGlErrors; - auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->Chunk)); - PushWorkQueueEntry(&Plat->LowPriority, &BuildMeshJob); - // TODO(Jesse): This actually makes the loop skip a job because we // shorten the array, but never update the index we're looking at. // @@ -780,6 +807,14 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) // the skipped job is just a frame late. But, it would be nice if // this was better. RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); + { + auto I = Find(&Graphics->NoiseReadbackJobs, PBOJob); + Assert(I.Index == INVALID_BLOCK_ARRAY_INDEX); + } + + auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->Chunk)); + PushWorkQueueEntry(&Plat->LowPriority, &BuildMeshJob); + } break; case GL_TIMEOUT_EXPIRED: From 47d50c16bd66bb10b128a648a98dbb00c5d3b594 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 6 Jun 2025 15:09:05 -0700 Subject: [PATCH 265/421] Fix a couple bugs --- external/bonsai_stdlib | 2 +- generated/block_array_bitmap_688853862.h | 5 +- .../block_array_c_asset_thumbnail_688856411.h | 7 ++- ...ntity_ptr_688856411_struct_struct_struct.h | 5 +- generated/block_array_c_gpu_timer_688735882.h | 5 +- .../block_array_c_shader_ptr_688853971.h | 5 +- generated/block_array_c_texture_688856411.h | 5 +- generated/block_array_c_u32_688856411.h | 5 +- generated/block_array_c_u8_cursor_688856411.h | 5 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 5 +- generated/block_array_entity_688856407.h | 5 +- ...lock_array_file_traversal_node_688853862.h | 5 +- ...lock_array_gpu_readback_buffer_688853862.h | 5 +- generated/block_array_member_info_688856411.h | 5 +- generated/block_array_model_688856411.h | 5 +- .../block_array_octree_node_ptr_688853862.h | 5 +- ...block_array_picked_octree_node_688853862.h | 5 +- .../block_array_standing_spot_688853862.h | 5 +- generated/block_array_texture_ptr_688856411.h | 5 +- generated/block_array_vox_data_688856411.h | 5 +- ...lock_array_voxel_stack_element_688853862.h | 5 +- .../block_array_world_chunk_ptr_688853862.h | 5 +- generated/block_array_world_edit_688735882.h | 5 +- ...y_world_edit_block_array_index_688735882.h | 5 +- .../block_array_world_edit_layer_688735882.h | 5 +- .../block_array_world_edit_ptr_688735882.h | 5 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 2 +- generated/for_datatypes_Bxw4Q7AW.h | 2 +- generated/for_datatypes_kh9dwrCf.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...ing_and_value_tables_visible_region_size.h | 2 +- jesse.bonsai.rdbg | Bin 17178 -> 16951 bytes jesse.make.sh | 2 +- src/engine/editor.cpp | 54 +++++++++++------- src/engine/render_loop.cpp | 42 ++++---------- src/engine/serialize.cpp | 4 +- 135 files changed, 253 insertions(+), 186 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index c6a51d957..ad8431f17 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit c6a51d9570ba14c671c7a6d0cdc02ac8c09f6148 +Subproject commit ad8431f17461287d8b89a850837365b00643a122 diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index c602cd39c..1b8472e1c 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -242,7 +242,10 @@ NewBlock( bitmap_block_array *Arr ) link_internal void RemoveUnordered( bitmap_block_array *Array, bitmap_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index aa921acab..526813351 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:108:0 +// src/engine/editor.cpp:116:0 @@ -53,7 +53,10 @@ NewBlock( asset_thumbnail_block_array *Arr ) link_internal void RemoveUnordered( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h index 6afe2a27c..441103296 100644 --- a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h +++ b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h @@ -53,7 +53,10 @@ NewBlock( entity_ptr_block_array *Arr ) link_internal void RemoveUnordered( entity_ptr_block_array *Array, entity_ptr_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index 1a1872ad5..1b9ad00f2 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -53,7 +53,10 @@ NewBlock( gpu_timer_block_array *Arr ) link_internal void RemoveUnordered( gpu_timer_block_array *Array, gpu_timer_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index d93eaa7b9..d7d072387 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -53,7 +53,10 @@ NewBlock( shader_ptr_block_array *Arr ) link_internal void RemoveUnordered( shader_ptr_block_array *Array, shader_ptr_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index 81753d0e4..f7a9488b0 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -53,7 +53,10 @@ NewBlock( texture_block_array *Arr ) link_internal void RemoveUnordered( texture_block_array *Array, texture_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index f59a1fb48..530e72f63 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -53,7 +53,10 @@ NewBlock( u32_block_array *Arr ) link_internal void RemoveUnordered( u32_block_array *Array, u32_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index fcb977509..4959a2c5f 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -53,7 +53,10 @@ NewBlock( u8_cursor_block_array *Arr ) link_internal void RemoveUnordered( u8_cursor_block_array *Array, u8_cursor_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 435f567f4..3fb768144 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -242,7 +242,10 @@ NewBlock( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr ) link_internal void RemoveUnordered( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index 9173385d7..ac22b6eb4 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -242,7 +242,10 @@ NewBlock( entity_block_array *Arr ) link_internal void RemoveUnordered( entity_block_array *Array, entity_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index cfc36aed6..7bff9a840 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -242,7 +242,10 @@ NewBlock( file_traversal_node_block_array *Arr ) link_internal void RemoveUnordered( file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 255268434..fb86b88bc 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -242,7 +242,10 @@ NewBlock( gpu_readback_buffer_block_array *Arr ) link_internal void RemoveUnordered( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index aacf06cb0..e1d76d400 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -242,7 +242,10 @@ NewBlock( member_info_block_array *Arr ) link_internal void RemoveUnordered( member_info_block_array *Array, member_info_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 8188ffa9a..0734d6838 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -242,7 +242,10 @@ NewBlock( model_block_array *Arr ) link_internal void RemoveUnordered( model_block_array *Array, model_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index d2516c12d..3a7682d69 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -242,7 +242,10 @@ NewBlock( octree_node_ptr_block_array *Arr ) link_internal void RemoveUnordered( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 06ecf1670..5bb60f0b6 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -242,7 +242,10 @@ NewBlock( picked_octree_node_block_array *Arr ) link_internal void RemoveUnordered( picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index d814baf80..f02b57a03 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -242,7 +242,10 @@ NewBlock( standing_spot_block_array *Arr ) link_internal void RemoveUnordered( standing_spot_block_array *Array, standing_spot_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index ac7170cbb..41cb2abec 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -53,7 +53,10 @@ NewBlock( texture_ptr_block_array *Arr ) link_internal void RemoveUnordered( texture_ptr_block_array *Array, texture_ptr_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index e3f88756c..48a2ea9e1 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -242,7 +242,10 @@ NewBlock( vox_data_block_array *Arr ) link_internal void RemoveUnordered( vox_data_block_array *Array, vox_data_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index e68ca98fd..dcdf29f61 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -242,7 +242,10 @@ NewBlock( voxel_stack_element_block_array *Arr ) link_internal void RemoveUnordered( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index 4a60c844b..e089ffd3f 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -53,7 +53,10 @@ NewBlock( world_chunk_ptr_block_array *Arr ) link_internal void RemoveUnordered( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index ed7f80724..87e26aa02 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -242,7 +242,10 @@ NewBlock( world_edit_block_array *Arr ) link_internal void RemoveUnordered( world_edit_block_array *Array, world_edit_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index b2ad3edd2..0a6752175 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -242,7 +242,10 @@ NewBlock( world_edit_block_array_index_block_array *Arr ) link_internal void RemoveUnordered( world_edit_block_array_index_block_array *Array, world_edit_block_array_index_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 298015d43..9d5fa7ffb 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -242,7 +242,10 @@ NewBlock( world_edit_layer_block_array *Arr ) link_internal void RemoveUnordered( world_edit_layer_block_array *Array, world_edit_layer_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 409585c57..fb43ce392 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -242,7 +242,10 @@ NewBlock( world_edit_ptr_block_array *Arr ) link_internal void RemoveUnordered( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index Index) { - auto LastElement = GetPtr(Array, LastIndex(Array)); + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); Set(Array, LastElement, Index); Array->ElementCount -= 1; } diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 5f684c5ae..890495aea 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:304:0 +// src/engine/editor.cpp:312:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 9d107952c..cdf040370 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:465:0 +// src/engine/editor.cpp:473:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index c9a5bbb7a..35038cfda 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:457:0 +// src/engine/editor.cpp:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 92b675ff4..6a0e9acb2 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:343:0 +// src/engine/editor.cpp:351:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index fe80ad7e4..cc4d9a534 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:310:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index bc6a06d1b..2496b9782 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:243:0 +// src/engine/editor.cpp:251:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 26439bb31..e350eac2e 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:368:0 +// src/engine/editor.cpp:376:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 48bf55a8d..f8f78b4b1 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:149:0 +// src/engine/editor.cpp:157:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 2b86d21f1..7b1ebf758 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:337:0 +// src/engine/editor.cpp:345:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index e1b979bc5..38216d4a6 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:398:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index c9cffbcde..8dda3c430 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:346:0 +// src/engine/editor.cpp:354:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 2d81f4467..54b4fecbc 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:468:0 +// src/engine/editor.cpp:476:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index ac7be92df..a680bc371 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:239:0 +// src/engine/editor.cpp:247:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 39fcff808..697b4f7cb 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:529:0 +// src/engine/editor.cpp:537:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index e62c1637c..0204fb176 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:550:0 +// src/engine/editor.cpp:558:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index c11562855..f839e9e53 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:547:0 +// src/engine/editor.cpp:555:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index e4e1094ff..8a3508684 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:437:0 +// src/engine/editor.cpp:445:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index b2273c1dc..78ac67adc 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:434:0 +// src/engine/editor.cpp:442:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 27edd492a..20be9dc46 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:471:0 +// src/engine/editor.cpp:479:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index a345d18da..f34cf83eb 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:422:0 +// src/engine/editor.cpp:430:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 7085fec60..b34e9dfee 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:334:0 +// src/engine/editor.cpp:342:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 8b1c38077..3bf1cb186 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:505:0 +// src/engine/editor.cpp:513:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 76bb61e50..c732d0db7 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:499:0 +// src/engine/editor.cpp:507:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index d9af536fe..44b56a30c 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:404:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index c3d36002e..01edeeeb8 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:407:0 +// src/engine/editor.cpp:415:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 60208e913..a50aadb8f 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:520:0 +// src/engine/editor.cpp:528:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index db8f9a3f2..0509f7259 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:544:0 +// src/engine/editor.cpp:552:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index c9643e632..513877dc0 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:232:0 +// src/engine/editor.cpp:240:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 6ed1f5fbf..6ef51485b 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:229:0 +// src/engine/editor.cpp:237:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 5ffd9166f..d6aa76aaa 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:301:0 +// src/engine/editor.cpp:309:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index db18fe64d..d4755bb3d 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:371:0 +// src/engine/editor.cpp:379:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 40aaac067..fe1fa0560 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:535:0 +// src/engine/editor.cpp:543:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index ce5ca13ea..cf16f47a3 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:502:0 +// src/engine/editor.cpp:510:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 81a709daf..c400db9c8 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:280:0 +// src/engine/editor.cpp:288:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 6019e5082..5a7ec3e2c 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:410:0 +// src/engine/editor.cpp:418:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 9adee5256..2d75fe8f3 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:413:0 +// src/engine/editor.cpp:421:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index e164ee892..aaff97fd6 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:131:0 +// src/engine/editor.cpp:139:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 55cff99b4..d35154e1d 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:455:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 1c96f32f4..6ca7581c0 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:295:0 +// src/engine/editor.cpp:303:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index d115478bc..34605e99c 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:298:0 +// src/engine/editor.cpp:306:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index af7390ef7..d06b3b08d 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:127:0 +// src/engine/editor.cpp:135:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index 592cb962b..ae99b68b3 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:286:0 +// src/engine/editor.cpp:294:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 32ffef2c6..4ef1a4489 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:331:0 +// src/engine/editor.cpp:339:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 70161b3e4..35bdc0ac3 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:235:0 +// src/engine/editor.cpp:243:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index e111f8d02..b61233652 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:289:0 +// src/engine/editor.cpp:297:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 330ef6c8c..6b6cf2770 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:493:0 +// src/engine/editor.cpp:501:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 1e7d355df..66851f0eb 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:523:0 +// src/engine/editor.cpp:531:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 8fce38c87..5080fd392 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:283:0 +// src/engine/editor.cpp:291:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 60c3fd7f6..cd1f37be6 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:496:0 +// src/engine/editor.cpp:504:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index fb756ebac..5e4d16092 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:215:0 +// src/engine/editor.cpp:223:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 366af6959..2f7616b75 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:147:0 +// src/engine/editor.cpp:155:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index f5284ee7d..fe2cc7dae 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:511:0 +// src/engine/editor.cpp:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 2efd652c3..5a8d4edb6 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:514:0 +// src/engine/editor.cpp:522:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 2e1dd16c7..517d72dcf 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:508:0 +// src/engine/editor.cpp:516:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 77f502690..51771784f 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:377:0 +// src/engine/editor.cpp:385:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 9533a833e..742a26f9f 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:374:0 +// src/engine/editor.cpp:382:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index ef14b342c..1f0277337 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:517:0 +// src/engine/editor.cpp:525:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index fd2781636..1c6a4d6a4 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:340:0 +// src/engine/editor.cpp:348:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 9436441f1..c471ac145 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:526:0 +// src/engine/editor.cpp:534:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 89a9e6b0e..3d4ae3b6c 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:155:0 +// src/engine/editor.cpp:163:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 028f429d5..29c590b5e 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:158:0 +// src/engine/editor.cpp:166:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 88aa5c656..f76a8329f 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:313:0 +// src/engine/editor.cpp:321:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 57776ddce..885a6559b 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:307:0 +// src/engine/editor.cpp:315:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 341985561..57c46985d 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:129:0 +// src/engine/editor.cpp:137:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 9d93cf3f7..089266c25 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:401:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 596821b37..12580eada 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:392:0 +// src/engine/editor.cpp:400:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 25b79afdf..a8fdf1f00 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:395:0 +// src/engine/editor.cpp:403:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 2ca7b710d..123bdb9c1 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:125:0 +// src/engine/editor.cpp:133:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 15f09955b..793690d6e 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:226:0 +// src/engine/editor.cpp:234:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index c94b06c62..fe8a5c2d7 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:223:0 +// src/engine/editor.cpp:231:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 9ebb9562f..35dca45e6 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 746a54d77..ee6a3d4ed 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:444:0 +// src/engine/editor.cpp:452:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index 3e37dcfc8..0ac8380b2 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:383:0 +// src/engine/editor.cpp:391:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index e6111be45..82f5842b9 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:380:0 +// src/engine/editor.cpp:388:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index b1d2e5465..3ee0b9f95 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:139:0 +// src/engine/editor.cpp:147:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index c244a865e..17115baf9 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:135:0 +// src/engine/editor.cpp:143:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 0c1edf443..baa0b980f 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:137:0 +// src/engine/editor.cpp:145:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 50d5a7579..bf79ef456 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:449:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 9fe889861..1b74ccc4c 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:416:0 +// src/engine/editor.cpp:424:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index 8dd8d8b2c..8a0f0657b 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:218:0 +// src/engine/editor.cpp:226:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index c6773d6c4..7065e352d 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:212:0 +// src/engine/editor.cpp:220:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 435fcbeb3..828155a57 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:167:0 +// src/engine/editor.cpp:175:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 815b73e81..b217ff0df 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:152:0 +// src/engine/editor.cpp:160:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index 11d8e3b29..55e7271d1 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:386:0 +// src/engine/editor.cpp:394:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 0ed26bff5..56a0fe250 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:462:0 +// src/engine/editor.cpp:470:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index dae9ed93e..cfd6832ab 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:389:0 +// src/engine/editor.cpp:397:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index b48ef6d62..d4215a1eb 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:532:0 +// src/engine/editor.cpp:540:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index d0fc0650b..b6b78bef6 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:271:0 +// src/engine/editor.cpp:279:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 051929a3c..c77cd62b3 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:268:0 +// src/engine/editor.cpp:276:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 875d457ba..0ff274623 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:419:0 +// src/engine/editor.cpp:427:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 3999ab568..5391f3bb8 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:292:0 +// src/engine/editor.cpp:300:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 4ba3db9b6..a3519a914 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:538:0 +// src/engine/editor.cpp:546:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 3a9c8c3fd..c3f8e99d7 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:541:0 +// src/engine/editor.cpp:549:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index f91bdd5f3..5d8264c65 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:145:0 +// src/engine/editor.cpp:153:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index c3618cbb6..ebd9e8153 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:274:0 +// src/engine/editor.cpp:282:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index 279233ffb..8ca94cd9d 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:121:0 +// src/engine/editor.cpp:129:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 7b2b2d6e6..173a17103 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:479:0 +// src/engine/editor.cpp:487:0 diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index cd85e3113..42ec69462 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:353:0 +// src/engine/editor.cpp:361:0 diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 0df7a4214..1e0bfc40e 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:460:0 +// src/engine/editor.cpp:468:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 50ecd177b..52a30ed78 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:264:0 +// src/engine/editor.cpp:272:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 62ee8bba6..55d936725 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:258:0 +// src/engine/editor.cpp:266:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 4f23d0385..13d5b7853 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:255:0 +// src/engine/editor.cpp:263:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 4f50e0fe5..948da2f5f 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:261:0 +// src/engine/editor.cpp:269:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index 8603147d2..5eb1f4df8 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:119:0 +// src/engine/editor.cpp:127:0 link_internal counted_string ToStringPrefixless(visible_region_size Type) diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 4c3594fe730424e941f1796ab36ffb240ddc82c3..50b5ca73ff390dc3ce2152f3a4f9c43d9033b142 100644 GIT binary patch delta 2653 zcmZ`*U2I!P6=o9q`aia>6DM_?*m0aVjuXc}apS~so2KcmwoTh?w^iAti`Q{(V^ja- z+HN<}svuETLW?Nf4`#{A+q9%XK@t3rC58L|~>YQ9;jRdbDEegk`R({QkU ztYs{02D^cj{31Qao)J3tlP+snxvi9QMTPIimVXNAv<*)ueK?fN z_{&@XPI(TsImuYgZGBi?>cX z*|hNW(n$k*QS&M_i|5S)s0RXAwe(>xWkeu#iCxE5>XNZu&Npw?)CwL?jv^)x;L&U^ zmSz{lmWRxVyRsSH*&xesC!|8YqNsV;8<0+CbHJ%2Zd>a;X|EYECv4 zRn3>G_+}uA?2H+|(l6NV)YMzKt(MXv7+q+m(r2vHHk5L-xOy~U(manA3+?N@5 zB)&SGgyhxy*a=GrjQhp?ozwjo9oPI(l|nOG#O~4n)_P=Y_PcN(`GxC?6ZUSxP{;LV zQ6*?l6j$MznUs``QnRMQ9tz==euG|!cxNu~W@HNILX-M@qoFjh8yw}v^qb`Ic|t}M zJ67M3$!>@5et^nfwq4R zwjwmFwjQXy1(W7sv?xjjwU7y}P=cid@V@1@>gYCU+Th3D_#i$w;ln#a7VM8XC^Bd8 z$FVbPUa0Pmxo~fU4wNnU?AW-76(64-bK|36LImp}ld&J1!`Fg#a#t&n7lR(io@u-s zbah9I0`JCry~GPq6UwE{B1JpFYtLL()OzlAl9$l~TMFk!o%nqqLj^pGHzNx@$8yh; zKybinz$(tJ2l^?BW{KM-7-&It;MXHgERQU63h2~>mK^x~dN@Mklqi!<6v~!=o}$Ys zV6M+&C<#BN#O3{di7ugm=5Ib@XZ%B-u}wEop9Rb}&nu6}=i}kNc7%U2Y^NLeP#^Z< z`%?>siqa_Z%W|##F-dnbUr_L!p+$@&!}!9G_sFzKtBH2n%tGQZyV!=a69?XYcA-F z)*GHaa%36L5A!uA>a!-XzaB6VOpN&Pi3#?}qf&!7A2VBRJC+Rno_0}dnoEQ}#-0XLYqM@vpH}FgMMJ?8L z4bhGKO@&7!DPsAW+lJqex15z1-EIP{25BSy)7MLNvw(v>iKT_^y*^n$nd@Hm4@
    orqCIUttYb{z#auX*lTWanu*f`f#FAGo|)J3`%M!V~!> z6>=CeUOnEG-R!K`aaVp;w1PcJ!X?>&?>ei9J5{z$R>Js)W06&a-b>Dvu2vdr*$5UK zL^x#VmOX;f8LIPP>MmcAcTr*W()ULfr%U+Z60)1m+^$IUO;f_H*<&81DCa&0|d&aLpOTwA_;HNRd~0{>?|dakTgh-w;B@mONEi?r_Kx#c%jlrOPI je?Ik%E;AR!+l>cjBC?5#M~{&NJ{`pi%Re`AE&lu$)>T#Q delta 2649 zcmZuzYit`?73L;>jvdE#>^N_GYHt%evE4kH)NT^$Y}%00v`w>Ug=p8E*pqmuU-gVb z1Jbq&2#^46lTV8TD|M41gwX!sv0^1aY*#`;NJ!gVA^x@%2nmUm_TLJLG@N_K$q$63 z@!Yv{?!D)H=R4n-cfZMg^euM(63ak#j^MFVvTK!kIp3Vb!K{KG&)#5HA$t=$kNo)F zY>2Jkb|#C=Y&Uj$!q^M+Tl8AP!2O<4{Pb)HT?1i6qAtAB)`eSVyAaIgEL)SQ5>|s` zElGIVYr&thc{YKZYqa$gXsb-&_nDW)YHsv+&W#6WYcBIL{zK0Y&v zRoUFiwCcla0e)r=Zk%z0MTJx7qwzC2j(XIC4`zJqH1<7dyguV(=PAxwr-YFrE7eI z-v*pajI2%VdQ-#f)OEJT-?-K_qoUMPg?e4A$Mb*<|D2ql9VL8ivfs4AVVA_dEOt6{ z$m|sw<#11quq=(n;hu0~@$>@C*rcMm-rVHd-Dnv}_<2_lAHLADJ9!%6ZVz6Q1P)GJ zs}%Ff)}0C5w~y^cthhfa^Q>Xz6y+j4$&v(2+*+uWYYlFKQ(d+;ikD-pqzCb^J%ORL zM__(07RSdaJ5vQ(hsm?pOIh*P1iwy3SVg?6j4k4$WD-xt=2*2gvrMsZh8>Qc z$L{DNcKUc019)|G4yQ)@v7gvrY3_`3yxF6B@ z7b)Ly*y4l7%;E2TGZMw>$SnR4$hI<-fiE_KgW&+)82&6CS`+xra0i>>r{U_bhy3@& zhG89+O%JSJsWr+)JPJhdbkGIO*JUAZvXC7q4!`plenR|9m>kO5DvHt2?qDaH##dhm z9nCrLWsl1FmIY;@qLhR_lP0I;n zj&P9HarE9Aa$&zcWxtib-Bg<@_*s=9hXBQ_9=ta=!IrTvk5OX!ELwhR5_{G$Jnwen zLsE?o2JHN9si=Ah`vYfC7+AmpX-i%1BUan|4YgWS8+mgN@2R==myg@*%4LP(<8rri6RjcR^f(beMhO{Jm=a_#gj@gU?eds%JNxm(14YgyYY zk(}Ab#OC>dXiK$vh0K@=7GfIC^-fV?%9%J)y)(EuXvcqg9HfcojwP_%bCN`rz?I1N zs!>vPO~<1Uv7ZMw;=?;3FL_4>xD#>{W5Y64n(YVAF?+!9`ZP)Y}BsTnvH_0A1eWuor^7Q z3mxHcIWj`nL_v}!IN1`O&78%j{!Vf%D&oECx6`S6o&@gtB>{asID(zg2-g>v=_)^! zcQ6y*|bPscg zoaSSyM3GTxzvq%@!Fkb_Vy>|1BtDT`xDbi+&Wm>>KWSqe8&bbeJL+oA0`aw>q)Kb8 zgHwVjrf|3saekge$aI2tjf*0NUpNAYI9_I?k0c@o_9%Ak@L44DQZzO@`PE$2%_RBm^ZDlCZ;)@eFkPK@KRC58u&$^>!oy#pOSZRDgYv_iJ25V}e zRxR>_m+ky7wMo P{zlLJ&Mh{eRs8o~5NkA! diff --git a/jesse.make.sh b/jesse.make.sh index 384beb04f..11051035c 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index bfb0cf19e..f7e9c2d02 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2,19 +2,24 @@ link_internal void LoadBrushFromFile(level_editor *Editor, file_traversal_node *FileNode, memory_arena *TempMemory) { + Assert(FileNode->Type == FileTraversalType_File); cs Filename = Concat(FileNode->Dir, CSz("/"), FileNode->Name, TempMemory); u8_cursor Bytes = BeginDeserialization(Filename, TempMemory); - world_edit_brush B = {}; - CopyString( FileNode->Name.Start, B.NameBuf, Min(umm(FileNode->Name.Count), umm(NameBuf_Len))); - Editor->CurrentBrush = Upsert(B, &Editor->LoadedBrushes, &Global_PermMemory); - - if (Deserialize(&Bytes, Editor->CurrentBrush, TempMemory) == False) + if (Bytes.Start) { - SoftError("While deserializing brush (%S).", Filename); - *Editor->CurrentBrush = {}; + world_edit_brush B = {}; + CopyString( FileNode->Name.Start, B.NameBuf, Min(umm(FileNode->Name.Count), umm(NameBuf_Len))); + Editor->CurrentBrush = Upsert(B, &Editor->LoadedBrushes, &Global_PermMemory); + + if (Deserialize(&Bytes, Editor->CurrentBrush, TempMemory) == False) + { + SoftError("While deserializing brush (%S).", Filename); + *Editor->CurrentBrush = {}; + } } + FinalizeDeserialization(&Bytes); } @@ -78,7 +83,10 @@ InitEditor(level_editor *Editor) IterateOver(&Nodes, Node, NodeIndex) { - LoadBrushFromFile(Editor, Node, GetTranArena()); + if (Node->Type == FileTraversalType_File) + { + LoadBrushFromFile(Editor, Node, GetTranArena()); + } } Editor->Edits.Memory = Editor->Memory; @@ -1446,18 +1454,20 @@ EditWorldSelection(engine_resources *Engine) if (Editor->Selection.ModState.ClickedFace) { world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); - - UpdateSelectionStateForFrame( &Ray, Camera, Input, SelectionMode, &Editor->Selection.ModState ); - v3 UpdateVector = {}; - ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB, &UpdateVector); - if (Input->LMB.Pressed == False) + if (SelectionMode) // We could have started a selection edit and released the accelerator key { - // If we actually changed the selection region - rect3cp ProposedSelection = SimSpaceToCanonical(World, &ModifiedSelection); + UpdateSelectionStateForFrame( &Ray, Camera, Input, SelectionMode, &Editor->Selection.ModState ); + v3 UpdateVector = {}; + ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB, &UpdateVector); + if (Input->LMB.Pressed == False) + { + // If we actually changed the selection region + rect3cp ProposedSelection = SimSpaceToCanonical(World, &ModifiedSelection); - // Make ModifiedSelection permanent - Editor->Selection.Region = ProposedSelection; - Editor->Selection.Diff = UpdateVector; + // Make ModifiedSelection permanent + Editor->Selection.Region = ProposedSelection; + Editor->Selection.Diff = UpdateVector; + } } } } @@ -1839,7 +1849,7 @@ GetEditsSortedByOrdianl(world_edit_block_array *Edits, memory_arena *TempMem) link_internal void -ApplyDiffToEditBuffer(engine_resources *Engine, v3 Diff, world_edit_block_array_index_block_array *Edits) +ApplyDiffToEditBuffer(engine_resources *Engine, v3 Diff, world_edit_block_array_index_block_array *Edits, world_edit_selection_mode SelectionMode) { UNPACK_ENGINE_RESOURCES(Engine); @@ -1847,8 +1857,6 @@ ApplyDiffToEditBuffer(engine_resources *Engine, v3 Diff, world_edit_block_array_ { world_edit *Edit = GetPtr(&Editor->Edits, *EditI); - world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); - Assert(Engine->MaybeMouseRay.Tag == Maybe_Yes); ray *Ray = &Engine->MaybeMouseRay.Ray; aabb SelectionAABB = GetSimSpaceAABB(World, &Edit->Region); @@ -2128,7 +2136,9 @@ DoWorldEditor(engine_resources *Engine) if (LengthSq(Editor->Selection.Diff) > 0.f) { Info("Applying diff to edit buffer"); - ApplyDiffToEditBuffer(Engine, Editor->Selection.Diff, &Editor->SelectedEdits); + world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); + Assert(SelectionMode); + ApplyDiffToEditBuffer(Engine, Editor->Selection.Diff, &Editor->SelectedEdits, SelectionMode); Editor->Selection.ModState.ClickedFace = FaceIndex_None; } else diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 5b1c8e5cf..dd0a502a2 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -1,11 +1,6 @@ -debug_global u32_hashtable Global_DebugPBOTable = {}; - link_internal void RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { - auto Global_DebugPBOTable_Memory = AllocateArena(); - Global_DebugPBOTable = Allocate_u32_hashtable(4096, Global_DebugPBOTable_Memory); - // Map immediate GPU buffers for first frame MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.GpuBuffers[0]); MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.Transparency.GpuBuffer); @@ -131,7 +126,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) gpu_readback_buffer PBOBuf = Command->PBOBuf; - Info("Binding and Deallocating PBO (%u)", PBOBuf.PBO); + /* Info("(%d) Binding and Deallocating PBO (%u)", ThreadLocal_ThreadIndex, PBOBuf.PBO); */ GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOBuf.PBO); AssertNoGlErrors; GL.UnmapBuffer(GL_PIXEL_PACK_BUFFER); @@ -141,11 +136,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) GL.DeleteSync(PBOBuf.Fence); AssertNoGlErrors; - maybe_u32 I = GetByValue(&Global_DebugPBOTable, PBOBuf.PBO); - Assert(I.Tag == Maybe_Yes); - - Drop(&Global_DebugPBOTable, PBOBuf.PBO); - } break; { tmatch(bonsai_render_command_allocate_texture, RenderCommand, Command) @@ -578,8 +568,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) GL.GenBuffers(1, &PBO); AssertNoGlErrors; - Info("Allocated PBO (%u)", PBO); - + /* Info("(%d) Allocated PBO (%u)", ThreadLocal_ThreadIndex, PBO); */ GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); GL.BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); AssertNoGlErrors; @@ -587,10 +576,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) AssertNoGlErrors; GL.BindBuffer(GL_PIXEL_PACK_BUFFER, 0); - maybe_u32 I = GetByValue(&Global_DebugPBOTable, PBO); - Assert(I.Tag == Maybe_No); - Insert(PBO, &Global_DebugPBOTable, Global_DebugPBOTable_Memory); - gl_fence Fence = GL.FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, NoiseDim, Chunk}; @@ -778,7 +763,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { Assert(PBOJob); + /* Info("PBOJob(0x%x) JobIndex(%u)", PBOJob, JobIndex.Index); */ /* Info("0x%x 0x%x", PBOJob->PBOBuf.PBO, PBOJob->PBOBuf.Fence); */ + u32 SyncStatus = GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); AssertNoGlErrors; switch(SyncStatus) @@ -788,33 +775,26 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { TIMED_NAMED_BLOCK(MapBuffer); - { - maybe_u32 I = GetByValue(&Global_DebugPBOTable, PBOJob->PBOBuf.PBO); - Assert(I.Tag == Maybe_Yes); - } - AssertNoGlErrors; - Info("Binding and Mapping PBO (%u)", PBOJob->PBOBuf.PBO); + /* umm JobCount = AtElements(&Graphics->NoiseReadbackJobs).Index; */ + /* Info("(%d) Binding and Mapping PBOJob(0x%x) PBO(%u) JobCount(%d) JobIndex(%u)", ThreadLocal_ThreadIndex, PBOJob, PBOJob->PBOBuf.PBO, JobCount, JobIndex.Index); */ GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOJob->PBOBuf.PBO); AssertNoGlErrors; u16 *NoiseValues = Cast(u16*, GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); AssertNoGlErrors; + auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->Chunk)); + PushWorkQueueEntry(&Plat->LowPriority, &BuildMeshJob); + // TODO(Jesse): This actually makes the loop skip a job because we // shorten the array, but never update the index we're looking at. // // It doesn't matter in this case because this runs every frame, so // the skipped job is just a frame late. But, it would be nice if // this was better. + // + // NOTE(Jesse): Must happen after we read the PBOJob values for the work queue entry RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); - { - auto I = Find(&Graphics->NoiseReadbackJobs, PBOJob); - Assert(I.Index == INVALID_BLOCK_ARRAY_INDEX); - } - - auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->Chunk)); - PushWorkQueueEntry(&Plat->LowPriority, &BuildMeshJob); - } break; case GL_TIMEOUT_EXPIRED: diff --git a/src/engine/serialize.cpp b/src/engine/serialize.cpp index 9441b0ecc..51bfbaf7f 100644 --- a/src/engine/serialize.cpp +++ b/src/engine/serialize.cpp @@ -70,6 +70,8 @@ BeginDeserialization(cs Filename, memory_arena *TempMemory) // TODO(Jesse): Audit .level savefiles and remove this.. it's hella legacy case 0: { + Assert(Global_SerializeTypeTable.Size == 0); + Assert(Global_SerializeTypeTable.Elements == 0); Global_SerializeTypeTable = Allocate_bonsai_type_info_hashtable(64, Global_SerializeTypeTableArena); { @@ -109,7 +111,7 @@ BeginDeserialization(cs Filename, memory_arena *TempMemory) } } break; - default: { SoftError("Could not load level file claiming version (%lu), bailing.", LevelHeaderVersion); } + default: { SoftError("Could not load level file claiming version (%lu), bailing.", LevelHeaderVersion); LevelBytes = {}; } } } return LevelBytes; From 11c968742c02a23825a7bffda4e9aec848884cc7 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 7 Jun 2025 10:49:51 -0700 Subject: [PATCH 266/421] Editor UX improvements --- external/bonsai_stdlib | 2 +- generated/block_array_bitmap_688853862.h | 11 ++--- .../block_array_c_asset_thumbnail_688856411.h | 11 ++--- ...ntity_ptr_688856411_struct_struct_struct.h | 11 ++--- generated/block_array_c_gpu_timer_688735882.h | 11 ++--- .../block_array_c_shader_ptr_688853971.h | 11 ++--- generated/block_array_c_texture_688856411.h | 11 ++--- generated/block_array_c_u32_688856411.h | 11 ++--- generated/block_array_c_u8_cursor_688856411.h | 11 ++--- ...k_queue_entry_build_chunk_mesh_688853862.h | 11 ++--- generated/block_array_entity_688856407.h | 11 ++--- ...lock_array_file_traversal_node_688853862.h | 11 ++--- ...lock_array_gpu_readback_buffer_688853862.h | 11 ++--- generated/block_array_member_info_688856411.h | 11 ++--- generated/block_array_model_688856411.h | 11 ++--- .../block_array_octree_node_ptr_688853862.h | 11 ++--- ...block_array_picked_octree_node_688853862.h | 11 ++--- .../block_array_standing_spot_688853862.h | 11 ++--- generated/block_array_texture_ptr_688856411.h | 11 ++--- generated/block_array_vox_data_688856411.h | 11 ++--- ...lock_array_voxel_stack_element_688853862.h | 11 ++--- .../block_array_world_chunk_ptr_688853862.h | 11 ++--- generated/block_array_world_edit_688735882.h | 13 ++--- ...y_world_edit_block_array_index_688735882.h | 27 +++++++---- .../block_array_world_edit_layer_688735882.h | 13 ++--- .../block_array_world_edit_ptr_688735882.h | 13 ++--- ...editor_ui_for_compound_type_level_editor.h | 4 +- generated/for_datatypes_0XxWqGSZ.h | 4 -- generated/for_datatypes_Bxw4Q7AW.h | 4 -- generated/for_datatypes_fkubhsYl.h | 4 -- generated/for_datatypes_kv3WBTai.h | 4 -- jesse.make.sh | 2 +- src/engine/canonical_position.h | 11 +++++ src/engine/editor.cpp | 47 +++++++++++-------- src/engine/editor.h | 16 ++++--- 35 files changed, 145 insertions(+), 250 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index ad8431f17..7ad444130 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit ad8431f17461287d8b89a850837365b00643a122 +Subproject commit 7ad4441305e9eae9b8c6d3463346bc12f8893079 diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index 1b8472e1c..71a720c2e 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -193,13 +193,6 @@ TryGetPtr(bitmap_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( bitmap_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( bitmap_block_array *Array, bitmap *Query) bitmap_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( bitmap_block_array *Array, bitmap *Query) return Result; } + + link_internal b32 IsValid(bitmap_block_array_index *Index) { diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 526813351..7f4457499 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -4,13 +4,6 @@ -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( asset_thumbnail_block_array_index Index ) { @@ -103,7 +96,7 @@ Find( asset_thumbnail_block_array *Array, asset_thumbnail *Query) asset_thumbnail_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -112,6 +105,8 @@ Find( asset_thumbnail_block_array *Array, asset_thumbnail *Query) return Result; } + + link_internal b32 IsValid(asset_thumbnail_block_array_index *Index) { diff --git a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h index 441103296..e8f1f6e7a 100644 --- a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h +++ b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h @@ -4,13 +4,6 @@ -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( entity_ptr_block_array_index Index ) { @@ -103,7 +96,7 @@ Find( entity_ptr_block_array *Array, entity_ptr Query) entity_ptr_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -112,6 +105,8 @@ Find( entity_ptr_block_array *Array, entity_ptr Query) return Result; } + + link_internal b32 IsValid(entity_ptr_block_array_index *Index) { diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index 1b9ad00f2..01805bd25 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -4,13 +4,6 @@ -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( gpu_timer_block_array_index Index ) { @@ -103,7 +96,7 @@ Find( gpu_timer_block_array *Array, gpu_timer *Query) gpu_timer_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -112,6 +105,8 @@ Find( gpu_timer_block_array *Array, gpu_timer *Query) return Result; } + + link_internal b32 IsValid(gpu_timer_block_array_index *Index) { diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index d7d072387..5696ea7c7 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -4,13 +4,6 @@ -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( shader_ptr_block_array_index Index ) { @@ -103,7 +96,7 @@ Find( shader_ptr_block_array *Array, shader_ptr Query) shader_ptr_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -112,6 +105,8 @@ Find( shader_ptr_block_array *Array, shader_ptr Query) return Result; } + + link_internal b32 IsValid(shader_ptr_block_array_index *Index) { diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index f7a9488b0..051a27cd8 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -4,13 +4,6 @@ -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( texture_block_array_index Index ) { @@ -103,7 +96,7 @@ Find( texture_block_array *Array, texture *Query) texture_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -112,6 +105,8 @@ Find( texture_block_array *Array, texture *Query) return Result; } + + link_internal b32 IsValid(texture_block_array_index *Index) { diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index 530e72f63..88b1b96c7 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -4,13 +4,6 @@ -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( u32_block_array_index Index ) { @@ -103,7 +96,7 @@ Find( u32_block_array *Array, u32 *Query) u32_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -112,6 +105,8 @@ Find( u32_block_array *Array, u32 *Query) return Result; } + + link_internal b32 IsValid(u32_block_array_index *Index) { diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index 4959a2c5f..b14b86a59 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -4,13 +4,6 @@ -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( u8_cursor_block_array_index Index ) { @@ -103,7 +96,7 @@ Find( u8_cursor_block_array *Array, u8_cursor *Query) u8_cursor_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -112,6 +105,8 @@ Find( u8_cursor_block_array *Array, u8_cursor *Query) return Result; } + + link_internal b32 IsValid(u8_cursor_block_array_index *Index) { diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 3fb768144..0c6a0e51d 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -193,13 +193,6 @@ TryGetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( dummy_work_queue_entry_build_chunk_mesh_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_que dummy_work_queue_entry_build_chunk_mesh_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_que return Result; } + + link_internal b32 IsValid(dummy_work_queue_entry_build_chunk_mesh_block_array_index *Index) { diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index ac22b6eb4..76826d1bf 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -193,13 +193,6 @@ TryGetPtr(entity_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( entity_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( entity_block_array *Array, entity *Query) entity_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( entity_block_array *Array, entity *Query) return Result; } + + link_internal b32 IsValid(entity_block_array_index *Index) { diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index 7bff9a840..284e5e5b9 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -193,13 +193,6 @@ TryGetPtr(file_traversal_node_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( file_traversal_node_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( file_traversal_node_block_array *Array, file_traversal_node *Query) file_traversal_node_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( file_traversal_node_block_array *Array, file_traversal_node *Query) return Result; } + + link_internal b32 IsValid(file_traversal_node_block_array_index *Index) { diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index fb86b88bc..a5c71f66d 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -193,13 +193,6 @@ TryGetPtr(gpu_readback_buffer_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( gpu_readback_buffer_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Query) gpu_readback_buffer_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Query) return Result; } + + link_internal b32 IsValid(gpu_readback_buffer_block_array_index *Index) { diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index e1d76d400..0705237a9 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -193,13 +193,6 @@ TryGetPtr(member_info_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( member_info_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( member_info_block_array *Array, member_info *Query) member_info_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( member_info_block_array *Array, member_info *Query) return Result; } + + link_internal b32 IsValid(member_info_block_array_index *Index) { diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 0734d6838..66ae25864 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -193,13 +193,6 @@ TryGetPtr(model_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( model_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( model_block_array *Array, model *Query) model_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( model_block_array *Array, model *Query) return Result; } + + link_internal b32 IsValid(model_block_array_index *Index) { diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 3a7682d69..6b326737f 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -193,13 +193,6 @@ TryGetPtr(octree_node_ptr_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( octree_node_ptr_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( octree_node_ptr_block_array *Array, octree_node_ptr Query) octree_node_ptr_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( octree_node_ptr_block_array *Array, octree_node_ptr Query) return Result; } + + link_internal b32 IsValid(octree_node_ptr_block_array_index *Index) { diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 5bb60f0b6..93fa493ed 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -193,13 +193,6 @@ TryGetPtr(picked_octree_node_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( picked_octree_node_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( picked_octree_node_block_array *Array, picked_octree_node *Query) picked_octree_node_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( picked_octree_node_block_array *Array, picked_octree_node *Query) return Result; } + + link_internal b32 IsValid(picked_octree_node_block_array_index *Index) { diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index f02b57a03..e09bb396d 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -193,13 +193,6 @@ TryGetPtr(standing_spot_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( standing_spot_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( standing_spot_block_array *Array, standing_spot *Query) standing_spot_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( standing_spot_block_array *Array, standing_spot *Query) return Result; } + + link_internal b32 IsValid(standing_spot_block_array_index *Index) { diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index 41cb2abec..9c9642d1e 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -4,13 +4,6 @@ -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( texture_ptr_block_array_index Index ) { @@ -103,7 +96,7 @@ Find( texture_ptr_block_array *Array, texture_ptr Query) texture_ptr_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -112,6 +105,8 @@ Find( texture_ptr_block_array *Array, texture_ptr Query) return Result; } + + link_internal b32 IsValid(texture_ptr_block_array_index *Index) { diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index 48a2ea9e1..f84cc7143 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -193,13 +193,6 @@ TryGetPtr(vox_data_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( vox_data_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( vox_data_block_array *Array, vox_data *Query) vox_data_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( vox_data_block_array *Array, vox_data *Query) return Result; } + + link_internal b32 IsValid(vox_data_block_array_index *Index) { diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index dcdf29f61..5900464c5 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -193,13 +193,6 @@ TryGetPtr(voxel_stack_element_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( voxel_stack_element_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( voxel_stack_element_block_array *Array, voxel_stack_element *Query) voxel_stack_element_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( voxel_stack_element_block_array *Array, voxel_stack_element *Query) return Result; } + + link_internal b32 IsValid(voxel_stack_element_block_array_index *Index) { diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index e089ffd3f..5598f7754 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -4,13 +4,6 @@ -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( world_chunk_ptr_block_array_index Index ) { @@ -103,7 +96,7 @@ Find( world_chunk_ptr_block_array *Array, world_chunk_ptr Query) world_chunk_ptr_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -112,6 +105,8 @@ Find( world_chunk_ptr_block_array *Array, world_chunk_ptr Query) return Result; } + + link_internal b32 IsValid(world_chunk_ptr_block_array_index *Index) { diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 87e26aa02..1d98c74b7 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -11,7 +11,7 @@ struct world_edit_block world_edit Elements[8]; }; -struct world_edit_block_array_index +struct world_edit_block_array_index poof(@block_array_IndexOfValue) { umm Index; /* block_t *Block; */ @@ -193,13 +193,6 @@ TryGetPtr(world_edit_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( world_edit_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( world_edit_block_array *Array, world_edit *Query) world_edit_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( world_edit_block_array *Array, world_edit *Query) return Result; } + + link_internal b32 IsValid(world_edit_block_array_index *Index) { diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 0a6752175..ef709aca3 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1258:0 +// src/engine/editor.h:1262:0 @@ -193,13 +193,6 @@ TryGetPtr(world_edit_block_array_index_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( world_edit_block_array_index_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( world_edit_block_array_index_block_array *Array, world_edit_block_array_in world_edit_block_array_index_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,22 @@ Find( world_edit_block_array_index_block_array *Array, world_edit_block_array_in return Result; } +link_internal world_edit_block_array_index_block_array_index +IndexOfValue( world_edit_block_array_index_block_array *Array, world_edit_block_array_index *Query) +{ + world_edit_block_array_index_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; + IterateOver(Array, E, Index) + { + if (AreEqual(E, Query)) + { + Result = Index; + break; + } + } + return Result; +} + + link_internal b32 IsValid(world_edit_block_array_index_block_array_index *Index) { diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 9d5fa7ffb..7bbde09f8 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1269:0 +// src/engine/editor.h:1273:0 @@ -193,13 +193,6 @@ TryGetPtr(world_edit_layer_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( world_edit_layer_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( world_edit_layer_block_array *Array, world_edit_layer *Query) world_edit_layer_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( world_edit_layer_block_array *Array, world_edit_layer *Query) return Result; } + + link_internal b32 IsValid(world_edit_layer_block_array_index *Index) { diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index fb43ce392..f174dfb09 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1255:0 +// src/engine/editor.h:1258:0 @@ -193,13 +193,6 @@ TryGetPtr(world_edit_ptr_block_array *Arr, umm Index) -/* link_internal block_t * */ -/* Allocate_(element_t.name)_block(memory_arena *Memory) */ -/* { */ -/* block_t *Result = Allocate( block_t, Memory, 1); */ -/* return Result; */ -/* } */ - link_internal cs CS( world_edit_ptr_block_array_index Index ) { @@ -292,7 +285,7 @@ Find( world_edit_ptr_block_array *Array, world_edit_ptr Query) world_edit_ptr_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; IterateOver(Array, E, Index) { - if ( E == Query) + if ( E == Query ) { Result = Index; break; @@ -301,6 +294,8 @@ Find( world_edit_ptr_block_array *Array, world_edit_ptr Query) return Result; } + + link_internal b32 IsValid(world_edit_ptr_block_array_index *Index) { diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index fe1fa0560..b63c93254 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -492,11 +492,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - cs MemberName = CSz("SelectedEdits"); + cs MemberName = CSz("SelectedEditIndices"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_block_array_index_block_array*, &Element->SelectedEdits), + Cast(world_edit_block_array_index_block_array*, &Element->SelectedEditIndices), MemberName, Params ); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index c84a026d5..745cace93 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -222,8 +222,6 @@ - - @@ -755,8 +753,6 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) - - diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 173a17103..b41feb42d 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -353,9 +353,6 @@ - - - @@ -1003,6 +1000,5 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 80b5078ea..279b32766 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -222,8 +222,6 @@ - - @@ -745,8 +743,6 @@ render_to_texture_async_params render_to_texture_async_params; - - diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 18a5e9974..6d79a1ccf 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -222,8 +222,6 @@ - - @@ -745,8 +743,6 @@ type_render_to_texture_async_params, - - diff --git a/jesse.make.sh b/jesse.make.sh index 11051035c..384beb04f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/canonical_position.h b/src/engine/canonical_position.h index 384c77d2c..4a45461d6 100644 --- a/src/engine/canonical_position.h +++ b/src/engine/canonical_position.h @@ -280,6 +280,17 @@ Rect3CP(rect3 *Rect) return Result; } +link_internal rect3cp +InvertedInfinityRectangle_rect3cp() +{ + rect3cp Result = { + .Min = Canonical_Position(V3(f32_MAX), V3i(s32_MAX)), + .Max = Canonical_Position(V3(-f32_MAX), V3i(s32_MIN)), + }; + return Result; +} + + /* poof(gen_rect_helpers(rect3cp, cp)) */ /* #include */ diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index f7e9c2d02..fce7e8ec8 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -90,7 +90,7 @@ InitEditor(level_editor *Editor) } Editor->Edits.Memory = Editor->Memory; - Editor->SelectedEdits.Memory = Editor->Memory; + Editor->SelectedEditIndices.Memory = Editor->Memory; return Result; } @@ -1394,9 +1394,11 @@ EditWorldSelection(engine_resources *Engine) #if 1 aabb TotalEditAreas = InvertedInfinityRectangle_rect3(); - if (AtElements(&Editor->SelectedEdits).Index) + // NOTE(Jesse): We can't predicate this because when we deselect everything + // we want this to automagically resize + /* if (AtElements(&Editor->SelectedEditIndices).Index) */ { - IterateOver(&Editor->SelectedEdits, EditIndex, EditIndexIndex) + IterateOver(&Editor->SelectedEditIndices, EditIndex, EditIndexIndex) { world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); aabb EditAABB = GetSimSpaceRect(World, Edit->Region); @@ -1552,6 +1554,9 @@ EditWorldSelection(engine_resources *Engine) } } + if (Editor->Selection.InitialSelect) { Info("InitialSelect"); } + if (Editor->Selection.Changed) { Info("Changed"); } + if (Editor->Selection.InitialSelect) { Assert(Editor->Selection.Changed); @@ -2052,8 +2057,8 @@ DoWorldEditor(engine_resources *Engine) auto E = NewEdit(Editor, Editor->CurrentLayer, &Index); E->Brush = Editor->CurrentBrush; - Editor->SelectedEdits.ElementCount = 0; - Push(&Editor->SelectedEdits, &Index); + Editor->SelectedEditIndices.ElementCount = 0; + Push(&Editor->SelectedEditIndices, &Index); } #if 0 @@ -2126,8 +2131,8 @@ DoWorldEditor(engine_resources *Engine) if (Editor->Selection.InitialSelect) { Info("Setting Initial edit state"); - Assert(AtElements(&Editor->SelectedEdits).Index == 1); - auto EditIndex = GetPtr(&Editor->SelectedEdits, {}); + Assert(AtElements(&Editor->SelectedEditIndices).Index == 1); + auto EditIndex = GetPtr(&Editor->SelectedEditIndices, {}); world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); UpdateWorldEditBounds(Engine, Edit, Editor->Selection.Region, GetTranArena()); } @@ -2138,7 +2143,7 @@ DoWorldEditor(engine_resources *Engine) Info("Applying diff to edit buffer"); world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); Assert(SelectionMode); - ApplyDiffToEditBuffer(Engine, Editor->Selection.Diff, &Editor->SelectedEdits, SelectionMode); + ApplyDiffToEditBuffer(Engine, Editor->Selection.Diff, &Editor->SelectedEditIndices, SelectionMode); Editor->Selection.ModState.ClickedFace = FaceIndex_None; } else @@ -2217,16 +2222,11 @@ DoWorldEditor(engine_resources *Engine) { world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); - auto *Duplicated = NewEdit(Editor, DstLayer); + world_edit_block_array_index DupIndex = {}; + auto *Duplicated = NewEdit(Editor, DstLayer, &DupIndex); *Duplicated = *Edit; ApplyEditToOctree(Engine, Duplicated, GetTranArena()); - - NotImplemented; - /* if (Editor->CurrentEdit == Edit) */ - /* { */ - /* Editor->CurrentEdit = Duplicated; */ - /* } */ } } break; @@ -2239,7 +2239,14 @@ DoWorldEditor(engine_resources *Engine) DropEditFromOctree(Engine, Edit, GetTranArena()); Edit->Tombstone = False; + + umm SelIndex = IndexOfValue(&Editor->SelectedEditIndices, EditIndex).Index; + if (SelIndex != INVALID_BLOCK_ARRAY_INDEX) + { + RemoveUnordered(&Editor->SelectedEditIndices, {SelIndex}); + } } + RemoveOrdered(&Editor->Layers, Layer); Editor->CurrentLayer = 0; } break; @@ -2330,7 +2337,7 @@ DoWorldEditor(engine_resources *Engine) b32 EditIsSelected = False; world_edit_block_array_index_block_array_index I; - IterateOver(&Editor->SelectedEdits, SelEditIndex, SEII) + IterateOver(&Editor->SelectedEditIndices, SelEditIndex, SEII) { if (*SelEditIndex == *EditIndex) { @@ -2351,17 +2358,17 @@ DoWorldEditor(engine_resources *Engine) { if (EditIsSelected) { - RemoveUnordered(&Editor->SelectedEdits, I); + RemoveUnordered(&Editor->SelectedEditIndices, I); } else { - Push(&Editor->SelectedEdits, EditIndex); + Push(&Editor->SelectedEditIndices, EditIndex); } } else { - Editor->SelectedEdits.ElementCount = 0; - Push(&Editor->SelectedEdits, EditIndex); + Editor->SelectedEditIndices.ElementCount = 0; + Push(&Editor->SelectedEditIndices, EditIndex); } diff --git a/src/engine/editor.h b/src/engine/editor.h index 406c13f3d..43e58a1d7 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1189,8 +1189,8 @@ struct selection_region poof(@do_editor_ui) // really a big deal. cp Base; - rect3cp Region; - rect3cp PrevRegion; // Change detection + rect3cp Region = InvertedInfinityRectangle_rect3cp(); + rect3cp PrevRegion = InvertedInfinityRectangle_rect3cp(); // Change detection v3 Diff; // When Changed is set, this should be nonzero. b32 Changed; @@ -1237,24 +1237,28 @@ poof(hashtable(world_edit_brush)) struct world_edit { - rect3cp Region; // TODO(Jesse): Rename to bounds + // TODO(Jesse): Rename to Bounds? + rect3cp Region = InvertedInfinityRectangle_rect3cp(); world_edit_brush *Brush; // Instance params + // TODO(Jesse): Do we actually need Tombstone or LayerIndex? b32 Tombstone; u32 LayerIndex; - /* u32 Ordinal; // monotonically increasing integer sourced from level_editor::NextEditOrdinal */ }; typedef world_edit* world_edit_ptr; -poof(block_array(world_edit, {128})) +// TODO(Jesse): Add `add_tag` to poof so we can reinstate this +// +/* poof(block_array(world_edit, {128})) */ #include poof(block_array(world_edit_ptr, {128})) #include +/* poof(add_tag(world_edit_block_array_index, block_array_IndexOfValue)) */ poof(block_array(world_edit_block_array_index, {128})) #include @@ -1310,7 +1314,7 @@ struct level_editor world_edit_layer *CurrentLayer; world_edit_layer *HotLayer; - world_edit_block_array_index_block_array SelectedEdits; + world_edit_block_array_index_block_array SelectedEditIndices; world_edit *HotEdit; world_edit_brush_hashtable LoadedBrushes; From 96c860fb7865e2466ae42f8dedc533448991dd80 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 7 Jun 2025 14:33:05 -0700 Subject: [PATCH 267/421] Continue polishing editor UX --- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 25 -- ..._ui_for_radio_enum_world_edit_blend_mode.h | 1 - ...adio_enum_world_edit_blend_mode_modifier.h | 23 ++ generated/serdes_struct_world_edit.h | 15 - ...g_and_value_tables_world_edit_blend_mode.h | 3 - ...ue_tables_world_edit_blend_mode_modifier.h | 3 + make.sh | 1 + shaders/terrain/world_edit.fragmentshader | 28 +- src/engine/editor.cpp | 320 +++++++++--------- src/engine/editor.h | 19 +- 13 files changed, 226 insertions(+), 218 deletions(-) diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index ef709aca3..30ca136a1 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1262:0 +// src/engine/editor.h:1257:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 7bbde09f8..b78c2937a 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1273:0 +// src/engine/editor.h:1268:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index f174dfb09..8ca973026 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1258:0 +// src/engine/editor.h:1253:0 diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 51771784f..2523fa33d 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -93,31 +93,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, - } - - PushNewRow(Ui); - - - - { - - - - cs MemberName = CSz("LayerIndex"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->LayerIndex), - MemberName, - Params - ); - - - - - - - } PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 76980744a..58a663230 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -20,7 +20,6 @@ RadioButtonGroup_world_edit_blend_mode( renderer_2d *Ui, { { CSz("Additive"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Additive")), WorldEdit_Mode_Additive }, { CSz("Subtractive"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Subtractive")), WorldEdit_Mode_Subtractive }, - { CSz("Threshold"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Threshold")), WorldEdit_Mode_Threshold }, { CSz("Disabled"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Disabled")), WorldEdit_Mode_Disabled }, }; diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index a92ffdc9a..b39129366 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -99,6 +99,29 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifie } + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Threshold"), UiId(Window, "enum WorldEdit_ValueModifier_Threshold", Element), Params)) + { + if (WorldEdit_ValueModifier_Threshold == world_edit_blend_mode_modifier(0)) + { + *Element = world_edit_blend_mode_modifier(0); + } + else + { + if ((*Element & WorldEdit_ValueModifier_Threshold) == WorldEdit_ValueModifier_Threshold) + { + *Element = world_edit_blend_mode_modifier(*Element&~WorldEdit_ValueModifier_Threshold); + } + else + { + *Element = world_edit_blend_mode_modifier(*Element|WorldEdit_ValueModifier_Threshold); + } + } + + SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index 7144b5951..da3ad8afc 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -48,13 +48,6 @@ Serialize(u8_cursor_block_array *Bytes, world_edit *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Tombstone); // default - - - - - - Result &= Serialize(Bytes, &Element->LayerIndex); // default - if (Element->Brush) { Result &= Serialize(Bytes, Element->Brush); } @@ -97,14 +90,6 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit *Element, memory_arena *M // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Tombstone, Memory); - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->LayerIndex, Memory); - if (HadBrushPointer) { umm Count = 1; diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 7638330a3..aded30fb1 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -8,7 +8,6 @@ ToStringPrefixless(world_edit_blend_mode Type) { case WorldEdit_Mode_Additive: { Result = CSz("Additive"); } break; case WorldEdit_Mode_Subtractive: { Result = CSz("Subtractive"); } break; - case WorldEdit_Mode_Threshold: { Result = CSz("Threshold"); } break; case WorldEdit_Mode_Disabled: { Result = CSz("Disabled"); } break; @@ -25,7 +24,6 @@ ToString(world_edit_blend_mode Type) { case WorldEdit_Mode_Additive: { Result = CSz("WorldEdit_Mode_Additive"); } break; case WorldEdit_Mode_Subtractive: { Result = CSz("WorldEdit_Mode_Subtractive"); } break; - case WorldEdit_Mode_Threshold: { Result = CSz("WorldEdit_Mode_Threshold"); } break; case WorldEdit_Mode_Disabled: { Result = CSz("WorldEdit_Mode_Disabled"); } break; @@ -41,7 +39,6 @@ WorldEditBlendMode(counted_string S) if (StringsMatch(S, CSz("WorldEdit_Mode_Additive"))) { return WorldEdit_Mode_Additive; } if (StringsMatch(S, CSz("WorldEdit_Mode_Subtractive"))) { return WorldEdit_Mode_Subtractive; } - if (StringsMatch(S, CSz("WorldEdit_Mode_Threshold"))) { return WorldEdit_Mode_Threshold; } if (StringsMatch(S, CSz("WorldEdit_Mode_Disabled"))) { return WorldEdit_Mode_Disabled; } return Result; diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 403cc05ec..7284661df 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -10,6 +10,7 @@ ToStringPrefixless(world_edit_blend_mode_modifier Type) case WorldEdit_ValueModifier_Surface: { Result = CSz("Surface"); } break; case WorldEdit_ValueModifier_ClampPos: { Result = CSz("ClampPos"); } break; case WorldEdit_ValueModifier_ClampNeg: { Result = CSz("ClampNeg"); } break; + case WorldEdit_ValueModifier_Threshold: { Result = CSz("Threshold"); } break; case WorldEdit_ColorModifier_Discard: { Result = CSz("Discard"); } break; // TODO(Jesse): This is pretty barf and we could do it in a single allocation, @@ -57,6 +58,7 @@ ToString(world_edit_blend_mode_modifier Type) case WorldEdit_ValueModifier_Surface: { Result = CSz("WorldEdit_ValueModifier_Surface"); } break; case WorldEdit_ValueModifier_ClampPos: { Result = CSz("WorldEdit_ValueModifier_ClampPos"); } break; case WorldEdit_ValueModifier_ClampNeg: { Result = CSz("WorldEdit_ValueModifier_ClampNeg"); } break; + case WorldEdit_ValueModifier_Threshold: { Result = CSz("WorldEdit_ValueModifier_Threshold"); } break; case WorldEdit_ColorModifier_Discard: { Result = CSz("WorldEdit_ColorModifier_Discard"); } break; // TODO(Jesse): This is pretty barf and we could do it in a single allocation, @@ -90,6 +92,7 @@ WorldEditBlendModeModifier(counted_string S) if (StringsMatch(S, CSz("WorldEdit_ValueModifier_Surface"))) { return WorldEdit_ValueModifier_Surface; } if (StringsMatch(S, CSz("WorldEdit_ValueModifier_ClampPos"))) { return WorldEdit_ValueModifier_ClampPos; } if (StringsMatch(S, CSz("WorldEdit_ValueModifier_ClampNeg"))) { return WorldEdit_ValueModifier_ClampNeg; } + if (StringsMatch(S, CSz("WorldEdit_ValueModifier_Threshold"))) { return WorldEdit_ValueModifier_Threshold; } if (StringsMatch(S, CSz("WorldEdit_ColorModifier_Discard"))) { return WorldEdit_ColorModifier_Discard; } return Result; diff --git a/make.sh b/make.sh index cb21a45f8..30883d33d 100755 --- a/make.sh +++ b/make.sh @@ -6,6 +6,7 @@ # SANITIZER="-fsanitize=undefined" # SANITIZER="-fsanitize=address" +# SANITIZER="-fsanitize=thread" BUILD_EVERYTHING=0 diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 780c9b421..87425fb34 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -213,9 +213,8 @@ void main() z > 0 && z < 65) { f32 ThisCell = sign(TexLookup.a); - if (ThisCell < 0.f) + if (ThisCell < 0.f) // Current value is Air { - // only consider cells that are air s32 IsSurface = s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(1, 0), 0).a ) > 0.f); IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(1, 0), 0).a ) > 0.f); @@ -227,9 +226,18 @@ void main() if (IsSurface == 0) { NoiseSample = 0.f; ColorSample = V3(0,0,0); } } - else + else // Current NoiseValue is Solid { - NoiseSample = 0.f; ColorSample = V3(0,0,0); + s32 IsSurface = s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(1, 0), 0).a ) < 0.f); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(1, 0), 0).a ) < 0.f); + + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 1), 0).a ) < 0.f); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 1), 0).a ) < 0.f); + + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 66), 0).a) < 0.f); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 66), 0).a) < 0.f); + + if (IsSurface == 0) { NoiseSample = 0.f; ColorSample = V3(0,0,0); } } } else @@ -248,11 +256,20 @@ void main() NoiseSample = min(0.f, NoiseSample); } + if ( (Modifiers & (1<<3)) > 0) // WorldEdit_ValueModifier_Threshold + { + if (NoiseSample > Threshold) NoiseValue = NoiseSample; + } + + + if (abs(NoiseSample) < Threshold) { NoiseSample = 0.f; } + + if (Invert) { NoiseSample *= -1.f; @@ -267,9 +284,6 @@ void main() case 1: // Subtractive { NoiseValue = NoiseValue - NoiseSample; } break; - - case 2: // Threshold - { if (NoiseSample > Threshold) NoiseValue = Threshold; } break; } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index fce7e8ec8..0fa05b421 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -969,7 +969,6 @@ GetHotVoxelForEditMode(engine_resources *Engine, world_edit_blend_mode WorldEdit switch (WorldEditMode) { case WorldEdit_Mode_Disabled: {} break; - case WorldEdit_Mode_Threshold: case WorldEdit_Mode_Additive: { Pos = PickedVoxel_LastEmpty; @@ -1362,7 +1361,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ { // NOTE(Jesse): Not an `if` because we shouldn't be able to ask to // delete a layer if there aren't any to delete! - Assert(LayeredBrush->LayerCount < 0); + Assert(LayeredBrush->LayerCount > 0); // Shuffle layers backwards, overwriting EditLayerIndex RangeIteratorRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) @@ -1872,6 +1871,30 @@ ApplyDiffToEditBuffer(engine_resources *Engine, v3 Diff, world_edit_block_array_ } } +link_internal void +DeleteEdit(engine_resources *Engine, world_edit *Edit, world_edit_block_array_index *EditIndex, world_edit_layer *Layer = 0) +{ + Assert(Edit->Tombstone == False); + + level_editor *Editor = &Engine->Editor; + + DropEditFromOctree(Engine, Edit, GetTranArena()); + + umm SelIndex = IndexOfValue(&Editor->SelectedEditIndices, EditIndex).Index; + if (SelIndex != INVALID_BLOCK_ARRAY_INDEX) + { + RemoveUnordered(&Editor->SelectedEditIndices, {SelIndex}); + } + + if (Layer) + { + RemoveOrdered(&Layer->EditIndices, EditIndex); + } + + *Edit = {}; + Edit->Tombstone = True; +} + link_internal void DoWorldEditor(engine_resources *Engine) { @@ -2199,6 +2222,12 @@ DoWorldEditor(engine_resources *Engine) if (Button(Ui, Name, UiId(&LayersWindow, Layer, Layer), Style)) { Editor->CurrentLayer = Layer; + + Editor->SelectedEditIndices.ElementCount = 0; + IterateOver(&Layer->EditIndices, EditIndex, EII) + { + Push(&Editor->SelectedEditIndices, EditIndex); + } } ui_layer_toolbar_actions LayerToolbarAction = {}; @@ -2235,20 +2264,18 @@ DoWorldEditor(engine_resources *Engine) IterateOver(&Layer->EditIndices, EditIndex, EditIndexIndex) { world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); - Assert(Edit->Tombstone == False); - - DropEditFromOctree(Engine, Edit, GetTranArena()); - Edit->Tombstone = False; - - umm SelIndex = IndexOfValue(&Editor->SelectedEditIndices, EditIndex).Index; - if (SelIndex != INVALID_BLOCK_ARRAY_INDEX) - { - RemoveUnordered(&Editor->SelectedEditIndices, {SelIndex}); - } + // NOTE(Jesse): We're deleting the layer here so we don't need + // to remove the edits one-by-one .. we'll clear the whole thing. + DeleteEdit(Engine, Edit, EditIndex); } + Layer->EditIndices.ElementCount = 0; + RemoveOrdered(&Editor->Layers, Layer); + Layer = 0; + Editor->CurrentLayer = 0; + LayerIndex = AtElements(&Editor->Layers); } break; } } @@ -2256,182 +2283,171 @@ DoWorldEditor(engine_resources *Engine) } PushTableEnd(Ui); + if (Layer) { - auto I = AtElements(&Layer->EditIndices); - if (GetIndex(&I) == 0) + PushTableStart(Ui); + if (AtElements(&Layer->EditIndices).Index == 0) { PushColumn(Ui, CSz("--- no edits ---")); PushNewRow(Ui); } - } - - PushTableStart(Ui); - { - world_edit_block_array_index *PrevEditIndex = {}; - IterateOver(&Layer->EditIndices, EditIndex, EditIndexIndex) + else { - world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); - Assert(Edit->Tombstone == False); - - const char *NameBuf = Edit->Brush ? Edit->Brush->NameBuf : "no brush"; - - ui_reorder_action EditReorderAction = {}; - PushToolbar(Ui, &LayersWindow, {}, &EditReorderAction, u64(Edit)^u64(Layer), &DefaultUiRenderParams_Toolbar, ToggleButtonGroupFlags_NoNewRow); - - switch(EditReorderAction) { - case UiReorderAction_NoAction: break; - - case UiReorderAction_ReorderUp: + world_edit_block_array_index *PrevEditIndex = {}; + IterateOver(&Layer->EditIndices, EditIndex, EditIndexIndex) { - if (PrevEditIndex) - { - auto Tmp = *PrevEditIndex; - *PrevEditIndex = *EditIndex; - *EditIndex = Tmp; - } - else if (PrevLayer) - { - Push(&PrevLayer->EditIndices, EditIndex); - RemoveOrdered(&Layer->EditIndices, EditIndex); - } + world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); + Assert(Edit->Tombstone == False); - } break; + const char *NameBuf = Edit->Brush ? Edit->Brush->NameBuf : "no brush"; - case UiReorderAction_ReorderDown: - { - auto NextEditIndexIndex = EditIndexIndex; - ++NextEditIndexIndex; - - if (NextEditIndexIndex < AtElements(&Layer->EditIndices)) - { - auto NextEditIndex = GetPtr(&Layer->EditIndices, NextEditIndexIndex); + ui_reorder_action EditReorderAction = {}; + PushToolbar(Ui, &LayersWindow, {}, &EditReorderAction, u64(Edit)^u64(Layer), &DefaultUiRenderParams_Toolbar, ToggleButtonGroupFlags_NoNewRow); - auto Tmp = *NextEditIndex; - *NextEditIndex = *EditIndex; - *EditIndex = Tmp; - - EditIndexIndex = AtElements(&Layer->EditIndices); - } - else + switch(EditReorderAction) { - auto NextLayerIndex = LayerIndex; - ++NextLayerIndex; + case UiReorderAction_NoAction: break; - auto NextLayer = TryGetPtr(&Editor->Layers, GetIndex(&NextLayerIndex)); - if (NextLayer) + case UiReorderAction_ReorderUp: + { + if (PrevEditIndex) + { + auto Tmp = *PrevEditIndex; + *PrevEditIndex = *EditIndex; + *EditIndex = Tmp; + } + else if (PrevLayer) + { + Push(&PrevLayer->EditIndices, EditIndex); + RemoveOrdered(&Layer->EditIndices, EditIndex); + } + + } break; + + case UiReorderAction_ReorderDown: { - RemoveOrdered(&Layer->EditIndices, EditIndex); - Shift(&NextLayer->EditIndices, EditIndex); + auto NextEditIndexIndex = EditIndexIndex; + ++NextEditIndexIndex; + + if (NextEditIndexIndex < AtElements(&Layer->EditIndices)) + { + auto NextEditIndex = GetPtr(&Layer->EditIndices, NextEditIndexIndex); + + auto Tmp = *NextEditIndex; + *NextEditIndex = *EditIndex; + *EditIndex = Tmp; + + EditIndexIndex = AtElements(&Layer->EditIndices); + } + else + { + auto NextLayerIndex = LayerIndex; + ++NextLayerIndex; + + auto NextLayer = TryGetPtr(&Editor->Layers, GetIndex(&NextLayerIndex)); + if (NextLayer) + { + RemoveOrdered(&Layer->EditIndices, EditIndex); + Shift(&NextLayer->EditIndices, EditIndex); + } + + EditIndexIndex = AtElements(&Layer->EditIndices); + } } - EditIndexIndex = AtElements(&Layer->EditIndices); + break; } - } - - break; - } - ui_render_params ButtonParams = DefaultUiRenderParams_Button; + ui_render_params ButtonParams = DefaultUiRenderParams_Button; - b32 EditIsSelected = False; - world_edit_block_array_index_block_array_index I; - IterateOver(&Editor->SelectedEditIndices, SelEditIndex, SEII) - { - if (*SelEditIndex == *EditIndex) - { - ButtonParams.FStyle = &DefaultSelectedStyle; - EditIsSelected = True; - I = SEII; - } - } - - auto EditSelectButton = PushSimpleButton(Ui, FSz("(%s)", NameBuf), UiId(&LayersWindow, "edit select", Edit), &ButtonParams); - if (Clicked(Ui, &EditSelectButton)) - { - Editor->Selection.Clicks = 2; - Editor->Selection.Region = Edit->Region; - Editor->Selection.PrevRegion = Edit->Region; - - if (Input->Ctrl.Pressed) - { - if (EditIsSelected) + b32 EditIsSelected = False; + world_edit_block_array_index_block_array_index I; + IterateOver(&Editor->SelectedEditIndices, SelEditIndex, SEII) { - RemoveUnordered(&Editor->SelectedEditIndices, I); - } - else - { - Push(&Editor->SelectedEditIndices, EditIndex); + if (*SelEditIndex == *EditIndex) + { + ButtonParams.FStyle = &DefaultSelectedStyle; + EditIsSelected = True; + I = SEII; + } } - } - else - { - Editor->SelectedEditIndices.ElementCount = 0; - Push(&Editor->SelectedEditIndices, EditIndex); - } + auto EditSelectButton = PushSimpleButton(Ui, FSz("(%s)", NameBuf), UiId(&LayersWindow, "edit select", Edit), &ButtonParams); + if (Clicked(Ui, &EditSelectButton)) + { + Editor->Selection.Clicks = 2; + Editor->Selection.Region = Edit->Region; + Editor->Selection.PrevRegion = Edit->Region; - /* Editor->CurrentEdit = Edit; */ - Editor->CurrentLayer = Layer; + if (Input->Ctrl.Pressed) + { + if (EditIsSelected) + { + RemoveUnordered(&Editor->SelectedEditIndices, I); + } + else + { + Push(&Editor->SelectedEditIndices, EditIndex); + } + } + else + { + Editor->SelectedEditIndices.ElementCount = 0; + Push(&Editor->SelectedEditIndices, EditIndex); + } - if (Edit->Brush) - { - Editor->CurrentBrush = Edit->Brush; - CheckSettingsChanged(&Edit->Brush->Layered); // Prevent firing a change event @prevent_change_event - } - } - if (Hover(Ui, &EditSelectButton)) - { - Editor->HotEdit = Edit; - } + /* Editor->CurrentEdit = Edit; */ + Editor->CurrentLayer = Layer; - ui_layer_edit_actions LayerEditAction = {}; - PushToolbar( Ui, &LayersWindow, {}, &LayerEditAction, u64(Edit)); - switch (LayerEditAction) - { - case UiLayerEditAction_NoAction: {} break; + if (Edit->Brush) + { + Editor->CurrentBrush = Edit->Brush; + CheckSettingsChanged(&Edit->Brush->Layered); // Prevent firing a change event @prevent_change_event + } + } - case UiLayerEditAction_SetBrush: - { - Edit->Brush = Editor->CurrentBrush; - UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); - } break; + if (Hover(Ui, &EditSelectButton)) + { + Editor->HotEdit = Edit; + } - case UiLayerEditAction_Duplicate: - { - /* IncrementAllEditOrdinalsAbove(&Editor->Layers, Edit->Ordinal+1); */ + ui_layer_edit_actions LayerEditAction = {}; + PushToolbar( Ui, &LayersWindow, {}, &LayerEditAction, u64(Edit)); + switch (LayerEditAction) + { + case UiLayerEditAction_NoAction: {} break; - auto *Duplicated = NewEdit(Editor, Layer); - *Duplicated = *Edit; - /* ++Duplicated->Ordinal; */ + case UiLayerEditAction_SetBrush: + { + Edit->Brush = Editor->CurrentBrush; + UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); + } break; - ApplyEditToOctree(Engine, Duplicated, GetTranArena()); + case UiLayerEditAction_Duplicate: + { + auto *Duplicated = NewEdit(Editor, Layer); + *Duplicated = *Edit; + ApplyEditToOctree(Engine, Duplicated, GetTranArena()); + } break; - /* Editor->CurrentEdit = Duplicated; */ - } break; + case UiLayerEditAction_Delete: + { + DeleteEdit(Engine, Edit, EditIndex, Layer); + } break; + } - case UiLayerEditAction_Delete: - { - /* if (Editor->CurrentEdit == Edit) */ - /* { */ - /* Editor->CurrentEdit = 0; */ - /* } */ - - DropEditFromOctree(Engine, Edit, GetTranArena()); - RemoveOrdered(&Layer->EditIndices, EditIndex); - Edit->Tombstone = True; - } break; + PrevEditIndex = EditIndex; + } } - - PrevEditIndex = EditIndex; } - } - PushTableEnd(Ui); - PushNewRow(Ui); + PushTableEnd(Ui); + PushNewRow(Ui); - PrevLayer = Layer; + PrevLayer = Layer; + } } PushNewRow(Ui); diff --git a/src/engine/editor.h b/src/engine/editor.h index 43e58a1d7..cf9e106bc 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -782,9 +782,7 @@ enum world_edit_blend_mode { WorldEdit_Mode_Additive, // Adds layer value to noise value WorldEdit_Mode_Subtractive, // Subtracts layer value from noise value - WorldEdit_Mode_Threshold, // Sets noise value to layer value if above threshold - - WorldEdit_Mode_Disabled, // Useful for turning the layer off + WorldEdit_Mode_Disabled, // Useful for turning the layer off }; enum world_edit_color_blend_mode @@ -805,11 +803,13 @@ enum world_edit_color_blend_mode enum world_edit_blend_mode_modifier poof(@bitfield) { WorldEdit_Modifier_Default = 0, - WorldEdit_ValueModifier_Surface = (1<<0), - WorldEdit_ValueModifier_ClampPos = (1<<1), - WorldEdit_ValueModifier_ClampNeg = (1<<2), - WorldEdit_ColorModifier_Discard = (1<<3), + WorldEdit_ValueModifier_Surface = (1<<0), + WorldEdit_ValueModifier_ClampPos = (1<<1), + WorldEdit_ValueModifier_ClampNeg = (1<<2), + WorldEdit_ValueModifier_Threshold = (1<<3), + + WorldEdit_ColorModifier_Discard = (1<<4), // NOTE(Jesse): Unsupported for now, unclear if it will be again .. // WorldEdit_Modifier_Flood = xxxx, }; @@ -1240,12 +1240,7 @@ struct world_edit // TODO(Jesse): Rename to Bounds? rect3cp Region = InvertedInfinityRectangle_rect3cp(); world_edit_brush *Brush; - - // Instance params - - // TODO(Jesse): Do we actually need Tombstone or LayerIndex? b32 Tombstone; - u32 LayerIndex; }; typedef world_edit* world_edit_ptr; From 9dc3e2fdd2caa2532400ca0290c8cf3e8c561cdf Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 7 Jun 2025 14:37:13 -0700 Subject: [PATCH 268/421] Update stdlib --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 7ad444130..b26220981 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 7ad4441305e9eae9b8c6d3463346bc12f8893079 +Subproject commit b2622098194e8b84708bdb7275c988dd665a2d0d From 86edc8309e9a4d6be98dcd461904b52b802651ef Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 8 Jun 2025 09:19:57 -0700 Subject: [PATCH 269/421] Fix ser/des for levels --- .../block_array_c_asset_thumbnail_688856411.h | 2 +- generated/deserialize_struct_level_header.h | 8 ++ ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 2 +- generated/for_datatypes_Bxw4Q7AW.h | 2 +- generated/for_datatypes_kh9dwrCf.h | 2 +- ...world_edit_block_array_index_block_array.h | 38 +++++++ generated/serdes_primitive_592771169.h | 2 +- ...rdes_struct_world_edit_block_array_index.h | 98 ++++++++++++++++ generated/serdes_struct_world_edit_layer.h | 105 ++++++++++++++++++ generated/serialize_struct_level_header.h | 7 ++ .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...ing_and_value_tables_visible_region_size.h | 2 +- src/engine/canonical_position.h | 4 +- src/engine/editor.cpp | 66 ++++++----- src/engine/level.h | 1 + src/engine/resources.cpp | 9 ++ src/engine/serdes.cpp | 9 ++ src/engine/serdes.h | 41 +++++++ 117 files changed, 463 insertions(+), 135 deletions(-) create mode 100644 generated/serdes_collection_world_edit_block_array_index_block_array.h create mode 100644 generated/serdes_struct_world_edit_block_array_index.h create mode 100644 generated/serdes_struct_world_edit_layer.h diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 7f4457499..c51de1644 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:116:0 +// src/engine/editor.cpp:115:0 diff --git a/generated/deserialize_struct_level_header.h b/generated/deserialize_struct_level_header.h index d8e71bba3..01ee9e571 100644 --- a/generated/deserialize_struct_level_header.h +++ b/generated/deserialize_struct_level_header.h @@ -21,6 +21,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->EditCount, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EntityCount, Memory); diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 890495aea..4640bca45 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:312:0 +// src/engine/editor.cpp:311:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index cdf040370..27900c752 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:473:0 +// src/engine/editor.cpp:472:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 35038cfda..908004c20 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:465:0 +// src/engine/editor.cpp:464:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 6a0e9acb2..d469e3223 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:351:0 +// src/engine/editor.cpp:350:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index cc4d9a534..cc93970a8 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:317:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 2496b9782..9c1e55826 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:251:0 +// src/engine/editor.cpp:250:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index e350eac2e..c0b7a426d 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:376:0 +// src/engine/editor.cpp:375:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index f8f78b4b1..4a0a5f95f 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:157:0 +// src/engine/editor.cpp:156:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 7b1ebf758..e120ad4a9 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:345:0 +// src/engine/editor.cpp:344:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 38216d4a6..605c8f0f7 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:405:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 8dda3c430..9d6893343 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:354:0 +// src/engine/editor.cpp:353:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 54b4fecbc..c30bb548d 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:476:0 +// src/engine/editor.cpp:475:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index a680bc371..4e561236e 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:247:0 +// src/engine/editor.cpp:246:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 697b4f7cb..b38dc057b 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:537:0 +// src/engine/editor.cpp:536:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 0204fb176..bf9789134 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:558:0 +// src/engine/editor.cpp:557:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index f839e9e53..67fcd3945 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:555:0 +// src/engine/editor.cpp:554:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 8a3508684..7af0b04b7 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:445:0 +// src/engine/editor.cpp:444:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 78ac67adc..19a38ff50 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:442:0 +// src/engine/editor.cpp:441:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 20be9dc46..1ae114d2a 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:479:0 +// src/engine/editor.cpp:478:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index f34cf83eb..50f155d4f 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:430:0 +// src/engine/editor.cpp:429:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index b34e9dfee..e53810a79 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:342:0 +// src/engine/editor.cpp:341:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 3bf1cb186..86e7b3afe 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:513:0 +// src/engine/editor.cpp:512:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index c732d0db7..5069c878d 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:507:0 +// src/engine/editor.cpp:506:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 44b56a30c..b56a95d3a 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:412:0 +// src/engine/editor.cpp:411:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 01edeeeb8..28bbeea2b 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:415:0 +// src/engine/editor.cpp:414:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index a50aadb8f..8c5b61df6 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:528:0 +// src/engine/editor.cpp:527:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 0509f7259..50bf0f1db 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:552:0 +// src/engine/editor.cpp:551:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 513877dc0..aab170e4b 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:240:0 +// src/engine/editor.cpp:239:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 6ef51485b..1d52c6db8 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:237:0 +// src/engine/editor.cpp:236:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index d6aa76aaa..d3783676d 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:309:0 +// src/engine/editor.cpp:308:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index d4755bb3d..2194a7fa7 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:379:0 +// src/engine/editor.cpp:378:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index b63c93254..1950ac0f9 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:543:0 +// src/engine/editor.cpp:542:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index cf16f47a3..4d5f96f3c 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:510:0 +// src/engine/editor.cpp:509:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index c400db9c8..34921ff96 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:288:0 +// src/engine/editor.cpp:287:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 5a7ec3e2c..533871f0a 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:418:0 +// src/engine/editor.cpp:417:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 2d75fe8f3..4f79c5d96 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:421:0 +// src/engine/editor.cpp:420:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index aaff97fd6..f5cf18a67 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:139:0 +// src/engine/editor.cpp:138:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index d35154e1d..0b1b5da52 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:455:0 +// src/engine/editor.cpp:454:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 6ca7581c0..ed7489f30 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:303:0 +// src/engine/editor.cpp:302:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 34605e99c..1b6070558 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:306:0 +// src/engine/editor.cpp:305:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index d06b3b08d..5b4b0ea2e 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:135:0 +// src/engine/editor.cpp:134:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index ae99b68b3..ac670f638 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:294:0 +// src/engine/editor.cpp:293:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 4ef1a4489..d13b76e79 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:339:0 +// src/engine/editor.cpp:338:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 35bdc0ac3..de6436c0b 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:243:0 +// src/engine/editor.cpp:242:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index b61233652..f359f8392 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:297:0 +// src/engine/editor.cpp:296:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 6b6cf2770..a121b7ba1 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:501:0 +// src/engine/editor.cpp:500:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 66851f0eb..aee9dbf30 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:531:0 +// src/engine/editor.cpp:530:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 5080fd392..da5144818 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:291:0 +// src/engine/editor.cpp:290:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index cd1f37be6..1cf78ac79 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:504:0 +// src/engine/editor.cpp:503:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 5e4d16092..0b78798e3 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:223:0 +// src/engine/editor.cpp:222:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 2f7616b75..0a1611565 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:155:0 +// src/engine/editor.cpp:154:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index fe2cc7dae..bae4273d8 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:519:0 +// src/engine/editor.cpp:518:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 5a8d4edb6..dd24f76ad 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:522:0 +// src/engine/editor.cpp:521:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 517d72dcf..52b145ae2 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:516:0 +// src/engine/editor.cpp:515:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 2523fa33d..0b4cbc1c8 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:385:0 +// src/engine/editor.cpp:384:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 742a26f9f..150da3b5f 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:382:0 +// src/engine/editor.cpp:381:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 1f0277337..955df0a7a 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:525:0 +// src/engine/editor.cpp:524:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 1c6a4d6a4..4224cfa5d 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:348:0 +// src/engine/editor.cpp:347:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index c471ac145..e36d1f34b 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:534:0 +// src/engine/editor.cpp:533:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 3d4ae3b6c..01d1386b6 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:163:0 +// src/engine/editor.cpp:162:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 29c590b5e..6f97ef25d 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:166:0 +// src/engine/editor.cpp:165:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index f76a8329f..35b60a667 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:321:0 +// src/engine/editor.cpp:320:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 885a6559b..3eac18589 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:315:0 +// src/engine/editor.cpp:314:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 57c46985d..71b3b9f6c 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:137:0 +// src/engine/editor.cpp:136:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 089266c25..434449b28 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:408:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 12580eada..6c9986c6f 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:400:0 +// src/engine/editor.cpp:399:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index a8fdf1f00..b8899e468 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:403:0 +// src/engine/editor.cpp:402:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 123bdb9c1..14b1dfd4f 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:133:0 +// src/engine/editor.cpp:132:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 793690d6e..f824f8c69 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:234:0 +// src/engine/editor.cpp:233:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index fe8a5c2d7..b6034e50f 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:231:0 +// src/engine/editor.cpp:230:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 35dca45e6..1dd092977 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:458:0 +// src/engine/editor.cpp:457:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index ee6a3d4ed..b22dfca75 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:452:0 +// src/engine/editor.cpp:451:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index 0ac8380b2..fd183c041 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:391:0 +// src/engine/editor.cpp:390:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index 82f5842b9..32482aa80 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:388:0 +// src/engine/editor.cpp:387:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 3ee0b9f95..77a1c814f 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:147:0 +// src/engine/editor.cpp:146:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 17115baf9..c6adc98a6 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:143:0 +// src/engine/editor.cpp:142:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index baa0b980f..cb6cbe635 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:145:0 +// src/engine/editor.cpp:144:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index bf79ef456..ca7049a2d 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:449:0 +// src/engine/editor.cpp:448:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 1b74ccc4c..cc18483e6 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:424:0 +// src/engine/editor.cpp:423:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index 8a0f0657b..f35b0fea5 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:226:0 +// src/engine/editor.cpp:225:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 7065e352d..9e0d26b51 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:220:0 +// src/engine/editor.cpp:219:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 828155a57..ea29a1d6d 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:175:0 +// src/engine/editor.cpp:174:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index b217ff0df..063d8f058 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:160:0 +// src/engine/editor.cpp:159:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index 55e7271d1..0613e0e49 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:394:0 +// src/engine/editor.cpp:393:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 56a0fe250..73f85c542 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:470:0 +// src/engine/editor.cpp:469:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index cfd6832ab..31253ca92 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:397:0 +// src/engine/editor.cpp:396:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index d4215a1eb..b0cbed863 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:540:0 +// src/engine/editor.cpp:539:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index b6b78bef6..ec3f987c9 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:279:0 +// src/engine/editor.cpp:278:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index c77cd62b3..3442d5855 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:276:0 +// src/engine/editor.cpp:275:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 0ff274623..db8fb8da5 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:427:0 +// src/engine/editor.cpp:426:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 5391f3bb8..f85722904 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:300:0 +// src/engine/editor.cpp:299:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index a3519a914..63bfa91f9 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:546:0 +// src/engine/editor.cpp:545:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index c3f8e99d7..0ab5da69d 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:549:0 +// src/engine/editor.cpp:548:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 5d8264c65..39758f240 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:153:0 +// src/engine/editor.cpp:152:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index ebd9e8153..f13688ac3 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:282:0 +// src/engine/editor.cpp:281:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index 8ca94cd9d..bc4f72878 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:129:0 +// src/engine/editor.cpp:128:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index b41feb42d..578e97dda 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:487:0 +// src/engine/editor.cpp:486:0 diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 42ec69462..038293074 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:361:0 +// src/engine/editor.cpp:360:0 diff --git a/generated/serdes_collection_world_edit_block_array_index_block_array.h b/generated/serdes_collection_world_edit_block_array_index_block_array.h new file mode 100644 index 000000000..6fd972e25 --- /dev/null +++ b/generated/serdes_collection_world_edit_block_array_index_block_array.h @@ -0,0 +1,38 @@ +// src/engine/serdes.cpp:456:0 + + + +link_internal b32 +Serialize( u8_cursor_block_array *Bytes, world_edit_block_array_index_block_array *Collection) +{ + auto i = AtElements(Collection); + u64 ElementCount = u64(GetIndex(&i)); + b32 Result = Write(Bytes, ElementCount); + + IterateOver(Collection, Element, EIndex) + { + Result &= Serialize(Bytes, Element); + } + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize( u8_cursor *Bytes, world_edit_block_array_index_block_array *Collection, memory_arena *Memory) +{ + u64 ElementCount = Read_u64(Bytes); + Collection->Memory = Memory; + + b32 Result = True; + RangeIterator_t(u64, EIndex, ElementCount) + { + world_edit_block_array_index Element = {}; + Result &= Deserialize(Bytes, &Element, Memory); + Push(Collection, &Element); + } + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + diff --git a/generated/serdes_primitive_592771169.h b/generated/serdes_primitive_592771169.h index 40b97e019..d2ffb559c 100644 --- a/generated/serdes_primitive_592771169.h +++ b/generated/serdes_primitive_592771169.h @@ -1,4 +1,4 @@ -// src/engine/serdes.h:533:0 +// src/engine/serdes.h:574:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, u8 *Element, umm Count = 1) diff --git a/generated/serdes_struct_world_edit_block_array_index.h b/generated/serdes_struct_world_edit_block_array_index.h new file mode 100644 index 000000000..89ffe598a --- /dev/null +++ b/generated/serdes_struct_world_edit_block_array_index.h @@ -0,0 +1,98 @@ +// src/engine/serdes.cpp:453:0 + +link_internal bonsai_type_info +TypeInfo(world_edit_block_array_index *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("world_edit_block_array_index"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_edit_block_array_index *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + world_edit_block_array_index *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->Index); // default + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_edit_block_array_index *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_block_array_index *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_block_array_index *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Index, Memory); + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_edit_block_array_index *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serdes_struct_world_edit_layer.h b/generated/serdes_struct_world_edit_layer.h new file mode 100644 index 000000000..649ec2cfa --- /dev/null +++ b/generated/serdes_struct_world_edit_layer.h @@ -0,0 +1,105 @@ +// src/engine/serdes.cpp:459:0 + +link_internal bonsai_type_info +TypeInfo(world_edit_layer *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("world_edit_layer"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_edit_layer *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + world_edit_layer *Element = BaseElement + ElementIndex; + { + umm ThisCount = (256) + 1; + + Result &= Serialize(Bytes, Element->NameBuf, ThisCount); + } + + + + + + Result &= Serialize(Bytes, &Element->EditIndices); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_edit_layer *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_layer *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_layer *Element, memory_arena *Memory) +{ + b32 Result = True; + { + umm Count = (256) + 1; + + Result &= Deserialize(Bytes, Element->NameBuf, Memory, Count); + } + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->EditIndices, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_edit_layer *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serialize_struct_level_header.h b/generated/serialize_struct_level_header.h index 7d3c50057..23058cc1b 100644 --- a/generated/serialize_struct_level_header.h +++ b/generated/serialize_struct_level_header.h @@ -41,6 +41,13 @@ Serialize(u8_cursor_block_array *Bytes, level_header *BaseElement, umm Count = 1 + Result &= Serialize(Bytes, &Element->EditCount); // default + + + + + + Result &= Serialize(Bytes, &Element->EntityCount); // default diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 1e0bfc40e..1ee3165a8 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:468:0 +// src/engine/editor.cpp:467:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 52a30ed78..b64ec6529 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:272:0 +// src/engine/editor.cpp:271:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 55d936725..408b0f74d 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:266:0 +// src/engine/editor.cpp:265:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 13d5b7853..8dd7a8e2e 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:263:0 +// src/engine/editor.cpp:262:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 948da2f5f..98bc4dbec 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:269:0 +// src/engine/editor.cpp:268:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index 5eb1f4df8..50243dae4 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:127:0 +// src/engine/editor.cpp:126:0 link_internal counted_string ToStringPrefixless(visible_region_size Type) diff --git a/src/engine/canonical_position.h b/src/engine/canonical_position.h index 4a45461d6..8bc4391e5 100644 --- a/src/engine/canonical_position.h +++ b/src/engine/canonical_position.h @@ -284,8 +284,8 @@ link_internal rect3cp InvertedInfinityRectangle_rect3cp() { rect3cp Result = { - .Min = Canonical_Position(V3(f32_MAX), V3i(s32_MAX)), - .Max = Canonical_Position(V3(-f32_MAX), V3i(s32_MIN)), + .Min = Canonical_Position(V3( 1024.f), V3i(s32_MAX)), + .Max = Canonical_Position(V3(-1024.f), V3i(s32_MIN)), }; return Result; } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 0fa05b421..8a17b15a3 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -73,7 +73,6 @@ InitEditor(level_editor *Editor) Editor->Layers = WorldEditLayerBlockArray(Editor->Memory); Assert(Editor->NextLayerIndex == 0); - NewLayer(Editor); Editor->AssetThumbnails = AssetThumbnailBlockArray(Editor->Memory); @@ -1404,6 +1403,7 @@ EditWorldSelection(engine_resources *Engine) TotalEditAreas = Union(&TotalEditAreas, &EditAABB); } Editor->Selection.Region = SimSpaceToCanonical(World, &TotalEditAreas); + /* Info("%V3 %V3i", Editor->Selection.Region.Min.Offset); */ } #endif @@ -2063,7 +2063,16 @@ DoWorldEditor(engine_resources *Engine) if (Input->Ctrl.Pressed && Input->E.Clicked) { Editor->PreviousTool = Editor->Tool; Editor->Tool = WorldEdit_Tool_Eyedropper; ResetSelectionIfIncomplete(Editor); } - if (Input->Ctrl.Pressed && Input->G.Clicked) { if (entity *Ghost = GetCameraGhost(Engine)) { Ghost->P = GetSelectionCenterP(World, Editor); } } + if (Input->Ctrl.Pressed && Input->G.Clicked) + { + if (AtElements(&Editor->SelectedEditIndices).Index) + { + if (entity *Ghost = GetCameraGhost(Engine)) + { + Ghost->P = GetSelectionCenterP(World, Editor); + } + } + } if (Input->Ctrl.Pressed && Input->S.Clicked) { @@ -2562,7 +2571,8 @@ DoLevelWindow(engine_resources *Engine) Header.Camera = *Camera; Header.RenderSettings = Graphics->Settings; Header.EntityCount = EntityCount; - Header.LayerCount = u32(TotalElements(&Editor->Layers)); + Header.LayerCount = u32(AtElements(&Editor->Layers).Index); + Header.EditCount = u32(AtElements(&Editor->Edits).Index); { cs Filename = Engine->Graphics.TerrainShapingRC.Program.FragSourceFilename; @@ -2580,21 +2590,16 @@ DoLevelWindow(engine_resources *Engine) u64 Delimeter = LEVEL_FILE_DEBUG_OBJECT_DELIM; Ensure(Serialize(&OutputStream, &Delimeter)); -#if 0 - IterateOver(&Editor->Layers, Layer, LayerIndex) + IterateOver(&Editor->Layers, Layer, LI) { - u32 EditCount = u32(TotalElements(&Layer->EditIndices)); - Serialize(&OutputStream, &EditCount); - IterateOver(&Layer->Edits, Edit, EditIndex) - { - if (Edit->Ordinal == EDIT_ORDINAL_TOMBSTONE) { continue; } - Serialize(&OutputStream, Edit); - } + Serialize(&OutputStream, Layer); } -#else - NotImplemented; -#endif + Ensure(Serialize(&OutputStream, &Delimeter)); + IterateOver(&Editor->Edits, Edit, EI) + { + Serialize(&OutputStream, Edit); + } Ensure(Serialize(&OutputStream, &Delimeter)); RangeIterator(EntityIndex, TOTAL_ENTITY_COUNT) @@ -2679,21 +2684,28 @@ DoLevelWindow(engine_resources *Engine) s32 ChunkCount = 0; /* Info("ChunksFreed (%u) ChunksLoaded (%u)", ChunksFreed, ChunkCount); */ - NotImplemented; - /* RangeIterator_t(u32, EditIndex, LevelHeader.EditCount) */ - /* { */ - /* world_edit DeserEdit = {}; // TODO(Jesse): Do we actually have to clear this? */ - /* Deserialize(&LevelBytes, &DeserEdit, GetTranArena()); */ + RangeIterator_t(u32, LayerIndex, LevelHeader.LayerCount) + { + world_edit_layer DeserLayer = {}; + Deserialize(&LevelBytes, &DeserLayer, Editor->Memory); + world_edit_layer *FinalLayer = Push(&Editor->Layers, &DeserLayer); + FinalLayer->EditIndices.Memory = Editor->Memory; + } + Ensure(Read_u64(&LevelBytes) == Delimeter); - /* world_edit *FinalEdit = Push(&Editor->WorldEdits, &DeserEdit); */ - /* if (FinalEdit->Brush) */ - /* { */ - /* FinalEdit->Brush = Upsert(*FinalEdit->Brush, &Editor->LoadedBrushes, Editor->Memory); */ - /* } */ + RangeIterator_t(u32, EditIndex, LevelHeader.EditCount) + { + world_edit DeserEdit = {}; // TODO(Jesse): Do we actually have to clear this? + Deserialize(&LevelBytes, &DeserEdit, Editor->Memory); - /* ApplyEditToOctree(Engine, FinalEdit, GetTranArena()); */ - /* } */ + world_edit *FinalEdit = Push(&Editor->Edits, &DeserEdit); + if (FinalEdit->Brush) + { + FinalEdit->Brush = Upsert(*FinalEdit->Brush, &Editor->LoadedBrushes, Editor->Memory); + } + ApplyEditToOctree(Engine, FinalEdit, GetTranArena()); + } Ensure(Read_u64(&LevelBytes) == Delimeter); b32 Error = False; diff --git a/src/engine/level.h b/src/engine/level.h index 536e97bc8..37aadc277 100644 --- a/src/engine/level.h +++ b/src/engine/level.h @@ -3,6 +3,7 @@ struct level_header { u32 LayerCount; + u32 EditCount; u32 EntityCount; // World Params diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 6bf4cbb08..73be26471 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -221,6 +221,13 @@ HardResetWorld(engine_resources *Engine) AllocateWorld(World, Center, ChunkDim, VisibleRegionSize); } +link_internal void +SoftResetGraphics(graphics *Graphics) +{ + Graphics->MainDrawList.ElementCount = 0;; + Graphics->ShadowMapDrawList.ElementCount = 0; +} + link_internal void HardResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag_None) { @@ -243,6 +250,8 @@ HardResetEngine(engine_resources *Engine, hard_reset_flags Flags = HardResetFlag HardResetWorld(Engine); + SoftResetGraphics(Graphics); + // TODO(Jesse)(leak): This leaks the texture handles; make a HardResetEngineDebug() Leak("?"); VaporizeArena(Engine->EngineDebug.Memory); diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index 3c84b30e4..31db33be0 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -449,3 +449,12 @@ poof(serdes_struct(world_edit_brush)) poof(serdes_struct(world_edit)) #include + +poof(serdes_struct(world_edit_block_array_index)) +#include + +poof(serdes_collection(world_edit_block_array_index, {block_array})) +#include + +poof(serdes_struct(world_edit_layer)) +#include diff --git a/src/engine/serdes.h b/src/engine/serdes.h index 165b2251f..280e7eec4 100644 --- a/src/engine/serdes.h +++ b/src/engine/serdes.h @@ -450,6 +450,47 @@ poof( } ) +poof( + func serdes_collection(element_type, type_poof_symbol collection_name ) + { + @var collection_type (element_type.name)_(collection_name) + + link_internal b32 + Serialize( u8_cursor_block_array *Bytes, collection_type *Collection) + { + auto i = AtElements(Collection); + u64 ElementCount = u64(GetIndex(&i)); + b32 Result = Write(Bytes, ElementCount); + + IterateOver(Collection, Element, EIndex) + { + Result &= Serialize(Bytes, Element); + } + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + return Result; + } + + link_internal b32 + Deserialize( u8_cursor *Bytes, collection_type *Collection, memory_arena *Memory) + { + u64 ElementCount = Read_u64(Bytes); + Collection->Memory = Memory; + + b32 Result = True; + RangeIterator_t(u64, EIndex, ElementCount) + { + element_type.name Element = {}; + Result &= Deserialize(Bytes, &Element, Memory); + Push(Collection, &Element); + } + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; + } + } +) + poof( func serdes_struct(type) { From 2cbf4c354a6a58bd966ff2eb2f750d0ecfbcccd8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 8 Jun 2025 10:36:36 -0700 Subject: [PATCH 270/421] Change editor::CurrentBrush to always be set --- src/engine/editor.cpp | 439 +++++++++++++++++++++--------------------- src/engine/editor.h | 3 + 2 files changed, 225 insertions(+), 217 deletions(-) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 8a17b15a3..00a197c54 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1118,264 +1118,264 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ { UNPACK_ENGINE_RESOURCES(Engine); - layered_brush *LayeredBrush = &Brush->Layered; - b32 IsNewBrush = False; -#if 1 + PushWindowStart(Ui, BrushSettingsWindow); + Assert(Brush); { - b32 BrushUninitialized = Brush->NameBuf[0] == 0 && Brush->Layered.LayerCount == 0; - if (BrushUninitialized) + b32 IsNewBrush = False; + layered_brush *LayeredBrush = &Brush->Layered; { - NewBrush(Brush); - IsNewBrush = True; + b32 BrushUninitialized = Brush->NameBuf[0] == 0 && Brush->Layered.LayerCount == 0; + if (BrushUninitialized) + { + NewBrush(Brush); + IsNewBrush = True; + } } - } -#endif - // - // Brush toolbar buttons - // - { - PushWindowStart(Ui, BrushSettingsWindow); - memory_arena *Tran = GetTranArena(); - - if (LayeredBrush->LayerCount) + // + // Brush toolbar buttons + // { - ui_brush_actions BrushAction = {}; - ui_toggle_button_group Toolbar = PushToolbar(Ui, BrushSettingsWindow, CSz(""), &BrushAction); - switch (BrushAction) - { - case UiBrushAction_NoAction: {} break; - - case UiBrushAction_New: - { - world_edit_brush ThisBrush = NewBrush(); - Editor->CurrentBrush = Insert(ThisBrush, &Editor->LoadedBrushes, Editor->Memory); - } break; + memory_arena *Tran = GetTranArena(); - case UiBrushAction_Save: + if (LayeredBrush->LayerCount) + { + ui_brush_actions BrushAction = {}; + ui_toggle_button_group Toolbar = PushToolbar(Ui, BrushSettingsWindow, CSz(""), &BrushAction); + switch (BrushAction) { - cs BrushFilepath = GetFilenameForBrush(CS(Brush->NameBuf)); - SaveBrush(Brush, BrushFilepath.Start); - } break; + case UiBrushAction_NoAction: {} break; - case UiBrushAction_Duplicate: - { - world_edit_brush Duplicated = *Brush; + case UiBrushAction_New: + { + world_edit_brush ThisBrush = NewBrush(); + Editor->CurrentBrush = Insert(ThisBrush, &Editor->LoadedBrushes, Editor->Memory); + } break; - cs_buffer Pieces = Split( CS(Duplicated.NameBuf), '.', Tran); + case UiBrushAction_Save: + { + cs BrushFilepath = GetFilenameForBrush(CS(Brush->NameBuf)); + SaveBrush(Brush, BrushFilepath.Start); + } break; - if (Pieces.Count > 2) + case UiBrushAction_Duplicate: { - cs BrushNameString = Pieces.Start[0]; - cs VersionString = Pieces.Start[Pieces.Count-2]; + world_edit_brush Duplicated = *Brush; + + cs_buffer Pieces = Split( CS(Duplicated.NameBuf), '.', Tran); - s32 VersionNumber; - if ( ParseInteger(VersionString, &VersionNumber) ) + if (Pieces.Count > 2) { - cs BrushFilepath = GetFilenameForBrush(BrushNameString, VersionNumber); - while (FileExists(BrushFilepath.Start)) + cs BrushNameString = Pieces.Start[0]; + cs VersionString = Pieces.Start[Pieces.Count-2]; + + s32 VersionNumber; + if ( ParseInteger(VersionString, &VersionNumber) ) { - ++VersionNumber; - BrushFilepath = GetFilenameForBrush(BrushNameString, VersionNumber); - } + cs BrushFilepath = GetFilenameForBrush(BrushNameString, VersionNumber); + while (FileExists(BrushFilepath.Start)) + { + ++VersionNumber; + BrushFilepath = GetFilenameForBrush(BrushNameString, VersionNumber); + } + SaveBrush(&Duplicated, BrushFilepath.Start); + } + } + else + { + cs BrushFilepath = GetFilenameForBrush(CS(Duplicated.NameBuf), 1); SaveBrush(&Duplicated, BrushFilepath.Start); } - } - else - { - cs BrushFilepath = GetFilenameForBrush(CS(Duplicated.NameBuf), 1); - SaveBrush(&Duplicated, BrushFilepath.Start); - } - Editor->CurrentBrush = Insert(Duplicated, &Editor->LoadedBrushes, Editor->Memory); - } break; + Editor->CurrentBrush = Insert(Duplicated, &Editor->LoadedBrushes, Editor->Memory); + } break; #if 0 - case UiBrushAction_Import: - { - ui_id ImportToggleId = UiId(BrushSettingsWindow, "brush import", 0u); - if (ToggleButton(Ui, CSz("Import"), CSz("Import"), ImportToggleId)) + case UiBrushAction_Import: { - PushNewRow(Ui); + ui_id ImportToggleId = UiId(BrushSettingsWindow, "brush import", 0u); + if (ToggleButton(Ui, CSz("Import"), CSz("Import"), ImportToggleId)) + { + PushNewRow(Ui); - filtered_file_traversal_helper_params HelperParams = {BrushSettingsWindow, 0}; - maybe_file_traversal_node ClickedFileNode = PlatformTraverseDirectoryTreeUnordered(CSz("brushes"), EngineDrawFileNodesFilteredHelper, u64(&HelperParams) ); + filtered_file_traversal_helper_params HelperParams = {BrushSettingsWindow, 0}; + maybe_file_traversal_node ClickedFileNode = PlatformTraverseDirectoryTreeUnordered(CSz("brushes"), EngineDrawFileNodesFilteredHelper, u64(&HelperParams) ); - if (ClickedFileNode.Tag) - { - LoadBrushFromFile(Editor, &ClickedFileNode.Value, Tran); - SetToggleButton(Ui, ImportToggleId, False); + if (ClickedFileNode.Tag) + { + LoadBrushFromFile(Editor, &ClickedFileNode.Value, Tran); + SetToggleButton(Ui, ImportToggleId, False); + } } - } - } break; + } break; #endif + } } - } - { - - if (LayeredBrush->LayerCount) { - PushNewRow(Ui); - PushNewRow(Ui); + if (LayeredBrush->LayerCount) { - ui_id TextBoxId = UiId(BrushSettingsWindow, "name_buf_textbox", Brush->NameBuf); - cs NameBuf = CS(Brush->NameBuf); - TextBox(Ui, CSz("BrushName"), NameBuf, NameBuf_Len, TextBoxId); PushNewRow(Ui); - - DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->LayerCount, CSz("Layer Count"), &DefaultUiRenderParams_Generic); - // Clamp LayerCount to (1,MAX_BRUSH_LAYERS) once it's set - LayeredBrush->LayerCount = Max(LayeredBrush->LayerCount, 1); - LayeredBrush->LayerCount = Min(LayeredBrush->LayerCount, MAX_BRUSH_LAYERS); PushNewRow(Ui); - PushNewRow(Ui); - } - { - DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->Mode, CSz("Mode"), &DefaultUiRenderParams_Generic); - DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->Modifier, CSz("Modifier"), &DefaultUiRenderParams_Generic); - PushNewRow(Ui); - } + { + ui_id TextBoxId = UiId(BrushSettingsWindow, "name_buf_textbox", Brush->NameBuf); + cs NameBuf = CS(Brush->NameBuf); + TextBox(Ui, CSz("BrushName"), NameBuf, NameBuf_Len, TextBoxId); + PushNewRow(Ui); - { - DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->SeedBrushWithSelection, CSz("SeedBrushWithSelection"), &DefaultUiRenderParams_Checkbox); - PushNewRow(Ui); + DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->LayerCount, CSz("Layer Count"), &DefaultUiRenderParams_Generic); + // Clamp LayerCount to (1,MAX_BRUSH_LAYERS) once it's set + LayeredBrush->LayerCount = Max(LayeredBrush->LayerCount, 1); + LayeredBrush->LayerCount = Min(LayeredBrush->LayerCount, MAX_BRUSH_LAYERS); + PushNewRow(Ui); + PushNewRow(Ui); + } - DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->BrushFollowsCursor, CSz("BrushFollowsCursor"), &DefaultUiRenderParams_Checkbox); - PushNewRow(Ui); - PushNewRow(Ui); - } + { + DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->Mode, CSz("Mode"), &DefaultUiRenderParams_Generic); + DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->Modifier, CSz("Modifier"), &DefaultUiRenderParams_Generic); + PushNewRow(Ui); + } - } + { + DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->SeedBrushWithSelection, CSz("SeedBrushWithSelection"), &DefaultUiRenderParams_Checkbox); + PushNewRow(Ui); - { - s32 EditLayerIndex = 0; - ui_brush_layer_actions BrushLayerAction = {}; + DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->BrushFollowsCursor, CSz("BrushFollowsCursor"), &DefaultUiRenderParams_Checkbox); + PushNewRow(Ui); + PushNewRow(Ui); + } - PushTableStart(Ui); + } - brush_layer *BrushLayers = Brush->Layered.Layers; - RangeIterator(LayerIndex, LayeredBrush->LayerCount) { - brush_layer *BrushLayer = BrushLayers + LayerIndex; + s32 EditLayerIndex = 0; + ui_brush_layer_actions BrushLayerAction = {}; - ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", u32(LayerIndex)); - cs LayerDetails = GetLayerUiText(BrushLayer, GetTranArena()); + PushTableStart(Ui); - if (ToggleButton(Ui, FSz("v %d %S", LayerIndex, LayerDetails), FSz("> %d %S", LayerIndex, LayerDetails), ToggleId)) + brush_layer *BrushLayers = Brush->Layered.Layers; + RangeIterator(LayerIndex, LayeredBrush->LayerCount) { - ui_toggle_button_group Toolbar = PushToolbar(Ui, BrushSettingsWindow, CSz(""), &BrushLayerAction, u64(LayerIndex)); - if (Toolbar.AnyElementClicked) + brush_layer *BrushLayer = BrushLayers + LayerIndex; + + ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", u32(LayerIndex)); + cs LayerDetails = GetLayerUiText(BrushLayer, GetTranArena()); + + if (ToggleButton(Ui, FSz("v %d %S", LayerIndex, LayerDetails), FSz("> %d %S", LayerIndex, LayerDetails), ToggleId)) { - EditLayerIndex = LayerIndex; + ui_toggle_button_group Toolbar = PushToolbar(Ui, BrushSettingsWindow, CSz(""), &BrushLayerAction, u64(LayerIndex)); + if (Toolbar.AnyElementClicked) + { + EditLayerIndex = LayerIndex; - if (BrushLayerAction == UiBrushLayerAction_Delete) { SetToggleButton(Ui, ToggleId, False); } + if (BrushLayerAction == UiBrushLayerAction_Delete) { SetToggleButton(Ui, ToggleId, False); } - b32 ThisState = GetToggleState(Ui, ToggleId); + b32 ThisState = GetToggleState(Ui, ToggleId); - if (BrushLayerAction == UiBrushLayerAction_MoveUp) - { - ui_id NextId = ToggleId; - NextId.ElementBits -= 1; - b32 NextState = GetToggleState(Ui, NextId); + if (BrushLayerAction == UiBrushLayerAction_MoveUp) + { + ui_id NextId = ToggleId; + NextId.ElementBits -= 1; + b32 NextState = GetToggleState(Ui, NextId); - SetToggleButton(Ui, ToggleId, NextState); - SetToggleButton(Ui, NextId, ThisState); - } + SetToggleButton(Ui, ToggleId, NextState); + SetToggleButton(Ui, NextId, ThisState); + } - if (BrushLayerAction == UiBrushLayerAction_MoveDown) - { - ui_id NextId = ToggleId; - NextId.ElementBits += 1; - b32 NextState = GetToggleState(Ui, NextId); + if (BrushLayerAction == UiBrushLayerAction_MoveDown) + { + ui_id NextId = ToggleId; + NextId.ElementBits += 1; + b32 NextState = GetToggleState(Ui, NextId); + + SetToggleButton(Ui, ToggleId, NextState); + SetToggleButton(Ui, NextId, ThisState); + } - SetToggleButton(Ui, ToggleId, NextState); - SetToggleButton(Ui, NextId, ThisState); } + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + DoEditorUi(Ui, BrushSettingsWindow, BrushLayer, {}); + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + else + { + DoColorSwatch(Ui, V2(20), HSVtoRGB(BrushLayer->Settings.HSVColor)); } - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - DoEditorUi(Ui, BrushSettingsWindow, BrushLayer, {}); - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - else - { - DoColorSwatch(Ui, V2(20), HSVtoRGB(BrushLayer->Settings.HSVColor)); + if (IsNewBrush && LayerIndex == 0) + { + SetToggleButton(Ui, ToggleId, True); + } + + PushNewRow(Ui); } + PushTableEnd(Ui); - if (IsNewBrush && LayerIndex == 0) + if (BrushLayerAction == UiBrushLayerAction_MoveUp) { - SetToggleButton(Ui, ToggleId, True); + if (EditLayerIndex > 0) + { + brush_layer *BrushLayer = BrushLayers + EditLayerIndex; + brush_layer Tmp = BrushLayers[EditLayerIndex-1]; + BrushLayers[EditLayerIndex-1].Settings = BrushLayer->Settings; + BrushLayer->Settings = Tmp.Settings; + } } - PushNewRow(Ui); - } - PushTableEnd(Ui); - - if (BrushLayerAction == UiBrushLayerAction_MoveUp) - { - if (EditLayerIndex > 0) + if (BrushLayerAction == UiBrushLayerAction_MoveDown) { - brush_layer *BrushLayer = BrushLayers + EditLayerIndex; - brush_layer Tmp = BrushLayers[EditLayerIndex-1]; - BrushLayers[EditLayerIndex-1].Settings = BrushLayer->Settings; - BrushLayer->Settings = Tmp.Settings; + if (LayeredBrush->LayerCount) + { + if (EditLayerIndex < LayeredBrush->LayerCount-1) + { + brush_layer *BrushLayer = BrushLayers + EditLayerIndex; + brush_layer Tmp = BrushLayers[EditLayerIndex+1]; + BrushLayers[EditLayerIndex+1].Settings = BrushLayer->Settings; + BrushLayer->Settings = Tmp.Settings; + } + } } - } - if (BrushLayerAction == UiBrushLayerAction_MoveDown) - { - if (LayeredBrush->LayerCount) + if (BrushLayerAction == UiBrushLayerAction_Duplicate) { - if (EditLayerIndex < LayeredBrush->LayerCount-1) + if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) { - brush_layer *BrushLayer = BrushLayers + EditLayerIndex; - brush_layer Tmp = BrushLayers[EditLayerIndex+1]; - BrushLayers[EditLayerIndex+1].Settings = BrushLayer->Settings; - BrushLayer->Settings = Tmp.Settings; + LayeredBrush->LayerCount += 1; + + // Shuffle layers forward. This conveniently duplicates the EditLayerIndex + RangeIteratorReverseRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) + { + BrushLayers[LayerIndex].Settings = BrushLayers[LayerIndex-1].Settings; + } } } - } - if (BrushLayerAction == UiBrushLayerAction_Duplicate) - { - if (LayeredBrush->LayerCount < MAX_BRUSH_LAYERS) + if (BrushLayerAction == UiBrushLayerAction_Delete) { - LayeredBrush->LayerCount += 1; + // NOTE(Jesse): Not an `if` because we shouldn't be able to ask to + // delete a layer if there aren't any to delete! + Assert(LayeredBrush->LayerCount > 0); - // Shuffle layers forward. This conveniently duplicates the EditLayerIndex - RangeIteratorReverseRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) + // Shuffle layers backwards, overwriting EditLayerIndex + RangeIteratorRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) { - BrushLayers[LayerIndex].Settings = BrushLayers[LayerIndex-1].Settings; + Assert(LayerIndex >= 0 && LayerIndex < MAX_BRUSH_LAYERS); + BrushLayers[LayerIndex-1].Settings = BrushLayers[LayerIndex].Settings; } - } - } - if (BrushLayerAction == UiBrushLayerAction_Delete) - { - // NOTE(Jesse): Not an `if` because we shouldn't be able to ask to - // delete a layer if there aren't any to delete! - Assert(LayeredBrush->LayerCount > 0); - - // Shuffle layers backwards, overwriting EditLayerIndex - RangeIteratorRange(LayerIndex, MAX_BRUSH_LAYERS, EditLayerIndex+1) - { - Assert(LayerIndex >= 0 && LayerIndex < MAX_BRUSH_LAYERS); - BrushLayers[LayerIndex-1].Settings = BrushLayers[LayerIndex].Settings; + LayeredBrush->LayerCount -= 1; } - - LayeredBrush->LayerCount -= 1; } } - } + } } - PushWindowEnd(Ui, BrushSettingsWindow); } @@ -1900,6 +1900,13 @@ DoWorldEditor(engine_resources *Engine) { UNPACK_ENGINE_RESOURCES(Engine); + if (Editor->CurrentBrush == 0) + { + world_edit_brush ThisBrush = NewBrush(); + Editor->CurrentBrush = Insert(ThisBrush, &Editor->LoadedBrushes, Editor->Memory); + } + + // @selection_changed_flag // aabb_intersect_result AABBTest = EditWorldSelection(Engine); @@ -2151,52 +2158,49 @@ DoWorldEditor(engine_resources *Engine) } PushWindowEnd(Ui, &AllBrushesWindow); - if (Editor->CurrentBrush) - { - local_persist window_layout BrushSettingsWindow = WindowLayout("Brush Settings", WindowLayoutFlag_Align_Right); - DoBrushSettingsWindow(Engine, Editor->CurrentBrush, &BrushSettingsWindow); + local_persist window_layout BrushSettingsWindow = WindowLayout("Brush Settings", WindowLayoutFlag_Align_Right); + DoBrushSettingsWindow(Engine, Editor->CurrentBrush, &BrushSettingsWindow); - // NOTE(Jesse): Must come after the settings window draws because the - // settings window detects and initializes new brushes - if (SelectionComplete(Editor->Selection.Clicks) && Editor->CurrentBrush) + // NOTE(Jesse): Must come after the settings window draws because the + // settings window detects and initializes new brushes + if (SelectionComplete(Editor->Selection.Clicks) && Editor->CurrentBrush) + { + if (Editor->Selection.InitialSelect) { - if (Editor->Selection.InitialSelect) + Info("Setting Initial edit state"); + Assert(AtElements(&Editor->SelectedEditIndices).Index == 1); + auto EditIndex = GetPtr(&Editor->SelectedEditIndices, {}); + world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); + UpdateWorldEditBounds(Engine, Edit, Editor->Selection.Region, GetTranArena()); + } + else if (Editor->Selection.Changed) + { + if (LengthSq(Editor->Selection.Diff) > 0.f) { - Info("Setting Initial edit state"); - Assert(AtElements(&Editor->SelectedEditIndices).Index == 1); - auto EditIndex = GetPtr(&Editor->SelectedEditIndices, {}); - world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); - UpdateWorldEditBounds(Engine, Edit, Editor->Selection.Region, GetTranArena()); + Info("Applying diff to edit buffer"); + world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); + Assert(SelectionMode); + ApplyDiffToEditBuffer(Engine, Editor->Selection.Diff, &Editor->SelectedEditIndices, SelectionMode); + Editor->Selection.ModState.ClickedFace = FaceIndex_None; } - else if (Editor->Selection.Changed) + else { - if (LengthSq(Editor->Selection.Diff) > 0.f) - { - Info("Applying diff to edit buffer"); - world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); - Assert(SelectionMode); - ApplyDiffToEditBuffer(Engine, Editor->Selection.Diff, &Editor->SelectedEditIndices, SelectionMode); - Editor->Selection.ModState.ClickedFace = FaceIndex_None; - } - else - { - // The selection area was probably just resizing to enclose multiple selected edits - } + // The selection area was probably just resizing to enclose multiple selected edits } + } - b32 SettingsChanged = CheckSettingsChanged(&Editor->CurrentBrush->Layered); - if (SettingsChanged) + b32 SettingsChanged = CheckSettingsChanged(&Editor->CurrentBrush->Layered); + if (SettingsChanged) + { + IterateOver(&Editor->Edits, Edit, EditIndex) { - IterateOver(&Editor->Edits, Edit, EditIndex) - { - if (Edit->Tombstone) { continue; } + if (Edit->Tombstone) { continue; } - if (Edit->Brush == Editor->CurrentBrush) - { - // TODO(Jesse): We should be able to just mark the overlapping - // nodes dirty because we're not actually updating the edit bounds here.. - UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); - } + if (Edit->Brush == Editor->CurrentBrush) + { + // TODO(Jesse): We should be able to just mark the overlapping + // nodes dirty because we're not actually updating the edit bounds here.. + UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); } } } @@ -2431,6 +2435,7 @@ DoWorldEditor(engine_resources *Engine) case UiLayerEditAction_SetBrush: { + Assert(Editor->CurrentBrush); Edit->Brush = Editor->CurrentBrush; UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); } break; diff --git a/src/engine/editor.h b/src/engine/editor.h index cf9e106bc..7629ac553 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1312,6 +1312,9 @@ struct level_editor world_edit_block_array_index_block_array SelectedEditIndices; world_edit *HotEdit; + // TODO(Jesse): This is a stupid form of stoarge. We don't ever look anything + // up, we just keep pointers into it. Change to a paged-array and store the + // indices such that we save space when doing serialize/deserialize; world_edit_brush_hashtable LoadedBrushes; world_edit_brush *CurrentBrush; }; From 8b76f11c9ad02945fba4e5b5411862436103bf2b Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 8 Jun 2025 11:49:37 -0700 Subject: [PATCH 271/421] Add plane shape --- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 26 +++- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ..._type_world_update_op_shape_params_plane.h | 144 ++++++++++++++++++ ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 11 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_Bxw4Q7AW.h | 3 +- generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kh9dwrCf.h | 2 +- generated/for_datatypes_kv3WBTai.h | 1 + generated/hashtable_world_edit_brush.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/serdes_struct_brush_layer.h | 2 +- generated/serdes_struct_brush_settings.h | 2 +- generated/serdes_struct_layered_brush.h | 2 +- generated/serdes_struct_shape_layer.h | 17 ++- generated/serdes_struct_world_edit.h | 2 +- ...rdes_struct_world_edit_block_array_index.h | 2 +- generated/serdes_struct_world_edit_brush.h | 2 +- generated/serdes_struct_world_edit_layer.h | 2 +- ...truct_world_update_op_shape_params_plane.h | 130 ++++++++++++++++ .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- .../string_and_value_tables_shape_type.h | 5 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- shaders/terrain/world_edit.fragmentshader | 15 +- src/engine/editor.cpp | 2 + src/engine/editor.h | 10 ++ src/engine/render_loop.cpp | 22 +++ src/engine/serdes.cpp | 2 + 124 files changed, 493 insertions(+), 115 deletions(-) create mode 100644 generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h create mode 100644 generated/serdes_struct_world_update_op_shape_params_plane.h diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index ac6d78d9f..dfe7bc8ec 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1119:0 +// src/engine/editor.h:1129:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 7be90252a..7555efcb6 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1232:0 +// src/engine/editor.h:1242:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 30ca136a1..371fe4731 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1257:0 +// src/engine/editor.h:1267:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index b78c2937a..76f410736 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1268:0 +// src/engine/editor.h:1278:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 8ca973026..5180c665e 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1253:0 +// src/engine/editor.h:1263:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index ba8f8c9df..ae997b66a 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1072:0 +// src/engine/editor.h:1082:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 4640bca45..24aaec8b0 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:311:0 +// src/engine/editor.cpp:313:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 27900c752..4950fa16e 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:472:0 +// src/engine/editor.cpp:474:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 908004c20..fd031f28b 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:464:0 +// src/engine/editor.cpp:466:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index d469e3223..bc3537ea7 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:350:0 +// src/engine/editor.cpp:352:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index cc93970a8..ee1ec99e1 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:317:0 +// src/engine/editor.cpp:319:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 9c1e55826..14af8c3af 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:250:0 +// src/engine/editor.cpp:252:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index c0b7a426d..9eae76b83 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:375:0 +// src/engine/editor.cpp:377:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 4a0a5f95f..d44a4471c 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:156:0 +// src/engine/editor.cpp:158:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index e120ad4a9..57556d4e8 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:344:0 +// src/engine/editor.cpp:346:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 605c8f0f7..985fff87d 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:405:0 +// src/engine/editor.cpp:407:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 9d6893343..b106b0a54 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:353:0 +// src/engine/editor.cpp:355:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index c30bb548d..88b2bc89d 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:475:0 +// src/engine/editor.cpp:477:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 4e561236e..9aad3cfd9 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:246:0 +// src/engine/editor.cpp:248:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index b38dc057b..29cccd725 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:536:0 +// src/engine/editor.cpp:538:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index bf9789134..a61f17bfe 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:557:0 +// src/engine/editor.cpp:559:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 67fcd3945..5c6602cdd 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:554:0 +// src/engine/editor.cpp:556:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 7af0b04b7..327e0928e 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:444:0 +// src/engine/editor.cpp:446:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 19a38ff50..8d324fcf9 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:443:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 1ae114d2a..b5380a5e9 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:478:0 +// src/engine/editor.cpp:480:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 50f155d4f..8515390ce 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:429:0 +// src/engine/editor.cpp:431:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index e53810a79..65f2b7844 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:341:0 +// src/engine/editor.cpp:343:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 86e7b3afe..50a43c47a 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:512:0 +// src/engine/editor.cpp:514:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 5069c878d..771875b73 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:506:0 +// src/engine/editor.cpp:508:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index b56a95d3a..7c103581b 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:411:0 +// src/engine/editor.cpp:413:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 28bbeea2b..455f8d8dd 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:414:0 +// src/engine/editor.cpp:416:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 8c5b61df6..47b01d7ee 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:527:0 +// src/engine/editor.cpp:529:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 50bf0f1db..f9cf970b2 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:551:0 +// src/engine/editor.cpp:553:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index aab170e4b..130664534 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:239:0 +// src/engine/editor.cpp:241:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 1d52c6db8..84d6d3727 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:236:0 +// src/engine/editor.cpp:238:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index d3783676d..278674563 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:308:0 +// src/engine/editor.cpp:310:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 2194a7fa7..b1e190010 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:378:0 +// src/engine/editor.cpp:380:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 1950ac0f9..734d222ec 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:542:0 +// src/engine/editor.cpp:544:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 4d5f96f3c..8f328f0bb 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:509:0 +// src/engine/editor.cpp:511:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 34921ff96..b387efec7 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:287:0 +// src/engine/editor.cpp:289:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 533871f0a..72706ea34 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:417:0 +// src/engine/editor.cpp:419:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 4f79c5d96..dec93b68f 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:420:0 +// src/engine/editor.cpp:422:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 0b1b5da52..99200a8cc 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:454:0 +// src/engine/editor.cpp:456:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index ed7489f30..d4ef2f0b8 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:302:0 +// src/engine/editor.cpp:304:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 1b6070558..e4bd325d6 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:305:0 +// src/engine/editor.cpp:307:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index ac670f638..d02cb10f9 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:293:0 +// src/engine/editor.cpp:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index d13b76e79..e77faba83 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:338:0 +// src/engine/editor.cpp:340:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index de6436c0b..bc63cd65b 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:242:0 +// src/engine/editor.cpp:244:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index f359f8392..9d35a785f 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:296:0 +// src/engine/editor.cpp:298:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index a121b7ba1..25153864b 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:500:0 +// src/engine/editor.cpp:502:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index aee9dbf30..28e958798 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:530:0 +// src/engine/editor.cpp:532:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index da5144818..7bf92d999 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:290:0 +// src/engine/editor.cpp:292:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 1cf78ac79..7ae7264cf 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:503:0 +// src/engine/editor.cpp:505:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 0b78798e3..c6fc151e9 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:222:0 +// src/engine/editor.cpp:224:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 0a1611565..875c5307d 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:154:0 +// src/engine/editor.cpp:156:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -144,6 +144,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name + } + + + if (Element->Type == ShapeType_Plane) + + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_update_op_shape_params_plane*, &Element->Plane), + MemberName, + Params + ); + + + + + + + } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index bae4273d8..6f341926d 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:518:0 +// src/engine/editor.cpp:520:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index dd24f76ad..c8576ecf7 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:521:0 +// src/engine/editor.cpp:523:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 52b145ae2..19afff182 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:515:0 +// src/engine/editor.cpp:517:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 0b4cbc1c8..6bd5131ea 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:384:0 +// src/engine/editor.cpp:386:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 150da3b5f..6339d6ac1 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:381:0 +// src/engine/editor.cpp:383:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 955df0a7a..0ad837767 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:524:0 +// src/engine/editor.cpp:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 4224cfa5d..80430c47b 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:347:0 +// src/engine/editor.cpp:349:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index e36d1f34b..27c246f2a 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:533:0 +// src/engine/editor.cpp:535:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 01d1386b6..246b991e5 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:162:0 +// src/engine/editor.cpp:164:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 6f97ef25d..ad20d3dcb 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:165:0 +// src/engine/editor.cpp:167:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 35b60a667..5f52caaf6 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:320:0 +// src/engine/editor.cpp:322:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 3eac18589..747cd44da 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:314:0 +// src/engine/editor.cpp:316:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 434449b28..c0fe68c66 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:408:0 +// src/engine/editor.cpp:410:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 6c9986c6f..45e57f77f 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:399:0 +// src/engine/editor.cpp:401:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index b8899e468..6291cbe26 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:402:0 +// src/engine/editor.cpp:404:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index f824f8c69..f0702d527 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:233:0 +// src/engine/editor.cpp:235:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index b6034e50f..7512e7369 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:230:0 +// src/engine/editor.cpp:232:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 1dd092977..4e6a99c9f 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:457:0 +// src/engine/editor.cpp:459:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index b22dfca75..9001cb283 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:451:0 +// src/engine/editor.cpp:453:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index fd183c041..da7f5ebdc 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:390:0 +// src/engine/editor.cpp:392:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index 32482aa80..befa3d4bd 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:387:0 +// src/engine/editor.cpp:389:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h new file mode 100644 index 000000000..bbbeb2b48 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h @@ -0,0 +1,144 @@ +// src/engine/editor.cpp:148:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_plane", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("Pos"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Pos), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("Normal"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Normal), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("d"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->d), + MemberName, + Params + ); + + + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("Thickness"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->Thickness), + MemberName, + Params + ); + + + + + + + + } + + PushNewRow(Ui); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index ca7049a2d..180b27d3b 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:448:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index cc18483e6..fd2870e39 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:423:0 +// src/engine/editor.cpp:425:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index f35b0fea5..d7bc9204d 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:225:0 +// src/engine/editor.cpp:227:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 9e0d26b51..a7222c194 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:219:0 +// src/engine/editor.cpp:221:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index ea29a1d6d..193951a2c 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:174:0 +// src/engine/editor.cpp:176:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 063d8f058..2b94e4b84 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:159:0 +// src/engine/editor.cpp:161:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index 0613e0e49..50e8f5426 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:393:0 +// src/engine/editor.cpp:395:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 73f85c542..98090ed67 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:469:0 +// src/engine/editor.cpp:471:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 31253ca92..b3c757378 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:396:0 +// src/engine/editor.cpp:398:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index b0cbed863..691232bee 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:539:0 +// src/engine/editor.cpp:541:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index ec3f987c9..4f1562b5f 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:278:0 +// src/engine/editor.cpp:280:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 3442d5855..3aa494cdf 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:275:0 +// src/engine/editor.cpp:277:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index db8fb8da5..9c33f2b2f 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:426:0 +// src/engine/editor.cpp:428:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index f85722904..c207afecb 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:299:0 +// src/engine/editor.cpp:301:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 63bfa91f9..bd5ebcecb 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:545:0 +// src/engine/editor.cpp:547:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 0ab5da69d..9d54a3eec 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:548:0 +// src/engine/editor.cpp:550:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 39758f240..247c9a64f 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:152:0 +// src/engine/editor.cpp:154:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) @@ -43,6 +43,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, *Element = ShapeType_Cylinder; + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Plane"), UiId(Window, "enum ShapeType_Plane", Element), Params)) + { + *Element = ShapeType_Plane; + + SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index f13688ac3..31123ef6d 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:281:0 +// src/engine/editor.cpp:283:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 3ce556787..3629b879b 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1088:0 +// src/engine/editor.h:1098:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 745cace93..56aef9849 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -754,6 +754,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 578e97dda..3a013e2ba 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1,4 +1,5 @@ -// src/engine/editor.cpp:486:0 +// src/engine/editor.cpp:488:0 + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 279b32766..3ea2cc44e 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -744,6 +744,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 038293074..40a6ae88e 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:360:0 +// src/engine/editor.cpp:362:0 diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 6d79a1ccf..e0823ff2e 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -744,6 +744,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 955d9581f..fa6745dd9 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1235:0 +// src/engine/editor.h:1245:0 struct world_edit_brush_linked_list_node { diff --git a/generated/serdes_collection_world_edit_block_array_index_block_array.h b/generated/serdes_collection_world_edit_block_array_index_block_array.h index 6fd972e25..d1f01d5bb 100644 --- a/generated/serdes_collection_world_edit_block_array_index_block_array.h +++ b/generated/serdes_collection_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:456:0 +// src/engine/serdes.cpp:458:0 diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index 41668a729..4d839ba1c 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:438:0 +// src/engine/serdes.cpp:440:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index 992de8665..b7931856a 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:435:0 +// src/engine/serdes.cpp:437:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index b72ad7f96..999da198c 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:444:0 +// src/engine/serdes.cpp:446:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index 4aff903ae..f55395463 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:431:0 +// src/engine/serdes.cpp:433:0 link_internal bonsai_type_info TypeInfo(shape_layer *Ignored) @@ -67,6 +67,13 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) + Result &= Serialize(Bytes, &Element->Plane); // default + + + + + + Result &= Serialize(Bytes, &Element->Threshold); // default @@ -134,6 +141,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer *Element, memory_arena * + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Plane, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Threshold, Memory); diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index da3ad8afc..fb2f3abb3 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:450:0 +// src/engine/serdes.cpp:452:0 link_internal bonsai_type_info TypeInfo(world_edit *Ignored) diff --git a/generated/serdes_struct_world_edit_block_array_index.h b/generated/serdes_struct_world_edit_block_array_index.h index 89ffe598a..355eaaefb 100644 --- a/generated/serdes_struct_world_edit_block_array_index.h +++ b/generated/serdes_struct_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:453:0 +// src/engine/serdes.cpp:455:0 link_internal bonsai_type_info TypeInfo(world_edit_block_array_index *Ignored) diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index 14560e18f..062ddfc44 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:447:0 +// src/engine/serdes.cpp:449:0 link_internal bonsai_type_info TypeInfo(world_edit_brush *Ignored) diff --git a/generated/serdes_struct_world_edit_layer.h b/generated/serdes_struct_world_edit_layer.h index 649ec2cfa..61fefc843 100644 --- a/generated/serdes_struct_world_edit_layer.h +++ b/generated/serdes_struct_world_edit_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:459:0 +// src/engine/serdes.cpp:461:0 link_internal bonsai_type_info TypeInfo(world_edit_layer *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_plane.h b/generated/serdes_struct_world_update_op_shape_params_plane.h new file mode 100644 index 000000000..3dcd5eb7b --- /dev/null +++ b/generated/serdes_struct_world_update_op_shape_params_plane.h @@ -0,0 +1,130 @@ +// src/engine/serdes.cpp:428:0 + +link_internal bonsai_type_info +TypeInfo(world_update_op_shape_params_plane *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("world_update_op_shape_params_plane"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_plane *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + world_update_op_shape_params_plane *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->Pos); // default + + + + + + + Result &= Serialize(Bytes, &Element->Normal); // default + + + + + + + Result &= Serialize(Bytes, &Element->d); // default + + + + + + + Result &= Serialize(Bytes, &Element->Thickness); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_plane *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_plane *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_plane *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Pos, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Normal, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->d, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Thickness, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_plane *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 1ee3165a8..b31e4ce5a 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:467:0 +// src/engine/editor.cpp:469:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index b64ec6529..dddb4aad5 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:271:0 +// src/engine/editor.cpp:273:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index fca13169a..560a8cacf 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1086:0 +// src/engine/editor.h:1096:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 408b0f74d..e1ae1c921 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:265:0 +// src/engine/editor.cpp:267:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 8dd7a8e2e..c3a38294b 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:262:0 +// src/engine/editor.cpp:264:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index f55f69a1f..44ddc5fa0 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1028:0 +// src/engine/editor.h:1037:0 link_internal counted_string ToStringPrefixless(shape_type Type) @@ -10,6 +10,7 @@ ToStringPrefixless(shape_type Type) case ShapeType_Sphere: { Result = CSz("Sphere"); } break; case ShapeType_Line: { Result = CSz("Line"); } break; case ShapeType_Cylinder: { Result = CSz("Cylinder"); } break; + case ShapeType_Plane: { Result = CSz("Plane"); } break; } @@ -27,6 +28,7 @@ ToString(shape_type Type) case ShapeType_Sphere: { Result = CSz("ShapeType_Sphere"); } break; case ShapeType_Line: { Result = CSz("ShapeType_Line"); } break; case ShapeType_Cylinder: { Result = CSz("ShapeType_Cylinder"); } break; + case ShapeType_Plane: { Result = CSz("ShapeType_Plane"); } break; } @@ -43,6 +45,7 @@ ShapeType(counted_string S) if (StringsMatch(S, CSz("ShapeType_Sphere"))) { return ShapeType_Sphere; } if (StringsMatch(S, CSz("ShapeType_Line"))) { return ShapeType_Line; } if (StringsMatch(S, CSz("ShapeType_Cylinder"))) { return ShapeType_Cylinder; } + if (StringsMatch(S, CSz("ShapeType_Plane"))) { return ShapeType_Plane; } return Result; } diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 98bc4dbec..3d7e0e19c 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:268:0 +// src/engine/editor.cpp:270:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 87425fb34..1be07c60c 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -34,6 +34,16 @@ uniform f32 Radius; uniform s32 Axis; // voxel_rule_direction +// +// Plane Params +// +uniform v3 P; +uniform v3 N; +uniform f32 d; +uniform f32 Thickness; + + + // // Noise params @@ -187,8 +197,11 @@ void main() v3 X = cross(Line, LineRelativeXYZ); f32 Dist = length(X)/length(Line); if (Dist < Radius) { NoiseSample = Power; } + } break; - + // ShapeType_Plane + case 4: + { } break; // @sdf_shape_step(7): Add more cases and implementations here diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 00a197c54..01387cb2a 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -145,6 +145,8 @@ poof(do_editor_ui_for_compound_type(world_update_op_shape_params_sphere)) #include poof(do_editor_ui_for_compound_type(world_update_op_shape_params_cylinder)) #include +poof(do_editor_ui_for_compound_type(world_update_op_shape_params_plane)) +#include // @sdf_shape_step(4): Add the editor shit here .. diff --git a/src/engine/editor.h b/src/engine/editor.h index 7629ac553..34f2cdefb 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -969,6 +969,14 @@ struct world_update_op_shape_params_cylinder r32 Radius = 10.f; }; +struct world_update_op_shape_params_plane +{ + v3 Pos; + v3 Normal; + f32 d; + f32 Thickness; +}; + // @sdf_shape_step(2): Add new asset struct here // @@ -1021,6 +1029,7 @@ enum shape_type ShapeType_Sphere, ShapeType_Line, ShapeType_Cylinder, + ShapeType_Plane, // @sdf_shape_step(1): Add shape types here // @@ -1038,6 +1047,7 @@ struct shape_layer world_update_op_shape_params_sphere Sphere; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Sphere)) world_update_op_shape_params_sphere Line; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Line)) world_update_op_shape_params_cylinder Cylinder; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Cylinder)) + world_update_op_shape_params_plane Plane; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Plane)) // @sdf_shape_step(6): Add an instance of the new shape here // diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index dd0a502a2..535f62928 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -508,6 +508,28 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "Radius", Cylinder->Radius); } break; + case ShapeType_Plane: + { + auto Plane = &Shape->Plane; + + v3 Rad = (SimEditRect.Max-SimEditRect.Min)/2.f; + v3 Pos = SimEditRect.Min + Rad; + + v3 NRad = Normalize(Rad); + v3 Normal = Cross(NRad, -1.f*NRad); + + + Plane->d = -1.0f * (Normal.x*Pos.x + Normal.y*Pos.y + Normal.z*Pos.z); + Plane->Thickness = 5.f; + Plane->Normal = Normal; + Plane->Pos = Pos; + + BindUniformByName(&WorldEditRC->Program, "P", &Plane->Pos); + BindUniformByName(&WorldEditRC->Program, "Normal", &Plane->Normal); + BindUniformByName(&WorldEditRC->Program, "r", Plane->d); + BindUniformByName(&WorldEditRC->Program, "Thickness", Plane->Thickness); + } break; + // @sdf_shape_step(5): Calculate values and bind uniform variables for the new shape // } diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index 31db33be0..8b864d0da 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -425,6 +425,8 @@ poof(serdes_struct(world_update_op_shape_params_line)) #include poof(serdes_struct(world_update_op_shape_params_cylinder)) #include +poof(serdes_struct(world_update_op_shape_params_plane)) +#include // @sdf_shape_step(3): Add new asset struct here to generate serialization code // From 59231eda2da41e7e7eeb02984ea612474b76098f Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 8 Jun 2025 12:33:27 -0700 Subject: [PATCH 272/421] Debug plane shader --- shaders/terrain/world_edit.fragmentshader | 28 +++++++++++++++--- src/engine/render_loop.cpp | 35 +++++++++++++++-------- 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 1be07c60c..a2451b7c9 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -37,10 +37,10 @@ uniform s32 Axis; // voxel_rule_direction // // Plane Params // -uniform v3 P; -uniform v3 N; -uniform f32 d; -uniform f32 Thickness; +uniform v3 PlaneP; +uniform v3 PlaneNormal; +uniform f32 Planed; +uniform f32 PlaneThickness; @@ -66,6 +66,21 @@ uniform sampler2D InputTex; in vec2 UV; out vec4 Output; +r32 DistanceToPlane(v3 PlaneP, v3 PlaneNormal, f32 Planed, v3 P) +{ + r32 x = PlaneP.x; + r32 y = PlaneP.y; + r32 z = PlaneP.z; + + r32 a = PlaneNormal.x; + r32 b = PlaneNormal.y; + r32 c = PlaneNormal.z; + + r32 d = Planed; + + r32 Distance = a*P.x + b*P.y + c*P.z + d; + return Distance; +} void main() { @@ -202,6 +217,11 @@ void main() // ShapeType_Plane case 4: { + f32 Dist = DistanceToPlane(PlaneP, PlaneNormal, Planed, xyz); + if (abs(Dist) < PlaneThickness) + { + NoiseSample = 1.f; + } } break; // @sdf_shape_step(7): Add more cases and implementations here diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 535f62928..b6a75b2a3 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -358,6 +358,10 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) // Apply edits // + + static v3 Plane_SimShapeOrigin; + static v3 Plane_Normal; + { auto WorldEditRC = &Graphics->WorldEditRC; AcquireFutex(&Node->Lock); @@ -512,22 +516,24 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { auto Plane = &Shape->Plane; - v3 Rad = (SimEditRect.Max-SimEditRect.Min)/2.f; - v3 Pos = SimEditRect.Min + Rad; + Plane_SimShapeOrigin = GetSimSpaceP(World, Edit->Region.Min + EditRectRad); + v3 ChunkRelLocation = Plane_SimShapeOrigin - SimChunkMin; + + v3 NRad = Normalize(EditRectRad); + Plane_Normal = Cross(NRad, V3(1,0,0)); - v3 NRad = Normalize(Rad); - v3 Normal = Cross(NRad, -1.f*NRad); + auto Planed = -1.0f * (Plane_Normal.x*ChunkRelLocation.x + Plane_Normal.y*ChunkRelLocation.y + Plane_Normal.z*ChunkRelLocation.z); + auto PlaneThickness = 5.f; + auto PlaneNormal = Plane_Normal; + auto PlanePos = ChunkRelLocation; - Plane->d = -1.0f * (Normal.x*Pos.x + Normal.y*Pos.y + Normal.z*Pos.z); - Plane->Thickness = 5.f; - Plane->Normal = Normal; - Plane->Pos = Pos; - BindUniformByName(&WorldEditRC->Program, "P", &Plane->Pos); - BindUniformByName(&WorldEditRC->Program, "Normal", &Plane->Normal); - BindUniformByName(&WorldEditRC->Program, "r", Plane->d); - BindUniformByName(&WorldEditRC->Program, "Thickness", Plane->Thickness); + + BindUniformByName(&WorldEditRC->Program, "PlaneP", &PlanePos); + BindUniformByName(&WorldEditRC->Program, "PlaneNormal", &PlaneNormal); + BindUniformByName(&WorldEditRC->Program, "Planed", Planed); + BindUniformByName(&WorldEditRC->Program, "PlaneThickness", PlaneThickness); } break; // @sdf_shape_step(5): Calculate values and bind uniform variables for the new shape @@ -553,6 +559,11 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } #endif + DEBUG_DrawSimSpaceVectorAt( + Engine, + Plane_SimShapeOrigin, + Plane_Normal*100.f, V3(1,0,0), DEFAULT_LINE_THICKNESS*3.f ); + // // Terrain Finalize From 52cf8804aa1e1dded9dccba3bdec99269cd3eac5 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 8 Jun 2025 14:00:28 -0700 Subject: [PATCH 273/421] Remove some debug code, cleanup plane impl. --- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ..._type_world_update_op_shape_params_plane.h | 75 +------------------ ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- ...truct_world_update_op_shape_params_plane.h | 36 +-------- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- shaders/terrain/world_edit.fragmentshader | 13 +--- src/engine/editor.h | 5 +- src/engine/render_loop.cpp | 27 ++----- 15 files changed, 26 insertions(+), 150 deletions(-) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index dfe7bc8ec..1a10022cf 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1129:0 +// src/engine/editor.h:1126:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 7555efcb6..eb714ac25 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1242:0 +// src/engine/editor.h:1239:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 371fe4731..92a622f17 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1267:0 +// src/engine/editor.h:1264:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 76f410736..1d9c4e8cf 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1278:0 +// src/engine/editor.h:1275:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 5180c665e..b9f1131be 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1263:0 +// src/engine/editor.h:1260:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index ae997b66a..a2b136b19 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1082:0 +// src/engine/editor.h:1079:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h index bbbeb2b48..9cff11bbd 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h @@ -29,79 +29,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - { - - - - cs MemberName = CSz("Pos"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Pos), - MemberName, - Params - ); - - - - - - - - } - - - - - { - - - - cs MemberName = CSz("Normal"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Normal), - MemberName, - Params - ); - - - - - - - - } - - - - - { - - - - cs MemberName = CSz("d"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->d), - MemberName, - Params - ); - - - - - - - - } - - PushNewRow(Ui); - - - { @@ -124,6 +51,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ } PushNewRow(Ui); + + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 3629b879b..30f7364c4 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1098:0 +// src/engine/editor.h:1095:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index fa6745dd9..fa6352071 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1245:0 +// src/engine/editor.h:1242:0 struct world_edit_brush_linked_list_node { diff --git a/generated/serdes_struct_world_update_op_shape_params_plane.h b/generated/serdes_struct_world_update_op_shape_params_plane.h index 3dcd5eb7b..0108488b6 100644 --- a/generated/serdes_struct_world_update_op_shape_params_plane.h +++ b/generated/serdes_struct_world_update_op_shape_params_plane.h @@ -34,29 +34,15 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_plane *Base RangeIterator_t(umm, ElementIndex, Count) { world_update_op_shape_params_plane *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Pos); // default + Result &= Serialize(Bytes, &Element->Thickness); // default - Result &= Serialize(Bytes, &Element->Normal); // default - - - - - Result &= Serialize(Bytes, &Element->d); // default - - - - - - - Result &= Serialize(Bytes, &Element->Thickness); // default - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -80,31 +66,13 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_plane * b32 Result = True; // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Pos, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Normal, Memory); - - - - + Result &= Deserialize(Bytes, &Element->Thickness, Memory); - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->d, Memory); - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Thickness, Memory); diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 560a8cacf..7895e1414 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1096:0 +// src/engine/editor.h:1093:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 44ddc5fa0..0f383825c 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1037:0 +// src/engine/editor.h:1034:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index a2451b7c9..be438801d 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -37,10 +37,9 @@ uniform s32 Axis; // voxel_rule_direction // // Plane Params // -uniform v3 PlaneP; uniform v3 PlaneNormal; uniform f32 Planed; -uniform f32 PlaneThickness; +uniform f32 PlaneRadius; @@ -66,12 +65,8 @@ uniform sampler2D InputTex; in vec2 UV; out vec4 Output; -r32 DistanceToPlane(v3 PlaneP, v3 PlaneNormal, f32 Planed, v3 P) +r32 DistanceToPlane(v3 PlaneNormal, f32 Planed, v3 P) { - r32 x = PlaneP.x; - r32 y = PlaneP.y; - r32 z = PlaneP.z; - r32 a = PlaneNormal.x; r32 b = PlaneNormal.y; r32 c = PlaneNormal.z; @@ -217,8 +212,8 @@ void main() // ShapeType_Plane case 4: { - f32 Dist = DistanceToPlane(PlaneP, PlaneNormal, Planed, xyz); - if (abs(Dist) < PlaneThickness) + f32 Dist = DistanceToPlane(PlaneNormal, Planed, xyz); + if (abs(Dist) < PlaneRadius) { NoiseSample = 1.f; } diff --git a/src/engine/editor.h b/src/engine/editor.h index 34f2cdefb..3f6501e1e 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -971,10 +971,7 @@ struct world_update_op_shape_params_cylinder struct world_update_op_shape_params_plane { - v3 Pos; - v3 Normal; - f32 d; - f32 Thickness; + f32 Thickness = 2.f; }; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index b6a75b2a3..296464227 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -359,9 +359,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) // - static v3 Plane_SimShapeOrigin; - static v3 Plane_Normal; - { auto WorldEditRC = &Graphics->WorldEditRC; AcquireFutex(&Node->Lock); @@ -514,26 +511,22 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case ShapeType_Plane: { - auto Plane = &Shape->Plane; - - Plane_SimShapeOrigin = GetSimSpaceP(World, Edit->Region.Min + EditRectRad); + v3 Plane_SimShapeOrigin = GetSimSpaceP(World, Edit->Region.Min + EditRectRad); v3 ChunkRelLocation = Plane_SimShapeOrigin - SimChunkMin; v3 NRad = Normalize(EditRectRad); - Plane_Normal = Cross(NRad, V3(1,0,0)); - + v3 Plane_Normal = Cross(NRad, V3(1,0,0)); + auto Plane = &Shape->Plane; + auto PlaneRadius = Plane->Thickness/2.f; auto Planed = -1.0f * (Plane_Normal.x*ChunkRelLocation.x + Plane_Normal.y*ChunkRelLocation.y + Plane_Normal.z*ChunkRelLocation.z); - auto PlaneThickness = 5.f; auto PlaneNormal = Plane_Normal; auto PlanePos = ChunkRelLocation; - - - BindUniformByName(&WorldEditRC->Program, "PlaneP", &PlanePos); + /* BindUniformByName(&WorldEditRC->Program, "PlaneP", &PlanePos); */ BindUniformByName(&WorldEditRC->Program, "PlaneNormal", &PlaneNormal); - BindUniformByName(&WorldEditRC->Program, "Planed", Planed); - BindUniformByName(&WorldEditRC->Program, "PlaneThickness", PlaneThickness); + BindUniformByName(&WorldEditRC->Program, "Planed", Planed); + BindUniformByName(&WorldEditRC->Program, "PlaneRadius", PlaneRadius); } break; // @sdf_shape_step(5): Calculate values and bind uniform variables for the new shape @@ -559,12 +552,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } #endif - DEBUG_DrawSimSpaceVectorAt( - Engine, - Plane_SimShapeOrigin, - Plane_Normal*100.f, V3(1,0,0), DEFAULT_LINE_THICKNESS*3.f ); - - // // Terrain Finalize // From f1576681ac54ab2a2faa57139043e27a59e95a31 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 8 Jun 2025 20:35:59 -0700 Subject: [PATCH 274/421] Fix bogus plane parameter --- jesse.bonsai.rdbg | Bin 16951 -> 17195 bytes src/engine/render_loop.cpp | 7 +++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 50b5ca73ff390dc3ce2152f3a4f9c43d9033b142..e3eecc5aade2447806aaa18344316641b8801211 100644 GIT binary patch delta 2556 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 diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 296464227..35c26c662 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -515,11 +515,14 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) v3 ChunkRelLocation = Plane_SimShapeOrigin - SimChunkMin; v3 NRad = Normalize(EditRectRad); - v3 Plane_Normal = Cross(NRad, V3(1,0,0)); + v3 Plane_Normal = Normalize(Cross(NRad, V3(1,0,0))); auto Plane = &Shape->Plane; auto PlaneRadius = Plane->Thickness/2.f; - auto Planed = -1.0f * (Plane_Normal.x*ChunkRelLocation.x + Plane_Normal.y*ChunkRelLocation.y + Plane_Normal.z*ChunkRelLocation.z); + auto Planed = -1.0f * ( Plane_Normal.x*ChunkRelLocation.x + + Plane_Normal.y*ChunkRelLocation.y + + Plane_Normal.z*ChunkRelLocation.z ); + auto PlaneNormal = Plane_Normal; auto PlanePos = ChunkRelLocation; From 390a6f23c5200aa0ed8260555e61e8f3aac600ee Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 9 Jun 2025 09:23:03 -0700 Subject: [PATCH 275/421] Fix assertion when trying to load levels with tombstoned edits --- jesse.make.sh | 2 +- src/engine/editor.cpp | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/jesse.make.sh b/jesse.make.sh index 384beb04f..11051035c 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 01387cb2a..bf65b8f57 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2706,12 +2706,15 @@ DoLevelWindow(engine_resources *Engine) Deserialize(&LevelBytes, &DeserEdit, Editor->Memory); world_edit *FinalEdit = Push(&Editor->Edits, &DeserEdit); - if (FinalEdit->Brush) + if (FinalEdit->Tombstone == False) { - FinalEdit->Brush = Upsert(*FinalEdit->Brush, &Editor->LoadedBrushes, Editor->Memory); - } + if (FinalEdit->Brush) + { + FinalEdit->Brush = Upsert(*FinalEdit->Brush, &Editor->LoadedBrushes, Editor->Memory); + } - ApplyEditToOctree(Engine, FinalEdit, GetTranArena()); + ApplyEditToOctree(Engine, FinalEdit, GetTranArena()); + } } Ensure(Read_u64(&LevelBytes) == Delimeter); From 05883de5c04e460296362ca7f7e0a04e1764033d Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 9 Jun 2025 14:46:15 -0700 Subject: [PATCH 276/421] Update plane to have an orientation --- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ..._type_world_update_op_shape_params_plane.h | 26 ++++- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- generated/gen_common_vector_v2.h | 2 +- generated/gen_common_vector_v3.h | 2 +- generated/gen_common_vector_v3i.h | 2 +- .../gen_hetero_vector_operators_v2_v2i.h | 2 +- .../gen_hetero_vector_operators_v2i_v2.h | 2 +- .../gen_hetero_vector_operators_v3_u8_v3.h | 2 +- .../gen_hetero_vector_operators_v3_u8_v3i.h | 2 +- .../gen_hetero_vector_operators_v3_v3i.h | 2 +- .../gen_hetero_vector_operators_v3i_v3.h | 2 +- generated/gen_lerp_v2.h | 2 +- generated/gen_lerp_v3.h | 2 +- generated/gen_vector_area_v2.h | 2 +- generated/gen_vector_area_v2i.h | 2 +- .../gen_vector_infix_operator_v3i_688856393.h | 2 +- .../gen_vector_infix_operator_v3i_688856449.h | 2 +- generated/gen_vector_normalize_funcs_v2.h | 2 +- generated/gen_vector_normalize_funcs_v3.h | 2 +- generated/gen_vector_operators_v2.h | 9 +- generated/gen_vector_operators_v2i.h | 9 +- generated/gen_vector_operators_v3.h | 9 +- generated/gen_vector_operators_v3_u8.h | 9 +- generated/gen_vector_operators_v3i.h | 9 +- generated/gen_vector_operators_v4.h | 9 +- generated/hashtable_world_edit_brush.h | 2 +- generated/maybe_v3.h | 2 +- generated/maybe_v3i.h | 2 +- ...truct_world_update_op_shape_params_plane.h | 15 ++- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- jesse.make.sh | 2 +- shaders/terrain/world_edit.fragmentshader | 7 +- src/engine/editor.h | 1 + src/engine/render_loop.cpp | 99 ++++++++++++++++--- 44 files changed, 199 insertions(+), 69 deletions(-) diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 9f4bd672e..724c2c284 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2434:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2418:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index b132047c2..c019f7d3d 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3416:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3400:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 660a1329b..c3db9651e 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2387:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2371:0 case type_ui_render_command_window_start: { diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 1a10022cf..4951db9ff 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1126:0 +// src/engine/editor.h:1127:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index eb714ac25..cf69fc53c 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1239:0 +// src/engine/editor.h:1240:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 92a622f17..d5eac4279 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1264:0 +// src/engine/editor.h:1265:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 1d9c4e8cf..5a5835cf4 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1275:0 +// src/engine/editor.h:1276:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index b9f1131be..92351598f 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1260:0 +// src/engine/editor.h:1261:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index a2b136b19..f6b00588a 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1079:0 +// src/engine/editor.h:1080:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h index 9cff11bbd..93a965716 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h @@ -29,6 +29,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + { + + + + cs MemberName = CSz("Axis"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shape_axis*, &Element->Axis), + MemberName, + Params + ); + + + + + + + + } + + + + { @@ -51,8 +75,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ } PushNewRow(Ui); - - if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 30f7364c4..c43d2a545 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1095:0 +// src/engine/editor.h:1096:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/gen_common_vector_v2.h b/generated/gen_common_vector_v2.h index ef1e619d3..4dc966545 100644 --- a/generated/gen_common_vector_v2.h +++ b/generated/gen_common_vector_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:782:0 +// external/bonsai_stdlib/src/vector.h:805:0 inline r32 LengthSq( v2 Vec ) diff --git a/generated/gen_common_vector_v3.h b/generated/gen_common_vector_v3.h index d54496c2a..ca9df36dc 100644 --- a/generated/gen_common_vector_v3.h +++ b/generated/gen_common_vector_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:785:0 +// external/bonsai_stdlib/src/vector.h:808:0 inline r32 LengthSq( v3 Vec ) diff --git a/generated/gen_common_vector_v3i.h b/generated/gen_common_vector_v3i.h index 293c04baa..9f8508c09 100644 --- a/generated/gen_common_vector_v3i.h +++ b/generated/gen_common_vector_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:788:0 +// external/bonsai_stdlib/src/vector.h:811:0 inline s32 LengthSq( v3i Vec ) diff --git a/generated/gen_hetero_vector_operators_v2_v2i.h b/generated/gen_hetero_vector_operators_v2_v2i.h index 392355a67..bf2610224 100644 --- a/generated/gen_hetero_vector_operators_v2_v2i.h +++ b/generated/gen_hetero_vector_operators_v2_v2i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:226:0 +// external/bonsai_stdlib/src/vector.h:241:0 inline v2 operator+( v2 P1, v2i P2 ) diff --git a/generated/gen_hetero_vector_operators_v2i_v2.h b/generated/gen_hetero_vector_operators_v2i_v2.h index a51c96623..ef48b0a54 100644 --- a/generated/gen_hetero_vector_operators_v2i_v2.h +++ b/generated/gen_hetero_vector_operators_v2i_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:229:0 +// external/bonsai_stdlib/src/vector.h:244:0 inline v2i operator+( v2i P1, v2 P2 ) diff --git a/generated/gen_hetero_vector_operators_v3_u8_v3.h b/generated/gen_hetero_vector_operators_v3_u8_v3.h index 0d591fd48..d6da8d70e 100644 --- a/generated/gen_hetero_vector_operators_v3_u8_v3.h +++ b/generated/gen_hetero_vector_operators_v3_u8_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:241:0 +// external/bonsai_stdlib/src/vector.h:256:0 inline v3_u8 operator+( v3_u8 P1, v3 P2 ) diff --git a/generated/gen_hetero_vector_operators_v3_u8_v3i.h b/generated/gen_hetero_vector_operators_v3_u8_v3i.h index 10f0d8ee0..663dc55df 100644 --- a/generated/gen_hetero_vector_operators_v3_u8_v3i.h +++ b/generated/gen_hetero_vector_operators_v3_u8_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:238:0 +// external/bonsai_stdlib/src/vector.h:253:0 inline v3_u8 operator+( v3_u8 P1, v3i P2 ) diff --git a/generated/gen_hetero_vector_operators_v3_v3i.h b/generated/gen_hetero_vector_operators_v3_v3i.h index 18ba501f2..a0cddf39b 100644 --- a/generated/gen_hetero_vector_operators_v3_v3i.h +++ b/generated/gen_hetero_vector_operators_v3_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:232:0 +// external/bonsai_stdlib/src/vector.h:247:0 inline v3 operator+( v3 P1, v3i P2 ) diff --git a/generated/gen_hetero_vector_operators_v3i_v3.h b/generated/gen_hetero_vector_operators_v3i_v3.h index 547146241..9324b91ba 100644 --- a/generated/gen_hetero_vector_operators_v3i_v3.h +++ b/generated/gen_hetero_vector_operators_v3i_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:235:0 +// external/bonsai_stdlib/src/vector.h:250:0 inline v3i operator+( v3i P1, v3 P2 ) diff --git a/generated/gen_lerp_v2.h b/generated/gen_lerp_v2.h index ca87f8c48..d4dea8502 100644 --- a/generated/gen_lerp_v2.h +++ b/generated/gen_lerp_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:765:0 +// external/bonsai_stdlib/src/vector.h:788:0 inline v2 Lerp(r32 t, v2 P1, v2 P2) diff --git a/generated/gen_lerp_v3.h b/generated/gen_lerp_v3.h index e6a43ddbd..117c54d50 100644 --- a/generated/gen_lerp_v3.h +++ b/generated/gen_lerp_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:768:0 +// external/bonsai_stdlib/src/vector.h:791:0 inline v3 Lerp(r32 t, v3 P1, v3 P2) diff --git a/generated/gen_vector_area_v2.h b/generated/gen_vector_area_v2.h index 9381e3004..7784ec5a5 100644 --- a/generated/gen_vector_area_v2.h +++ b/generated/gen_vector_area_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:776:0 +// external/bonsai_stdlib/src/vector.h:799:0 inline r32 Area( v2 Vec ) diff --git a/generated/gen_vector_area_v2i.h b/generated/gen_vector_area_v2i.h index 315e614ca..b927aee1b 100644 --- a/generated/gen_vector_area_v2i.h +++ b/generated/gen_vector_area_v2i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:779:0 +// external/bonsai_stdlib/src/vector.h:802:0 inline s32 Area( v2i Vec ) diff --git a/generated/gen_vector_infix_operator_v3i_688856393.h b/generated/gen_vector_infix_operator_v3i_688856393.h index 0807d1bf8..3fd15c3ec 100644 --- a/generated/gen_vector_infix_operator_v3i_688856393.h +++ b/generated/gen_vector_infix_operator_v3i_688856393.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:762:0 +// external/bonsai_stdlib/src/vector.h:785:0 inline v3i operator&( v3i P1, v3i P2 ) diff --git a/generated/gen_vector_infix_operator_v3i_688856449.h b/generated/gen_vector_infix_operator_v3i_688856449.h index 8b2815373..2a033548f 100644 --- a/generated/gen_vector_infix_operator_v3i_688856449.h +++ b/generated/gen_vector_infix_operator_v3i_688856449.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:759:0 +// external/bonsai_stdlib/src/vector.h:782:0 inline v3i operator^( v3i P1, v3i P2 ) diff --git a/generated/gen_vector_normalize_funcs_v2.h b/generated/gen_vector_normalize_funcs_v2.h index 1a1d47f9b..9b4f451d3 100644 --- a/generated/gen_vector_normalize_funcs_v2.h +++ b/generated/gen_vector_normalize_funcs_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:791:0 +// external/bonsai_stdlib/src/vector.h:814:0 inline v2 Normalize( v2 Vec, r32 Length) diff --git a/generated/gen_vector_normalize_funcs_v3.h b/generated/gen_vector_normalize_funcs_v3.h index b8a5ca372..58790374e 100644 --- a/generated/gen_vector_normalize_funcs_v3.h +++ b/generated/gen_vector_normalize_funcs_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:794:0 +// external/bonsai_stdlib/src/vector.h:817:0 inline v3 Normalize( v3 Vec, r32 Length) diff --git a/generated/gen_vector_operators_v2.h b/generated/gen_vector_operators_v2.h index 8bd253e1a..b16f96986 100644 --- a/generated/gen_vector_operators_v2.h +++ b/generated/gen_vector_operators_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:208:0 +// external/bonsai_stdlib/src/vector.h:223:0 link_internal void DeepCopy(v2 *Src, v2 *Dest) @@ -33,6 +33,13 @@ operator!=( v2 P1, v2 P2 ) return Result; } +inline r32 +Sum( v2 P1 ) +{ + r32 Result = ( P1.E[0] + P1.E[1] ); + return Result; +} + inline b32 operator<( v2 P1, v2 P2 ) { diff --git a/generated/gen_vector_operators_v2i.h b/generated/gen_vector_operators_v2i.h index ee389caaf..4c0ca4d8b 100644 --- a/generated/gen_vector_operators_v2i.h +++ b/generated/gen_vector_operators_v2i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:211:0 +// external/bonsai_stdlib/src/vector.h:226:0 link_internal void DeepCopy(v2i *Src, v2i *Dest) @@ -33,6 +33,13 @@ operator!=( v2i P1, v2i P2 ) return Result; } +inline s32 +Sum( v2i P1 ) +{ + s32 Result = ( P1.E[0] + P1.E[1] ); + return Result; +} + inline b32 operator<( v2i P1, v2i P2 ) { diff --git a/generated/gen_vector_operators_v3.h b/generated/gen_vector_operators_v3.h index c680b5b0c..23e1ecd91 100644 --- a/generated/gen_vector_operators_v3.h +++ b/generated/gen_vector_operators_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:214:0 +// external/bonsai_stdlib/src/vector.h:229:0 link_internal void DeepCopy(v3 *Src, v3 *Dest) @@ -33,6 +33,13 @@ operator!=( v3 P1, v3 P2 ) return Result; } +inline r32 +Sum( v3 P1 ) +{ + r32 Result = ( P1.E[0] + P1.E[1] + P1.E[2] ); + return Result; +} + inline b32 operator<( v3 P1, v3 P2 ) { diff --git a/generated/gen_vector_operators_v3_u8.h b/generated/gen_vector_operators_v3_u8.h index f55789260..ae79c8f45 100644 --- a/generated/gen_vector_operators_v3_u8.h +++ b/generated/gen_vector_operators_v3_u8.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:220:0 +// external/bonsai_stdlib/src/vector.h:235:0 link_internal void DeepCopy(v3_u8 *Src, v3_u8 *Dest) @@ -33,6 +33,13 @@ operator!=( v3_u8 P1, v3_u8 P2 ) return Result; } +inline u8 +Sum( v3_u8 P1 ) +{ + u8 Result = ( P1.E[0] + P1.E[1] + P1.E[2] ); + return Result; +} + inline b32 operator<( v3_u8 P1, v3_u8 P2 ) { diff --git a/generated/gen_vector_operators_v3i.h b/generated/gen_vector_operators_v3i.h index 090bf86ad..b6744235b 100644 --- a/generated/gen_vector_operators_v3i.h +++ b/generated/gen_vector_operators_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:217:0 +// external/bonsai_stdlib/src/vector.h:232:0 link_internal void DeepCopy(v3i *Src, v3i *Dest) @@ -33,6 +33,13 @@ operator!=( v3i P1, v3i P2 ) return Result; } +inline s32 +Sum( v3i P1 ) +{ + s32 Result = ( P1.E[0] + P1.E[1] + P1.E[2] ); + return Result; +} + inline b32 operator<( v3i P1, v3i P2 ) { diff --git a/generated/gen_vector_operators_v4.h b/generated/gen_vector_operators_v4.h index 1fd6b476c..7eee6c513 100644 --- a/generated/gen_vector_operators_v4.h +++ b/generated/gen_vector_operators_v4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:223:0 +// external/bonsai_stdlib/src/vector.h:238:0 link_internal void DeepCopy(v4 *Src, v4 *Dest) @@ -33,6 +33,13 @@ operator!=( v4 P1, v4 P2 ) return Result; } +inline r32 +Sum( v4 P1 ) +{ + r32 Result = ( P1.E[0] + P1.E[1] + P1.E[2] + P1.E[3] ); + return Result; +} + inline b32 operator<( v4 P1, v4 P2 ) { diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index fa6352071..65050f550 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1242:0 +// src/engine/editor.h:1243:0 struct world_edit_brush_linked_list_node { diff --git a/generated/maybe_v3.h b/generated/maybe_v3.h index fdd40342b..287e1be6c 100644 --- a/generated/maybe_v3.h +++ b/generated/maybe_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1145:0 +// external/bonsai_stdlib/src/vector.h:1168:0 struct maybe_v3 { diff --git a/generated/maybe_v3i.h b/generated/maybe_v3i.h index d802e31fe..5061afed5 100644 --- a/generated/maybe_v3i.h +++ b/generated/maybe_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1147:0 +// external/bonsai_stdlib/src/vector.h:1170:0 struct maybe_v3i { diff --git a/generated/serdes_struct_world_update_op_shape_params_plane.h b/generated/serdes_struct_world_update_op_shape_params_plane.h index 0108488b6..709b6bc85 100644 --- a/generated/serdes_struct_world_update_op_shape_params_plane.h +++ b/generated/serdes_struct_world_update_op_shape_params_plane.h @@ -34,14 +34,12 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_plane *Base RangeIterator_t(umm, ElementIndex, Count) { world_update_op_shape_params_plane *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Thickness); // default - - - + Result &= Serialize(Bytes, (u32*)&Element->Axis); // enum + Result &= Serialize(Bytes, &Element->Thickness); // default @@ -64,15 +62,14 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_plane *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Thickness, Memory); - - + Element->Axis = Cast(shape_axis, Read_u32(Bytes)); + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Thickness, Memory); diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 7895e1414..2cabdde9c 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1093:0 +// src/engine/editor.h:1094:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 0f383825c..fcb677ff6 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1034:0 +// src/engine/editor.h:1035:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/jesse.make.sh b/jesse.make.sh index 11051035c..384beb04f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index be438801d..f233bb3ad 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -1,5 +1,5 @@ uniform v3 WorldspaceChunkBasis; -uniform v3 ChunkResolution; +uniform v3 ChunkResolution; // TODO(Jesse): Make this a scalar? uniform int BrushType; uniform int BlendMode; @@ -192,7 +192,6 @@ void main() AxisMask = V3(0,0,1); InvAxisMask = V3(1.f,1.f,0.f)*0.5f; } break; - } v3 MajorAxis = EditDim*AxisMask; @@ -212,8 +211,8 @@ void main() // ShapeType_Plane case 4: { - f32 Dist = DistanceToPlane(PlaneNormal, Planed, xyz); - if (abs(Dist) < PlaneRadius) + f32 Dist = DistanceToPlane(PlaneNormal, Planed, EditRelPosition); + if (abs(Dist) < PlaneRadius*ChunkResolution.x) { NoiseSample = 1.f; } diff --git a/src/engine/editor.h b/src/engine/editor.h index 3f6501e1e..01eb5a3dd 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -971,6 +971,7 @@ struct world_update_op_shape_params_cylinder struct world_update_op_shape_params_plane { + shape_axis Axis; f32 Thickness = 2.f; }; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 35c26c662..78c553434 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -7,6 +7,17 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) auto LowPriorityQ = &Engine->Stdlib.Plat.LowPriority; + static v3 xAxis = V3(0,0,0); + static v3 yAxis = V3(0,0,0); + static v3 zAxis = V3(0,0,0); + + + static rect3 SimEditRect = {}; + static v3 EditRectRad = {}; + + static v4 DrawNormal = {}; + static v3 PlaneNormal = {}; + os *Os = &Engine->Stdlib.Os; /* platform *Plat = &Engine->Stdlib.Plat; */ while ( FutexNotSignaled(ThreadParams->WorkerThreadsExitFutex) ) @@ -353,7 +364,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) s32 PingPongIndex = 1; -#if 1 // // Apply edits // @@ -421,9 +431,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); BindUniformByName(&WorldEditRC->Program, "Invert", Layer->Settings.Invert); - rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); + SimEditRect = GetSimSpaceRect(World, Edit->Region); v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); - v3 EditRectRad = GetRadius(&SimEditRect); + EditRectRad = GetRadius(&SimEditRect); // NOTE(Jesse): Must call bind explicitly because the // driver doesn't cache these values otherwise .. it @@ -511,25 +521,79 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case ShapeType_Plane: { - v3 Plane_SimShapeOrigin = GetSimSpaceP(World, Edit->Region.Min + EditRectRad); - v3 ChunkRelLocation = Plane_SimShapeOrigin - SimChunkMin; + auto Plane = &Shape->Plane; + auto Axis = Plane->Axis; - v3 NRad = Normalize(EditRectRad); - v3 Plane_Normal = Normalize(Cross(NRad, V3(1,0,0))); + xAxis = V3(0,0,0); + yAxis = V3(0,0,0); + zAxis = V3(0,0,0); + + switch (Axis) + { + InvalidCase(ShapeAxis_Count); + + case ShapeAxis_InferFromMajorAxis: + {} break; + + // Traverses the X axis and ascends + case ShapeAxis_PosX: + { + xAxis = Normalize(V3(EditRectRad.x, 0.f, EditRectRad.z)); + yAxis = Normalize(V3(0.f, EditRectRad.y, 0.f)); + zAxis = Normalize(Cross(xAxis, yAxis)); + } break; + // Traverses the X axis and descends + case ShapeAxis_NegX: + { + xAxis = Normalize(V3(EditRectRad.x, 0.f, -EditRectRad.z)); + yAxis = Normalize(V3(0.f, EditRectRad.y, 0.f)); + zAxis = Normalize(Cross(xAxis, yAxis)); + } break; + + + case ShapeAxis_PosY: + { + xAxis = Normalize(V3(0.f, EditRectRad.y, EditRectRad.z)); + yAxis = Normalize(V3(EditRectRad.x, 0.f, 0.f)); + zAxis = Normalize(Cross(xAxis, yAxis)); + } break; + case ShapeAxis_NegY: + { + xAxis = Normalize(V3(0.f, EditRectRad.y, -EditRectRad.z)); + yAxis = Normalize(V3(EditRectRad.x, 0.f, 0.f)); + zAxis = Normalize(Cross(xAxis, yAxis)); + } break; + + + case ShapeAxis_PosZ: + { + xAxis = Normalize(V3(0.f, 0.f, EditRectRad.z)); + yAxis = Normalize(V3(EditRectRad.x, EditRectRad.y, 0.f)); + zAxis = Normalize(Cross(xAxis, yAxis)); + } break; + + case ShapeAxis_NegZ: + { + xAxis = Normalize(V3(0.f, 0.f, EditRectRad.z)); + yAxis = Normalize(V3(-EditRectRad.x, EditRectRad.y, 0.f)); + zAxis = Normalize(Cross(xAxis, yAxis)); + } break; + } + + v3 Plane_SimShapeOrigin = EditRectRad; + PlaneNormal = zAxis; - auto Plane = &Shape->Plane; auto PlaneRadius = Plane->Thickness/2.f; - auto Planed = -1.0f * ( Plane_Normal.x*ChunkRelLocation.x + - Plane_Normal.y*ChunkRelLocation.y + - Plane_Normal.z*ChunkRelLocation.z ); + auto Planed = -1.0f * ( PlaneNormal.x*Plane_SimShapeOrigin.x + + PlaneNormal.y*Plane_SimShapeOrigin.y + + PlaneNormal.z*Plane_SimShapeOrigin.z ); - auto PlaneNormal = Plane_Normal; - auto PlanePos = ChunkRelLocation; + auto PlanePos = Plane_SimShapeOrigin; - /* BindUniformByName(&WorldEditRC->Program, "PlaneP", &PlanePos); */ BindUniformByName(&WorldEditRC->Program, "PlaneNormal", &PlaneNormal); BindUniformByName(&WorldEditRC->Program, "Planed", Planed); BindUniformByName(&WorldEditRC->Program, "PlaneRadius", PlaneRadius); + } break; // @sdf_shape_step(5): Calculate values and bind uniform variables for the new shape @@ -553,7 +617,12 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } ReleaseFutex(&Node->Lock); } -#endif + + DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, xAxis*200.f, RGB_RED, DEFAULT_LINE_THICKNESS*4.f ); + DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, yAxis*200.f, RGB_GREEN, DEFAULT_LINE_THICKNESS*4.f ); + DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, zAxis*200.f, RGB_BLUE, DEFAULT_LINE_THICKNESS*4.f ); + + DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, PlaneNormal*400.f, RGB_PINK, DEFAULT_LINE_THICKNESS*2.f ); // // Terrain Finalize From a9330df0a0f373b3780b695e3ba8485682f508c1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 9 Jun 2025 15:28:54 -0700 Subject: [PATCH 277/421] Rename Axis -> Orientation --- ...ound_type_world_update_op_shape_params_cylinder.h | 4 ++-- ...ompound_type_world_update_op_shape_params_plane.h | 4 ++-- ...es_struct_world_update_op_shape_params_cylinder.h | 4 ++-- ...erdes_struct_world_update_op_shape_params_plane.h | 4 ++-- jesse.make.sh | 2 +- src/engine/editor.h | 4 ++-- src/engine/render_loop.cpp | 12 ++++++------ 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 77a1c814f..209f04586 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -33,11 +33,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - cs MemberName = CSz("Axis"); + cs MemberName = CSz("Orientation"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shape_axis*, &Element->Axis), + Cast(shape_axis*, &Element->Orientation), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h index 93a965716..cb0ab6fe4 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h @@ -33,11 +33,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - cs MemberName = CSz("Axis"); + cs MemberName = CSz("Orientation"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shape_axis*, &Element->Axis), + Cast(shape_axis*, &Element->Orientation), MemberName, Params ); diff --git a/generated/serdes_struct_world_update_op_shape_params_cylinder.h b/generated/serdes_struct_world_update_op_shape_params_cylinder.h index 201d87bd1..82ec88811 100644 --- a/generated/serdes_struct_world_update_op_shape_params_cylinder.h +++ b/generated/serdes_struct_world_update_op_shape_params_cylinder.h @@ -34,7 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_cylinder *B RangeIterator_t(umm, ElementIndex, Count) { world_update_op_shape_params_cylinder *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Axis); // enum + Result &= Serialize(Bytes, (u32*)&Element->Orientation); // enum @@ -62,7 +62,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_cylinder *Element, memory_arena *Memory) { b32 Result = True; - Element->Axis = Cast(shape_axis, Read_u32(Bytes)); + Element->Orientation = Cast(shape_axis, Read_u32(Bytes)); diff --git a/generated/serdes_struct_world_update_op_shape_params_plane.h b/generated/serdes_struct_world_update_op_shape_params_plane.h index 709b6bc85..50326cee3 100644 --- a/generated/serdes_struct_world_update_op_shape_params_plane.h +++ b/generated/serdes_struct_world_update_op_shape_params_plane.h @@ -34,7 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_plane *Base RangeIterator_t(umm, ElementIndex, Count) { world_update_op_shape_params_plane *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Axis); // enum + Result &= Serialize(Bytes, (u32*)&Element->Orientation); // enum @@ -62,7 +62,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_plane *Element, memory_arena *Memory) { b32 Result = True; - Element->Axis = Cast(shape_axis, Read_u32(Bytes)); + Element->Orientation = Cast(shape_axis, Read_u32(Bytes)); diff --git a/jesse.make.sh b/jesse.make.sh index 384beb04f..11051035c 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/editor.h b/src/engine/editor.h index 01eb5a3dd..c391d5edd 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -965,13 +965,13 @@ struct world_update_op_shape_params_line struct world_update_op_shape_params_cylinder { - shape_axis Axis; + shape_axis Orientation; r32 Radius = 10.f; }; struct world_update_op_shape_params_plane { - shape_axis Axis; + shape_axis Orientation; f32 Thickness = 2.f; }; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 78c553434..b94989d2a 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -510,25 +510,25 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case ShapeType_Cylinder: { auto Cylinder = &Shape->Cylinder; - shape_axis Axis = Cylinder->Axis; - if (Axis == ShapeAxis_InferFromMajorAxis) + shape_axis Orientation = Cylinder->Orientation; + if (Orientation == ShapeAxis_InferFromMajorAxis) { - Axis = ComputeShapeAxisFromEditDim(EditDim); + Orientation = ComputeShapeAxisFromEditDim(EditDim); } - BindUniformByName(&WorldEditRC->Program, "Axis", Axis); + BindUniformByName(&WorldEditRC->Program, "Orientation", Orientation); BindUniformByName(&WorldEditRC->Program, "Radius", Cylinder->Radius); } break; case ShapeType_Plane: { auto Plane = &Shape->Plane; - auto Axis = Plane->Axis; + auto Orientation = Plane->Orientation; xAxis = V3(0,0,0); yAxis = V3(0,0,0); zAxis = V3(0,0,0); - switch (Axis) + switch (Orientation) { InvalidCase(ShapeAxis_Count); From cddaf8678ad6bb52a6a42af04fea7080717ca951 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 9 Jun 2025 15:30:27 -0700 Subject: [PATCH 278/421] Update stdlib --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index b26220981..0b44753d9 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit b2622098194e8b84708bdb7275c988dd665a2d0d +Subproject commit 0b44753d9fb48f9e2f5a13d90b4ccb6485f41aae From bb063cfa08cc4e15be298618d8326a6245ecd5f1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 9 Jun 2025 15:36:28 -0700 Subject: [PATCH 279/421] Remove some debug drawing code --- src/engine/render_loop.cpp | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index b94989d2a..87d2b2a80 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -7,19 +7,17 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) auto LowPriorityQ = &Engine->Stdlib.Plat.LowPriority; +#if 0 static v3 xAxis = V3(0,0,0); static v3 yAxis = V3(0,0,0); static v3 zAxis = V3(0,0,0); - static rect3 SimEditRect = {}; static v3 EditRectRad = {}; - static v4 DrawNormal = {}; static v3 PlaneNormal = {}; +#endif - os *Os = &Engine->Stdlib.Os; - /* platform *Plat = &Engine->Stdlib.Plat; */ while ( FutexNotSignaled(ThreadParams->WorkerThreadsExitFutex) ) { UNPACK_ENGINE_RESOURCES(Engine); @@ -431,9 +429,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); BindUniformByName(&WorldEditRC->Program, "Invert", Layer->Settings.Invert); - SimEditRect = GetSimSpaceRect(World, Edit->Region); + rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); - EditRectRad = GetRadius(&SimEditRect); + v3 EditRectRad = GetRadius(&SimEditRect); // NOTE(Jesse): Must call bind explicitly because the // driver doesn't cache these values otherwise .. it @@ -524,9 +522,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) auto Plane = &Shape->Plane; auto Orientation = Plane->Orientation; - xAxis = V3(0,0,0); - yAxis = V3(0,0,0); - zAxis = V3(0,0,0); + v3 xAxis = V3(0,0,0); + v3 yAxis = V3(0,0,0); + v3 zAxis = V3(0,0,0); switch (Orientation) { @@ -581,7 +579,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } v3 Plane_SimShapeOrigin = EditRectRad; - PlaneNormal = zAxis; + v3 PlaneNormal = zAxis; auto PlaneRadius = Plane->Thickness/2.f; auto Planed = -1.0f * ( PlaneNormal.x*Plane_SimShapeOrigin.x + @@ -618,11 +616,10 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) ReleaseFutex(&Node->Lock); } - DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, xAxis*200.f, RGB_RED, DEFAULT_LINE_THICKNESS*4.f ); - DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, yAxis*200.f, RGB_GREEN, DEFAULT_LINE_THICKNESS*4.f ); - DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, zAxis*200.f, RGB_BLUE, DEFAULT_LINE_THICKNESS*4.f ); - - DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, PlaneNormal*400.f, RGB_PINK, DEFAULT_LINE_THICKNESS*2.f ); + /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, xAxis*200.f, RGB_RED, DEFAULT_LINE_THICKNESS*4.f ); */ + /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, yAxis*200.f, RGB_GREEN, DEFAULT_LINE_THICKNESS*4.f ); */ + /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, zAxis*200.f, RGB_BLUE, DEFAULT_LINE_THICKNESS*4.f ); */ + /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, PlaneNormal*400.f, RGB_PINK, DEFAULT_LINE_THICKNESS*2.f ); */ // // Terrain Finalize From 47c23a5befaf015be14fcb31e17ddbb3346baf97 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 10 Jun 2025 09:18:56 -0700 Subject: [PATCH 280/421] Rename Axis->Orientation in shader --- shaders/terrain/world_edit.fragmentshader | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index f233bb3ad..cc44681bd 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -32,7 +32,7 @@ uniform f32 Radius; // Cylinder Params // -uniform s32 Axis; // voxel_rule_direction +uniform s32 Orientation; // voxel_rule_direction // // Plane Params @@ -170,7 +170,7 @@ void main() v3 InvAxisMask; v3 EditDim = ChunkRelEditMax-ChunkRelEditMin; - switch (Axis) + switch (Orientation) { case 0: // VoxelRuleDir_PosX case 1: // VoxelRuleDir_NegX From 5205d0884e0035ba10f3fc2928ffab0ff064c84d Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 10 Jun 2025 11:29:04 -0700 Subject: [PATCH 281/421] Start significant cleaning up of selection code --- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- generated/for_datatypes_Bxw4Q7AW.h | 44 +- generated/for_datatypes_kh9dwrCf.h | 536 ++++++++++++++++++ generated/hashtable_world_edit_brush.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- src/engine/editor.cpp | 472 ++++++--------- src/engine/editor.h | 14 +- 80 files changed, 810 insertions(+), 408 deletions(-) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index fa9f09fce..db3644a3e 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:859:0 +// src/engine/editor.h:866:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 4951db9ff..6ce87564b 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1127:0 +// src/engine/editor.h:1134:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index cf69fc53c..9c42c5fd3 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1240:0 +// src/engine/editor.h:1246:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index d5eac4279..cc6729288 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1265:0 +// src/engine/editor.h:1271:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 5a5835cf4..417710df2 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1276:0 +// src/engine/editor.h:1282:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 92351598f..2eb92ec79 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1261:0 +// src/engine/editor.h:1267:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index f6b00588a..34efb45d6 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1080:0 +// src/engine/editor.h:1087:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 4950fa16e..e7daadd78 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:474:0 +// src/engine/editor.cpp:485:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index fd031f28b..3dcf96f28 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:466:0 +// src/engine/editor.cpp:477:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 9eae76b83..ea0169efb 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:377:0 +// src/engine/editor.cpp:388:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 985fff87d..7a5d93aea 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:407:0 +// src/engine/editor.cpp:418:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 88b2bc89d..671ca368c 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:477:0 +// src/engine/editor.cpp:488:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 29cccd725..4cb2567dc 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:538:0 +// src/engine/editor.cpp:549:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index a61f17bfe..c51906325 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:559:0 +// src/engine/editor.cpp:570:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 5c6602cdd..58cb7a461 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:556:0 +// src/engine/editor.cpp:567:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 327e0928e..4f22f4328 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:446:0 +// src/engine/editor.cpp:457:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 8d324fcf9..aa6d30990 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:443:0 +// src/engine/editor.cpp:454:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index b5380a5e9..d1a364876 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:480:0 +// src/engine/editor.cpp:491:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 8515390ce..6000af217 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:431:0 +// src/engine/editor.cpp:442:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 50a43c47a..47b88e245 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:514:0 +// src/engine/editor.cpp:525:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 771875b73..78fa12db0 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:508:0 +// src/engine/editor.cpp:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 7c103581b..c7de6dfe4 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:413:0 +// src/engine/editor.cpp:424:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 455f8d8dd..7e2bcf95c 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:416:0 +// src/engine/editor.cpp:427:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 47b01d7ee..c5bd94f41 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:529:0 +// src/engine/editor.cpp:540:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index f9cf970b2..16a2fce86 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:553:0 +// src/engine/editor.cpp:564:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index b1e190010..f3551c26c 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:380:0 +// src/engine/editor.cpp:391:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 734d222ec..d3eaf904e 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:544:0 +// src/engine/editor.cpp:555:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 8f328f0bb..41175fbd8 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:511:0 +// src/engine/editor.cpp:522:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 72706ea34..3dbdf8fce 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:419:0 +// src/engine/editor.cpp:430:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index dec93b68f..03570bacf 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:422:0 +// src/engine/editor.cpp:433:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 99200a8cc..d199713e6 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:467:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 25153864b..38b78df52 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:502:0 +// src/engine/editor.cpp:513:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 28e958798..82cefb7c6 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:532:0 +// src/engine/editor.cpp:543:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 7ae7264cf..5395411d1 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:505:0 +// src/engine/editor.cpp:516:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 6f341926d..64da3bbfe 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:520:0 +// src/engine/editor.cpp:531:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index c8576ecf7..18ad8c7fa 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:523:0 +// src/engine/editor.cpp:534:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 19afff182..65305c88d 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:517:0 +// src/engine/editor.cpp:528:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 6bd5131ea..0ba65fc9b 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:386:0 +// src/engine/editor.cpp:397:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 6339d6ac1..48b70c11b 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:383:0 +// src/engine/editor.cpp:394:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 0ad837767..528a093b3 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:526:0 +// src/engine/editor.cpp:537:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 27c246f2a..c74ad8592 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:535:0 +// src/engine/editor.cpp:546:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index c0fe68c66..d398df232 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:410:0 +// src/engine/editor.cpp:421:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 45e57f77f..c0ddac1f8 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:401:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 6291cbe26..117c9600e 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:404:0 +// src/engine/editor.cpp:415:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 4e6a99c9f..cb61ab533 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:459:0 +// src/engine/editor.cpp:470:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 9001cb283..9507157a8 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:464:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index da7f5ebdc..f7d3c1024 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:392:0 +// src/engine/editor.cpp:403:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index befa3d4bd..78bb22bec 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:389:0 +// src/engine/editor.cpp:400:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 180b27d3b..762abfa9b 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:461:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index fd2870e39..e9ae315e2 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:425:0 +// src/engine/editor.cpp:436:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index 50e8f5426..a8dc86cc1 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:395:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 98090ed67..aaa5ac207 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:471:0 +// src/engine/editor.cpp:482:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index b3c757378..ad7ad4fad 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:398:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 691232bee..cf3d73b83 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:541:0 +// src/engine/editor.cpp:552:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 9c33f2b2f..b788ea675 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:428:0 +// src/engine/editor.cpp:439:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index bd5ebcecb..5a39599cc 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:547:0 +// src/engine/editor.cpp:558:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 9d54a3eec..403d45a15 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:550:0 +// src/engine/editor.cpp:561:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 2fdfb1f91..4e125a377 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:729:0 +// src/engine/editor.h:736:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index d43e65eb0..0b91f0646 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:887:0 +// src/engine/editor.h:894:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index c43d2a545..9a1f94c52 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1096:0 +// src/engine/editor.h:1103:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 58a663230..a32009f02 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:893:0 +// src/engine/editor.h:900:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index b39129366..760bad3e3 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:876:0 +// src/engine/editor.h:883:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index ed8028a7a..4f7570dbc 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:905:0 +// src/engine/editor.h:912:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index e5b1c73e3..058c7ea10 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:898:0 +// src/engine/editor.h:905:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index e1162070e..f2f289f5a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:902:0 +// src/engine/editor.h:909:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 3a013e2ba..870d65c43 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:488:0 +// src/engine/editor.cpp:499:0 @@ -455,30 +455,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - } - - - - - { - - - - cs MemberName = CSz("PrevRegion"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(rect3cp*, &Element->PrevRegion), - MemberName, - Params - ); - - - - - - - } @@ -512,10 +488,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - cs MemberName = CSz("Changed"); + cs MemberName = CSz("InitialSelect"); DoEditorUi(Ui, Window, - Cast(b8*, &Element->Changed), + Cast(b8*, &Element->InitialSelect), MemberName, &DefaultUiRenderParams_Checkbox ); @@ -534,22 +510,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - cs MemberName = CSz("InitialSelect"); - DoEditorUi(Ui, + cs MemberName = CSz("ModMode"); + DoEditorUi(Ui, Window, - Cast(b8*, &Element->InitialSelect), + // Cast to remove const/volatile keywords if they're there + Cast(selection_modification_mode*, &Element->ModMode), MemberName, - &DefaultUiRenderParams_Checkbox + Params ); - } - PushNewRow(Ui); + } + + { diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 40a6ae88e..0b1eb0ae7 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -16,6 +16,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + link_internal counted_string ToStringPrefixless(ui_brush_layer_actions Type) { @@ -180,6 +261,132 @@ PushToolbar( renderer_2d *Ui, DrawButtonGroup(&Result, GroupName); return Result; } + + + + + + + + + + + + + + + +link_internal counted_string +ToStringPrefixless(selection_modification_mode Type) +{ + counted_string Result = {}; + switch (Type) + { + case SelectionModificationMode_None: { Result = CSz("None"); } break; + case SelectionModificationMode_Initialize: { Result = CSz("Initialize"); } break; + case SelectionModificationMode_Modify: { Result = CSz("Modify"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(selection_modification_mode Type) +{ + counted_string Result = {}; + switch (Type) + { + case SelectionModificationMode_None: { Result = CSz("SelectionModificationMode_None"); } break; + case SelectionModificationMode_Initialize: { Result = CSz("SelectionModificationMode_Initialize"); } break; + case SelectionModificationMode_Modify: { Result = CSz("SelectionModificationMode_Modify"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal selection_modification_mode +SelectionModificationMode(counted_string S) +{ + selection_modification_mode Result = {}; + + if (StringsMatch(S, CSz("SelectionModificationMode_None"))) { return SelectionModificationMode_None; } + if (StringsMatch(S, CSz("SelectionModificationMode_Initialize"))) { return SelectionModificationMode_Initialize; } + if (StringsMatch(S, CSz("SelectionModificationMode_Modify"))) { return SelectionModificationMode_Modify; } + + return Result; +} + + + + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_modification_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + { + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("None"), UiId(Window, "enum SelectionModificationMode_None", Element), Params)) + { + *Element = SelectionModificationMode_None; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Initialize"), UiId(Window, "enum SelectionModificationMode_Initialize", Element), Params)) + { + *Element = SelectionModificationMode_Initialize; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Modify"), UiId(Window, "enum SelectionModificationMode_Modify", Element), Params)) + { + *Element = SelectionModificationMode_Modify; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + } + else + { + PushNewRow(Ui); + } +} + + + + + + + + + + + + + + + + + + + + + @@ -337,6 +544,11 @@ PushToolbar( renderer_2d *Ui, } + + + + + link_internal counted_string ToStringPrefixless(ui_reorder_action Type) { @@ -480,6 +692,56 @@ PushToolbar( renderer_2d *Ui, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + link_internal counted_string ToStringPrefixless(ui_brush_actions Type) { @@ -641,6 +903,66 @@ PushToolbar( renderer_2d *Ui, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + link_internal counted_string ToStringPrefixless(ui_layer_toolbar_actions Type) { @@ -814,6 +1136,220 @@ PushToolbar( renderer_2d *Ui, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 65050f550..3d1ac81e3 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1243:0 +// src/engine/editor.h:1249:0 struct world_edit_brush_linked_list_node { diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 9a28f3097..dfce49c2a 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:727:0 +// src/engine/editor.h:734:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index b31e4ce5a..62858a3b7 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:469:0 +// src/engine/editor.cpp:480:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 2cabdde9c..d99ea205c 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1094:0 +// src/engine/editor.h:1101:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index fcb677ff6..594d85026 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1035:0 +// src/engine/editor.h:1042:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 172bd2b19..ca54f4763 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:725:0 +// src/engine/editor.h:732:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index aded30fb1..7aafe259f 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:890:0 +// src/engine/editor.h:897:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 7284661df..9b61970b8 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:873:0 +// src/engine/editor.h:880:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index cc8622bdf..45baaf473 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:896:0 +// src/engine/editor.h:903:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 7bfa2af37..8ba0b181e 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:759:0 +// src/engine/editor.h:766:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 7e8275a01..6608d55f0 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:882:0 +// src/engine/editor.h:889:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index bf65b8f57..d4147abfe 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -362,11 +362,22 @@ poof( for_datatypes(all) func (struct_t) {} func (enum_t) { + enum_t.has_tag(gen_ui_toolbar)? { string_and_value_tables(enum_t) toolbar_for_enum(enum_t) } + + enum_t.has_tag(gen_string_and_value_tables)? + { + string_and_value_tables(enum_t) + } + + enum_t.has_tag(do_editor_ui)? + { + do_editor_ui_for_enum(enum_t) + } } ) #include @@ -1386,13 +1397,13 @@ EditWorldSelection(engine_resources *Engine) { UNPACK_ENGINE_RESOURCES(Engine); + auto PrevRegion = Editor->Selection.Region; + aabb_intersect_result AABBTest = {}; Editor->Selection.InitialSelect = False; - Editor->Selection.Changed = False; Editor->Selection.Diff = {}; -#if 1 aabb TotalEditAreas = InvertedInfinityRectangle_rect3(); // NOTE(Jesse): We can't predicate this because when we deselect everything // we want this to automagically resize @@ -1405,16 +1416,26 @@ EditWorldSelection(engine_resources *Engine) TotalEditAreas = Union(&TotalEditAreas, &EditAABB); } Editor->Selection.Region = SimSpaceToCanonical(World, &TotalEditAreas); - /* Info("%V3 %V3i", Editor->Selection.Region.Min.Offset); */ } -#endif - if (Editor->Selection.Clicks) + + if (AtElements(&Editor->SelectedEditIndices).Index == 0) { - // Hot update selection region before we click the second point - // - if (SelectionIncomplete(Editor->Selection.Clicks)) + Editor->Selection.ModMode = SelectionModificationMode_None; + } + + + switch (Editor->Selection.ModMode) + { + case SelectionModificationMode_None: {} break; + + case SelectionModificationMode_Initialize: { + Assert(SelectionIncomplete(Editor->Selection.Clicks)); + + // Hot update selection region before we click the second point + // Must come first or we get a frame of lag. + // if (Engine->MousedOverVoxel.Tag) { auto MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value); @@ -1425,143 +1446,121 @@ EditWorldSelection(engine_resources *Engine) /* Assert(MinP <= MaxP); */ Editor->Selection.Region = RectMinMax(MinP, MaxP); } - } - // Edit the selection region - // - aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); - rect3i ModifiedSelection = {}; - { - // If we're hovering a face and click, set ClickedFace, which is the - // source of truth that signals we're editing the selection region + // Update Clicks and initial position // - if (Engine->MaybeMouseRay.Tag == Maybe_Yes) + if (Input->LMB.Clicked) { - ray Ray = Engine->MaybeMouseRay.Ray; - - AABBTest = Intersect(&SelectionAABB, &Ray); - face_index Face = AABBTest.Face; - if (Face) + switch (Editor->Selection.Clicks) { - if ( Input->LMB.Clicked && (Input->Ctrl.Pressed || Input->Shift.Pressed || Input->Alt.Pressed) ) + case 0: { - v3 PlaneBaseP = Ray.Origin + (AABBTest.t*Ray.Dir); - Editor->Selection.ModState.ClickedFace = Face; - Editor->Selection.ModState.ClickedP[0] = PlaneBaseP; - } - } + if (Engine->MousedOverVoxel.Tag) + { + Editor->Selection.Clicks += 1; + auto MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value); + MouseP.Offset = Floor(MouseP.Offset); + Editor->Selection.Base = MouseP; + } + } break; - // If we're editing the selection region, Compute the proposed modification - // and make it permanent when we release the LMB - // - if (Editor->Selection.ModState.ClickedFace) - { - world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); - if (SelectionMode) // We could have started a selection edit and released the accelerator key + case 1: { - UpdateSelectionStateForFrame( &Ray, Camera, Input, SelectionMode, &Editor->Selection.ModState ); - v3 UpdateVector = {}; - ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB, &UpdateVector); - if (Input->LMB.Pressed == False) - { - // If we actually changed the selection region - rect3cp ProposedSelection = SimSpaceToCanonical(World, &ModifiedSelection); + Editor->Selection.Clicks += 1; + Editor->Selection.InitialSelect = True; + Editor->Selection.ModMode = SelectionModificationMode_Modify; + } break; - // Make ModifiedSelection permanent - Editor->Selection.Region = ProposedSelection; - Editor->Selection.Diff = UpdateVector; - } - } + InvalidDefaultCase; } } + } break; - // Draw + case SelectionModificationMode_Modify: + { + // Edit the selection region + // + rect3i ModifiedSelection = {}; { + // If we're hovering a face and click, set ClickedFace, which is the + // source of truth that signals we're editing the selection region + // + if (Engine->MaybeMouseRay.Tag == Maybe_Yes) { - auto Face = Editor->Selection.ModState.ClickedFace; - if (Face == FaceIndex_None) { Face = AABBTest.Face; } + ray Ray = Engine->MaybeMouseRay.Ray; + aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); + AABBTest = Intersect(&SelectionAABB, &Ray); + face_index Face = AABBTest.Face; if (Face) { - /* r32 InsetWidth = 0.25f; */ - r32 InsetWidth = 0.f; - v3 HiColor = RGB_GREEN; - r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS*2.5f; - - HighlightFace(Engine, Face, SelectionAABB, InsetWidth, HiColor, HiThickness); + if ( Input->LMB.Clicked && (Input->Ctrl.Pressed || Input->Shift.Pressed || Input->Alt.Pressed) ) + { + v3 PlaneBaseP = Ray.Origin + (AABBTest.t*Ray.Dir); + Editor->Selection.ModState.ClickedFace = Face; + Editor->Selection.ModState.ClickedP[0] = PlaneBaseP; + } } - } - // Draw proposed modification region - // - rect3 ModifiedAABB = Rect3(&ModifiedSelection); - DEBUG_DrawSimSpaceAABB(Engine, &ModifiedAABB, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS*0.75f); + // If we're editing the selection region, Compute the proposed modification + // and make it permanent when we release the LMB + // + if (Editor->Selection.ModState.ClickedFace) + { + world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); + if (SelectionMode) // We could have started a selection edit and released the accelerator key + { + UpdateSelectionStateForFrame( &Ray, Camera, Input, SelectionMode, &Editor->Selection.ModState ); + v3 UpdateVector = {}; + ModifiedSelection = DoSelectonModification(Engine, &Ray, SelectionMode, &Editor->Selection.ModState, SelectionAABB, &UpdateVector); + if (Input->LMB.Pressed == False) + { + // If we actually changed the selection region + rect3cp ProposedSelection = SimSpaceToCanonical(World, &ModifiedSelection); - // And finally the selection region - // - DEBUG_DrawSimSpaceAABB(Engine, &SelectionAABB, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS); + // Make ModifiedSelection permanent + Editor->Selection.Region = ProposedSelection; + Editor->Selection.Diff = UpdateVector; + } + + // Draw proposed modification region + // + rect3 ModifiedAABB = Rect3(&ModifiedSelection); + DEBUG_DrawSimSpaceAABB(Engine, &ModifiedAABB, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS*0.75f); + } + } + } } - } + } break; } - // Detect changes + // Draw // - - // TODO(Jesse): Can we actually just cache the PrevRegion at the top of this - // function and check if we changed it like that? I guess that's not robust - // if we change it in other ways, but I don't think that's likely.. + if (Editor->Selection.Clicks > 0) { - if (Input->LMB.Clicked) - { - switch (Editor->Selection.Clicks) - { - case 0: - { - if (Engine->MousedOverVoxel.Tag) - { - Editor->Selection.Clicks += 1; - auto MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value); - MouseP.Offset = Floor(MouseP.Offset); - Editor->Selection.Base = MouseP; - } - } break; - - case 1: - { - Editor->Selection.Clicks += 1; - Editor->Selection.InitialSelect = True; - } break; + aabb FinalSelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); + auto Face = Editor->Selection.ModState.ClickedFace; + /* if (Face == FaceIndex_None) { Face = AABBTest.Face; } */ - case 2: {} break; + if (Face) + { + /* r32 InsetWidth = 0.25f; */ + r32 InsetWidth = 0.f; + v3 HiColor = RGB_GREEN; + r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS*2.5f; - InvalidDefaultCase; - } + HighlightFace(Engine, Face, FinalSelectionAABB, InsetWidth, HiColor, HiThickness); } - // Don't fire selection changed event when dragging selection with selection edit tool - if (Editor->Selection.Clicks != 1) - /* if (SelectionComplete(Editor->Selection.Clicks)) */ // NOTE(Jesse): Should be able to be this .. Didn't test - { - if (AreEqual(Editor->Selection.Region, Editor->Selection.PrevRegion)) - { - // Same as prev frame, Changed already reset at top of function - } - else - { - Editor->Selection.Changed = True; - } - Editor->Selection.PrevRegion = Editor->Selection.Region; - } + // And finally the selection region + // + DEBUG_DrawSimSpaceAABB(Engine, &FinalSelectionAABB, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS); } + // Detect changes + // if (Editor->Selection.InitialSelect) { Info("InitialSelect"); } - if (Editor->Selection.Changed) { Info("Changed"); } - - if (Editor->Selection.InitialSelect) - { - Assert(Editor->Selection.Changed); - } return AABBTest; } @@ -1897,11 +1896,34 @@ DeleteEdit(engine_resources *Engine, world_edit *Edit, world_edit_block_array_in Edit->Tombstone = True; } +link_internal world_edit * +GetClosestEditIntersectingRay(world *World, world_edit_block_array *Edits, ray *Ray) +{ + world_edit *Result = {}; + + r32 tMin = f32_MAX; + IterateOver(Edits, Edit, EditIndex) + { + aabb Box = GetSimSpaceAABB(World, Edit->Region); + aabb_intersect_result I = Intersect(Box, Ray); + if (I.t < tMin) + { + tMin = I.t; + Result = Edit; + } + } + + return Result; +} + + link_internal void DoWorldEditor(engine_resources *Engine) { UNPACK_ENGINE_RESOURCES(Engine); + Editor->HotEdit = 0; + if (Editor->CurrentBrush == 0) { world_edit_brush ThisBrush = NewBrush(); @@ -1940,126 +1962,13 @@ DoWorldEditor(engine_resources *Engine) - - - - - // - // - // Do tool selection actions (what happens when we change a tool selection) - // - // - - if (WorldEditToolButtonGroup.AnyElementClicked) + if (Engine->MaybeMouseRay.Tag == Maybe_Yes) { - switch (Editor->Tool) - { - case WorldEdit_Tool_Disabled: - /* case WorldEdit_Tool_Brush: */ - case WorldEdit_Tool_Eyedropper: - case WorldEdit_Tool_BlitEntity: - /* case WorldEdit_Tool_StandingSpots: */ - { } break; - - case WorldEdit_Tool_Select: - { - ResetSelection(Editor); - } break; - } - } - - - // - // - // Edit tool interactions in the world - // - // - - if ( UiCapturedMouseInput(Ui) == False && - UiHoveredMouseInput(Ui) == False ) - { - switch (Editor->Tool) - { - case WorldEdit_Tool_Disabled: {} break; - - case WorldEdit_Tool_Select: - { - } break; - - case WorldEdit_Tool_Eyedropper: - { - if (Engine->MousedOverVoxel.Tag) - { - auto MouseP = Canonical_Position(&Engine->MousedOverVoxel.Value); - voxel *V = GetVoxelPointer(&Engine->MousedOverVoxel.Value, PickedVoxel_FirstFilled); - - Engine->Editor.HoverColorIndex = V->Color; - - if (Input->LMB.Clicked) - { - /* Info("Selecting Color (%S)", CS(V->Color)); */ - /* Engine->Editor.HSVColorSelection = UnpackHSVColor(V->Color); */ - - if (Editor->PreviousTool) - { - Editor->Tool = Editor->PreviousTool; - Editor->PreviousTool = {}; - } - } - } - else - { - Engine->Editor.HoverColorIndex = INVALID_COLOR_INDEX; - } - } break; - - case WorldEdit_Tool_BlitEntity: - { - entity *SelectedEntity = GetEntity(EntityTable, EngineDebug->SelectedEntity); - if (SelectedEntity) - { - aabb EntityAABB = GetSimSpaceAABB(World, SelectedEntity); - if (Engine->MaybeMouseRay.Tag) - { - ray *Ray = &Engine->MaybeMouseRay.Ray; - aabb_intersect_result IntersectionResult = Intersect(EntityAABB, Ray); - if (Input->LMB.Clicked && IntersectionResult.Face) - { - NotImplemented; -#if 0 - world_update_op_shape_params_asset AssetUpdateShape = - { - SelectedEntity->AssetId, - SelectedEntity->ModelIndex, - SelectedEntity->P, - }; - - world_edit_shape Shape = - { - type_world_update_op_shape_params_asset, - .world_update_op_shape_params_asset = AssetUpdateShape, - }; - QueueWorldUpdateForRegion(Engine, WorldEdit_Mode_Additive, WorldEdit_Modifier_Default, &Shape, {}, {}, Engine->WorldUpdateMemory); -#endif - } - } - } - } break; - - } + ray *Ray = &Engine->MaybeMouseRay.Ray; + Editor->HotEdit = GetClosestEditIntersectingRay(World, &Editor->Edits, Ray); } - // NOTE(Jesse): This has to come after the tool interactions because of a trivial - // but important interaction. If there's a previous tool to pop back to, we - // need to do that pop back before the brush settings get updated and the - // brush preview gets drawn or else when we pop back the settings window thinks - // the Select tool is active, doesn't update any of the brush stuff, then - // the preview gets drawn because we pop back to the Layered brush tool and - // there's a frame of lag. - /* DoBrushSettingsWindow(Engine, Editor->Tool, Editor->Brush.Type); */ - - // // @@ -2092,7 +2001,9 @@ DoWorldEditor(engine_resources *Engine) Editor->PreviousTool = Editor->Tool; Editor->Tool = WorldEdit_Tool_Select; + ResetSelection(Editor); + Editor->Selection.ModMode = SelectionModificationMode_Initialize; world_edit_block_array_index Index; auto E = NewEdit(Editor, Editor->CurrentLayer, &Index); @@ -2102,39 +2013,6 @@ DoWorldEditor(engine_resources *Engine) Push(&Editor->SelectedEditIndices, &Index); } -#if 0 - if (Editor->Selection.Clicks == 2) - { - if (Input->Ctrl.Pressed && Input->D.Clicked) { ApplyEditToRegion(Engine, &SelectionAABB, {}, {}, WorldEdit_Mode_Subtractive, WorldEdit_Modifier_Default); } - - if (Input->Ctrl.Pressed && Input->C.Clicked) { Editor->CopyRegion = Editor->Selection.Region; } - - if (Input->Ctrl.Pressed && Input->V.Clicked) - { - v3 CopyDim = GetDim(World, Editor->CopyRegion); - s32 VoxelCount = s32(Volume(CopyDim)); - Leak("voxel *V = Allocate(voxel, Engine->Memory, VoxelCount)"); - voxel *V = Allocate(voxel, Engine->WorldUpdateMemory, VoxelCount); - - Leak(""); - world_chunk_ptr_buffer Chunks = GatherChunksOverlappingArea(World, Editor->CopyRegion, Engine->WorldUpdateMemory); - GatherVoxelsOverlappingArea(World, GetSimSpaceRect3i(World, Editor->CopyRegion), &Chunks, V, VoxelCount); - - chunk_data D = {}; - D.Dim = V3i(CopyDim); - D.Voxels = V; - - world_update_op_shape_params_chunk_data ChunkDataShape = { D, GetSimSpaceP(World, Editor->Selection.Region.Min) }; - - world_edit_shape Shape = - { - type_world_update_op_shape_params_chunk_data, - .world_update_op_shape_params_chunk_data = ChunkDataShape, - }; - QueueWorldUpdateForRegion(Engine, WorldEdit_Mode_Additive, WorldEdit_Modifier_Default, &Shape, {}, {}, Engine->WorldUpdateMemory); - } - } -#endif { // All Brushes Window local_persist window_layout AllBrushesWindow = WindowLayout("All Brushes", WindowLayoutFlag_Align_BottomRight); @@ -2171,24 +2049,20 @@ DoWorldEditor(engine_resources *Engine) { Info("Setting Initial edit state"); Assert(AtElements(&Editor->SelectedEditIndices).Index == 1); + Assert(LengthSq(Editor->Selection.Diff) == 0.f); + auto EditIndex = GetPtr(&Editor->SelectedEditIndices, {}); world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); UpdateWorldEditBounds(Engine, Edit, Editor->Selection.Region, GetTranArena()); } - else if (Editor->Selection.Changed) + + if (LengthSq(Editor->Selection.Diff) > 0.f) { - if (LengthSq(Editor->Selection.Diff) > 0.f) - { - Info("Applying diff to edit buffer"); - world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); - Assert(SelectionMode); - ApplyDiffToEditBuffer(Engine, Editor->Selection.Diff, &Editor->SelectedEditIndices, SelectionMode); - Editor->Selection.ModState.ClickedFace = FaceIndex_None; - } - else - { - // The selection area was probably just resizing to enclose multiple selected edits - } + Info("Applying diff to edit buffer"); + world_edit_selection_mode SelectionMode = ComputeSelectionMode(Input); + Assert(SelectionMode); + ApplyDiffToEditBuffer(Engine, Editor->Selection.Diff, &Editor->SelectedEditIndices, SelectionMode); + Editor->Selection.ModState.ClickedFace = FaceIndex_None; } b32 SettingsChanged = CheckSettingsChanged(&Editor->CurrentBrush->Layered); @@ -2394,7 +2268,6 @@ DoWorldEditor(engine_resources *Engine) { Editor->Selection.Clicks = 2; Editor->Selection.Region = Edit->Region; - Editor->Selection.PrevRegion = Edit->Region; if (Input->Ctrl.Pressed) { @@ -2498,8 +2371,11 @@ DoWorldEditor(engine_resources *Engine) } + + // Highlight edits in the current layer + // { - IterateOver(&Editor->Layers, Layer, LayerIndex) + if (auto Layer = Editor->CurrentLayer) { IterateOver(&Layer->EditIndices, EditIndex, EditIndexIndex) { @@ -2509,28 +2385,34 @@ DoWorldEditor(engine_resources *Engine) auto EditAABB = GetSimSpaceAABB(World, Edit->Region); random_series S = {u64(Edit)}; v3 BaseColor = RandomV3Unilateral(&S); + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, EDITOR_DEFAULT_SELECTION_THICKNESS); + } + } + } - f32 Size = EDITOR_DEFAULT_SELECTION_THICKNESS; - - // Always highlight the hot edit - if (Edit == Editor->HotEdit) - { - Size *= 3.f; - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); - } - else - { // But otherwise only highlight the edits on the current layer. - if (Layer == Editor->CurrentLayer) - { - /* if (Edit == Editor->CurrentEdit) { Size *= 2.f; } */ - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, Size); - } - } + // Highlight currently selected edits + // + { + IterateOver(&Editor->SelectedEditIndices, EditIndex, EditIndexIndex) + { + world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); + Assert(Edit->Tombstone == False); - } + auto EditAABB = GetSimSpaceAABB(World, Edit->Region); + random_series S = {u64(Edit)}; + v3 BaseColor = RandomV3Unilateral(&S); + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_YELLOW, EDITOR_DEFAULT_SELECTION_THICKNESS*1.5f); } - Editor->HotEdit = 0; } + + // Highlight the hot edit + // + if (Editor->HotEdit) + { + auto EditAABB = GetSimSpaceAABB(World, Editor->HotEdit->Region); + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_PINK, EDITOR_DEFAULT_SELECTION_THICKNESS*2.f); + } + } link_internal void diff --git a/src/engine/editor.h b/src/engine/editor.h index c391d5edd..99f5e95cd 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1,4 +1,4 @@ -#define EDITOR_DEFAULT_SELECTION_THICKNESS (0.5f) +#define EDITOR_DEFAULT_SELECTION_THICKNESS (0.15f) enum ui_layer_toolbar_actions poof(@gen_ui_toolbar) @@ -708,6 +708,13 @@ poof(do_editor_ui_for_compound_type(ray)) poof(do_editor_ui_for_compound_type(maybe_ray)) #include +enum selection_modification_mode poof(@gen_string_and_value_tables @do_editor_ui) +{ + SelectionModificationMode_None, // Not modifying the selection + SelectionModificationMode_Initialize, // Initializing a new selection area + SelectionModificationMode_Modify, // Modifying the current selection area +}; + struct selection_modification_state { // NOTE(Jesse): This is the source of truth for if we're modifying the selection @@ -1198,12 +1205,11 @@ struct selection_region poof(@do_editor_ui) cp Base; rect3cp Region = InvertedInfinityRectangle_rect3cp(); - rect3cp PrevRegion = InvertedInfinityRectangle_rect3cp(); // Change detection - v3 Diff; // When Changed is set, this should be nonzero. - b32 Changed; + v3 Diff; // When Changed is set, this should be nonzero. b32 InitialSelect; // Set when we go from a partial selection state -> fully selected + selection_modification_mode ModMode; selection_modification_state ModState; }; From 53331774e0751b7ce74024d36c9774a4bb15f04d Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 10 Jun 2025 14:07:22 -0700 Subject: [PATCH 282/421] Cleanup edit & layer duplication; respect mutli-select behavior --- .../block_array_c_asset_thumbnail_688856411.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 26 +++- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 24 +++- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 2 +- ..._type_world_update_op_shape_params_plane.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 2 +- generated/for_datatypes_Bxw4Q7AW.h | 2 +- generated/for_datatypes_kh9dwrCf.h | 2 +- generated/serdes_struct_world_edit.h | 15 ++ .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...ing_and_value_tables_visible_region_size.h | 2 +- jesse.make.sh | 2 +- src/engine/editor.cpp | 135 +++++++++++++----- src/engine/editor.h | 16 ++- 113 files changed, 282 insertions(+), 150 deletions(-) diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index c51de1644..39838f201 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:115:0 +// src/engine/editor.cpp:129:0 diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index cc6729288..7d4258a5e 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1271:0 +// src/engine/editor.h:1281:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 417710df2..1ff9fa9ff 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1282:0 +// src/engine/editor.h:1292:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 2eb92ec79..f05841efd 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1267:0 +// src/engine/editor.h:1277:0 diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 24aaec8b0..b5d44f866 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:313:0 +// src/engine/editor.cpp:327:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index e7daadd78..eb96e22cd 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:485:0 +// src/engine/editor.cpp:499:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 3dcf96f28..f614a1a76 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:477:0 +// src/engine/editor.cpp:491:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index bc3537ea7..86a839901 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:352:0 +// src/engine/editor.cpp:366:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index ee1ec99e1..03ead3924 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:319:0 +// src/engine/editor.cpp:333:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 14af8c3af..7c32d9622 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:252:0 +// src/engine/editor.cpp:266:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index ea0169efb..875504039 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:388:0 +// src/engine/editor.cpp:402:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index d44a4471c..cc64d253e 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:158:0 +// src/engine/editor.cpp:172:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 57556d4e8..04874b527 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:346:0 +// src/engine/editor.cpp:360:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 7a5d93aea..33de7a964 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:418:0 +// src/engine/editor.cpp:432:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index b106b0a54..08e77df31 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:355:0 +// src/engine/editor.cpp:369:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 671ca368c..e5466464d 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:488:0 +// src/engine/editor.cpp:502:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 9aad3cfd9..79c8531ce 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:248:0 +// src/engine/editor.cpp:262:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 4cb2567dc..bc66631d8 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:549:0 +// src/engine/editor.cpp:563:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index c51906325..ed6be19bb 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:570:0 +// src/engine/editor.cpp:584:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 58cb7a461..b05216800 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:567:0 +// src/engine/editor.cpp:581:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 4f22f4328..67ecf4eb3 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:457:0 +// src/engine/editor.cpp:471:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index aa6d30990..2b2d07455 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:454:0 +// src/engine/editor.cpp:468:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index d1a364876..98e9c6475 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:491:0 +// src/engine/editor.cpp:505:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 6000af217..0a231d274 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:442:0 +// src/engine/editor.cpp:456:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 65f2b7844..491761ab5 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:343:0 +// src/engine/editor.cpp:357:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 47b88e245..c1a3c2753 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:525:0 +// src/engine/editor.cpp:539:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 78fa12db0..4ee48f7f0 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:519:0 +// src/engine/editor.cpp:533:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index c7de6dfe4..b8b737613 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:424:0 +// src/engine/editor.cpp:438:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 7e2bcf95c..86fbdf589 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:427:0 +// src/engine/editor.cpp:441:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index c5bd94f41..dd49d5333 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:540:0 +// src/engine/editor.cpp:554:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 16a2fce86..f5c0b3205 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:564:0 +// src/engine/editor.cpp:578:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 130664534..f5e13e8f7 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:241:0 +// src/engine/editor.cpp:255:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 84d6d3727..e6bf82d73 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:238:0 +// src/engine/editor.cpp:252:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 278674563..487b28cd4 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:310:0 +// src/engine/editor.cpp:324:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index f3551c26c..b5fe504c5 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:391:0 +// src/engine/editor.cpp:405:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index d3eaf904e..9b3e3482c 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:555:0 +// src/engine/editor.cpp:569:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -531,6 +531,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + } + + + + + { + + + + cs MemberName = CSz("HotEditIndex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_block_array_index*, &Element->HotEditIndex), + MemberName, + Params + ); + + + + + + + } diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 41175fbd8..9c6389bb0 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:522:0 +// src/engine/editor.cpp:536:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index b387efec7..9b14ef18b 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:289:0 +// src/engine/editor.cpp:303:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 3dbdf8fce..ac6e9e791 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:430:0 +// src/engine/editor.cpp:444:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 03570bacf..59fa3f3b6 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:433:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index f5cf18a67..71d0b3e10 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:138:0 +// src/engine/editor.cpp:152:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index d199713e6..2e3b8c9f2 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:467:0 +// src/engine/editor.cpp:481:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index d4ef2f0b8..c742893ea 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:304:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index e4bd325d6..809763e45 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:307:0 +// src/engine/editor.cpp:321:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 5b4b0ea2e..7d010741f 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:134:0 +// src/engine/editor.cpp:148:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index d02cb10f9..be1377d41 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:295:0 +// src/engine/editor.cpp:309:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index e77faba83..58fd5f885 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:340:0 +// src/engine/editor.cpp:354:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index bc63cd65b..0e460d6b1 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:244:0 +// src/engine/editor.cpp:258:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 9d35a785f..5c80cd6ee 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:298:0 +// src/engine/editor.cpp:312:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 38b78df52..ea2721669 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:513:0 +// src/engine/editor.cpp:527:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 82cefb7c6..b09da0686 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:543:0 +// src/engine/editor.cpp:557:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 7bf92d999..4dd081fa4 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:292:0 +// src/engine/editor.cpp:306:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 5395411d1..a8cf0d50a 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:516:0 +// src/engine/editor.cpp:530:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index c6fc151e9..938c8462f 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:224:0 +// src/engine/editor.cpp:238:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 875c5307d..f02140051 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:156:0 +// src/engine/editor.cpp:170:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 64da3bbfe..c0ccf1913 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:531:0 +// src/engine/editor.cpp:545:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 18ad8c7fa..ff5654d63 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:534:0 +// src/engine/editor.cpp:548:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 65305c88d..1c5f28efd 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:528:0 +// src/engine/editor.cpp:542:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index 0ba65fc9b..c02753ceb 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:397:0 +// src/engine/editor.cpp:411:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -93,6 +93,28 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("Selected"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Selected), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + } PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 48b70c11b..ca1d43914 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:394:0 +// src/engine/editor.cpp:408:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 528a093b3..9b4057300 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:537:0 +// src/engine/editor.cpp:551:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 80430c47b..717570777 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:349:0 +// src/engine/editor.cpp:363:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index c74ad8592..383c0fdb2 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:546:0 +// src/engine/editor.cpp:560:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 246b991e5..f1f64bd2e 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:164:0 +// src/engine/editor.cpp:178:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index ad20d3dcb..727d16f20 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:167:0 +// src/engine/editor.cpp:181:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 5f52caaf6..83ff1d8e1 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:322:0 +// src/engine/editor.cpp:336:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 747cd44da..b09c0dae7 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:316:0 +// src/engine/editor.cpp:330:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 71b3b9f6c..a1558ded6 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:136:0 +// src/engine/editor.cpp:150:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index d398df232..3b67ae25d 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:421:0 +// src/engine/editor.cpp:435:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index c0ddac1f8..3e3ebadc3 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:412:0 +// src/engine/editor.cpp:426:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 117c9600e..6d9dcb9a9 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:415:0 +// src/engine/editor.cpp:429:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 14b1dfd4f..f8c12b428 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:132:0 +// src/engine/editor.cpp:146:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index f0702d527..8f8789ecc 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:235:0 +// src/engine/editor.cpp:249:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 7512e7369..9e1b79d95 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:232:0 +// src/engine/editor.cpp:246:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index cb61ab533..681611db8 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:470:0 +// src/engine/editor.cpp:484:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 9507157a8..c75388573 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:464:0 +// src/engine/editor.cpp:478:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index f7d3c1024..35093ed54 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:403:0 +// src/engine/editor.cpp:417:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index 78bb22bec..1c9abdb96 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:400:0 +// src/engine/editor.cpp:414:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 209f04586..2cf7dafa7 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:146:0 +// src/engine/editor.cpp:160:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h index cb0ab6fe4..e6d2fe051 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:148:0 +// src/engine/editor.cpp:162:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index c6adc98a6..0a3711592 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:142:0 +// src/engine/editor.cpp:156:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index cb6cbe635..378ec541d 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:144:0 +// src/engine/editor.cpp:158:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 762abfa9b..a5680cfe7 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:461:0 +// src/engine/editor.cpp:475:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index e9ae315e2..6f5e4408f 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:436:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index d7bc9204d..681c9f13b 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:227:0 +// src/engine/editor.cpp:241:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index a7222c194..553df62bb 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:221:0 +// src/engine/editor.cpp:235:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 193951a2c..cc90c7495 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:176:0 +// src/engine/editor.cpp:190:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 2b94e4b84..490c47437 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:161:0 +// src/engine/editor.cpp:175:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index a8dc86cc1..76551db95 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:420:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index aaa5ac207..d24f43b05 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:482:0 +// src/engine/editor.cpp:496:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index ad7ad4fad..ea853f9f3 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:423:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index cf3d73b83..b05527367 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:552:0 +// src/engine/editor.cpp:566:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 4f1562b5f..06b1420a5 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:280:0 +// src/engine/editor.cpp:294:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 3aa494cdf..81aa3c542 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:277:0 +// src/engine/editor.cpp:291:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index b788ea675..9d6284ba3 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:439:0 +// src/engine/editor.cpp:453:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index c207afecb..abc8fcde6 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:301:0 +// src/engine/editor.cpp:315:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 5a39599cc..b522f668a 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:558:0 +// src/engine/editor.cpp:572:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 403d45a15..d4ede8e82 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:561:0 +// src/engine/editor.cpp:575:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 247c9a64f..fbd6c21ae 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:154:0 +// src/engine/editor.cpp:168:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 31123ef6d..c5b85b2c9 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:283:0 +// src/engine/editor.cpp:297:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index bc4f72878..f7c8efb89 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:128:0 +// src/engine/editor.cpp:142:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 870d65c43..f549a427b 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:499:0 +// src/engine/editor.cpp:513:0 diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 0b1eb0ae7..231c0e06a 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:362:0 +// src/engine/editor.cpp:376:0 diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index fb2f3abb3..4e26cdb2e 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -48,6 +48,13 @@ Serialize(u8_cursor_block_array *Bytes, world_edit *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Tombstone); // default + + + + + + Result &= Serialize(Bytes, &Element->Selected); // default + if (Element->Brush) { Result &= Serialize(Bytes, Element->Brush); } @@ -90,6 +97,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit *Element, memory_arena *M // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Tombstone, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Selected, Memory); + if (HadBrushPointer) { umm Count = 1; diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 62858a3b7..c54e0c499 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:480:0 +// src/engine/editor.cpp:494:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index dddb4aad5..81641e305 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:273:0 +// src/engine/editor.cpp:287:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index e1ae1c921..1302de419 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:267:0 +// src/engine/editor.cpp:281:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index c3a38294b..2ea6427a1 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:264:0 +// src/engine/editor.cpp:278:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 3d7e0e19c..b97f09660 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:270:0 +// src/engine/editor.cpp:284:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index 50243dae4..6124d210a 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:126:0 +// src/engine/editor.cpp:140:0 link_internal counted_string ToStringPrefixless(visible_region_size Type) diff --git a/jesse.make.sh b/jesse.make.sh index 11051035c..384beb04f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index d4147abfe..ba1c4a621 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -52,6 +52,20 @@ NewEdit(level_editor *Editor, world_edit_layer *Layer, world_edit_block_array_in return Result; } +link_internal world_edit * +DuplicateEdit(level_editor *Editor, world_edit_layer *Layer, world_edit *Edit, world_edit_block_array_index *IndexOut) +{ + world_edit_block_array_index DupIndex = {}; + auto *Duplicated = NewEdit(Editor, Layer, &DupIndex); + *Duplicated = *Edit; + Duplicated->Selected = False; + + *IndexOut = DupIndex; + + return Duplicated; +} + + link_internal world_edit_layer* NewLayer(level_editor *Editor) { @@ -1897,9 +1911,10 @@ DeleteEdit(engine_resources *Engine, world_edit *Edit, world_edit_block_array_in } link_internal world_edit * -GetClosestEditIntersectingRay(world *World, world_edit_block_array *Edits, ray *Ray) +GetClosestEditIntersectingRay(world *World, world_edit_block_array *Edits, ray *Ray, world_edit_block_array_index *ResultIndex = 0) { world_edit *Result = {}; + world_edit_block_array_index Index = {INVALID_BLOCK_ARRAY_INDEX}; r32 tMin = f32_MAX; IterateOver(Edits, Edit, EditIndex) @@ -1910,12 +1925,59 @@ GetClosestEditIntersectingRay(world *World, world_edit_block_array *Edits, ray * { tMin = I.t; Result = Edit; + Index = EditIndex; } } + if (ResultIndex) + *ResultIndex = Index; + return Result; } +link_internal void +DeselectAllEdits(level_editor *Editor) +{ + IterateOver(&Editor->SelectedEditIndices, EI, EII) + { + auto SelEdit = GetPtr(&Editor->Edits, *EI); + SelEdit->Selected = False; + } + Editor->SelectedEditIndices.ElementCount = 0; +} + +link_internal void +SelectEdit(level_editor *Editor, world_edit *Edit, world_edit_block_array_index EditIndex, b32 MultiSelect = False) +{ + world_edit_block_array_index_block_array *SelectedEditIndices = &Editor->SelectedEditIndices; + Assert(Edit); + Assert(EditIndex.Index != INVALID_BLOCK_ARRAY_INDEX); + + if (MultiSelect) + { + if (Edit->Selected) + { + Assert(Edit->Selected == True); + Edit->Selected = False; + + auto I = IndexOfValue(SelectedEditIndices, &EditIndex); + Assert(I.Index != INVALID_BLOCK_ARRAY_INDEX); + RemoveUnordered(SelectedEditIndices, I); + } + else + { + Assert(Edit->Selected == False); + Edit->Selected = True; + Push(SelectedEditIndices, &EditIndex); + } + } + else + { + DeselectAllEdits(Editor); + Push(SelectedEditIndices, &EditIndex); + Edit->Selected = True; + } +} link_internal void DoWorldEditor(engine_resources *Engine) @@ -1923,6 +1985,7 @@ DoWorldEditor(engine_resources *Engine) UNPACK_ENGINE_RESOURCES(Engine); Editor->HotEdit = 0; + Editor->HotEditIndex = {}; if (Editor->CurrentBrush == 0) { @@ -1965,7 +2028,7 @@ DoWorldEditor(engine_resources *Engine) if (Engine->MaybeMouseRay.Tag == Maybe_Yes) { ray *Ray = &Engine->MaybeMouseRay.Ray; - Editor->HotEdit = GetClosestEditIntersectingRay(World, &Editor->Edits, Ray); + Editor->HotEdit = GetClosestEditIntersectingRay(World, &Editor->Edits, Ray, &Editor->HotEditIndex); } @@ -2005,12 +2068,11 @@ DoWorldEditor(engine_resources *Engine) ResetSelection(Editor); Editor->Selection.ModMode = SelectionModificationMode_Initialize; - world_edit_block_array_index Index; + world_edit_block_array_index Index = {}; auto E = NewEdit(Editor, Editor->CurrentLayer, &Index); E->Brush = Editor->CurrentBrush; - Editor->SelectedEditIndices.ElementCount = 0; - Push(&Editor->SelectedEditIndices, &Index); + SelectEdit(Editor, E, Index); } @@ -2112,10 +2174,13 @@ DoWorldEditor(engine_resources *Engine) { Editor->CurrentLayer = Layer; - Editor->SelectedEditIndices.ElementCount = 0; + // NOTE(Jesse): Clear the list if we didn't have ctrl pressed + b32 MultiSelect = Input->Ctrl.Pressed; IterateOver(&Layer->EditIndices, EditIndex, EII) { - Push(&Editor->SelectedEditIndices, EditIndex); + auto Edit = GetPtr(&Editor->Edits, *EditIndex); + SelectEdit(Editor, Edit, *EditIndex, MultiSelect); + MultiSelect = True; } } @@ -2136,15 +2201,17 @@ DoWorldEditor(engine_resources *Engine) auto SrcLayer = Layer; auto DstLayer = NewLayer(Editor); + b32 MultiSelect = Input->Ctrl.Pressed; IterateOver(&SrcLayer->EditIndices, EditIndex, EditIndexIndex) { world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); - world_edit_block_array_index DupIndex = {}; - auto *Duplicated = NewEdit(Editor, DstLayer, &DupIndex); - *Duplicated = *Edit; + auto *Duplicated = DuplicateEdit(Editor, DstLayer, Edit, &DupIndex); + + SelectEdit(Editor, Duplicated, DupIndex, MultiSelect); ApplyEditToOctree(Engine, Duplicated, GetTranArena()); + MultiSelect = True; } } break; @@ -2251,16 +2318,13 @@ DoWorldEditor(engine_resources *Engine) ui_render_params ButtonParams = DefaultUiRenderParams_Button; - b32 EditIsSelected = False; - world_edit_block_array_index_block_array_index I; - IterateOver(&Editor->SelectedEditIndices, SelEditIndex, SEII) + b32 EditIsSelected = Edit->Selected; + if (EditIsSelected) { - if (*SelEditIndex == *EditIndex) - { - ButtonParams.FStyle = &DefaultSelectedStyle; - EditIsSelected = True; - I = SEII; - } + ButtonParams.FStyle = &DefaultSelectedStyle; +#if BONSAI_INTERNAL + +#endif } auto EditSelectButton = PushSimpleButton(Ui, FSz("(%s)", NameBuf), UiId(&LayersWindow, "edit select", Edit), &ButtonParams); @@ -2269,23 +2333,8 @@ DoWorldEditor(engine_resources *Engine) Editor->Selection.Clicks = 2; Editor->Selection.Region = Edit->Region; - if (Input->Ctrl.Pressed) - { - if (EditIsSelected) - { - RemoveUnordered(&Editor->SelectedEditIndices, I); - } - else - { - Push(&Editor->SelectedEditIndices, EditIndex); - } - } - else - { - Editor->SelectedEditIndices.ElementCount = 0; - Push(&Editor->SelectedEditIndices, EditIndex); - } - + b32 MultiSelect = Input->Ctrl.Pressed; + SelectEdit(Editor, Edit, *EditIndex, MultiSelect); /* Editor->CurrentEdit = Edit; */ Editor->CurrentLayer = Layer; @@ -2317,8 +2366,12 @@ DoWorldEditor(engine_resources *Engine) case UiLayerEditAction_Duplicate: { - auto *Duplicated = NewEdit(Editor, Layer); - *Duplicated = *Edit; + world_edit_block_array_index DupIndex = {}; + auto *Duplicated = DuplicateEdit(Editor, Layer, Edit, &DupIndex); + + b32 MultiSelect = Input->Ctrl.Pressed; + SelectEdit(Editor, Duplicated, DupIndex, MultiSelect); + ApplyEditToOctree(Engine, Duplicated, GetTranArena()); } break; @@ -2409,6 +2462,12 @@ DoWorldEditor(engine_resources *Engine) // if (Editor->HotEdit) { + if (Input->LMB.Clicked) + { + b32 MultiSelect = Input->Ctrl.Pressed; + SelectEdit(Editor, Editor->HotEdit, Editor->HotEditIndex, MultiSelect); + } + auto EditAABB = GetSimSpaceAABB(World, Editor->HotEdit->Region); DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_PINK, EDITOR_DEFAULT_SELECTION_THICKNESS*2.f); } diff --git a/src/engine/editor.h b/src/engine/editor.h index 99f5e95cd..e143c9210 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1254,7 +1254,17 @@ struct world_edit // TODO(Jesse): Rename to Bounds? rect3cp Region = InvertedInfinityRectangle_rect3cp(); world_edit_brush *Brush; - b32 Tombstone; + + // TODO(Jese): Pack these into a Flags field + // { + b32 Tombstone; + + // NOTE(Jesse): Need this so we don't have to do an n^2 loop when doing + // SelectEdit such that we can also makes + // + // Not my favorite, but it's also not the end of the world. + b32 Selected; + // } }; typedef world_edit* world_edit_ptr; @@ -1324,7 +1334,9 @@ struct level_editor world_edit_layer *HotLayer; world_edit_block_array_index_block_array SelectedEditIndices; - world_edit *HotEdit; + + world_edit *HotEdit; + world_edit_block_array_index HotEditIndex; // TODO(Jesse): This is a stupid form of stoarge. We don't ever look anything // up, we just keep pointers into it. Change to a paged-array and store the From 05ada127ef729cfaeb373e604fb0c34631c7897c Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 10 Jun 2025 14:12:38 -0700 Subject: [PATCH 283/421] Change camera rotation controls to RMB --- src/engine/camera.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/camera.cpp b/src/engine/camera.cpp index fab16b4b7..6daaca0f9 100644 --- a/src/engine/camera.cpp +++ b/src/engine/camera.cpp @@ -156,13 +156,13 @@ UpdateGameCamera( world *World, { if (DoPositionDelta) { - UpdateMouseDelta = Input->LMB.Pressed ? MouseDelta : V2(0); + UpdateMouseDelta = Input->RMB.Pressed ? MouseDelta : V2(0); } if (DoZoomDelta) { CameraZoomDelta = -1.f*Input->MouseWheelDelta/500.f; - if (Input->RMB.Pressed) { CameraZoomDelta += MouseDelta.y; } + /* if (Input->RMB.Pressed) { CameraZoomDelta += MouseDelta.y; } */ } } From 8894bd01220128500d1c276d6de030792dad78d3 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 10 Jun 2025 14:12:51 -0700 Subject: [PATCH 284/421] Remove some dead debug code in editor --- src/engine/editor.cpp | 137 ------------------------------------------ 1 file changed, 137 deletions(-) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index ba1c4a621..466f16ff7 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -823,127 +823,6 @@ DoSelectonModification( engine_resources *Engine, return Result; } -link_internal void -DoSelectedVoxelDebugWindow(engine_resources *Engine, cp VoxelCP) -{ - UNPACK_ENGINE_RESOURCES(Engine); - - voxel *V = TryGetVoxelPointer(World, VoxelCP); - v3 SimP = Floor(GetSimSpaceP(World, VoxelCP)); - - { - local_persist window_layout Window = WindowLayout("Voxel Debug Window", V2(150.f, 150.f)); - PushWindowStart(Ui, &Window); - - if (V) - { - /* DoEditorUi(Ui, &Window, &V->Flags, CSz("Voxel Flags")); */ - /* PushNewRow(Ui); */ - - DoEditorUi(Ui, &Window, &VoxelCP, CSz("CP")); - -#if VOXEL_DEBUG_COLOR - DoEditorUi(Ui, &Window, &V->DebugNoiseValue, CSz("Noise Value")); - PushNewRow(Ui); - - DoEditorUi(Ui, &Window, &V->DebugColor, CSz("DebugColor")); - - r32 DotP = Dot(V->DebugColor, V3(0,0,1)); - DoEditorUi(Ui, &Window, &DotP, CSz("Dot against V3(0,0,1)")); - PushNewRow(Ui); - PushNewRow(Ui); - - - world_chunk *ThisChunk = GetWorldChunkFromHashtable(World, VoxelCP.WorldP); - - PushTableStart(Ui); - - PushNewRow(Ui); - PushColumn(Ui, CSz("Contributed")); - PushColumn(Ui, CSz(" ")); - PushColumn(Ui, CSz(" ")); - PushColumn(Ui, CSz("Expected")); - PushNewRow(Ui); - - PushColumn(Ui, CSz("To Normal")); - PushColumn(Ui, CSz("Offset")); - PushColumn(Ui, CSz("NoiseValue")); - PushColumn(Ui, CSz("NoiseValue")); - PushColumn(Ui, CSz("")); - PushNewRow(Ui); - v3i Dim = V3i(3,3,3); - for (s32 dz = -1; dz < 2; ++dz) - { - for (s32 dy = -1; dy < 2; ++dy) - { - for (s32 dx = -1; dx < 2; ++dx) - { - /* if (dz == 0 && dy == 0 && dx == 0) continue; // ? */ - - s32 NormalIndex = GetIndex(VoxelCP.Offset+V3(dx,dy,dz)+1, ThisChunk->Dim+2); - s32 NoiseIndex = GetIndex(VoxelCP.Offset+V3(dx,dy,dz)+2, ThisChunk->Dim+4); - v3 ExpectedNormalValue = V3(f32_MAX); - r32 ExpectedNoiseValue = f32_MAX; - if (ThisChunk->NoiseValues) { ExpectedNoiseValue = ThisChunk->NoiseValues[NoiseIndex]; } - if (ThisChunk->NormalValues) { ExpectedNormalValue = ThisChunk->NormalValues[NormalIndex]; } - - voxel *dV = TryGetVoxelPointer(World, Canonicalize(World, VoxelCP + V3(dx,dy,dz))); - - ui_style *Style = &DefaultStyle; - - b32 ValueContributedToNormal = False; - if (dV && dV->DebugNoiseValue-dz > Truncate(V->DebugNoiseValue)) - { - Style = &DefaultSelectedStyle; - ValueContributedToNormal = True; - } - - { - if (ValueContributedToNormal) - { - PushColumn(Ui, CSz("+")); - } - else - { - PushColumn(Ui, CSz(" ")); - } - - PushColumn(Ui, FSz("(%d %d %d)", dx, dy, dz), Style); - if (dV) { PushColumn(Ui, CS(dV->DebugNoiseValue)); } - else { PushColumn(Ui, CSz("(INVALID NOISE INDEX)")); } - - if (dV && ExpectedNoiseValue != dV->DebugNoiseValue) { Style = &Global_DefaultErrorStyle; DEBUG_HighlightVoxel(Engine, SimP+V3(dx,dy,dz), RED); } - else { Style = &DefaultStyle; } - - if (ExpectedNoiseValue < f32_MAX) { PushColumn(Ui, FSz("(%.2f)", r64(ExpectedNoiseValue)), Style); } - else { PushColumn(Ui, FSz("(THIS CHUNK (%p) DID NOT HAVE VALID NOISE VALUE POINTER)", ThisChunk)); } - - if (dV && ExpectedNormalValue != dV->DebugColor) { Style = &Global_DefaultErrorStyle; DEBUG_HighlightVoxel(Engine, SimP+V3(dx,dy,dz), PINK); } - else { Style = &DefaultStyle; } - - if (ExpectedNormalValue.x < f32_MAX) { PushColumn(Ui, FSz("(%.2f,%.2f,%.2f)", r64(ExpectedNormalValue.x), r64(ExpectedNormalValue.y), r64(ExpectedNormalValue.z) ), Style); } - else { PushColumn(Ui, FSz("(THIS CHUNK (%p) DID NOT HAVE VALID NORMAL VALUE POINTER)", ThisChunk)); } - - - PushNewRow(Ui); - } - } - PushNewRow(Ui); - } - PushNewRow(Ui); - } - PushTableEnd(Ui); -#endif - - } - else - { - PushColumn(Ui, CSz("(null)")); - } - PushWindowEnd(Ui, &Window); - } -} - #if 1 link_internal interactable_handle InteractWithThumbnailTexture(engine_resources *Engine, renderer_2d *Ui, window_layout *Window, const char* InteractionString, asset_thumbnail *Thumb) @@ -2400,22 +2279,6 @@ DoWorldEditor(engine_resources *Engine) -#if VOXEL_DEBUG_COLOR - { - cp DebugVoxel = {}; - if (Editor->Selection.Clicks > 0) - { - DebugVoxel = Editor->Selection.Region.Min; - } - else if (Engine->MousedOverVoxel.Tag) - { - DebugVoxel = Canonical_Position(&Engine->MousedOverVoxel.Value, PickedVoxel_FirstFilled); - } - - DoSelectedVoxelDebugWindow(Engine, DebugVoxel); - } -#endif - if (Engine->MousedOverVoxel.Tag) { /* v3 HotVoxel = GetHotVoxelForEditMode(Engine, GetEditModeForSelectedTool(Editor) ); */ From 70536455613a673c69c793a7675d56b76fdcaa32 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 10 Jun 2025 14:44:10 -0700 Subject: [PATCH 285/421] Muck out some dead members and code from editor, fix a couple minor bugs --- external/bonsai_stdlib | 2 +- generated/block_array_bitmap_688853862.h | 3 - ...k_queue_entry_build_chunk_mesh_688853862.h | 3 - generated/block_array_entity_688856407.h | 3 - .../block_array_entity_ptr_688856411_h.h | 3 - ...lock_array_file_traversal_node_688853862.h | 3 - ...lock_array_gpu_readback_buffer_688853862.h | 3 - .../block_array_h_asset_thumbnail_688856411.h | 3 - .../block_array_h_gpu_timer_688735882_0.h | 3 - .../block_array_h_shader_ptr_688853971_0.h | 3 - generated/block_array_h_texture_688856411.h | 3 - generated/block_array_h_texture_688856411_0.h | 3 - generated/block_array_h_u32_688856411.h | 3 - generated/block_array_h_u8_cursor_688856411.h | 3 - ...lock_array_h_world_chunk_ptr_688853862_0.h | 3 - generated/block_array_member_info_688856411.h | 3 - generated/block_array_model_688856411.h | 3 - .../block_array_octree_node_ptr_688853862.h | 3 - ...block_array_picked_octree_node_688853862.h | 3 - .../block_array_standing_spot_688853862.h | 3 - generated/block_array_vox_data_688856411.h | 3 - ...lock_array_voxel_stack_element_688853862.h | 3 - ...y_world_edit_block_array_index_688735882.h | 3 - .../block_array_world_edit_layer_688735882.h | 3 - .../block_array_world_edit_ptr_688735882.h | 3 - ...editor_ui_for_compound_type_level_editor.h | 294 +----------------- src/engine/debug.cpp | 5 + src/engine/editor.cpp | 60 ++-- src/engine/editor.h | 36 +-- src/engine/render_loop.cpp | 4 +- 30 files changed, 42 insertions(+), 431 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 0b44753d9..61aeb19ee 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 0b44753d9fb48f9e2f5a13d90b4ccb6485f41aae +Subproject commit 61aeb19eefffee2c58217e93bb42122d86675271 diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index 71a720c2e..cb65c87b5 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -14,9 +14,6 @@ struct bitmap_block struct bitmap_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct bitmap_block_array diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 0c6a0e51d..fb0810f45 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -14,9 +14,6 @@ struct dummy_work_queue_entry_build_chunk_mesh_block struct dummy_work_queue_entry_build_chunk_mesh_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct dummy_work_queue_entry_build_chunk_mesh_block_array diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index 76826d1bf..55a32e45c 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -14,9 +14,6 @@ struct entity_block struct entity_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct entity_block_array diff --git a/generated/block_array_entity_ptr_688856411_h.h b/generated/block_array_entity_ptr_688856411_h.h index 65c9f99f0..15c233be7 100644 --- a/generated/block_array_entity_ptr_688856411_h.h +++ b/generated/block_array_entity_ptr_688856411_h.h @@ -14,9 +14,6 @@ struct entity_ptr_block struct entity_ptr_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct entity_ptr_block_array diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index 284e5e5b9..a8718ce88 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -14,9 +14,6 @@ struct file_traversal_node_block struct file_traversal_node_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct file_traversal_node_block_array diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index a5c71f66d..29a8dce0a 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -14,9 +14,6 @@ struct gpu_readback_buffer_block struct gpu_readback_buffer_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct gpu_readback_buffer_block_array diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 425b926b8..eb7fcecd2 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -14,9 +14,6 @@ struct asset_thumbnail_block struct asset_thumbnail_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct asset_thumbnail_block_array diff --git a/generated/block_array_h_gpu_timer_688735882_0.h b/generated/block_array_h_gpu_timer_688735882_0.h index d498c8e62..163d8a4e4 100644 --- a/generated/block_array_h_gpu_timer_688735882_0.h +++ b/generated/block_array_h_gpu_timer_688735882_0.h @@ -14,9 +14,6 @@ struct gpu_timer_block struct gpu_timer_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct gpu_timer_block_array diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 7abf282a2..17630ab88 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -14,9 +14,6 @@ struct shader_ptr_block struct shader_ptr_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct shader_ptr_block_array diff --git a/generated/block_array_h_texture_688856411.h b/generated/block_array_h_texture_688856411.h index 2070bb669..dd6730220 100644 --- a/generated/block_array_h_texture_688856411.h +++ b/generated/block_array_h_texture_688856411.h @@ -14,9 +14,6 @@ struct texture_ptr_block struct texture_ptr_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct texture_ptr_block_array diff --git a/generated/block_array_h_texture_688856411_0.h b/generated/block_array_h_texture_688856411_0.h index 753380135..3d7acf168 100644 --- a/generated/block_array_h_texture_688856411_0.h +++ b/generated/block_array_h_texture_688856411_0.h @@ -14,9 +14,6 @@ struct texture_block struct texture_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct texture_block_array diff --git a/generated/block_array_h_u32_688856411.h b/generated/block_array_h_u32_688856411.h index 88af9bffb..02ac0bdd4 100644 --- a/generated/block_array_h_u32_688856411.h +++ b/generated/block_array_h_u32_688856411.h @@ -14,9 +14,6 @@ struct u32_block struct u32_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct u32_block_array diff --git a/generated/block_array_h_u8_cursor_688856411.h b/generated/block_array_h_u8_cursor_688856411.h index eac301a2b..2f6164621 100644 --- a/generated/block_array_h_u8_cursor_688856411.h +++ b/generated/block_array_h_u8_cursor_688856411.h @@ -14,9 +14,6 @@ struct u8_cursor_block struct u8_cursor_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct u8_cursor_block_array diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index fd62a613b..9dd767a4f 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -14,9 +14,6 @@ struct world_chunk_ptr_block struct world_chunk_ptr_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct world_chunk_ptr_block_array diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index 0705237a9..a1092b8c7 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -14,9 +14,6 @@ struct member_info_block struct member_info_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct member_info_block_array diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 66ae25864..0be1f45d1 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -14,9 +14,6 @@ struct model_block struct model_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct model_block_array diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 6b326737f..4cea066a7 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -14,9 +14,6 @@ struct octree_node_ptr_block struct octree_node_ptr_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct octree_node_ptr_block_array diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 93fa493ed..0b8933e8f 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -14,9 +14,6 @@ struct picked_octree_node_block struct picked_octree_node_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct picked_octree_node_block_array diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index e09bb396d..9ab44ffb1 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -14,9 +14,6 @@ struct standing_spot_block struct standing_spot_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct standing_spot_block_array diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index f84cc7143..ca61480b9 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -14,9 +14,6 @@ struct vox_data_block struct vox_data_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct vox_data_block_array diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index 5900464c5..073a7610e 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -14,9 +14,6 @@ struct voxel_stack_element_block struct voxel_stack_element_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct voxel_stack_element_block_array diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 7d4258a5e..61b84831f 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -14,9 +14,6 @@ struct world_edit_block_array_index_block struct world_edit_block_array_index_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct world_edit_block_array_index_block_array diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 1ff9fa9ff..3fb497036 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -14,9 +14,6 @@ struct world_edit_layer_block struct world_edit_layer_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct world_edit_layer_block_array diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index f05841efd..a264304cf 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -14,9 +14,6 @@ struct world_edit_ptr_block struct world_edit_ptr_block_array_index { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct world_edit_ptr_block_array diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 9b3e3482c..bb413dba9 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -53,151 +53,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - { - - - - cs MemberName = CSz("Tool"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_tool*, &Element->Tool), - MemberName, - Params - ); - - - - - - - - } - - - - - { - - - - cs MemberName = CSz("PreviousTool"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_tool*, &Element->PreviousTool), - MemberName, - Params - ); - - - - - - - - } - - - - - { - - - - cs MemberName = CSz("SelectionFollowsCursor"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->SelectionFollowsCursor), - MemberName, - Params - ); - - - - - - - - } - - PushNewRow(Ui); - - - - { - - - - cs MemberName = CSz("RootChunkNeedsNewMesh"); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->RootChunkNeedsNewMesh), - MemberName, - &DefaultUiRenderParams_Checkbox - ); - - - - - - } - - PushNewRow(Ui); - - - - { - - - - cs MemberName = CSz("EngineDebugViewModeToggleBits"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, &Element->EngineDebugViewModeToggleBits), - MemberName, - Params - ); - - - - - - - - } - - PushNewRow(Ui); - - - - { - - - - cs MemberName = CSz("HoverColorIndex"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u16*, &Element->HoverColorIndex), - MemberName, - Params - ); - - - - - - - - } - - PushNewRow(Ui); - - - { @@ -217,54 +72,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - - - - - { - - - - cs MemberName = CSz("CopyRegion"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(rect3cp*, &Element->CopyRegion), - MemberName, - Params - ); - - - - - - - - } - - - - - { - - - - cs MemberName = CSz("Entity"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(selection_modification_state*, &Element->Entity), - MemberName, - Params - ); - - - - - - - } @@ -294,79 +101,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - { - - - - cs MemberName = CSz("NewAssetFromSelection"); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->NewAssetFromSelection), - MemberName, - &DefaultUiRenderParams_Checkbox - ); - - - - - - } - - PushNewRow(Ui); - - - - { - - - - cs MemberName = CSz("NewAssetFromSelectionFilename"); - - - if (ToggleButton(Ui, CSz("v NewAssetFromSelectionFilename[512]"), CSz("> NewAssetFromSelectionFilename[512]"), UiId(Window, "toggle level_editor char NewAssetFromSelectionFilename", Element->NewAssetFromSelectionFilename), Params )) - { - OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - PushNewRow(Ui); - RangeIterator(ArrayIndex, 512) - { - DoEditorUi(Ui, Window, Element->NewAssetFromSelectionFilename+ArrayIndex, FSz("NewAssetFromSelectionFilename[%d]", ArrayIndex), Params); - - PushNewRow(Ui); - } - CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); - } - PushNewRow(Ui); - - - - } - - PushNewRow(Ui); - - - - { - - - - cs MemberName = CSz("MaskSelection"); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->MaskSelection), - MemberName, - &DefaultUiRenderParams_Checkbox - ); - - - - - - } - - PushNewRow(Ui); - - - { @@ -411,30 +145,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - - - - - { - - - - cs MemberName = CSz("Edits"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_block_array*, &Element->Edits), - MemberName, - Params - ); - - - - - - - } @@ -468,11 +178,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - cs MemberName = CSz("HotLayer"); + cs MemberName = CSz("Edits"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_layer*, Element->HotLayer), + Cast(world_edit_block_array*, &Element->Edits), MemberName, Params ); diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index 7c1c0da33..f8ed94184 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -56,6 +56,7 @@ DoEntityWindow(engine_resources *Engine) PushWindowEnd(Ui, &EntityWindow); +#if 0 aabb EntityAABB = GetSimSpaceAABB(World, SelectedEntity); if (Engine->MaybeMouseRay.Tag) @@ -104,6 +105,7 @@ DoEntityWindow(engine_resources *Engine) } } +#endif } if (Input->Delete.Clicked && Engine->HoverEntity.Tag) { Unspawn(Engine->HoverEntity.Value); } @@ -267,6 +269,8 @@ DoAssetWindow(engine_resources *Engine) PushNewRow(Ui); } #endif + +#if 0 if (Button(Ui, CSz("New Asset From Selection"), UiId(&Window, "NewFromSelectionButton", 0u))) { Engine->Editor.NewAssetFromSelection = True; @@ -303,6 +307,7 @@ DoAssetWindow(engine_resources *Engine) /* SerializeChunk(&SaveChunk, Concat(CSz("models/"), SaveName, GetTranArena())); */ } } +#endif PushNewRow(Ui); DoEditorUi(Ui, &Window, &Engine->EngineDebug.AssetWindowViewMode, CSz("View"), &DefaultUiRenderParams_Generic); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 466f16ff7..20b2aeba9 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1864,7 +1864,7 @@ DoWorldEditor(engine_resources *Engine) UNPACK_ENGINE_RESOURCES(Engine); Editor->HotEdit = 0; - Editor->HotEditIndex = {}; + Editor->HotEditIndex = {INVALID_BLOCK_ARRAY_INDEX}; if (Editor->CurrentBrush == 0) { @@ -1878,31 +1878,6 @@ DoWorldEditor(engine_resources *Engine) aabb_intersect_result AABBTest = EditWorldSelection(Engine); aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); - ui_toggle_button_group WorldEditToolButtonGroup = {}; - ui_toggle_button_group WorldEditModeButtonGroup = {}; - ui_toggle_button_group WorldEditBrushTypeButtonGroup = {}; - ui_toggle_button_group WorldEditModifierButtonGroup = {}; - - { - local_persist window_layout Window = WindowLayout("World Edit"); - PushWindowStart(Ui, &Window); - - PushTableStart(Ui); - ui_render_params Params = DefaultUiRenderParams_Button; - Params.Padding = V4(6, 3, 6, 3); - /* ui_element_reference CurrentRef = {}; */ - - { - WorldEditToolButtonGroup = DoEditorUi(Ui, &Window, &Editor->Tool, CSz("Tool"), &Params, ToggleButtonGroupFlags_DrawVertical); - /* CurrentRef = WorldEditToolButtonGroup.UiRef; */ - } - - PushTableEnd(Ui); - PushWindowEnd(Ui, &Window); - } - - - if (Engine->MaybeMouseRay.Tag == Maybe_Yes) { @@ -1921,8 +1896,6 @@ DoWorldEditor(engine_resources *Engine) if (Input->Ctrl.Pressed || Input->Shift.Pressed || Input->Alt.Pressed) { Ui->RequestedForceCapture = True; } - if (Input->Ctrl.Pressed && Input->E.Clicked) { Editor->PreviousTool = Editor->Tool; Editor->Tool = WorldEdit_Tool_Eyedropper; ResetSelectionIfIncomplete(Editor); } - if (Input->Ctrl.Pressed && Input->G.Clicked) { if (AtElements(&Editor->SelectedEditIndices).Index) @@ -1941,9 +1914,6 @@ DoWorldEditor(engine_resources *Engine) NewLayer(Editor); } - Editor->PreviousTool = Editor->Tool; - Editor->Tool = WorldEdit_Tool_Select; - ResetSelection(Editor); Editor->Selection.ModMode = SelectionModificationMode_Initialize; @@ -2209,15 +2179,16 @@ DoWorldEditor(engine_resources *Engine) auto EditSelectButton = PushSimpleButton(Ui, FSz("(%s)", NameBuf), UiId(&LayersWindow, "edit select", Edit), &ButtonParams); if (Clicked(Ui, &EditSelectButton)) { + // NOTE(Jesse): We do SelectEdit on the HotEdit later +#if 0 Editor->Selection.Clicks = 2; Editor->Selection.Region = Edit->Region; b32 MultiSelect = Input->Ctrl.Pressed; SelectEdit(Editor, Edit, *EditIndex, MultiSelect); +#endif - /* Editor->CurrentEdit = Edit; */ Editor->CurrentLayer = Layer; - if (Edit->Brush) { Editor->CurrentBrush = Edit->Brush; @@ -2228,6 +2199,7 @@ DoWorldEditor(engine_resources *Engine) if (Hover(Ui, &EditSelectButton)) { Editor->HotEdit = Edit; + Editor->HotEditIndex = *EditIndex; } ui_layer_edit_actions LayerEditAction = {}; @@ -2335,6 +2307,22 @@ DoWorldEditor(engine_resources *Engine) DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_PINK, EDITOR_DEFAULT_SELECTION_THICKNESS*2.f); } + +#if BONSAI_INTERNAL + // NOTE(Jesse): Sanity check we keep the selected flag in sync with the array + IterateOver(&Editor->Edits, Edit, EI) + { + auto SelectedEditIndex = IndexOfValue(&Editor->SelectedEditIndices, &EI); + if (SelectedEditIndex.Index == INVALID_BLOCK_ARRAY_INDEX) + { + Assert(Edit->Selected == False); + } + else + { + Assert(Edit->Selected == True); + } + } +#endif } link_internal void @@ -2517,6 +2505,12 @@ DoLevelWindow(engine_resources *Engine) FinalEdit->Brush = Upsert(*FinalEdit->Brush, &Editor->LoadedBrushes, Editor->Memory); } + if (FinalEdit->Selected) + { + FinalEdit->Selected = False; // Minor hack so SelectEdit doesn't assert + SelectEdit(Editor, FinalEdit, {EditIndex}, True); + } + ApplyEditToOctree(Engine, FinalEdit, GetTranArena()); } } diff --git a/src/engine/editor.h b/src/engine/editor.h index e143c9210..f6d40404e 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1296,46 +1296,20 @@ struct level_editor { memory_arena *Memory; - world_edit_tool Tool; - world_edit_tool PreviousTool; // So we can 'pop' back to the last tool on select/eyedropper - - b8 SelectionFollowsCursor; - - b32 RootChunkNeedsNewMesh; - - u64 EngineDebugViewModeToggleBits; - - u16 HoverColorIndex; - selection_region Selection; - rect3cp CopyRegion; - - // Recorded when accel-clicking on the selection to manipulate it - /* selection_modification_state Selection; */ - selection_modification_state Entity; - asset_thumbnail_block_array AssetThumbnails; - b32 NewAssetFromSelection; - char NewAssetFromSelectionFilename[512]; - - b32 MaskSelection; - - /* u32 NextEditOrdinal; */ + // Used for naming layers during NewLayer u32 NextLayerIndex; + world_edit_layer_block_array Layers; + world_edit_layer *CurrentLayer; - - world_edit_layer_block_array Layers; - world_edit_block_array Edits; - - world_edit_layer *CurrentLayer; - world_edit_layer *HotLayer; - + world_edit_block_array Edits; world_edit_block_array_index_block_array SelectedEditIndices; - world_edit *HotEdit; + world_edit *HotEdit; // Hovered world_edit_block_array_index HotEditIndex; // TODO(Jesse): This is a stupid form of stoarge. We don't ever look anything diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 87d2b2a80..e20f10ded 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -218,12 +218,12 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case BonsaiRenderCommand_ShaderId_gBuffer: { - SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), Editor->MaskSelection); + SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), False); } break; case BonsaiRenderCommand_ShaderId_ShadowMap: { - SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), Editor->MaskSelection); + SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), False); } break; } } break; From eaae42f92cfbf78ff725e53dacb13703fee5e88c Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 10 Jun 2025 15:12:26 -0700 Subject: [PATCH 286/421] Rejig controls such that ctrl is free for multi-select --- generated/are_equal_world_edit_brush.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- src/engine/editor.cpp | 40 ++++++------- src/engine/editor.h | 56 +++++++++---------- 7 files changed, 51 insertions(+), 55 deletions(-) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 9c42c5fd3..87f0856bc 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1246:0 +// src/engine/editor.h:1221:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 61b84831f..97df976be 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1281:0 +// src/engine/editor.h:1256:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 3fb497036..05f601f31 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1292:0 +// src/engine/editor.h:1267:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index a264304cf..1c528d7e6 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1277:0 +// src/engine/editor.h:1252:0 diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 3d1ac81e3..0461c00fc 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1249:0 +// src/engine/editor.h:1224:0 struct world_edit_brush_linked_list_node { diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 20b2aeba9..01e7e9e74 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1387,7 +1387,7 @@ EditWorldSelection(engine_resources *Engine) face_index Face = AABBTest.Face; if (Face) { - if ( Input->LMB.Clicked && (Input->Ctrl.Pressed || Input->Shift.Pressed || Input->Alt.Pressed) ) + if ( Input->LMB.Clicked && (Input->Shift.Pressed || Input->Alt.Pressed) ) { v3 PlaneBaseP = Ray.Origin + (AABBTest.t*Ray.Dir); Editor->Selection.ModState.ClickedFace = Face; @@ -1466,13 +1466,6 @@ GetSelectionCenterP(world *World, level_editor *Editor) return Result; } -link_internal b32 -InputStateIsValidToApplyEdit(input *Input) -{ - b32 Result = Input->LMB.Clicked && !Input->Shift.Pressed && !Input->Ctrl.Pressed && !Input->Alt.Pressed; - return Result; -} - link_internal v3 ColorIndexToV3(u16 ColorIndex) { @@ -1872,6 +1865,14 @@ DoWorldEditor(engine_resources *Engine) Editor->CurrentBrush = Insert(ThisBrush, &Editor->LoadedBrushes, Editor->Memory); } + // This can happen for all kinds of reasons so we just detect it here instead + // of having to remember to set this ModMode flag + if (Count(&Editor->SelectedEditIndices)) + { + Editor->Selection.ModMode = SelectionModificationMode_Modify; + Editor->Selection.Clicks = 2; + } + // @selection_changed_flag // @@ -1894,7 +1895,7 @@ DoWorldEditor(engine_resources *Engine) // - if (Input->Ctrl.Pressed || Input->Shift.Pressed || Input->Alt.Pressed) { Ui->RequestedForceCapture = True; } + if (Input->Shift.Pressed || Input->Alt.Pressed) { Ui->RequestedForceCapture = True; } if (Input->Ctrl.Pressed && Input->G.Clicked) { @@ -2171,22 +2172,14 @@ DoWorldEditor(engine_resources *Engine) if (EditIsSelected) { ButtonParams.FStyle = &DefaultSelectedStyle; -#if BONSAI_INTERNAL - -#endif } auto EditSelectButton = PushSimpleButton(Ui, FSz("(%s)", NameBuf), UiId(&LayersWindow, "edit select", Edit), &ButtonParams); if (Clicked(Ui, &EditSelectButton)) { // NOTE(Jesse): We do SelectEdit on the HotEdit later -#if 0 - Editor->Selection.Clicks = 2; - Editor->Selection.Region = Edit->Region; - - b32 MultiSelect = Input->Ctrl.Pressed; - SelectEdit(Editor, Edit, *EditIndex, MultiSelect); -#endif + /* b32 MultiSelect = Input->Ctrl.Pressed; */ + /* SelectEdit(Editor, Edit, *EditIndex, MultiSelect); */ Editor->CurrentLayer = Layer; if (Edit->Brush) @@ -2297,10 +2290,13 @@ DoWorldEditor(engine_resources *Engine) // if (Editor->HotEdit) { - if (Input->LMB.Clicked) + if (Input->Shift.Pressed == False && Input->Alt.Pressed == False) { - b32 MultiSelect = Input->Ctrl.Pressed; - SelectEdit(Editor, Editor->HotEdit, Editor->HotEditIndex, MultiSelect); + if (Input->LMB.Clicked) + { + b32 MultiSelect = Input->Ctrl.Pressed; + SelectEdit(Editor, Editor->HotEdit, Editor->HotEditIndex, MultiSelect); + } } auto EditAABB = GetSimSpaceAABB(World, Editor->HotEdit->Region); diff --git a/src/engine/editor.h b/src/engine/editor.h index f6d40404e..362ab26bc 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1189,31 +1189,6 @@ struct asset_brush -// NOTE(Jesse): This isn't really meant to be used outside the the level_editor -// I just packed all the things together such that it's a bit more obvious -// they're all for doing the selection -struct selection_region poof(@do_editor_ui) -{ - u32 Clicks; - - // NOTE(Jesse): We need to save the first point we clicked such that we can - // synthetically construct the region and construct it while we're clicking - // on a second point. The problem without this Base point is that we don't - // know if the point we clicked is the min or the max of the current box. - // There's probably a way to get around having this Base point, but it's not - // really a big deal. - cp Base; - - rect3cp Region = InvertedInfinityRectangle_rect3cp(); - - v3 Diff; // When Changed is set, this should be nonzero. - b32 InitialSelect; // Set when we go from a partial selection state -> fully selected - - selection_modification_mode ModMode; - selection_modification_state ModState; -}; - - struct world_edit_brush { @@ -1292,6 +1267,31 @@ struct world_edit_layer poof(block_array(world_edit_layer, {128})) #include + +// NOTE(Jesse): This isn't really meant to be used outside the the level_editor +// I just packed all the things together such that it's a bit more obvious +// they're all for doing the selection +struct selection_region poof(@do_editor_ui) +{ + u32 Clicks; + + // NOTE(Jesse): We need to save the first point we clicked such that we can + // synthetically construct the region and construct it while we're clicking + // on a second point. The problem without this Base point is that we don't + // know if the point we clicked is the min or the max of the current box. + // There's probably a way to get around having this Base point, but it's not + // really a big deal. + cp Base; + + rect3cp Region = InvertedInfinityRectangle_rect3cp(); + + v3 Diff; // When Changed is set, this should be nonzero. + b32 InitialSelect; // Set when we go from a partial selection state -> fully selected + + selection_modification_mode ModMode; + selection_modification_state ModState; +}; + struct level_editor { memory_arena *Memory; @@ -1391,13 +1391,13 @@ ComputeSelectionMode(input *Input) // Intentionally an el-if chain from most specific, to least. What's the alternative? // // Shift is resize - // Ctrl is move + // Alt is move // if (Input->Shift.Pressed && Input->Ctrl.Pressed && Input->Alt.Pressed) { SelectionMode = SelectionMode_ResizeAllAxies; } - else if (Input->Shift.Pressed && Input->Alt.Pressed) + else if (Input->Shift.Pressed && Input->Ctrl.Pressed) { SelectionMode = SelectionMode_ResizeBothLinearAxies; } @@ -1409,7 +1409,7 @@ ComputeSelectionMode(input *Input) { SelectionMode = SelectionMode_ResizeSingleLinearAxis; } - else if (Input->Ctrl.Pressed) + else if (Input->Alt.Pressed) { SelectionMode = SelectionMode_TranslatePlanar; } From ffbffa3c91077b00fbf9bb56fd352379a9cdc74c Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 10 Jun 2025 16:06:25 -0700 Subject: [PATCH 287/421] Highlight all selected edit faces when hovering --- src/engine/debug.cpp | 5 --- src/engine/editor.cpp | 80 ++++++++++++++++++++++++------------------- src/engine/editor.h | 4 +-- 3 files changed, 46 insertions(+), 43 deletions(-) diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index f8ed94184..020297b84 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -514,11 +514,6 @@ DoEngineDebug(engine_resources *Engine) /* Editor->EngineDebugViewModeToggleBits = EditorButtonGroup.ToggleBits; */ - // NOTE(Jesse): Do the world editor first so the SelectionChanged flag gets - // set before the rest of the UI code runs. This is not strictly necessary - // for correctness, but avoids a frame of lag. - // @selection_changed_flag - // if (ViewMode & EngineDebugViewMode_WorldEdit) { DoWorldEditor(Engine); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 01e7e9e74..be63ae225 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1428,31 +1428,6 @@ EditWorldSelection(engine_resources *Engine) } break; } - // Draw - // - if (Editor->Selection.Clicks > 0) - { - aabb FinalSelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); - auto Face = Editor->Selection.ModState.ClickedFace; - /* if (Face == FaceIndex_None) { Face = AABBTest.Face; } */ - - if (Face) - { - /* r32 InsetWidth = 0.25f; */ - r32 InsetWidth = 0.f; - v3 HiColor = RGB_GREEN; - r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS*2.5f; - - HighlightFace(Engine, Face, FinalSelectionAABB, InsetWidth, HiColor, HiThickness); - } - - // And finally the selection region - // - DEBUG_DrawSimSpaceAABB(Engine, &FinalSelectionAABB, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS); - } - - // Detect changes - // if (Editor->Selection.InitialSelect) { Info("InitialSelect"); } return AABBTest; @@ -1873,12 +1848,7 @@ DoWorldEditor(engine_resources *Engine) Editor->Selection.Clicks = 2; } - - // @selection_changed_flag - // aabb_intersect_result AABBTest = EditWorldSelection(Engine); - aabb SelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); - if (Engine->MaybeMouseRay.Tag == Maybe_Yes) { @@ -1993,7 +1963,6 @@ DoWorldEditor(engine_resources *Engine) } } } - } { @@ -2239,20 +2208,47 @@ DoWorldEditor(engine_resources *Engine) PushNewRow(Ui); PushTableEnd(Ui); PushWindowEnd(Ui, &LayersWindow); - } + // + // + // Draw + // + // + + auto Face = Editor->Selection.ModState.ClickedFace; + if (Face == FaceIndex_None) { Face = AABBTest.Face; } + + + // Selection region + // + if (Editor->Selection.ModMode && Editor->Selection.Clicks > 0) + { + aabb FinalSelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); + + if (Face) + { + /* r32 InsetWidth = 0.25f; */ + r32 InsetWidth = 0.f; + v3 HiColor = RGB_RED; + r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS*2.5f; + + HighlightFace(Engine, Face, FinalSelectionAABB, InsetWidth, HiColor, HiThickness); + } + + DEBUG_DrawSimSpaceAABB(Engine, &FinalSelectionAABB, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS); + } + + // Highlight moused over voxel + // if (Engine->MousedOverVoxel.Tag) { - /* v3 HotVoxel = GetHotVoxelForEditMode(Engine, GetEditModeForSelectedTool(Editor) ); */ - v3 HotVoxel = GetHotVoxelForEditMode(Engine, WorldEdit_Mode_Additive ); + v3 HotVoxel = GetHotVoxelForEditMode(Engine, WorldEdit_Mode_Subtractive ); DEBUG_HighlightVoxel( Engine, HotVoxel, RGB_RED, 0.075f); } - - // Highlight edits in the current layer // { @@ -2266,6 +2262,7 @@ DoWorldEditor(engine_resources *Engine) auto EditAABB = GetSimSpaceAABB(World, Edit->Region); random_series S = {u64(Edit)}; v3 BaseColor = RandomV3Unilateral(&S); + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, EDITOR_DEFAULT_SELECTION_THICKNESS); } } @@ -2282,6 +2279,17 @@ DoWorldEditor(engine_resources *Engine) auto EditAABB = GetSimSpaceAABB(World, Edit->Region); random_series S = {u64(Edit)}; v3 BaseColor = RandomV3Unilateral(&S); + + if (Face) + { + /* r32 InsetWidth = 0.25f; */ + r32 InsetWidth = 0.f; + v3 HiColor = RGB_RED; + r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS*2.5f; + + HighlightFace(Engine, Face, EditAABB, InsetWidth, HiColor, HiThickness); + } + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_YELLOW, EDITOR_DEFAULT_SELECTION_THICKNESS*1.5f); } } diff --git a/src/engine/editor.h b/src/engine/editor.h index 362ab26bc..fa4b634f0 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1390,8 +1390,8 @@ ComputeSelectionMode(input *Input) // Intentionally an el-if chain from most specific, to least. What's the alternative? // - // Shift is resize // Alt is move + // Shift is resize // if (Input->Shift.Pressed && Input->Ctrl.Pressed && Input->Alt.Pressed) { @@ -1401,7 +1401,7 @@ ComputeSelectionMode(input *Input) { SelectionMode = SelectionMode_ResizeBothLinearAxies; } - else if (Input->Ctrl.Pressed && Input->Alt.Pressed) + else if (Input->Alt.Pressed && Input->Ctrl.Pressed) { SelectionMode = SelectionMode_TranslateLinear; } From 3c8628ad9b46978a17100a6ca7601e97d1a362a7 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 10 Jun 2025 16:53:09 -0700 Subject: [PATCH 288/421] Dynamic selection box sizes --- src/engine/editor.cpp | 153 ++++++++++++++++++++++++------------------ src/engine/editor.h | 10 ++- 2 files changed, 98 insertions(+), 65 deletions(-) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index be63ae225..9b7511658 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1419,7 +1419,9 @@ EditWorldSelection(engine_resources *Engine) // Draw proposed modification region // rect3 ModifiedAABB = Rect3(&ModifiedSelection); - DEBUG_DrawSimSpaceAABB(Engine, &ModifiedAABB, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS*0.75f); + v3 CameraSimP = GetSimSpaceP(World, Camera->CurrentP); + r32 BaseThicc = GetSelectionThicknessForDistance( Distance(CameraSimP, GetCenter(&ModifiedAABB)) ); + DEBUG_DrawSimSpaceAABB(Engine, &ModifiedAABB, RGB_GREEN, BaseThicc*0.75f); } } } @@ -2218,100 +2220,123 @@ DoWorldEditor(engine_resources *Engine) // // - auto Face = Editor->Selection.ModState.ClickedFace; - if (Face == FaceIndex_None) { Face = AABBTest.Face; } + { + v3 CameraSimP = GetSimSpaceP(World, Camera->CurrentP); + auto Face = Editor->Selection.ModState.ClickedFace; + if (Face == FaceIndex_None) { Face = AABBTest.Face; } - // Selection region - // - if (Editor->Selection.ModMode && Editor->Selection.Clicks > 0) - { - aabb FinalSelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); + f32 HiThicknessMod = 2.5f; + + f32 LayerEditThicknessMod = 1.0f; + f32 HotEditThicknessMod = 1.5f; + f32 SelectedEditThicknessMod = 2.0f; + f32 SelectionThicknessMod = 3.0f; - if (Face) + + b32 ShiftOrAltPressed = Input->Shift.Pressed | Input->Alt.Pressed; + + // Selection region + // + if (Editor->Selection.ModMode && Editor->Selection.Clicks > 0) { - /* r32 InsetWidth = 0.25f; */ - r32 InsetWidth = 0.f; - v3 HiColor = RGB_RED; - r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS*2.5f; + aabb FinalSelectionAABB = GetSimSpaceRect(World, Editor->Selection.Region); + r32 BaseThicc = GetSelectionThicknessForDistance( Distance(CameraSimP, GetCenter(&FinalSelectionAABB)) ); + + if (Face && ShiftOrAltPressed) + { + /* r32 InsetWidth = 0.25f; */ + r32 InsetWidth = 0.f; + v3 HiColor = RGB_RED; - HighlightFace(Engine, Face, FinalSelectionAABB, InsetWidth, HiColor, HiThickness); + HighlightFace(Engine, Face, FinalSelectionAABB, InsetWidth, HiColor, BaseThicc*SelectionThicknessMod*HiThicknessMod); + } + + DEBUG_DrawSimSpaceAABB(Engine, &FinalSelectionAABB, RGB_GREEN, BaseThicc*SelectionThicknessMod); } - DEBUG_DrawSimSpaceAABB(Engine, &FinalSelectionAABB, RGB_GREEN, EDITOR_DEFAULT_SELECTION_THICKNESS); - } + // Highlight moused over voxel + // + if (Engine->MousedOverVoxel.Tag) + { + v3 HotVoxel = GetHotVoxelForEditMode(Engine, WorldEdit_Mode_Subtractive ); + DEBUG_HighlightVoxel( Engine, HotVoxel, RGB_RED, 0.075f); + } - // Highlight moused over voxel - // - if (Engine->MousedOverVoxel.Tag) - { - v3 HotVoxel = GetHotVoxelForEditMode(Engine, WorldEdit_Mode_Subtractive ); - DEBUG_HighlightVoxel( Engine, HotVoxel, RGB_RED, 0.075f); - } + // Highlight edits in the current layer + // + { + if (auto Layer = Editor->CurrentLayer) + { + IterateOver(&Layer->EditIndices, EditIndex, EditIndexIndex) + { + world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); + Assert(Edit->Tombstone == False); - // Highlight edits in the current layer - // - { - if (auto Layer = Editor->CurrentLayer) + if (Edit == Editor->HotEdit) continue; + if (Edit->Selected) continue; + + auto EditAABB = GetSimSpaceAABB(World, Edit->Region); + random_series S = {u64(Edit)}; + v3 BaseColor = RandomV3Unilateral(&S); + + r32 BaseThicc = GetSelectionThicknessForDistance( Distance(CameraSimP, GetCenter(&EditAABB)) ); + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, BaseThicc*LayerEditThicknessMod); + } + } + } + + // Highlight currently selected edits + // { - IterateOver(&Layer->EditIndices, EditIndex, EditIndexIndex) + IterateOver(&Editor->SelectedEditIndices, EditIndex, EditIndexIndex) { world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); Assert(Edit->Tombstone == False); + auto EditAABB = GetSimSpaceAABB(World, Edit->Region); random_series S = {u64(Edit)}; v3 BaseColor = RandomV3Unilateral(&S); - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, EDITOR_DEFAULT_SELECTION_THICKNESS); - } - } - } - - // Highlight currently selected edits - // - { - IterateOver(&Editor->SelectedEditIndices, EditIndex, EditIndexIndex) - { - world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); - Assert(Edit->Tombstone == False); + r32 BaseThicc = GetSelectionThicknessForDistance( Distance(CameraSimP, GetCenter(&EditAABB)) ); + if (Face && ShiftOrAltPressed) + { + /* r32 InsetWidth = 0.25f; */ + r32 InsetWidth = 0.f; + v3 HiColor = RGB_RED; - auto EditAABB = GetSimSpaceAABB(World, Edit->Region); - random_series S = {u64(Edit)}; - v3 BaseColor = RandomV3Unilateral(&S); + HighlightFace(Engine, Face, EditAABB, InsetWidth, HiColor, BaseThicc*SelectedEditThicknessMod*HiThicknessMod); + } - if (Face) - { - /* r32 InsetWidth = 0.25f; */ - r32 InsetWidth = 0.f; - v3 HiColor = RGB_RED; - r32 HiThickness = EDITOR_DEFAULT_SELECTION_THICKNESS*2.5f; + // NOTE(Jesse): This is intentionally after the HighlightFace call; we + // always wanna highlight that no matter if we're hovering or not + if (Edit == Editor->HotEdit) continue; - HighlightFace(Engine, Face, EditAABB, InsetWidth, HiColor, HiThickness); + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_YELLOW, BaseThicc*SelectedEditThicknessMod); } - - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_YELLOW, EDITOR_DEFAULT_SELECTION_THICKNESS*1.5f); } - } - // Highlight the hot edit - // - if (Editor->HotEdit) - { - if (Input->Shift.Pressed == False && Input->Alt.Pressed == False) + // Highlight the hot edit + // + if (Editor->HotEdit) { - if (Input->LMB.Clicked) + if (Input->Shift.Pressed == False && Input->Alt.Pressed == False) { - b32 MultiSelect = Input->Ctrl.Pressed; - SelectEdit(Editor, Editor->HotEdit, Editor->HotEditIndex, MultiSelect); + if (Input->LMB.Clicked) + { + b32 MultiSelect = Input->Ctrl.Pressed; + SelectEdit(Editor, Editor->HotEdit, Editor->HotEditIndex, MultiSelect); + } } + + auto EditAABB = GetSimSpaceAABB(World, Editor->HotEdit->Region); + r32 BaseThicc = GetSelectionThicknessForDistance( Distance(CameraSimP, GetCenter(&EditAABB)) ); + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_PINK, BaseThicc*HotEditThicknessMod); } - auto EditAABB = GetSimSpaceAABB(World, Editor->HotEdit->Region); - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_PINK, EDITOR_DEFAULT_SELECTION_THICKNESS*2.f); } - #if BONSAI_INTERNAL // NOTE(Jesse): Sanity check we keep the selected flag in sync with the array IterateOver(&Editor->Edits, Edit, EI) diff --git a/src/engine/editor.h b/src/engine/editor.h index fa4b634f0..80ae48fa0 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1,4 +1,4 @@ -#define EDITOR_DEFAULT_SELECTION_THICKNESS (0.15f) +/* #define EDITOR_DEFAULT_SELECTION_THICKNESS (0.15f) */ enum ui_layer_toolbar_actions poof(@gen_ui_toolbar) @@ -1417,6 +1417,14 @@ ComputeSelectionMode(input *Input) return SelectionMode; } +link_internal f32 +GetSelectionThicknessForDistance(f32 Distance) +{ + f32 Result = Clamp(0.25f, Distance / 3000.f, 12.f); + return Result; +} + + link_internal b32 CheckSettingsChanged(layered_brush *); From 29ac0cd69cb6d6c0e6504ab61149ae4d14a68be1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Jun 2025 08:17:42 -0700 Subject: [PATCH 289/421] Save out SelectedLayerIndex, fix more bugs --- .../block_array_c_asset_thumbnail_688856411.h | 2 +- generated/deserialize_struct_level_header.h | 8 ++ ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 6 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...r_ui_for_compound_type_struct_world_edit.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 2 +- ..._for_compound_type_world_edit_paged_list.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 2 +- ..._type_world_update_op_shape_params_plane.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 2 +- generated/for_datatypes_Bxw4Q7AW.h | 2 +- generated/for_datatypes_kh9dwrCf.h | 2 +- generated/serialize_struct_level_header.h | 7 ++ .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...ing_and_value_tables_visible_region_size.h | 2 +- src/engine/editor.cpp | 87 ++++++++++--------- src/engine/editor.h | 10 ++- src/engine/level.h | 7 +- 111 files changed, 181 insertions(+), 154 deletions(-) diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 39838f201..87953bc1a 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:129:0 +// src/engine/editor.cpp:130:0 diff --git a/generated/deserialize_struct_level_header.h b/generated/deserialize_struct_level_header.h index 01ee9e571..3cf6b75c9 100644 --- a/generated/deserialize_struct_level_header.h +++ b/generated/deserialize_struct_level_header.h @@ -37,6 +37,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->SelectedLayerIndex, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldCenter, Memory); diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index b5d44f866..09d7d82a8 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:327:0 +// src/engine/editor.cpp:328:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index eb96e22cd..1d88a59d1 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:499:0 +// src/engine/editor.cpp:500:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index f614a1a76..ecd36e69c 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:491:0 +// src/engine/editor.cpp:492:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 86a839901..38b9cda18 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:366:0 +// src/engine/editor.cpp:367:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 03ead3924..75241371c 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:333:0 +// src/engine/editor.cpp:334:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 7c32d9622..45f556533 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:266:0 +// src/engine/editor.cpp:267:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 875504039..54a1dbb99 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:402:0 +// src/engine/editor.cpp:403:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index cc64d253e..39554444b 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:172:0 +// src/engine/editor.cpp:173:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 04874b527..111ee9cb1 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:360:0 +// src/engine/editor.cpp:361:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 33de7a964..ca856d25c 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:432:0 +// src/engine/editor.cpp:433:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 08e77df31..429a38292 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:369:0 +// src/engine/editor.cpp:370:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index e5466464d..f40c6e9bb 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:502:0 +// src/engine/editor.cpp:503:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 79c8531ce..4bb27d4da 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:262:0 +// src/engine/editor.cpp:263:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index bc66631d8..894cc0162 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:563:0 +// src/engine/editor.cpp:564:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index ed6be19bb..88b2eda48 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:584:0 +// src/engine/editor.cpp:585:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index b05216800..cc3fb9b0d 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:581:0 +// src/engine/editor.cpp:582:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 67ecf4eb3..360581d92 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:471:0 +// src/engine/editor.cpp:472:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 2b2d07455..a1c4f8b0a 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:468:0 +// src/engine/editor.cpp:469:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 98e9c6475..20b0a5e47 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:505:0 +// src/engine/editor.cpp:506:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 0a231d274..3c02d2e6d 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:457:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 491761ab5..57751772a 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:357:0 +// src/engine/editor.cpp:358:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index c1a3c2753..a89f55f74 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:539:0 +// src/engine/editor.cpp:540:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 4ee48f7f0..90f1d9fad 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:533:0 +// src/engine/editor.cpp:534:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index b8b737613..fc78501f0 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:438:0 +// src/engine/editor.cpp:439:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 86fbdf589..ec8cb5ec4 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:442:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index dd49d5333..0e60c9461 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:554:0 +// src/engine/editor.cpp:555:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index f5c0b3205..816fa6f72 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:578:0 +// src/engine/editor.cpp:579:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index f5e13e8f7..bad6df924 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:255:0 +// src/engine/editor.cpp:256:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index e6bf82d73..19dca87c7 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:252:0 +// src/engine/editor.cpp:253:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 487b28cd4..0644fac38 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:324:0 +// src/engine/editor.cpp:325:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index b5fe504c5..c80fcba46 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:405:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index bb413dba9..c00d15f6c 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:569:0 +// src/engine/editor.cpp:570:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -154,11 +154,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - cs MemberName = CSz("CurrentLayer"); + cs MemberName = CSz("SelectedLayerIndex"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_layer*, Element->CurrentLayer), + Cast(world_edit_layer_block_array_index*, &Element->SelectedLayerIndex), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 9c6389bb0..a0b82af53 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:536:0 +// src/engine/editor.cpp:537:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 9b14ef18b..41d817398 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:303:0 +// src/engine/editor.cpp:304:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index ac6e9e791..35db61395 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:444:0 +// src/engine/editor.cpp:445:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 59fa3f3b6..e1f31530c 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:448:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 71d0b3e10..a78bda01b 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:152:0 +// src/engine/editor.cpp:153:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 2e3b8c9f2..ffb67a040 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:481:0 +// src/engine/editor.cpp:482:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index c742893ea..790a16154 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:319:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 809763e45..cd016b74a 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:321:0 +// src/engine/editor.cpp:322:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 7d010741f..8816c45a4 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:148:0 +// src/engine/editor.cpp:149:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index be1377d41..f988e061f 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:309:0 +// src/engine/editor.cpp:310:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 58fd5f885..7d952bf79 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:354:0 +// src/engine/editor.cpp:355:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 0e460d6b1..a97ac8bda 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:258:0 +// src/engine/editor.cpp:259:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 5c80cd6ee..e20b14559 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:312:0 +// src/engine/editor.cpp:313:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index ea2721669..d36287588 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:527:0 +// src/engine/editor.cpp:528:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index b09da0686..c25ab0eb1 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:557:0 +// src/engine/editor.cpp:558:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 4dd081fa4..de809f8fd 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:306:0 +// src/engine/editor.cpp:307:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index a8cf0d50a..cf5e1596f 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:530:0 +// src/engine/editor.cpp:531:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 938c8462f..8326d3420 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:238:0 +// src/engine/editor.cpp:239:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index f02140051..13610fcce 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:170:0 +// src/engine/editor.cpp:171:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index c0ccf1913..75200353d 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:545:0 +// src/engine/editor.cpp:546:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index ff5654d63..bc7377298 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:548:0 +// src/engine/editor.cpp:549:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 1c5f28efd..23fd98c1d 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:542:0 +// src/engine/editor.cpp:543:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index c02753ceb..dee90b88f 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:411:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index ca1d43914..be34d7601 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:408:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 9b4057300..7c5a41007 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:551:0 +// src/engine/editor.cpp:552:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 717570777..c05cee437 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:363:0 +// src/engine/editor.cpp:364:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 383c0fdb2..be635e586 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:560:0 +// src/engine/editor.cpp:561:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index f1f64bd2e..eb638a7cd 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:178:0 +// src/engine/editor.cpp:179:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 727d16f20..b43d35c09 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:181:0 +// src/engine/editor.cpp:182:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 83ff1d8e1..dbdecd1b5 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:336:0 +// src/engine/editor.cpp:337:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index b09c0dae7..21848a710 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:330:0 +// src/engine/editor.cpp:331:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index a1558ded6..2951084ce 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:150:0 +// src/engine/editor.cpp:151:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 3b67ae25d..f6d0480e4 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:435:0 +// src/engine/editor.cpp:436:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 3e3ebadc3..0e2deba04 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:426:0 +// src/engine/editor.cpp:427:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 6d9dcb9a9..aec10a731 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:429:0 +// src/engine/editor.cpp:430:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index f8c12b428..6ac02417f 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:146:0 +// src/engine/editor.cpp:147:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 8f8789ecc..916111016 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:249:0 +// src/engine/editor.cpp:250:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 9e1b79d95..0a1825c0a 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:246:0 +// src/engine/editor.cpp:247:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 681611db8..de1a75560 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:484:0 +// src/engine/editor.cpp:485:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index c75388573..cb1bad022 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:478:0 +// src/engine/editor.cpp:479:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index 35093ed54..85b7a733f 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:417:0 +// src/engine/editor.cpp:418:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h index 1c9abdb96..2e50805f9 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_paged_list.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:414:0 +// src/engine/editor.cpp:415:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 2cf7dafa7..971dff3fd 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:160:0 +// src/engine/editor.cpp:161:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h index e6d2fe051..d06c7024c 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:162:0 +// src/engine/editor.cpp:163:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 0a3711592..5a375e9fc 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:156:0 +// src/engine/editor.cpp:157:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 378ec541d..0a8389b7d 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:158:0 +// src/engine/editor.cpp:159:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index a5680cfe7..51404bb90 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:475:0 +// src/engine/editor.cpp:476:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 6f5e4408f..80742eb04 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:451:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index 681c9f13b..532c7426d 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:241:0 +// src/engine/editor.cpp:242:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 553df62bb..b8ff4545f 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:235:0 +// src/engine/editor.cpp:236:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index cc90c7495..5134a1e92 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:190:0 +// src/engine/editor.cpp:191:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 490c47437..cc66c50e0 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:175:0 +// src/engine/editor.cpp:176:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index 76551db95..146186922 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:420:0 +// src/engine/editor.cpp:421:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index d24f43b05..8220567a1 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:496:0 +// src/engine/editor.cpp:497:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index ea853f9f3..bc438e7ed 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:423:0 +// src/engine/editor.cpp:424:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index b05527367..0fb396bd1 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:566:0 +// src/engine/editor.cpp:567:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 06b1420a5..20ddaf820 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:294:0 +// src/engine/editor.cpp:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 81aa3c542..c25a72c31 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:291:0 +// src/engine/editor.cpp:292:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 9d6284ba3..98e1c3d3c 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:454:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index abc8fcde6..82c10b522 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:315:0 +// src/engine/editor.cpp:316:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index b522f668a..1e200e97e 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:572:0 +// src/engine/editor.cpp:573:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index d4ede8e82..35b725c61 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:575:0 +// src/engine/editor.cpp:576:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index fbd6c21ae..04cbb796e 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:168:0 +// src/engine/editor.cpp:169:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index c5b85b2c9..2b9197734 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:297:0 +// src/engine/editor.cpp:298:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index f7c8efb89..6d49d9ce1 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:142:0 +// src/engine/editor.cpp:143:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index f549a427b..3e0d2fa3e 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:513:0 +// src/engine/editor.cpp:514:0 diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 231c0e06a..54098e65f 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:376:0 +// src/engine/editor.cpp:377:0 diff --git a/generated/serialize_struct_level_header.h b/generated/serialize_struct_level_header.h index 23058cc1b..537dfcda4 100644 --- a/generated/serialize_struct_level_header.h +++ b/generated/serialize_struct_level_header.h @@ -55,6 +55,13 @@ Serialize(u8_cursor_block_array *Bytes, level_header *BaseElement, umm Count = 1 + Result &= Serialize(Bytes, &Element->SelectedLayerIndex); // default + + + + + + Result &= Serialize(Bytes, &Element->WorldCenter); // default diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index c54e0c499..228f84945 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:494:0 +// src/engine/editor.cpp:495:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 81641e305..329010506 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:287:0 +// src/engine/editor.cpp:288:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 1302de419..415155e35 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:281:0 +// src/engine/editor.cpp:282:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 2ea6427a1..98b47bf88 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:278:0 +// src/engine/editor.cpp:279:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index b97f09660..be1a07804 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:284:0 +// src/engine/editor.cpp:285:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index 6124d210a..0ee54c1b3 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:140:0 +// src/engine/editor.cpp:141:0 link_internal counted_string ToStringPrefixless(visible_region_size Type) diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 9b7511658..cfae9673e 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -66,16 +66,17 @@ DuplicateEdit(level_editor *Editor, world_edit_layer *Layer, world_edit *Edit, w } -link_internal world_edit_layer* +link_internal world_edit_layer * NewLayer(level_editor *Editor) { + auto ResultIndex = AtElements(&Editor->Layers); auto Result = Push(&Editor->Layers); Result->EditIndices = WorldEditBlockArrayIndexBlockArray(Editor->Memory); cs DefaultName = FSz("layer_%d", Editor->NextLayerIndex++); CopyString(DefaultName.Start, Result->NameBuf, DefaultName.Count); - Editor->CurrentLayer = Result; + Editor->SelectedLayerIndex = ResultIndex; return Result; } @@ -1312,7 +1313,7 @@ EditWorldSelection(engine_resources *Engine) } - if (AtElements(&Editor->SelectedEditIndices).Index == 0) + if (Count(&Editor->SelectedEditIndices) == 0) { Editor->Selection.ModMode = SelectionModificationMode_None; } @@ -1320,11 +1321,15 @@ EditWorldSelection(engine_resources *Engine) switch (Editor->Selection.ModMode) { - case SelectionModificationMode_None: {} break; + case SelectionModificationMode_None: + { + Assert(Count(&Editor->SelectedEditIndices) == 0); + } break; case SelectionModificationMode_Initialize: { Assert(SelectionIncomplete(Editor->Selection.Clicks)); + Assert(Count(&Editor->SelectedEditIndices) == 1); // Hot update selection region before we click the second point // Must come first or we get a frame of lag. @@ -1371,6 +1376,8 @@ EditWorldSelection(engine_resources *Engine) case SelectionModificationMode_Modify: { + Assert(SelectionComplete(Editor->Selection.Clicks)); + Assert(Count(&Editor->SelectedEditIndices) > 0); // Edit the selection region // rect3i ModifiedSelection = {}; @@ -1826,6 +1833,9 @@ SelectEdit(level_editor *Editor, world_edit *Edit, world_edit_block_array_index Push(SelectedEditIndices, &EditIndex); Edit->Selected = True; } + + Editor->Selection.Clicks = 2; + Editor->Selection.ModMode = SelectionModificationMode_Modify; } link_internal void @@ -1842,14 +1852,6 @@ DoWorldEditor(engine_resources *Engine) Editor->CurrentBrush = Insert(ThisBrush, &Editor->LoadedBrushes, Editor->Memory); } - // This can happen for all kinds of reasons so we just detect it here instead - // of having to remember to set this ModMode flag - if (Count(&Editor->SelectedEditIndices)) - { - Editor->Selection.ModMode = SelectionModificationMode_Modify; - Editor->Selection.Clicks = 2; - } - aabb_intersect_result AABBTest = EditWorldSelection(Engine); if (Engine->MaybeMouseRay.Tag == Maybe_Yes) @@ -1882,19 +1884,18 @@ DoWorldEditor(engine_resources *Engine) if (Input->Ctrl.Pressed && Input->S.Clicked) { - if (Editor->CurrentLayer == 0) - { - NewLayer(Editor); - } - - ResetSelection(Editor); - Editor->Selection.ModMode = SelectionModificationMode_Initialize; + world_edit_layer *Layer = TryGetSelectedLayer(Editor); + if (Layer == 0) { Layer = NewLayer(Editor); } world_edit_block_array_index Index = {}; - auto E = NewEdit(Editor, Editor->CurrentLayer, &Index); + auto E = NewEdit(Editor, Layer, &Index); E->Brush = Editor->CurrentBrush; SelectEdit(Editor, E, Index); + + // NOTE(Jesse): Must come after SelectEdit because it sets the ModMode to Modify + ResetSelection(Editor); + Editor->Selection.ModMode = SelectionModificationMode_Initialize; } @@ -1986,14 +1987,14 @@ DoWorldEditor(engine_resources *Engine) IterateOver(&Editor->Layers, Layer, LayerIndex) { cs Name = CS(Layer->NameBuf); - b32 LayerSelected = Editor->CurrentLayer == Layer; + b32 LayerSelected = Editor->SelectedLayerIndex == LayerIndex; PushTableStart(Ui); { ui_style *Style = LayerSelected ? &DefaultSelectedStyle : &DefaultStyle; if (Button(Ui, Name, UiId(&LayersWindow, Layer, Layer), Style)) { - Editor->CurrentLayer = Layer; + Editor->SelectedLayerIndex = LayerIndex; // NOTE(Jesse): Clear the list if we didn't have ctrl pressed b32 MultiSelect = Input->Ctrl.Pressed; @@ -2051,7 +2052,7 @@ DoWorldEditor(engine_resources *Engine) RemoveOrdered(&Editor->Layers, Layer); Layer = 0; - Editor->CurrentLayer = 0; + Editor->SelectedLayerIndex = {INVALID_BLOCK_ARRAY_INDEX}; LayerIndex = AtElements(&Editor->Layers); } break; } @@ -2152,7 +2153,7 @@ DoWorldEditor(engine_resources *Engine) /* b32 MultiSelect = Input->Ctrl.Pressed; */ /* SelectEdit(Editor, Edit, *EditIndex, MultiSelect); */ - Editor->CurrentLayer = Layer; + Editor->SelectedLayerIndex = LayerIndex; if (Edit->Brush) { Editor->CurrentBrush = Edit->Brush; @@ -2226,11 +2227,7 @@ DoWorldEditor(engine_resources *Engine) auto Face = Editor->Selection.ModState.ClickedFace; if (Face == FaceIndex_None) { Face = AABBTest.Face; } - f32 HiThicknessMod = 2.5f; - - f32 LayerEditThicknessMod = 1.0f; - f32 HotEditThicknessMod = 1.5f; - f32 SelectedEditThicknessMod = 2.0f; + f32 HiThicknessMod = 1.5f; f32 SelectionThicknessMod = 3.0f; @@ -2266,7 +2263,7 @@ DoWorldEditor(engine_resources *Engine) // Highlight edits in the current layer // { - if (auto Layer = Editor->CurrentLayer) + if ( world_edit_layer *Layer = TryGetSelectedLayer(Editor) ) { IterateOver(&Layer->EditIndices, EditIndex, EditIndexIndex) { @@ -2281,7 +2278,7 @@ DoWorldEditor(engine_resources *Engine) v3 BaseColor = RandomV3Unilateral(&S); r32 BaseThicc = GetSelectionThicknessForDistance( Distance(CameraSimP, GetCenter(&EditAABB)) ); - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, BaseThicc*LayerEditThicknessMod); + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, BaseColor, BaseThicc); } } } @@ -2306,14 +2303,14 @@ DoWorldEditor(engine_resources *Engine) r32 InsetWidth = 0.f; v3 HiColor = RGB_RED; - HighlightFace(Engine, Face, EditAABB, InsetWidth, HiColor, BaseThicc*SelectedEditThicknessMod*HiThicknessMod); + HighlightFace(Engine, Face, EditAABB, InsetWidth, HiColor, BaseThicc*HiThicknessMod); } // NOTE(Jesse): This is intentionally after the HighlightFace call; we // always wanna highlight that no matter if we're hovering or not if (Edit == Editor->HotEdit) continue; - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_YELLOW, BaseThicc*SelectedEditThicknessMod); + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_YELLOW, BaseThicc); } } @@ -2321,7 +2318,9 @@ DoWorldEditor(engine_resources *Engine) // if (Editor->HotEdit) { - if (Input->Shift.Pressed == False && Input->Alt.Pressed == False) + if ( Input->Shift.Pressed == False && + Input->Alt.Pressed == False && + Editor->Selection.ModMode != SelectionModificationMode_Initialize ) { if (Input->LMB.Clicked) { @@ -2332,7 +2331,7 @@ DoWorldEditor(engine_resources *Engine) auto EditAABB = GetSimSpaceAABB(World, Editor->HotEdit->Region); r32 BaseThicc = GetSelectionThicknessForDistance( Distance(CameraSimP, GetCenter(&EditAABB)) ); - DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_PINK, BaseThicc*HotEditThicknessMod); + DEBUG_DrawSimSpaceAABB(Engine, &EditAABB, RGB_PINK, BaseThicc); } } @@ -2394,13 +2393,14 @@ DoLevelWindow(engine_resources *Engine) level_header Header = {}; - Header.WorldCenter = World->Center; - Header.VisibleRegionSize = World->VisibleRegionSize; - Header.Camera = *Camera; - Header.RenderSettings = Graphics->Settings; - Header.EntityCount = EntityCount; - Header.LayerCount = u32(AtElements(&Editor->Layers).Index); - Header.EditCount = u32(AtElements(&Editor->Edits).Index); + Header.WorldCenter = World->Center; + Header.VisibleRegionSize = World->VisibleRegionSize; + Header.Camera = *Camera; + Header.RenderSettings = Graphics->Settings; + Header.EntityCount = EntityCount; + Header.SelectedLayerIndex = u32(Editor->SelectedLayerIndex.Index); + Header.LayerCount = u32(AtElements(&Editor->Layers).Index); + Header.EditCount = u32(AtElements(&Editor->Edits).Index); { cs Filename = Engine->Graphics.TerrainShapingRC.Program.FragSourceFilename; @@ -2507,6 +2507,8 @@ DoLevelWindow(engine_resources *Engine) HardResetEngine(Engine); Global_SerializeTypeTable = Tmp; + Engine->Editor.SelectedLayerIndex = {LevelHeader.SelectedLayerIndex}; + /* s32 ChunkCount = Cast(s32, LevelHeader.ChunkCount); */ s32 ChunkCount = 0; @@ -2538,6 +2540,7 @@ DoLevelWindow(engine_resources *Engine) { FinalEdit->Selected = False; // Minor hack so SelectEdit doesn't assert SelectEdit(Editor, FinalEdit, {EditIndex}, True); + Editor->Selection.ModMode == SelectionModificationMode_Modify; } ApplyEditToOctree(Engine, FinalEdit, GetTranArena()); diff --git a/src/engine/editor.h b/src/engine/editor.h index 80ae48fa0..22bb5ff59 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1303,8 +1303,8 @@ struct level_editor // Used for naming layers during NewLayer u32 NextLayerIndex; - world_edit_layer_block_array Layers; - world_edit_layer *CurrentLayer; + world_edit_layer_block_array Layers; + world_edit_layer_block_array_index SelectedLayerIndex = {INVALID_BLOCK_ARRAY_INDEX}; world_edit_block_array Edits; world_edit_block_array_index_block_array SelectedEditIndices; @@ -1424,6 +1424,12 @@ GetSelectionThicknessForDistance(f32 Distance) return Result; } +link_internal world_edit_layer * +TryGetSelectedLayer(level_editor *Editor) +{ + world_edit_layer *Result = TryGetPtr(&Editor->Layers, Editor->SelectedLayerIndex); + return Result; +} link_internal b32 CheckSettingsChanged(layered_brush *); diff --git a/src/engine/level.h b/src/engine/level.h index 37aadc277..6d5dc6f3c 100644 --- a/src/engine/level.h +++ b/src/engine/level.h @@ -6,13 +6,16 @@ struct level_header u32 EditCount; u32 EntityCount; + // Editor Params + // + u32 SelectedLayerIndex; + // World Params + // v3i WorldCenter; - /* v3i VisibleRegion; */ visible_region_size VisibleRegionSize; camera Camera; - render_settings RenderSettings; char TerrainShapingShader[NameBuf_Len]; From e3d1d012977e0d973139654125350fd671ff374b Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Jun 2025 09:15:40 -0700 Subject: [PATCH 290/421] Fix edit ordering, fix stale edit when reordering --- generated/block_array_bitmap_688853862.h | 26 ++++---- ...k_queue_entry_build_chunk_mesh_688853862.h | 26 ++++---- generated/block_array_entity_688856407.h | 26 ++++---- .../block_array_entity_ptr_688856411_h.h | 26 ++++---- ...lock_array_file_traversal_node_688853862.h | 26 ++++---- ...lock_array_gpu_readback_buffer_688853862.h | 26 ++++---- .../block_array_h_asset_thumbnail_688856411.h | 26 ++++---- .../block_array_h_gpu_timer_688735882_0.h | 26 ++++---- .../block_array_h_shader_ptr_688853971_0.h | 26 ++++---- generated/block_array_h_texture_688856411.h | 26 ++++---- generated/block_array_h_texture_688856411_0.h | 26 ++++---- generated/block_array_h_u32_688856411.h | 26 ++++---- generated/block_array_h_u8_cursor_688856411.h | 26 ++++---- ...lock_array_h_world_chunk_ptr_688853862_0.h | 26 ++++---- generated/block_array_member_info_688856411.h | 26 ++++---- generated/block_array_model_688856411.h | 26 ++++---- .../block_array_octree_node_ptr_688853862.h | 26 ++++---- ...block_array_picked_octree_node_688853862.h | 26 ++++---- .../block_array_standing_spot_688853862.h | 26 ++++---- generated/block_array_vox_data_688856411.h | 26 ++++---- ...lock_array_voxel_stack_element_688853862.h | 26 ++++---- ...y_world_edit_block_array_index_688735882.h | 28 ++++---- .../block_array_world_edit_layer_688735882.h | 28 ++++---- .../block_array_world_edit_ptr_688735882.h | 28 ++++---- ...r_ui_for_compound_type_struct_world_edit.h | 25 ++++++++ generated/serdes_struct_world_edit.h | 15 +++++ src/engine/editor.cpp | 64 ++++++++++++++----- src/engine/editor.h | 1 + src/engine/render_loop.cpp | 8 +-- 29 files changed, 359 insertions(+), 384 deletions(-) diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index cb65c87b5..7b29bf8e1 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -155,17 +155,6 @@ GetPtr( bitmap_block_array *Arr, bitmap_block_array_index Index ) return Result; } -link_internal bitmap * -TryGetPtr(bitmap_block_array *Arr, bitmap_block_array_index Index) -{ - bitmap * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal bitmap * GetPtr( bitmap_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( bitmap_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal bitmap * -TryGetPtr(bitmap_block_array *Arr, umm Index) +TryGetPtr( bitmap_block_array *Arr, bitmap_block_array_index Index) { bitmap * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - bitmap_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal bitmap * +TryGetPtr( bitmap_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, bitmap_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index fb0810f45..f879cdd26 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -155,17 +155,6 @@ GetPtr( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, dummy_work_que return Result; } -link_internal dummy_work_queue_entry_build_chunk_mesh * -TryGetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) -{ - dummy_work_queue_entry_build_chunk_mesh * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal dummy_work_queue_entry_build_chunk_mesh * GetPtr( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal dummy_work_queue_entry_build_chunk_mesh * -TryGetPtr(dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) +TryGetPtr( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index) { dummy_work_queue_entry_build_chunk_mesh * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - dummy_work_queue_entry_build_chunk_mesh_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal dummy_work_queue_entry_build_chunk_mesh * +TryGetPtr( dummy_work_queue_entry_build_chunk_mesh_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, dummy_work_queue_entry_build_chunk_mesh_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index 55a32e45c..073b8b097 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -155,17 +155,6 @@ GetPtr( entity_block_array *Arr, entity_block_array_index Index ) return Result; } -link_internal entity * -TryGetPtr(entity_block_array *Arr, entity_block_array_index Index) -{ - entity * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal entity * GetPtr( entity_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( entity_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal entity * -TryGetPtr(entity_block_array *Arr, umm Index) +TryGetPtr( entity_block_array *Arr, entity_block_array_index Index) { entity * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - entity_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal entity * +TryGetPtr( entity_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, entity_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_entity_ptr_688856411_h.h b/generated/block_array_entity_ptr_688856411_h.h index 15c233be7..3eac869df 100644 --- a/generated/block_array_entity_ptr_688856411_h.h +++ b/generated/block_array_entity_ptr_688856411_h.h @@ -155,17 +155,6 @@ GetPtr( entity_ptr_block_array *Arr, entity_ptr_block_array_index Index ) return Result; } -link_internal entity_ptr -TryGetPtr(entity_ptr_block_array *Arr, entity_ptr_block_array_index Index) -{ - entity_ptr Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal entity_ptr GetPtr( entity_ptr_block_array *Arr, umm Index ) @@ -174,15 +163,22 @@ GetPtr( entity_ptr_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal entity_ptr -TryGetPtr(entity_ptr_block_array *Arr, umm Index) +TryGetPtr( entity_ptr_block_array *Arr, entity_ptr_block_array_index Index) { entity_ptr Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - entity_ptr_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal entity_ptr +TryGetPtr( entity_ptr_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, entity_ptr_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index a8718ce88..f425991a3 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -155,17 +155,6 @@ GetPtr( file_traversal_node_block_array *Arr, file_traversal_node_block_array_in return Result; } -link_internal file_traversal_node * -TryGetPtr(file_traversal_node_block_array *Arr, file_traversal_node_block_array_index Index) -{ - file_traversal_node * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal file_traversal_node * GetPtr( file_traversal_node_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( file_traversal_node_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal file_traversal_node * -TryGetPtr(file_traversal_node_block_array *Arr, umm Index) +TryGetPtr( file_traversal_node_block_array *Arr, file_traversal_node_block_array_index Index) { file_traversal_node * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - file_traversal_node_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal file_traversal_node * +TryGetPtr( file_traversal_node_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, file_traversal_node_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 29a8dce0a..cb37b80ff 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -155,17 +155,6 @@ GetPtr( gpu_readback_buffer_block_array *Arr, gpu_readback_buffer_block_array_in return Result; } -link_internal gpu_readback_buffer * -TryGetPtr(gpu_readback_buffer_block_array *Arr, gpu_readback_buffer_block_array_index Index) -{ - gpu_readback_buffer * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal gpu_readback_buffer * GetPtr( gpu_readback_buffer_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( gpu_readback_buffer_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal gpu_readback_buffer * -TryGetPtr(gpu_readback_buffer_block_array *Arr, umm Index) +TryGetPtr( gpu_readback_buffer_block_array *Arr, gpu_readback_buffer_block_array_index Index) { gpu_readback_buffer * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - gpu_readback_buffer_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal gpu_readback_buffer * +TryGetPtr( gpu_readback_buffer_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, gpu_readback_buffer_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index eb7fcecd2..2ddab88fd 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -155,17 +155,6 @@ GetPtr( asset_thumbnail_block_array *Arr, asset_thumbnail_block_array_index Inde return Result; } -link_internal asset_thumbnail * -TryGetPtr(asset_thumbnail_block_array *Arr, asset_thumbnail_block_array_index Index) -{ - asset_thumbnail * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal asset_thumbnail * GetPtr( asset_thumbnail_block_array *Arr, umm Index ) @@ -174,15 +163,22 @@ GetPtr( asset_thumbnail_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal asset_thumbnail * -TryGetPtr(asset_thumbnail_block_array *Arr, umm Index) +TryGetPtr( asset_thumbnail_block_array *Arr, asset_thumbnail_block_array_index Index) { asset_thumbnail * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - asset_thumbnail_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal asset_thumbnail * +TryGetPtr( asset_thumbnail_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, asset_thumbnail_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_h_gpu_timer_688735882_0.h b/generated/block_array_h_gpu_timer_688735882_0.h index 163d8a4e4..6fcbf97b2 100644 --- a/generated/block_array_h_gpu_timer_688735882_0.h +++ b/generated/block_array_h_gpu_timer_688735882_0.h @@ -155,17 +155,6 @@ GetPtr( gpu_timer_block_array *Arr, gpu_timer_block_array_index Index ) return Result; } -link_internal gpu_timer * -TryGetPtr(gpu_timer_block_array *Arr, gpu_timer_block_array_index Index) -{ - gpu_timer * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal gpu_timer * GetPtr( gpu_timer_block_array *Arr, umm Index ) @@ -174,15 +163,22 @@ GetPtr( gpu_timer_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal gpu_timer * -TryGetPtr(gpu_timer_block_array *Arr, umm Index) +TryGetPtr( gpu_timer_block_array *Arr, gpu_timer_block_array_index Index) { gpu_timer * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - gpu_timer_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal gpu_timer * +TryGetPtr( gpu_timer_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, gpu_timer_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 17630ab88..694d4446c 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -155,17 +155,6 @@ GetPtr( shader_ptr_block_array *Arr, shader_ptr_block_array_index Index ) return Result; } -link_internal shader_ptr -TryGetPtr(shader_ptr_block_array *Arr, shader_ptr_block_array_index Index) -{ - shader_ptr Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal shader_ptr GetPtr( shader_ptr_block_array *Arr, umm Index ) @@ -174,15 +163,22 @@ GetPtr( shader_ptr_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal shader_ptr -TryGetPtr(shader_ptr_block_array *Arr, umm Index) +TryGetPtr( shader_ptr_block_array *Arr, shader_ptr_block_array_index Index) { shader_ptr Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - shader_ptr_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal shader_ptr +TryGetPtr( shader_ptr_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, shader_ptr_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_h_texture_688856411.h b/generated/block_array_h_texture_688856411.h index dd6730220..3e753876b 100644 --- a/generated/block_array_h_texture_688856411.h +++ b/generated/block_array_h_texture_688856411.h @@ -155,17 +155,6 @@ GetPtr( texture_ptr_block_array *Arr, texture_ptr_block_array_index Index ) return Result; } -link_internal texture_ptr -TryGetPtr(texture_ptr_block_array *Arr, texture_ptr_block_array_index Index) -{ - texture_ptr Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal texture_ptr GetPtr( texture_ptr_block_array *Arr, umm Index ) @@ -174,15 +163,22 @@ GetPtr( texture_ptr_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal texture_ptr -TryGetPtr(texture_ptr_block_array *Arr, umm Index) +TryGetPtr( texture_ptr_block_array *Arr, texture_ptr_block_array_index Index) { texture_ptr Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - texture_ptr_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal texture_ptr +TryGetPtr( texture_ptr_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, texture_ptr_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_h_texture_688856411_0.h b/generated/block_array_h_texture_688856411_0.h index 3d7acf168..6bf6f8410 100644 --- a/generated/block_array_h_texture_688856411_0.h +++ b/generated/block_array_h_texture_688856411_0.h @@ -155,17 +155,6 @@ GetPtr( texture_block_array *Arr, texture_block_array_index Index ) return Result; } -link_internal texture * -TryGetPtr(texture_block_array *Arr, texture_block_array_index Index) -{ - texture * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal texture * GetPtr( texture_block_array *Arr, umm Index ) @@ -174,15 +163,22 @@ GetPtr( texture_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal texture * -TryGetPtr(texture_block_array *Arr, umm Index) +TryGetPtr( texture_block_array *Arr, texture_block_array_index Index) { texture * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - texture_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal texture * +TryGetPtr( texture_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, texture_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_h_u32_688856411.h b/generated/block_array_h_u32_688856411.h index 02ac0bdd4..a0fc1fbae 100644 --- a/generated/block_array_h_u32_688856411.h +++ b/generated/block_array_h_u32_688856411.h @@ -155,17 +155,6 @@ GetPtr( u32_block_array *Arr, u32_block_array_index Index ) return Result; } -link_internal u32 * -TryGetPtr(u32_block_array *Arr, u32_block_array_index Index) -{ - u32 * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal u32 * GetPtr( u32_block_array *Arr, umm Index ) @@ -174,15 +163,22 @@ GetPtr( u32_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal u32 * -TryGetPtr(u32_block_array *Arr, umm Index) +TryGetPtr( u32_block_array *Arr, u32_block_array_index Index) { u32 * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - u32_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal u32 * +TryGetPtr( u32_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, u32_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_h_u8_cursor_688856411.h b/generated/block_array_h_u8_cursor_688856411.h index 2f6164621..0ce77ca21 100644 --- a/generated/block_array_h_u8_cursor_688856411.h +++ b/generated/block_array_h_u8_cursor_688856411.h @@ -155,17 +155,6 @@ GetPtr( u8_cursor_block_array *Arr, u8_cursor_block_array_index Index ) return Result; } -link_internal u8_cursor * -TryGetPtr(u8_cursor_block_array *Arr, u8_cursor_block_array_index Index) -{ - u8_cursor * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal u8_cursor * GetPtr( u8_cursor_block_array *Arr, umm Index ) @@ -174,15 +163,22 @@ GetPtr( u8_cursor_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal u8_cursor * -TryGetPtr(u8_cursor_block_array *Arr, umm Index) +TryGetPtr( u8_cursor_block_array *Arr, u8_cursor_block_array_index Index) { u8_cursor * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - u8_cursor_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal u8_cursor * +TryGetPtr( u8_cursor_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, u8_cursor_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index 9dd767a4f..a2e921c92 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -155,17 +155,6 @@ GetPtr( world_chunk_ptr_block_array *Arr, world_chunk_ptr_block_array_index Inde return Result; } -link_internal world_chunk_ptr -TryGetPtr(world_chunk_ptr_block_array *Arr, world_chunk_ptr_block_array_index Index) -{ - world_chunk_ptr Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal world_chunk_ptr GetPtr( world_chunk_ptr_block_array *Arr, umm Index ) @@ -174,15 +163,22 @@ GetPtr( world_chunk_ptr_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal world_chunk_ptr -TryGetPtr(world_chunk_ptr_block_array *Arr, umm Index) +TryGetPtr( world_chunk_ptr_block_array *Arr, world_chunk_ptr_block_array_index Index) { world_chunk_ptr Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - world_chunk_ptr_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal world_chunk_ptr +TryGetPtr( world_chunk_ptr_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, world_chunk_ptr_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index a1092b8c7..f5f855a51 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -155,17 +155,6 @@ GetPtr( member_info_block_array *Arr, member_info_block_array_index Index ) return Result; } -link_internal member_info * -TryGetPtr(member_info_block_array *Arr, member_info_block_array_index Index) -{ - member_info * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal member_info * GetPtr( member_info_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( member_info_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal member_info * -TryGetPtr(member_info_block_array *Arr, umm Index) +TryGetPtr( member_info_block_array *Arr, member_info_block_array_index Index) { member_info * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - member_info_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal member_info * +TryGetPtr( member_info_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, member_info_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 0be1f45d1..1240ad818 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -155,17 +155,6 @@ GetPtr( model_block_array *Arr, model_block_array_index Index ) return Result; } -link_internal model * -TryGetPtr(model_block_array *Arr, model_block_array_index Index) -{ - model * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal model * GetPtr( model_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( model_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal model * -TryGetPtr(model_block_array *Arr, umm Index) +TryGetPtr( model_block_array *Arr, model_block_array_index Index) { model * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - model_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal model * +TryGetPtr( model_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, model_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 4cea066a7..8e69958f9 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -155,17 +155,6 @@ GetPtr( octree_node_ptr_block_array *Arr, octree_node_ptr_block_array_index Inde return Result; } -link_internal octree_node_ptr -TryGetPtr(octree_node_ptr_block_array *Arr, octree_node_ptr_block_array_index Index) -{ - octree_node_ptr Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal octree_node_ptr GetPtr( octree_node_ptr_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( octree_node_ptr_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal octree_node_ptr -TryGetPtr(octree_node_ptr_block_array *Arr, umm Index) +TryGetPtr( octree_node_ptr_block_array *Arr, octree_node_ptr_block_array_index Index) { octree_node_ptr Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - octree_node_ptr_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal octree_node_ptr +TryGetPtr( octree_node_ptr_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, octree_node_ptr_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 0b8933e8f..4ac309592 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -155,17 +155,6 @@ GetPtr( picked_octree_node_block_array *Arr, picked_octree_node_block_array_inde return Result; } -link_internal picked_octree_node * -TryGetPtr(picked_octree_node_block_array *Arr, picked_octree_node_block_array_index Index) -{ - picked_octree_node * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal picked_octree_node * GetPtr( picked_octree_node_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( picked_octree_node_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal picked_octree_node * -TryGetPtr(picked_octree_node_block_array *Arr, umm Index) +TryGetPtr( picked_octree_node_block_array *Arr, picked_octree_node_block_array_index Index) { picked_octree_node * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - picked_octree_node_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal picked_octree_node * +TryGetPtr( picked_octree_node_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, picked_octree_node_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 9ab44ffb1..ce145f902 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -155,17 +155,6 @@ GetPtr( standing_spot_block_array *Arr, standing_spot_block_array_index Index ) return Result; } -link_internal standing_spot * -TryGetPtr(standing_spot_block_array *Arr, standing_spot_block_array_index Index) -{ - standing_spot * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal standing_spot * GetPtr( standing_spot_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( standing_spot_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal standing_spot * -TryGetPtr(standing_spot_block_array *Arr, umm Index) +TryGetPtr( standing_spot_block_array *Arr, standing_spot_block_array_index Index) { standing_spot * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - standing_spot_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal standing_spot * +TryGetPtr( standing_spot_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, standing_spot_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index ca61480b9..4cfe96dcb 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -155,17 +155,6 @@ GetPtr( vox_data_block_array *Arr, vox_data_block_array_index Index ) return Result; } -link_internal vox_data * -TryGetPtr(vox_data_block_array *Arr, vox_data_block_array_index Index) -{ - vox_data * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal vox_data * GetPtr( vox_data_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( vox_data_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal vox_data * -TryGetPtr(vox_data_block_array *Arr, umm Index) +TryGetPtr( vox_data_block_array *Arr, vox_data_block_array_index Index) { vox_data * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - vox_data_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal vox_data * +TryGetPtr( vox_data_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, vox_data_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index 073a7610e..a9109b462 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -155,17 +155,6 @@ GetPtr( voxel_stack_element_block_array *Arr, voxel_stack_element_block_array_in return Result; } -link_internal voxel_stack_element * -TryGetPtr(voxel_stack_element_block_array *Arr, voxel_stack_element_block_array_index Index) -{ - voxel_stack_element * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal voxel_stack_element * GetPtr( voxel_stack_element_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( voxel_stack_element_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal voxel_stack_element * -TryGetPtr(voxel_stack_element_block_array *Arr, umm Index) +TryGetPtr( voxel_stack_element_block_array *Arr, voxel_stack_element_block_array_index Index) { voxel_stack_element * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - voxel_stack_element_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal voxel_stack_element * +TryGetPtr( voxel_stack_element_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, voxel_stack_element_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 97df976be..a7f549e51 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1256:0 +// src/engine/editor.h:1257:0 @@ -155,17 +155,6 @@ GetPtr( world_edit_block_array_index_block_array *Arr, world_edit_block_array_in return Result; } -link_internal world_edit_block_array_index * -TryGetPtr(world_edit_block_array_index_block_array *Arr, world_edit_block_array_index_block_array_index Index) -{ - world_edit_block_array_index * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal world_edit_block_array_index * GetPtr( world_edit_block_array_index_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( world_edit_block_array_index_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal world_edit_block_array_index * -TryGetPtr(world_edit_block_array_index_block_array *Arr, umm Index) +TryGetPtr( world_edit_block_array_index_block_array *Arr, world_edit_block_array_index_block_array_index Index) { world_edit_block_array_index * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - world_edit_block_array_index_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal world_edit_block_array_index * +TryGetPtr( world_edit_block_array_index_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, world_edit_block_array_index_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 05f601f31..6ae97b1e1 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1267:0 +// src/engine/editor.h:1268:0 @@ -155,17 +155,6 @@ GetPtr( world_edit_layer_block_array *Arr, world_edit_layer_block_array_index In return Result; } -link_internal world_edit_layer * -TryGetPtr(world_edit_layer_block_array *Arr, world_edit_layer_block_array_index Index) -{ - world_edit_layer * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal world_edit_layer * GetPtr( world_edit_layer_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( world_edit_layer_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal world_edit_layer * -TryGetPtr(world_edit_layer_block_array *Arr, umm Index) +TryGetPtr( world_edit_layer_block_array *Arr, world_edit_layer_block_array_index Index) { world_edit_layer * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - world_edit_layer_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal world_edit_layer * +TryGetPtr( world_edit_layer_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, world_edit_layer_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 1c528d7e6..b36a55b64 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1252:0 +// src/engine/editor.h:1253:0 @@ -155,17 +155,6 @@ GetPtr( world_edit_ptr_block_array *Arr, world_edit_ptr_block_array_index Index return Result; } -link_internal world_edit_ptr -TryGetPtr(world_edit_ptr_block_array *Arr, world_edit_ptr_block_array_index Index) -{ - world_edit_ptr Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal world_edit_ptr GetPtr( world_edit_ptr_block_array *Arr, umm Index ) @@ -174,18 +163,25 @@ GetPtr( world_edit_ptr_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal world_edit_ptr -TryGetPtr(world_edit_ptr_block_array *Arr, umm Index) +TryGetPtr( world_edit_ptr_block_array *Arr, world_edit_ptr_block_array_index Index) { world_edit_ptr Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - world_edit_ptr_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal world_edit_ptr +TryGetPtr( world_edit_ptr_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, world_edit_ptr_block_array_index{Index}); + return Result; +} + diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit.h b/generated/do_editor_ui_for_compound_type_struct_world_edit.h index dee90b88f..c9182e73a 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit.h @@ -115,6 +115,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("Ordinal"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->Ordinal), + MemberName, + Params + ); + + + + + + + } PushNewRow(Ui); diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index 4e26cdb2e..6c2a856a2 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -55,6 +55,13 @@ Serialize(u8_cursor_block_array *Bytes, world_edit *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Selected); // default + + + + + + Result &= Serialize(Bytes, &Element->Ordinal); // default + if (Element->Brush) { Result &= Serialize(Bytes, Element->Brush); } @@ -105,6 +112,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit *Element, memory_arena *M // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Selected, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Ordinal, Memory); + if (HadBrushPointer) { umm Count = 1; diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index cfae9673e..c60d0039d 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1614,17 +1614,22 @@ ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Temp rect3cp QueryRegion = Edit->Region; - /* QueryRegion.Min.Offset -= 1.f; */ - /* QueryRegion.Max.Offset += 1.f; */ + // NOTE(Jesse): I would expect to need this, but it appears we don't for + // some reason.. +#if 0 + QueryRegion.Min.Offset -= 1.f; + QueryRegion.Max.Offset += 1.f; - /* Canonicalize(World, &QueryRegion.Min); */ - /* Canonicalize(World, &QueryRegion.Max); */ + Canonicalize(World, &QueryRegion.Min); + Canonicalize(World, &QueryRegion.Max); +#endif GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &QueryRegion, &Nodes); IterateOver(&Nodes, Node, NodeIndex) { AcquireFutex(&Node->Lock); + /* auto EditAABB = GetSimSpaceAABB(World, Node); */ /* random_series S = {u64(Node)}; */ /* v3 BaseColor = RandomV3Unilateral(&S); */ @@ -1643,8 +1648,6 @@ ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Temp Push(&Node->Edits, Edit); - /* Assert(Node->Type == OctreeNodeType_Leaf); */ - Node->Dirty = True; ReleaseFutex(&Node->Lock); } @@ -1677,16 +1680,20 @@ DropEditFromOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Tem link_internal void UpdateWorldEditBounds(engine_resources *Engine, world_edit *Edit, rect3cp Region, memory_arena *TempMemory) { - UNPACK_ENGINE_RESOURCES(Engine); Assert(Edit->Tombstone == False); DropEditFromOctree(Engine, Edit, TempMemory); - Edit->Region = Region; - ApplyEditToOctree(Engine, Edit, TempMemory); } +link_internal void +ReapplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *TempMemory) +{ + // TODO(Jesse): Is there a better way to do this, or do we even care? + UpdateWorldEditBounds(Engine, Edit, Edit->Region, TempMemory); +} + #if 0 link_internal void @@ -1959,9 +1966,7 @@ DoWorldEditor(engine_resources *Engine) if (Edit->Brush == Editor->CurrentBrush) { - // TODO(Jesse): We should be able to just mark the overlapping - // nodes dirty because we're not actually updating the edit bounds here.. - UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); + ReapplyEditToOctree(Engine, Edit, GetTranArena()); } } } @@ -2091,6 +2096,10 @@ DoWorldEditor(engine_resources *Engine) { if (PrevEditIndex) { + world_edit *PrevEdit = GetPtr(&Editor->Edits, *PrevEditIndex); + ReapplyEditToOctree(Engine, Edit, GetTranArena()); + ReapplyEditToOctree(Engine, PrevEdit, GetTranArena()); + auto Tmp = *PrevEditIndex; *PrevEditIndex = *EditIndex; *EditIndex = Tmp; @@ -2099,6 +2108,10 @@ DoWorldEditor(engine_resources *Engine) { Push(&PrevLayer->EditIndices, EditIndex); RemoveOrdered(&Layer->EditIndices, EditIndex); + + // NOTE(Jesse): No need to reapply because we didn't change + // the ordering, just shifted up a layer + /* ReapplyEditToOctree(Engine, Edit, GetTranArena()); */ } } break; @@ -2108,9 +2121,11 @@ DoWorldEditor(engine_resources *Engine) auto NextEditIndexIndex = EditIndexIndex; ++NextEditIndexIndex; - if (NextEditIndexIndex < AtElements(&Layer->EditIndices)) + if (auto NextEditIndex = TryGetPtr(&Layer->EditIndices, NextEditIndexIndex)) { - auto NextEditIndex = GetPtr(&Layer->EditIndices, NextEditIndexIndex); + world_edit *NextEdit = GetPtr(&Editor->Edits, *NextEditIndex); + ReapplyEditToOctree(Engine, Edit, GetTranArena()); + ReapplyEditToOctree(Engine, NextEdit, GetTranArena()); auto Tmp = *NextEditIndex; *NextEditIndex = *EditIndex; @@ -2123,11 +2138,14 @@ DoWorldEditor(engine_resources *Engine) auto NextLayerIndex = LayerIndex; ++NextLayerIndex; - auto NextLayer = TryGetPtr(&Editor->Layers, GetIndex(&NextLayerIndex)); - if (NextLayer) + if (auto NextLayer = TryGetPtr(&Editor->Layers, GetIndex(&NextLayerIndex))) { RemoveOrdered(&Layer->EditIndices, EditIndex); Shift(&NextLayer->EditIndices, EditIndex); + + // NOTE(Jesse): No need to reapply because we didn't change + // the ordering, just shifted up a layer + /* ReapplyEditToOctree(Engine, Edit, GetTranArena()); */ } EditIndexIndex = AtElements(&Layer->EditIndices); @@ -2177,7 +2195,7 @@ DoWorldEditor(engine_resources *Engine) { Assert(Editor->CurrentBrush); Edit->Brush = Editor->CurrentBrush; - UpdateWorldEditBounds(Engine, Edit, Edit->Region, GetTranArena()); + ReapplyEditToOctree(Engine, Edit, GetTranArena()); } break; case UiLayerEditAction_Duplicate: @@ -2351,6 +2369,18 @@ DoWorldEditor(engine_resources *Engine) } } #endif + + + u32 Ordinal = 0; + IterateOver(&Editor->Layers, Layer, LayerIndex) + { + IterateOver(&Layer->EditIndices, EditIndex, EII) + { + world_edit *Edit = GetPtr(&Editor->Edits, *EditIndex); + Edit->Ordinal = Ordinal++; + } + } + } link_internal void diff --git a/src/engine/editor.h b/src/engine/editor.h index 22bb5ff59..dfa29d78e 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1240,6 +1240,7 @@ struct world_edit // Not my favorite, but it's also not the end of the world. b32 Selected; // } + u32 Ordinal; }; typedef world_edit* world_edit_ptr; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index e20f10ded..68f7b1e3e 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -383,7 +383,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) // function.. so here we are. Hopefully I don't pay for this // in the future. // { -#if 0 +#if 1 s32 EditCount = s32(TotalElements(&Node->Edits)); sort_key *Keys = Allocate(sort_key, GetTranArena(), EditCount); @@ -398,14 +398,14 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) #endif // } - /* RangeIterator(KeyIndex, EditCount) */ - IterateOver(&Node->Edits, Edit, EditIndex) + RangeIterator(KeyIndex, EditCount) + /* IterateOver(&Node->Edits, Edit, EditIndex) */ { TIMED_NAMED_BLOCK(WorldEditDrawCall); /* world_edit *Edit = GetPtr(&Editor->Edits, *Edit); */ - /* world_edit *Edit = Cast(world_edit*, Keys[KeyIndex].Index); */ + world_edit *Edit = Cast(world_edit*, Keys[KeyIndex].Index); if (Edit->Brush) // NOTE(Jesse): Don't necessarily have to have a brush if we created the edit before we created a brush. { layered_brush *Brush = &Edit->Brush->Layered; From 6856091d62ac81112d6b637d4592e6fbcb7e3577 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Jun 2025 13:52:21 -0700 Subject: [PATCH 291/421] Prefer initializing nodes with edits --- src/engine/world.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 4563d7dd8..a2e36be94 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -635,6 +635,12 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio IdealListIndex = Max(0, IdealListIndex-3); } + // Prefer chunks who have been edited + if (Count(&Node->Edits)) + { + IdealListIndex = Max(0, IdealListIndex-10); + } + Assert(IdealListIndex >= 0 && IdealListIndex < OCTREE_PRIORITY_QUEUE_LIST_COUNT); if (Remaining(&Queue->Lists[IdealListIndex])) { From 8ef533c702cdbddfbcc6a40f7114e0f6b897fffe Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Jun 2025 13:58:10 -0700 Subject: [PATCH 292/421] Start tightening down SDF interactions --- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- generated/block_array_bitmap_688853862.h | 2 + .../block_array_c_asset_thumbnail_688856411.h | 2 + ...ntity_ptr_688856411_struct_struct_struct.h | 2 + generated/block_array_c_gpu_timer_688735882.h | 2 + .../block_array_c_shader_ptr_688853971.h | 2 + generated/block_array_c_texture_688856411.h | 2 + generated/block_array_c_u32_688856411.h | 2 + generated/block_array_c_u8_cursor_688856411.h | 2 + ...k_queue_entry_build_chunk_mesh_688853862.h | 2 + generated/block_array_entity_688856407.h | 2 + ...lock_array_file_traversal_node_688853862.h | 2 + ...lock_array_gpu_readback_buffer_688853862.h | 2 + generated/block_array_member_info_688856411.h | 2 + generated/block_array_model_688856411.h | 2 + .../block_array_octree_node_ptr_688853862.h | 2 + ...block_array_picked_octree_node_688853862.h | 2 + .../block_array_standing_spot_688853862.h | 2 + generated/block_array_texture_ptr_688856411.h | 2 + generated/block_array_vox_data_688856411.h | 2 + ...lock_array_voxel_stack_element_688853862.h | 2 + .../block_array_world_chunk_ptr_688853862.h | 2 + generated/block_array_world_edit_688735882.h | 57 ++++--- ...y_world_edit_block_array_index_688735882.h | 4 +- .../block_array_world_edit_layer_688735882.h | 4 +- .../block_array_world_edit_ptr_688735882.h | 4 +- generated/default_marshal_noise_layer_0.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 12 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 3 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- generated/for_datatypes_Bxw4Q7AW.h | 161 ++++++++++++++++++ generated/hashtable_world_edit_brush.h | 2 +- generated/serdes_struct_brush_settings.h | 12 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 5 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- jesse.make.sh | 2 +- shaders/terrain/world_edit.fragmentshader | 93 +++++----- src/engine/editor.cpp | 100 +++++++---- src/engine/editor.h | 7 +- src/engine/render_loop.cpp | 10 +- 51 files changed, 418 insertions(+), 130 deletions(-) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index db3644a3e..93963bb47 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:866:0 +// src/engine/editor.h:867:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 6ce87564b..12de6b821 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1134:0 +// src/engine/editor.h:1135:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 87f0856bc..4662ede1e 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1221:0 +// src/engine/editor.h:1222:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index 7b29bf8e1..ce8f65b37 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -343,3 +343,5 @@ Shift( bitmap_block_array *Array, bitmap *Element ) } + + diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 87953bc1a..330e3ca9d 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -160,3 +160,5 @@ Shift( asset_thumbnail_block_array *Array, asset_thumbnail *Element ) *Prev = *Element; } + + diff --git a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h index e8f1f6e7a..22dc51019 100644 --- a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h +++ b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h @@ -160,3 +160,5 @@ Shift( entity_ptr_block_array *Array, entity_ptr Element ) *Prev = *Element; } + + diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index 01805bd25..d395fa401 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -160,3 +160,5 @@ Shift( gpu_timer_block_array *Array, gpu_timer *Element ) *Prev = *Element; } + + diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index 5696ea7c7..fa7f371a3 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -160,3 +160,5 @@ Shift( shader_ptr_block_array *Array, shader_ptr Element ) *Prev = *Element; } + + diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index 051a27cd8..dec400825 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -160,3 +160,5 @@ Shift( texture_block_array *Array, texture *Element ) *Prev = *Element; } + + diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index 88b1b96c7..3d2f8c32b 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -160,3 +160,5 @@ Shift( u32_block_array *Array, u32 *Element ) *Prev = *Element; } + + diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index b14b86a59..b97a9ba5b 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -160,3 +160,5 @@ Shift( u8_cursor_block_array *Array, u8_cursor *Element ) *Prev = *Element; } + + diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index f879cdd26..1bef572d9 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -343,3 +343,5 @@ Shift( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_qu } + + diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index 073b8b097..ba0a57f10 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -343,3 +343,5 @@ Shift( entity_block_array *Array, entity *Element ) } + + diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index f425991a3..dc389f070 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -343,3 +343,5 @@ Shift( file_traversal_node_block_array *Array, file_traversal_node *Element ) } + + diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index cb37b80ff..b0bccd0ea 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -343,3 +343,5 @@ Shift( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element ) } + + diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index f5f855a51..7683eaf7b 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -343,3 +343,5 @@ Shift( member_info_block_array *Array, member_info *Element ) } + + diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index 1240ad818..fdf1eb1f7 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -343,3 +343,5 @@ Shift( model_block_array *Array, model *Element ) } + + diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 8e69958f9..07ebd8da5 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -343,3 +343,5 @@ Shift( octree_node_ptr_block_array *Array, octree_node_ptr Element ) } + + diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 4ac309592..c49c0a0de 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -343,3 +343,5 @@ Shift( picked_octree_node_block_array *Array, picked_octree_node *Element ) } + + diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index ce145f902..3e3a3570a 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -343,3 +343,5 @@ Shift( standing_spot_block_array *Array, standing_spot *Element ) } + + diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index 9c9642d1e..d3b2aaefd 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -160,3 +160,5 @@ Shift( texture_ptr_block_array *Array, texture_ptr Element ) *Prev = *Element; } + + diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index 4cfe96dcb..59c0ca063 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -343,3 +343,5 @@ Shift( vox_data_block_array *Array, vox_data *Element ) } + + diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index a9109b462..eb1a49038 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -343,3 +343,5 @@ Shift( voxel_stack_element_block_array *Array, voxel_stack_element *Element ) } + + diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index 5598f7754..a5e745f07 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -160,3 +160,5 @@ Shift( world_chunk_ptr_block_array *Array, world_chunk_ptr Element ) *Prev = *Element; } + + diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 1d98c74b7..12314af42 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1252:0 +// src/engine/editor.h:1250:0 @@ -14,9 +14,6 @@ struct world_edit_block struct world_edit_block_array_index poof(@block_array_IndexOfValue) { umm Index; - /* block_t *Block; */ - /* u32 BlockIndex; */ - /* u32 ElementIndex; */ }; struct world_edit_block_array @@ -158,17 +155,6 @@ GetPtr( world_edit_block_array *Arr, world_edit_block_array_index Index ) return Result; } -link_internal world_edit * -TryGetPtr(world_edit_block_array *Arr, world_edit_block_array_index Index) -{ - world_edit * Result = {}; - if (Arr->BlockPtrs && Index.Index < Capacity(Arr).Index) - { - Result = GetPtr(Arr, Index); - } - return Result; -} - link_internal world_edit * GetPtr( world_edit_block_array *Arr, umm Index ) @@ -177,18 +163,25 @@ GetPtr( world_edit_block_array *Arr, umm Index ) return GetPtr(Arr, I); } + link_internal world_edit * -TryGetPtr(world_edit_block_array *Arr, umm Index) +TryGetPtr( world_edit_block_array *Arr, world_edit_block_array_index Index) { world_edit * Result = {}; - if (Arr->BlockPtrs && Index < AtElements(Arr).Index) + if (Arr->BlockPtrs && Index < AtElements(Arr)) { - world_edit_block_array_index I = {Index}; - Result = GetPtr(Arr, I); + Result = GetPtr(Arr, Index); } return Result; } +link_internal world_edit * +TryGetPtr( world_edit_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, world_edit_block_array_index{Index}); + return Result; +} + @@ -349,4 +342,30 @@ Shift( world_edit_block_array *Array, world_edit *Element ) *Prev = *Element; } +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +{ + if (Container) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + { + PushNewRow(Ui); + IterateOver(Container, Element, ElementIndex) + { + DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushNewRow(Ui); + } + } + PushNewRow(Ui); + } + else + { + PushColumn(Ui, FSz("%S", Name), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushColumn(Ui, CSz("(null)"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + PushNewRow(Ui); + } +} + + + diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index a7f549e51..13c327e97 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1257:0 +// src/engine/editor.h:1258:0 @@ -357,3 +357,5 @@ Shift( world_edit_block_array_index_block_array *Array, world_edit_block_array_i } + + diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 6ae97b1e1..b68719fda 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1268:0 +// src/engine/editor.h:1269:0 @@ -343,3 +343,5 @@ Shift( world_edit_layer_block_array *Array, world_edit_layer *Element ) } + + diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index b36a55b64..656ed6a3e 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1253:0 +// src/engine/editor.h:1254:0 @@ -343,3 +343,5 @@ Shift( world_edit_ptr_block_array *Array, world_edit_ptr Element ) } + + diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 34efb45d6..0305595e5 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1087:0 +// src/engine/editor.h:1088:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 39554444b..1a3267860 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -105,11 +105,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - cs MemberName = CSz("Mode"); + cs MemberName = CSz("ValueModifier"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode*, &Element->Mode), + Cast(world_edit_blend_mode_modifier*, &Element->ValueModifier), MemberName, Params ); @@ -129,11 +129,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - cs MemberName = CSz("Modifier"); + cs MemberName = CSz("ColorMode"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode_modifier*, &Element->Modifier), + Cast(world_edit_color_blend_mode*, &Element->ColorMode), MemberName, Params ); @@ -153,11 +153,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - cs MemberName = CSz("ColorMode"); + cs MemberName = CSz("BlendMode"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_color_blend_mode*, &Element->ColorMode), + Cast(world_edit_blend_mode*, &Element->BlendMode), MemberName, Params ); diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 0b91f0646..7952d8c9a 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:894:0 +// src/engine/editor.h:895:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 9a1f94c52..8ec9b2b24 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1103:0 +// src/engine/editor.h:1104:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index a32009f02..ab347a826 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:900:0 +// src/engine/editor.h:901:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) @@ -20,6 +20,7 @@ RadioButtonGroup_world_edit_blend_mode( renderer_2d *Ui, { { CSz("Additive"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Additive")), WorldEdit_Mode_Additive }, { CSz("Subtractive"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Subtractive")), WorldEdit_Mode_Subtractive }, + { CSz("Threshold"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Threshold")), WorldEdit_Mode_Threshold }, { CSz("Disabled"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Disabled")), WorldEdit_Mode_Disabled }, }; diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 760bad3e3..54cd0eb10 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:883:0 +// src/engine/editor.h:884:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 4f7570dbc..41c139325 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:912:0 +// src/engine/editor.h:913:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 058c7ea10..4fb51d646 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:905:0 +// src/engine/editor.h:906:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index f2f289f5a..29a448633 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:909:0 +// src/engine/editor.h:910:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 3e0d2fa3e..74e0df340 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -297,6 +297,167 @@ +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("Region"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(rect3cp*, &Element->Region), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("Brush"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_edit_brush*, Element->Brush), + MemberName, + Params + ); + + + + + + + + } + + + + + { + + + + cs MemberName = CSz("Tombstone"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Tombstone), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("Selected"); + DoEditorUi(Ui, + Window, + Cast(b8*, &Element->Selected), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + + } + + PushNewRow(Ui); + + + + { + + + + cs MemberName = CSz("Ordinal"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->Ordinal), + MemberName, + Params + ); + + + + + + + + } + + PushNewRow(Ui); + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 0461c00fc..10a23746b 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1224:0 +// src/engine/editor.h:1225:0 struct world_edit_brush_linked_list_node { diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index b7931856a..3412d64a6 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -53,17 +53,17 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings *BaseElement, umm Count = - Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum + Result &= Serialize(Bytes, (u32*)&Element->ValueModifier); // enum - Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum + Result &= Serialize(Bytes, (u32*)&Element->ColorMode); // enum - Result &= Serialize(Bytes, (u32*)&Element->ColorMode); // enum + Result &= Serialize(Bytes, (u32*)&Element->BlendMode); // enum @@ -140,17 +140,17 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren - Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); + Element->ValueModifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); - Element->Modifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); + Element->ColorMode = Cast(world_edit_color_blend_mode, Read_u32(Bytes)); - Element->ColorMode = Cast(world_edit_color_blend_mode, Read_u32(Bytes)); + Element->BlendMode = Cast(world_edit_blend_mode, Read_u32(Bytes)); diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index d99ea205c..019980b72 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1101:0 +// src/engine/editor.h:1102:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 594d85026..951aafc66 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1042:0 +// src/engine/editor.h:1043:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 7aafe259f..4c4f27fc9 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:897:0 +// src/engine/editor.h:898:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) @@ -8,6 +8,7 @@ ToStringPrefixless(world_edit_blend_mode Type) { case WorldEdit_Mode_Additive: { Result = CSz("Additive"); } break; case WorldEdit_Mode_Subtractive: { Result = CSz("Subtractive"); } break; + case WorldEdit_Mode_Threshold: { Result = CSz("Threshold"); } break; case WorldEdit_Mode_Disabled: { Result = CSz("Disabled"); } break; @@ -24,6 +25,7 @@ ToString(world_edit_blend_mode Type) { case WorldEdit_Mode_Additive: { Result = CSz("WorldEdit_Mode_Additive"); } break; case WorldEdit_Mode_Subtractive: { Result = CSz("WorldEdit_Mode_Subtractive"); } break; + case WorldEdit_Mode_Threshold: { Result = CSz("WorldEdit_Mode_Threshold"); } break; case WorldEdit_Mode_Disabled: { Result = CSz("WorldEdit_Mode_Disabled"); } break; @@ -39,6 +41,7 @@ WorldEditBlendMode(counted_string S) if (StringsMatch(S, CSz("WorldEdit_Mode_Additive"))) { return WorldEdit_Mode_Additive; } if (StringsMatch(S, CSz("WorldEdit_Mode_Subtractive"))) { return WorldEdit_Mode_Subtractive; } + if (StringsMatch(S, CSz("WorldEdit_Mode_Threshold"))) { return WorldEdit_Mode_Threshold; } if (StringsMatch(S, CSz("WorldEdit_Mode_Disabled"))) { return WorldEdit_Mode_Disabled; } return Result; diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 9b61970b8..2f3c88267 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:880:0 +// src/engine/editor.h:881:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 45baaf473..d43945934 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:903:0 +// src/engine/editor.h:904:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 6608d55f0..52c7dbdc7 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:889:0 +// src/engine/editor.h:890:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/jesse.make.sh b/jesse.make.sh index 384beb04f..11051035c 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index cc44681bd..f786e3d7e 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -4,7 +4,7 @@ uniform v3 ChunkResolution; // TODO(Jesse): Make this a scalar? uniform int BrushType; uniform int BlendMode; uniform int ColorMode; -uniform int Modifiers; +uniform int ValueModifiers; uniform int GenerateNormals; @@ -83,7 +83,7 @@ void main() // NOTE(Jesse): Set these in the -- user code -- section vec3 ColorValue = TexLookup.rgb; - f32 NoiseValue = TexLookup.a; + f32 CurrentSample = TexLookup.a; f32 x = floor(gl_FragCoord.x); f32 z = floor(gl_FragCoord.y / 66); @@ -108,7 +108,7 @@ void main() { v3 ColorSample = RGBColor; - f32 NoiseSample = 0.f; + f32 ThisSample = 0.f; s32 Octaves = 1; switch (BrushType) @@ -120,12 +120,12 @@ void main() { case 0: // NoiseType_Perlin: { - NoiseSample = value_noise_derivs(NoiseBasis).x; + ThisSample = value_noise_derivs(NoiseBasis).x; } break; case 1: // NoiseType_Voronoi: { - NoiseSample = voronoi_noise(NoiseBasis, Squareness).x; + ThisSample = voronoi_noise(NoiseBasis, Squareness).x; } break; case 2: // NoiseType_White: @@ -141,13 +141,13 @@ void main() switch (ShapeType) { // ShapeType_Rect - case 0: { NoiseSample = 1.f; } break; + case 0: { ThisSample = Power; } break; // ShapeType_Sphere case 1: { f32 Dist = 0.5f+distance(ChunkRelLocation, xyz); - if (Dist < Radius) { NoiseSample = ((Radius-Dist)/Radius)*Power; } + if (Dist < Radius) { ThisSample = ((Radius-Dist)/Radius)*Power; } } break; // ShapeType_Line @@ -158,9 +158,9 @@ void main() v3 Line = normalize(ChunkRelEditMax-ChunkRelEditMin); v3 X = cross(Line, EditRelPosition); f32 Dist = length(X)/length(Line); - /* if (Dist < Radius) { NoiseSample = ((Radius-Dist)/Radius)*Power; } */ - /* if (Dist < Radius) { NoiseSample = Dist*Power; } */ - if (Dist < Radius) { NoiseSample = Power; } + /* if (Dist < Radius) { ThisSample = ((Radius-Dist)/Radius)*Power; } */ + /* if (Dist < Radius) { ThisSample = Dist*Power; } */ + if (Dist < Radius) { ThisSample = Power; } } break; // ShapeType_Cylinder @@ -205,7 +205,7 @@ void main() v3 X = cross(Line, LineRelativeXYZ); f32 Dist = length(X)/length(Line); - if (Dist < Radius) { NoiseSample = Power; } + if (Dist < Radius) { ThisSample = Power; } } break; // ShapeType_Plane @@ -214,7 +214,7 @@ void main() f32 Dist = DistanceToPlane(PlaneNormal, Planed, EditRelPosition); if (abs(Dist) < PlaneRadius*ChunkResolution.x) { - NoiseSample = 1.f; + ThisSample = Power; } } break; @@ -224,7 +224,7 @@ void main() } } break; - default: {ColorValue = V3(1.f, 0.f, 0.f); NoiseValue = 1.f;} break; + default: {ColorValue = V3(1.f, 0.f, 0.f); CurrentSample = 1.f;} break; } // TODO(Jesse): This is buggy; it generates extra geometry on the edges @@ -233,7 +233,7 @@ void main() // visible artifacts. At the moment I just want anything 'working', but // this should definitely be improved in the future. // - if ( (Modifiers & (1<<0)) > 0) // WorldEdit_ValueModifier_Surface + if ( (ValueModifiers & (1<<0)) > 0) // WorldEdit_ValueModifier_Surface { if (x > 0 && x < 65 && y > 0 && y < 65 && @@ -251,9 +251,9 @@ void main() IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 66), 0).a) > 0.f); IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 66), 0).a) > 0.f); - if (IsSurface == 0) { NoiseSample = 0.f; ColorSample = V3(0,0,0); } + if (IsSurface == 0) { ThisSample = 0.f; ColorSample = V3(0,0,0); } } - else // Current NoiseValue is Solid + else // Current CurrentSample is Solid { s32 IsSurface = s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(1, 0), 0).a ) < 0.f); IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(1, 0), 0).a ) < 0.f); @@ -264,63 +264,76 @@ void main() IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 66), 0).a) < 0.f); IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 66), 0).a) < 0.f); - if (IsSurface == 0) { NoiseSample = 0.f; ColorSample = V3(0,0,0); } + if (IsSurface == 0) { ThisSample = 0.f; ColorSample = V3(0,0,0); } } } else { - NoiseSample = 0.f; ColorSample = V3(0,0,0); + ThisSample = 0.f; ColorSample = V3(0,0,0); } } - if ( (Modifiers & (1<<1)) > 0) // WorldEdit_ValueModifier_ClampPos - { - NoiseSample = max(0.f, NoiseSample); - } - if ( (Modifiers & (1<<2)) > 0) // WorldEdit_ValueModifier_ClampNeg - { - NoiseSample = min(0.f, NoiseSample); - } - if ( (Modifiers & (1<<3)) > 0) // WorldEdit_ValueModifier_Threshold + if (Invert) { - if (NoiseSample > Threshold) NoiseValue = NoiseSample; + ThisSample *= -1.f; } - if (abs(NoiseSample) < Threshold) + + if ( (ValueModifiers & (1<<1)) > 0) // WorldEdit_ValueModifier_ClampPos { - NoiseSample = 0.f; + ThisSample = max(0.f, ThisSample); } + if ( (ValueModifiers & (1<<2)) > 0) // WorldEdit_ValueModifier_ClampNeg + { + ThisSample = min(0.f, ThisSample); + } + if ( (ValueModifiers & (1<<3)) > 0) // WorldEdit_ValueModifier_Threshold + { + if (abs(ThisSample) >= Threshold) { ThisSample = Power; } + } - if (Invert) + if (abs(ThisSample) < Threshold) { - NoiseSample *= -1.f; + ThisSample = 0.f; } - NoiseSample *= max(Power, 1.f); + + /* ThisSample *= Power; */ + + // Blend + // switch (BlendMode) { - case 0: // Addative - { NoiseValue = NoiseValue + NoiseSample; } break; + case 0: // WorldEdit_Mode_Additive + { CurrentSample = CurrentSample + ThisSample; } break; + + case 1: // WorldEdit_Mode_Subtractive + { CurrentSample = CurrentSample - ThisSample; } break; - case 1: // Subtractive - { NoiseValue = NoiseValue - NoiseSample; } break; + case 2: // WorldEdit_Mode_Threshold + { if (abs(ThisSample) >= Threshold) { CurrentSample = ThisSample; } } break; + + case 3: // WorldEdit_Mode_Disabled + { CurrentSample = CurrentSample; } break; } + // Blend Color + // switch (ColorMode) { case 0: // ThresholdPositive - { if (NoiseSample > 0.f) { ColorValue = ColorSample; } } break; + { if (ThisSample > 0.f) { ColorValue = ColorSample; } } break; case 1: // ThresholdNegative - { if (NoiseSample < 0.f) { ColorValue = ColorSample; } } break; + { if (ThisSample < 0.f) { ColorValue = ColorSample; } } break; case 2: // Addative { ColorValue = ColorValue + ColorSample; } break; @@ -344,5 +357,5 @@ void main() } Output.rgb = ColorValue; - Output.a = NoiseValue; + Output.a = CurrentSample; } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index c60d0039d..36a64a95a 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -409,11 +409,11 @@ poof(do_editor_ui_for_compound_type(layered_brush)) poof(do_editor_ui_for_compound_type(world_edit_brush)) #include -poof(do_editor_ui_for_compound_type(world_edit)) -#include +/* poof(do_editor_ui_for_compound_type(world_edit)) */ +/* #include */ -poof(do_editor_ui_for_container(world_edit_ptr_block_array)) -#include +/* poof(do_editor_ui_for_container(world_edit_ptr_block_array)) */ +/* #include */ poof(do_editor_ui_for_compound_type(world_edit_block_array_index)) #include @@ -870,24 +870,7 @@ InteractWithThumbnailTexture(engine_resources *Engine, renderer_2d *Ui, window_l link_internal v3 GetHotVoxelForEditMode(engine_resources *Engine, world_edit_blend_mode WorldEditMode) { - picked_voxel_position Pos = PickedVoxel_FirstFilled; - - switch (WorldEditMode) - { - case WorldEdit_Mode_Disabled: {} break; - case WorldEdit_Mode_Additive: - { - Pos = PickedVoxel_LastEmpty; - } break; - - /* case WorldEdit_Mode_Paint: */ - case WorldEdit_Mode_Subtractive: - { - Pos = PickedVoxel_FirstFilled; - } break; - } - - v3 Result = Floor(GetSimSpaceP(Engine->World, &Engine->MousedOverVoxel.Value, Pos)); + v3 Result = Floor(GetSimSpaceP(Engine->World, &Engine->MousedOverVoxel.Value, PickedVoxel_FirstFilled)); return Result; } @@ -1614,14 +1597,16 @@ ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Temp rect3cp QueryRegion = Edit->Region; - // NOTE(Jesse): I would expect to need this, but it appears we don't for - // some reason.. + + // NOTE(Jesse): #if 0 - QueryRegion.Min.Offset -= 1.f; - QueryRegion.Max.Offset += 1.f; + { + QueryRegion.Min.Offset -= 1.f; + QueryRegion.Max.Offset += 1.f; - Canonicalize(World, &QueryRegion.Min); - Canonicalize(World, &QueryRegion.Max); + Canonicalize(World, &QueryRegion.Min); + Canonicalize(World, &QueryRegion.Max); + } #endif GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &QueryRegion, &Nodes); @@ -1654,6 +1639,40 @@ ApplyEditToOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Temp } } +#if BONSAI_INTERNAL +link_internal void +SanityCheckOctreeDoesNotContainEdit_Recursive(world *World, octree_node *Current, world_edit *Edit) +{ + Assert(Current); + + IterateOver(&Current->Edits, TestEdit, EditIndex) + { + Assert(Edit != TestEdit); + } + + switch(Current->Type) + { + InvalidCase(OctreeNodeType_Undefined); + + case OctreeNodeType_Leaf: + { + } break; + + case OctreeNodeType_Branch: + { + SanityCheckOctreeDoesNotContainEdit_Recursive(World, Current->Children[0], Edit); + SanityCheckOctreeDoesNotContainEdit_Recursive(World, Current->Children[1], Edit); + SanityCheckOctreeDoesNotContainEdit_Recursive(World, Current->Children[2], Edit); + SanityCheckOctreeDoesNotContainEdit_Recursive(World, Current->Children[3], Edit); + SanityCheckOctreeDoesNotContainEdit_Recursive(World, Current->Children[4], Edit); + SanityCheckOctreeDoesNotContainEdit_Recursive(World, Current->Children[5], Edit); + SanityCheckOctreeDoesNotContainEdit_Recursive(World, Current->Children[6], Edit); + SanityCheckOctreeDoesNotContainEdit_Recursive(World, Current->Children[7], Edit); + } break; + } +} +#endif + link_internal void DropEditFromOctree(engine_resources *Engine, world_edit *Edit, memory_arena *TempMemory) { @@ -1661,7 +1680,23 @@ DropEditFromOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Tem Assert(Edit->Tombstone == False); octree_node_ptr_block_array Nodes = OctreeNodePtrBlockArray(TempMemory); - GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &Edit->Region, &Nodes); + + rect3cp QueryRegion = Edit->Region; + + + // NOTE(Jesse): +#if 0 + { + QueryRegion.Min.Offset -= 1.f; + QueryRegion.Max.Offset += 1.f; + + Canonicalize(World, &QueryRegion.Min); + Canonicalize(World, &QueryRegion.Max); + } +#endif + + GatherOctreeNodesOverlapping_Recursive(World, &World->Root, &QueryRegion, &Nodes); + IterateOver(&Nodes, Node, NodeIndex) { @@ -1675,6 +1710,10 @@ DropEditFromOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Tem Node->Dirty = True;; ReleaseFutex(&Node->Lock); } + +#if BONSAI_INTERNAL + SanityCheckOctreeDoesNotContainEdit_Recursive(World, &World->Root, Edit); +#endif } link_internal void @@ -2097,6 +2136,7 @@ DoWorldEditor(engine_resources *Engine) if (PrevEditIndex) { world_edit *PrevEdit = GetPtr(&Editor->Edits, *PrevEditIndex); + Assert(Edit != PrevEdit); ReapplyEditToOctree(Engine, Edit, GetTranArena()); ReapplyEditToOctree(Engine, PrevEdit, GetTranArena()); @@ -2124,6 +2164,7 @@ DoWorldEditor(engine_resources *Engine) if (auto NextEditIndex = TryGetPtr(&Layer->EditIndices, NextEditIndexIndex)) { world_edit *NextEdit = GetPtr(&Editor->Edits, *NextEditIndex); + Assert(Edit != NextEdit); ReapplyEditToOctree(Engine, Edit, GetTranArena()); ReapplyEditToOctree(Engine, NextEdit, GetTranArena()); @@ -2354,6 +2395,7 @@ DoWorldEditor(engine_resources *Engine) } + #if BONSAI_INTERNAL // NOTE(Jesse): Sanity check we keep the selected flag in sync with the array IterateOver(&Editor->Edits, Edit, EI) diff --git a/src/engine/editor.h b/src/engine/editor.h index dfa29d78e..2661f90bd 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -789,6 +789,7 @@ enum world_edit_blend_mode { WorldEdit_Mode_Additive, // Adds layer value to noise value WorldEdit_Mode_Subtractive, // Subtracts layer value from noise value + WorldEdit_Mode_Threshold, // Sets CurrentSample = SampleValue WorldEdit_Mode_Disabled, // Useful for turning the layer off }; @@ -1113,9 +1114,9 @@ struct brush_settings // // Common across brush types // - world_edit_blend_mode Mode; - world_edit_blend_mode_modifier Modifier; + world_edit_blend_mode_modifier ValueModifier; world_edit_color_blend_mode ColorMode; + world_edit_blend_mode BlendMode; b8 Invert; s32 Iterations = 1; // NOTE(Jesse): How many times to do the filter. @@ -1224,7 +1225,7 @@ poof(are_equal(world_edit_brush)) poof(hashtable(world_edit_brush)) #include -struct world_edit +struct world_edit poof(@do_editor_ui) { // TODO(Jesse): Rename to Bounds? rect3cp Region = InvertedInfinityRectangle_rect3cp(); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 68f7b1e3e..ec36ef8d8 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -423,11 +423,11 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); } - BindUniformByName(&WorldEditRC->Program, "BrushType", Layer->Settings.Type); - BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.Mode); - BindUniformByName(&WorldEditRC->Program, "Modifiers", Layer->Settings.Modifier); - BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); - BindUniformByName(&WorldEditRC->Program, "Invert", Layer->Settings.Invert); + BindUniformByName(&WorldEditRC->Program, "BrushType", Layer->Settings.Type); + BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.BlendMode); + BindUniformByName(&WorldEditRC->Program, "ValueModifiers", Layer->Settings.ValueModifier); + BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); + BindUniformByName(&WorldEditRC->Program, "Invert", Layer->Settings.Invert); rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); From 3139ea878f9b96482559eb3db7d6cab799ec9c8a Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 11 Jun 2025 15:46:30 -0700 Subject: [PATCH 293/421] Fix color not getting applied when BlendMode is Disabled --- jesse.bonsai.rdbg | Bin 17195 -> 17281 bytes shaders/terrain/world_edit.fragmentshader | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index e3eecc5aade2447806aaa18344316641b8801211..ca0d9335583812e5aa0c8718939a982da1e5a8a2 100644 GIT binary patch delta 256 zcmZ48#@N`-xM7+dqrv2fa+>w2DVZhtMS95v1-9%AV89F{K}=R4u5hf#EanC>0&)`b zQvLFaauaiSfLxcN#BvBvuR;>YcLkfGYZsiFlbT$TnV+ZUo1X$isUSl<^HNePB(SP- zmdeRY&MtdwnXKX@$cQY$JvqhcH~=NJLtp>^ delta 131 zcmZo{XI$OJxM7+dqv>Qvd4tLM>>RxOOblSa2qfX6R!l%qW}pZg5WA*imgE=l0a?MB zxxpEU1*!f;ndzB%AUVJMqTIwBkP&~y%>qDpbEN$eCU&r)jLee_owO&XISGPUdXslK G9R~ngWgeaY diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index f786e3d7e..acc145684 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -235,9 +235,9 @@ void main() // if ( (ValueModifiers & (1<<0)) > 0) // WorldEdit_ValueModifier_Surface { - if (x > 0 && x < 65 && - y > 0 && y < 65 && - z > 0 && z < 65) + if (x > 0 && x <= 64 && + y > 0 && y <= 64 && + z > 0 && z <= 64) { f32 ThisCell = sign(TexLookup.a); if (ThisCell < 0.f) // Current value is Air @@ -321,7 +321,7 @@ void main() { if (abs(ThisSample) >= Threshold) { CurrentSample = ThisSample; } } break; case 3: // WorldEdit_Mode_Disabled - { CurrentSample = CurrentSample; } break; + { CurrentSample = CurrentSample; ThisSample = 0.f; } break; } From 3f0b04a76c46e631c99a54caae913e18d663f4f8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 12 Jun 2025 09:32:47 -0700 Subject: [PATCH 294/421] Juggle some members around and polish edit mode interactions --- external/bonsai_stdlib | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 30 +- .../do_editor_ui_for_compound_type_asset.h | 18 +- .../do_editor_ui_for_compound_type_asset_id.h | 6 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 6 +- ...editor_ui_for_compound_type_bonsai_futex.h | 13 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 22 +- ..._editor_ui_for_compound_type_brush_layer.h | 6 +- ...itor_ui_for_compound_type_brush_settings.h | 114 +++++--- .../do_editor_ui_for_compound_type_camera.h | 62 +++-- ...o_editor_ui_for_compound_type_chunk_data.h | 26 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 6 +- ...tor_ui_for_compound_type_collision_event.h | 14 +- ..._editor_ui_for_compound_type_debug_state.h | 210 +++++++------- ...editor_ui_for_compound_type_engine_debug.h | 110 ++++---- ...or_ui_for_compound_type_engine_resources.h | 102 +++---- ...tor_ui_for_compound_type_engine_settings.h | 4 +- .../do_editor_ui_for_compound_type_entity.h | 65 ++--- ...do_editor_ui_for_compound_type_entity_id.h | 9 +- ...i_for_compound_type_entity_position_info.h | 14 +- ...ui_for_compound_type_file_traversal_node.h | 13 +- .../do_editor_ui_for_compound_type_frustum.h | 30 +- ..._for_compound_type_g_buffer_render_group.h | 29 +- ..._editor_ui_for_compound_type_game_lights.h | 18 +- ...compound_type_gpu_element_buffer_handles.h | 33 +-- ..._compound_type_gpu_mapped_element_buffer.h | 6 +- .../do_editor_ui_for_compound_type_graphics.h | 146 +++++----- ...r_ui_for_compound_type_graphics_settings.h | 18 +- .../do_editor_ui_for_compound_type_input.h | 257 +++++++++--------- ..._editor_ui_for_compound_type_input_event.h | 9 +- .../do_editor_ui_for_compound_type_keyframe.h | 9 +- ...ditor_ui_for_compound_type_layered_brush.h | 100 +------ ...editor_ui_for_compound_type_level_editor.h | 46 ++-- ..._for_compound_type_lighting_render_group.h | 18 +- ...r_ui_for_compound_type_lighting_settings.h | 46 ++-- ..._ui_for_compound_type_lod_element_buffer.h | 14 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 6 +- .../do_editor_ui_for_compound_type_model.h | 22 +- ..._editor_ui_for_compound_type_noise_layer.h | 14 +- ..._editor_ui_for_compound_type_octree_node.h | 38 +-- .../do_editor_ui_for_compound_type_particle.h | 21 +- ...tor_ui_for_compound_type_particle_system.h | 90 +++--- ...ui_for_compound_type_perlin_noise_params.h | 48 ---- .../do_editor_ui_for_compound_type_physics.h | 21 +- .../do_editor_ui_for_compound_type_plane.h | 12 +- .../do_editor_ui_for_compound_type_platform.h | 66 ++--- ...ditor_ui_for_compound_type_random_series.h | 4 +- .../do_editor_ui_for_compound_type_ray.h | 6 +- .../do_editor_ui_for_compound_type_rect3.h | 6 +- .../do_editor_ui_for_compound_type_rect3cp.h | 6 +- .../do_editor_ui_for_compound_type_rect3i.h | 6 +- ...r_ui_for_compound_type_render_buffers_2d.h | 30 +- ...editor_ui_for_compound_type_render_debug.h | 17 +- ...tor_ui_for_compound_type_render_settings.h | 82 +++--- ..._editor_ui_for_compound_type_renderer_2d.h | 102 +++---- .../do_editor_ui_for_compound_type_shader.h | 29 +- ..._editor_ui_for_compound_type_shape_layer.h | 69 +---- ...struct_terrain_decoration_render_context.h | 30 +- ...e_struct_terrain_finalize_render_context.h | 21 +- ...pe_struct_terrain_shaping_render_context.h | 26 +- ...or_compound_type_struct_world_edit_brush.h | 14 +- ...nd_type_struct_world_edit_render_context.h | 33 +-- .../do_editor_ui_for_compound_type_texture.h | 33 +-- .../do_editor_ui_for_compound_type_ui_debug.h | 29 +- .../do_editor_ui_for_compound_type_ui_id.h | 17 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 9 +- ...pound_type_untextured_3d_geometry_buffer.h | 41 +-- ...tor_ui_for_compound_type_vertex_material.h | 13 +- ...i_for_compound_type_voronoi_noise_params.h | 59 +--- .../do_editor_ui_for_compound_type_vox_data.h | 4 +- .../do_editor_ui_for_compound_type_voxel.h | 9 +- ...itor_ui_for_compound_type_voxel_lighting.h | 4 +- ..._ui_for_compound_type_white_noise_params.h | 27 +- ...o_editor_ui_for_compound_type_work_queue.h | 14 +- ...or_ui_for_compound_type_work_queue_entry.h | 6 +- .../do_editor_ui_for_compound_type_world.h | 42 +-- ..._editor_ui_for_compound_type_world_chunk.h | 54 ++-- ...mpound_type_world_edit_block_array_index.h | 4 +- ...pe_world_update_op_shape_params_cylinder.h | 9 +- ..._type_world_update_op_shape_params_plane.h | 9 +- ...d_type_world_update_op_shape_params_rect.h | 4 +- ...type_world_update_op_shape_params_sphere.h | 9 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 35 +-- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 50 +--- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- generated/for_datatypes_Bxw4Q7AW.h | 47 ++-- generated/hashtable_world_edit_brush.h | 2 +- generated/serdes_struct_brush_settings.h | 45 +++ generated/serdes_struct_layered_brush.h | 52 ---- generated/serdes_struct_perlin_noise_params.h | 21 +- generated/serdes_struct_shape_layer.h | 30 -- .../serdes_struct_voronoi_noise_params.h | 32 +-- generated/serdes_struct_white_noise_params.h | 19 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 11 +- ...value_tables_world_edit_color_blend_mode.h | 32 +-- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- shaders/terrain/world_edit.fragmentshader | 102 ++++--- src/engine/editor.cpp | 16 +- src/engine/editor.h | 63 +++-- src/engine/render_loop.cpp | 9 +- 114 files changed, 1589 insertions(+), 1855 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 61aeb19ee..cf482ba3a 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 61aeb19eefffee2c58217e93bb42122d86675271 +Subproject commit cf482ba3aa1544fde59cda50e78e32dddcb52708 diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 93963bb47..db3644a3e 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:867:0 +// src/engine/editor.h:866:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 12de6b821..e2d28f135 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1135:0 +// src/engine/editor.h:1138:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 4662ede1e..8b8833096 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1222:0 +// src/engine/editor.h:1225:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 13c327e97..0ceaa496c 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1258:0 +// src/engine/editor.h:1261:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index b68719fda..686f5a1ae 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1269:0 +// src/engine/editor.h:1272:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 656ed6a3e..b267775d1 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1254:0 +// src/engine/editor.h:1257:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 0305595e5..af8c4e433 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1088:0 +// src/engine/editor.h:1081:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 09d7d82a8..967c9b615 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,10 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -98,10 +98,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -123,9 +123,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - } - + + } { @@ -147,10 +147,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -172,9 +172,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - } - + + } { @@ -196,10 +196,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -221,6 +221,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 1d88a59d1..106b1c169 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r - } - + + } { @@ -96,10 +96,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -121,9 +121,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r - } - + + } { @@ -132,6 +132,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r cs MemberName = CSz("(anonymous)"); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index ecd36e69c..b5d3f3c6a 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,6 +73,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 38b9cda18..90079a4e5 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs - } - + + } { @@ -72,6 +72,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 75241371c..5afdbb653 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,10 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -95,9 +95,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 45f556533..1648a79bb 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na - } - + + } { @@ -120,9 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na - } - + + } { @@ -144,9 +144,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na - } - + + } { @@ -168,6 +168,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 54a1dbb99..d1efbf8c5 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name - } - + + } { @@ -59,6 +59,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name cs MemberName = CSz("PrevSettings"); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 1a3267860..ec96ec77f 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - } - + + } if (Element->Type == BrushLayerType_Noise) { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - } - + + } if (Element->Type == BrushLayerType_Shape) { @@ -96,23 +96,23 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - } - + + } { - cs MemberName = CSz("ValueModifier"); + cs MemberName = CSz("Power"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode_modifier*, &Element->ValueModifier), + Cast(f32*, &Element->Power), MemberName, Params - ); + , 0.f, 25.f ); @@ -120,23 +120,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - } - + PushNewRow(Ui); + + } { - cs MemberName = CSz("ColorMode"); + cs MemberName = CSz("ValueBias"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_color_blend_mode*, &Element->ColorMode), + Cast(r32*, &Element->ValueBias), MemberName, Params - ); + , -1.f, 1.f ); @@ -144,23 +145,24 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - } - - + PushNewRow(Ui); + + } + if (Element->ValueModifier&WorldEdit_ValueModifier_Threshold || Element->BlendMode&WorldEdit_Mode_Threshold) { - cs MemberName = CSz("BlendMode"); + cs MemberName = CSz("Threshold"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode*, &Element->BlendMode), + Cast(f32*, &Element->Threshold), MemberName, Params - ); + , 0.f, 1.f ); @@ -168,20 +170,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - } - + PushNewRow(Ui); + + } { - cs MemberName = CSz("Invert"); + cs MemberName = CSz("ValueModifier"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->Invert), + Cast(world_edit_blend_mode_modifier*, &Element->ValueModifier), MemberName, Params ); @@ -192,21 +195,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - } - - PushNewRow(Ui); + + } { - cs MemberName = CSz("Iterations"); + cs MemberName = CSz("ColorMode"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(s32*, &Element->Iterations), + Cast(world_edit_color_blend_mode*, &Element->ColorMode), MemberName, Params ); @@ -217,21 +219,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - } - - PushNewRow(Ui); + + } { - cs MemberName = CSz("Offset"); + cs MemberName = CSz("BlendMode"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(rect3i*, &Element->Offset), + Cast(world_edit_blend_mode*, &Element->BlendMode), MemberName, Params ); @@ -242,20 +243,20 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - } - + + } { - cs MemberName = CSz("NoiseBasisOffset"); + cs MemberName = CSz("Invert"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->NoiseBasisOffset), + Cast(b8*, &Element->Invert), MemberName, Params ); @@ -266,9 +267,44 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + + PushNewRow(Ui); + } + + + { + + + + cs MemberName = CSz("Iterations"); + + + PushNewRow(Ui); + } + + { + + + + cs MemberName = CSz("Offset"); + + + + } + + + { + + + + cs MemberName = CSz("NoiseBasisOffset"); + + + + } { @@ -281,6 +317,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 111ee9cb1..da28ea3ec 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - + + } { @@ -120,10 +120,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -145,10 +145,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -170,10 +170,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -195,10 +195,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -220,10 +220,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -245,10 +245,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -270,10 +270,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -295,10 +295,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -320,10 +320,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -345,9 +345,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - + + } { @@ -369,9 +369,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - + + } { @@ -393,9 +393,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ - } - + + } { @@ -417,6 +417,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index ca856d25c..157552b8a 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, - } - + + } { @@ -96,10 +96,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -121,10 +121,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -146,10 +146,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -171,9 +171,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, - } - + + } { @@ -195,6 +195,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 429a38292..d427eacb6 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs - } - + + } { @@ -72,6 +72,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index f40c6e9bb..15a0fb708 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,10 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -98,9 +98,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs - } - + + } { @@ -122,6 +122,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 4bb27d4da..1634f08db 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -45,10 +45,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -70,10 +70,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -95,10 +95,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -117,10 +117,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -142,10 +142,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -167,10 +167,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -192,10 +192,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -204,9 +204,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("FrameEnd"); - } - + + } { @@ -215,9 +215,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("FrameBegin"); - } - + + } { @@ -226,9 +226,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("RegisterArena"); - } - + + } { @@ -237,9 +237,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("UnregisterArena"); - } - + + } { @@ -248,9 +248,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("WorkerThreadAdvanceDebugSystem"); - } - + + } { @@ -259,9 +259,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("MainThreadAdvanceDebugSystem"); - } - + + } { @@ -270,9 +270,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("MutexWait"); - } - + + } { @@ -281,9 +281,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("MutexAquired"); - } - + + } { @@ -292,9 +292,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("MutexReleased"); - } - + + } { @@ -303,9 +303,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("GetProfileScope"); - } - + + } { @@ -314,9 +314,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("Debug_Allocate"); - } - + + } { @@ -325,9 +325,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("RegisterThread"); - } - + + } { @@ -336,9 +336,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("WriteMemoryRecord"); - } - + + } { @@ -347,9 +347,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("ClearMemoryRecordsFor"); - } - + + } { @@ -358,9 +358,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("TrackDrawCall"); - } - + + } { @@ -369,9 +369,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("GetThreadLocalState"); - } - + + } { @@ -380,9 +380,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("DebugValue_r32"); - } - + + } { @@ -391,9 +391,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("DebugValue_u32"); - } - + + } { @@ -402,9 +402,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("DebugValue_u64"); - } - + + } { @@ -413,9 +413,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("DumpScopeTreeDataToConsole"); - } - + + } { @@ -424,9 +424,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("OpenAndInitializeDebugWindow"); - } - + + } { @@ -435,9 +435,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("ProcessInputAndRedrawWindow"); - } - + + } { @@ -446,9 +446,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz(""); - } - + + } { @@ -457,9 +457,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz(""); - } - + + } { @@ -468,9 +468,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz(""); - } - + + } { @@ -479,9 +479,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("GetReadScopeTree"); - } - + + } { @@ -490,9 +490,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("GetWriteScopeTree"); - } - + + } { @@ -514,9 +514,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -538,9 +538,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -562,9 +562,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -586,9 +586,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -610,9 +610,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -634,9 +634,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -658,9 +658,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -679,10 +679,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -704,9 +704,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -728,9 +728,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -752,9 +752,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -776,9 +776,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -800,10 +800,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -825,10 +825,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -854,9 +854,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -878,10 +878,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -903,10 +903,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -932,9 +932,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - } - + + } { @@ -960,6 +960,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 894cc0162..141f2982e 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - + + } { @@ -120,9 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - + + } { @@ -144,9 +144,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - + + } { @@ -168,9 +168,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - + + } { @@ -192,10 +192,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -217,10 +217,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -242,10 +242,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -267,10 +267,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -292,10 +292,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -317,10 +317,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -342,10 +342,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -367,10 +367,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -392,10 +392,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -417,10 +417,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -442,10 +442,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -467,10 +467,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -492,10 +492,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -517,10 +517,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -542,10 +542,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -567,9 +567,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - + + } { @@ -591,9 +591,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - + + } { @@ -615,9 +615,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - + + } { @@ -639,10 +639,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -664,9 +664,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - + + } { @@ -688,10 +688,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -713,6 +713,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 88b2eda48..52b3b3704 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -120,9 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -144,9 +144,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -168,9 +168,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -192,9 +192,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -216,9 +216,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -240,9 +240,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -264,9 +264,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -288,9 +288,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -312,9 +312,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -336,9 +336,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -360,9 +360,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -384,9 +384,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -408,9 +408,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -432,10 +432,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -457,9 +457,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -481,9 +481,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -505,9 +505,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -529,9 +529,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -553,9 +553,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -577,9 +577,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -601,9 +601,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -625,9 +625,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - } - + + } { @@ -649,6 +649,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index cc3fb9b0d..d2038ba71 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs - } - + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 360581d92..5235d1475 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - + + } { @@ -63,9 +63,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - + + } { @@ -87,9 +87,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - + + } { @@ -111,10 +111,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -136,9 +136,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - + + } { @@ -160,9 +160,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - + + } { @@ -184,9 +184,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - + + } { @@ -208,10 +208,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -233,9 +233,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - + + } { @@ -257,9 +257,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - + + } { @@ -281,9 +281,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - + + } { @@ -305,9 +305,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - + + } { @@ -329,9 +329,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - + + } { @@ -353,9 +353,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - + + } { @@ -370,10 +370,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -388,9 +388,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index a1c4f8b0a..b1ea05e28 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,9 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 20b0a5e47..74873428d 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element - } - + + } { @@ -96,10 +96,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -121,6 +121,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 3c02d2e6d..8027ffa5a 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, - } - + + } { @@ -72,10 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -97,9 +97,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 57751772a..372e9ccfb 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,10 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -98,10 +98,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -123,10 +123,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -148,9 +148,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - } - + + } { @@ -172,9 +172,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - } - + + } { @@ -196,9 +196,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui - } - + + } { @@ -220,6 +220,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index a89f55f74..b21532e4b 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - } - + + } { @@ -120,9 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - } - + + } { @@ -144,9 +144,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - } - + + } { @@ -168,9 +168,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - } - + + } { @@ -192,9 +192,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 90f1d9fad..e2b6a2f93 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name - } - + + } { @@ -96,10 +96,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -121,10 +121,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -146,6 +146,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index fc78501f0..9d96d71bf 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,10 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -98,10 +98,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -123,10 +123,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -148,9 +148,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - } - + + } { @@ -172,10 +172,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -197,10 +197,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -222,9 +222,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index ec8cb5ec4..e7d47e9f3 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El - } - + + } { @@ -72,6 +72,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 0e60c9461..428c06566 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -45,10 +45,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -67,10 +67,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -92,9 +92,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -116,9 +116,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -140,9 +140,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -164,9 +164,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -188,10 +188,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -213,9 +213,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -237,9 +237,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -261,9 +261,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -285,9 +285,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -296,9 +296,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u cs MemberName = CSz("Camera"); - } - + + } { @@ -320,10 +320,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -345,9 +345,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -369,9 +369,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -393,9 +393,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -417,9 +417,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -441,9 +441,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -465,9 +465,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -489,9 +489,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -500,9 +500,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u cs MemberName = CSz("ColorPalette"); - } - + + } { @@ -524,9 +524,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -548,9 +548,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -572,9 +572,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -596,9 +596,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -620,9 +620,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -644,9 +644,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -668,9 +668,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -692,9 +692,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -716,9 +716,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -740,9 +740,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -764,10 +764,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -789,9 +789,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -817,9 +817,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -841,10 +841,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -866,9 +866,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - + + } { @@ -890,6 +890,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 816fa6f72..4f8cf4e01 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c - } - + + } { @@ -120,9 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c - } - + + } { @@ -144,6 +144,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index bad6df924..afc591f01 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -120,9 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -144,9 +144,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -168,9 +168,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -192,9 +192,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -216,9 +216,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -240,9 +240,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -264,9 +264,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -288,9 +288,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -312,9 +312,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -336,9 +336,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -360,9 +360,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -384,9 +384,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -408,9 +408,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -432,9 +432,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -456,9 +456,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -480,9 +480,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -504,9 +504,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -528,9 +528,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -552,9 +552,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -576,9 +576,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -600,9 +600,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -624,9 +624,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -648,9 +648,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -672,9 +672,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -696,9 +696,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -720,9 +720,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -744,9 +744,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -768,9 +768,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -792,9 +792,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -816,9 +816,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -840,9 +840,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -864,9 +864,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -888,9 +888,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -912,9 +912,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -936,9 +936,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -960,9 +960,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -984,9 +984,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1008,9 +1008,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1032,9 +1032,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1056,9 +1056,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1080,9 +1080,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1104,9 +1104,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1128,9 +1128,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1152,9 +1152,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1176,9 +1176,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1200,9 +1200,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1224,9 +1224,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1248,9 +1248,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1272,9 +1272,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1296,9 +1296,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1320,9 +1320,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1344,9 +1344,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1368,9 +1368,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1392,9 +1392,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1416,9 +1416,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1440,9 +1440,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1464,9 +1464,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1488,9 +1488,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1512,9 +1512,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1536,9 +1536,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - + + } { @@ -1560,9 +1560,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 19dca87c7..6ce8603a5 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -45,10 +45,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -67,9 +67,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 0644fac38..6452074e7 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,9 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index c80fcba46..2a3fbf110 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -77,104 +77,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - } - - - - - { - - - - cs MemberName = CSz("SeedBrushWithSelection"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->SeedBrushWithSelection), - MemberName, - Params - ); - - - - - - - - } - - PushNewRow(Ui); - - - - { - - - - cs MemberName = CSz("BrushFollowsCursor"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->BrushFollowsCursor), - MemberName, - Params - ); - - - - - - - } - - PushNewRow(Ui); - - - - { - - - - cs MemberName = CSz("Mode"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode*, &Element->Mode), - MemberName, - Params - ); - - - - - - - - } - - - - - { - - - cs MemberName = CSz("Modifier"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode_modifier*, &Element->Modifier), - MemberName, - Params - ); - - - - - - - } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index c00d15f6c..8d895dad4 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - + + } { @@ -120,10 +120,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -145,9 +145,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - + + } { @@ -169,9 +169,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - + + } { @@ -193,9 +193,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - + + } { @@ -217,9 +217,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - + + } { @@ -241,9 +241,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - + + } { @@ -265,9 +265,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - + + } { @@ -289,9 +289,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam - } - + + } { @@ -313,6 +313,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index a0b82af53..45df51428 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen - } - + + } { @@ -120,9 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen - } - + + } { @@ -144,6 +144,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 41d817398..08087a954 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,10 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -85,9 +85,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c cs MemberName = CSz("SunP"); - } - + + } { @@ -109,10 +109,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -134,9 +134,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - } - + + } { @@ -158,10 +158,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -183,9 +183,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - } - + + } { @@ -207,10 +207,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -232,9 +232,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - } - + + } { @@ -256,10 +256,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -281,9 +281,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - } - + + } { @@ -305,6 +305,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 35db61395..496a94d59 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -77,9 +77,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, - } - + + } { @@ -105,9 +105,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, - } - + + } { @@ -133,6 +133,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index 4efaf9f5c..84be1409c 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, - } - + + } { @@ -72,6 +72,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index e1f31530c..ca7e74cfe 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r - } - + + } { @@ -120,9 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r - } - + + } { @@ -144,9 +144,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r - } - + + } { @@ -168,6 +168,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index a78bda01b..6e2d405ba 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name - } - + + } if (Element->Type == NoiseType_White) { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name - } - + + } if (Element->Type == NoiseType_Perlin) { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name - } - + + } if (Element->Type == NoiseType_Voronoi) { @@ -120,6 +120,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index ffb67a040..24d9b891c 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - } - + + } { @@ -69,10 +69,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -91,10 +91,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -116,9 +116,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - } - + + } { @@ -140,9 +140,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - } - + + } { @@ -164,9 +164,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - } - + + } { @@ -192,9 +192,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - } - + + } { @@ -216,9 +216,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - } - + + } { @@ -240,9 +240,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - } - + + } { @@ -264,6 +264,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 790a16154..04e7c8b26 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u - } - + + } { @@ -96,10 +96,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -121,10 +121,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -146,9 +146,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index cd016b74a..efe899a26 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - + + } { @@ -96,10 +96,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -121,10 +121,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -146,10 +146,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -171,10 +171,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -196,10 +196,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -221,10 +221,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -246,10 +246,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -271,10 +271,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -296,10 +296,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -321,10 +321,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -346,10 +346,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -371,10 +371,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -396,9 +396,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - + + } { @@ -420,10 +420,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -445,9 +445,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - + + } { @@ -469,9 +469,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - + + } { @@ -493,9 +493,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - + + } { @@ -517,10 +517,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -542,10 +542,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -571,10 +571,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -600,6 +600,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 8816c45a4..93160e6cb 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -29,31 +29,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - { - - - - cs MemberName = CSz("Threshold"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Threshold), - MemberName, - Params - , 0.f, 1.f ); - - - - - - - - } - - PushNewRow(Ui); - - - { @@ -73,33 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, - } - - - - { - - - cs MemberName = CSz("Amplitude"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Amplitude), - MemberName, - Params - , 0.1f, 20.f ); - - - - - - - } - PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index f988e061f..a50f1e685 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui - } - + + } { @@ -120,10 +120,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -145,9 +145,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 7d952bf79..3a6087c77 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r - } - + + } { @@ -96,10 +96,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r - } - PushNewRow(Ui); + PushNewRow(Ui); + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index a97ac8bda..f9ae6ba87 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -120,9 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -144,10 +144,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -169,9 +169,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -193,9 +193,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -217,9 +217,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -241,9 +241,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -265,9 +265,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -289,9 +289,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -313,9 +313,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -337,10 +337,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -362,10 +362,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -387,9 +387,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -411,9 +411,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - + + } { @@ -435,6 +435,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index e20b14559..ec57edbc6 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Na - } - PushNewRow(Ui); + PushNewRow(Ui); + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index b28e2e794..9a5d79e47 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren - } - + + } { @@ -72,6 +72,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index a12f7bbbf..27f2aed8e 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r - } - + + } { @@ -72,6 +72,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index 0324c8ecb..6c3c49573 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui - } - + + } { @@ -72,6 +72,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index a22084b3e..79f706848 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ - } - + + } { @@ -72,6 +72,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index d36287588..0a6b42ab5 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,10 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -98,10 +98,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -123,9 +123,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - } - + + } { @@ -147,10 +147,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -172,9 +172,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - } - + + } { @@ -196,9 +196,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - } - + + } { @@ -220,6 +220,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index c25ab0eb1..d473d39ec 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,10 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -98,10 +98,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -123,9 +123,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index de809f8fd..c4460340f 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -45,10 +45,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -67,10 +67,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -89,10 +89,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -111,10 +111,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -133,10 +133,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -155,10 +155,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -177,10 +177,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -202,10 +202,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -224,10 +224,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -249,10 +249,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -261,9 +261,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs cs MemberName = CSz("Ignored"); - } - + + } { @@ -272,10 +272,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs cs MemberName = CSz("Headless"); - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -297,9 +297,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - + + } { @@ -321,10 +321,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -346,9 +346,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - + + } { @@ -370,9 +370,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - + + } { @@ -394,9 +394,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - + + } { @@ -418,9 +418,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - + + } { @@ -442,9 +442,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - + + } { @@ -466,9 +466,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs - } - + + } { @@ -490,6 +490,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index cf5e1596f..13a166eb1 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -96,10 +96,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -121,9 +121,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -145,9 +145,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -169,9 +169,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -193,9 +193,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -217,9 +217,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -241,9 +241,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -269,9 +269,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -293,9 +293,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -317,9 +317,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -341,9 +341,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -365,9 +365,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -386,10 +386,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -411,9 +411,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -435,9 +435,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -459,9 +459,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -483,9 +483,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -507,9 +507,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -531,9 +531,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -555,9 +555,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -583,9 +583,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - + + } { @@ -607,10 +607,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -632,10 +632,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -657,6 +657,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 8326d3420..7263b19bf 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,9 +73,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - } - + + } { @@ -97,10 +97,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -122,10 +122,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -147,10 +147,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -172,10 +172,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -194,9 +194,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 13610fcce..a8a6ee95a 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name - } - + + } if (Element->Type == ShapeType_Rect) { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name - } - + + } if (Element->Type == ShapeType_Sphere) { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name - } - + + } if (Element->Type == ShapeType_Line) { @@ -120,9 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name - } - + + } if (Element->Type == ShapeType_Cylinder) { @@ -144,9 +144,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name - } - + + } if (Element->Type == ShapeType_Plane) { @@ -168,58 +168,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name - } - - - - { - - - cs MemberName = CSz("Threshold"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->Threshold), - MemberName, - Params - , 0.f, 1.f ); - - - - - - - - } - - PushNewRow(Ui); - - - - { - - - - cs MemberName = CSz("Power"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->Power), - MemberName, - Params - , 0.f, 25.f ); - - - - - - - } - - PushNewRow(Ui); if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 75200353d..1e7caf82d 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con - } - + + } { @@ -76,9 +76,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con - } - + + } { @@ -100,9 +100,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con - } - + + } { @@ -124,9 +124,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con - } - + + } { @@ -148,9 +148,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con - } - + + } { @@ -172,9 +172,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con - } - + + } { @@ -196,9 +196,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con - } - + + } { @@ -220,6 +220,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index bc7377298..fe786e9dc 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte - } - + + } { @@ -76,9 +76,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte - } - + + } { @@ -100,9 +100,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte - } - + + } { @@ -124,9 +124,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte - } - + + } { @@ -148,9 +148,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 23fd98c1d..ed09e2094 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex - } - + + } { @@ -76,9 +76,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex - } - + + } { @@ -100,9 +100,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex - } - + + } { @@ -124,9 +124,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex - } - + + } { @@ -148,9 +148,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex - } - + + } { @@ -172,9 +172,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex - } - + + } { @@ -196,6 +196,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index be34d7601..bb376e4d7 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -38,10 +38,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs DoEditorUi(Ui, Window, &Value, MemberName, Params); - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -63,9 +63,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs - } - + + } { @@ -87,9 +87,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs - } - + + } { @@ -111,6 +111,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 7c5a41007..046a0f8b3 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El - } - + + } { @@ -76,9 +76,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El - } - + + } { @@ -104,9 +104,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El - } - + + } { @@ -132,9 +132,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El - } - + + } { @@ -156,9 +156,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El - } - + + } { @@ -180,9 +180,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El - } - + + } { @@ -204,9 +204,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El - } - + + } { @@ -228,9 +228,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index c05cee437..2b93e924b 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,9 +73,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - } - + + } { @@ -97,10 +97,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -122,10 +122,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -144,10 +144,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -169,9 +169,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - } - + + } { @@ -193,10 +193,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -215,9 +215,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index be635e586..ee918eb98 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,10 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -98,10 +98,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -123,10 +123,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -148,10 +148,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -173,10 +173,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -198,9 +198,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index eb638a7cd..334e4a603 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,10 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -98,10 +98,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -123,9 +123,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index b43d35c09..cc639fb27 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, - } - + + } { @@ -69,9 +69,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index dbdecd1b5..cebcfb61f 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - } - + + } { @@ -59,10 +59,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer cs MemberName = CSz("Next"); - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -84,10 +84,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -109,10 +109,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -134,9 +134,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - } - + + } { @@ -158,10 +158,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -183,10 +183,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -208,9 +208,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - } - + + } { @@ -232,10 +232,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -257,9 +257,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 21848a710..57b82cf40 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,10 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -98,9 +98,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 2951084ce..91048a5e5 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -29,31 +29,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - { - - - - cs MemberName = CSz("Threshold"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Threshold), - MemberName, - Params - , 0.f, 1.f ); - - - - - - - - } - - PushNewRow(Ui); - - - { @@ -73,34 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element - } - - - - { - - - cs MemberName = CSz("Amplitude"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Amplitude), - MemberName, - Params - , 0.1f, 20.f ); - - - - - - - } - - PushNewRow(Ui); - { @@ -122,10 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -147,9 +97,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index f6d0480e4..d17e81221 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u - } - + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 0e2deba04..b00cc629d 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -73,9 +73,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index aec10a731..eeeb2ed34 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs N - } - PushNewRow(Ui); + PushNewRow(Ui); + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 6ac02417f..b9f645e03 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -27,32 +27,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, if (Name.Count) { PushTableStart(Ui); } if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - - - { - - - - cs MemberName = CSz("Threshold"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Threshold), - MemberName, - Params - ); - - - - - - - - } - - PushNewRow(Ui); - - + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 916111016..e1776f3c5 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, - } - + + } { @@ -72,10 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -97,10 +97,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -122,6 +122,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 0a1825c0a..fe7a2534b 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs - } - + + } { @@ -59,6 +59,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs cs MemberName = CSz("(anonymous)"); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index de1a75560..5eda2afb4 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - } - + + } { @@ -120,9 +120,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - } - + + } { @@ -144,9 +144,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - } - + + } { @@ -168,9 +168,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - } - + + } { @@ -179,9 +179,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r cs MemberName = CSz("ChunkFreelistFutex"); - } - + + } { @@ -190,9 +190,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r cs MemberName = CSz("ChunkFreelistSentinal"); - } - + + } { @@ -214,10 +214,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -226,9 +226,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r cs MemberName = CSz("ChunkDim"); - } - + + } { @@ -237,6 +237,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r cs MemberName = CSz("ChunkMemory"); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index cb1bad022..0310e66e6 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - + + } { @@ -72,9 +72,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - + + } { @@ -96,9 +96,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - + + } { @@ -120,10 +120,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -145,10 +145,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -170,10 +170,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -195,9 +195,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - + + } { @@ -219,9 +219,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - + + } { @@ -243,9 +243,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - + + } { @@ -267,9 +267,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - + + } { @@ -291,9 +291,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - + + } { @@ -315,9 +315,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - + + } { @@ -339,10 +339,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -364,6 +364,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index 85b7a733f..58ebbedb4 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -48,10 +48,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index - } - PushNewRow(Ui); + PushNewRow(Ui); + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 971dff3fd..0dd84c528 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - } - + + } { @@ -72,9 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h index d06c7024c..6067126b1 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - } - + + } { @@ -72,9 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 5a375e9fc..9248ec98e 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - } - + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 0a8389b7d..ed4d9a420 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -48,9 +48,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - } - + + } { @@ -72,9 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 7952d8c9a..80a8bee4e 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:895:0 +// src/engine/editor.h:891:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 8ec9b2b24..043590ebb 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1104:0 +// src/engine/editor.h:1097:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index ab347a826..695070adc 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:901:0 +// src/engine/editor.h:897:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 54cd0eb10..218b9b1eb 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:884:0 +// src/engine/editor.h:880:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) @@ -11,44 +11,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifie { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Default"), UiId(Window, "enum WorldEdit_Modifier_Default", Element), Params)) + if (Button(Ui, CSz("None"), UiId(Window, "enum WorldEdit_Modifier_None", Element), Params)) { - if (WorldEdit_Modifier_Default == world_edit_blend_mode_modifier(0)) + if (WorldEdit_Modifier_None == world_edit_blend_mode_modifier(0)) { *Element = world_edit_blend_mode_modifier(0); } else { - if ((*Element & WorldEdit_Modifier_Default) == WorldEdit_Modifier_Default) + if ((*Element & WorldEdit_Modifier_None) == WorldEdit_Modifier_None) { - *Element = world_edit_blend_mode_modifier(*Element&~WorldEdit_Modifier_Default); + *Element = world_edit_blend_mode_modifier(*Element&~WorldEdit_Modifier_None); } else { - *Element = world_edit_blend_mode_modifier(*Element|WorldEdit_Modifier_Default); - } - } - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Surface"), UiId(Window, "enum WorldEdit_ValueModifier_Surface", Element), Params)) - { - if (WorldEdit_ValueModifier_Surface == world_edit_blend_mode_modifier(0)) - { - *Element = world_edit_blend_mode_modifier(0); - } - else - { - if ((*Element & WorldEdit_ValueModifier_Surface) == WorldEdit_ValueModifier_Surface) - { - *Element = world_edit_blend_mode_modifier(*Element&~WorldEdit_ValueModifier_Surface); - } - else - { - *Element = world_edit_blend_mode_modifier(*Element|WorldEdit_ValueModifier_Surface); + *Element = world_edit_blend_mode_modifier(*Element|WorldEdit_Modifier_None); } } diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 41c139325..0d67e95dc 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:913:0 +// src/engine/editor.h:909:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 4fb51d646..26fa270c3 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:906:0 +// src/engine/editor.h:902:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) @@ -11,63 +11,27 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode * { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("ThresholdPositive"), UiId(Window, "enum WorldEdit_ColorBlendMode_ThresholdPositive", Element), Params)) + if (Button(Ui, CSz("ValuePositive"), UiId(Window, "enum WorldEdit_ColorBlendMode_ValuePositive", Element), Params)) { - *Element = WorldEdit_ColorBlendMode_ThresholdPositive; + *Element = WorldEdit_ColorBlendMode_ValuePositive; SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("ThresholdNegative"), UiId(Window, "enum WorldEdit_ColorBlendMode_ThresholdNegative", Element), Params)) + if (Button(Ui, CSz("ValueNegative"), UiId(Window, "enum WorldEdit_ColorBlendMode_ValueNegative", Element), Params)) { - *Element = WorldEdit_ColorBlendMode_ThresholdNegative; + *Element = WorldEdit_ColorBlendMode_ValueNegative; SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Additive"), UiId(Window, "enum WorldEdit_ColorBlendMode_Additive", Element), Params)) + if (Button(Ui, CSz("Surface"), UiId(Window, "enum WorldEdit_ColorBlendMode_Surface", Element), Params)) { - *Element = WorldEdit_ColorBlendMode_Additive; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Subtractive"), UiId(Window, "enum WorldEdit_ColorBlendMode_Subtractive", Element), Params)) - { - *Element = WorldEdit_ColorBlendMode_Subtractive; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Multiply"), UiId(Window, "enum WorldEdit_ColorBlendMode_Multiply", Element), Params)) - { - *Element = WorldEdit_ColorBlendMode_Multiply; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Divide"), UiId(Window, "enum WorldEdit_ColorBlendMode_Divide", Element), Params)) - { - *Element = WorldEdit_ColorBlendMode_Divide; - - - SetToggleButton(Ui, ToggleButtonId, False); - } - PushNewRow(Ui); - if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Average"), UiId(Window, "enum WorldEdit_ColorBlendMode_Average", Element), Params)) - { - *Element = WorldEdit_ColorBlendMode_Average; + *Element = WorldEdit_ColorBlendMode_Surface; SetToggleButton(Ui, ToggleButtonId, False); diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 29a448633..8877c4cf4 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:910:0 +// src/engine/editor.h:906:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 74e0df340..4a1716e2d 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -345,9 +345,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, - } - + + } { @@ -369,9 +369,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, - } - + + } { @@ -390,10 +390,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -412,10 +412,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -437,9 +437,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, - } - PushNewRow(Ui); + PushNewRow(Ui); + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } @@ -567,10 +568,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -592,9 +593,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - } - + + } { @@ -616,9 +617,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - } - + + } { @@ -640,9 +641,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - } - + + } { @@ -661,10 +662,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - } - PushNewRow(Ui); + PushNewRow(Ui); + } { @@ -686,9 +687,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - } - + + } { @@ -710,6 +711,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 10a23746b..c98fda75a 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1225:0 +// src/engine/editor.h:1228:0 struct world_edit_brush_linked_list_node { diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index 3412d64a6..e97822955 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -53,6 +53,27 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings *BaseElement, umm Count = + Result &= Serialize(Bytes, &Element->Power); // default + + + + + + + Result &= Serialize(Bytes, &Element->ValueBias); // default + + + + + + + Result &= Serialize(Bytes, &Element->Threshold); // default + + + + + + Result &= Serialize(Bytes, (u32*)&Element->ValueModifier); // enum @@ -140,6 +161,30 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Power, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->ValueBias, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Threshold, Memory); + + + + + Element->ValueModifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 999da198c..2ddf88a34 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -48,31 +48,6 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush *BaseElement, umm Count = Result &= Serialize(Bytes, Element->Layers, ThisCount); } - - - - - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default - - - - - - - Result &= Serialize(Bytes, &Element->BrushFollowsCursor); // default - - - - - - - Result &= Serialize(Bytes, (u32*)&Element->Mode); // enum - - - - - Result &= Serialize(Bytes, (u32*)&Element->Modifier); // enum - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -109,33 +84,6 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena Result &= Deserialize(Bytes, Element->Layers, Memory, Count); } - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->BrushFollowsCursor, Memory); - - - - - - Element->Mode = Cast(world_edit_blend_mode, Read_u32(Bytes)); - - - - - Element->Modifier = Cast(world_edit_blend_mode_modifier, Read_u32(Bytes)); - MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/serdes_struct_perlin_noise_params.h b/generated/serdes_struct_perlin_noise_params.h index 896b1e450..cf56332c0 100644 --- a/generated/serdes_struct_perlin_noise_params.h +++ b/generated/serdes_struct_perlin_noise_params.h @@ -34,22 +34,15 @@ Serialize(u8_cursor_block_array *Bytes, perlin_noise_params *BaseElement, umm Co RangeIterator_t(umm, ElementIndex, Count) { perlin_noise_params *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Threshold); // default + Result &= Serialize(Bytes, &Element->Period); // default - Result &= Serialize(Bytes, &Element->Period); // default - - - - - Result &= Serialize(Bytes, &Element->Amplitude); // default - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -73,23 +66,13 @@ DeserializeCurrentVersion(u8_cursor *Bytes, perlin_noise_params *Element, memory b32 Result = True; // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Threshold, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Period, Memory); - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Amplitude, Memory); + diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index f55395463..75098e704 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -69,20 +69,6 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Plane); // default - - - - - - Result &= Serialize(Bytes, &Element->Threshold); // default - - - - - - - Result &= Serialize(Bytes, &Element->Power); // default - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -145,22 +131,6 @@ DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer *Element, memory_arena * // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Plane, Memory); - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Threshold, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Power, Memory); - MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/serdes_struct_voronoi_noise_params.h b/generated/serdes_struct_voronoi_noise_params.h index 7fe856bfe..5cb9a4427 100644 --- a/generated/serdes_struct_voronoi_noise_params.h +++ b/generated/serdes_struct_voronoi_noise_params.h @@ -34,21 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, voronoi_noise_params *BaseElement, umm C RangeIterator_t(umm, ElementIndex, Count) { voronoi_noise_params *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Threshold); // default - - - - - - - Result &= Serialize(Bytes, &Element->Period); // default - - - - - - - Result &= Serialize(Bytes, &Element->Amplitude); // default + Result &= Serialize(Bytes, &Element->Period); // default @@ -87,28 +73,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, voronoi_noise_params *Element, memor b32 Result = True; // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Threshold, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Period, Memory); - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Amplitude, Memory); - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Squareness, Memory); diff --git a/generated/serdes_struct_white_noise_params.h b/generated/serdes_struct_white_noise_params.h index 49772a175..a89b2ade1 100644 --- a/generated/serdes_struct_white_noise_params.h +++ b/generated/serdes_struct_white_noise_params.h @@ -34,14 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, white_noise_params *BaseElement, umm Cou RangeIterator_t(umm, ElementIndex, Count) { white_noise_params *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Threshold); // default - - - - - - - + @@ -64,15 +57,7 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, white_noise_params *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Threshold, Memory); - - - - - - + diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 019980b72..824e06b73 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1102:0 +// src/engine/editor.h:1095:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 951aafc66..b4f1c48a8 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1043:0 +// src/engine/editor.h:1039:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 4c4f27fc9..50751affc 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:898:0 +// src/engine/editor.h:894:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 2f3c88267..e634aabe3 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:881:0 +// src/engine/editor.h:877:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) @@ -6,8 +6,7 @@ ToStringPrefixless(world_edit_blend_mode_modifier Type) counted_string Result = {}; switch (Type) { - case WorldEdit_Modifier_Default: { Result = CSz("Default"); } break; - case WorldEdit_ValueModifier_Surface: { Result = CSz("Surface"); } break; + case WorldEdit_Modifier_None: { Result = CSz("None"); } break; case WorldEdit_ValueModifier_ClampPos: { Result = CSz("ClampPos"); } break; case WorldEdit_ValueModifier_ClampNeg: { Result = CSz("ClampNeg"); } break; case WorldEdit_ValueModifier_Threshold: { Result = CSz("Threshold"); } break; @@ -54,8 +53,7 @@ ToString(world_edit_blend_mode_modifier Type) counted_string Result = {}; switch (Type) { - case WorldEdit_Modifier_Default: { Result = CSz("WorldEdit_Modifier_Default"); } break; - case WorldEdit_ValueModifier_Surface: { Result = CSz("WorldEdit_ValueModifier_Surface"); } break; + case WorldEdit_Modifier_None: { Result = CSz("WorldEdit_Modifier_None"); } break; case WorldEdit_ValueModifier_ClampPos: { Result = CSz("WorldEdit_ValueModifier_ClampPos"); } break; case WorldEdit_ValueModifier_ClampNeg: { Result = CSz("WorldEdit_ValueModifier_ClampNeg"); } break; case WorldEdit_ValueModifier_Threshold: { Result = CSz("WorldEdit_ValueModifier_Threshold"); } break; @@ -88,8 +86,7 @@ WorldEditBlendModeModifier(counted_string S) { world_edit_blend_mode_modifier Result = {}; - if (StringsMatch(S, CSz("WorldEdit_Modifier_Default"))) { return WorldEdit_Modifier_Default; } - if (StringsMatch(S, CSz("WorldEdit_ValueModifier_Surface"))) { return WorldEdit_ValueModifier_Surface; } + if (StringsMatch(S, CSz("WorldEdit_Modifier_None"))) { return WorldEdit_Modifier_None; } if (StringsMatch(S, CSz("WorldEdit_ValueModifier_ClampPos"))) { return WorldEdit_ValueModifier_ClampPos; } if (StringsMatch(S, CSz("WorldEdit_ValueModifier_ClampNeg"))) { return WorldEdit_ValueModifier_ClampNeg; } if (StringsMatch(S, CSz("WorldEdit_ValueModifier_Threshold"))) { return WorldEdit_ValueModifier_Threshold; } diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index d43945934..f8ac78b4e 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:904:0 +// src/engine/editor.h:900:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) @@ -6,13 +6,9 @@ ToStringPrefixless(world_edit_color_blend_mode Type) counted_string Result = {}; switch (Type) { - case WorldEdit_ColorBlendMode_ThresholdPositive: { Result = CSz("ThresholdPositive"); } break; - case WorldEdit_ColorBlendMode_ThresholdNegative: { Result = CSz("ThresholdNegative"); } break; - case WorldEdit_ColorBlendMode_Additive: { Result = CSz("Additive"); } break; - case WorldEdit_ColorBlendMode_Subtractive: { Result = CSz("Subtractive"); } break; - case WorldEdit_ColorBlendMode_Multiply: { Result = CSz("Multiply"); } break; - case WorldEdit_ColorBlendMode_Divide: { Result = CSz("Divide"); } break; - case WorldEdit_ColorBlendMode_Average: { Result = CSz("Average"); } break; + case WorldEdit_ColorBlendMode_ValuePositive: { Result = CSz("ValuePositive"); } break; + case WorldEdit_ColorBlendMode_ValueNegative: { Result = CSz("ValueNegative"); } break; + case WorldEdit_ColorBlendMode_Surface: { Result = CSz("Surface"); } break; case WorldEdit_ColorBlendMode_Disabled: { Result = CSz("Disabled"); } break; @@ -27,13 +23,9 @@ ToString(world_edit_color_blend_mode Type) counted_string Result = {}; switch (Type) { - case WorldEdit_ColorBlendMode_ThresholdPositive: { Result = CSz("WorldEdit_ColorBlendMode_ThresholdPositive"); } break; - case WorldEdit_ColorBlendMode_ThresholdNegative: { Result = CSz("WorldEdit_ColorBlendMode_ThresholdNegative"); } break; - case WorldEdit_ColorBlendMode_Additive: { Result = CSz("WorldEdit_ColorBlendMode_Additive"); } break; - case WorldEdit_ColorBlendMode_Subtractive: { Result = CSz("WorldEdit_ColorBlendMode_Subtractive"); } break; - case WorldEdit_ColorBlendMode_Multiply: { Result = CSz("WorldEdit_ColorBlendMode_Multiply"); } break; - case WorldEdit_ColorBlendMode_Divide: { Result = CSz("WorldEdit_ColorBlendMode_Divide"); } break; - case WorldEdit_ColorBlendMode_Average: { Result = CSz("WorldEdit_ColorBlendMode_Average"); } break; + case WorldEdit_ColorBlendMode_ValuePositive: { Result = CSz("WorldEdit_ColorBlendMode_ValuePositive"); } break; + case WorldEdit_ColorBlendMode_ValueNegative: { Result = CSz("WorldEdit_ColorBlendMode_ValueNegative"); } break; + case WorldEdit_ColorBlendMode_Surface: { Result = CSz("WorldEdit_ColorBlendMode_Surface"); } break; case WorldEdit_ColorBlendMode_Disabled: { Result = CSz("WorldEdit_ColorBlendMode_Disabled"); } break; @@ -47,13 +39,9 @@ WorldEditColorBlendMode(counted_string S) { world_edit_color_blend_mode Result = {}; - if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_ThresholdPositive"))) { return WorldEdit_ColorBlendMode_ThresholdPositive; } - if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_ThresholdNegative"))) { return WorldEdit_ColorBlendMode_ThresholdNegative; } - if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Additive"))) { return WorldEdit_ColorBlendMode_Additive; } - if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Subtractive"))) { return WorldEdit_ColorBlendMode_Subtractive; } - if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Multiply"))) { return WorldEdit_ColorBlendMode_Multiply; } - if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Divide"))) { return WorldEdit_ColorBlendMode_Divide; } - if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Average"))) { return WorldEdit_ColorBlendMode_Average; } + if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_ValuePositive"))) { return WorldEdit_ColorBlendMode_ValuePositive; } + if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_ValueNegative"))) { return WorldEdit_ColorBlendMode_ValueNegative; } + if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Surface"))) { return WorldEdit_ColorBlendMode_Surface; } if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Disabled"))) { return WorldEdit_ColorBlendMode_Disabled; } return Result; diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 52c7dbdc7..823d1358e 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:890:0 +// src/engine/editor.h:886:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index acc145684..b88e4173b 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -9,6 +9,7 @@ uniform int ValueModifiers; uniform int GenerateNormals; uniform f32 Power; +uniform f32 ValueBias; // // Clipping params @@ -83,7 +84,9 @@ void main() // NOTE(Jesse): Set these in the -- user code -- section vec3 ColorValue = TexLookup.rgb; - f32 CurrentSample = TexLookup.a; + + f32 InitialAccumulator = TexLookup.a; + f32 Accumulator = TexLookup.a; f32 x = floor(gl_FragCoord.x); f32 z = floor(gl_FragCoord.y / 66); @@ -108,7 +111,7 @@ void main() { v3 ColorSample = RGBColor; - f32 ThisSample = 0.f; + f32 InitialSample = 0.f; s32 Octaves = 1; switch (BrushType) @@ -120,12 +123,12 @@ void main() { case 0: // NoiseType_Perlin: { - ThisSample = value_noise_derivs(NoiseBasis).x; + InitialSample = value_noise_derivs(NoiseBasis).x; } break; case 1: // NoiseType_Voronoi: { - ThisSample = voronoi_noise(NoiseBasis, Squareness).x; + InitialSample = voronoi_noise(NoiseBasis, Squareness).x; } break; case 2: // NoiseType_White: @@ -141,13 +144,13 @@ void main() switch (ShapeType) { // ShapeType_Rect - case 0: { ThisSample = Power; } break; + case 0: { InitialSample = 1.f; } break; // ShapeType_Sphere case 1: { - f32 Dist = 0.5f+distance(ChunkRelLocation, xyz); - if (Dist < Radius) { ThisSample = ((Radius-Dist)/Radius)*Power; } + f32 DistFromCenter = distance(ChunkRelLocation, xyz); + InitialSample = ((Radius-DistFromCenter)/Radius); } break; // ShapeType_Line @@ -158,9 +161,9 @@ void main() v3 Line = normalize(ChunkRelEditMax-ChunkRelEditMin); v3 X = cross(Line, EditRelPosition); f32 Dist = length(X)/length(Line); - /* if (Dist < Radius) { ThisSample = ((Radius-Dist)/Radius)*Power; } */ - /* if (Dist < Radius) { ThisSample = Dist*Power; } */ - if (Dist < Radius) { ThisSample = Power; } + /* if (Dist < Radius) { InitialSample = ((Radius-Dist)/Radius)*Power; } */ + /* if (Dist < Radius) { InitialSample = Dist*Power; } */ + if (Dist < Radius) { InitialSample = 1.f; } } break; // ShapeType_Cylinder @@ -205,7 +208,7 @@ void main() v3 X = cross(Line, LineRelativeXYZ); f32 Dist = length(X)/length(Line); - if (Dist < Radius) { ThisSample = Power; } + if (Dist < Radius) { InitialSample = 1.f; } } break; // ShapeType_Plane @@ -214,7 +217,7 @@ void main() f32 Dist = DistanceToPlane(PlaneNormal, Planed, EditRelPosition); if (abs(Dist) < PlaneRadius*ChunkResolution.x) { - ThisSample = Power; + InitialSample = 1.f; } } break; @@ -224,9 +227,11 @@ void main() } } break; - default: {ColorValue = V3(1.f, 0.f, 0.f); CurrentSample = 1.f;} break; + default: {ColorValue = V3(1.f, 0.f, 0.f); Accumulator = 1.f;} break; } + +#if 0 // TODO(Jesse): This is buggy; it generates extra geometry on the edges // of chunks for some reason. At the moment it's a non-issue because the // additional geometry is always below the ground, and doesn't cause @@ -240,7 +245,7 @@ void main() z > 0 && z <= 64) { f32 ThisCell = sign(TexLookup.a); - if (ThisCell < 0.f) // Current value is Air + if (ThisCell <= 0.f) // Current value is Air { s32 IsSurface = s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(1, 0), 0).a ) > 0.f); IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(1, 0), 0).a ) > 0.f); @@ -251,38 +256,45 @@ void main() IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 66), 0).a) > 0.f); IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 66), 0).a) > 0.f); - if (IsSurface == 0) { ThisSample = 0.f; ColorSample = V3(0,0,0); } + if (IsSurface == 0) { InitialSample = 0.f; ColorSample = V3(0,0,0); } } - else // Current CurrentSample is Solid + else // Current Accumulator is Solid { - s32 IsSurface = s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(1, 0), 0).a ) < 0.f); - IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(1, 0), 0).a ) < 0.f); + s32 IsSurface = s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(1, 0), 0).a ) <= 0.f); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(1, 0), 0).a ) <= 0.f); - IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 1), 0).a ) < 0.f); - IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 1), 0).a ) < 0.f); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 1), 0).a ) <= 0.f); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 1), 0).a ) <= 0.f); - IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 66), 0).a) < 0.f); - IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 66), 0).a) < 0.f); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) + ivec2(0, 66), 0).a) <= 0.f); + IsSurface |= s32(sign(texelFetch(InputTex, ivec2(gl_FragCoord.xy) - ivec2(0, 66), 0).a) <= 0.f); - if (IsSurface == 0) { ThisSample = 0.f; ColorSample = V3(0,0,0); } + if (IsSurface == 0) { InitialSample = 0.f; ColorSample = V3(0,0,0); } } } else { - ThisSample = 0.f; ColorSample = V3(0,0,0); + /* InitialSample = 0.f; ColorSample = V3(0,0,0); */ } } +#endif + f32 ThisSample = (InitialSample + ValueBias) * Power; if (Invert) { - ThisSample *= -1.f; + ThisSample = ThisSample * -1.f; } + + + + + if ( (ValueModifiers & (1<<1)) > 0) // WorldEdit_ValueModifier_ClampPos { ThisSample = max(0.f, ThisSample); @@ -295,33 +307,32 @@ void main() if ( (ValueModifiers & (1<<3)) > 0) // WorldEdit_ValueModifier_Threshold { - if (abs(ThisSample) >= Threshold) { ThisSample = Power; } + if (abs(InitialSample) < Threshold) { ThisSample = 0.f; } } - if (abs(ThisSample) < Threshold) - { - ThisSample = 0.f; - } - /* ThisSample *= Power; */ + + + + // Blend // switch (BlendMode) { case 0: // WorldEdit_Mode_Additive - { CurrentSample = CurrentSample + ThisSample; } break; + { Accumulator = Accumulator + ThisSample; } break; case 1: // WorldEdit_Mode_Subtractive - { CurrentSample = CurrentSample - ThisSample; } break; + { Accumulator = Accumulator - ThisSample; } break; case 2: // WorldEdit_Mode_Threshold - { if (abs(ThisSample) >= Threshold) { CurrentSample = ThisSample; } } break; + { if (abs(ThisSample) >= Threshold) { Accumulator = ThisSample; } } break; case 3: // WorldEdit_Mode_Disabled - { CurrentSample = CurrentSample; ThisSample = 0.f; } break; + { Accumulator = Accumulator; ThisSample = 0.f; } break; } @@ -329,15 +340,25 @@ void main() // switch (ColorMode) { - case 0: // ThresholdPositive + case 0: // WorldEdit_ColorBlendMode_ValuePositive { if (ThisSample > 0.f) { ColorValue = ColorSample; } } break; - case 1: // ThresholdNegative + case 1: // WorldEdit_ColorBlendMode_ValueNegative { if (ThisSample < 0.f) { ColorValue = ColorSample; } } break; - case 2: // Addative - { ColorValue = ColorValue + ColorSample; } break; + case 2: // WorldEdit_ColorBlendMode_Surface + { + if (InitialAccumulator <= 0.f) + { + if (Accumulator > 0.f) + { + ColorValue = ColorSample * (1.f-InitialSample); + } + } + } break; + /* { ColorValue = ColorValue + ColorSample; } break; */ +#if 0 case 3: // Subtractive { ColorValue = ColorValue - ColorSample; } break; @@ -350,6 +371,7 @@ void main() case 6: // Average { f32 StartingIntensity = length(ColorValue); ColorValue = (ColorValue + ColorSample)/StartingIntensity; } break; +#endif } } @@ -357,5 +379,5 @@ void main() } Output.rgb = ColorValue; - Output.a = CurrentSample; + Output.a = Accumulator; } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 36a64a95a..877f05a25 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1126,18 +1126,18 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } { - DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->Mode, CSz("Mode"), &DefaultUiRenderParams_Generic); - DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->Modifier, CSz("Modifier"), &DefaultUiRenderParams_Generic); - PushNewRow(Ui); + /* DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->Mode, CSz("Mode"), &DefaultUiRenderParams_Generic); */ + /* DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->Modifier, CSz("Modifier"), &DefaultUiRenderParams_Generic); */ + /* PushNewRow(Ui); */ } { - DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->SeedBrushWithSelection, CSz("SeedBrushWithSelection"), &DefaultUiRenderParams_Checkbox); - PushNewRow(Ui); + /* DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->SeedBrushWithSelection, CSz("SeedBrushWithSelection"), &DefaultUiRenderParams_Checkbox); */ + /* PushNewRow(Ui); */ - DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->BrushFollowsCursor, CSz("BrushFollowsCursor"), &DefaultUiRenderParams_Checkbox); - PushNewRow(Ui); - PushNewRow(Ui); + /* DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->BrushFollowsCursor, CSz("BrushFollowsCursor"), &DefaultUiRenderParams_Checkbox); */ + /* PushNewRow(Ui); */ + /* PushNewRow(Ui); */ } } diff --git a/src/engine/editor.h b/src/engine/editor.h index 2661f90bd..69582475b 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -415,11 +415,11 @@ poof( } } } - } - member.is_primitive? - { - PushNewRow(Ui); + member.is_primitive? + { + PushNewRow(Ui); + } } } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } @@ -795,29 +795,31 @@ enum world_edit_blend_mode enum world_edit_color_blend_mode { - WorldEdit_ColorBlendMode_ThresholdPositive, - WorldEdit_ColorBlendMode_ThresholdNegative, + WorldEdit_ColorBlendMode_ValuePositive, + WorldEdit_ColorBlendMode_ValueNegative, - WorldEdit_ColorBlendMode_Additive, - WorldEdit_ColorBlendMode_Subtractive, - WorldEdit_ColorBlendMode_Multiply, - WorldEdit_ColorBlendMode_Divide, + WorldEdit_ColorBlendMode_Surface, - WorldEdit_ColorBlendMode_Average, + // TODO(Jesse): Put back in? + /* WorldEdit_ColorBlendMode_Additive, */ + /* WorldEdit_ColorBlendMode_Subtractive, */ + /* WorldEdit_ColorBlendMode_Multiply, */ + /* WorldEdit_ColorBlendMode_Divide, */ WorldEdit_ColorBlendMode_Disabled, // Useful for turning the layer off }; enum world_edit_blend_mode_modifier poof(@bitfield) { - WorldEdit_Modifier_Default = 0, + WorldEdit_Modifier_None = 0, - WorldEdit_ValueModifier_Surface = (1<<0), + /* WorldEdit_ValueModifier_Surface = (1<<0), */ WorldEdit_ValueModifier_ClampPos = (1<<1), WorldEdit_ValueModifier_ClampNeg = (1<<2), WorldEdit_ValueModifier_Threshold = (1<<3), WorldEdit_ColorModifier_Discard = (1<<4), + // NOTE(Jesse): Unsupported for now, unclear if it will be again .. // WorldEdit_Modifier_Flood = xxxx, }; @@ -853,15 +855,12 @@ struct generic_noise_params struct white_noise_params { - r32 Threshold = 0.5f; }; struct perlin_noise_params { - r32 Threshold = 0.f; poof(@ui_value_range(0.f, 1.f)) - v3 Period = {{8.f, 8.f, 8.f}}; poof(@ui_value_range(0.1f, 20.f)) - r32 Amplitude = 8.f; poof(@ui_value_range(0.1f, 20.f)) + v3 Period = {{8.f, 8.f, 8.f}}; poof(@ui_value_range(0.1f, 20.f)) }; poof(are_equal(perlin_noise_params)) @@ -869,10 +868,7 @@ poof(are_equal(perlin_noise_params)) struct voronoi_noise_params { - r32 Threshold = 0.0f; poof(@ui_value_range(0.f, 1.f)) v3 Period = {{10.f, 10.f, 10.f}}; poof(@ui_value_range(0.1f, 20.f)) - r32 Amplitude = 8.f; poof(@ui_value_range(0.1f, 20.f)) - r32 Squareness; r32 MaskChance; }; @@ -1054,12 +1050,9 @@ struct shape_layer world_update_op_shape_params_sphere Line; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Line)) world_update_op_shape_params_cylinder Cylinder; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Cylinder)) world_update_op_shape_params_plane Plane; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Plane)) - // @sdf_shape_step(6): Add an instance of the new shape here // - f32 Threshold = 0.f; poof(@ui_value_range(0.f, 1.f)) - f32 Power = 10.f; poof(@ui_value_range(0.f, 25.f)) }; // NOTE(Jesse): This is intentionally not a d_union such that you can flip @@ -1114,19 +1107,29 @@ struct brush_settings // // Common across brush types // + + f32 Power = 10.f; poof(@ui_value_range(0.f, 25.f)) + r32 ValueBias; poof(@ui_value_range(-1.f, 1.f)) + f32 Threshold = 0.f; poof(@ui_value_range(0.f, 1.f) @ui_display_condition(Element->ValueModifier&WorldEdit_ValueModifier_Threshold || Element->BlendMode&WorldEdit_Mode_Threshold)) world_edit_blend_mode_modifier ValueModifier; world_edit_color_blend_mode ColorMode; world_edit_blend_mode BlendMode; b8 Invert; - s32 Iterations = 1; // NOTE(Jesse): How many times to do the filter. + + + + + + + s32 Iterations = 1; poof(@ui_skip) // NOTE(Jesse): This is the relative offset from the base selection. // Used to inflate or contract the area affected by the brush. // // TODO(Jesse): Rename to dilation - rect3i Offset; + rect3i Offset; poof(@ui_skip) - v3i NoiseBasisOffset; + v3i NoiseBasisOffset; poof(@ui_skip) // NOTE(Jesse): The color picker operates in HSV, so we need this to be HSV for now v3 HSVColor = DEFAULT_HSV_COLOR; poof(@custom_ui(PushColumn(Ui, CSz("HSVColor")); DoColorPickerToggle(Ui, Window, &Element->HSVColor, False))) @@ -1157,12 +1160,12 @@ struct layered_brush /* chunk_thumbnail LayerPreviews[MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount) @no_serialize) */ /* chunk_thumbnail SeedLayer; poof(@no_serialize) // NOTE(Jesse): Special layer that acts as the seed value */ - b8 SeedBrushWithSelection; - b8 BrushFollowsCursor; + /* b8 SeedBrushWithSelection; */ + /* b8 BrushFollowsCursor; */ // NOTE(Jesse): These are the global settings for the brush when it gets applied to the world. - world_edit_blend_mode Mode; - world_edit_blend_mode_modifier Modifier; + /* world_edit_blend_mode Mode; */ + /* world_edit_blend_mode_modifier Modifier; */ // NOTE(Jesse): This is actually just using the chunk .. should probably change it /* chunk_thumbnail Preview; poof(@no_serialize) */ diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index ec36ef8d8..65a6dc679 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -423,11 +423,14 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); } + BindUniformByName(&WorldEditRC->Program, "ValueBias", Layer->Settings.ValueBias); BindUniformByName(&WorldEditRC->Program, "BrushType", Layer->Settings.Type); BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.BlendMode); BindUniformByName(&WorldEditRC->Program, "ValueModifiers", Layer->Settings.ValueModifier); BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); BindUniformByName(&WorldEditRC->Program, "Invert", Layer->Settings.Invert); + BindUniformByName(&WorldEditRC->Program, "Power", Layer->Settings.Power); + BindUniformByName(&WorldEditRC->Program, "Threshold", Layer->Settings.Threshold); rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); @@ -458,18 +461,14 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case NoiseType_Perlin: { auto *Perlin = &Noise->Perlin; - BindUniformByName(&WorldEditRC->Program, "Threshold", Perlin->Threshold); BindUniformByName(&WorldEditRC->Program, "Period", &Perlin->Period); - BindUniformByName(&WorldEditRC->Program, "Power", Perlin->Amplitude); } break; case NoiseType_Voronoi: { auto *Voronoi = &Noise->Voronoi; BindUniformByName(&WorldEditRC->Program, "Squareness", Voronoi->Squareness); - BindUniformByName(&WorldEditRC->Program, "Threshold", Voronoi->Threshold); BindUniformByName(&WorldEditRC->Program, "Period", &Voronoi->Period); - BindUniformByName(&WorldEditRC->Program, "Power", Voronoi->Amplitude); } break; case NoiseType_White: @@ -482,8 +481,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { shape_layer *Shape = &Layer->Settings.Shape; BindUniformByName(&WorldEditRC->Program, "ShapeType", Shape->Type); - BindUniformByName(&WorldEditRC->Program, "Threshold", Shape->Threshold); - BindUniformByName(&WorldEditRC->Program, "Power", Shape->Power); switch(Shape->Type) { case ShapeType_Rect: { /* No special uniforms needed for Rect .. */ } break; From c768ecfe8f6010da6fa9a963363ffdf1916b0fef Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 12 Jun 2025 17:13:55 -0700 Subject: [PATCH 295/421] Tighten down Sphere and Rect SDFs, significantly improve blending interactions --- external/bonsai_stdlib | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 8 +- ...d_type_world_update_op_shape_params_rect.h | 15 +-- ...type_world_update_op_shape_params_sphere.h | 15 +-- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- generated/gen_vector_operators_v2.h | 11 ++ generated/gen_vector_operators_v2i.h | 11 ++ generated/gen_vector_operators_v3.h | 12 ++ generated/gen_vector_operators_v3_u8.h | 12 ++ generated/gen_vector_operators_v3i.h | 12 ++ generated/gen_vector_operators_v4.h | 13 +++ ...g_and_value_tables_enum_brush_layer_type.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- shaders/terrain/world_edit.fragmentshader | 110 +++++++++++++++--- src/engine/editor.h | 65 +++++++++-- src/engine/render_loop.cpp | 13 ++- 17 files changed, 246 insertions(+), 61 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index cf482ba3a..f2c782a6e 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit cf482ba3aa1544fde59cda50e78e32dddcb52708 +Subproject commit f2c782a6edb1b42ea7c8a97ba2ec00336e5ccbdc diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index af8c4e433..f6b00588a 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1081:0 +// src/engine/editor.h:1080:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index ec96ec77f..c5d0961de 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -112,7 +112,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N Cast(f32*, &Element->Power), MemberName, Params - , 0.f, 25.f ); + ); @@ -137,7 +137,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N Cast(r32*, &Element->ValueBias), MemberName, Params - , -1.f, 1.f ); + , -1.f, 1.f ); @@ -149,7 +149,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N PushNewRow(Ui); } - if (Element->ValueModifier&WorldEdit_ValueModifier_Threshold || Element->BlendMode&WorldEdit_Mode_Threshold) + if (HasThresholdModifier(Element)) { @@ -162,7 +162,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N Cast(f32*, &Element->Threshold), MemberName, Params - , 0.f, 1.f ); + , 0.f, 1.f ); diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 9248ec98e..2b383ba43 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -34,20 +34,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ cs MemberName = CSz("Region"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(rect3*, &Element->Region), - MemberName, - Params - ); - - - - - - - + } diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index ed4d9a420..5d61948bf 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -34,20 +34,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ cs MemberName = CSz("Location"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(cp*, &Element->Location), - MemberName, - Params - ); - - - - - - - + } diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 043590ebb..c43d2a545 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1097:0 +// src/engine/editor.h:1096:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/gen_vector_operators_v2.h b/generated/gen_vector_operators_v2.h index b16f96986..a48f2d6c1 100644 --- a/generated/gen_vector_operators_v2.h +++ b/generated/gen_vector_operators_v2.h @@ -40,6 +40,17 @@ Sum( v2 P1 ) return Result; } + + +inline r32 +MaxChannel( v2 P1 ) +{ + r32 Result = P1.E[0]; + Result = Cast(r32, Max(Result, P1.E[0])); + Result = Cast(r32, Max(Result, P1.E[1]));; + return Result; +} + inline b32 operator<( v2 P1, v2 P2 ) { diff --git a/generated/gen_vector_operators_v2i.h b/generated/gen_vector_operators_v2i.h index 4c0ca4d8b..2031fbb52 100644 --- a/generated/gen_vector_operators_v2i.h +++ b/generated/gen_vector_operators_v2i.h @@ -40,6 +40,17 @@ Sum( v2i P1 ) return Result; } + + +inline s32 +MaxChannel( v2i P1 ) +{ + s32 Result = P1.E[0]; + Result = Cast(s32, Max(Result, P1.E[0])); + Result = Cast(s32, Max(Result, P1.E[1]));; + return Result; +} + inline b32 operator<( v2i P1, v2i P2 ) { diff --git a/generated/gen_vector_operators_v3.h b/generated/gen_vector_operators_v3.h index 23e1ecd91..f8b43bf39 100644 --- a/generated/gen_vector_operators_v3.h +++ b/generated/gen_vector_operators_v3.h @@ -40,6 +40,18 @@ Sum( v3 P1 ) return Result; } + + +inline r32 +MaxChannel( v3 P1 ) +{ + r32 Result = P1.E[0]; + Result = Cast(r32, Max(Result, P1.E[0])); + Result = Cast(r32, Max(Result, P1.E[1])); + Result = Cast(r32, Max(Result, P1.E[2]));; + return Result; +} + inline b32 operator<( v3 P1, v3 P2 ) { diff --git a/generated/gen_vector_operators_v3_u8.h b/generated/gen_vector_operators_v3_u8.h index ae79c8f45..fdca2c453 100644 --- a/generated/gen_vector_operators_v3_u8.h +++ b/generated/gen_vector_operators_v3_u8.h @@ -40,6 +40,18 @@ Sum( v3_u8 P1 ) return Result; } + + +inline u8 +MaxChannel( v3_u8 P1 ) +{ + u8 Result = P1.E[0]; + Result = Cast(u8, Max(Result, P1.E[0])); + Result = Cast(u8, Max(Result, P1.E[1])); + Result = Cast(u8, Max(Result, P1.E[2]));; + return Result; +} + inline b32 operator<( v3_u8 P1, v3_u8 P2 ) { diff --git a/generated/gen_vector_operators_v3i.h b/generated/gen_vector_operators_v3i.h index b6744235b..eb27f8bd3 100644 --- a/generated/gen_vector_operators_v3i.h +++ b/generated/gen_vector_operators_v3i.h @@ -40,6 +40,18 @@ Sum( v3i P1 ) return Result; } + + +inline s32 +MaxChannel( v3i P1 ) +{ + s32 Result = P1.E[0]; + Result = Cast(s32, Max(Result, P1.E[0])); + Result = Cast(s32, Max(Result, P1.E[1])); + Result = Cast(s32, Max(Result, P1.E[2]));; + return Result; +} + inline b32 operator<( v3i P1, v3i P2 ) { diff --git a/generated/gen_vector_operators_v4.h b/generated/gen_vector_operators_v4.h index 7eee6c513..842d4179d 100644 --- a/generated/gen_vector_operators_v4.h +++ b/generated/gen_vector_operators_v4.h @@ -40,6 +40,19 @@ Sum( v4 P1 ) return Result; } + + +inline r32 +MaxChannel( v4 P1 ) +{ + r32 Result = P1.E[0]; + Result = Cast(r32, Max(Result, P1.E[0])); + Result = Cast(r32, Max(Result, P1.E[1])); + Result = Cast(r32, Max(Result, P1.E[2])); + Result = Cast(r32, Max(Result, P1.E[3]));; + return Result; +} + inline b32 operator<( v4 P1, v4 P2 ) { diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 824e06b73..2cabdde9c 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1095:0 +// src/engine/editor.h:1094:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index b4f1c48a8..f07d975ba 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1039:0 +// src/engine/editor.h:1038:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index b88e4173b..e378eb672 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -26,7 +26,7 @@ uniform s32 ShapeType; // shape_type // // Sphere Params // -uniform v3 ChunkRelLocation; +uniform v3 EditRelativeSphereCenter; uniform f32 Radius; // @@ -78,6 +78,29 @@ r32 DistanceToPlane(v3 PlaneNormal, f32 Planed, v3 P) return Distance; } +f32 iq_sdSphere(v3 p, f32 r) +{ + return length(p) - Radius; +} + +f32 iq_sdBox(vec3 p, vec3 b) +{ + vec3 q = abs(p) - b; + return length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0); +} + +#if 1 +f32 IQSampleToBonsaiSample(f32 IQSample, f32 Radius) +{ + return (1.f-IQSample)/Radius; +} +#else +f32 IQSampleToBonsaiSample(f32 IQSample, f32 Radius) +{ + return (1.f-IQSample); +} +#endif + void main() { v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); @@ -106,7 +129,8 @@ void main() xyz.z <= ChunkRelEditMax.z ) { v3 Basis = WorldspaceChunkBasis + xyz; - v3 EditRelPosition = xyz - ChunkRelEditMin; + v3 EditRelxyz = xyz - ChunkRelEditMin; + v3 EditDim = ChunkRelEditMax-ChunkRelEditMin; { @@ -144,13 +168,35 @@ void main() switch (ShapeType) { // ShapeType_Rect - case 0: { InitialSample = 1.f; } break; + case 0: + { +#if 1 + v3 BoxR = EditDim/4.f; + + v3 SampleP = BoxR - (EditRelxyz-BoxR); + + // NOTE(Jesse): Remap by box radius such that we get a 0-1 value out + SampleP /= BoxR; + + f32 IQSample = iq_sdBox(SampleP, V3(1.f)); + /* InitialSample = IQSampleToBonsaiSample(IQSample, 1.f); */ + InitialSample = -IQSample; +#else + InitialSample = 1.f; +#endif + } break; // ShapeType_Sphere case 1: { - f32 DistFromCenter = distance(ChunkRelLocation, xyz); +#if 1 + v3 P = EditRelxyz - EditRelativeSphereCenter; + f32 IQSample = iq_sdSphere(P, Radius); + InitialSample = IQSampleToBonsaiSample(IQSample, Radius); +#else + f32 DistFromCenter = distance(EditRelativeSphereCenter, EditRelxyz); InitialSample = ((Radius-DistFromCenter)/Radius); +#endif } break; // ShapeType_Line @@ -159,7 +205,7 @@ void main() // TODO(Jesse): Mr. Jippity said this is how to do distance to // line and it works, although I'm not sure it's necessarily a very good way to do it .. v3 Line = normalize(ChunkRelEditMax-ChunkRelEditMin); - v3 X = cross(Line, EditRelPosition); + v3 X = cross(Line, EditRelxyz); f32 Dist = length(X)/length(Line); /* if (Dist < Radius) { InitialSample = ((Radius-Dist)/Radius)*Power; } */ /* if (Dist < Radius) { InitialSample = Dist*Power; } */ @@ -171,7 +217,6 @@ void main() { v3 AxisMask; v3 InvAxisMask; - v3 EditDim = ChunkRelEditMax-ChunkRelEditMin; switch (Orientation) { @@ -204,7 +249,7 @@ void main() v3 ChunkRelP1 = MinorAxies + MajorAxis; v3 Line = ChunkRelP1 - ChunkRelP0; - v3 LineRelativeXYZ = EditRelPosition - ChunkRelP0; + v3 LineRelativeXYZ = EditRelxyz - ChunkRelP0; v3 X = cross(Line, LineRelativeXYZ); f32 Dist = length(X)/length(Line); @@ -214,7 +259,7 @@ void main() // ShapeType_Plane case 4: { - f32 Dist = DistanceToPlane(PlaneNormal, Planed, EditRelPosition); + f32 Dist = DistanceToPlane(PlaneNormal, Planed, EditRelxyz); if (abs(Dist) < PlaneRadius*ChunkResolution.x) { InitialSample = 1.f; @@ -281,6 +326,8 @@ void main() + /* InitialSample = Clamp01(InitialSample); */ + f32 ThisSample = (InitialSample + ValueBias) * Power; if (Invert) { @@ -318,18 +365,54 @@ void main() - // Blend + // Blend Value // switch (BlendMode) { case 0: // WorldEdit_Mode_Additive - { Accumulator = Accumulator + ThisSample; } break; + { + if (ThisSample > 0.f) + /* if (Accumulator > 0.f) */ + { + Accumulator = Accumulator + ThisSample; + } + } break; case 1: // WorldEdit_Mode_Subtractive - { Accumulator = Accumulator - ThisSample; } break; + { + if (Accumulator > 0.f) + { + Accumulator = Accumulator - ThisSample; + } + } break; + case 2: // WorldEdit_Mode_Threshold - { if (abs(ThisSample) >= Threshold) { Accumulator = ThisSample; } } break; + { + f32 AbsSampleValue = abs(ThisSample); + + /* if (ThisSample >= Threshold) */ + + /* if (AbsSampleValue >= Threshold) */ + + /* if (Accumulator < 0.f && AbsSampleValue >= Threshold) */ + if (Accumulator < 0.f) + { + if(ThisSample >= Threshold) + { + Accumulator = ThisSample; + } + else + { + Accumulator = ThisSample; + } + } + else + { + /* Accumulator += ThisSample; */ + } + + } break; case 3: // WorldEdit_Mode_Disabled { Accumulator = Accumulator; ThisSample = 0.f; } break; @@ -352,7 +435,8 @@ void main() { if (Accumulator > 0.f) { - ColorValue = ColorSample * (1.f-InitialSample); + ColorValue = ColorSample; + /* ColorValue = ColorSample * (InitialSample); */ } } } break; diff --git a/src/engine/editor.h b/src/engine/editor.h index 69582475b..9d702cdb0 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -949,21 +949,20 @@ struct world_update_op_shape_params_chunk_data struct world_update_op_shape_params_rect { - // Sim-space positions - rect3 Region; poof(@ui_disable) + rect3 Region; poof(@ui_skip) // NOTE(Jesse): Unused & deprecated, remove }; struct world_update_op_shape_params_sphere { - cp Location; poof(@ui_disable) + cp Location; poof(@ui_skip) f32 Radius = 10.f; }; struct world_update_op_shape_params_line { - cp P0; poof(@ui_disable) - cp P1; poof(@ui_disable) + cp P0; poof(@ui_skip) + cp P1; poof(@ui_skip) r32 Radius = 10.f; }; @@ -1108,12 +1107,13 @@ struct brush_settings // Common across brush types // - f32 Power = 10.f; poof(@ui_value_range(0.f, 25.f)) - r32 ValueBias; poof(@ui_value_range(-1.f, 1.f)) - f32 Threshold = 0.f; poof(@ui_value_range(0.f, 1.f) @ui_display_condition(Element->ValueModifier&WorldEdit_ValueModifier_Threshold || Element->BlendMode&WorldEdit_Mode_Threshold)) + f32 Power = 10.f; // poof(@ui_value_range( 0.f, 25.f) @ui_display_condition(HasThresholdModifier(Element))) + r32 ValueBias = 0.f; poof(@ui_value_range(-1.f, 1.f)) + f32 Threshold = 0.f; poof(@ui_value_range( 0.f, 1.f) @ui_display_condition(HasThresholdModifier(Element))) world_edit_blend_mode_modifier ValueModifier; world_edit_color_blend_mode ColorMode; world_edit_blend_mode BlendMode; + b8 Invert; @@ -1436,6 +1436,55 @@ TryGetSelectedLayer(level_editor *Editor) return Result; } +link_internal b32 +HasThresholdModifier(brush_settings *Element) +{ + b32 Result = (Element->ValueModifier&WorldEdit_ValueModifier_Threshold || Element->BlendMode&WorldEdit_Mode_Threshold); + return Result; +} + +link_internal r32 +GetPowerFor(world *World, world_edit *Edit, brush_settings *Settings) +{ + r32 Result = 0.f; + switch (Settings->Type) + { + case BrushLayerType_Noise: + { + Result = Settings->Power; + } break; + + case BrushLayerType_Shape: + { + switch (Settings->Shape.Type) + { + case ShapeType_Rect: + { + aabb Rect = GetSimSpaceRect(World, Edit->Region); + v3 Dim = GetDim(Rect); + Result = MaxChannel(Dim)/4.f; + } break; + + case ShapeType_Sphere: + { + Result = Settings->Shape.Sphere.Radius; + } break; + + case ShapeType_Line: + case ShapeType_Cylinder: + case ShapeType_Plane: + { + NotImplemented; + Result = 0.f; + } break; + } + } break; + } + + return Result; +} + + link_internal b32 CheckSettingsChanged(layered_brush *); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 65a6dc679..bb675764e 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -423,14 +423,21 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); } + f32 Power = Layer->Settings.Power ; + if (HasThresholdModifier(&Layer->Settings)) + { + Power = GetPowerFor(World, Edit, &Layer->Settings); + } + BindUniformByName(&WorldEditRC->Program, "ValueBias", Layer->Settings.ValueBias); BindUniformByName(&WorldEditRC->Program, "BrushType", Layer->Settings.Type); BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.BlendMode); BindUniformByName(&WorldEditRC->Program, "ValueModifiers", Layer->Settings.ValueModifier); BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); BindUniformByName(&WorldEditRC->Program, "Invert", Layer->Settings.Invert); - BindUniformByName(&WorldEditRC->Program, "Power", Layer->Settings.Power); BindUniformByName(&WorldEditRC->Program, "Threshold", Layer->Settings.Threshold); + BindUniformByName(&WorldEditRC->Program, "Power", Power); + rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); @@ -490,9 +497,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) auto Sphere = &Shape->Sphere; v3 SimSphereOrigin = GetSimSpaceP(World, Edit->Region.Min + EditRectRad); - v3 ChunkRelLocation = SimSphereOrigin - SimChunkMin; + v3 EditRelativeSphereCenter = SimSphereOrigin - SimEditRect.Min; - BindUniformByName(&WorldEditRC->Program, "ChunkRelLocation", &ChunkRelLocation); + BindUniformByName(&WorldEditRC->Program, "EditRelativeSphereCenter", &EditRelativeSphereCenter); BindUniformByName(&WorldEditRC->Program, "Radius", Sphere->Radius); } break; From 7ac6665a71f753e0601bf96383010e35e1c60105 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 12 Jun 2025 20:32:05 -0700 Subject: [PATCH 296/421] Add Torus --- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 26 +++- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 2 +- ..._type_world_update_op_shape_params_torus.h | 121 ++++++++++++++++++ ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 11 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_Bxw4Q7AW.h | 3 +- generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kh9dwrCf.h | 2 +- generated/for_datatypes_kv3WBTai.h | 1 + generated/hashtable_world_edit_brush.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/serdes_struct_brush_layer.h | 2 +- generated/serdes_struct_brush_settings.h | 2 +- generated/serdes_struct_layered_brush.h | 2 +- generated/serdes_struct_shape_layer.h | 17 ++- generated/serdes_struct_world_edit.h | 2 +- ...rdes_struct_world_edit_block_array_index.h | 2 +- generated/serdes_struct_world_edit_brush.h | 2 +- generated/serdes_struct_world_edit_layer.h | 2 +- ...truct_world_update_op_shape_params_torus.h | 115 +++++++++++++++++ .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- .../string_and_value_tables_shape_type.h | 5 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- shaders/terrain/world_edit.fragmentshader | 38 +++++- src/engine/editor.cpp | 2 + src/engine/editor.h | 24 +++- src/engine/render_loop.cpp | 18 ++- src/engine/serdes.cpp | 2 + 122 files changed, 472 insertions(+), 127 deletions(-) create mode 100644 generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h create mode 100644 generated/serdes_struct_world_update_op_shape_params_torus.h diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index e2d28f135..535f34ffc 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1138:0 +// src/engine/editor.h:1147:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 8b8833096..9581265e1 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1225:0 +// src/engine/editor.h:1234:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 0ceaa496c..4840f82bb 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1261:0 +// src/engine/editor.h:1270:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 686f5a1ae..8781bc8ee 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1272:0 +// src/engine/editor.h:1281:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index b267775d1..71ce9857a 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1257:0 +// src/engine/editor.h:1266:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index f6b00588a..5e7edeb1d 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1080:0 +// src/engine/editor.h:1089:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 967c9b615..b04351525 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:328:0 +// src/engine/editor.cpp:330:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 106b1c169..2efafab65 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:500:0 +// src/engine/editor.cpp:502:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index b5d3f3c6a..4792b1780 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:492:0 +// src/engine/editor.cpp:494:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 90079a4e5..0aa46af95 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:367:0 +// src/engine/editor.cpp:369:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 5afdbb653..690424297 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:334:0 +// src/engine/editor.cpp:336:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 1648a79bb..849b761d9 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:267:0 +// src/engine/editor.cpp:269:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index d1efbf8c5..cfec61236 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:403:0 +// src/engine/editor.cpp:405:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index c5d0961de..5016f5cbc 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:173:0 +// src/engine/editor.cpp:175:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index da28ea3ec..a10a187f6 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:361:0 +// src/engine/editor.cpp:363:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 157552b8a..126d39e60 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:433:0 +// src/engine/editor.cpp:435:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index d427eacb6..aa2d5c434 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:370:0 +// src/engine/editor.cpp:372:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 15a0fb708..7fc4ada9d 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:503:0 +// src/engine/editor.cpp:505:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 1634f08db..2f9ee28ef 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:263:0 +// src/engine/editor.cpp:265:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 141f2982e..e33378716 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:564:0 +// src/engine/editor.cpp:566:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 52b3b3704..edf16eb2b 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:585:0 +// src/engine/editor.cpp:587:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index d2038ba71..8007f2330 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:582:0 +// src/engine/editor.cpp:584:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 5235d1475..96b3ab400 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:472:0 +// src/engine/editor.cpp:474:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index b1ea05e28..d93956fc6 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:469:0 +// src/engine/editor.cpp:471:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 74873428d..93024d9ad 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:506:0 +// src/engine/editor.cpp:508:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 8027ffa5a..8bacab26c 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:457:0 +// src/engine/editor.cpp:459:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 372e9ccfb..5db08a4fd 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:358:0 +// src/engine/editor.cpp:360:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index b21532e4b..be770213b 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:540:0 +// src/engine/editor.cpp:542:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index e2b6a2f93..e9c0fa298 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:534:0 +// src/engine/editor.cpp:536:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 9d96d71bf..96b705b9c 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:439:0 +// src/engine/editor.cpp:441:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index e7d47e9f3..ee5f3ab0d 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:442:0 +// src/engine/editor.cpp:444:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 428c06566..1127df61f 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:555:0 +// src/engine/editor.cpp:557:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 4f8cf4e01..560047210 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:579:0 +// src/engine/editor.cpp:581:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index afc591f01..632b0b087 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:256:0 +// src/engine/editor.cpp:258:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 6ce8603a5..005d0e4e6 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:253:0 +// src/engine/editor.cpp:255:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 6452074e7..9cf967dca 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:325:0 +// src/engine/editor.cpp:327:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 2a3fbf110..dfe0b9ed4 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:408:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 8d895dad4..d3963045f 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:570:0 +// src/engine/editor.cpp:572:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 45df51428..732f8ec7a 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:537:0 +// src/engine/editor.cpp:539:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 08087a954..f7bcfe810 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:304:0 +// src/engine/editor.cpp:306:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 496a94d59..ef4ed6175 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:445:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index ca7e74cfe..71796eb29 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:448:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 24d9b891c..b8607b978 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:482:0 +// src/engine/editor.cpp:484:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 04e7c8b26..d44078f18 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:319:0 +// src/engine/editor.cpp:321:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index efe899a26..6341bca54 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:322:0 +// src/engine/editor.cpp:324:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index a50f1e685..d7b7d76b6 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:310:0 +// src/engine/editor.cpp:312:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 3a6087c77..6f72288e1 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:355:0 +// src/engine/editor.cpp:357:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index f9ae6ba87..0f2fca8ac 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:259:0 +// src/engine/editor.cpp:261:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index ec57edbc6..88285733c 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:313:0 +// src/engine/editor.cpp:315:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 0a6b42ab5..cbac88fc3 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:528:0 +// src/engine/editor.cpp:530:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index d473d39ec..1fc70f3df 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:558:0 +// src/engine/editor.cpp:560:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index c4460340f..a20951b55 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:307:0 +// src/engine/editor.cpp:309:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 13a166eb1..2d63bae83 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:531:0 +// src/engine/editor.cpp:533:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 7263b19bf..35fc817be 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:239:0 +// src/engine/editor.cpp:241:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index a8a6ee95a..dca7c823c 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:171:0 +// src/engine/editor.cpp:173:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -170,6 +170,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name + } + if (Element->Type == ShapeType_Torus) + + { + + + + cs MemberName = {}; + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(world_update_op_shape_params_torus*, &Element->Torus), + MemberName, + Params + ); + + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 1e7caf82d..9d3206646 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:546:0 +// src/engine/editor.cpp:548:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index fe786e9dc..0b1b30cef 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:549:0 +// src/engine/editor.cpp:551:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index ed09e2094..371dc8263 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:543:0 +// src/engine/editor.cpp:545:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index bb376e4d7..f9a0d0b47 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:411:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 046a0f8b3..ddd149ad0 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:552:0 +// src/engine/editor.cpp:554:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 2b93e924b..a37286ade 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:364:0 +// src/engine/editor.cpp:366:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index ee918eb98..8f6712d6c 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:561:0 +// src/engine/editor.cpp:563:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 334e4a603..c34a2b442 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:179:0 +// src/engine/editor.cpp:181:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index cc639fb27..0f8a298c0 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:182:0 +// src/engine/editor.cpp:184:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index cebcfb61f..ce6296e56 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:337:0 +// src/engine/editor.cpp:339:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 57b82cf40..4fe6a763a 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:331:0 +// src/engine/editor.cpp:333:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index d17e81221..894d0a6cb 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:436:0 +// src/engine/editor.cpp:438:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index b00cc629d..d81778980 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:427:0 +// src/engine/editor.cpp:429:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index eeeb2ed34..72735c360 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:430:0 +// src/engine/editor.cpp:432:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index e1776f3c5..259fa8eb1 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:250:0 +// src/engine/editor.cpp:252:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index fe7a2534b..c698d4cc1 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:247:0 +// src/engine/editor.cpp:249:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 5eda2afb4..581a83e14 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:485:0 +// src/engine/editor.cpp:487:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 0310e66e6..c2d4a2de8 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:479:0 +// src/engine/editor.cpp:481:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index 58ebbedb4..7d91a16c3 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:418:0 +// src/engine/editor.cpp:420:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h new file mode 100644 index 000000000..a1e5da0ef --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h @@ -0,0 +1,121 @@ +// src/engine/editor.cpp:165:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_torus *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_torus", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("Axis"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Axis), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("MajorRadius"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->MajorRadius), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("MinorRadius"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, &Element->MinorRadius), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 51404bb90..64d11e239 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:476:0 +// src/engine/editor.cpp:478:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 80742eb04..7f194b1c7 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:451:0 +// src/engine/editor.cpp:453:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index 532c7426d..8be9445a6 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:242:0 +// src/engine/editor.cpp:244:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index b8ff4545f..51063ea44 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:236:0 +// src/engine/editor.cpp:238:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 5134a1e92..c1d87358c 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:191:0 +// src/engine/editor.cpp:193:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index cc66c50e0..f9fd8c188 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:176:0 +// src/engine/editor.cpp:178:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index 146186922..fb32c30af 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:421:0 +// src/engine/editor.cpp:423:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 8220567a1..0b6c78e8b 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:497:0 +// src/engine/editor.cpp:499:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index bc438e7ed..39d86f0a5 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:424:0 +// src/engine/editor.cpp:426:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 0fb396bd1..d8b309607 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:567:0 +// src/engine/editor.cpp:569:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 20ddaf820..0faa627c6 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:295:0 +// src/engine/editor.cpp:297:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index c25a72c31..875fa1514 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:292:0 +// src/engine/editor.cpp:294:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 98e1c3d3c..f056991dd 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:454:0 +// src/engine/editor.cpp:456:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 82c10b522..fc59957b7 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:316:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 1e200e97e..6dbc467bb 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:573:0 +// src/engine/editor.cpp:575:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 35b725c61..788c1a3e9 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:576:0 +// src/engine/editor.cpp:578:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 04cbb796e..9d02cbed8 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:169:0 +// src/engine/editor.cpp:171:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) @@ -52,6 +52,15 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, *Element = ShapeType_Plane; + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Torus"), UiId(Window, "enum ShapeType_Torus", Element), Params)) + { + *Element = ShapeType_Torus; + + SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 2b9197734..3e3869012 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:298:0 +// src/engine/editor.cpp:300:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index c43d2a545..19e5b6db8 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1096:0 +// src/engine/editor.h:1105:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 56aef9849..9b24e0594 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -755,6 +755,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 4a1716e2d..bcfa45940 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:514:0 +// src/engine/editor.cpp:516:0 @@ -1143,5 +1143,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 3ea2cc44e..646da600b 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -745,6 +745,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 54098e65f..5e7251928 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:377:0 +// src/engine/editor.cpp:379:0 diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index e0823ff2e..f60af85bc 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -745,6 +745,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index c98fda75a..13e372616 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1228:0 +// src/engine/editor.h:1237:0 struct world_edit_brush_linked_list_node { diff --git a/generated/serdes_collection_world_edit_block_array_index_block_array.h b/generated/serdes_collection_world_edit_block_array_index_block_array.h index d1f01d5bb..ebceec874 100644 --- a/generated/serdes_collection_world_edit_block_array_index_block_array.h +++ b/generated/serdes_collection_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:458:0 +// src/engine/serdes.cpp:460:0 diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index 4d839ba1c..a5aba4e44 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:440:0 +// src/engine/serdes.cpp:442:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index e97822955..806629f0d 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:437:0 +// src/engine/serdes.cpp:439:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 2ddf88a34..3dd5dbec0 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:446:0 +// src/engine/serdes.cpp:448:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index 75098e704..c69b1e56e 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:433:0 +// src/engine/serdes.cpp:435:0 link_internal bonsai_type_info TypeInfo(shape_layer *Ignored) @@ -69,6 +69,13 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Plane); // default + + + + + + Result &= Serialize(Bytes, &Element->Torus); // default + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -131,6 +138,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer *Element, memory_arena * // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Plane, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Torus, Memory); + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index 6c2a856a2..33081a12b 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:452:0 +// src/engine/serdes.cpp:454:0 link_internal bonsai_type_info TypeInfo(world_edit *Ignored) diff --git a/generated/serdes_struct_world_edit_block_array_index.h b/generated/serdes_struct_world_edit_block_array_index.h index 355eaaefb..cd47d75c0 100644 --- a/generated/serdes_struct_world_edit_block_array_index.h +++ b/generated/serdes_struct_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:455:0 +// src/engine/serdes.cpp:457:0 link_internal bonsai_type_info TypeInfo(world_edit_block_array_index *Ignored) diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index 062ddfc44..763dac459 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:449:0 +// src/engine/serdes.cpp:451:0 link_internal bonsai_type_info TypeInfo(world_edit_brush *Ignored) diff --git a/generated/serdes_struct_world_edit_layer.h b/generated/serdes_struct_world_edit_layer.h index 61fefc843..b7cdd0892 100644 --- a/generated/serdes_struct_world_edit_layer.h +++ b/generated/serdes_struct_world_edit_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:461:0 +// src/engine/serdes.cpp:463:0 link_internal bonsai_type_info TypeInfo(world_edit_layer *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_torus.h b/generated/serdes_struct_world_update_op_shape_params_torus.h new file mode 100644 index 000000000..7fc9e4805 --- /dev/null +++ b/generated/serdes_struct_world_update_op_shape_params_torus.h @@ -0,0 +1,115 @@ +// src/engine/serdes.cpp:430:0 + +link_internal bonsai_type_info +TypeInfo(world_update_op_shape_params_torus *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("world_update_op_shape_params_torus"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_torus *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + world_update_op_shape_params_torus *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->Axis); // default + + + + + + + Result &= Serialize(Bytes, &Element->MajorRadius); // default + + + + + + + Result &= Serialize(Bytes, &Element->MinorRadius); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_torus *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_torus *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_torus *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Axis, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->MajorRadius, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->MinorRadius, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, world_update_op_shape_params_torus *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 228f84945..38b958be4 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:495:0 +// src/engine/editor.cpp:497:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 329010506..573233725 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:288:0 +// src/engine/editor.cpp:290:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 2cabdde9c..0cc0b9725 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1094:0 +// src/engine/editor.h:1103:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 415155e35..55183a43a 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:282:0 +// src/engine/editor.cpp:284:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 98b47bf88..06db42759 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:279:0 +// src/engine/editor.cpp:281:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index f07d975ba..d21041525 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1038:0 +// src/engine/editor.h:1046:0 link_internal counted_string ToStringPrefixless(shape_type Type) @@ -11,6 +11,7 @@ ToStringPrefixless(shape_type Type) case ShapeType_Line: { Result = CSz("Line"); } break; case ShapeType_Cylinder: { Result = CSz("Cylinder"); } break; case ShapeType_Plane: { Result = CSz("Plane"); } break; + case ShapeType_Torus: { Result = CSz("Torus"); } break; } @@ -29,6 +30,7 @@ ToString(shape_type Type) case ShapeType_Line: { Result = CSz("ShapeType_Line"); } break; case ShapeType_Cylinder: { Result = CSz("ShapeType_Cylinder"); } break; case ShapeType_Plane: { Result = CSz("ShapeType_Plane"); } break; + case ShapeType_Torus: { Result = CSz("ShapeType_Torus"); } break; } @@ -46,6 +48,7 @@ ShapeType(counted_string S) if (StringsMatch(S, CSz("ShapeType_Line"))) { return ShapeType_Line; } if (StringsMatch(S, CSz("ShapeType_Cylinder"))) { return ShapeType_Cylinder; } if (StringsMatch(S, CSz("ShapeType_Plane"))) { return ShapeType_Plane; } + if (StringsMatch(S, CSz("ShapeType_Torus"))) { return ShapeType_Torus; } return Result; } diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index be1a07804..df8f9b3eb 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:285:0 +// src/engine/editor.cpp:287:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index e378eb672..91ec715ab 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -11,6 +11,8 @@ uniform int GenerateNormals; uniform f32 Power; uniform f32 ValueBias; +uniform v3 Axis; + // // Clipping params // @@ -42,6 +44,11 @@ uniform v3 PlaneNormal; uniform f32 Planed; uniform f32 PlaneRadius; +// +// Torus Params +// +uniform f32 MinorRadius; + @@ -89,6 +96,16 @@ f32 iq_sdBox(vec3 p, vec3 b) return length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0); } +// p == origin +// t.x == major radius +// t.y == minor radius +// +float iq_sdTorus( vec3 p, vec2 t ) +{ + vec2 q = vec2(length(p.xz)-t.x,p.y); + return length(q)-t.y; +} + #if 1 f32 IQSampleToBonsaiSample(f32 IQSample, f32 Radius) { @@ -172,7 +189,6 @@ void main() { #if 1 v3 BoxR = EditDim/4.f; - v3 SampleP = BoxR - (EditRelxyz-BoxR); // NOTE(Jesse): Remap by box radius such that we get a 0-1 value out @@ -266,6 +282,22 @@ void main() } } break; + // ShapeType_Torus + case 5: + { + v2 t = v2(Radius, MinorRadius); + v3 p; + + v3 BoxR = EditDim/2.f; + p = EditRelxyz; + + p -= BoxR; + + f32 n = iq_sdTorus( p, t ); + InitialSample = -n; + + } break; + // @sdf_shape_step(7): Add more cases and implementations here // for shape types added in Step 1 // @@ -380,7 +412,7 @@ void main() case 1: // WorldEdit_Mode_Subtractive { - if (Accumulator > 0.f) + if (ThisSample > 0.f) { Accumulator = Accumulator - ThisSample; } @@ -404,7 +436,7 @@ void main() } else { - Accumulator = ThisSample; + Accumulator = max(Accumulator, ThisSample); } } else diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 877f05a25..d0a7090fa 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -162,6 +162,8 @@ poof(do_editor_ui_for_compound_type(world_update_op_shape_params_cylinder)) #include poof(do_editor_ui_for_compound_type(world_update_op_shape_params_plane)) #include +poof(do_editor_ui_for_compound_type(world_update_op_shape_params_torus)) +#include // @sdf_shape_step(4): Add the editor shit here .. diff --git a/src/engine/editor.h b/src/engine/editor.h index 9d702cdb0..1d276aa11 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -978,6 +978,13 @@ struct world_update_op_shape_params_plane f32 Thickness = 2.f; }; +struct world_update_op_shape_params_torus +{ + v3 Axis; + f32 MajorRadius = 20.f; + f32 MinorRadius = 3.f; +}; + // @sdf_shape_step(2): Add new asset struct here // @@ -1026,11 +1033,12 @@ poof(do_editor_ui_for_compound_type(world_edit_brush_constraints)) enum shape_type { - ShapeType_Rect, - ShapeType_Sphere, - ShapeType_Line, - ShapeType_Cylinder, - ShapeType_Plane, + ShapeType_Rect = 0, + ShapeType_Sphere = 1, + ShapeType_Line = 2, + ShapeType_Cylinder = 3, + ShapeType_Plane = 4, + ShapeType_Torus = 5, // @sdf_shape_step(1): Add shape types here // @@ -1049,6 +1057,7 @@ struct shape_layer world_update_op_shape_params_sphere Line; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Line)) world_update_op_shape_params_cylinder Cylinder; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Cylinder)) world_update_op_shape_params_plane Plane; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Plane)) + world_update_op_shape_params_torus Torus; poof(@ui_display_name({}) @ui_display_condition(Element->Type == ShapeType_Torus)) // @sdf_shape_step(6): Add an instance of the new shape here // @@ -1477,6 +1486,11 @@ GetPowerFor(world *World, world_edit *Edit, brush_settings *Settings) NotImplemented; Result = 0.f; } break; + + case ShapeType_Torus: + { + Result = Settings->Shape.Torus.MajorRadius; + } break; } } break; } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index bb675764e..442e12f24 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -423,12 +423,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); } - f32 Power = Layer->Settings.Power ; - if (HasThresholdModifier(&Layer->Settings)) - { - Power = GetPowerFor(World, Edit, &Layer->Settings); - } - BindUniformByName(&WorldEditRC->Program, "ValueBias", Layer->Settings.ValueBias); BindUniformByName(&WorldEditRC->Program, "BrushType", Layer->Settings.Type); BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.BlendMode); @@ -436,7 +430,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); BindUniformByName(&WorldEditRC->Program, "Invert", Layer->Settings.Invert); BindUniformByName(&WorldEditRC->Program, "Threshold", Layer->Settings.Threshold); - BindUniformByName(&WorldEditRC->Program, "Power", Power); + BindUniformByName(&WorldEditRC->Program, "Power", Layer->Settings.Power); rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); @@ -598,6 +592,16 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } break; + case ShapeType_Torus: + { + auto Torus = &Shape->Torus; + + BindUniformByName(&WorldEditRC->Program, "Axis", &Torus->Axis); + BindUniformByName(&WorldEditRC->Program, "Radius", Torus->MajorRadius); + BindUniformByName(&WorldEditRC->Program, "MinorRadius", Torus->MinorRadius); + + } break; + // @sdf_shape_step(5): Calculate values and bind uniform variables for the new shape // } diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index 8b864d0da..d96ec3d38 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -427,6 +427,8 @@ poof(serdes_struct(world_update_op_shape_params_cylinder)) #include poof(serdes_struct(world_update_op_shape_params_plane)) #include +poof(serdes_struct(world_update_op_shape_params_torus)) +#include // @sdf_shape_step(3): Add new asset struct here to generate serialization code // From 425a74f6fd1262e2cc54de332a6ddf31911e043c Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 14 Jun 2025 13:19:29 -0700 Subject: [PATCH 297/421] Continue refining editor --- external/bonsai_stdlib | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 10 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 26 +++- ...ompound_type_shape_layer_advanced_params.h | 144 ++++++++++++++++++ ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 11 +- ...d_type_world_update_op_shape_params_rect.h | 17 ++- ..._type_world_update_op_shape_params_torus.h | 24 --- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 3 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_Bxw4Q7AW.h | 3 +- generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kh9dwrCf.h | 2 +- generated/for_datatypes_kv3WBTai.h | 1 + generated/hashtable_world_edit_brush.h | 2 +- generated/scalar_math_fuctions_451039071.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/serdes_struct_brush_layer.h | 2 +- generated/serdes_struct_brush_settings.h | 10 +- generated/serdes_struct_layered_brush.h | 2 +- generated/serdes_struct_shape_layer.h | 17 ++- ...erdes_struct_shape_layer_advanced_params.h | 130 ++++++++++++++++ generated/serdes_struct_world_edit.h | 2 +- ...rdes_struct_world_edit_block_array_index.h | 2 +- generated/serdes_struct_world_edit_brush.h | 2 +- generated/serdes_struct_world_edit_layer.h | 2 +- ...ct_world_update_op_shape_params_cylinder.h | 13 +- ...struct_world_update_op_shape_params_rect.h | 4 +- ...truct_world_update_op_shape_params_torus.h | 17 +-- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 5 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- shaders/terrain/world_edit.fragmentshader | 133 +++++++++++++--- src/engine/editor.cpp | 3 +- src/engine/editor.h | 22 ++- src/engine/render_loop.cpp | 24 +-- src/engine/serdes.cpp | 3 + 140 files changed, 637 insertions(+), 219 deletions(-) create mode 100644 generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h create mode 100644 generated/serdes_struct_shape_layer_advanced_params.h diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index f2c782a6e..a512fe543 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit f2c782a6edb1b42ea7c8a97ba2ec00336e5ccbdc +Subproject commit a512fe54307bbf70506a29a486d215727a5eccee diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index db3644a3e..93963bb47 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:866:0 +// src/engine/editor.h:867:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 535f34ffc..7f934356a 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1147:0 +// src/engine/editor.h:1159:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 9581265e1..9c42c5fd3 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1234:0 +// src/engine/editor.h:1246:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 4840f82bb..6e8a06e66 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1270:0 +// src/engine/editor.h:1282:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 8781bc8ee..ee7a90b25 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1281:0 +// src/engine/editor.h:1293:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 71ce9857a..5caac5374 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1266:0 +// src/engine/editor.h:1278:0 diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 5e7edeb1d..ef62bcf3d 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1089:0 +// src/engine/editor.h:1101:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index b04351525..cd800dafe 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:330:0 +// src/engine/editor.cpp:331:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 2efafab65..8f1a58c33 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:502:0 +// src/engine/editor.cpp:503:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 4792b1780..dc4686d1d 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:494:0 +// src/engine/editor.cpp:495:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 0aa46af95..b1fe3391b 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:369:0 +// src/engine/editor.cpp:370:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 690424297..843ca76b4 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:336:0 +// src/engine/editor.cpp:337:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 849b761d9..2e7ecc5bf 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:269:0 +// src/engine/editor.cpp:270:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index cfec61236..dc40c2ce3 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:405:0 +// src/engine/editor.cpp:406:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 5016f5cbc..9a4ccde32 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:175:0 +// src/engine/editor.cpp:176:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -204,11 +204,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - cs MemberName = CSz("ColorMode"); + cs MemberName = CSz("BlendMode"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_color_blend_mode*, &Element->ColorMode), + Cast(world_edit_blend_mode*, &Element->BlendMode), MemberName, Params ); @@ -228,11 +228,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N - cs MemberName = CSz("BlendMode"); + cs MemberName = CSz("ColorMode"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_edit_blend_mode*, &Element->BlendMode), + Cast(world_edit_color_blend_mode*, &Element->ColorMode), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index a10a187f6..3eaee98c5 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:363:0 +// src/engine/editor.cpp:364:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 126d39e60..315ee7d8b 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:435:0 +// src/engine/editor.cpp:436:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index aa2d5c434..805c17b86 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:372:0 +// src/engine/editor.cpp:373:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 7fc4ada9d..232e94349 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:505:0 +// src/engine/editor.cpp:506:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 2f9ee28ef..e011d70de 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:265:0 +// src/engine/editor.cpp:266:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index e33378716..7d87cd92a 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:566:0 +// src/engine/editor.cpp:567:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index edf16eb2b..b55c7e3c3 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:587:0 +// src/engine/editor.cpp:588:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 8007f2330..93d27e71d 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:584:0 +// src/engine/editor.cpp:585:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 96b3ab400..a788f2b09 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:474:0 +// src/engine/editor.cpp:475:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index d93956fc6..8242bff80 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:471:0 +// src/engine/editor.cpp:472:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 93024d9ad..122768a41 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:508:0 +// src/engine/editor.cpp:509:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 8bacab26c..53c1426f6 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:459:0 +// src/engine/editor.cpp:460:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 5db08a4fd..91ba6ac62 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:360:0 +// src/engine/editor.cpp:361:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index be770213b..8a00b7060 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:542:0 +// src/engine/editor.cpp:543:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index e9c0fa298..b381c39d9 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:536:0 +// src/engine/editor.cpp:537:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 96b705b9c..f5c0679c2 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:442:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index ee5f3ab0d..f074374ad 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:444:0 +// src/engine/editor.cpp:445:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 1127df61f..4dbfe64ad 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:557:0 +// src/engine/editor.cpp:558:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 560047210..b5e001f13 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:581:0 +// src/engine/editor.cpp:582:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 632b0b087..4c018e930 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:258:0 +// src/engine/editor.cpp:259:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 005d0e4e6..c060f2017 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:255:0 +// src/engine/editor.cpp:256:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 9cf967dca..67d214602 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:327:0 +// src/engine/editor.cpp:328:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index dfe0b9ed4..8b15d54e5 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:408:0 +// src/engine/editor.cpp:409:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index d3963045f..68a4f639a 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:572:0 +// src/engine/editor.cpp:573:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 732f8ec7a..1589a54bd 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:539:0 +// src/engine/editor.cpp:540:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index f7bcfe810..bc924c7ea 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:306:0 +// src/engine/editor.cpp:307:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index ef4ed6175..cf15ac46e 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:448:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 71796eb29..90bea2a5f 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:451:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index b8607b978..a8592587b 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:484:0 +// src/engine/editor.cpp:485:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index d44078f18..48453114e 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:321:0 +// src/engine/editor.cpp:322:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 6341bca54..1c3685114 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:324:0 +// src/engine/editor.cpp:325:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index d7b7d76b6..b1c97599f 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:312:0 +// src/engine/editor.cpp:313:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 6f72288e1..ec2529f73 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:357:0 +// src/engine/editor.cpp:358:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 0f2fca8ac..3a85d82b3 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:261:0 +// src/engine/editor.cpp:262:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 88285733c..b7003a3e7 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:315:0 +// src/engine/editor.cpp:316:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index cbac88fc3..cd5f3ed7a 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:530:0 +// src/engine/editor.cpp:531:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 1fc70f3df..ae565cb27 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:560:0 +// src/engine/editor.cpp:561:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index a20951b55..fa8d2e25c 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:309:0 +// src/engine/editor.cpp:310:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 2d63bae83..f3e33bcff 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:533:0 +// src/engine/editor.cpp:534:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 35fc817be..02ffc99ae 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:241:0 +// src/engine/editor.cpp:242:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index dca7c823c..4aec772bf 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:173:0 +// src/engine/editor.cpp:174:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -194,6 +194,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name + } + + + { + + + + cs MemberName = CSz("Advanced"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shape_layer_advanced_params*, &Element->Advanced), + MemberName, + Params + ); + + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h b/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h new file mode 100644 index 000000000..733d2b0a7 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h @@ -0,0 +1,144 @@ +// src/engine/editor.cpp:172:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer_advanced_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle shape_layer_advanced_params", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("Rounding"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Rounding), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("Stretch"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Stretch), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("Repeat"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Repeat), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("Axis"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Axis), + MemberName, + Params + , -1.f, 1.f ); + + + + + + + + + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 9d3206646..9ef2e938b 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:548:0 +// src/engine/editor.cpp:549:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 0b1b30cef..90cf2450b 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:551:0 +// src/engine/editor.cpp:552:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 371dc8263..88f1fa0b5 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:545:0 +// src/engine/editor.cpp:546:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index f9a0d0b47..b4600e49e 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:411:0 +// src/engine/editor.cpp:412:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index ddd149ad0..8f00b3aed 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:554:0 +// src/engine/editor.cpp:555:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index a37286ade..ed1089328 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:366:0 +// src/engine/editor.cpp:367:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 8f6712d6c..17c860d58 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:563:0 +// src/engine/editor.cpp:564:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index c34a2b442..72b47b204 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:181:0 +// src/engine/editor.cpp:182:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 0f8a298c0..27615d6aa 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:184:0 +// src/engine/editor.cpp:185:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index ce6296e56..7a52e9a17 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:339:0 +// src/engine/editor.cpp:340:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 4fe6a763a..352780d5f 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:333:0 +// src/engine/editor.cpp:334:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 894d0a6cb..a0c97b5eb 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:438:0 +// src/engine/editor.cpp:439:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index d81778980..edec17eb7 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:429:0 +// src/engine/editor.cpp:430:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 72735c360..d5d329d67 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:432:0 +// src/engine/editor.cpp:433:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 259fa8eb1..c3a9b9ee9 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:252:0 +// src/engine/editor.cpp:253:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index c698d4cc1..7b4dd1dd6 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:249:0 +// src/engine/editor.cpp:250:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 581a83e14..64e2f5ad5 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:487:0 +// src/engine/editor.cpp:488:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index c2d4a2de8..5379f8eb2 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:481:0 +// src/engine/editor.cpp:482:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index 7d91a16c3..444634bd9 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:420:0 +// src/engine/editor.cpp:421:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 0dd84c528..66aabd09d 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -33,11 +33,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - cs MemberName = CSz("Orientation"); + cs MemberName = CSz("Radius"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shape_axis*, &Element->Orientation), + Cast(r32*, &Element->Radius), MemberName, Params ); @@ -49,7 +49,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - + PushNewRow(Ui); + } @@ -57,11 +58,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - cs MemberName = CSz("Radius"); + cs MemberName = CSz("Height"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->Radius), + Cast(r32*, &Element->Height), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 2b383ba43..b5f15394c 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -33,8 +33,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ - cs MemberName = CSz("Region"); - + cs MemberName = CSz("Dim"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, &Element->Dim), + MemberName, + Params + ); + + + + + + + } diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h index a1e5da0ef..8fae88958 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h @@ -29,30 +29,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - { - - - - cs MemberName = CSz("Axis"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->Axis), - MemberName, - Params - ); - - - - - - - - - - } - - { diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 64d11e239..173785f3d 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:478:0 +// src/engine/editor.cpp:479:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 7f194b1c7..91e2ca4e2 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:454:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index 8be9445a6..6bdb90f4e 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:244:0 +// src/engine/editor.cpp:245:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 51063ea44..54e68289c 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:238:0 +// src/engine/editor.cpp:239:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index c1d87358c..8be2ecacb 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:193:0 +// src/engine/editor.cpp:194:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index f9fd8c188..f8d1117f4 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:178:0 +// src/engine/editor.cpp:179:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index fb32c30af..ee023cae6 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:423:0 +// src/engine/editor.cpp:424:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 0b6c78e8b..a62869dd6 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:499:0 +// src/engine/editor.cpp:500:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 39d86f0a5..84e0e6556 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:426:0 +// src/engine/editor.cpp:427:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index d8b309607..76948a497 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:569:0 +// src/engine/editor.cpp:570:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 0faa627c6..dc55c2acd 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:297:0 +// src/engine/editor.cpp:298:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 875fa1514..a641fc611 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:294:0 +// src/engine/editor.cpp:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index f056991dd..133fa9559 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:457:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index fc59957b7..96a52e1ce 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:319:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 6dbc467bb..1d4229417 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:575:0 +// src/engine/editor.cpp:576:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 788c1a3e9..8dc5b7f7a 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:578:0 +// src/engine/editor.cpp:579:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 9d02cbed8..deb0cc286 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:171:0 +// src/engine/editor.cpp:170:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 3e3869012..bd31d39a6 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:300:0 +// src/engine/editor.cpp:301:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 80a8bee4e..038ed8a41 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:891:0 +// src/engine/editor.h:892:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 19e5b6db8..4f80bbcb4 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1105:0 +// src/engine/editor.h:1117:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 695070adc..f1e6d5160 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:897:0 +// src/engine/editor.h:898:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) @@ -20,6 +20,7 @@ RadioButtonGroup_world_edit_blend_mode( renderer_2d *Ui, { { CSz("Additive"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Additive")), WorldEdit_Mode_Additive }, { CSz("Subtractive"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Subtractive")), WorldEdit_Mode_Subtractive }, + { CSz("Multiply"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Multiply")), WorldEdit_Mode_Multiply }, { CSz("Threshold"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Threshold")), WorldEdit_Mode_Threshold }, { CSz("Disabled"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Disabled")), WorldEdit_Mode_Disabled }, }; diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 218b9b1eb..33c196eba 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:880:0 +// src/engine/editor.h:881:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 0d67e95dc..5487ab44e 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:909:0 +// src/engine/editor.h:910:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 26fa270c3..7675dcf4c 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:902:0 +// src/engine/editor.h:903:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 8877c4cf4..f480c54b6 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:906:0 +// src/engine/editor.h:907:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 9b24e0594..09853978c 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -223,6 +223,7 @@ + struct render_to_texture_async_params; diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index bcfa45940..a6b3ff0d1 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1,4 +1,5 @@ -// src/engine/editor.cpp:516:0 +// src/engine/editor.cpp:517:0 + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 646da600b..27a2c507e 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -223,6 +223,7 @@ + render_to_texture_async_params render_to_texture_async_params; diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 5e7251928..2c43d27d5 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:379:0 +// src/engine/editor.cpp:380:0 diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index f60af85bc..c4b4a8a0c 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -223,6 +223,7 @@ + type_render_to_texture_async_params, diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 13e372616..3d1ac81e3 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1237:0 +// src/engine/editor.h:1249:0 struct world_edit_brush_linked_list_node { diff --git a/generated/scalar_math_fuctions_451039071.h b/generated/scalar_math_fuctions_451039071.h index 935a23f76..15f1c92b6 100644 --- a/generated/scalar_math_fuctions_451039071.h +++ b/generated/scalar_math_fuctions_451039071.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/maff.h:379:0 +// external/bonsai_stdlib/src/maff.h:386:0 inline r32 Clamp( r32 Min, r32 Value, r32 Max ) diff --git a/generated/serdes_collection_world_edit_block_array_index_block_array.h b/generated/serdes_collection_world_edit_block_array_index_block_array.h index ebceec874..8859e17fc 100644 --- a/generated/serdes_collection_world_edit_block_array_index_block_array.h +++ b/generated/serdes_collection_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:460:0 +// src/engine/serdes.cpp:463:0 diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index a5aba4e44..5bef18e1a 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:442:0 +// src/engine/serdes.cpp:445:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index 806629f0d..38a61900c 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:439:0 +// src/engine/serdes.cpp:442:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) @@ -79,12 +79,12 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings *BaseElement, umm Count = - Result &= Serialize(Bytes, (u32*)&Element->ColorMode); // enum + Result &= Serialize(Bytes, (u32*)&Element->BlendMode); // enum - Result &= Serialize(Bytes, (u32*)&Element->BlendMode); // enum + Result &= Serialize(Bytes, (u32*)&Element->ColorMode); // enum @@ -190,12 +190,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren - Element->ColorMode = Cast(world_edit_color_blend_mode, Read_u32(Bytes)); + Element->BlendMode = Cast(world_edit_blend_mode, Read_u32(Bytes)); - Element->BlendMode = Cast(world_edit_blend_mode, Read_u32(Bytes)); + Element->ColorMode = Cast(world_edit_color_blend_mode, Read_u32(Bytes)); diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 3dd5dbec0..666cbf11e 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:448:0 +// src/engine/serdes.cpp:451:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index c69b1e56e..84e7cca82 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:435:0 +// src/engine/serdes.cpp:438:0 link_internal bonsai_type_info TypeInfo(shape_layer *Ignored) @@ -76,6 +76,13 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Torus); // default + + + + + + Result &= Serialize(Bytes, &Element->Advanced); // default + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -146,6 +153,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer *Element, memory_arena * // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Torus, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Advanced, Memory); + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/serdes_struct_shape_layer_advanced_params.h b/generated/serdes_struct_shape_layer_advanced_params.h new file mode 100644 index 000000000..60ae96618 --- /dev/null +++ b/generated/serdes_struct_shape_layer_advanced_params.h @@ -0,0 +1,130 @@ +// src/engine/serdes.cpp:435:0 + +link_internal bonsai_type_info +TypeInfo(shape_layer_advanced_params *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("shape_layer_advanced_params"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, shape_layer_advanced_params *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + shape_layer_advanced_params *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->Rounding); // default + + + + + + + Result &= Serialize(Bytes, &Element->Stretch); // default + + + + + + + Result &= Serialize(Bytes, &Element->Repeat); // default + + + + + + + Result &= Serialize(Bytes, &Element->Axis); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, shape_layer_advanced_params *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer_advanced_params *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer_advanced_params *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Rounding, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Stretch, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Repeat, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Axis, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, shape_layer_advanced_params *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index 33081a12b..814e20eef 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:454:0 +// src/engine/serdes.cpp:457:0 link_internal bonsai_type_info TypeInfo(world_edit *Ignored) diff --git a/generated/serdes_struct_world_edit_block_array_index.h b/generated/serdes_struct_world_edit_block_array_index.h index cd47d75c0..f81ff60d6 100644 --- a/generated/serdes_struct_world_edit_block_array_index.h +++ b/generated/serdes_struct_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:457:0 +// src/engine/serdes.cpp:460:0 link_internal bonsai_type_info TypeInfo(world_edit_block_array_index *Ignored) diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index 763dac459..cbb8fa2be 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:451:0 +// src/engine/serdes.cpp:454:0 link_internal bonsai_type_info TypeInfo(world_edit_brush *Ignored) diff --git a/generated/serdes_struct_world_edit_layer.h b/generated/serdes_struct_world_edit_layer.h index b7cdd0892..a77e103fb 100644 --- a/generated/serdes_struct_world_edit_layer.h +++ b/generated/serdes_struct_world_edit_layer.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:463:0 +// src/engine/serdes.cpp:466:0 link_internal bonsai_type_info TypeInfo(world_edit_layer *Ignored) diff --git a/generated/serdes_struct_world_update_op_shape_params_cylinder.h b/generated/serdes_struct_world_update_op_shape_params_cylinder.h index 82ec88811..5926e797a 100644 --- a/generated/serdes_struct_world_update_op_shape_params_cylinder.h +++ b/generated/serdes_struct_world_update_op_shape_params_cylinder.h @@ -34,12 +34,14 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_cylinder *B RangeIterator_t(umm, ElementIndex, Count) { world_update_op_shape_params_cylinder *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, (u32*)&Element->Orientation); // enum + Result &= Serialize(Bytes, &Element->Radius); // default - Result &= Serialize(Bytes, &Element->Radius); // default + + + Result &= Serialize(Bytes, &Element->Height); // default @@ -62,14 +64,17 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_cylinder *Element, memory_arena *Memory) { b32 Result = True; - Element->Orientation = Cast(shape_axis, Read_u32(Bytes)); + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Radius, Memory); + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Radius, Memory); + Result &= Deserialize(Bytes, &Element->Height, Memory); diff --git a/generated/serdes_struct_world_update_op_shape_params_rect.h b/generated/serdes_struct_world_update_op_shape_params_rect.h index 014cb0e82..82b74eb67 100644 --- a/generated/serdes_struct_world_update_op_shape_params_rect.h +++ b/generated/serdes_struct_world_update_op_shape_params_rect.h @@ -34,7 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_rect *BaseE RangeIterator_t(umm, ElementIndex, Count) { world_update_op_shape_params_rect *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Region); // default + Result &= Serialize(Bytes, &Element->Dim); // default @@ -66,7 +66,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_rect *E b32 Result = True; // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Region, Memory); + Result &= Deserialize(Bytes, &Element->Dim, Memory); diff --git a/generated/serdes_struct_world_update_op_shape_params_torus.h b/generated/serdes_struct_world_update_op_shape_params_torus.h index 7fc9e4805..87fdd95f0 100644 --- a/generated/serdes_struct_world_update_op_shape_params_torus.h +++ b/generated/serdes_struct_world_update_op_shape_params_torus.h @@ -34,14 +34,7 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_torus *Base RangeIterator_t(umm, ElementIndex, Count) { world_update_op_shape_params_torus *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Axis); // default - - - - - - - Result &= Serialize(Bytes, &Element->MajorRadius); // default + Result &= Serialize(Bytes, &Element->MajorRadius); // default @@ -73,14 +66,6 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_torus * b32 Result = True; // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Axis, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->MajorRadius, Memory); diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 38b958be4..d772dda40 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:497:0 +// src/engine/editor.cpp:498:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 573233725..865641636 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:290:0 +// src/engine/editor.cpp:291:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 0cc0b9725..7052b78ff 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1103:0 +// src/engine/editor.h:1115:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 55183a43a..b3dc7ec96 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:284:0 +// src/engine/editor.cpp:285:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 06db42759..8592d1c39 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:281:0 +// src/engine/editor.cpp:282:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index df8f9b3eb..3fa3aff0a 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:287:0 +// src/engine/editor.cpp:288:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 50751affc..4ed7bae0c 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:894:0 +// src/engine/editor.h:895:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) @@ -8,6 +8,7 @@ ToStringPrefixless(world_edit_blend_mode Type) { case WorldEdit_Mode_Additive: { Result = CSz("Additive"); } break; case WorldEdit_Mode_Subtractive: { Result = CSz("Subtractive"); } break; + case WorldEdit_Mode_Multiply: { Result = CSz("Multiply"); } break; case WorldEdit_Mode_Threshold: { Result = CSz("Threshold"); } break; case WorldEdit_Mode_Disabled: { Result = CSz("Disabled"); } break; @@ -25,6 +26,7 @@ ToString(world_edit_blend_mode Type) { case WorldEdit_Mode_Additive: { Result = CSz("WorldEdit_Mode_Additive"); } break; case WorldEdit_Mode_Subtractive: { Result = CSz("WorldEdit_Mode_Subtractive"); } break; + case WorldEdit_Mode_Multiply: { Result = CSz("WorldEdit_Mode_Multiply"); } break; case WorldEdit_Mode_Threshold: { Result = CSz("WorldEdit_Mode_Threshold"); } break; case WorldEdit_Mode_Disabled: { Result = CSz("WorldEdit_Mode_Disabled"); } break; @@ -41,6 +43,7 @@ WorldEditBlendMode(counted_string S) if (StringsMatch(S, CSz("WorldEdit_Mode_Additive"))) { return WorldEdit_Mode_Additive; } if (StringsMatch(S, CSz("WorldEdit_Mode_Subtractive"))) { return WorldEdit_Mode_Subtractive; } + if (StringsMatch(S, CSz("WorldEdit_Mode_Multiply"))) { return WorldEdit_Mode_Multiply; } if (StringsMatch(S, CSz("WorldEdit_Mode_Threshold"))) { return WorldEdit_Mode_Threshold; } if (StringsMatch(S, CSz("WorldEdit_Mode_Disabled"))) { return WorldEdit_Mode_Disabled; } diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index e634aabe3..964b092d4 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:877:0 +// src/engine/editor.h:878:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index f8ac78b4e..9e32af293 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:900:0 +// src/engine/editor.h:901:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 823d1358e..148595a02 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:886:0 +// src/engine/editor.h:887:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 91ec715ab..8a2493f0b 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -23,7 +23,17 @@ uniform v3 ChunkRelEditMax; // // Shape params // -uniform s32 ShapeType; // shape_type +uniform s32 ShapeType; // shape_type +uniform mat4 RotTransform; +uniform f32 Rounding; +uniform v3 Stretch; +uniform v3 Repeat; + +// +// Rect Params +// + +v3 RectDim; // // Sphere Params @@ -35,7 +45,7 @@ uniform f32 Radius; // Cylinder Params // -uniform s32 Orientation; // voxel_rule_direction +uniform r32 Height; // // Plane Params @@ -47,6 +57,7 @@ uniform f32 PlaneRadius; // // Torus Params // + uniform f32 MinorRadius; @@ -96,7 +107,22 @@ f32 iq_sdBox(vec3 p, vec3 b) return length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0); } -// p == origin +// p == sample point +// h == height +// r == radius +// +float iq_sdCappedCylinder( vec3 p, float h, float r ) +{ + vec2 d = abs(vec2(length(p.xz),p.y)) - vec2(r,h); + return min(max(d.x,d.y),0.0) + length(max(d,0.0)); +} + +float iq_sdCylinder( vec3 p, vec3 c ) +{ + return length(p.xz-c.xy)-c.z; +} + +// p == sample point // t.x == major radius // t.y == minor radius // @@ -106,6 +132,40 @@ float iq_sdTorus( vec3 p, vec2 t ) return length(q)-t.y; } + +// p == sample point +// h == stretch vector +vec4 iq_opElongate( vec3 p, vec3 h ) +{ + // faster, but produces zero in the interior elongated box + /* return vec4( p-clamp(p,-h,h), 0.0 ); */ + + /* return vec4(0); */ + + vec3 q = abs(p)-h; + return vec4( max(q,0.0), min(max(q.x,max(q.y,q.z)),0.0) ); +} + +// p == sample point +// p == spacing between instances +// +v3 iq_opRepetition( v3 p, v3 s ) +{ + vec3 q = p - s*round(p/s); + return q; +} + +v4 DoInputTransforms(v3 p, mat3 Transform, v3 Stretch, v3 Repeat) +{ + p *= Transform; + if (length(Repeat) > 0.f) + { + p = iq_opRepetition(p, Repeat); + } + v4 w = iq_opElongate(p, Stretch); + return w; +} + #if 1 f32 IQSampleToBonsaiSample(f32 IQSample, f32 Radius) { @@ -133,6 +193,7 @@ void main() f32 y = floor(gl_FragCoord.y - (z*66)); v3 xyz = V3(x,y,z) * ChunkResolution; + mat3 RotMatrix = mat3(RotTransform); // TODO(Jesse): I have no idea why this works out to > Min and <= Max. I // think it should be >= Min and < Max .. but I'm just going to leave it for now.. @@ -148,6 +209,7 @@ void main() v3 Basis = WorldspaceChunkBasis + xyz; v3 EditRelxyz = xyz - ChunkRelEditMin; v3 EditDim = ChunkRelEditMax-ChunkRelEditMin; + v3 EditRad = EditDim/2.f; { @@ -188,13 +250,15 @@ void main() case 0: { #if 1 - v3 BoxR = EditDim/4.f; - v3 SampleP = BoxR - (EditRelxyz-BoxR); + v3 BoxR = (EditDim/4.f); + v3 p = BoxR - (EditRelxyz-BoxR); // NOTE(Jesse): Remap by box radius such that we get a 0-1 value out - SampleP /= BoxR; + p /= BoxR; + + v4 w = DoInputTransforms(p, RotMatrix, Stretch, Repeat); - f32 IQSample = iq_sdBox(SampleP, V3(1.f)); + f32 IQSample = w.w+iq_sdBox(w.xyz, V3(1.f)); /* InitialSample = IQSampleToBonsaiSample(IQSample, 1.f); */ InitialSample = -IQSample; #else @@ -206,9 +270,18 @@ void main() case 1: { #if 1 - v3 P = EditRelxyz - EditRelativeSphereCenter; - f32 IQSample = iq_sdSphere(P, Radius); - InitialSample = IQSampleToBonsaiSample(IQSample, Radius); + v3 p = (EditRelxyz - EditRelativeSphereCenter)/Radius; + +#if 1 + v4 w = DoInputTransforms(p, RotMatrix, Stretch, Repeat); +#else + p *= RotMatrix; + p = iq_opRepetition(p, Repeat); + v4 w = iq_opElongate(p, Stretch); +#endif + + f32 IQSample = w.w+iq_sdSphere(w.xyz, Radius); + InitialSample = -IQSample; //IQSampleToBonsaiSample(IQSample, Radius); #else f32 DistFromCenter = distance(EditRelativeSphereCenter, EditRelxyz); InitialSample = ((Radius-DistFromCenter)/Radius); @@ -231,6 +304,18 @@ void main() // ShapeType_Cylinder case 3: { + v3 p = (EditRelxyz - EditRad); + v3 c = Axis; + + f32 r = 4.f; + f32 h = 102.f; + /* f32 IQSample = iq_sdCylinder(p, c); */ + + v4 w = DoInputTransforms(p, RotMatrix, Stretch, Repeat); + + f32 IQSample = w.w+iq_sdCappedCylinder(w.xyz, Height, Radius); + InitialSample = -IQSample; +#if 0 v3 AxisMask; v3 InvAxisMask; @@ -270,6 +355,7 @@ void main() v3 X = cross(Line, LineRelativeXYZ); f32 Dist = length(X)/length(Line); if (Dist < Radius) { InitialSample = 1.f; } +#endif } break; // ShapeType_Plane @@ -285,15 +371,17 @@ void main() // ShapeType_Torus case 5: { - v2 t = v2(Radius, MinorRadius); - v3 p; + v2 t = v2(Radius, MinorRadius); + v3 p = EditRelxyz; v3 BoxR = EditDim/2.f; p = EditRelxyz; - p -= BoxR; - f32 n = iq_sdTorus( p, t ); + v4 w = DoInputTransforms(p, RotMatrix, Stretch, Repeat); + + f32 n = w.w+iq_sdTorus( w.xyz, t ); + InitialSample = -n; } break; @@ -302,6 +390,8 @@ void main() // for shape types added in Step 1 // } + + InitialSample += Rounding; } break; default: {ColorValue = V3(1.f, 0.f, 0.f); Accumulator = 1.f;} break; @@ -404,7 +494,6 @@ void main() case 0: // WorldEdit_Mode_Additive { if (ThisSample > 0.f) - /* if (Accumulator > 0.f) */ { Accumulator = Accumulator + ThisSample; } @@ -418,15 +507,21 @@ void main() } } break; + case 2: // WorldEdit_Mode_Multiply + { + // Don't wanna check this because we want to use this to mask values out + /* if (ThisSample > 0.f) */ + { + Accumulator = Accumulator * ThisSample; + } + } break; - case 2: // WorldEdit_Mode_Threshold + case 3: // WorldEdit_Mode_Threshold { f32 AbsSampleValue = abs(ThisSample); /* if (ThisSample >= Threshold) */ - /* if (AbsSampleValue >= Threshold) */ - /* if (Accumulator < 0.f && AbsSampleValue >= Threshold) */ if (Accumulator < 0.f) { @@ -446,7 +541,7 @@ void main() } break; - case 3: // WorldEdit_Mode_Disabled + case 4: // WorldEdit_Mode_Disabled { Accumulator = Accumulator; ThisSample = 0.f; } break; } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index d0a7090fa..f83871fd7 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -167,9 +167,10 @@ poof(do_editor_ui_for_compound_type(world_update_op_shape_params_torus)) // @sdf_shape_step(4): Add the editor shit here .. - poof(do_editor_ui_for_enum(shape_type)) #include +poof(do_editor_ui_for_compound_type(shape_layer_advanced_params)) +#include poof(do_editor_ui_for_compound_type(shape_layer)) #include poof(do_editor_ui_for_compound_type(brush_settings)) diff --git a/src/engine/editor.h b/src/engine/editor.h index 1d276aa11..34d067250 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -789,6 +789,7 @@ enum world_edit_blend_mode { WorldEdit_Mode_Additive, // Adds layer value to noise value WorldEdit_Mode_Subtractive, // Subtracts layer value from noise value + WorldEdit_Mode_Multiply, WorldEdit_Mode_Threshold, // Sets CurrentSample = SampleValue WorldEdit_Mode_Disabled, // Useful for turning the layer off }; @@ -949,7 +950,7 @@ struct world_update_op_shape_params_chunk_data struct world_update_op_shape_params_rect { - rect3 Region; poof(@ui_skip) // NOTE(Jesse): Unused & deprecated, remove + v3 Dim; }; struct world_update_op_shape_params_sphere @@ -968,8 +969,8 @@ struct world_update_op_shape_params_line struct world_update_op_shape_params_cylinder { - shape_axis Orientation; - r32 Radius = 10.f; + r32 Radius = 4.f; + r32 Height = 25.f; }; struct world_update_op_shape_params_plane @@ -980,7 +981,6 @@ struct world_update_op_shape_params_plane struct world_update_op_shape_params_torus { - v3 Axis; f32 MajorRadius = 20.f; f32 MinorRadius = 3.f; }; @@ -1046,6 +1046,15 @@ enum shape_type poof(string_and_value_tables(shape_type)) #include +struct shape_layer_advanced_params +/* poof(@do_editor_ui) */ +{ + r32 Rounding; + v3 Stretch; + v3 Repeat; + v3 Axis; poof(@ui_value_range(-1.f, 1.f)) +}; + struct shape_layer { shape_type Type; poof(@ui_display_name(CSz("Shape Type"))) @@ -1061,6 +1070,9 @@ struct shape_layer // @sdf_shape_step(6): Add an instance of the new shape here // + + // NOTE(Jesse): Just in another struct for the UI + shape_layer_advanced_params Advanced; }; // NOTE(Jesse): This is intentionally not a d_union such that you can flip @@ -1120,8 +1132,8 @@ struct brush_settings r32 ValueBias = 0.f; poof(@ui_value_range(-1.f, 1.f)) f32 Threshold = 0.f; poof(@ui_value_range( 0.f, 1.f) @ui_display_condition(HasThresholdModifier(Element))) world_edit_blend_mode_modifier ValueModifier; - world_edit_color_blend_mode ColorMode; world_edit_blend_mode BlendMode; + world_edit_color_blend_mode ColorMode; b8 Invert; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 442e12f24..5229e3bcc 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -481,10 +481,22 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case BrushLayerType_Shape: { shape_layer *Shape = &Layer->Settings.Shape; - BindUniformByName(&WorldEditRC->Program, "ShapeType", Shape->Type); + BindUniformByName(&WorldEditRC->Program, "ShapeType", Shape->Type); + + + BindUniformByName(&WorldEditRC->Program, "Rounding", Shape->Advanced.Rounding); + BindUniformByName(&WorldEditRC->Program, "Stretch", &Shape->Advanced.Stretch); + BindUniformByName(&WorldEditRC->Program, "Repeat", &Shape->Advanced.Repeat); + + m4 Rot = RotateTransform(Shape->Advanced.Axis*PI32); + BindUniformByName(&WorldEditRC->Program, "RotTransform", &Rot); + switch(Shape->Type) { - case ShapeType_Rect: { /* No special uniforms needed for Rect .. */ } break; + case ShapeType_Rect: + { + auto Sphere = &Shape->Rect; + } break; case ShapeType_Sphere: { @@ -506,13 +518,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case ShapeType_Cylinder: { auto Cylinder = &Shape->Cylinder; - shape_axis Orientation = Cylinder->Orientation; - if (Orientation == ShapeAxis_InferFromMajorAxis) - { - Orientation = ComputeShapeAxisFromEditDim(EditDim); - } - BindUniformByName(&WorldEditRC->Program, "Orientation", Orientation); BindUniformByName(&WorldEditRC->Program, "Radius", Cylinder->Radius); + BindUniformByName(&WorldEditRC->Program, "Height", Cylinder->Height); } break; case ShapeType_Plane: @@ -596,7 +603,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { auto Torus = &Shape->Torus; - BindUniformByName(&WorldEditRC->Program, "Axis", &Torus->Axis); BindUniformByName(&WorldEditRC->Program, "Radius", Torus->MajorRadius); BindUniformByName(&WorldEditRC->Program, "MinorRadius", Torus->MinorRadius); diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index d96ec3d38..48d3b5c30 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -432,6 +432,9 @@ poof(serdes_struct(world_update_op_shape_params_torus)) // @sdf_shape_step(3): Add new asset struct here to generate serialization code // +poof(serdes_struct(shape_layer_advanced_params)) +#include + poof(serdes_struct(shape_layer)) #include From dc0960e6bdcd0f1d71f8826d549ec8dbdda4a749 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 14 Jun 2025 14:09:19 -0700 Subject: [PATCH 298/421] Changed daytime colors to HSV and tune --- examples/terrain_gen/game.cpp | 2 +- generated/are_equal_render_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 25 ++++++ ...r_ui_for_compound_type_lighting_settings.h | 79 +++++++++++-------- generated/serdes_struct_camera.h | 15 ++++ generated/serdes_struct_lighting_settings.h | 42 ++++++++-- src/engine/api.cpp | 13 ++- src/engine/camera.cpp | 3 +- src/engine/camera.h | 3 +- src/engine/entity.cpp | 2 +- src/engine/render/render_init.cpp | 16 ++-- src/engine/render_settings.h | 8 +- 12 files changed, 148 insertions(+), 62 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index d004d9811..2341d82ac 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -769,7 +769,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() auto VisibleRegionSize = VisibleRegionSize_128; v3i VisibleRegion = V3i(VisibleRegionSize); - f32 DistanceFromTarget = Length(VisibleRegion/2.f); + f32 DistanceFromTarget = 5000.f; f32 FarClip = 150000.f; StandardCamera(Graphics->Camera, FarClip, DistanceFromTarget); diff --git a/generated/are_equal_render_settings.h b/generated/are_equal_render_settings.h index 225d83922..e2563699a 100644 --- a/generated/are_equal_render_settings.h +++ b/generated/are_equal_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/render_settings.h:72:0 +// src/engine/render_settings.h:74:0 link_internal b32 AreEqual(render_settings *Thing1, render_settings *Thing2) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 3eaee98c5..d93ac4943 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -321,6 +321,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("Speed"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->Speed), + MemberName, + Params + ); + + + + + + + + PushNewRow(Ui); } diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index bc924c7ea..89296f9d4 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -49,6 +49,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("tDaySpeed"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->tDaySpeed), + MemberName, + Params + , 1.f, 30.f ); + + + + + + + + PushNewRow(Ui); } @@ -119,17 +144,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - cs MemberName = CSz("DawnColor"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->DawnColor), - MemberName, - Params - ); - - - + cs MemberName = CSz("DawnHSV"); + PushColumn(Ui, CSz("DawnColor")); DoColorPickerToggle(Ui, Window, &Element->DawnHSV, False); @@ -168,17 +184,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - cs MemberName = CSz("SunColor"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->SunColor), - MemberName, - Params - ); - - - + cs MemberName = CSz("SunHSV"); + PushColumn(Ui, CSz("SunColor")); DoColorPickerToggle(Ui, Window, &Element->SunHSV, False); @@ -234,6 +241,21 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + } + + + { + + + + cs MemberName = CSz("DuskHSV"); + PushColumn(Ui, CSz("DuskColor")); DoColorPickerToggle(Ui, Window, &Element->DuskHSV, False); + + + + + + } @@ -266,17 +288,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c - cs MemberName = CSz("MoonColor"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->MoonColor), - MemberName, - Params - ); - - - + cs MemberName = CSz("MoonHSV"); + PushColumn(Ui, CSz("MoonColor")); DoColorPickerToggle(Ui, Window, &Element->MoonHSV, False); diff --git a/generated/serdes_struct_camera.h b/generated/serdes_struct_camera.h index 4aecdd14c..c102b51cc 100644 --- a/generated/serdes_struct_camera.h +++ b/generated/serdes_struct_camera.h @@ -93,6 +93,13 @@ Serialize(u8_cursor_block_array *Bytes, camera *BaseElement, umm Count = 1) + Result &= Serialize(Bytes, &Element->Speed); // default + + + + + + Result &= Serialize(Bytes, &Element->Front); // default @@ -229,6 +236,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Speed, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Front, Memory); diff --git a/generated/serdes_struct_lighting_settings.h b/generated/serdes_struct_lighting_settings.h index 6cde59377..2f316bb8a 100644 --- a/generated/serdes_struct_lighting_settings.h +++ b/generated/serdes_struct_lighting_settings.h @@ -41,6 +41,13 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings *BaseElement, umm Coun + Result &= Serialize(Bytes, &Element->tDaySpeed); // default + + + + + + Result &= Serialize(Bytes, &Element->tDay); // default @@ -62,7 +69,7 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings *BaseElement, umm Coun - Result &= Serialize(Bytes, &Element->DawnColor); // default + Result &= Serialize(Bytes, &Element->DawnHSV); // default @@ -76,7 +83,7 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings *BaseElement, umm Coun - Result &= Serialize(Bytes, &Element->SunColor); // default + Result &= Serialize(Bytes, &Element->SunHSV); // default @@ -97,6 +104,13 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings *BaseElement, umm Coun + Result &= Serialize(Bytes, &Element->DuskHSV); // default + + + + + + Result &= Serialize(Bytes, &Element->MoonIntensity); // default @@ -104,7 +118,7 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings *BaseElement, umm Coun - Result &= Serialize(Bytes, &Element->MoonColor); // default + Result &= Serialize(Bytes, &Element->MoonHSV); // default @@ -142,6 +156,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->tDaySpeed, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->tDay, Memory); @@ -168,7 +190,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->DawnColor, Memory); + Result &= Deserialize(Bytes, &Element->DawnHSV, Memory); @@ -184,7 +206,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->SunColor, Memory); + Result &= Deserialize(Bytes, &Element->SunHSV, Memory); @@ -206,6 +228,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->DuskHSV, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->MoonIntensity, Memory); @@ -216,7 +246,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->MoonColor, Memory); + Result &= Deserialize(Bytes, &Element->MoonHSV, Memory); diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 4299f6db0..265a5366b 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -430,7 +430,6 @@ Bonsai_Simulate(engine_resources *Resources) // cp CameraTargetP = {}; - input *InputForCamera = &Plat->Input; entity *CameraGhost = GetEntity(EntityTable, Camera->GhostId); if (CameraGhost == 0) @@ -453,7 +452,7 @@ Bonsai_Simulate(engine_resources *Resources) b32 DoZoomDelta = UiHoveredMouseInput(Ui) == False; v2 MouseDelta = GetMouseDelta(Plat); - UpdateGameCamera(World, MouseDelta, InputForCamera, CameraTargetP, Camera, Plat->dt, DoPositionDelta, DoZoomDelta); + UpdateGameCamera(World, MouseDelta, &Plat->Input, CameraTargetP, Camera, Plat->dt, DoPositionDelta, DoZoomDelta); // TODO(Jesse)(correctness, nopush): This should actually be passing the back-buffer resolution?? @@ -498,10 +497,10 @@ UpdateKeyLightColor(graphics *Graphics, r32 tDay) lighting_settings *Lighting = &Graphics->Settings.Lighting; - v3 DawnColor = Normalize(Lighting->DawnColor) * Lighting->DawnIntensity; - v3 SunColor = Normalize(Lighting->SunColor ) * Lighting->SunIntensity; - v3 DuskColor = Normalize(Lighting->DuskColor) * Lighting->DuskIntensity; - v3 MoonColor = Normalize(Lighting->MoonColor) * Lighting->MoonIntensity; + v3 DawnColor = HSVtoRGB(Lighting->DawnHSV) * Lighting->DawnIntensity; + v3 SunColor = HSVtoRGB(Lighting->SunHSV ) * Lighting->SunIntensity; + v3 DuskColor = HSVtoRGB(Lighting->DuskHSV) * Lighting->DuskIntensity; + v3 MoonColor = HSVtoRGB(Lighting->MoonHSV) * Lighting->MoonIntensity; Lighting->SunP.x = Sin(((Graphics->SunBasis.x*PI32)) + tDay); Lighting->SunP.y = Cos(((Graphics->SunBasis.y*PI32))+ tDay); @@ -557,7 +556,7 @@ Bonsai_Render(engine_resources *Engine) if (Graphics->Settings.Lighting.AutoDayNightCycle) { - Graphics->Settings.Lighting.tDay += Plat->dt/18.0f; + Graphics->Settings.Lighting.tDay += SafeDivide0(Plat->dt, Graphics->Settings.Lighting.tDaySpeed); } UpdateKeyLightColor(Graphics, Graphics->Settings.Lighting.tDay); diff --git a/src/engine/camera.cpp b/src/engine/camera.cpp index 6daaca0f9..345edc47a 100644 --- a/src/engine/camera.cpp +++ b/src/engine/camera.cpp @@ -174,6 +174,7 @@ link_internal void StandardCamera(camera* Camera, f32 FarClip, f32 DistanceFromTarget, f32 Blend) { Clear(Camera); + *Camera = {}; Camera->Blend = Blend; @@ -184,7 +185,7 @@ StandardCamera(camera* Camera, f32 FarClip, f32 DistanceFromTarget, f32 Blend) // Someone already set FOV .. probably when deserializing stored runtime settings. if (Camera->Frust.FOV == 0.f) { - Camera->Frust.FOV = 45.0f; + Camera->Frust.FOV = 75.0f; } Camera->Up = WORLD_Z; diff --git a/src/engine/camera.h b/src/engine/camera.h index 24c211e6d..47bf1df12 100644 --- a/src/engine/camera.h +++ b/src/engine/camera.h @@ -14,7 +14,7 @@ struct plane Assert(Normal.x*P.x + Normal.y*P.y + Normal.z*P.z + this->d == 0); } - plane() {} + plane() { Clear(this); } }; struct frustum @@ -51,6 +51,7 @@ struct camera poof(@version(2)) r32 TargetDistanceFromTarget; r32 Blend; // How fast the camera interpolates. 0 is instant, 0.1f is verrry slow + r32 Speed = 2.25f; // How fast the camera ghost moves v3 Front; v3 Right; diff --git a/src/engine/entity.cpp b/src/engine/entity.cpp index ea83c1e52..1000a5004 100644 --- a/src/engine/entity.cpp +++ b/src/engine/entity.cpp @@ -1511,7 +1511,7 @@ SimulateEntity(engine_resources *Resources, entity *Entity, r32 dt, v3i VisibleR { if (UiCapturedMouseInput(Ui) == False) { - f32 CameraSpeed = Camera->DistanceFromTarget * Camera->Blend/100.f; + f32 CameraSpeed = Camera->Speed * (Camera->DistanceFromTarget * Camera->Blend/100.f); v3 Offset = GetCameraRelativeInput(Hotkeys, Camera); Offset.z = 0; // Constrain to XY plane diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index ea3f43128..c8111fac1 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -530,19 +530,19 @@ DefaultRenderSettings(render_settings *Settings, engine_settings *EngineSettings { lighting_settings *Lighting = &Settings->Lighting; - Lighting->tDay = 0.75f; + Lighting->tDay = -1.5f; Lighting->SunP = V3(-1.f, -1.f, 0.35f); - Lighting->DawnColor = V3(0.37f, 0.11f, 0.10f); - Lighting->SunColor = V3(0.17f, 0.13f, 0.17f); - Lighting->DuskColor = V3(0.13f, 0.12f, 0.14f); - Lighting->MoonColor = V3(0.04f, 0.07f, 0.18f); + Lighting->DawnHSV = V3(0.11f, 0.48f, 0.87f); + Lighting->SunHSV = V3(0.00f, 0.00f, 0.00f); + Lighting->DuskHSV = V3(0.74f, 0.35f, 0.38f); + Lighting->MoonHSV = V3(0.63f, 0.15f, 0.22f); + Lighting->DawnIntensity = 0.78f; Lighting->SunIntensity = 1.10f; - Lighting->MoonIntensity = 0.10f; - Lighting->DawnIntensity = 0.70f; - Lighting->DuskIntensity = 0.50f; + Lighting->DuskIntensity = 0.66f; + Lighting->MoonIntensity = 0.18f; } } diff --git a/src/engine/render_settings.h b/src/engine/render_settings.h index 1aea180bc..cc3d6c4cc 100644 --- a/src/engine/render_settings.h +++ b/src/engine/render_settings.h @@ -11,22 +11,24 @@ enum tone_mapping_type struct lighting_settings { b8 AutoDayNightCycle; + r32 tDaySpeed = 10.f; poof(@ui_value_range(1.f, 30.f)) r32 tDay; poof(@ui_value_range(-PI32, PI32)) v3 SunP; poof(@ui_skip) f32 DawnIntensity; poof(@ui_value_range(0.f, 3.f)) - v3 DawnColor; + v3 DawnHSV; poof(@custom_ui(PushColumn(Ui, CSz("DawnColor")); DoColorPickerToggle(Ui, Window, &Element->DawnHSV, False))) f32 SunIntensity; poof(@ui_value_range(0.f, 3.f)) - v3 SunColor; + v3 SunHSV; poof(@custom_ui(PushColumn(Ui, CSz("SunColor")); DoColorPickerToggle(Ui, Window, &Element->SunHSV, False))) f32 DuskIntensity; poof(@ui_value_range(0.f, 3.f)) v3 DuskColor; + v3 DuskHSV; poof(@custom_ui(PushColumn(Ui, CSz("DuskColor")); DoColorPickerToggle(Ui, Window, &Element->DuskHSV, False))) f32 MoonIntensity; poof(@ui_value_range(0.f, 3.f)) - v3 MoonColor; + v3 MoonHSV; poof(@custom_ui(PushColumn(Ui, CSz("MoonColor")); DoColorPickerToggle(Ui, Window, &Element->MoonHSV, False))) // Computed from the above parameters and passed to the shader v3 CurrentSunColor; From b8522c59afc757db94537c8c90e4f81aa300effa Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 14 Jun 2025 14:11:01 -0700 Subject: [PATCH 299/421] Update debug --- external/bonsai_debug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_debug b/external/bonsai_debug index ce4d42e5b..5f31a8438 160000 --- a/external/bonsai_debug +++ b/external/bonsai_debug @@ -1 +1 @@ -Subproject commit ce4d42e5b9503e07464ac4e8c6ed3d41eaf4a7aa +Subproject commit 5f31a8438ac14a28a1457cdc0c1f9c0e25cbfa7d From c5a3f737178e59b47e3f49bd09d6ade6381c8991 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 15 Jun 2025 11:27:28 -0700 Subject: [PATCH 300/421] Working on eliminating flashing when editing world --- .../do_editor_ui_for_compound_type_world.h | 25 +++ generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- jesse.make.sh | 4 +- src/engine/api.cpp | 21 ++- src/engine/editor.cpp | 2 +- src/engine/render_loop.cpp | 12 +- src/engine/world.cpp | 172 +++++++++++------- src/engine/world.h | 7 +- src/engine/world_chunk.cpp | 13 +- src/engine/world_chunk.h | 4 +- 12 files changed, 177 insertions(+), 89 deletions(-) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 64e2f5ad5..639469616 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -170,6 +170,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r + } + + + { + + + + cs MemberName = CSz("MaxOctreeNodesToQueuePerFrame"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->MaxOctreeNodesToQueuePerFrame), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + } diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 55fab436d..79c557329 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3073:0 +// src/engine/world_chunk.cpp:3079:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index a2530c566..b5155369f 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2087:0 +// src/engine/world_chunk.cpp:2093:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 4c4b90319..2911f9b84 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2090:0 +// src/engine/world_chunk.cpp:2096:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/jesse.make.sh b/jesse.make.sh index 11051035c..bbc35e240 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 @@ -11,7 +11,7 @@ OPT="-O2" ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ - BuildExecutables \ + # BuildExecutables \ # BuildTests \ # BuildSingleExample examples/ui_test \ # BuildSingleExample examples/blank_project \ diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 265a5366b..ebaa8c90f 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -731,7 +731,8 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ if (FacesRequired) { /* Info("Chunk faces (%d)", FacesRequired); */ - PushBonsaiRenderCommandAllocateAndMapGpuElementBuffer(RenderQ, DataType_v3_u8, u32(FacesRequired*6), &SynChunk->Mesh, SynChunk, DestChunk); + PushBonsaiRenderCommandAllocateAndMapGpuElementBuffer( + RenderQ, DataType_v3_u8, u32(FacesRequired*VERTS_PER_FACE), &SynChunk->Mesh, SynChunk, DestChunk); } else { @@ -775,10 +776,9 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ RebuildWorldChunkMesh(Thread, SynChunk, {}, {}, MeshBit_Lod0, &GpuMappedBuf->Buffer, Thread->TempMemory); - if (HasGpuMesh(&DestChunk->Mesh) == True) - { - PushDeallocateBuffersCommand(RenderQ, &DestChunk->Mesh.Handles); - } + auto HandlesToDeallocate = DestChunk->Mesh.Handles; + b32 DeallocateHandles = HasGpuMesh(&DestChunk->Mesh) == True; + if (DeallocateHandles) { Assert(DestChunk->Flags&Chunk_VoxelsInitialized); } DestChunk->Mesh = *GpuMappedBuf; SynChunk->Mesh = {}; @@ -790,6 +790,11 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); PushBonsaiRenderCommandUnmapGpuElementBuffer(RenderQ, &DestChunk->Mesh, DestChunk); + if (DeallocateHandles) + { + PushDeallocateBuffersCommand(RenderQ, &HandlesToDeallocate); + } + // TODO(Jesse)(bug, race): There's a race here; the chunk can get deallocated on the // main thread and clear the Mesh before the Unmap job happens. Have to somehow @@ -805,6 +810,10 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ } break; { tmatch(work_queue_entry_init_world_chunk, Entry, Job) + +#if 1 + NotImplemented; +#else world_chunk *Chunk = Job->Chunk; counted_string AssetFilename = GetAssetFilenameFor(Global_AssetPrefixPath, Chunk->WorldP, Thread->TempMemory); @@ -826,8 +835,8 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ Assert(Chunk->Dim == World->ChunkDim); u32 Octaves = 1; /* InitializeChunkWithNoise( Terrain_Perlin2D, Thread, Chunk, Chunk->Dim, &AssetFile, V3(Period), Amplititude, StartingZDepth, Color, MeshBit_Lod0, ChunkInitFlag_ComputeStandingSpots, &Octaves); */ - NotImplemented; } +#endif } break; diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index f83871fd7..674480d24 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1710,7 +1710,7 @@ DropEditFromOctree(engine_resources *Engine, world_edit *Edit, memory_arena *Tem // Need to reinitialize chunks that no longer have the edit so that it // doesn't stay intact in chunks that lose it entirely - Node->Dirty = True;; + Node->Dirty = True; ReleaseFutex(&Node->Lock); } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 5229e3bcc..3d4cd0b6e 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -109,15 +109,10 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { tmatch(bonsai_render_command_allocate_and_map_gpu_element_buffer, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_allocate_and_map_gpu_element_buffer); - /* Assert(HasGpuMesh(Command->Dest) == 0); */ - /* Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 0); */ - /* Command->Dest[0] = AllocateAndMapGpuBuffer(Command->Type, Command->ElementCount); */ - ReallocateGpuBuffers(&Command->Dest->Handles, Command->Type, Command->ElementCount); MapGpuBuffer_untextured_3d_geometry_buffer(Command->Dest); Assert(HasGpuMesh(Command->Dest) == 1); - /* Assert(HasGpuMesh(&Command->DestChunk->Mesh) == 1); */ auto Next = WorkQueueEntry(WorkQueueEntryBuildWorldChunkMesh(Command->SynChunk, Command->DestChunk)); PushWorkQueueEntry(LowPriorityQ, &Next); @@ -125,9 +120,10 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { tmatch(bonsai_render_command_unmap_gpu_element_buffer, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_unmap_gpu_element_buffer); - FlushBuffersToCard(Command->Buf); + FlushBuffersToCard(Command->Buf); FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*, Command->Chunk))); + } break; { tmatch(bonsai_render_command_unmap_and_deallocate_buffer, RenderCommand, Command) @@ -735,7 +731,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } #endif - /* DrawWorldAndEntitiesToShadowMap(GetShadowMapResolution(&Engine->Settings), Engine); */ + DrawWorldAndEntitiesToShadowMap(GetShadowMapResolution(&Engine->Settings), Engine); // TODO(Jesse): Move into engine debug world_chunk *C = EngineDebug->PickedNode ? EngineDebug->PickedNode->Chunk : 0; @@ -753,7 +749,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) if (GpuMap->Buffer.At) { RenderImmediateGeometryToGBuffer(GetApplicationResolution(&Engine->Settings), GpuMap, Graphics); - /* RenderImmediateGeometryToShadowMap(GpuMap, Graphics); */ + RenderImmediateGeometryToShadowMap(GpuMap, Graphics); } Clear(&GpuMap->Buffer); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index a2e36be94..49c246bf9 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -3,9 +3,9 @@ debug_global u32 DeferrFreedNodes; debug_global u32 FreedNodes; link_internal world * -AllocateWorld(world* World, v3i Center, v3i WorldChunkDim, visible_region_size VisibleRegionSize) +AllocateWorld(world *World, v3i Center, v3i WorldChunkDim, visible_region_size VisibleRegionSize) { - Clear(World); + *World = {}; memory_arena *WorldChunkMemory = AllocateArena(Gigabytes(2)); World->ChunkMemory = WorldChunkMemory; @@ -428,17 +428,20 @@ GetParentNodeFor(world *World, octree_node *QueryNode) } link_internal b32 -CountsAsDrawableOrUnmeshed(octree_node *Node) +CanDrawOrHadNoSurface(octree_node *Node) { - b32 Result = True; + b32 Result = False; - if (world_chunk *Chunk = Node->Chunk) + if (Node->HadNoVisibleSurface) { - Result = HasGpuMesh(&Chunk->Mesh); + Result = True; } else { - Result = Node->HadNoVisibleSurface; + if (world_chunk *Chunk = Node->Chunk) + { + Result = HasGpuMesh(&Chunk->Mesh); + } } return Result; @@ -609,13 +612,14 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) } -link_internal void +link_internal b32 PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_priority_queue *Queue, octree_node *Node, octree_node *Parent) { - if (Node->Chunk) - { - Assert(Node->Chunk->Flags == Chunk_Uninitialized); - } + b32 Result = False; + /* if (Node->Chunk) */ + /* { */ + /* Assert(Node->Chunk->Flags == Chunk_Uninitialized); */ + /* } */ s32 IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, 2*Node->Resolution.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); @@ -641,11 +645,20 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio IdealListIndex = Max(0, IdealListIndex-10); } + // Prefer chunks who are dirty + if (Node->Dirty) + { + IdealListIndex = Max(0, IdealListIndex-10); + } + Assert(IdealListIndex >= 0 && IdealListIndex < OCTREE_PRIORITY_QUEUE_LIST_COUNT); if (Remaining(&Queue->Lists[IdealListIndex])) { Push(&Queue->Lists[IdealListIndex], Node); + Result = True; } + + return Result; } @@ -682,7 +695,7 @@ FreeOctreeNode(engine_resources *Engine, octree_node **Bucket) while (TestNode) { Assert(TestNode != Node); TestNode = TestNode->Next; } } - // NOTE(Jesse): This is a bug waiting to happen. Pretty sure this could + // TODO(Jesse, bug): This is a bug waiting to happen. Pretty sure this could // accidentally persist the Chunk_Queued flag after the worker thread had // un-set it and therefore jam up the DeferFreelist (forever waiting on // a "Queued" chunk that's not actually queued). @@ -730,8 +743,6 @@ FreeOctreeChildren(engine_resources *Engine, octree_node *Node) FreeOctreeNode(Engine, Node->Children+6); FreeOctreeNode(Engine, Node->Children+7); - /* QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); */ - u32 Result = 1; return Result; } @@ -756,7 +767,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue { if (HasGpuMesh(&Chunk->Mesh) == False) { - Assert( (Chunk->Flags & Chunk_Queued) == False); + /* Assert( (Chunk->Flags & Chunk_Queued) == False); */ /* if (Chunk->WorldP == V3i(0,0,0)) { RuntimeBreak(); } */ Assert(Chunk->FilledCount == 0 || Chunk->FilledCount == Volume(Chunk->Dim)); Assert(HasGpuMesh(&Chunk->Mesh) == 0); @@ -848,20 +859,27 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue link_internal b32 ChildrenCanDrawOrHadNoMesh(octree_node *Node) { - b32 Result = CountsAsDrawableOrUnmeshed(Node->Children[0]); - Result &= CountsAsDrawableOrUnmeshed(Node->Children[1]); - Result &= CountsAsDrawableOrUnmeshed(Node->Children[2]); - Result &= CountsAsDrawableOrUnmeshed(Node->Children[3]); - Result &= CountsAsDrawableOrUnmeshed(Node->Children[4]); - Result &= CountsAsDrawableOrUnmeshed(Node->Children[5]); - Result &= CountsAsDrawableOrUnmeshed(Node->Children[6]); - Result &= CountsAsDrawableOrUnmeshed(Node->Children[7]); + b32 Result = CanDrawOrHadNoSurface(Node->Children[0]); + Result &= CanDrawOrHadNoSurface(Node->Children[1]); + Result &= CanDrawOrHadNoSurface(Node->Children[2]); + Result &= CanDrawOrHadNoSurface(Node->Children[3]); + Result &= CanDrawOrHadNoSurface(Node->Children[4]); + Result &= CanDrawOrHadNoSurface(Node->Children[5]); + Result &= CanDrawOrHadNoSurface(Node->Children[6]); + Result &= CanDrawOrHadNoSurface(Node->Children[7]); return Result; } link_internal void -DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_ptr_paged_list *MainDrawList, world_chunk_ptr_paged_list *ShadowMapDrawList, u32 Depth = 0) +DrawOctreeRecursive( engine_resources *Engine, + octree_node *Node, + octree_node *Parent, + octree_node_priority_queue *Queue, + world_chunk_ptr_paged_list *MainDrawList, + world_chunk_ptr_paged_list *ShadowMapDrawList, + octree_stats *Stats, + u32 Depth = 0 ) { UNPACK_ENGINE_RESOURCES(Engine); world_chunk *Chunk = Node->Chunk; @@ -892,23 +910,26 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt if (ChildrenCanDrawOrHadNoMesh(Node)) { - DrawOctreeRecursive(Engine, Node->Children[0], MainDrawList, ShadowMapDrawList, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[1], MainDrawList, ShadowMapDrawList, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[2], MainDrawList, ShadowMapDrawList, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[3], MainDrawList, ShadowMapDrawList, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[4], MainDrawList, ShadowMapDrawList, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[5], MainDrawList, ShadowMapDrawList, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[6], MainDrawList, ShadowMapDrawList, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[7], MainDrawList, ShadowMapDrawList, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[0], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[1], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[2], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[3], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[4], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[5], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[6], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[7], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); } else { // Draw ourselves; the mesh composed of the children has a hole. if (Node->Dirty) { - ReinitializeOctreeNode(Engine, Node); + // Don't reinit dirty branch chunks; it causes a feedback loop and + // causes the whole tree up to the root node to reinit, which we + // don't want or need. + /* ReinitializeOctreeNode(Engine, Node, Stats); */ } - else + /* else */ { if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) { @@ -939,29 +960,27 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, world_chunk_pt { if (Node->Dirty) { - ReinitializeOctreeNode(Engine, Node); + ReinitializeOctreeNode(Engine, Node, Parent, Queue, Stats); } - else + + if (Chunk) { - if (Chunk) + if (EngineDebug->DrawLeafNodes) { - if (EngineDebug->DrawLeafNodes) + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + } + + if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) + { + if (EngineDebug->DrawNodesWithChunks) { DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); } - if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) + if (HasGpuMesh(&Chunk->Mesh)) { - if (EngineDebug->DrawNodesWithChunks) - { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); - } - - if (HasGpuMesh(&Chunk->Mesh)) - { - Push(MainDrawList, Chunk); - Push(ShadowMapDrawList, Chunk); - } + Push(MainDrawList, Chunk); + Push(ShadowMapDrawList, Chunk); } } } @@ -1044,8 +1063,14 @@ MaintainWorldOctree(engine_resources *Engine) // NOTE(Jesse): Must be signed because we can force queue chunks in different // ways (editing), which can cause (MAX_OCTREE_NODES_QUEUED_PER_FRAME - ChunksCurrentlyQueued) to be negative - s32 MaxToQueueThisFrame = Max(0, MAX_OCTREE_NODES_QUEUED_PER_FRAME - ChunksCurrentlyQueued); - Assert(MaxToQueueThisFrame <= MAX_OCTREE_NODES_QUEUED_PER_FRAME); + s32 MaxToQueueThisFrame = Max(0, World->MaxOctreeNodesToQueuePerFrame - ChunksCurrentlyQueued); + + /* if (MaxToQueueThisFrame != MAX_OCTREE_NODES_QUEUED_PER_FRAME) */ + /* { */ + /* Info("MaxToQueueThisFrame(%d)", MaxToQueueThisFrame); */ + /* } */ + + Assert(MaxToQueueThisFrame <= World->MaxOctreeNodesToQueuePerFrame); /* DEBUG_VALUE_u32(MaxToQueueThisFrame); */ /* DEBUG_VALUE_u32(u32(ChunksCurrentlyQueued)); */ @@ -1060,21 +1085,35 @@ MaintainWorldOctree(engine_resources *Engine) /* DEBUG_VALUE_u32(ReusedNode); */ /* DEBUG_VALUE_u32(AllocatedNode); */ + + + DrawOctreeRecursive(Engine, &World->Root, 0, &Queue, MainDrawList, ShadowMapDrawList, &Stats); + + { + octree_node_ptr_cursor List = Queue.Lists[498]; + /* Info("(%p) (%p) (%p)", List.Start, List.At, List.End); */ + } + s32 NumQueuedThisFrame = 0; if (MaxToQueueThisFrame) { RangeIterator(ListIndex, OCTREE_PRIORITY_QUEUE_LIST_COUNT) + /* IterateOver(Queue.Lists, List, ListIndex) */ { octree_node_ptr_cursor List = Queue.Lists[ListIndex]; - RangeIterator(BucketIndex, OCTREE_PRIORITY_QUEUE_LIST_LENGTH) + /* RangeIterator(BucketIndex, OCTREE_PRIORITY_QUEUE_LIST_LENGTH) */ + IterateOver(&List, NodeP, NPIndex) { - octree_node **NodeP = GetPtr(&List, umm(BucketIndex)); + /* octree_node **NodeP = GetPtr(&List, umm(BucketIndex)); */ + /* Info("ListIndex(%d) NodeP(%p)", ListIndex, NodeP); */ if (NodeP) { octree_node *Node = *NodeP; + /* Info("Node(%p)", Node); */ if (Node->HadNoVisibleSurface) { - Assert(Node->Chunk == 0); + // We can actually have a chunk when we reallocate for an edit + /* Assert(Node->Chunk == 0); */ } else { @@ -1086,13 +1125,15 @@ MaintainWorldOctree(engine_resources *Engine) { Node->Chunk = GetFreeWorldChunk(World); WorldChunk(Node->Chunk, Node->WorldP, GetWorldChunkDim(), Node->Resolution); - /* Node->Chunk = AllocateWorldChunk(Node->WorldP, World->ChunkDim, Node->Resolution, World->ChunkMemory); */ } - /* QueueChunkForInit(&Plat->LowPriority, Node->Chunk, MeshBit_Lod0); */ - QueueChunkForInit(&Plat->RenderQ, Node, MeshBit_Lod0); - ++Stats.NewQueues; - if (++NumQueuedThisFrame == MaxToQueueThisFrame) goto done_queueing_nodes; + if ( NotSet(Node->Chunk->Flags, Chunk_Queued) ) + { + Node->Dirty = False; + QueueChunkForInit(&Plat->RenderQ, Node, MeshBit_Lod0); + ++Stats.NewQueues; + if (++NumQueuedThisFrame == MaxToQueueThisFrame) goto done_queueing_nodes; + } } } else @@ -1104,10 +1145,15 @@ MaintainWorldOctree(engine_resources *Engine) } done_queueing_nodes: - DrawOctreeRecursive(Engine, &World->Root, MainDrawList, ShadowMapDrawList); - DEBUG_OctreeTraversal(Engine, &World->Root, &Stats); - /* Info("TotalLeaves(%d) TotalBranches(%d) TotalQueued(%d) NewQueues(%d)", Stats.TotalLeaves, Stats.TotalBranches, Stats.TotalQueued, Stats.NewQueues); */ + if (Stats.TotalQueued || Stats.NewQueues) + { + Info("TotalLeaves(%d) TotalBranches(%d) TotalQueued(%d) NewQueues(%d)", + Stats.TotalLeaves, + Stats.TotalBranches, + Stats.TotalQueued, + Stats.NewQueues); + } } diff --git a/src/engine/world.h b/src/engine/world.h index e9dac3c0a..9f3af8171 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -103,6 +103,9 @@ struct world octree_node_freelist OctreeNodeFreelist; octree_node_freelist OctreeNodeDeferFreelist; // Chunks that were queued, to be freed later. +#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (72) + s32 MaxOctreeNodesToQueuePerFrame = MAX_OCTREE_NODES_QUEUED_PER_FRAME; +#undef MAX_OCTREE_NODES_QUEUED_PER_FRAME bonsai_futex ChunkFreelistFutex; poof(@ui_skip) world_chunk ChunkFreelistSentinal; poof(@ui_skip) @@ -249,7 +252,6 @@ TryGetVoxel(world *World, cp P) #define OCTREE_PRIORITY_QUEUE_LIST_COUNT (512) #define OCTREE_PRIORITY_QUEUE_LIST_LENGTH (128) -#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (72) struct octree_node_priority_queue { octree_node_ptr_cursor Lists[OCTREE_PRIORITY_QUEUE_LIST_COUNT]; @@ -287,3 +289,6 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue link_internal rect3 GetSimSpaceAABB(world *World, octree_node *Node); + +link_internal b32 +PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_priority_queue *Queue, octree_node *Node, octree_node *Parent); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 58a6ea411..27689d754 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -456,8 +456,10 @@ FreeWorldChunk(engine_resources *Engine, world_chunk *Chunk) } link_internal void -ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node) +ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node, octree_node *Parent, octree_node_priority_queue *Queue, octree_stats *Stats) { + UNPACK_ENGINE_RESOURCES(Engine); + Assert(!FutexIsSignaled(&Node->Lock)); AcquireFutex(&Node->Lock); @@ -472,10 +474,14 @@ ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node) } Node->HadNoVisibleSurface = False; - Node->Dirty = 0; - WorldChunk(Node->Chunk, Node->WorldP, Engine->World->ChunkDim, Node->Resolution); +#if 0 QueueChunkForInit(&Engine->Stdlib.Plat.RenderQ, Node, MeshBit_None); + ++Stats->NewQueues; +#else + Info("pushed"); + PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Node, Parent); +#endif ReleaseFutex(&Node->Lock); } @@ -4113,7 +4119,6 @@ GetChunksIntersectingRay(world *World, ray *Ray, picked_world_chunk_static_buffe { world_position P = World_Position(x,y,z); /* world_chunk *Chunk = GetWorldChunkFromHashtable( World, P ); */ - if (octree_node *Node = GetWorldChunkFromOctree( World, P )) { if (world_chunk *Chunk = Node->Chunk) diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 2ee37d134..c8307f564 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -620,12 +620,14 @@ MarshalMagicaVoxelEncodedColors(voxel *Src, voxel *Dest, v3i Dim) } struct octree_node; +struct octree_stats; +struct octree_node_priority_queue; link_internal void DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk); link_internal void -ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node); +ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node, octree_node *Parent, octree_node_priority_queue *Queue, octree_stats *Stats); link_internal s32 MarkBoundaryVoxels_MakeExteriorFaces(u64 *Occupancy, voxel *Voxels, chunk_dimension SrcChunkDim, chunk_dimension SrcChunkMin, chunk_dimension SrcChunkMax ); From 1a55d7abe86d38f01748d2ef698f0f0a26961248 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 15 Jun 2025 16:23:10 -0700 Subject: [PATCH 301/421] Move chunk_flags from world_chunk -> octree_node --- examples/terrain_gen/game.cpp | 4 +- generated/are_equal_octree_node.h | 2 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- .../block_array_octree_node_ptr_688853862.h | 2 +- ...block_array_picked_octree_node_688853862.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/buffer_octree_node_ptr.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- ..._work_queue_entry__bonsai_render_command.h | 12 +- ...o_editor_ui_for_compound_type_chunk_data.h | 24 -- ..._editor_ui_for_compound_type_octree_node.h | 24 ++ ..._editor_ui_for_compound_type_world_chunk.h | 42 ++-- generated/freelist_allocator_octree_node.h | 2 +- generated/freelist_allocator_world_chunk.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- generated/maybe_standing_spot.h | 2 +- ..._work_queue_entry__bonsai_render_command.h | 12 +- generated/serdes_struct_world_chunk.h | 15 ++ ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- src/engine/api.cpp | 32 ++- src/engine/asset.cpp | 7 +- src/engine/asset.h | 5 +- src/engine/bonsai.h | 13 +- src/engine/chunk.cpp | 2 +- src/engine/debug.cpp | 12 +- src/engine/debug_draw.cpp | 11 + src/engine/graphics.h | 2 +- src/engine/loaders/vox.cpp | 2 +- src/engine/render_command.h | 6 +- src/engine/render_loop.cpp | 14 +- src/engine/resources.cpp | 8 +- src/engine/work_queue.h | 6 +- src/engine/world.cpp | 32 ++- src/engine/world.h | 1 + src/engine/world_chunk.cpp | 211 +++++++++--------- src/engine/world_chunk.h | 13 +- src/engine/world_update.cpp | 10 +- 43 files changed, 297 insertions(+), 259 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 2341d82ac..5a98df9b4 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -385,14 +385,16 @@ BONSAI_API_WORKER_THREAD_CALLBACK() volatile work_queue_entry_init_world_chunk *Job = SafeAccess(work_queue_entry_init_world_chunk, Entry); world_chunk *Chunk = Job->Chunk; + NotImplemented; +#if 0 if (ChunkIsGarbage(Chunk)) { // NOTE(Jesse): This is an optimization; the engine marks chunks that // have moved outside of the visible region as garbage. - NotImplemented; /* Chunk->Flags = Chunk_Uninitialized; */ } else +#endif { auto GenType = GetEngineResources()->GameState->TerrainGenType; diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index 23c35d599..e04a1a524 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:71:0 +// src/engine/world.h:72:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index a2e921c92..54e17b378 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:427:0 +// src/engine/world_chunk.h:428:0 diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 07ebd8da5..4073e716c 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:85:0 +// src/engine/world.h:86:0 diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index c49c0a0de..dbf097072 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:88:0 +// src/engine/world.h:89:0 diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 3e3a3570a..0a3181a51 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:462:0 +// src/engine/world_chunk.h:463:0 diff --git a/generated/buffer_octree_node_ptr.h b/generated/buffer_octree_node_ptr.h index cdfbdf23d..9fc9be9a6 100644 --- a/generated/buffer_octree_node_ptr.h +++ b/generated/buffer_octree_node_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world.h:62:0 +// src/engine/world.h:63:0 struct octree_node_ptr_buffer { diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 4ec25fe99..7d32bb6d2 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:489:0 +// src/engine/world_chunk.h:490:0 struct standing_spot_buffer { diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index e537b4952..f8d7c2fbe 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:424:0 +// src/engine/world_chunk.h:425:0 struct world_chunk_ptr_buffer { diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index 5c51e9b99..c93463697 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -291,10 +291,10 @@ WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_cancel_all_noise_readba link_internal bonsai_render_command_initialize_noise_buffer -BonsaiRenderCommandInitializeNoiseBuffer( octree_node * Node ) +BonsaiRenderCommandInitializeNoiseBuffer( octree_node * DestNode ) { bonsai_render_command_initialize_noise_buffer Reuslt = { - .Node = Node + .DestNode = DestNode }; @@ -413,7 +413,7 @@ BonsaiRenderCommandDoStuff( u32 Ignored ) } link_internal bonsai_render_command_allocate_and_map_gpu_element_buffer -BonsaiRenderCommandAllocateAndMapGpuElementBuffer( data_type Type , u32 ElementCount , gpu_mapped_element_buffer * Dest , world_chunk * SynChunk , world_chunk * DestChunk ) +BonsaiRenderCommandAllocateAndMapGpuElementBuffer( data_type Type , u32 ElementCount , gpu_mapped_element_buffer * Dest , world_chunk * SynChunk , octree_node * DestNode ) { bonsai_render_command_allocate_and_map_gpu_element_buffer Reuslt = { .Type = Type @@ -424,7 +424,7 @@ BonsaiRenderCommandAllocateAndMapGpuElementBuffer( data_type Type , u32 Ele , .SynChunk = SynChunk , - .DestChunk = DestChunk + .DestNode = DestNode }; @@ -432,12 +432,12 @@ BonsaiRenderCommandAllocateAndMapGpuElementBuffer( data_type Type , u32 Ele } link_internal bonsai_render_command_unmap_gpu_element_buffer -BonsaiRenderCommandUnmapGpuElementBuffer( gpu_mapped_element_buffer * Buf , world_chunk * Chunk ) +BonsaiRenderCommandUnmapGpuElementBuffer( gpu_mapped_element_buffer * Buf , octree_node * DestNode ) { bonsai_render_command_unmap_gpu_element_buffer Reuslt = { .Buf = Buf -, .Chunk = Chunk +, .DestNode = DestNode }; diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 315ee7d8b..4b4a19109 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -29,30 +29,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - { - - - - cs MemberName = CSz("Flags"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(chunk_flag*, &Element->Flags), - MemberName, - Params - ); - - - - - - - - - - } - - { diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index a8592587b..723787219 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -29,6 +29,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + { + + + + cs MemberName = CSz("Flags"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(chunk_flag*, &Element->Flags), + MemberName, + Params + ); + + + + + + + + + + } + + { diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 5379f8eb2..258ae7f4d 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -57,11 +57,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - cs MemberName = CSz("Flags"); + cs MemberName = CSz("Dim"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(chunk_flag*, &Element->Flags), + Cast(v3i*, &Element->Dim), MemberName, Params ); @@ -81,11 +81,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - cs MemberName = CSz("Dim"); + cs MemberName = CSz("Occupancy"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v3i*, &Element->Dim), + Cast(u64*, Element->Occupancy), MemberName, Params ); @@ -97,7 +97,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - + PushNewRow(Ui); + } @@ -105,11 +106,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - cs MemberName = CSz("Occupancy"); + cs MemberName = CSz("xOccupancyBorder"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*, Element->Occupancy), + Cast(u64*, Element->xOccupancyBorder), MemberName, Params ); @@ -130,11 +131,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - cs MemberName = CSz("xOccupancyBorder"); + cs MemberName = CSz("FaceMasks"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*, Element->xOccupancyBorder), + Cast(u64*, Element->FaceMasks), MemberName, Params ); @@ -155,11 +156,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - cs MemberName = CSz("FaceMasks"); + cs MemberName = CSz("Voxels"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u64*, Element->FaceMasks), + Cast(voxel*, Element->Voxels), MemberName, Params ); @@ -171,8 +172,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - PushNewRow(Ui); - + } @@ -180,11 +180,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - cs MemberName = CSz("Voxels"); + cs MemberName = CSz("VoxelLighting"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(voxel*, Element->Voxels), + Cast(voxel_lighting*, Element->VoxelLighting), MemberName, Params ); @@ -204,13 +204,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name - cs MemberName = CSz("VoxelLighting"); - DoEditorUi(Ui, + cs MemberName = CSz("IsOnFreelist"); + DoEditorUi(Ui, Window, - // Cast to remove const/volatile keywords if they're there - Cast(voxel_lighting*, Element->VoxelLighting), + Cast(b8*, &Element->IsOnFreelist), MemberName, - Params + &DefaultUiRenderParams_Checkbox ); @@ -218,9 +217,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name + PushNewRow(Ui); - - } diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index 7a8db890d..88c184bf3 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:76:0 +// src/engine/world.h:77:0 struct octree_node_freelist { diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h index e6840fd64..94907803b 100644 --- a/generated/freelist_allocator_world_chunk.h +++ b/generated/freelist_allocator_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/world.h:79:0 +// src/engine/world.h:80:0 struct world_chunk_freelist { diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index d94dd13d1..c972905d0 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:82:0 +// src/engine/world.h:83:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index 951975919..c2f8a139b 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:73:0 +// src/engine/world.h:74:0 struct octree_node_ptr_stack { diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 1adaeaeb2..03ab78ed1 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:495:0 +// src/engine/world_chunk.h:496:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 79c557329..8dfc32142 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3079:0 +// src/engine/world_chunk.cpp:3076:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index 5ad370078..c655feffa 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:492:0 +// src/engine/world_chunk.h:493:0 struct standing_spot_stream_chunk { diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 5c66e849b..973870782 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.h:459:0 +// src/engine/world_chunk.h:460:0 struct maybe_standing_spot { diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index 293873196..77b43ec5b 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -3,11 +3,11 @@ link_internal void PushBonsaiRenderCommandInitializeNoiseBuffer( work_queue *RenderQueue - , octree_node* Node + , octree_node* DestNode ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandInitializeNoiseBuffer( Node ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandInitializeNoiseBuffer( DestNode ))); PushWorkQueueEntry(RenderQueue, &Work); } @@ -102,22 +102,22 @@ PushBonsaiRenderCommandDoStuff( link_internal void PushBonsaiRenderCommandAllocateAndMapGpuElementBuffer( work_queue *RenderQueue - , data_type Type , u32 ElementCount , gpu_mapped_element_buffer* Dest , world_chunk* SynChunk , world_chunk* DestChunk + , data_type Type , u32 ElementCount , gpu_mapped_element_buffer* Dest , world_chunk* SynChunk , octree_node* DestNode ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandAllocateAndMapGpuElementBuffer( Type , ElementCount , Dest , SynChunk , DestChunk ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandAllocateAndMapGpuElementBuffer( Type , ElementCount , Dest , SynChunk , DestNode ))); PushWorkQueueEntry(RenderQueue, &Work); } link_internal void PushBonsaiRenderCommandUnmapGpuElementBuffer( work_queue *RenderQueue - , gpu_mapped_element_buffer* Buf , world_chunk* Chunk + , gpu_mapped_element_buffer* Buf , octree_node* DestNode ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandUnmapGpuElementBuffer( Buf , Chunk ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandUnmapGpuElementBuffer( Buf , DestNode ))); PushWorkQueueEntry(RenderQueue, &Work); } diff --git a/generated/serdes_struct_world_chunk.h b/generated/serdes_struct_world_chunk.h index 3ce3d1d8a..9bd4645b5 100644 --- a/generated/serdes_struct_world_chunk.h +++ b/generated/serdes_struct_world_chunk.h @@ -69,6 +69,13 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) + Result &= Serialize(Bytes, &Element->IsOnFreelist); // default + + + + + + Result &= Serialize(Bytes, &Element->DimInChunks); // default @@ -181,6 +188,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->IsOnFreelist, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DimInChunks, Memory); diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index b5155369f..8f1410d57 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2093:0 +// src/engine/world_chunk.cpp:2088:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 2911f9b84..25324cb9a 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2096:0 +// src/engine/world_chunk.cpp:2091:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/src/engine/api.cpp b/src/engine/api.cpp index ebaa8c90f..c8f835ea5 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -685,14 +685,17 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ } break; { tmatch(work_queue_entry_finalize_noise_values, Entry, Job) - auto Chunk1 = Job->Chunk; + auto Node = Job->DestNode; + auto Chunk = Node->Chunk; + u16 *NoiseValues = Job->NoiseData; v3i NoiseDim = Job->NoiseDim; Assert(NoiseValues); + Assert(Chunk); - world_chunk *DestChunk = Chunk1; - world_chunk *SynChunk = GetOrAllocate(&UserData->SynChunkFreelist, {}, Chunk1->Dim + V3i(0, 2, 2), Chunk1->DimInChunks, Thread->PermMemory); - SynChunk->Flags = Chunk_Queued; + world_chunk *DestChunk = Node->Chunk; + world_chunk *SynChunk = GetOrAllocate(&UserData->SynChunkFreelist, {}, Chunk->Dim + V3i(0, 2, 2), Chunk->DimInChunks, Thread->PermMemory); + /* SynChunk->Flags = Chunk_Queued; */ Assert(NoiseDim == V3i(66, 66, 66)); Assert(SynChunk->Dim == V3i(64, 66, 66)); @@ -725,14 +728,14 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ Assert(DestChunk->FilledCount <= s32(Volume(DestChunk->Dim))); - FinalizeChunkInitialization(SynChunk); + /* FinalizeChunkInitialization(SynChunk); */ s32 FacesRequired = CountRequiredFacesForMesh_Naieve(SynChunk->FaceMasks, SynChunk->Dim); if (FacesRequired) { /* Info("Chunk faces (%d)", FacesRequired); */ PushBonsaiRenderCommandAllocateAndMapGpuElementBuffer( - RenderQ, DataType_v3_u8, u32(FacesRequired*VERTS_PER_FACE), &SynChunk->Mesh, SynChunk, DestChunk); + RenderQ, DataType_v3_u8, u32(FacesRequired*VERTS_PER_FACE), &SynChunk->Mesh, SynChunk, Node); } else { @@ -740,7 +743,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ { PushDeallocateBuffersCommand(RenderQ, &DestChunk->Mesh.Handles); } - FinalizeChunkInitialization(DestChunk); + FinalizeNodeInitializaion(Node); FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); } } @@ -751,7 +754,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ { PushDeallocateBuffersCommand(RenderQ, &DestChunk->Mesh.Handles); } - FinalizeChunkInitialization(DestChunk); + FinalizeNodeInitializaion(Node); FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); } @@ -768,9 +771,15 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ { tmatch(work_queue_entry_build_chunk_mesh, Entry, Job) +#if 0 + NotImplemented; +#else world_chunk *SynChunk = Job->SynChunk; - world_chunk *DestChunk = Job->DestChunk; + + octree_node *DestNode = Job->DestNode; + world_chunk *DestChunk = DestNode->Chunk; gpu_mapped_element_buffer *GpuMappedBuf = &SynChunk->Mesh; + /* Assert(HasGpuMesh(&DestChunk->Mesh) == True); */ Assert(HasGpuMesh(GpuMappedBuf) == True); @@ -778,7 +787,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ auto HandlesToDeallocate = DestChunk->Mesh.Handles; b32 DeallocateHandles = HasGpuMesh(&DestChunk->Mesh) == True; - if (DeallocateHandles) { Assert(DestChunk->Flags&Chunk_VoxelsInitialized); } + /* if (DeallocateHandles) { Assert(DestChunk->Flags&Chunk_VoxelsInitialized); } */ DestChunk->Mesh = *GpuMappedBuf; SynChunk->Mesh = {}; @@ -789,7 +798,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); - PushBonsaiRenderCommandUnmapGpuElementBuffer(RenderQ, &DestChunk->Mesh, DestChunk); + PushBonsaiRenderCommandUnmapGpuElementBuffer(RenderQ, &DestChunk->Mesh, DestNode); if (DeallocateHandles) { PushDeallocateBuffersCommand(RenderQ, &HandlesToDeallocate); @@ -803,6 +812,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ // nopush /* FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*, DestChunk))); */ +#endif } break; { tmatch(work_queue_entry_rebuild_mesh, Entry, Job) diff --git a/src/engine/asset.cpp b/src/engine/asset.cpp index e87b4b06c..3d612bf4a 100644 --- a/src/engine/asset.cpp +++ b/src/engine/asset.cpp @@ -358,7 +358,7 @@ DeserializeChunk(u8_stream *FileBytes, world_chunk *Result, memory_arena *PermMe /* Tag = Read_u32(FileBytes); */ /* Assert(Tag == WorldChunkFileTag_END); */ - Result->Flags = Chunk_VoxelsInitialized; + /* Result->Flags = Chunk_VoxelsInitialized; */ /* DebugLine("Loaded Chunk : P (%d,%d,%d) Standing Spots (%d)", Result->WorldP.x, Result->WorldP.y, Result->WorldP.z, Header.StandingSpotElementCount); */ } @@ -609,12 +609,13 @@ InitAsset(asset *Asset, thread_local_state *Thread) MarkBoundaryVoxels_MakeExteriorFaces(Chunk->Occupancy, Chunk->Voxels, Chunk->Dim, V3i(0), Chunk->Dim); - FinalizeChunkInitialization(Chunk); + /* FinalizeChunkInitialization(Chunk); */ data_type Type = GetMeshDatatypeForDimension(Chunk->Dim); auto *TempMesh = AllocateTempMesh(Thread->TempMemory, Type); - RebuildWorldChunkMesh(Thread, Chunk, V3i(0), Chunk->Dim, MeshBit_Lod0, TempMesh, Thread->TempMemory, Chunk->Dim/-2.f); + NotImplemented; + /* RebuildWorldChunkMesh(Thread, Chunk, V3i(0), Chunk->Dim, MeshBit_Lod0, TempMesh, Thread->TempMemory, Chunk->Dim/-2.f); */ Asset->Type = AssetType_WorldChunk; Asset->Chunk = *Chunk; diff --git a/src/engine/asset.h b/src/engine/asset.h index 37a41a0b3..00d6d8247 100644 --- a/src/engine/asset.h +++ b/src/engine/asset.h @@ -258,9 +258,12 @@ GetChunkDataForAssetModel(asset *Asset, u32 ModelIndex) { if (ModelIndex != 0) { Warn("Requested Dim for ModelIndex(%d) on an asset with Type(AssetType_WorldChunk), ignoring ModelIndex", ModelIndex); } + // NOTE(Jesse): Removed Flags from chunk_data .. does that matter here? + NotImplemented; + Result.Tag = Maybe_Yes; Result.Value = { - .Flags = Asset->Chunk.Flags, + /* .Flags = Asset->Chunk.Flags, */ .Dim = Asset->Chunk.Dim, .Voxels = Asset->Chunk.Voxels, .Occupancy = Asset->Chunk.Occupancy, diff --git a/src/engine/bonsai.h b/src/engine/bonsai.h index 7543ee15b..bc458434b 100644 --- a/src/engine/bonsai.h +++ b/src/engine/bonsai.h @@ -119,9 +119,9 @@ UnSetFlag( chunk_flag *Flags, chunk_flag Flag ) } inline void -UnSetFlag( world_chunk *Chunk, chunk_flag Flag ) +UnSetFlag( octree_node *Node, chunk_flag Flag ) { - UnSetFlag(&Chunk->Flags, Flag); + UnSetFlag(&Node->Flags, Flag); return; } @@ -148,9 +148,9 @@ SetFlag( chunk_flag *Flags, chunk_flag Flag ) /* } */ inline void -SetFlag( world_chunk *Chunk, chunk_flag Flag ) +SetFlag( octree_node *Node, chunk_flag Flag ) { - Chunk->Flags = (chunk_flag)(Chunk->Flags | Flag); + Node->Flags = (chunk_flag)(Node->Flags | Flag); return; } @@ -169,7 +169,7 @@ IsSet( chunk_flag Flags, chunk_flag Flag ) /* } */ inline b32 -IsSet( world_chunk *Chunk, chunk_flag Flag ) +IsSet( octree_node *Chunk, chunk_flag Flag ) { b32 Result = IsSet(Chunk->Flags, Flag); return Result; @@ -190,7 +190,7 @@ NotSet( chunk_flag Flags, chunk_flag Flag ) /* } */ inline b32 -NotSet( world_chunk *Chunk, chunk_flag Flag ) +NotSet( octree_node *Chunk, chunk_flag Flag ) { b32 Result = !(IsSet(Chunk, Flag)); return Result; @@ -262,7 +262,6 @@ ClearWorldChunk( world_chunk *Chunk ) Clear(&Chunk->Mesh); - Chunk->Flags = {}; Chunk->DimInChunks = {}; } diff --git a/src/engine/chunk.cpp b/src/engine/chunk.cpp index 0fb3e6c2b..4d04aca6d 100644 --- a/src/engine/chunk.cpp +++ b/src/engine/chunk.cpp @@ -24,7 +24,7 @@ IsFilledInChunk( world_chunk *Chunk, voxel_position VoxelP, chunk_dimension Dim) { b32 isFilled = True; - if (Chunk && ( IsSet(Chunk, Chunk_VoxelsInitialized) )) + if (Chunk) { s32 i = GetIndex(VoxelP, Dim); diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index 020297b84..d0d4c99c7 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -547,12 +547,12 @@ DoEngineDebug(engine_resources *Engine) EngineDebug->PickedChunkState = PickedChunkState_Hover; } - if (Button(Ui, CSz("RebuildMesh"), UiId(&WorldChunkWindow, "RebuildMesh WorldChunkWindow", 0ull)) ) - { - MakeFaceMasks_NoExteriorFaces(PickedChunk->Occupancy, PickedChunk->xOccupancyBorder, PickedChunk->FaceMasks, PickedChunk->Voxels, PickedChunk->Dim, {}, PickedChunk->Dim); - QueueChunkForMeshRebuild(&Plat->LowPriority, PickedChunk); - } - PushNewRow(Ui); + /* if (Button(Ui, CSz("RebuildMesh"), UiId(&WorldChunkWindow, "RebuildMesh WorldChunkWindow", 0ull)) ) */ + /* { */ + /* MakeFaceMasks_NoExteriorFaces(PickedChunk->Occupancy, PickedChunk->xOccupancyBorder, PickedChunk->FaceMasks, PickedChunk->Voxels, PickedChunk->Dim, {}, PickedChunk->Dim); */ + /* QueueChunkForMeshRebuild(&Plat->LowPriority, PickedChunk); */ + /* } */ + /* PushNewRow(Ui); */ if (EngineDebug->PickedChunkState == PickedChunkState_Hover) { diff --git a/src/engine/debug_draw.cpp b/src/engine/debug_draw.cpp index ebca0e1e6..5a3d1bc66 100644 --- a/src/engine/debug_draw.cpp +++ b/src/engine/debug_draw.cpp @@ -332,6 +332,17 @@ DEBUG_DrawChunkAABB( untextured_3d_geometry_buffer *Mesh, graphics *Graphics, wo DEBUG_DrawAABB(Mesh, MinP, MaxP, RGBColor, Thickness); } +link_internal void +DEBUG_DrawChunkAABB( untextured_3d_geometry_buffer *Mesh, graphics *Graphics, octree_node *Node, + chunk_dimension WorldChunkDim, v3 RGBColor, r32 Thickness = DEFAULT_LINE_THICKNESS) +{ + v3 MinP = GetRenderP(WorldChunkDim, Canonical_Position(V3(0,0,0), Node->WorldP), Graphics->Camera); + v3 MaxP = GetRenderP(WorldChunkDim, Canonical_Position(WorldChunkDim*Node->Resolution, Node->WorldP), Graphics->Camera); + + + DEBUG_DrawAABB(Mesh, MinP, MaxP, RGBColor, Thickness); +} + link_internal void DEBUG_HighlightChunk(world_chunk *Chunk, v3 RGBColor, r32 Thickness = DEFAULT_LINE_THICKNESS) { diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 24aba293e..50b573d0d 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -125,7 +125,7 @@ struct dummy_work_queue_entry_build_chunk_mesh { gpu_readback_buffer PBOBuf; v3i NoiseDim; - world_chunk *Chunk; + octree_node *DestNode; }; poof(block_array(dummy_work_queue_entry_build_chunk_mesh, {32})) diff --git a/src/engine/loaders/vox.cpp b/src/engine/loaders/vox.cpp index e0fc78332..889073211 100644 --- a/src/engine/loaders/vox.cpp +++ b/src/engine/loaders/vox.cpp @@ -444,7 +444,7 @@ LoadVoxData(v3_cursor *ColorPalette, memory_arena *TempMemory, memory_arena *Per FullBarrier; - Current.ChunkData->Flags = Chunk_VoxelsInitialized; + /* Current.ChunkData->Flags = Chunk_VoxelsInitialized; */ /* MarkBoundaryVoxels_NoExteriorFaces( Current.ChunkData->Voxels, Current.ChunkData->Dim, {}, Current.ChunkData->Dim); */ MarkBoundaryVoxels_MakeExteriorFaces( Current.ChunkData->Occupancy, Current.ChunkData->Voxels, Current.ChunkData->Dim, {}, Current.ChunkData->Dim); diff --git a/src/engine/render_command.h b/src/engine/render_command.h index 08b856486..54998cbb5 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -113,7 +113,7 @@ struct bonsai_render_command_do_stuff struct octree_node; struct bonsai_render_command_initialize_noise_buffer { - octree_node *Node; + octree_node *DestNode; }; struct bonsai_render_command_gl_timer_init @@ -148,7 +148,7 @@ struct bonsai_render_command_allocate_and_map_gpu_element_buffer // // nopush world_chunk *SynChunk; - world_chunk *DestChunk; + octree_node *DestNode; }; struct bonsai_render_command_unmap_gpu_element_buffer @@ -159,7 +159,7 @@ struct bonsai_render_command_unmap_gpu_element_buffer // remove. // // nopush - world_chunk *Chunk; + octree_node *DestNode; }; struct bonsai_render_command_unmap_and_deallocate_buffer diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 3d4cd0b6e..c18ea8e75 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -114,7 +114,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) Assert(HasGpuMesh(Command->Dest) == 1); - auto Next = WorkQueueEntry(WorkQueueEntryBuildWorldChunkMesh(Command->SynChunk, Command->DestChunk)); + auto Next = WorkQueueEntry(WorkQueueEntryBuildWorldChunkMesh(Command->SynChunk, Command->DestNode)); PushWorkQueueEntry(LowPriorityQ, &Next); } break; @@ -122,7 +122,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) TIMED_NAMED_BLOCK(bonsai_render_command_unmap_gpu_element_buffer); FlushBuffersToCard(Command->Buf); - FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*, Command->Chunk))); + FinalizeNodeInitializaion(Cast(octree_node*, Cast(void*, Command->DestNode))); } break; @@ -276,9 +276,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) bonsai_render_command_initialize_noise_buffer C = RenderCommand->bonsai_render_command_initialize_noise_buffer; - octree_node *Node = C.Node; - world_chunk **Chunk2 = &C.Node->Chunk; - world_chunk *Chunk1 = C.Node->Chunk; + octree_node *Node = C.DestNode; + world_chunk **Chunk2 = &C.DestNode->Chunk; + world_chunk *Chunk1 = C.DestNode->Chunk; world_chunk *Chunk = Chunk1; Assert(s64(Chunk) == s64(Chunk1)); @@ -677,7 +677,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) gl_fence Fence = GL.FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, NoiseDim, Chunk}; + dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, NoiseDim, Node}; Push(&Graphics->NoiseReadbackJobs, &Readback); } @@ -882,7 +882,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) u16 *NoiseValues = Cast(u16*, GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); AssertNoGlErrors; - auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->Chunk)); + auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->DestNode)); PushWorkQueueEntry(&Plat->LowPriority, &BuildMeshJob); // TODO(Jesse): This actually makes the loop skip a job because we diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 73be26471..082c0c4bf 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -3,8 +3,10 @@ DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk) { UNPACK_ENGINE_RESOURCES(Engine); - Assert( (Chunk->Flags & Chunk_Queued) == 0); - Assert( Chunk->Flags & (Chunk_Deallocate|Chunk_VoxelsInitialized)); + Assert(Chunk->IsOnFreelist == False); + + /* Assert( (Chunk->Flags & Chunk_Queued) == 0); */ + /* Assert( Chunk->Flags & (Chunk_Deallocate|Chunk_VoxelsInitialized)); */ if (HasGpuMesh(&Chunk->Mesh)) { @@ -13,7 +15,7 @@ DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk) ClearWorldChunk(Chunk); - Assert(Chunk->Flags == 0); + /* Assert(Chunk->Flags == 0); */ Assert(Chunk->Next == 0); FullBarrier; diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index c75889fb7..2f7bf8bf4 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -65,15 +65,15 @@ struct work_queue_entry_finalize_noise_values gpu_readback_buffer PBOBuf; u16 *NoiseData; - v3i NoiseDim; + v3i NoiseDim; - world_chunk *Chunk; + octree_node *DestNode; }; struct work_queue_entry_build_chunk_mesh { world_chunk *SynChunk; - world_chunk *DestChunk; + octree_node *DestNode; }; #if 1 diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 49c246bf9..0bf6e1143 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -531,7 +531,7 @@ DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats } - if (Chunk && (Chunk->Flags & Chunk_Queued) ) + if (Chunk && Node->Flags & Chunk_Queued) { if (EngineDebug->DrawQueuedNodes) { @@ -575,7 +575,7 @@ OctreeBranchShouldCollapse(engine_resources *Engine, octree_node *Node) { Assert(Node->Resolution == Chunk->DimInChunks); Assert(Node->WorldP == Chunk->WorldP); - if (Chunk->Flags & Chunk_Queued) return Result; + if (Node->Flags & Chunk_Queued) return Result; } v3i Res = ComputeNodeDesiredResolution(Engine, Node); @@ -686,9 +686,9 @@ FreeOctreeNode(engine_resources *Engine, octree_node **Bucket) if (world_chunk *Chunk = Node->Chunk) { - if (Chunk->Flags & Chunk_Queued) + if (Node->Flags & Chunk_Queued) { - if ( (Chunk->Flags & Chunk_Deallocate) == 0) + if ( (Node->Flags & Chunk_Deallocate) == 0) { { // debug octree_node *TestNode = Engine->World->OctreeNodeDeferFreelist.First; @@ -699,15 +699,15 @@ FreeOctreeNode(engine_resources *Engine, octree_node **Bucket) // accidentally persist the Chunk_Queued flag after the worker thread had // un-set it and therefore jam up the DeferFreelist (forever waiting on // a "Queued" chunk that's not actually queued). - Chunk->Flags = chunk_flag(Chunk->Flags|Chunk_Deallocate); + Node->Flags = chunk_flag(Node->Flags|Chunk_Deallocate); Free(&Engine->World->OctreeNodeDeferFreelist, Node); ++DeferrFreedNodes; } } else { - Assert(Chunk->Flags & Chunk_VoxelsInitialized); - Assert( (Chunk->Flags & Chunk_Queued) == False); + Assert(Node->Flags & Chunk_VoxelsInitialized); + Assert( (Node->Flags & Chunk_Queued) == False); FreeWorldChunk(Engine, Chunk); Clear(Node); @@ -763,7 +763,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue Assert(Chunk->Dim % World->ChunkDim == V3i(0)); - if (Chunk->Flags & Chunk_VoxelsInitialized) + if (NodeToSplit->Flags & Chunk_VoxelsInitialized) { if (HasGpuMesh(&Chunk->Mesh) == False) { @@ -781,8 +781,8 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue } } - if ( (Chunk->Flags & Chunk_Queued) == 0 && - (Chunk->Flags & Chunk_VoxelsInitialized) == 0 ) + if ( (NodeToSplit->Flags & Chunk_Queued) == 0 && + (NodeToSplit->Flags & Chunk_VoxelsInitialized) == 0 ) { PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit, Parent); @@ -1012,14 +1012,14 @@ MaintainWorldOctree(engine_resources *Engine) octree_node *Node = World->OctreeNodeDeferFreelist.First; octree_node *Next = Node->Next; - if (Node->Chunk->Flags & Chunk_Queued) + if (Node->Flags & Chunk_Queued) { break; } else { - Assert(Node->Chunk->Flags & Chunk_VoxelsInitialized); - Assert( (Node->Chunk->Flags & Chunk_Queued) == False); + Assert(Node->Flags & Chunk_VoxelsInitialized); + Assert( (Node->Flags & Chunk_Queued) == False); FreeWorldChunk(Engine, Node->Chunk); @@ -1101,15 +1101,11 @@ MaintainWorldOctree(engine_resources *Engine) /* IterateOver(Queue.Lists, List, ListIndex) */ { octree_node_ptr_cursor List = Queue.Lists[ListIndex]; - /* RangeIterator(BucketIndex, OCTREE_PRIORITY_QUEUE_LIST_LENGTH) */ IterateOver(&List, NodeP, NPIndex) { - /* octree_node **NodeP = GetPtr(&List, umm(BucketIndex)); */ - /* Info("ListIndex(%d) NodeP(%p)", ListIndex, NodeP); */ if (NodeP) { octree_node *Node = *NodeP; - /* Info("Node(%p)", Node); */ if (Node->HadNoVisibleSurface) { // We can actually have a chunk when we reallocate for an edit @@ -1127,7 +1123,7 @@ MaintainWorldOctree(engine_resources *Engine) WorldChunk(Node->Chunk, Node->WorldP, GetWorldChunkDim(), Node->Resolution); } - if ( NotSet(Node->Chunk->Flags, Chunk_Queued) ) + if ( NotSet(Node->Flags, Chunk_Queued) ) { Node->Dirty = False; QueueChunkForInit(&Plat->RenderQ, Node, MeshBit_Lod0); diff --git a/src/engine/world.h b/src/engine/world.h index 9f3af8171..ad6e59345 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -34,6 +34,7 @@ enum octree_node_type struct world_edit_ptr_block_array; struct octree_node { + chunk_flag Flags; octree_node_type Type; // TODO(Jesse): Pack into something else diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 27689d754..6a82850bf 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -53,11 +53,11 @@ SetMesh(world_chunk *Chunk, world_chunk_mesh_bitfield MeshBit, mesh_freelist *Me #endif link_internal void -FinalizeChunkInitialization(world_chunk *Chunk) +FinalizeNodeInitializaion(octree_node *Node) { FullBarrier; - u32 Flags = Chunk->Flags ; + u32 Flags = Node->Flags; if ( (Flags & Chunk_Freelist) != 0) { Info("%d", Flags); @@ -70,13 +70,14 @@ FinalizeChunkInitialization(world_chunk *Chunk) RuntimeBreak(); } - /* UnSetFlag(Chunk, Chunk_Garbage); */ - UnSetFlag(&Chunk->Flags, Chunk_Queued); - SetFlag(&Chunk->Flags, Chunk_VoxelsInitialized); + /* UnSetFlag(Node, Chunk_Garbage); */ + UnSetFlag(&Node->Flags, Chunk_Queued); + SetFlag(&Node->Flags, Chunk_VoxelsInitialized); FullBarrier; } +#if 0 inline b32 ChunkIsGarbage(world_chunk* Chunk) { @@ -86,6 +87,7 @@ ChunkIsGarbage(world_chunk* Chunk) b32 Garbage = IsSet(Chunk, Chunk_Garbage); return Garbage; } +#endif link_internal void WorldChunk(world_chunk *Chunk, v3i WorldP, v3i Dim, v3i DimInChunks) @@ -318,17 +320,14 @@ GetFreeWorldChunk(world *World) World->FreeChunkCount -= 1; Result = (world_chunk*)Next; - u32 Flags = Result->Flags; - if (Flags != Chunk_Freelist) { Info("%d", Flags); RuntimeBreak(); } - Assert(Result->Flags == Chunk_Freelist); - Result->Flags = {}; + if (Result->IsOnFreelist == False) { RuntimeBreak(); } + Result->IsOnFreelist = False; ReleaseFutex(&World->ChunkFreelistFutex); } else { /* Info("Allocated World Chunk"); */ Result = AllocateWorldChunk({}, World->ChunkDim, {}, World->ChunkMemory); - Assert(Result->Flags == Chunk_Uninitialized); ++TotalWorldChunksAllocated; } @@ -373,7 +372,6 @@ GetAndInsertFreeWorldChunk(world *World, world_position P) Assert(Result->WorldP == P); Assert(Result->Voxels); Assert(Result->Dim == World->ChunkDim); - Assert(Result->Flags == Chunk_Uninitialized); } } @@ -399,30 +397,31 @@ FreeWorldChunk(engine_resources *Engine, world_chunk *Chunk) TIMED_FUNCTION(); UNPACK_ENGINE_RESOURCES(Engine); - u32 Flags = Chunk->Flags; + /* u32 Flags = Chunk->Flags; */ - if ( (Flags & Chunk_Queued) != 0) - { - Info("%d", Flags); - RuntimeBreak(); - } + /* if ( (Flags & Chunk_Queued) != 0) */ + /* { */ + /* Info("%d", Flags); */ + /* RuntimeBreak(); */ + /* } */ - if ( (Flags & Chunk_Freelist) != 0) - { - Info("%d", Flags); - RuntimeBreak(); - } + /* if ( (Flags & Chunk_Freelist) != 0) */ + /* { */ + /* Info("%d", Flags); */ + /* RuntimeBreak(); */ + /* } */ - if ( (Flags & (Chunk_Deallocate|Chunk_VoxelsInitialized)) == 0) - { - Info("%d", Flags); - RuntimeBreak(); - } + /* if ( (Flags & (Chunk_Deallocate|Chunk_VoxelsInitialized)) == 0) */ + /* { */ + /* Info("%d", Flags); */ + /* RuntimeBreak(); */ + /* } */ Assert(Chunk->Next == 0); - Assert(Chunk->Flags & Chunk_Deallocate|Chunk_VoxelsInitialized); + /* Assert(Chunk->Flags & Chunk_Deallocate|Chunk_VoxelsInitialized); */ /* Assert(NotSet(Chunk->Flags, Chunk_Queued)); */ + Assert(Chunk->IsOnFreelist == False); // NOTE(Jesse): Have to mark this chunk so the thing that collects unused // chunks doesn't free this multiple times. @@ -437,13 +436,13 @@ FreeWorldChunk(engine_resources *Engine, world_chunk *Chunk) AcquireFutex(&World->ChunkFreelistFutex); world_chunk *Next = World->ChunkFreelistSentinal.Next; - Chunk->Flags = Chunk_Freelist; + Assert(Chunk->IsOnFreelist == False); + Chunk->IsOnFreelist = True; if (Next) { - u32 nFlags = Next->Flags; - if (nFlags != Chunk_Freelist) + if (Next->IsOnFreelist == False) { - Info("%d", nFlags); + Info("%d", Next->IsOnFreelist); RuntimeBreak(); } } @@ -459,31 +458,27 @@ link_internal void ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node, octree_node *Parent, octree_node_priority_queue *Queue, octree_stats *Stats) { UNPACK_ENGINE_RESOURCES(Engine); - Assert(!FutexIsSignaled(&Node->Lock)); - AcquireFutex(&Node->Lock); - if (Node->Chunk) - { - // Skip chunks that are already queued - if (Node->Chunk->Flags & Chunk_Queued) { ReleaseFutex(&Node->Lock); return; } - } - else + if ( (Node->Flags & Chunk_Queued) == False ) { - Node->Chunk = GetFreeWorldChunk(Engine->World); - } + AcquireFutex(&Node->Lock); - Node->HadNoVisibleSurface = False; - WorldChunk(Node->Chunk, Node->WorldP, Engine->World->ChunkDim, Node->Resolution); + if (Node->Chunk == 0) { Node->Chunk = GetFreeWorldChunk(Engine->World); } + + WorldChunk(Node->Chunk, Node->WorldP, Engine->World->ChunkDim, Node->Resolution); #if 0 - QueueChunkForInit(&Engine->Stdlib.Plat.RenderQ, Node, MeshBit_None); - ++Stats->NewQueues; + QueueChunkForInit(&Engine->Stdlib.Plat.RenderQ, Node, MeshBit_None); + ++Stats->NewQueues; #else - Info("pushed"); - PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Node, Parent); + Info("pushed"); + /* Node->Dirty = False; */ + /* Node->HadNoVisibleSurface = False; */ + PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Node, Parent); #endif - ReleaseFutex(&Node->Lock); + ReleaseFutex(&Node->Lock); + } } link_internal world_chunk* @@ -2622,8 +2617,9 @@ GetClosestPointRelativeTo(voxel_position* Query, voxel_position* Start, voxel_po return Result; } +#if 0 link_internal b32 -HasUnfilledNeighbors(s32 Index, world_chunk* Chunk, chunk_dimension ChunkDim) +HasUnfilledNeighbors(s32 Index, world_chunk *Chunk, chunk_dimension ChunkDim) { TIMED_FUNCTION(); @@ -2670,6 +2666,7 @@ HasUnfilledNeighbors(s32 Index, world_chunk* Chunk, chunk_dimension ChunkDim) return Result; } +#endif link_internal void GetBoundingVoxelsClippedTo(world_chunk* Chunk, chunk_dimension ChunkDim, boundary_voxels* Dest, aabb Clip) @@ -3482,6 +3479,7 @@ ComputeLodMesh( thread_local_state *Thread, #if 1 #endif +#if 0 link_internal void InitializeWorldChunkEmpty(world_chunk *DestChunk) { @@ -3508,6 +3506,7 @@ InitializeWorldChunkEmpty(world_chunk *DestChunk) return; } +#endif debug_global u32 TotalChunksQueued; @@ -3518,7 +3517,7 @@ QueueChunkForInit(work_queue *Queue, octree_node *Node, world_chunk_mesh_bitfiel Assert(Node->Chunk); Assert(Node->Chunk->Dim.x); - Assert( NotSet(Node->Chunk->Flags, Chunk_Queued) ); + Assert( NotSet(Node->Flags, Chunk_Queued) ); ++TotalChunksQueued; @@ -3552,11 +3551,11 @@ QueueChunkForInit(work_queue *Queue, octree_node *Node, world_chunk_mesh_bitfiel PushBonsaiRenderCommandInitializeNoiseBuffer(Queue, Node); #endif - Assert( NotSet(Node->Chunk->Flags, Chunk_Queued) ); - SetFlag(&Node->Chunk->Flags, Chunk_Queued); + Assert( NotSet(Node->Flags, Chunk_Queued) ); + SetFlag(&Node->Flags, Chunk_Queued); } -#if 1 +#if 0 inline void QueueChunkForMeshRebuild(work_queue *Queue, world_chunk *Chunk, chunk_init_flags Flags = ChunkInitFlag_Noop) { @@ -3639,7 +3638,7 @@ RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOff TIMED_FUNCTION(); engine_resources *Engine = GetEngineResources(); - Assert( IsSet(Chunk->Flags, Chunk_VoxelsInitialized) ); + /* Assert( IsSet(Chunk->Flags, Chunk_VoxelsInitialized) ); */ Assert( MeshBit == MeshBit_Lod0 ); BuildWorldChunkMeshFromMarkedVoxels_Naieve( Chunk->Voxels, Chunk->FaceMasks, Chunk->Dim, MinOffset, MaxOffset, Dest, 0); @@ -3649,6 +3648,7 @@ RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOff #endif +#if 0 link_internal void InitializeChunkWithNoise( chunk_init_callback NoiseCallback, thread_local_state *Thread, @@ -3685,7 +3685,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, Assert(Global_ChunkApronDim.y == Global_ChunkApronMinDim.y + Global_ChunkApronMaxDim.y); Assert(Global_ChunkApronDim.z == Global_ChunkApronMinDim.z + Global_ChunkApronMaxDim.z); - Assert(!ChunkIsGarbage(DestChunk)); + /* Assert(!ChunkIsGarbage(DestChunk)); */ untextured_3d_geometry_buffer* Mesh = 0; @@ -3731,6 +3731,7 @@ InitializeChunkWithNoise( chunk_init_callback NoiseCallback, generic_noise_params Params = {r32(Thresh), Period, r32(Amp), RGBColor}; InitializeChunkWithNoise(NoiseCallback, Thread, DestChunk, &Params, Flags, UserData, MakeExteriorFaces, NoiseBasisOffset); } +#endif // nochecking Move as much out of this block as possible. Only the last few of // the things in this block are actually related to drawing @@ -3742,14 +3743,14 @@ WorkQueueEntryRebuildMesh(world_chunk *Chunk, chunk_init_flags Flags) } link_internal work_queue_entry_build_chunk_mesh -WorkQueueEntryBuildWorldChunkMesh(world_chunk *SynChunk, world_chunk *DestChunk) +WorkQueueEntryBuildWorldChunkMesh(world_chunk *SynChunk, octree_node *DestNode) { - work_queue_entry_build_chunk_mesh Result = {SynChunk, DestChunk}; + work_queue_entry_build_chunk_mesh Result = {SynChunk, DestNode}; return Result; } link_internal work_queue_entry_finalize_noise_values -WorkQueueEntryFinalizeNoiseValues(gpu_readback_buffer PBOBuf, u16 *NoiseData, v3i NoiseDim, world_chunk *Chunk) +WorkQueueEntryFinalizeNoiseValues(gpu_readback_buffer PBOBuf, u16 *NoiseData, v3i NoiseDim, octree_node *Chunk) { work_queue_entry_finalize_noise_values Result = { PBOBuf, NoiseData, NoiseDim, Chunk }; return Result; @@ -4265,6 +4266,7 @@ RayTraceCollision(engine_resources *Engine, ray *Ray) if (Done) break; octree_node *Node = PickedNode->Node; + r32 tChunk = PickedNode->t; world_chunk *ClosestChunk = Node->Chunk; @@ -4288,69 +4290,66 @@ RayTraceCollision(engine_resources *Engine, ray *Ray) DEBUG_DrawSimSpaceAABB(Engine, &AABB, Color, 1.f); } #endif - - if (Node->Chunk == 0) + if ( Node->Chunk && (Node->Flags & Chunk_VoxelsInitialized) ) { - continue; - } - - v3 Advance = Ray->Dir*0.01f; + v3 Advance = Ray->Dir*0.01f; - // TODO(Jesse): This should pass. - /* Assert (ClosestChunk->FilledCount > 0); */ + // TODO(Jesse): This should pass. + /* Assert (ClosestChunk->FilledCount > 0); */ - v3 CollisionP = Ray->Origin + (Ray->Dir*tChunk); + v3 CollisionP = Ray->Origin + (Ray->Dir*tChunk); - v3 StartP = CollisionP + (Advance*0.1f); + v3 StartP = CollisionP + (Advance*0.1f); - v3 ChunkSimP = GetSimSpaceP(World, Canonical_Position(V3(0), ClosestChunk->WorldP)); - v3 AtP = (StartP - ChunkSimP) / V3(ClosestChunk->DimInChunks); + v3 ChunkSimP = GetSimSpaceP(World, Canonical_Position(V3(0), ClosestChunk->WorldP)); + v3 AtP = (StartP - ChunkSimP) / V3(ClosestChunk->DimInChunks); - u32 AxisIndex = 0; - for (;;) - { - if ( AtP.x < 0 || AtP.x >= WorldChunkDim.x || - AtP.y < 0 || AtP.y >= WorldChunkDim.y || - AtP.z < 0 || AtP.z >= WorldChunkDim.z ) + u32 AxisIndex = 0; + for (;;) { - // Hit = False; - break; - } + if ( AtP.x < 0 || AtP.x >= WorldChunkDim.x || + AtP.y < 0 || AtP.y >= WorldChunkDim.y || + AtP.z < 0 || AtP.z >= WorldChunkDim.z ) + { + // Hit = False; + break; + } - // TODO(Jesse): Instead of trucating, make ClosestCentroid(AtP) - voxel_position LocalTestP = Voxel_Position(AtP); - if (IsFilledInChunk(ClosestChunk, LocalTestP, World->ChunkDim)) - { - Done = True; + // TODO(Jesse): Instead of trucating, make ClosestCentroid(AtP) + voxel_position LocalTestP = Voxel_Position(AtP); + if (IsFilledInChunk(ClosestChunk, LocalTestP, World->ChunkDim)) + { + Done = True; - Result.Chunks[PickedVoxel_FirstFilled] = {Node, r64(tChunk)}; - Result.Picks[PickedVoxel_FirstFilled] = Canonical_Position(AtP, ClosestChunk->WorldP); + Result.Chunks[PickedVoxel_FirstFilled] = {Node, r64(tChunk)}; + Result.Picks[PickedVoxel_FirstFilled] = Canonical_Position(AtP, ClosestChunk->WorldP); #if 0 - { - untextured_3d_geometry_buffer VoxMesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); - v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP*ClosestChunk->DimInChunks); - /* v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP); */ - DrawVoxel_MinDim( &VoxMesh, RenderMin, RGB_GREEN, V3(ClosestChunk->DimInChunks)); - } + { + untextured_3d_geometry_buffer VoxMesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); + v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP*ClosestChunk->DimInChunks); + /* v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP); */ + DrawVoxel_MinDim( &VoxMesh, RenderMin, RGB_GREEN, V3(ClosestChunk->DimInChunks)); + } #endif - break; - } - else - { - Result.Chunks[PickedVoxel_LastEmpty] = {Node, r64(tChunk)}; - Result.Picks[PickedVoxel_LastEmpty] = Canonical_Position(AtP, ClosestChunk->WorldP); + break; + } + else { - /* untextured_3d_geometry_buffer VoxMesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); */ - /* v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP*ClosestChunk->DimInChunks); */ - /* v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP); */ - /* DrawVoxel_MinDim( &VoxMesh, RenderMin, RGB_BLUE, V3(ClosestChunk->DimInChunks)); */ + Result.Chunks[PickedVoxel_LastEmpty] = {Node, r64(tChunk)}; + Result.Picks[PickedVoxel_LastEmpty] = Canonical_Position(AtP, ClosestChunk->WorldP); + { + /* untextured_3d_geometry_buffer VoxMesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); */ + /* v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP*ClosestChunk->DimInChunks); */ + /* v3 RenderMin = GetRenderP(Engine, ClosestChunk->WorldP) + V3(LocalTestP); */ + /* DrawVoxel_MinDim( &VoxMesh, RenderMin, RGB_BLUE, V3(ClosestChunk->DimInChunks)); */ + } } - } - AtP.E[AxisIndex] += Advance.E[AxisIndex]; - AxisIndex = (AxisIndex + 1) % 3; + AtP.E[AxisIndex] += Advance.E[AxisIndex]; + AxisIndex = (AxisIndex + 1) % 3; + } } #if 0 diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index c8307f564..086cb72fc 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -168,7 +168,7 @@ struct boundary_voxel struct chunk_data { - chunk_flag Flags; + /* chunk_flag Flags; */ v3i Dim; // TODO(Jesse): can (should?) be 3x u8 instead of 3x s32 u64 *Occupancy; u64 *xOccupancyBorder; // [xOccupancyBorder_ElementCount]; @@ -316,7 +316,7 @@ struct world_chunk poof(@version(1)) world_chunk *Next; poof(@no_serialize) // chunk_data { - chunk_flag Flags; poof(@no_serialize) + /* chunk_flag Flags; poof(@no_serialize) */ v3i Dim; // could/should be compressed? u64 *Occupancy; u64 *xOccupancyBorder; // [xOccupancyBorder_ElementCount]; @@ -325,6 +325,7 @@ struct world_chunk poof(@version(1)) voxel_lighting *VoxelLighting; poof(@array_length( Cast(umm, Volume(Element->Dim)))) // } + b32 IsOnFreelist; gpu_mapped_element_buffer Mesh; poof(@no_serialize) @@ -372,7 +373,7 @@ struct world_chunk_0 world_chunk *Next; poof(@no_serialize) // chunk_data { - chunk_flag Flags; poof(@no_serialize) + /* chunk_flag Flags; poof(@no_serialize) */ v3i Dim; // could be compressed? voxel *Voxels; poof(@custom_marshal(MarshalMagicaVoxelEncodedColors(Stored->Voxels, Live->Voxels, Stored->Dim);) @array_length( Cast(umm, Volume(Element->Dim)))) @@ -635,11 +636,11 @@ MarkBoundaryVoxels_MakeExteriorFaces(u64 *Occupancy, voxel *Voxels, chunk_dimens /* link_internal world_chunk_geometry_buffer* */ /* AllocateTempWorldChunkMesh(memory_arena* TempMemory); */ -link_internal void -RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOffset, v3i MaxOffset, world_chunk_mesh_bitfield MeshBit, geo_u3d *TempMesh, memory_arena *TempMem, v3 VertexOffset); +/* link_internal void */ +/* RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOffset, v3i MaxOffset, world_chunk_mesh_bitfield MeshBit, geo_u3d *TempMesh, memory_arena *TempMem, v3 VertexOffset); */ link_internal void -FinalizeChunkInitialization(world_chunk *Chunk); +FinalizeNodeInitializaion(octree_node *Chunk); link_internal untextured_3d_geometry_buffer* AllocateTempMesh(memory_arena* TempMemory, data_type Type); diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index c307c1d55..4dd1447bd 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -20,7 +20,7 @@ WorldUpdateThread_Main(void *ThreadStartupParams) WORKER_THREAD_ADVANCE_DEBUG_SYSTEM(); WorkerThread_BeforeJobStart(ThreadParams); - world_chunk_ptr_block_array UpdatedChunks = WorldChunkPtrBlockArray(Thread->TempMemory); + /* world_chunk_ptr_block_array UpdatedChunks = WorldChunkPtrBlockArray(Thread->TempMemory); */ while (work_queue_entry *Entry = PopWorkQueueEntry(WorldUpdateQ)) { @@ -68,10 +68,10 @@ WorldUpdateThread_Main(void *ThreadStartupParams) } - IterateOver(&UpdatedChunks, Chunk, ChunkIndex) - { - QueueChunkForMeshRebuild(&Plat->LowPriority, Chunk); - } + /* IterateOver(&UpdatedChunks, Chunk, ChunkIndex) */ + /* { */ + /* QueueChunkForMeshRebuild(&Plat->LowPriority, Chunk); */ + /* } */ // NOTE(Jesse): This is intentionally after all the updates have completed // such that the UpdatedChunks block array persists between jobs and we From c2edab7f7c08c9bdbe3be4fa3e70bf4a73622893 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 15 Jun 2025 17:41:48 -0700 Subject: [PATCH 302/421] Get rid of HadNoVisibleSurface and cleanup chunk state machine --- generated/are_equal_octree_node.h | 2 +- .../block_array_octree_node_ptr_688853862.h | 2 +- ...block_array_picked_octree_node_688853862.h | 2 +- generated/buffer_octree_node_ptr.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 22 ---- generated/freelist_allocator_octree_node.h | 2 +- generated/freelist_allocator_world_chunk.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 2 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- jesse.make.sh | 4 +- src/engine/api.cpp | 1 - src/engine/world.cpp | 118 +++++++----------- src/engine/world.h | 7 +- src/engine/world_chunk.cpp | 32 +---- src/engine/world_chunk.h | 3 - 18 files changed, 68 insertions(+), 141 deletions(-) diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index e04a1a524..23c35d599 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:72:0 +// src/engine/world.h:71:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 4073e716c..07ebd8da5 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:86:0 +// src/engine/world.h:85:0 diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index dbf097072..c49c0a0de 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -1,4 +1,4 @@ -// src/engine/world.h:89:0 +// src/engine/world.h:88:0 diff --git a/generated/buffer_octree_node_ptr.h b/generated/buffer_octree_node_ptr.h index 9fc9be9a6..cdfbdf23d 100644 --- a/generated/buffer_octree_node_ptr.h +++ b/generated/buffer_octree_node_ptr.h @@ -1,4 +1,4 @@ -// src/engine/world.h:63:0 +// src/engine/world.h:62:0 struct octree_node_ptr_buffer { diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 723787219..4075e8310 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -74,28 +74,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name - } - - - { - - - - cs MemberName = CSz("HadNoVisibleSurface"); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->HadNoVisibleSurface), - MemberName, - &DefaultUiRenderParams_Checkbox - ); - - - - - - - PushNewRow(Ui); - } diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index 88c184bf3..7a8db890d 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:77:0 +// src/engine/world.h:76:0 struct octree_node_freelist { diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h index 94907803b..e6840fd64 100644 --- a/generated/freelist_allocator_world_chunk.h +++ b/generated/freelist_allocator_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/world.h:80:0 +// src/engine/world.h:79:0 struct world_chunk_freelist { diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index c972905d0..d94dd13d1 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/world.h:83:0 +// src/engine/world.h:82:0 struct octree_node_ptr_cursor { diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index c2f8a139b..951975919 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// src/engine/world.h:74:0 +// src/engine/world.h:73:0 struct octree_node_ptr_stack { diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 8dfc32142..7395c336e 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:3076:0 +// src/engine/world_chunk.cpp:3049:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 8f1410d57..85865a4fa 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2088:0 +// src/engine/world_chunk.cpp:2061:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 25324cb9a..e874e2030 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/world_chunk.cpp:2091:0 +// src/engine/world_chunk.cpp:2064:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, diff --git a/jesse.make.sh b/jesse.make.sh index bbc35e240..11051035c 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 @@ -11,7 +11,7 @@ ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ - # BuildExecutables \ + BuildExecutables \ # BuildTests \ # BuildSingleExample examples/ui_test \ # BuildSingleExample examples/blank_project \ diff --git a/src/engine/api.cpp b/src/engine/api.cpp index c8f835ea5..04bc106db 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -795,7 +795,6 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ Assert(GpuMappedBuf->Buffer.At == GpuMappedBuf->Buffer.End); Assert(HasGpuMesh(&DestChunk->Mesh) == True); - FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); PushBonsaiRenderCommandUnmapGpuElementBuffer(RenderQ, &DestChunk->Mesh, DestNode); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 0bf6e1143..80f93ee59 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -47,6 +47,25 @@ AllocateWorld(world *World, v3i Center, v3i WorldChunkDim, visible_region_size V return World; } +link_internal void +ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node, octree_node *Parent, octree_node_priority_queue *Queue, octree_stats *Stats) +{ + UNPACK_ENGINE_RESOURCES(Engine); + Assert(!FutexIsSignaled(&Node->Lock)); + + Assert(NotSet(Node->Flags, Chunk_Queued)); + { + AcquireFutex(&Node->Lock); + + if (Node->Chunk == 0) { Node->Chunk = GetFreeWorldChunk(Engine->World); } + + WorldChunk(Node->Chunk, Node->WorldP, Engine->World->ChunkDim, Node->Resolution); + PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Node, Parent); + + ReleaseFutex(&Node->Lock); + } +} + // TODO(Jesse): rect3cp should probably be a pointer..? // @@ -427,26 +446,6 @@ GetParentNodeFor(world *World, octree_node *QueryNode) return Result; } -link_internal b32 -CanDrawOrHadNoSurface(octree_node *Node) -{ - b32 Result = False; - - if (Node->HadNoVisibleSurface) - { - Result = True; - } - else - { - if (world_chunk *Chunk = Node->Chunk) - { - Result = HasGpuMesh(&Chunk->Mesh); - } - } - - return Result; -} - typedef void (*octree_traversal_callback)(octree_node *); @@ -615,11 +614,9 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) link_internal b32 PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_priority_queue *Queue, octree_node *Node, octree_node *Parent) { + Assert(NotSet(Node, Chunk_Queued)); + b32 Result = False; - /* if (Node->Chunk) */ - /* { */ - /* Assert(Node->Chunk->Flags == Chunk_Uninitialized); */ - /* } */ s32 IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, 2*Node->Resolution.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); @@ -757,41 +754,16 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue world_chunk *Chunk = NodeToSplit->Chunk; - if (Chunk) - { - /* SyncGpuBuffersAsync(Engine, &Chunk->Meshes); */ - - Assert(Chunk->Dim % World->ChunkDim == V3i(0)); + b32 Initialized = IsSet(NodeToSplit->Flags, Chunk_VoxelsInitialized); + b32 Queued = IsSet(NodeToSplit->Flags, Chunk_Queued); + b32 Dirty = NodeToSplit->Dirty; - if (NodeToSplit->Flags & Chunk_VoxelsInitialized) - { - if (HasGpuMesh(&Chunk->Mesh) == False) - { - /* Assert( (Chunk->Flags & Chunk_Queued) == False); */ - /* if (Chunk->WorldP == V3i(0,0,0)) { RuntimeBreak(); } */ - Assert(Chunk->FilledCount == 0 || Chunk->FilledCount == Volume(Chunk->Dim)); - Assert(HasGpuMesh(&Chunk->Mesh) == 0); - NodeToSplit->HadNoVisibleSurface = True; - NodeToSplit->Chunk = 0; - FreeWorldChunk(Engine, Chunk); - } - else - { - /* Assert(Chunk->FilledCount > 0 && Chunk->FilledCount < Volume(Chunk->Dim)); */ - } - } - - if ( (NodeToSplit->Flags & Chunk_Queued) == 0 && - (NodeToSplit->Flags & Chunk_VoxelsInitialized) == 0 ) - - { - PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit, Parent); - } - } - else + if (!Queued) { - if (NodeToSplit->HadNoVisibleSurface) + if (Initialized) { + if (Chunk) { if (HasGpuMesh(&Chunk->Mesh) == False) { NodeToSplit->Chunk = 0; FreeWorldChunk(Engine, Chunk); Chunk = 0; }} + if (Dirty) { PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit, Parent); } } else { @@ -856,6 +828,13 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue } } +link_internal b32 +CanDrawOrHadNoSurface(octree_node *Node) +{ + b32 Result = (Node->Flags & Chunk_VoxelsInitialized); + return Result; +} + link_internal b32 ChildrenCanDrawOrHadNoMesh(octree_node *Node) { @@ -958,9 +937,9 @@ DrawOctreeRecursive( engine_resources *Engine, case OctreeNodeType_Leaf: { - if (Node->Dirty) + if (Node->Dirty && NotSet(Node->Flags, Chunk_Queued)) { - ReinitializeOctreeNode(Engine, Node, Parent, Queue, Stats); + PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Node, Parent); } if (Chunk) @@ -1106,12 +1085,11 @@ MaintainWorldOctree(engine_resources *Engine) if (NodeP) { octree_node *Node = *NodeP; - if (Node->HadNoVisibleSurface) - { - // We can actually have a chunk when we reallocate for an edit - /* Assert(Node->Chunk == 0); */ - } - else + + // Even though we should check this before pushing nodes onto the + // priority queue, we could have pushed the node multiple times if we + // did an edit and it overlapped with an uninitialized part of the world. + if (NotSet(Node->Flags, Chunk_Queued)) { if (Node->Chunk) { @@ -1123,13 +1101,11 @@ MaintainWorldOctree(engine_resources *Engine) WorldChunk(Node->Chunk, Node->WorldP, GetWorldChunkDim(), Node->Resolution); } - if ( NotSet(Node->Flags, Chunk_Queued) ) - { - Node->Dirty = False; - QueueChunkForInit(&Plat->RenderQ, Node, MeshBit_Lod0); - ++Stats.NewQueues; - if (++NumQueuedThisFrame == MaxToQueueThisFrame) goto done_queueing_nodes; - } + Node->Dirty = False; + Node->Chunk->FilledCount = 0; + QueueChunkForInit(&Plat->RenderQ, Node, MeshBit_Lod0); + ++Stats.NewQueues; + if (++NumQueuedThisFrame == MaxToQueueThisFrame) goto done_queueing_nodes; } } else diff --git a/src/engine/world.h b/src/engine/world.h index ad6e59345..527df9c19 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -37,8 +37,7 @@ struct octree_node chunk_flag Flags; octree_node_type Type; - // TODO(Jesse): Pack into something else - b32 HadNoVisibleSurface; + // TODO(Jesse): Pack into flags b32 Dirty; v3i WorldP; @@ -293,3 +292,7 @@ GetSimSpaceAABB(world *World, octree_node *Node); link_internal b32 PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_priority_queue *Queue, octree_node *Node, octree_node *Parent); + +link_internal void +ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node, octree_node *Parent, octree_node_priority_queue *Queue, octree_stats *Stats); + diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 6a82850bf..2aa74b917 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -454,33 +454,6 @@ FreeWorldChunk(engine_resources *Engine, world_chunk *Chunk) ReleaseFutex(&World->ChunkFreelistFutex); } -link_internal void -ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node, octree_node *Parent, octree_node_priority_queue *Queue, octree_stats *Stats) -{ - UNPACK_ENGINE_RESOURCES(Engine); - Assert(!FutexIsSignaled(&Node->Lock)); - - if ( (Node->Flags & Chunk_Queued) == False ) - { - AcquireFutex(&Node->Lock); - - if (Node->Chunk == 0) { Node->Chunk = GetFreeWorldChunk(Engine->World); } - - WorldChunk(Node->Chunk, Node->WorldP, Engine->World->ChunkDim, Node->Resolution); -#if 0 - QueueChunkForInit(&Engine->Stdlib.Plat.RenderQ, Node, MeshBit_None); - ++Stats->NewQueues; -#else - Info("pushed"); - /* Node->Dirty = False; */ - /* Node->HadNoVisibleSurface = False; */ - PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Node, Parent); -#endif - - ReleaseFutex(&Node->Lock); - } -} - link_internal world_chunk* GetWorldChunkFromHashtable(world *World, world_position P) { @@ -3548,11 +3521,12 @@ QueueChunkForInit(work_queue *Queue, octree_node *Node, world_chunk_mesh_bitfiel PushWorkQueueEntry(Queue, &Entry); #else + Assert( NotSet(Node->Flags, Chunk_Queued) ); + SetFlag(&Node->Flags, Chunk_Queued); + PushBonsaiRenderCommandInitializeNoiseBuffer(Queue, Node); #endif - Assert( NotSet(Node->Flags, Chunk_Queued) ); - SetFlag(&Node->Flags, Chunk_Queued); } #if 0 diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index 086cb72fc..b7e79752a 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -627,9 +627,6 @@ struct octree_node_priority_queue; link_internal void DeallocateAndClearWorldChunk(engine_resources *Engine, world_chunk *Chunk); -link_internal void -ReinitializeOctreeNode(engine_resources *Engine, octree_node *Node, octree_node *Parent, octree_node_priority_queue *Queue, octree_stats *Stats); - link_internal s32 MarkBoundaryVoxels_MakeExteriorFaces(u64 *Occupancy, voxel *Voxels, chunk_dimension SrcChunkDim, chunk_dimension SrcChunkMin, chunk_dimension SrcChunkMax ); From e5380547f4c26c319a249fdf624a2b7483aadd80 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 15 Jun 2025 18:46:09 -0700 Subject: [PATCH 303/421] Finally fix intermittently flashing chunks on reinitialization --- ..._work_queue_entry__bonsai_render_command.h | 2 +- ..._work_queue_entry__bonsai_render_command.h | 2 +- src/engine/api.cpp | 30 +--- src/engine/render_command.h | 2 +- src/engine/render_loop.cpp | 13 +- src/engine/world.cpp | 163 ++++++++---------- 6 files changed, 94 insertions(+), 118 deletions(-) diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index c93463697..313c021a8 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -432,7 +432,7 @@ BonsaiRenderCommandAllocateAndMapGpuElementBuffer( data_type Type , u32 Ele } link_internal bonsai_render_command_unmap_gpu_element_buffer -BonsaiRenderCommandUnmapGpuElementBuffer( gpu_mapped_element_buffer * Buf , octree_node * DestNode ) +BonsaiRenderCommandUnmapGpuElementBuffer( gpu_mapped_element_buffer Buf , octree_node * DestNode ) { bonsai_render_command_unmap_gpu_element_buffer Reuslt = { .Buf = Buf diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index 77b43ec5b..dcd65914c 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -113,7 +113,7 @@ PushBonsaiRenderCommandAllocateAndMapGpuElementBuffer( link_internal void PushBonsaiRenderCommandUnmapGpuElementBuffer( work_queue *RenderQueue - , gpu_mapped_element_buffer* Buf , octree_node* DestNode + , gpu_mapped_element_buffer Buf , octree_node* DestNode ) { work_queue_entry Work = WorkQueueEntry( diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 04bc106db..f2639ec25 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -778,39 +778,19 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ octree_node *DestNode = Job->DestNode; world_chunk *DestChunk = DestNode->Chunk; - gpu_mapped_element_buffer *GpuMappedBuf = &SynChunk->Mesh; + gpu_mapped_element_buffer GpuMappedBuf = SynChunk->Mesh; /* Assert(HasGpuMesh(&DestChunk->Mesh) == True); */ - Assert(HasGpuMesh(GpuMappedBuf) == True); + Assert(HasGpuMesh(&GpuMappedBuf) == True); - RebuildWorldChunkMesh(Thread, SynChunk, {}, {}, MeshBit_Lod0, &GpuMappedBuf->Buffer, Thread->TempMemory); + RebuildWorldChunkMesh(Thread, SynChunk, {}, {}, MeshBit_Lod0, &GpuMappedBuf.Buffer, Thread->TempMemory); - auto HandlesToDeallocate = DestChunk->Mesh.Handles; - b32 DeallocateHandles = HasGpuMesh(&DestChunk->Mesh) == True; - /* if (DeallocateHandles) { Assert(DestChunk->Flags&Chunk_VoxelsInitialized); } */ - - DestChunk->Mesh = *GpuMappedBuf; SynChunk->Mesh = {}; - Assert(GpuMappedBuf->Buffer.At == GpuMappedBuf->Buffer.End); - Assert(HasGpuMesh(&DestChunk->Mesh) == True); - + Assert(GpuMappedBuf.Buffer.At == GpuMappedBuf.Buffer.End); FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); - PushBonsaiRenderCommandUnmapGpuElementBuffer(RenderQ, &DestChunk->Mesh, DestNode); - if (DeallocateHandles) - { - PushDeallocateBuffersCommand(RenderQ, &HandlesToDeallocate); - } - - - // TODO(Jesse)(bug, race): There's a race here; the chunk can get deallocated on the - // main thread and clear the Mesh before the Unmap job happens. Have to somehow - // wait for that job to finish to call Finalize - // - // nopush - - /* FinalizeChunkInitialization(Cast(world_chunk*, Cast(void*, DestChunk))); */ + PushBonsaiRenderCommandUnmapGpuElementBuffer(RenderQ, GpuMappedBuf, DestNode); #endif } break; diff --git a/src/engine/render_command.h b/src/engine/render_command.h index 54998cbb5..318896d22 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -153,7 +153,7 @@ struct bonsai_render_command_allocate_and_map_gpu_element_buffer struct bonsai_render_command_unmap_gpu_element_buffer { - gpu_mapped_element_buffer *Buf; + gpu_mapped_element_buffer Buf; // TODO(Jesse): This is a crutch for not being able to define the next job // remove. diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index c18ea8e75..3b9e5ef73 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -121,7 +121,18 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { tmatch(bonsai_render_command_unmap_gpu_element_buffer, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_unmap_gpu_element_buffer); - FlushBuffersToCard(Command->Buf); + octree_node *Node = Command->DestNode; + gpu_mapped_element_buffer *Buf = &Command->Buf; + + FlushBuffersToCard(Buf); + + if (HasGpuMesh(&Node->Chunk->Mesh)) + { + PushDeallocateBuffersCommand(RenderQ, &Node->Chunk->Mesh.Handles); + } + + Node->Chunk->Mesh = *Buf; + FinalizeNodeInitializaion(Cast(octree_node*, Cast(void*, Command->DestNode))); } break; diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 80f93ee59..c1d5685d7 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -483,10 +483,10 @@ link_internal void DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats *Stats) { UNPACK_ENGINE_RESOURCES(Engine); - s32 Result = 0; - f32 AABBLineDim = Max(1.f, Node->Resolution.x/12.f); - world_chunk *Chunk = Node->Chunk; + world_chunk *Chunk = Node->Chunk; + f32 AABBLineDim = Max(1.f, Node->Resolution.x/12.f); + switch(Node->Type) { InvalidCase(OctreeNodeType_Undefined); @@ -829,23 +829,23 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue } link_internal b32 -CanDrawOrHadNoSurface(octree_node *Node) +IsInitialized(octree_node *Node) { b32 Result = (Node->Flags & Chunk_VoxelsInitialized); return Result; } link_internal b32 -ChildrenCanDrawOrHadNoMesh(octree_node *Node) +AllChildrenAreInitialized(octree_node *Node) { - b32 Result = CanDrawOrHadNoSurface(Node->Children[0]); - Result &= CanDrawOrHadNoSurface(Node->Children[1]); - Result &= CanDrawOrHadNoSurface(Node->Children[2]); - Result &= CanDrawOrHadNoSurface(Node->Children[3]); - Result &= CanDrawOrHadNoSurface(Node->Children[4]); - Result &= CanDrawOrHadNoSurface(Node->Children[5]); - Result &= CanDrawOrHadNoSurface(Node->Children[6]); - Result &= CanDrawOrHadNoSurface(Node->Children[7]); + b32 Result = IsInitialized(Node->Children[0]); + Result &= IsInitialized(Node->Children[1]); + Result &= IsInitialized(Node->Children[2]); + Result &= IsInitialized(Node->Children[3]); + Result &= IsInitialized(Node->Children[4]); + Result &= IsInitialized(Node->Children[5]); + Result &= IsInitialized(Node->Children[6]); + Result &= IsInitialized(Node->Children[7]); return Result; } @@ -861,112 +861,97 @@ DrawOctreeRecursive( engine_resources *Engine, u32 Depth = 0 ) { UNPACK_ENGINE_RESOURCES(Engine); - world_chunk *Chunk = Node->Chunk; + Assert (Node); - if (Chunk) - { - Assert(Node->Chunk->Dim % World->ChunkDim == V3i(0)); - } + world_chunk *Chunk = Node->Chunk; + if (Chunk) { Assert(Node->Chunk->Dim % World->ChunkDim == V3i(0)); } f32 AABBLineDim = Max(1.f, Node->Resolution.x/12.f); - Assert (Node); + switch(Node->Type) { - switch(Node->Type) + InvalidCase(OctreeNodeType_Undefined); + + case OctreeNodeType_Branch: { - InvalidCase(OctreeNodeType_Undefined); + if (Chunk && EngineDebug->DrawBranchNodes) + { + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); + } - case OctreeNodeType_Branch: + if (Chunk && HasGpuMesh(&Chunk->Mesh) && EngineDebug->DrawBranchNodesWithMeshes) { - if (Chunk && EngineDebug->DrawBranchNodes) - { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); - } + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); + } - if (Chunk && HasGpuMesh(&Chunk->Mesh) && EngineDebug->DrawBranchNodesWithMeshes) - { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_ORANGE, AABBLineDim); - } + if (AllChildrenAreInitialized(Node)) + { + DrawOctreeRecursive(Engine, Node->Children[0], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[1], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[2], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[3], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[4], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[5], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[6], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + DrawOctreeRecursive(Engine, Node->Children[7], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); + } + else + { // Draw ourselves while we wait for children to initialize - if (ChildrenCanDrawOrHadNoMesh(Node)) + if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) { - DrawOctreeRecursive(Engine, Node->Children[0], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[1], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[2], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[3], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[4], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[5], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[6], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); - DrawOctreeRecursive(Engine, Node->Children[7], Node, Queue, MainDrawList, ShadowMapDrawList, Stats, Depth+1); - } - else - { // Draw ourselves; the mesh composed of the children has a hole. - - if (Node->Dirty) + if (Chunk) { - // Don't reinit dirty branch chunks; it causes a feedback loop and - // causes the whole tree up to the root node to reinit, which we - // don't want or need. - /* ReinitializeOctreeNode(Engine, Node, Stats); */ - } - /* else */ - { - if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) + if (ContainsCameraGhost(World, EntityTable, Node, GameCamera)) + { + EngineDebug->SelectedNode = Node; + } + + if (EngineDebug->DrawNodesWithChunks) { - if (Chunk) - { - if (ContainsCameraGhost(World, EntityTable, Node, GameCamera)) - { - EngineDebug->SelectedNode = Node; - } - - if (EngineDebug->DrawNodesWithChunks) - { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); - } - - if (HasGpuMesh(&Chunk->Mesh)) - { - Push(MainDrawList, Chunk); - Push(ShadowMapDrawList, Chunk); - } - } + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); + } + + if (HasGpuMesh(&Chunk->Mesh)) + { + Push(MainDrawList, Chunk); + Push(ShadowMapDrawList, Chunk); } } } - } break; + } + } break; - case OctreeNodeType_Leaf: + case OctreeNodeType_Leaf: + { + if (Node->Dirty && NotSet(Node->Flags, Chunk_Queued)) + { + PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Node, Parent); + } + + if (Chunk) { - if (Node->Dirty && NotSet(Node->Flags, Chunk_Queued)) + if (EngineDebug->DrawLeafNodes) { - PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Node, Parent); + DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); } - if (Chunk) + if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) { - if (EngineDebug->DrawLeafNodes) + if (EngineDebug->DrawNodesWithChunks) { DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); } - if (Depth == EngineDebug->OctreeDrawDepth || EngineDebug->OctreeDrawDepth == 0xFFFFFFFF) + if (HasGpuMesh(&Chunk->Mesh)) { - if (EngineDebug->DrawNodesWithChunks) - { - DEBUG_DrawChunkAABB(&GpuMap->Buffer, Graphics, Chunk, World->ChunkDim, RGB_GREEN, AABBLineDim); - } - - if (HasGpuMesh(&Chunk->Mesh)) - { - Push(MainDrawList, Chunk); - Push(ShadowMapDrawList, Chunk); - } + Push(MainDrawList, Chunk); + Push(ShadowMapDrawList, Chunk); } } + } - } break; + } break; - } } } From 101851ead7f65e6341b818fd6f9f6dd045bad60b Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 16 Jun 2025 11:24:01 -0700 Subject: [PATCH 304/421] Add terrain_render.cpp and DispatchTerrainShaders() --- examples/terrain_gen/game.cpp | 3 +- ...ditor_ui_for_compound_type_layered_brush.h | 25 ++++++ generated/serdes_struct_layered_brush.h | 14 ++++ src/engine/editor.cpp | 4 +- src/engine/editor.h | 2 +- src/engine/engine.cpp | 1 + src/engine/render_loop.cpp | 73 +---------------- src/engine/terrain_render.cpp | 80 +++++++++++++++++++ 8 files changed, 126 insertions(+), 76 deletions(-) create mode 100644 src/engine/terrain_render.cpp diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 5a98df9b4..ee8e2b1be 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -770,9 +770,10 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() canonical_position CameraTargetP = {}; auto VisibleRegionSize = VisibleRegionSize_128; + /* auto VisibleRegionSize = VisibleRegionSize_8192; */ v3i VisibleRegion = V3i(VisibleRegionSize); f32 DistanceFromTarget = 5000.f; - f32 FarClip = 150000.f; + f32 FarClip = 500000.f; StandardCamera(Graphics->Camera, FarClip, DistanceFromTarget); AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, VisibleRegionSize); diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 8b15d54e5..f143bb727 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -79,6 +79,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na + } + + + { + + + + cs MemberName = CSz("SeedBrushWithSelection"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(b8*, &Element->SeedBrushWithSelection), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 666cbf11e..05e3c6c93 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -48,6 +48,12 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush *BaseElement, umm Count = Result &= Serialize(Bytes, Element->Layers, ThisCount); } + + + + + Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -84,6 +90,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena Result &= Deserialize(Bytes, Element->Layers, Memory, Count); } + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 674480d24..ceee73aeb 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1135,8 +1135,8 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } { - /* DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->SeedBrushWithSelection, CSz("SeedBrushWithSelection"), &DefaultUiRenderParams_Checkbox); */ - /* PushNewRow(Ui); */ + DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->SeedBrushWithSelection, CSz("SeedBrushWithSelection"), &DefaultUiRenderParams_Checkbox); + PushNewRow(Ui); /* DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->BrushFollowsCursor, CSz("BrushFollowsCursor"), &DefaultUiRenderParams_Checkbox); */ /* PushNewRow(Ui); */ diff --git a/src/engine/editor.h b/src/engine/editor.h index 34d067250..2aceec974 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1181,7 +1181,7 @@ struct layered_brush /* chunk_thumbnail LayerPreviews[MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount) @no_serialize) */ /* chunk_thumbnail SeedLayer; poof(@no_serialize) // NOTE(Jesse): Special layer that acts as the seed value */ - /* b8 SeedBrushWithSelection; */ + b8 SeedBrushWithSelection; /* b8 BrushFollowsCursor; */ // NOTE(Jesse): These are the global settings for the brush when it gets applied to the world. diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 891552840..c4e036be7 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -37,6 +37,7 @@ #include #include // TODO(Jesse): Probably time to split this up? #include +#include #include #include diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 3b9e5ef73..defa242a3 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -294,78 +294,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) Assert(s64(Chunk) == s64(Chunk1)); - texture *InputTex = 0; - - // - // Launch terrain shaping shader - // - { - auto *RC = &Graphics->TerrainShapingRC; - - RC->WorldspaceChunkBasis = V3(Chunk->WorldP) * V3(64); - RC->ChunkResolution = V3(Chunk->DimInChunks); - - TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); - UseShader(RC); - - v2i DestTextureDim = RC->DestTex.Dim; - SetViewport(DestTextureDim); - Assert(DestTextureDim == V2i(68, 68*68)); - - RenderQuad(); - - AssertNoGlErrors; - InputTex = &RC->DestTex; - } - - - // - // Calculate derivs of terrain shaping step - // - { - auto *RC = &Graphics->TerrainDerivsRC; - - TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); - UseShader(RC); - - // @derivs_texture_binding_to_shader_unit_0 - BindUniformByName(&RC->Program, "InputTex", InputTex, 0); - - v2i DestTextureDim = RC->DestTex.Dim; - Assert(DestTextureDim == V2i(66, 66*66)); - SetViewport(DestTextureDim); - - RenderQuad(); - - AssertNoGlErrors; - - /* InputTex = &RC->DestTex; */ - } - - // - // Launch terrain decoration shader - // - { - auto *RC = &Graphics->TerrainDecorationRC; - - RC->WorldspaceChunkBasis = V3(Chunk->WorldP) * V3(64); - RC->ChunkResolution = V3(Chunk->DimInChunks); - - TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO->ID); - UseShader(RC); - // Using texture unit 1 because the DerivsTex is automatically bound in UseShader to unit 0 - // @derivs_texture_binding_to_shader_unit_0 - BindUniformByName(&RC->Program, "InputTex", InputTex, 1); - - RenderQuad(); - - AssertNoGlErrors; - - InputTex = RC->DestTex; - } + texture *InputTex = DispatchTerrainShaders(Graphics, Chunk); s32 PingPongIndex = 1; diff --git a/src/engine/terrain_render.cpp b/src/engine/terrain_render.cpp new file mode 100644 index 000000000..c32a87583 --- /dev/null +++ b/src/engine/terrain_render.cpp @@ -0,0 +1,80 @@ + + +link_internal texture * +DispatchTerrainShaders(graphics *Graphics, world_chunk *Chunk) +{ + texture *InputTex = 0; + + // + // Launch terrain shaping shader + // + { + auto *RC = &Graphics->TerrainShapingRC; + + RC->WorldspaceChunkBasis = V3(Chunk->WorldP) * V3(64); + RC->ChunkResolution = V3(Chunk->DimInChunks); + + TIMED_NAMED_BLOCK(TerrainDrawCall); + GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); + UseShader(RC); + + v2i DestTextureDim = RC->DestTex.Dim; + SetViewport(DestTextureDim); + Assert(DestTextureDim == V2i(68, 68*68)); + + RenderQuad(); + + AssertNoGlErrors; + InputTex = &RC->DestTex; + } + + + // + // Calculate derivs of terrain shaping step + // + { + auto *RC = &Graphics->TerrainDerivsRC; + + TIMED_NAMED_BLOCK(TerrainDrawCall); + GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); + UseShader(RC); + + // @derivs_texture_binding_to_shader_unit_0 + BindUniformByName(&RC->Program, "InputTex", InputTex, 0); + + v2i DestTextureDim = RC->DestTex.Dim; + Assert(DestTextureDim == V2i(66, 66*66)); + SetViewport(DestTextureDim); + + RenderQuad(); + + AssertNoGlErrors; + + /* InputTex = &RC->DestTex; */ + } + + // + // Launch terrain decoration shader + // + { + auto *RC = &Graphics->TerrainDecorationRC; + + RC->WorldspaceChunkBasis = V3(Chunk->WorldP) * V3(64); + RC->ChunkResolution = V3(Chunk->DimInChunks); + + TIMED_NAMED_BLOCK(TerrainDrawCall); + GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO->ID); + UseShader(RC); + // Using texture unit 1 because the DerivsTex is automatically bound in UseShader to unit 0 + // @derivs_texture_binding_to_shader_unit_0 + BindUniformByName(&RC->Program, "InputTex", InputTex, 1); + + RenderQuad(); + + AssertNoGlErrors; + + InputTex = RC->DestTex; + } + + return InputTex; +} From 6cfaf007e8667c7938158219c8ddb1dd35c2e086 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 16 Jun 2025 16:56:31 -0700 Subject: [PATCH 305/421] Make 3 ping-pong buffers --- generated/do_editor_ui_for_compound_type_layered_brush.h | 4 ++-- ..._for_compound_type_struct_world_edit_render_context.h | 8 ++++---- generated/serdes_struct_layered_brush.h | 4 ++-- shaders/terrain/shaping/terrain_shaping.fragmentshader | 9 ++++++--- src/engine/editor.cpp | 2 +- src/engine/editor.h | 2 +- src/engine/graphics.h | 4 ++-- src/engine/render/render_init.cpp | 2 +- src/engine/render_loop.cpp | 2 +- src/engine/terrain_render.cpp | 1 - 10 files changed, 20 insertions(+), 18 deletions(-) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index f143bb727..365a56d5e 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -86,11 +86,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na - cs MemberName = CSz("SeedBrushWithSelection"); + cs MemberName = CSz("AffectExisting"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(b8*, &Element->SeedBrushWithSelection), + Cast(b8*, &Element->AffectExisting), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 8f00b3aed..4434ea8da 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -88,11 +88,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El cs MemberName = CSz("PingPongFBOs"); - if (ToggleButton(Ui, CSz("v PingPongFBOs[2]"), CSz("> PingPongFBOs[2]"), UiId(Window, "toggle world_edit_render_context framebuffer PingPongFBOs", Element->PingPongFBOs), Params )) + if (ToggleButton(Ui, CSz("v PingPongFBOs[3]"), CSz("> PingPongFBOs[3]"), UiId(Window, "toggle world_edit_render_context framebuffer PingPongFBOs", Element->PingPongFBOs), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 2) + RangeIterator(ArrayIndex, 3) { DoEditorUi(Ui, Window, Element->PingPongFBOs+ArrayIndex, FSz("PingPongFBOs[%d]", ArrayIndex), Params); @@ -116,11 +116,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El cs MemberName = CSz("PingPongTextures"); - if (ToggleButton(Ui, CSz("v PingPongTextures[2]"), CSz("> PingPongTextures[2]"), UiId(Window, "toggle world_edit_render_context texture PingPongTextures", Element->PingPongTextures), Params )) + if (ToggleButton(Ui, CSz("v PingPongTextures[3]"), CSz("> PingPongTextures[3]"), UiId(Window, "toggle world_edit_render_context texture PingPongTextures", Element->PingPongTextures), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 2) + RangeIterator(ArrayIndex, 3) { DoEditorUi(Ui, Window, Element->PingPongTextures+ArrayIndex, FSz("PingPongTextures[%d]", ArrayIndex), Params); diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index 05e3c6c93..cba6e0508 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -52,7 +52,7 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush *BaseElement, umm Count = - Result &= Serialize(Bytes, &Element->SeedBrushWithSelection); // default + Result &= Serialize(Bytes, &Element->AffectExisting); // default @@ -96,7 +96,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->SeedBrushWithSelection, Memory); + Result &= Deserialize(Bytes, &Element->AffectExisting, Memory); diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index 0ead48788..44b441b30 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -260,20 +260,23 @@ void main() f32 z = floor(gl_FragCoord.y / 68); f32 y = floor(gl_FragCoord.y - (z*68)); + ivec2 InputTexCoord = ivec2(gl_FragCoord.x + 1, (y + 1) + (z * 68) + 68 ); + v4 TexLookup = V4(0.f); + v3 Offset = V3(-2, -2, -2); v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); // NOTE(Jesse): Set these in the -- user code -- section - v3 ColorValue = V3(0.2f, 0.2f, 0.2f); - f32 NoiseValue = 1.f; + v3 ColorValue = TexLookup.rgb; + f32 NoiseValue = TexLookup.a; // // -- user code -- // { f32 StartingZDepth = 800.f; - NoiseValue = StartingZDepth - Basis.z; + NoiseValue += StartingZDepth - Basis.z; f32 CliffMask = 1.f; #if 1 diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index ceee73aeb..2be280798 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -1135,7 +1135,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } { - DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->SeedBrushWithSelection, CSz("SeedBrushWithSelection"), &DefaultUiRenderParams_Checkbox); + DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->AffectExisting, CSz("AffectExisting"), &DefaultUiRenderParams_Checkbox); PushNewRow(Ui); /* DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->BrushFollowsCursor, CSz("BrushFollowsCursor"), &DefaultUiRenderParams_Checkbox); */ diff --git a/src/engine/editor.h b/src/engine/editor.h index 2aceec974..20df6b71a 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -1181,7 +1181,7 @@ struct layered_brush /* chunk_thumbnail LayerPreviews[MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount) @no_serialize) */ /* chunk_thumbnail SeedLayer; poof(@no_serialize) // NOTE(Jesse): Special layer that acts as the seed value */ - b8 SeedBrushWithSelection; + b8 AffectExisting; /* b8 BrushFollowsCursor; */ // NOTE(Jesse): These are the global settings for the brush when it gets applied to the world. diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 50b573d0d..d8e82a900 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -58,8 +58,8 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader { shader Program; shader_uniform Uniforms[4]; - framebuffer PingPongFBOs[2]; - texture PingPongTextures[2]; + framebuffer PingPongFBOs[3]; + texture PingPongTextures[3]; v3 *ChunkDim; poof(@uniform) v3 *WorldspaceChunkBasis; poof(@uniform) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index c8111fac1..373c4eae9 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -740,7 +740,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr InitializeWorldEditRenderContext(WorldEditRC, &TerrainShapingRC->ChunkDim, &TerrainShapingRC->WorldspaceChunkBasis, &TerrainShapingRC->ChunkResolution, {}); } - RangeIterator(Index, 2) + RangeIterator(Index, 3) { WorldEditRC->PingPongFBOs[Index] = GenFramebuffer(); GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[Index].ID); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index defa242a3..bbb48e9e9 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -556,7 +556,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) /* EndGpuTimer(&Timer); */ /* Push(&Graphics->GpuTimers, &Timer); */ InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; - PingPongIndex = (PingPongIndex + 1) & 1; + PingPongIndex = (PingPongIndex + 1) % s32(ArrayCount(WorldEditRC->PingPongTextures)); } } diff --git a/src/engine/terrain_render.cpp b/src/engine/terrain_render.cpp index c32a87583..55267bc44 100644 --- a/src/engine/terrain_render.cpp +++ b/src/engine/terrain_render.cpp @@ -4,7 +4,6 @@ link_internal texture * DispatchTerrainShaders(graphics *Graphics, world_chunk *Chunk) { texture *InputTex = 0; - // // Launch terrain shaping shader // From ad50f085be04fb265ecce7c401bb0015ff90757c Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 16 Jun 2025 19:42:03 -0700 Subject: [PATCH 306/421] Respect layered_brush::AffectExisting --- shaders/terrain/world_edit.fragmentshader | 21 +++++++- src/engine/render_loop.cpp | 62 +++++++++++++++++++---- 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 8a2493f0b..7b2153034 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -79,8 +79,12 @@ uniform f32 Squareness; // 0 == not square, 1 == square +uniform int SampleInputTex; uniform sampler2D InputTex; +uniform int SampleBlendTex; +uniform sampler2D BlendTex; + in vec2 UV; out vec4 Output; @@ -180,7 +184,11 @@ f32 IQSampleToBonsaiSample(f32 IQSample, f32 Radius) void main() { - v4 TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); + v4 TexLookup = vec4(0); + if (SampleInputTex > 0) + { + TexLookup = texelFetch(InputTex, ivec2(gl_FragCoord.xy), 0); + } // NOTE(Jesse): Set these in the -- user code -- section vec3 ColorValue = TexLookup.rgb; @@ -589,6 +597,17 @@ void main() } + if (SampleBlendTex > 0) + { + v4 TexLookup = texelFetch(BlendTex, ivec2(gl_FragCoord.xy), 0); + + if (Accumulator < TexLookup.a) + { + Accumulator = TexLookup.a; + ColorValue = TexLookup.rgb; + } + } + Output.rgb = ColorValue; Output.a = Accumulator; } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index bbb48e9e9..5ea2780b7 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -294,17 +294,17 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) Assert(s64(Chunk) == s64(Chunk1)); - texture *InputTex = DispatchTerrainShaders(Graphics, Chunk); + DispatchTerrainShaders(Graphics, Chunk); - s32 PingPongIndex = 1; + s32 CurrentAccumulationTextureIndex = 0; // // Apply edits // + auto WorldEditRC = &Graphics->WorldEditRC; { - auto WorldEditRC = &Graphics->WorldEditRC; AcquireFutex(&Node->Lock); if (TotalElements(&Node->Edits)) { @@ -334,6 +334,10 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) #endif // } + +#define AdvanceIndex(i) i = ((i+1) % 3) +#define Swap(a, b) do { auto tmp = b; b = a; a = tmp; } while (false) + RangeIterator(KeyIndex, EditCount) /* IterateOver(&Node->Edits, Edit, EditIndex) */ { @@ -345,12 +349,44 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) if (Edit->Brush) // NOTE(Jesse): Don't necessarily have to have a brush if we created the edit before we created a brush. { layered_brush *Brush = &Edit->Brush->Layered; + + + b32 BindInputTexture = Brush->AffectExisting; + + s32 CurrentWriteTextureIndex = CurrentAccumulationTextureIndex; + s32 CurrentReadTextureIndex = CurrentAccumulationTextureIndex; + + AdvanceIndex(CurrentWriteTextureIndex); + + // If we're not trying to seed the brush with the current + // accumulator texture, set to the empty one + if (BindInputTexture == False) + { + AdvanceIndex(CurrentReadTextureIndex); + AdvanceIndex(CurrentReadTextureIndex); + } + RangeIterator(LayerIndex, Brush->LayerCount) { - GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[PingPongIndex].ID); + GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[CurrentWriteTextureIndex].ID); - // @derivs_texture_binding_to_shader_unit_0 - BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 1); + BindUniformByName(&WorldEditRC->Program, "SampleInputTex", BindInputTexture); + if (BindInputTexture) + { + texture *InputTex = &WorldEditRC->PingPongTextures[CurrentReadTextureIndex]; + // @derivs_texture_binding_to_shader_unit_0 + BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 1); + } + BindInputTexture = True; + + b32 LastLayer = LayerIndex == Brush->LayerCount-1; + b32 BindBlendTex = (Brush->AffectExisting == False) && LastLayer; + BindUniformByName(&WorldEditRC->Program, "SampleBlendTex", BindBlendTex); + if (BindBlendTex) + { + texture *BlendTex = &WorldEditRC->PingPongTextures[CurrentAccumulationTextureIndex]; + BindUniformByName(&WorldEditRC->Program, "BlendTex", BlendTex, 2); + } brush_layer *Layer = Brush->Layers + LayerIndex; @@ -555,9 +591,11 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) RenderQuad(); /* EndGpuTimer(&Timer); */ /* Push(&Graphics->GpuTimers, &Timer); */ - InputTex = &WorldEditRC->PingPongTextures[PingPongIndex]; - PingPongIndex = (PingPongIndex + 1) % s32(ArrayCount(WorldEditRC->PingPongTextures)); + + Swap(CurrentWriteTextureIndex, CurrentReadTextureIndex); } + + CurrentAccumulationTextureIndex = CurrentReadTextureIndex; } AssertNoGlErrors; @@ -571,6 +609,8 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, zAxis*200.f, RGB_BLUE, DEFAULT_LINE_THICKNESS*4.f ); */ /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, PlaneNormal*400.f, RGB_PINK, DEFAULT_LINE_THICKNESS*2.f ); */ + texture *CurrentAccumulationTexture = &WorldEditRC->PingPongTextures[CurrentAccumulationTextureIndex]; + // // Terrain Finalize // @@ -584,7 +624,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) // this bind to unit 0 because there's no derivs texture being bound here. // // @derivs_texture_binding_to_shader_unit_0 - BindUniformByName(&Graphics->TerrainFinalizeRC.Program, "InputTex", InputTex, 0); + BindUniformByName(&Graphics->TerrainFinalizeRC.Program, "InputTex", CurrentAccumulationTexture, 0); /* gpu_timer Timer = StartGpuTimer(); */ RenderQuad(); @@ -598,7 +638,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) /* Assert(NoiseDim == V3(66)); */ v3i NoiseDim = V3i(66); - s32 NoiseElementCount = s32(Volume(InputTex->Dim)); + s32 NoiseElementCount = s32(Volume(CurrentAccumulationTexture->Dim)); s32 NoiseByteCount = NoiseElementCount*s32(sizeof(u16)); { @@ -611,7 +651,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); GL.BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); AssertNoGlErrors; - GL.ReadPixels(0, 0, InputTex->Dim.x, InputTex->Dim.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); + GL.ReadPixels(0, 0, CurrentAccumulationTexture->Dim.x, CurrentAccumulationTexture->Dim.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); AssertNoGlErrors; GL.BindBuffer(GL_PIXEL_PACK_BUFFER, 0); From a92bb774585e9a4c6766f80c86c09eca0c2bec7b Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 17 Jun 2025 09:23:49 -0700 Subject: [PATCH 307/421] Fix camera order-of-operations problem --- src/engine/api.cpp | 130 ++++++++++++++++++++++++--------------------- 1 file changed, 69 insertions(+), 61 deletions(-) diff --git a/src/engine/api.cpp b/src/engine/api.cpp index f2639ec25..06b2bdc3c 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -115,7 +115,73 @@ Bonsai_FrameBegin(engine_resources *Resources) UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); } - MaintainWorldOctree(Resources); + + // Must come before UNPACK_ENGINE_RESOURCES such that we unpack the correct GpuMap + /* Resources->Graphics.GpuBufferWriteIndex = 0; */ + /* Resources->Graphics.GpuBufferWriteIndex = (Resources->FrameIndex) % 2; */ + + + UNPACK_ENGINE_RESOURCES(Resources); + + + // NOTE(Jesse): Has to come after the UI happens such that we don't get a + // frame of camera-jank if the UI captures mouse input + // + // The specific case here is that if the camera updates, then the UI draws, + // and we're in paint-single mode (which captures the input) there's a frame + // where the camera updates, then freezes, which feels ultra-janky. Updating + // the UI, then the camera, avoids this order-of-operations issue. + // + // @camera-update-ui-update-frame-jank + // + // Unfortunately, this actually re-introduces another order-of-operations issue + // which I've fixed in the past, which is that the immediate geometry is a + // frame late. + // + // @immediate-geometry-is-a-frame-late + // + // NOTE(Jesse): This has to come before we draw any of the game geometry. + // Specifically, if it comes after we draw bounding boxes for anything + // the bounding box lines shift when we move the camera because they're + // then a frame late. + // + // @immediate-geometry-is-a-frame-late + // + // UPDATE(Jesse): This bug has been reintroduced because of @camera-update-ui-update-frame-jank + // More info and a solution documented at : https://github.com/scallyw4g/bonsai/issues/30 + // + // UPDATE(Jesse): I fixed this again because the @camera-update-ui-update-frame-jank bug is + // gone. Got rid of paint-single mode in the way it was being done, and the new way shouldn't + // have that problem, when I get around to implementing it. + // + // { + + cp CameraTargetP = {}; + + entity *CameraGhost = GetEntity(EntityTable, Camera->GhostId); + if (CameraGhost == 0) + { + // Allocate default camera ghost + Camera->GhostId = GetFreeEntity(EntityTable); + CameraGhost = GetEntity(EntityTable, Camera->GhostId); + CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior | EntityBehaviorFlags_DefatulCameraGhostBehavior); + SpawnEntity(CameraGhost); + } + + if (CameraGhost) { CameraTargetP = CameraGhost->P; } + + b32 DoPositionDelta = (!UiCapturedMouseInput(Ui) && UiInteractionWasViewport(Ui)); + + // NOTE(Jesse): Don't remember what bug I fixed by changing this to DoPositionDelta, + // but it broke scrolling on laptop trackpads (where nothing is clicked). Going to + // remove it until I remember what the bug was .. + /* b32 DoZoomDelta = DoPositionDelta; */ + b32 DoZoomDelta = UiHoveredMouseInput(Ui) == False; + + v2 MouseDelta = GetMouseDelta(Plat); + UpdateGameCamera(World, MouseDelta, &Plat->Input, CameraTargetP, Camera, Plat->dt, DoPositionDelta, DoZoomDelta); + // } + /* Resources->World->ChunkHash = CurrentWorldHashtable(Resources); */ @@ -134,12 +200,7 @@ Bonsai_FrameBegin(engine_resources *Resources) // SimulateCameraGhost_AndSet_OffsetWorldCenterToGrid(Resources); - // Must come before UNPACK_ENGINE_RESOURCES such that we unpack the correct GpuMap - /* Resources->Graphics.GpuBufferWriteIndex = 0; */ - /* Resources->Graphics.GpuBufferWriteIndex = (Resources->FrameIndex) % 2; */ - - - UNPACK_ENGINE_RESOURCES(Resources); + MaintainWorldOctree(Resources); if (GetEngineDebug()->DrawWorldAxies) { @@ -185,7 +246,7 @@ Bonsai_FrameBegin(engine_resources *Resources) { if (Camera == &Graphics->GameCamera) { - Resources->MaybeMouseRay = ComputeCameraSpaceRayFromCursor(Resources, &gBuffer->ViewProjection, &Resources->Graphics.GameCamera, World->ChunkDim); + Resources->MaybeMouseRay = ComputeCameraSpaceRayFromCursor(Resources, &gBuffer->ViewProjection, &Resources->Graphics.GameCamera, World->ChunkDim); ray *Ray = &Resources->MaybeMouseRay.Ray; v3 GameCameraSimSpaceP = GetSimSpaceP(World, Graphics->GameCamera.CurrentP); @@ -401,59 +462,6 @@ Bonsai_Simulate(engine_resources *Resources) } Camera = Graphics->Camera; } - - // NOTE(Jesse): Has to come after the UI happens such that we don't get a - // frame of camera-jank if the UI captures mouse input - // - // The specific case here is that if the camera updates, then the UI draws, - // and we're in paint-single mode (which captures the input) there's a frame - // where the camera updates, then freezes, which feels ultra-janky. Updating - // the UI, then the camera, avoids this order-of-operations issue. - // - // @camera-update-ui-update-frame-jank - // - // Unfortunately, this actually re-introduces another order-of-operations issue - // which I've fixed in the past, which is that the immediate geometry is a - // frame late. - // - // @immediate-geometry-is-a-frame-late - // - // NOTE(Jesse): This has to come before we draw any of the game geometry. - // Specifically, if it comes after we draw bounding boxes for anything - // the bounding box lines shift when we move the camera because they're - // then a frame late. - // - // @immediate-geometry-is-a-frame-late - // - // UPDATE(Jesse): This bug has been reintroduced because of @camera-update-ui-update-frame-jank - // More info and a solution documented at : https://github.com/scallyw4g/bonsai/issues/30 - // - - cp CameraTargetP = {}; - - entity *CameraGhost = GetEntity(EntityTable, Camera->GhostId); - if (CameraGhost == 0) - { - // Allocate default camera ghost - Camera->GhostId = GetFreeEntity(EntityTable); - CameraGhost = GetEntity(EntityTable, Camera->GhostId); - CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior | EntityBehaviorFlags_DefatulCameraGhostBehavior); - SpawnEntity(CameraGhost); - } - - if (CameraGhost) { CameraTargetP = CameraGhost->P; } - - b32 DoPositionDelta = (!UiCapturedMouseInput(Ui) && UiInteractionWasViewport(Ui)); - - // NOTE(Jesse): Don't remember what bug I fixed by changing this to DoPositionDelta, - // but it broke scrolling on laptop trackpads (where nothing is clicked). Going to - // remove it until I remember what the bug was .. - /* b32 DoZoomDelta = DoPositionDelta; */ - b32 DoZoomDelta = UiHoveredMouseInput(Ui) == False; - - v2 MouseDelta = GetMouseDelta(Plat); - UpdateGameCamera(World, MouseDelta, &Plat->Input, CameraTargetP, Camera, Plat->dt, DoPositionDelta, DoZoomDelta); - // TODO(Jesse)(correctness, nopush): This should actually be passing the back-buffer resolution?? From 561fd59ab6171c1781155b45fac501f719111222 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 17 Jun 2025 15:31:53 -0700 Subject: [PATCH 308/421] Cleanup SDFs a little --- shaders/terrain/world_edit.fragmentshader | 109 ++++++---------------- 1 file changed, 30 insertions(+), 79 deletions(-) diff --git a/shaders/terrain/world_edit.fragmentshader b/shaders/terrain/world_edit.fragmentshader index 7b2153034..cee1a9d74 100644 --- a/shaders/terrain/world_edit.fragmentshader +++ b/shaders/terrain/world_edit.fragmentshader @@ -126,6 +126,17 @@ float iq_sdCylinder( vec3 p, vec3 c ) return length(p.xz-c.xy)-c.z; } +// p == sample point +// a == start point +// b == end point +// r == radius +float iq_sdRoundedLine( vec3 p, vec3 a, vec3 b, float r ) +{ + vec3 pa = p - a, ba = b - a; + float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 ); + return length( pa - ba*h ) - r; +} + // p == sample point // t.x == major radius // t.y == minor radius @@ -244,6 +255,7 @@ void main() case 2: // NoiseType_White: { + InitialSample = white_noise(NoiseBasis); } break; } @@ -257,56 +269,32 @@ void main() // ShapeType_Rect case 0: { -#if 1 v3 BoxR = (EditDim/4.f); - v3 p = BoxR - (EditRelxyz-BoxR); - - // NOTE(Jesse): Remap by box radius such that we get a 0-1 value out - p /= BoxR; - - v4 w = DoInputTransforms(p, RotMatrix, Stretch, Repeat); - + v3 p = (BoxR - (EditRelxyz-BoxR)) / BoxR; + v4 w = DoInputTransforms(p, RotMatrix, Stretch, Repeat); f32 IQSample = w.w+iq_sdBox(w.xyz, V3(1.f)); - /* InitialSample = IQSampleToBonsaiSample(IQSample, 1.f); */ InitialSample = -IQSample; -#else - InitialSample = 1.f; -#endif } break; // ShapeType_Sphere case 1: { -#if 1 v3 p = (EditRelxyz - EditRelativeSphereCenter)/Radius; - -#if 1 v4 w = DoInputTransforms(p, RotMatrix, Stretch, Repeat); -#else - p *= RotMatrix; - p = iq_opRepetition(p, Repeat); - v4 w = iq_opElongate(p, Stretch); -#endif - f32 IQSample = w.w+iq_sdSphere(w.xyz, Radius); - InitialSample = -IQSample; //IQSampleToBonsaiSample(IQSample, Radius); -#else - f32 DistFromCenter = distance(EditRelativeSphereCenter, EditRelxyz); - InitialSample = ((Radius-DistFromCenter)/Radius); -#endif + InitialSample = -IQSample; } break; // ShapeType_Line case 2: { - // TODO(Jesse): Mr. Jippity said this is how to do distance to - // line and it works, although I'm not sure it's necessarily a very good way to do it .. - v3 Line = normalize(ChunkRelEditMax-ChunkRelEditMin); - v3 X = cross(Line, EditRelxyz); - f32 Dist = length(X)/length(Line); - /* if (Dist < Radius) { InitialSample = ((Radius-Dist)/Radius)*Power; } */ - /* if (Dist < Radius) { InitialSample = Dist*Power; } */ - if (Dist < Radius) { InitialSample = 1.f; } + v3 p = EditRelxyz; + v3 start = v3(Radius); + v3 end = EditDim-v3(Radius); + + v4 w = DoInputTransforms(p, RotMatrix, Stretch, Repeat); + f32 IQSample = w.w+iq_sdRoundedLine(w.xyz, start, end, Radius); + InitialSample = -IQSample; } break; // ShapeType_Cylinder @@ -317,53 +305,11 @@ void main() f32 r = 4.f; f32 h = 102.f; - /* f32 IQSample = iq_sdCylinder(p, c); */ v4 w = DoInputTransforms(p, RotMatrix, Stretch, Repeat); f32 IQSample = w.w+iq_sdCappedCylinder(w.xyz, Height, Radius); InitialSample = -IQSample; -#if 0 - v3 AxisMask; - v3 InvAxisMask; - - switch (Orientation) - { - case 0: // VoxelRuleDir_PosX - case 1: // VoxelRuleDir_NegX - { - AxisMask = V3(1,0,0); - InvAxisMask = V3(0.f,1.f,1.f)*0.5f; - } break; - - case 2: // VoxelRuleDir_PosY - case 3: // VoxelRuleDir_NegY - { - AxisMask = V3(0,1,0); - InvAxisMask = V3(1.f,0.f,1.f)*0.5f; - } break; - - case 4: // VoxelRuleDir_PosZ - case 5: // VoxelRuleDir_NegZ - { - AxisMask = V3(0,0,1); - InvAxisMask = V3(1.f,1.f,0.f)*0.5f; - } break; - } - - v3 MajorAxis = EditDim*AxisMask; - v3 MinorAxies = EditDim*InvAxisMask; - - v3 ChunkRelP0 = MinorAxies; - v3 ChunkRelP1 = MinorAxies + MajorAxis; - - v3 Line = ChunkRelP1 - ChunkRelP0; - v3 LineRelativeXYZ = EditRelxyz - ChunkRelP0; - - v3 X = cross(Line, LineRelativeXYZ); - f32 Dist = length(X)/length(Line); - if (Dist < Radius) { InitialSample = 1.f; } -#endif } break; // ShapeType_Plane @@ -601,10 +547,15 @@ void main() { v4 TexLookup = texelFetch(BlendTex, ivec2(gl_FragCoord.xy), 0); - if (Accumulator < TexLookup.a) + if (Accumulator <= 0.f) + /* if (TexLookup.a > 0.f) */ { - Accumulator = TexLookup.a; - ColorValue = TexLookup.rgb; + // Take Max of Accumulator or current world value + if (Accumulator < TexLookup.a) + { + Accumulator = TexLookup.a; + ColorValue = TexLookup.rgb; + } } } From e4382bc6ff23feb9bd6253ba7c29f5f56ea8173f Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 09:32:41 -0700 Subject: [PATCH 309/421] Minor debugging/tuning in PushOctreeNodeToPriorityQueue --- src/engine/world.cpp | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/engine/world.cpp b/src/engine/world.cpp index c1d5685d7..f9aaef087 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -610,19 +610,12 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) return Result; } +#define RatioToListIndex(i) (OCTREE_PRIORITY_QUEUE_LIST_COUNT-1) - Min(s32(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1), s32(i)); -link_internal b32 -PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_priority_queue *Queue, octree_node *Node, octree_node *Parent) +link_internal s32 +ComputePriorityIndex(world *World, octree_node *Node, octree_node *Parent, camera *GameCamera) { - Assert(NotSet(Node, Chunk_Queued)); - - b32 Result = False; - - s32 IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, - 2*Node->Resolution.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); - - // Flip such that the larger a node was in world space, the higher it is in the priority list - IdealListIndex = (OCTREE_PRIORITY_QUEUE_LIST_COUNT-1)-IdealListIndex; + s32 IdealListIndex = RatioToListIndex(2*Node->Resolution.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); // Penalize nodes not in the frustum if (IsInFrustum(World, GameCamera, Node) == False) @@ -630,25 +623,44 @@ PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_prio IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, IdealListIndex+15); } + // Prefer chunks closer to the camera + + v3 SimP = GetSimSpaceP(World, Node->WorldP); + v3 CameraSimP = GetSimSpaceP(World, GameCamera->CurrentP); + s32 DistanceFactor = RatioToListIndex(Abs(Distance(SimP, CameraSimP)) / 500.f); + + IdealListIndex = Max(0, IdealListIndex-DistanceFactor); + // Prefer chunks who have a higher chance of having geometry if (Parent && Parent->Chunk && HasGpuMesh(&Parent->Chunk->Mesh)) { - IdealListIndex = Max(0, IdealListIndex-3); + IdealListIndex = Max(0, IdealListIndex-30); } // Prefer chunks who have been edited if (Count(&Node->Edits)) { - IdealListIndex = Max(0, IdealListIndex-10); + IdealListIndex = Max(0, IdealListIndex-100); } // Prefer chunks who are dirty if (Node->Dirty) { - IdealListIndex = Max(0, IdealListIndex-10); + IdealListIndex = Max(0, IdealListIndex-100); } Assert(IdealListIndex >= 0 && IdealListIndex < OCTREE_PRIORITY_QUEUE_LIST_COUNT); + return IdealListIndex; +} + +link_internal b32 +PushOctreeNodeToPriorityQueue(world *World, camera *GameCamera, octree_node_priority_queue *Queue, octree_node *Node, octree_node *Parent) +{ + Assert(NotSet(Node, Chunk_Queued)); + + b32 Result = False; + + s32 IdealListIndex = ComputePriorityIndex(World, Node, Parent, GameCamera); if (Remaining(&Queue->Lists[IdealListIndex])) { Push(&Queue->Lists[IdealListIndex], Node); @@ -762,7 +774,7 @@ SplitOctreeNode_Recursive( engine_resources *Engine, octree_node_priority_queue { if (Initialized) { - if (Chunk) { if (HasGpuMesh(&Chunk->Mesh) == False) { NodeToSplit->Chunk = 0; FreeWorldChunk(Engine, Chunk); Chunk = 0; }} + if (Chunk) { if (HasGpuMesh(&Chunk->Mesh) == False) { NodeToSplit->Chunk = 0; FreeWorldChunk(Engine, Chunk); Chunk = 0; /* Info("%d", ComputePriorityIndex(World, NodeToSplit, Parent, GameCamera)); */ }} if (Dirty) { PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, NodeToSplit, Parent); } } else From 549af93ff5786b776de798297de81710db636e2e Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 09:34:59 -0700 Subject: [PATCH 310/421] WIP debugging shadow maps --- external/bonsai_debug | 2 +- ..._work_queue_entry__bonsai_render_command.h | 6 ++- ..._work_queue_entry__bonsai_render_command.h | 2 +- ...ent_buffer_untextured_3d_geometry_buffer.h | 2 +- ..._work_queue_entry__bonsai_render_command.h | 4 +- jesse.make.sh | 2 +- settings.init | 8 +-- shaders/Lighting.fragmentshader | 9 ++-- src/engine/api.cpp | 15 ++++-- src/engine/light.h | 9 ++-- src/engine/render.cpp | 49 +++++++++---------- src/engine/render.h | 10 ++++ src/engine/render_command.cpp | 4 +- src/engine/render_command.h | 1 + src/engine/render_loop.cpp | 19 +++---- src/engine/render_position.h | 18 +++---- 16 files changed, 86 insertions(+), 74 deletions(-) diff --git a/external/bonsai_debug b/external/bonsai_debug index 5f31a8438..36ef297c3 160000 --- a/external/bonsai_debug +++ b/external/bonsai_debug @@ -1 +1 @@ -Subproject commit 5f31a8438ac14a28a1457cdc0c1f9c0e25cbfa7d +Subproject commit 36ef297c3c765773d071e19691fda27d2ef57f6d diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index 313c021a8..9898ddbd0 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:219:0 +// src/engine/render_command.h:220:0 link_internal work_queue_entry__bonsai_render_command @@ -499,12 +499,14 @@ BonsaiRenderCommandSetShaderUniform( shader_uniform Uniform , shader * Shade } link_internal bonsai_render_command_draw_world_chunk_draw_list -BonsaiRenderCommandDrawWorldChunkDrawList( world_chunk_ptr_paged_list * DrawList , shader * Shader ) +BonsaiRenderCommandDrawWorldChunkDrawList( world_chunk_ptr_paged_list * DrawList , shader * Shader , camera * Camera ) { bonsai_render_command_draw_world_chunk_draw_list Reuslt = { .DrawList = DrawList , .Shader = Shader +, + .Camera = Camera }; diff --git a/generated/d_union_work_queue_entry__bonsai_render_command.h b/generated/d_union_work_queue_entry__bonsai_render_command.h index 417235092..ea541b819 100644 --- a/generated/d_union_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:178:0 +// src/engine/render_command.h:179:0 enum work_queue_entry__bonsai_render_command_type { diff --git a/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h b/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h index f1da66ab1..dd3238bf7 100644 --- a/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h +++ b/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/render.cpp:1045:0 +// src/engine/render.cpp:1036:0 link_internal void diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index dcd65914c..97433e4a5 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -168,11 +168,11 @@ PushBonsaiRenderCommandSetShaderUniform( link_internal void PushBonsaiRenderCommandDrawWorldChunkDrawList( work_queue *RenderQueue - , world_chunk_ptr_paged_list* DrawList , shader* Shader + , world_chunk_ptr_paged_list* DrawList , shader* Shader , camera* Camera ) { work_queue_entry Work = WorkQueueEntry( - WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDrawWorldChunkDrawList( DrawList , Shader ))); + WorkQueueEntryBonsaiRenderCommand( BonsaiRenderCommandDrawWorldChunkDrawList( DrawList , Shader , Camera ))); PushWorkQueueEntry(RenderQueue, &Work); } diff --git a/jesse.make.sh b/jesse.make.sh index 11051035c..384beb04f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/settings.init b/settings.init index bcc472832..14279f01f 100644 --- a/settings.init +++ b/settings.init @@ -3,8 +3,8 @@ // NOTE(Jesse): Resolution of the back-buffers the renderer allocates // - resolution = ResolutionSetting_4096x2160 -// resolution = ResolutionSetting_1920x1080 +// resolution = ResolutionSetting_4096x2160 + resolution = ResolutionSetting_1920x1080 // resolution = ResolutionSetting_1280x720 @@ -14,8 +14,8 @@ // When I get around to improving the shadows it'll control more than that.. // -// shadow_quality = ShadowQualitySetting_High - shadow_quality = ShadowQualitySetting_Med + shadow_quality = ShadowQualitySetting_High +// shadow_quality = ShadowQualitySetting_Med // shadow_quality = ShadowQualitySetting_Low // shadow_quality = ShadowQualitySetting_Off diff --git a/shaders/Lighting.fragmentshader b/shaders/Lighting.fragmentshader index ef4eb6265..cb5ff4b3e 100644 --- a/shaders/Lighting.fragmentshader +++ b/shaders/Lighting.fragmentshader @@ -250,11 +250,12 @@ void main() /* out_LightColor = FragPShadowSpace; */ /* return; */ + float ShadowSampleDepth = texture(shadowMap, FragPShadowSpace.xy ).x; // + acneBias; + if ( FragDepth > ShadowSampleDepth ) { ShadowVisibility -= vec3(1.f); } - v2 ShadowMapUVStep = vec2(1.f)/ShadowMapResolution; + /* out_LightColor = vec4(ShadowSampleDepth, ShadowSampleDepth, ShadowSampleDepth, 1.f); */ + /* return; */ - float ShadowSampleDepth = texture(shadowMap, FragPShadowSpace.xy ).x + acneBias; - if ( FragDepth > ShadowSampleDepth ) { ShadowVisibility -= vec3(1.f); } // NOTE(Jesse): This is misguided. The correct thing to do is to write // shadow information to a buffer, then sample that buffer using a box filter @@ -270,6 +271,8 @@ void main() // Might be fine if the sun location was a fixed point, but that seems lame. // #if 0 + v2 ShadowMapUVStep = vec2(1.f)/ShadowMapResolution; + // TODO(Jesse): Does this produce better results using texelFetch? vec2 Mapped = vec2(FragPShadowSpace.xy + vec2(ShadowMapUVStep.x, 0.f)); ShadowSampleDepth = texture(shadowMap, Mapped).x + acneBias; diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 06b2bdc3c..0e437988b 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -462,10 +462,10 @@ Bonsai_Simulate(engine_resources *Resources) } Camera = Graphics->Camera; } - // TODO(Jesse)(correctness, nopush): This should actually be passing the back-buffer resolution?? - m4 ViewMat = ViewMatrix(World->ChunkDim, Camera); + + // TODO(Jesse)(correctness, nopush): This should actually be passing the back-buffer resolution?? m4 ProjMat = ProjectionMatrix(Camera, Plat->ScreenDim); Resources->Graphics.gBuffer->InverseViewMatrix = Inverse(ViewMat); @@ -482,11 +482,11 @@ Bonsai_Simulate(engine_resources *Resources) PushBonsaiRenderCommandGlTimerStart(&Plat->RenderQ, Graphics->gBuffer->GlTimerObject); PushBonsaiRenderCommandSetupShader(&Plat->RenderQ, BonsaiRenderCommand_ShaderId_gBuffer); - PushBonsaiRenderCommandDrawWorldChunkDrawList(&Plat->RenderQ, &Graphics->MainDrawList, &Graphics->gBuffer->gBufferShader); + PushBonsaiRenderCommandDrawWorldChunkDrawList(&Plat->RenderQ, &Graphics->MainDrawList, &Graphics->gBuffer->gBufferShader, &Graphics->GameCamera); PushBonsaiRenderCommandTeardownShader(&Plat->RenderQ, BonsaiRenderCommand_ShaderId_gBuffer); PushBonsaiRenderCommandSetupShader(&Plat->RenderQ, BonsaiRenderCommand_ShaderId_ShadowMap); - PushBonsaiRenderCommandDrawWorldChunkDrawList(&Plat->RenderQ, &Graphics->ShadowMapDrawList, &Graphics->SG->Shader.Program); + PushBonsaiRenderCommandDrawWorldChunkDrawList(&Plat->RenderQ, &Graphics->ShadowMapDrawList, &Graphics->SG->Shader.Program, 0); PushBonsaiRenderCommandTeardownShader(&Plat->RenderQ, BonsaiRenderCommand_ShaderId_ShadowMap); PushBonsaiRenderCommandGlTimerEnd(&Plat->RenderQ, Graphics->gBuffer->GlTimerObject); @@ -587,6 +587,13 @@ Bonsai_Render(engine_resources *Engine) }; + auto SunP = Graphics->Settings.Lighting.SunP; + auto Target = GetRenderP(World->ChunkDim, ComputeTarget(&Graphics->GameCamera), &Graphics->GameCamera); + + DEBUG_VALUE(&SunP); + DEBUG_VALUE(&Target); + + PushBonsaiRenderCommandSetupShader(&Plat->RenderQ, BonsaiRenderCommand_ShaderId_gBuffer); PushBonsaiRenderCommandSetShaderUniform(&Plat->RenderQ, MinorGridUniform, &Graphics->gBuffer->gBufferShader, -1); PushBonsaiRenderCommandSetShaderUniform(&Plat->RenderQ, MajorGridUniform, &Graphics->gBuffer->gBufferShader, -1); diff --git a/src/engine/light.h b/src/engine/light.h index d9b7dca89..b3322b448 100644 --- a/src/engine/light.h +++ b/src/engine/light.h @@ -18,7 +18,6 @@ struct game_lights }; - struct lighting_render_group { game_lights Lights; @@ -56,10 +55,10 @@ DoLight(game_lights *Lights, v3 RenderPosition, v3 Color) /* #define SHADOW_MAP_RESOLUTION_X (2*1024) */ /* #define SHADOW_MAP_RESOLUTION_Y (2*1024) */ -#define SHADOW_MAP_X 512 -#define SHADOW_MAP_Y 512 -#define SHADOW_MAP_Z_MIN -512 -#define SHADOW_MAP_Z_MAX 512 +#define SHADOW_MAP_X 1024*4 +#define SHADOW_MAP_Y 1024*4 +#define SHADOW_MAP_Z_MIN -1024*4 +#define SHADOW_MAP_Z_MAX 1024*4 /* #define SHADOW_MAP_X 512 */ /* #define SHADOW_MAP_Y 512 */ diff --git a/src/engine/render.cpp b/src/engine/render.cpp index ccdeba4f8..e2e65d00a 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -69,27 +69,22 @@ Debug_DrawTextureToDebugQuad( shader *DebugShader ) #endif inline m4 -GetShadowMapMVP(v3 SunP, v3 FrustumCenter) +GetShadowMapMVP(world *World, camera *Camera, v3 SunP) { - // Compute the MVP matrix from the light's point of view - /* v3 Translate = GetRenderP(Camera->Target, Camera); */ m4 depthProjectionMatrix = Orthographic(SHADOW_MAP_X, SHADOW_MAP_Y, SHADOW_MAP_Z_MIN, SHADOW_MAP_Z_MAX); - v3 Front = Normalize(SunP); - v3 Right = Cross(Front, V3(0,1,0)); - v3 Up = Cross(Right, Front); - - v3 Target = FrustumCenter; + v3 Target = {}; + v3 Up = V3(0.f, 1.f, 0.f); m4 depthViewMatrix = LookAt(SunP, Target, Up); return depthProjectionMatrix * depthViewMatrix; } link_internal void -RenderImmediateGeometryToShadowMap(gpu_mapped_element_buffer *GpuMap, graphics *Graphics) +RenderImmediateGeometryToShadowMap(world *World, graphics *Graphics, gpu_mapped_element_buffer *GpuMap) { TIMED_FUNCTION(); @@ -100,15 +95,11 @@ RenderImmediateGeometryToShadowMap(gpu_mapped_element_buffer *GpuMap, graphics * // @duplicate_shadow_map_MVP_calculation - v3 FrustCenter = GetFrustumCenter(Graphics->Camera); - SG->Shader.MVP = GetShadowMapMVP(Graphics->Settings.Lighting.SunP, FrustCenter); - - /* GL.UniformMatrix4fv(SG->MVP_ID, 1, GL_FALSE, &SG->MVP.E[0].E[0]); */ + /* v3 FrustCenter = GetFrustumCenter(&Graphics->GameCamera); */ + SG->Shader.MVP = GetShadowMapMVP(World, &Graphics->GameCamera, Graphics->Settings.Lighting.SunP); UseShader(&SG->Shader); - /* BindUniformByName(&SG->DepthShader, "ModelMatrix", &IdentityMatrix); */ - Draw(GpuMap->Buffer.At); GL.BindFramebuffer(GL_FRAMEBUFFER, 0); @@ -1393,7 +1384,7 @@ TeardownGBufferShader(graphics *Graphics) link_internal void -SetupShadowMapShader(graphics *Graphics, v2i ShadowMapResolution, b32 DoSelectionMasking) +SetupShadowMapShader(world *World, graphics *Graphics, v2i ShadowMapResolution, b32 DoSelectionMasking) { shadow_render_group *SG = Graphics->SG; @@ -1417,13 +1408,11 @@ SetupShadowMapShader(graphics *Graphics, v2i ShadowMapResolution, b32 DoSelectio // TODO(Jesse): Duplicate MVP calculation // @duplicate_shadow_map_MVP_calculation - v3 FrustCenter = GetFrustumCenter(Graphics->Camera); - SG->Shader.MVP = GetShadowMapMVP(Graphics->Settings.Lighting.SunP, FrustCenter); + /* v3 FrustCenter = GetFrustumCenter(&Graphics->GameCamera); */ + SG->Shader.MVP = GetShadowMapMVP(World, &Graphics->GameCamera, Graphics->Settings.Lighting.SunP); UseShader(&SG->Shader); - /* GL.UniformMatrix4fv(SG->MVP_ID, 1, GL_FALSE, &SG->MVP.E[0].E[0]); */ - GL.Disable(GL_CULL_FACE); AssertNoGlErrors; @@ -1545,18 +1534,24 @@ ComputeDrawListsAndQueueUnallocatedChunks(engine_resources *Engine) } link_internal void -RenderDrawList(engine_resources *Engine, world_chunk_ptr_paged_list *DrawList, shader *Shader) +RenderDrawList(engine_resources *Engine, world_chunk_ptr_paged_list *DrawList, shader *Shader, camera *Camera) { - UNPACK_ENGINE_RESOURCES(Engine); + world *World = Engine->World;; + IterateOver(DrawList, Chunk, ChunkIndex) { - // In case gpu meshes got deallocated after the chunk was added to the draw list if (HasGpuMesh(&Chunk->Mesh)) { - v3 CameraP = GetSimSpaceP(World, Camera->CurrentP); - - v3 Basis = GetRenderP(Engine, Chunk->WorldP); + v3 Basis; + if (Camera) + { + Basis = GetRenderP(World->ChunkDim, Chunk->WorldP, Camera); + } + else + { + Basis = GetSimSpaceP(World, Chunk->WorldP); + } DrawLod(Engine, Shader, &Chunk->Mesh, 0.f, Basis, Quaternion(), V3(Chunk->DimInChunks)); AssertNoGlErrors; } @@ -1628,7 +1623,7 @@ DrawWorldAndEntitiesToShadowMap(v2i ShadowMapResolution, engine_resources *Engin shadow_render_group *SG = Graphics->SG; b32 MaskSelection = False; - SetupShadowMapShader(Graphics, ShadowMapResolution, MaskSelection); + SetupShadowMapShader(World, Graphics, ShadowMapResolution, MaskSelection); // NOTE(Jesse): So there's a visual distinction between preview and instantiated /* DrawEditorPreview(Engine, &SG->DepthShader); */ diff --git a/src/engine/render.h b/src/engine/render.h index eff83f0e7..c115b8335 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -77,12 +77,22 @@ Orthographic( r32 X, r32 Y, r32 Zmin, r32 Zmax) r32 f = Zmax; r32 n = Zmin; +#if 1 + // TODO(Jesse): Pretty sure this should use floats .. m4 Result = { V4(2/(r-l), 0 , 0 , -1*((r+l)/(r-l)) ), V4(0 , 2/(t-b), 0 , -1*((t+b)/(t-b)) ), V4(0 , 0 , -2/(f-n), -1*((f+n)/(f-n)) ), V4(0 , 0 , 0 , 1) }; +#else + m4 Result = { + V4(2.f/(r-l), 0.f , 0.f , -1.f*((r+l)/(r-l)) ), + V4(0.f , 2.f/(t-b), 0.f , -1.f*((t+b)/(t-b)) ), + V4(0.f , 0.f , -2.f/(f-n), -1.f*((f+n)/(f-n)) ), + V4(0.f , 0.f , 0.f , 1.f) + }; +#endif return Result; } diff --git a/src/engine/render_command.cpp b/src/engine/render_command.cpp index f7af231bd..6aa384edc 100644 --- a/src/engine/render_command.cpp +++ b/src/engine/render_command.cpp @@ -75,9 +75,9 @@ PushSetupShaderCommand(work_queue *RenderQueue, bonsai_render_command_shader_id } link_internal void -PushDrawWorldChunkDrawListCommand(work_queue *RenderQueue, world_chunk_ptr_paged_list *DrawList, shader *Shader) +PushDrawWorldChunkDrawListCommand(work_queue *RenderQueue, world_chunk_ptr_paged_list *DrawList, shader *Shader, camera *Camera) { - work_queue_entry Work = WorkQueueEntry(WorkQueueEntryBonsaiRenderCommand(BonsaiRenderCommandDrawWorldChunkDrawList(DrawList, Shader))); + work_queue_entry Work = WorkQueueEntry(WorkQueueEntryBonsaiRenderCommand(BonsaiRenderCommandDrawWorldChunkDrawList(DrawList, Shader, Camera))); PushWorkQueueEntry(RenderQueue, &Work); } diff --git a/src/engine/render_command.h b/src/engine/render_command.h index 318896d22..e98a3c62f 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -102,6 +102,7 @@ struct bonsai_render_command_draw_world_chunk_draw_list { world_chunk_ptr_paged_list *DrawList; shader *Shader; + camera *Camera; }; // NOTE(Jesse): Temporary diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 5ea2780b7..67de5cfd7 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -47,7 +47,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) InvalidCodePath(); } break; - { tmatch(work_queue_entry_async_function_call, Job, RPC) TIMED_NAMED_BLOCK(work_queue_entry_async_function_call); DispatchAsyncFunctionCall(RPC); @@ -230,7 +229,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) case BonsaiRenderCommand_ShaderId_ShadowMap: { - SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), False); + SetupShadowMapShader(World, Graphics, GetShadowMapResolution(&Engine->Settings), False); } break; } } break; @@ -269,7 +268,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) { tmatch(bonsai_render_command_draw_world_chunk_draw_list, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_draw_world_chunk_draw_list); - RenderDrawList(Engine, Command->DrawList, Command->Shader); + RenderDrawList(Engine, Command->DrawList, Command->Shader, Command->Camera); } break; { tmatch(bonsai_render_command_draw_all_entities, RenderCommand, Command) @@ -455,7 +454,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) shape_layer *Shape = &Layer->Settings.Shape; BindUniformByName(&WorldEditRC->Program, "ShapeType", Shape->Type); - BindUniformByName(&WorldEditRC->Program, "Rounding", Shape->Advanced.Rounding); BindUniformByName(&WorldEditRC->Program, "Stretch", &Shape->Advanced.Stretch); BindUniformByName(&WorldEditRC->Program, "Repeat", &Shape->Advanced.Repeat); @@ -499,9 +497,9 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) auto Plane = &Shape->Plane; auto Orientation = Plane->Orientation; - v3 xAxis = V3(0,0,0); - v3 yAxis = V3(0,0,0); - v3 zAxis = V3(0,0,0); + v3 xAxis = V3(1,0,0); + v3 yAxis = V3(0,1,0); + v3 zAxis = V3(0,0,1); switch (Orientation) { @@ -660,7 +658,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, NoiseDim, Node}; Push(&Graphics->NoiseReadbackJobs, &Readback); } - } break; @@ -711,7 +708,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } #endif - DrawWorldAndEntitiesToShadowMap(GetShadowMapResolution(&Engine->Settings), Engine); + /* DrawWorldAndEntitiesToShadowMap(GetShadowMapResolution(&Engine->Settings), Engine); */ // TODO(Jesse): Move into engine debug world_chunk *C = EngineDebug->PickedNode ? EngineDebug->PickedNode->Chunk : 0; @@ -729,7 +726,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) if (GpuMap->Buffer.At) { RenderImmediateGeometryToGBuffer(GetApplicationResolution(&Engine->Settings), GpuMap, Graphics); - RenderImmediateGeometryToShadowMap(GpuMap, Graphics); + RenderImmediateGeometryToShadowMap(World, Graphics, GpuMap); } Clear(&GpuMap->Buffer); @@ -783,8 +780,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) } } } - - } break; { tmatch(bonsai_render_command_gl_timer_init, RenderCommand, Command) diff --git a/src/engine/render_position.h b/src/engine/render_position.h index 1619adaf4..a35da2cfa 100644 --- a/src/engine/render_position.h +++ b/src/engine/render_position.h @@ -6,7 +6,7 @@ ComputeTarget(camera *Camera) } inline v3 -GetRenderP(cp P, camera *Camera, world_position WorldChunkDim) +GetRenderP(cp P, camera *Camera, v3i WorldChunkDim) { cp CameraRelative = P-Camera->CurrentP; v3 Result = CameraRelative.Offset + (V3(CameraRelative.WorldP) * WorldChunkDim); @@ -14,16 +14,16 @@ GetRenderP(cp P, camera *Camera, world_position WorldChunkDim) } inline v3 -GetRenderP( chunk_dimension WorldChunkDim, cp P, camera *Camera) +GetRenderP( v3i WorldChunkDim, cp P, camera *Camera) { v3 Result = GetRenderP(P, Camera, WorldChunkDim); return Result; } inline v3 -GetRenderP( chunk_dimension WorldChunkDim, v3 Offset, camera *Camera) +GetRenderP( v3i WorldChunkDim, v3 Offset, camera *Camera) { - v3 Result = GetRenderP(WorldChunkDim, Canonical_Position(Offset, World_Position(0)), Camera); + v3 Result = GetRenderP(WorldChunkDim, Canonical_Position(Offset, {}), Camera); return Result; } @@ -49,28 +49,28 @@ GetRenderP( engine_resources *Engine, v3 Offset ) } inline v3 -GetRenderP( chunk_dimension WorldChunkDim, world_position WorldP, camera *Camera) +GetRenderP( v3i WorldChunkDim, v3i WorldP, camera *Camera) { v3 Result = GetRenderP(WorldChunkDim, Canonical_Position(V3(0,0,0), WorldP), Camera); return Result; } inline v3 -GetRenderP( chunk_dimension WorldChunkDim, standing_spot *Spot, camera *Camera) +GetRenderP( v3i WorldChunkDim, standing_spot *Spot, camera *Camera) { v3 Result = Spot->P.Offset + GetRenderP(WorldChunkDim, Spot->P.WorldP, Camera); return Result; } inline v3 -GetRenderP( chunk_dimension WorldChunkDim, entity *entity, camera *Camera) +GetRenderP( v3i WorldChunkDim, entity *entity, camera *Camera) { v3 Result = GetRenderP(WorldChunkDim, entity->P, Camera); return Result; } inline aabb -GetRenderSpaceAABB(chunk_dimension WorldChunkDim, entity *Entity, camera *Camera) +GetRenderSpaceAABB(v3i WorldChunkDim, entity *Entity, camera *Camera) { v3 Radius = Entity->_CollisionVolumeRadius; v3 Center = GetRenderP(WorldChunkDim, Entity->P, Camera) + Radius; @@ -100,7 +100,7 @@ LookAt(v3 P, v3 Target, v3 Up) } inline m4 -ViewMatrix(chunk_dimension WorldChunkDim, camera *Camera) +ViewMatrix(v3i WorldChunkDim, camera *Camera) { m4 Result = LookAt( GetRenderP(WorldChunkDim, Camera->CurrentP, Camera), From 8730e63f20be809f9075f6be950460e6d4447938 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 11:01:50 -0700 Subject: [PATCH 311/421] Change lighting shader to use `shader_magic` (so we get hot reload) --- external/bonsai_stdlib | 2 +- .../block_array_h_shader_ptr_688853971_0.h | 2 +- generated/buffer_h_struct_u32.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 24 + ..._for_compound_type_lighting_render_group.h | 637 +++++++++++++++++- .../shader_magic_bloom_downsample_shader.h | 10 +- .../shader_magic_bloom_upsample_shader.h | 10 +- .../shader_magic_lighting_render_group.h | 222 ++++++ generated/shader_magic_shadow_map_shader.h | 12 +- ...r_magic_struct_terrain_decoration_shader.h | 12 +- ...gic_struct_terrain_derivs_render_context.h | 10 +- ...c_struct_terrain_finalize_render_context.h | 10 +- ...ader_magic_struct_terrain_shaping_shader.h | 11 +- .../shader_magic_struct_world_edit_shader.h | 12 +- shaders/Lighting.fragmentshader | 26 +- src/engine/bloom.cpp | 2 +- src/engine/engine.h | 1 + src/engine/graphics.h | 1 + src/engine/light.h | 53 +- src/engine/render.cpp | 2 +- src/engine/render/render_init.cpp | 138 ++-- src/engine/shader.h | 1 + src/engine/world.cpp | 2 + 23 files changed, 1070 insertions(+), 132 deletions(-) create mode 100644 generated/shader_magic_lighting_render_group.h create mode 100644 src/engine/shader.h diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index a512fe543..83a016646 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit a512fe54307bbf70506a29a486d215727a5eccee +Subproject commit 83a016646f49a020c828125de6a120cd8348595b diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 694d4446c..c2fc20584 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:133:0 +// external/bonsai_stdlib/src/shader.h:139:0 diff --git a/generated/buffer_h_struct_u32.h b/generated/buffer_h_struct_u32.h index 5bcf1ecd0..692d02895 100644 --- a/generated/buffer_h_struct_u32.h +++ b/generated/buffer_h_struct_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:114:0 +// external/bonsai_stdlib/src/shader.h:120:0 struct shader_uniform_buffer { diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 4dbfe64ad..08e1826b8 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -574,6 +574,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u + } + + + { + + + + cs MemberName = CSz("Bloom"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bloom_render_group*, &Element->Bloom), + MemberName, + Params + ); + + + + + + + + + } diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 1589a54bd..61c149e0b 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -33,11 +33,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen - cs MemberName = CSz("Lights"); + cs MemberName = CSz("Program"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(game_lights*, &Element->Lights), + Cast(shader*, &Element->Program), MemberName, Params ); @@ -50,6 +50,34 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen + } + + + { + + + + cs MemberName = CSz("Uniforms"); + + + if (ToggleButton(Ui, CSz("v Uniforms[26]"), CSz("> Uniforms[26]"), UiId(Window, "toggle lighting_render_group shader_uniform Uniforms", Element->Uniforms), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 26) + { + DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + } @@ -81,11 +109,271 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen - cs MemberName = CSz("LuminanceTex"); + cs MemberName = CSz("gColor"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(texture*, &Element->LuminanceTex), + Cast(texture*, Element->gColor), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("gNormal"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, Element->gNormal), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("gDepth"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, Element->gDepth), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("shadowMap"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, Element->shadowMap), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("Ssao"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, Element->Ssao), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("TransparencyAccumTex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, Element->TransparencyAccumTex), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("TransparencyCountTex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, Element->TransparencyCountTex), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("BravoilMyersOIT"); + DoEditorUi(Ui, + Window, + Cast(b8*, Element->BravoilMyersOIT), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("BravoilMcGuireOIT"); + DoEditorUi(Ui, + Window, + Cast(b8*, Element->BravoilMcGuireOIT), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("InverseViewMatrix"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(m4*, Element->InverseViewMatrix), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("InverseProjectionMatrix"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(m4*, Element->InverseProjectionMatrix), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("ShadowMVP"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(m4*, Element->ShadowMVP), MemberName, Params ); @@ -105,11 +393,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen - cs MemberName = CSz("Shader"); + cs MemberName = CSz("LightColors"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->Shader), + Cast(texture*, Element->LightColors), MemberName, Params ); @@ -129,11 +417,344 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen - cs MemberName = CSz("Bloom"); + cs MemberName = CSz("LightPositions"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(bloom_render_group*, &Element->Bloom), + Cast(texture*, Element->LightPositions), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("LightIndexToUV"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, Element->LightIndexToUV), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("LightCount"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, Element->LightCount), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("Camera"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(camera*, Element->Camera), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("SunPosition"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, Element->SunPosition), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("SunColor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, Element->SunColor), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("FogColor"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v3*, Element->FogColor), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("FogPower"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(f32*, Element->FogPower), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("UseSsao"); + DoEditorUi(Ui, + Window, + Cast(b8*, Element->UseSsao), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("UseShadowMapping"); + DoEditorUi(Ui, + Window, + Cast(b8*, Element->UseShadowMapping), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("UseLightingBloom"); + DoEditorUi(Ui, + Window, + Cast(b8*, Element->UseLightingBloom), + MemberName, + &DefaultUiRenderParams_Checkbox + ); + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("ApplicationResolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2*, Element->ApplicationResolution), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("ShadowMapResolution"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2*, Element->ShadowMapResolution), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("LuminanceTex"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(texture*, &Element->LuminanceTex), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("Lights"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(game_lights*, &Element->Lights), MemberName, Params ); diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index d95b39c86..8d0aa9351 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -1,7 +1,10 @@ // src/engine/bloom.h:11:0 link_internal void -InitializeBloomDownsampleShader( bloom_downsample_shader *Struct , v2 *SrcResolution ) +InitializeBloomDownsampleShader( bloom_downsample_shader *Struct + , v2 *SrcResolution + +) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_downsample.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); @@ -13,9 +16,10 @@ InitializeBloomDownsampleShader( bloom_downsample_shader *Struct , v2 *SrcRes - if (UniformIndex != 1 ) + u32 Expected = 1 ; + if (UniformIndex != Expected ) { - Error("Shader (bloom_downsample_shader) had an incorrect number of uniform slots!"); + Error("Shader (bloom_downsample_shader) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); } diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index 37251e93a..2e9e548c7 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -1,7 +1,10 @@ // src/engine/bloom.h:25:0 link_internal void -InitializeBloomUpsampleShader( bloom_upsample_shader *Struct , f32 *FilterRadius ) +InitializeBloomUpsampleShader( bloom_upsample_shader *Struct + , f32 *FilterRadius + +) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_upsample.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); @@ -13,9 +16,10 @@ InitializeBloomUpsampleShader( bloom_upsample_shader *Struct , f32 *FilterRad - if (UniformIndex != 1 ) + u32 Expected = 1 ; + if (UniformIndex != Expected ) { - Error("Shader (bloom_upsample_shader) had an incorrect number of uniform slots!"); + Error("Shader (bloom_upsample_shader) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); } diff --git a/generated/shader_magic_lighting_render_group.h b/generated/shader_magic_lighting_render_group.h new file mode 100644 index 000000000..02fdf656e --- /dev/null +++ b/generated/shader_magic_lighting_render_group.h @@ -0,0 +1,222 @@ +// src/engine/light.h:74:0 + +link_internal void +InitializeLightingRenderGroup( lighting_render_group *Struct + , texture *gColor + , texture *gNormal + , texture *gDepth + , texture *shadowMap + , texture *Ssao + , texture *TransparencyAccumTex + , texture *TransparencyCountTex + , b32 *BravoilMyersOIT + , b32 *BravoilMcGuireOIT + , m4 *InverseViewMatrix + , m4 *InverseProjectionMatrix + , m4 *ShadowMVP + , texture *LightColors + , texture *LightPositions + , f32 *LightIndexToUV + , s32 *LightCount + , camera *Camera + , v3 *SunPosition + , v3 *SunColor + , v3 *FogColor + , f32 *FogPower + , b32 *UseSsao + , b32 *UseShadowMapping + , b32 *UseLightingBloom + , v2 *ApplicationResolution + , v2 *ShadowMapResolution + +) +{ + Struct->Program = CompileShaderPair(CSz(BONSAI_SHADER_PATH "Lighting.vertexshader"), CSz(BONSAI_SHADER_PATH "Lighting.fragmentshader")); + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + + u32 UniformIndex = 0; + + Struct->gColor = gColor; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gColor, "gColor"); + + Struct->gNormal = gNormal; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gNormal, "gNormal"); + + Struct->gDepth = gDepth; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gDepth, "gDepth"); + + Struct->shadowMap = shadowMap; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->shadowMap, "shadowMap"); + + Struct->Ssao = Ssao; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->Ssao, "Ssao"); + + Struct->TransparencyAccumTex = TransparencyAccumTex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->TransparencyAccumTex, "TransparencyAccumTex"); + + Struct->TransparencyCountTex = TransparencyCountTex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->TransparencyCountTex, "TransparencyCountTex"); + + Struct->BravoilMyersOIT = BravoilMyersOIT; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->BravoilMyersOIT, "BravoilMyersOIT"); + + Struct->BravoilMcGuireOIT = BravoilMcGuireOIT; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->BravoilMcGuireOIT, "BravoilMcGuireOIT"); + + Struct->InverseViewMatrix = InverseViewMatrix; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InverseViewMatrix, "InverseViewMatrix"); + + Struct->InverseProjectionMatrix = InverseProjectionMatrix; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InverseProjectionMatrix, "InverseProjectionMatrix"); + + Struct->ShadowMVP = ShadowMVP; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ShadowMVP, "ShadowMVP"); + + Struct->LightColors = LightColors; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightColors, "LightColors"); + + Struct->LightPositions = LightPositions; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightPositions, "LightPositions"); + + Struct->LightIndexToUV = LightIndexToUV; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightIndexToUV, "LightIndexToUV"); + + Struct->LightCount = LightCount; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightCount, "LightCount"); + + Struct->Camera = Camera; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->Camera, "Camera"); + + Struct->SunPosition = SunPosition; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SunPosition, "SunPosition"); + + Struct->SunColor = SunColor; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SunColor, "SunColor"); + + Struct->FogColor = FogColor; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FogColor, "FogColor"); + + Struct->FogPower = FogPower; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FogPower, "FogPower"); + + Struct->UseSsao = UseSsao; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseSsao, "UseSsao"); + + Struct->UseShadowMapping = UseShadowMapping; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseShadowMapping, "UseShadowMapping"); + + Struct->UseLightingBloom = UseLightingBloom; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseLightingBloom, "UseLightingBloom"); + + Struct->ApplicationResolution = ApplicationResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ApplicationResolution, "ApplicationResolution"); + + Struct->ShadowMapResolution = ShadowMapResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ShadowMapResolution, "ShadowMapResolution"); + + + + u32 Expected = 26 ; + if (UniformIndex != Expected ) + { + Error("Shader (lighting_render_group) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } + + + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); +} + +link_internal void +UseShader( lighting_render_group *Struct ) +{ + GL.UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + + + if (UniformIndex != 26 ) + { + Error("Shader (lighting_render_group) had an incorrect number of uniform slots!"); + } +} + diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index 30a7d2598..841747364 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -1,7 +1,12 @@ // src/engine/render/shadow_map.h:21:0 link_internal void -InitializeShadowMapShader( shadow_map_shader *Struct , m4 MVP , m4 ModelMatrix , v3 *MinClipP_worldspace , v3 *MaxClipP_worldspace ) +InitializeShadowMapShader( shadow_map_shader *Struct + , m4 MVP + , m4 ModelMatrix + , v3 *MinClipP_worldspace + , v3 *MaxClipP_worldspace +) { Struct->Program = CompileShaderPair(CSz("shaders/DepthRTT.vertexshader"), CSz("shaders/DepthRTT.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); @@ -20,9 +25,10 @@ InitializeShadowMapShader( shadow_map_shader *Struct , m4 MVP , m4 ModelM Struct->MaxClipP_worldspace = MaxClipP_worldspace; SetShaderUniform(&Struct->Program, UniformIndex++, Struct->MaxClipP_worldspace, "MaxClipP_worldspace"); - if (UniformIndex != 4 ) + u32 Expected = 4 ; + if (UniformIndex != Expected ) { - Error("Shader (shadow_map_shader) had an incorrect number of uniform slots!"); + Error("Shader (shadow_map_shader) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); } diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index 178839370..5ec540996 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -1,7 +1,12 @@ // src/engine/graphics.h:49:0 link_internal void -InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Struct , texture *DerivsTex , v3 ChunkDim , v3 WorldspaceChunkBasis , v3 ChunkResolution ) +InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Struct + , texture *DerivsTex + , v3 ChunkDim + , v3 WorldspaceChunkBasis + , v3 ChunkResolution +) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/terrain_decoration.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); @@ -20,9 +25,10 @@ InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Str Struct->ChunkResolution = ChunkResolution; SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); - if (UniformIndex != 4 ) + u32 Expected = 4 ; + if (UniformIndex != Expected ) { - Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots!"); + Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); } diff --git a/generated/shader_magic_struct_terrain_derivs_render_context.h b/generated/shader_magic_struct_terrain_derivs_render_context.h index a0785718d..7a2c88944 100644 --- a/generated/shader_magic_struct_terrain_derivs_render_context.h +++ b/generated/shader_magic_struct_terrain_derivs_render_context.h @@ -1,7 +1,10 @@ // src/engine/graphics.h:52:0 link_internal void -InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct , v3 Ignored ) +InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct + , v3 Ignored + +) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/derivs.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); @@ -13,9 +16,10 @@ InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct , - if (UniformIndex != 1 ) + u32 Expected = 1 ; + if (UniformIndex != Expected ) { - Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots!"); + Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); } diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index f7bcbf50a..518ae148b 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -1,7 +1,10 @@ // src/engine/graphics.h:87:0 link_internal void -InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct , u32 Ignored ) +InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct + , u32 Ignored + +) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/TerrainFinalize.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); @@ -13,9 +16,10 @@ InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct - if (UniformIndex != 1 ) + u32 Expected = 1 ; + if (UniformIndex != Expected ) { - Error("Shader (terrain_finalize_render_context) had an incorrect number of uniform slots!"); + Error("Shader (terrain_finalize_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); } diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index 133d18602..dcd3df835 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -1,7 +1,11 @@ // src/engine/graphics.h:46:0 link_internal void -InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct , v3 ChunkDim , v3 WorldspaceChunkBasis , v3 ChunkResolution ) +InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct + , v3 ChunkDim + , v3 WorldspaceChunkBasis + , v3 ChunkResolution +) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/terrain_shaping.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); @@ -17,9 +21,10 @@ InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct Struct->ChunkResolution = ChunkResolution; SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); - if (UniformIndex != 3 ) + u32 Expected = 3 ; + if (UniformIndex != Expected ) { - Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots!"); + Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); } diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index b08ae673c..650522e48 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -1,7 +1,12 @@ // src/engine/graphics.h:71:0 link_internal void -InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *ChunkDim , v3 *WorldspaceChunkBasis , v3 *ChunkResolution , s32 Type ) +InitializeWorldEditRenderContext( world_edit_render_context *Struct + , v3 *ChunkDim + , v3 *WorldspaceChunkBasis + , v3 *ChunkResolution + , s32 Type +) { Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); @@ -20,9 +25,10 @@ InitializeWorldEditRenderContext( world_edit_render_context *Struct , v3 *Chu Struct->Type = Type; SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Type, "Type"); - if (UniformIndex != 4 ) + u32 Expected = 4 ; + if (UniformIndex != Expected ) { - Error("Shader (world_edit_render_context) had an incorrect number of uniform slots!"); + Error("Shader (world_edit_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); } diff --git a/shaders/Lighting.fragmentshader b/shaders/Lighting.fragmentshader index cb5ff4b3e..e0c9788c0 100644 --- a/shaders/Lighting.fragmentshader +++ b/shaders/Lighting.fragmentshader @@ -15,8 +15,8 @@ uniform r32 LightIndexToUV; uniform sampler2D LightColors; uniform sampler2D LightPositions; -uniform sampler2D TransparencyAccum; -uniform sampler2D TransparencyCount; +uniform sampler2D TransparencyAccumTex; +uniform sampler2D TransparencyCountTex; uniform bool BravoilMyersOIT; uniform bool BravoilMcGuireOIT; @@ -26,7 +26,7 @@ uniform mat4 ShadowMVP; uniform vec3 SunPosition; uniform vec3 SunColor; -uniform vec3 CameraP; +uniform vec3 Camera; uniform r32 FogPower; uniform vec3 FogColor; @@ -130,16 +130,16 @@ void main() /* return; */ - vec4 TransAccum = texture(TransparencyAccum, gBufferUV); - float TransAccumCount = texture(TransparencyCount, gBufferUV).r; - float TransAccumEmission = texture(TransparencyCount, gBufferUV).g; + vec4 TransAccum = texture(TransparencyAccumTex, gBufferUV); + float TransAccumCount = texture(TransparencyCountTex, gBufferUV).r; + float TransAccumEmission = texture(TransparencyCountTex, gBufferUV).g; vec3 AmbientLightContrib = SunColor*0.06f; vec3 KeyLightContrib = V3(0.f); vec3 BackLightContrib = V3(0.f); vec3 PointLightsContrib = V3(0.f); - vec3 CameraToFrag = normalize(FragWorldP - CameraP); // TODO(Jesse): Pass this to the lighting calc that needs it + vec3 CameraToFrag = normalize(FragWorldP - Camera); // TODO(Jesse): Pass this to the lighting calc that needs it vec4 gColorTexel = texelFetch(gColor, texelCoord, 0); @@ -173,10 +173,10 @@ void main() vec3 LightToFrag = -FragToLight; float LightAtt = SunIntensity; - KeyLightContrib = LightingCalc(LightAtt, SunColor, FragToLight, FragNormal, CameraP); - /* KeyLightContrib += SpecLightingCalc(LightAtt, Diffuse, FragToLight, FragWorldP, FragNormal, CameraP); */ + KeyLightContrib = LightingCalc(LightAtt, SunColor, FragToLight, FragNormal, Camera); + /* KeyLightContrib += SpecLightingCalc(LightAtt, Diffuse, FragToLight, FragWorldP, FragNormal, Camera); */ - BackLightContrib = LightingCalc(LightAtt, 0.15f*SunColor, LightToFrag, FragNormal, CameraP); + BackLightContrib = LightingCalc(LightAtt, 0.15f*SunColor, LightToFrag, FragNormal, Camera); } @@ -198,7 +198,7 @@ void main() if (Distance > 0) { LightAtt = 1.0f/(Distance*Distance); } vec3 reflectionVector = reflect(FragToLight, FragNormal); - vec3 CameraToFrag = normalize(FragWorldP - CameraP); + vec3 CameraToFrag = normalize(FragWorldP - Camera); float cosAngle = max(0.f, dot(CameraToFrag, reflectionVector)); float SpecularPower = pow(cosAngle, materialShininess); @@ -247,7 +247,7 @@ void main() vec4 FragPShadowSpace = ShadowMVP * vec4(FragWorldP, 1.f); float FragDepth = FragPShadowSpace.z - acneBias; /* out_LightColor = vec4(FragDepth, FragDepth, FragDepth, 1.f); */ - /* out_LightColor = FragPShadowSpace; */ + /* out_LightColor = abs(FragPShadowSpace); */ /* return; */ float ShadowSampleDepth = texture(shadowMap, FragPShadowSpace.xy ).x; // + acneBias; @@ -305,7 +305,7 @@ void main() * Fog */ // TODO(Jesse): Can do squared? - float DistanceToFrag = distance(CameraP, FragWorldP); + float DistanceToFrag = distance(Camera, FragWorldP); float MaxFogDist = 200000.f; float FogContrib = clamp( DistanceToFrag / MaxFogDist, 0.f, 1.f); diff --git a/src/engine/bloom.cpp b/src/engine/bloom.cpp index aa49f0ae0..d2d66ee0b 100644 --- a/src/engine/bloom.cpp +++ b/src/engine/bloom.cpp @@ -38,7 +38,7 @@ InitBloomRenderGroup(bloom_render_group *Group, render_settings *Settings, memor link_internal void RunBloomRenderPass(graphics *Graphics) { - bloom_render_group *Group = &Graphics->Lighting.Bloom; + bloom_render_group *Group = &Graphics->Bloom; GL.BindFramebuffer(GL_FRAMEBUFFER, Group->BlurFBO.ID); diff --git a/src/engine/engine.h b/src/engine/engine.h index 38da0a9ff..4713ca6fa 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -25,6 +25,7 @@ link_internal engine_resources *GetEngineResources(); #include #include +#include #include #include #include diff --git a/src/engine/graphics.h b/src/engine/graphics.h index d8e82a900..e96493ad2 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -185,6 +185,7 @@ struct graphics transparency_render_group Transparency; lighting_render_group Lighting; + bloom_render_group Bloom; gaussian_render_group Gaussian; composite_render_group CompositeGroup; diff --git a/src/engine/light.h b/src/engine/light.h index b3322b448..240e22f5e 100644 --- a/src/engine/light.h +++ b/src/engine/light.h @@ -19,16 +19,61 @@ struct game_lights struct lighting_render_group +poof( @vert_source_file(BONSAI_SHADER_PATH "Lighting.vertexshader") + @frag_source_file(BONSAI_SHADER_PATH "Lighting.fragmentshader") + ) { - game_lights Lights; + shader Program; + shader_uniform Uniforms[26]; framebuffer FBO; - texture LuminanceTex; - shader Shader; - bloom_render_group Bloom; + texture *gColor; poof (@uniform) + texture *gNormal; poof (@uniform) + texture *gDepth; poof (@uniform) + texture *shadowMap; poof (@uniform) + texture *Ssao; poof (@uniform) + + texture *TransparencyAccumTex; poof (@uniform) + texture *TransparencyCountTex; poof (@uniform) + + b32 *BravoilMyersOIT; poof (@uniform) + b32 *BravoilMcGuireOIT; poof (@uniform) + + m4 *InverseViewMatrix; poof (@uniform) + m4 *InverseProjectionMatrix; poof (@uniform) + m4 *ShadowMVP; poof (@uniform) + + // from struct game_lights { + texture *LightColors; poof (@uniform) + texture *LightPositions; poof (@uniform) + f32 *LightIndexToUV; poof (@uniform) + s32 *LightCount; poof (@uniform) + // } + + camera *Camera; poof (@uniform) + + v3 *SunPosition; poof (@uniform) + v3 *SunColor; poof (@uniform) + v3 *FogColor; poof (@uniform) + f32 *FogPower; poof (@uniform) + + b32 *UseSsao; poof (@uniform) + + b32 *UseShadowMapping; poof (@uniform) + b32 *UseLightingBloom; poof (@uniform) + + v2 *ApplicationResolution; poof (@uniform) + v2 *ShadowMapResolution; poof (@uniform) + + + texture LuminanceTex; + game_lights Lights; }; +poof(shader_magic(lighting_render_group)) +#include + link_internal void DoLight(game_lights *Lights, v3 RenderPosition, v3 Color) { diff --git a/src/engine/render.cpp b/src/engine/render.cpp index e2e65d00a..696f556b2 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -171,7 +171,7 @@ RenderLuminanceTexture(v2i ApplicationResolution, gpu_mapped_element_buffer *Gpu /* GL.Disable(GL_BLEND); */ { - UseShader(&Lighting->Shader); + UseShader(&Lighting->Program); RenderQuad(); } diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 373c4eae9..0e4a528b7 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -49,13 +49,6 @@ AllocateAndInitSsaoNoise(v2i ApplicationResolution, ao_render_group *AoGroup, me return SsaoNoiseTexture; } -link_internal lighting_render_group -MakeLightingRenderGroup() -{ - lighting_render_group Result = {}; - return Result; -} - shader MakeCompositeShader( memory_arena *GraphicsMemory, v2 *ApplicationResolution, @@ -126,8 +119,8 @@ MakeCompositeShader( memory_arena *GraphicsMemory, return Shader; } -shader -MakeLightingShader( memory_arena *GraphicsMemory, +link_internal void +MakeLightingShader( lighting_render_group *Group, v2 *ApplicationResolution, g_buffer_textures *gTextures, @@ -159,77 +152,62 @@ MakeLightingShader( memory_arena *GraphicsMemory, b32 *UseLightingBloom ) { - shader Shader = CompileShaderPair( CSz(BONSAI_SHADER_PATH "Lighting.vertexshader"), CSz(BONSAI_SHADER_PATH "Lighting.fragmentshader") ); - Shader.Uniforms = ShaderUniformBuffer(26, GraphicsMemory); + InitializeLightingRenderGroup( Group, - SetShaderUniform(&Shader, 0, &gTextures->Color, "gColor"); + &gTextures->Color, - SetShaderUniform(&Shader, 1, &gTextures->Normal, "gNormal"); - -/* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); */ - /* Current = &(*Current)->Next; */ + &gTextures->Normal, - SetShaderUniform(&Shader, 2, &gTextures->Depth, "gDepth"); + &gTextures->Depth, - SetShaderUniform(&Shader, 3, ShadowMap, "shadowMap"); + ShadowMap, - SetShaderUniform(&Shader, 4, Ssao, "Ssao"); + Ssao, - SetShaderUniform(&Shader, 5, AccumTex, "TransparencyAccum"); + AccumTex, - SetShaderUniform(&Shader, 6, CountTex, "TransparencyCount"); + CountTex, - SetShaderUniform(&Shader, 7, BravoilMyersOIT, "BravoilMyersOIT"); + BravoilMyersOIT, - SetShaderUniform(&Shader, 8, BravoilMcGuireOIT, "BravoilMcGuireOIT"); + BravoilMcGuireOIT, - SetShaderUniform(&Shader, 9, InverseViewMatrix, "InverseViewMatrix"); + InverseViewMatrix, - SetShaderUniform(&Shader, 10, InverseProjectionMatrix, "InverseProjectionMatrix"); + InverseProjectionMatrix, - SetShaderUniform(&Shader, 11, ShadowMVP, "ShadowMVP"); + ShadowMVP, - SetShaderUniform(&Shader, 12, &Lights->ColorTex, "LightColors"); + &Lights->ColorTex, - SetShaderUniform(&Shader, 13, &Lights->PositionTex, "LightPositions"); + &Lights->PositionTex, - SetShaderUniform(&Shader, 14, &Lights->IndexToUV, "LightIndexToUV"); + &Lights->IndexToUV, - SetShaderUniform(&Shader, 15, &Lights->Count, "LightCount"); + &Lights->Count, - SetShaderUniform(&Shader, 16, Camera, "CameraP"); + Camera, - SetShaderUniform(&Shader, 17, SunPosition, "SunPosition"); + SunPosition, - SetShaderUniform(&Shader, 18, SunColor, "SunColor"); + SunColor, - SetShaderUniform(&Shader, 19, FogColor, "FogColor"); + FogColor, - SetShaderUniform(&Shader, 20, FogPower, "FogPower"); + FogPower, - SetShaderUniform(&Shader, 21, (u32*)UseSsao, "UseSsao"); + (u32*)UseSsao, - SetShaderUniform(&Shader, 22, (u32*)UseShadowMapping, "UseShadowMapping"); + (u32*)UseShadowMapping, - SetShaderUniform(&Shader, 23, (u32*)UseLightingBloom, "UseLightingBloom"); + (u32*)UseLightingBloom, - SetShaderUniform(&Shader, 24, ApplicationResolution, "ApplicationResolution"); + ApplicationResolution, - SetShaderUniform(&Shader, 25, ShadowMapResolution, "ShadowMapResolution"); + ShadowMapResolution + ); - AssertNoGlErrors; - -#if 0 - if (Lights) - { - SetShaderUniform(&Shader, 26, Lights->Lights, "Lights"); - - SetShaderUniform(&Shader, 27, &Lights->Count, "LightCount"); - } -#endif - - return Shader; } framebuffer @@ -609,7 +587,13 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Error("Initializing ao_render_group"); return False; } - InitTransparencyRenderGroup(&Result->Settings, &Result->Transparency, Result->Settings.iApplicationResolution, &gBuffer->ViewProjection, &gBuffer->Textures.Depth, &Result->ColorPaletteTexture, GraphicsMemory); + InitTransparencyRenderGroup( &Result->Settings, + &Result->Transparency, + Result->Settings.iApplicationResolution, + &gBuffer->ViewProjection, + &gBuffer->Textures.Depth, + &Result->ColorPaletteTexture, + GraphicsMemory); // Initialize the lighting group { @@ -625,38 +609,36 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Lights->IndexToUV = 1.0f / MAX_LIGHTS; - Lighting->Shader = - MakeLightingShader( GraphicsMemory, + MakeLightingShader( Lighting, - &Result->Settings.ApplicationResolution, - &gBuffer->Textures, + &Result->Settings.ApplicationResolution, + &gBuffer->Textures, - &Result->Settings.ShadowMapResolution, - &SG->ShadowMap, + &Result->Settings.ShadowMapResolution, + &SG->ShadowMap, - &AoGroup->Texture, + &AoGroup->Texture, - &Result->Transparency.AccumTex, - &Result->Transparency.RevealTex, - &Result->Settings.BravoilMyersOIT, - &Result->Settings.BravoilMcGuireOIT, + &Result->Transparency.AccumTex, + &Result->Transparency.RevealTex, + &Result->Settings.BravoilMyersOIT, + &Result->Settings.BravoilMcGuireOIT, - &gBuffer->InverseViewMatrix, - &gBuffer->InverseProjectionMatrix, - &SG->Shader.MVP, + &gBuffer->InverseViewMatrix, + &gBuffer->InverseProjectionMatrix, + &SG->Shader.MVP, - &Lighting->Lights, + &Lighting->Lights, Result->Camera, - &Result->Settings.Lighting.SunP, - &Result->Settings.Lighting.CurrentSunColor, + &Result->Settings.Lighting.SunP, + &Result->Settings.Lighting.CurrentSunColor, - &Result->FogColor, - &Result->FogPower, + &Result->FogColor, + &Result->FogPower, - &Result->Settings.UseSsao, - &Result->Settings.UseShadowMapping, - &Result->Settings.UseLightingBloom - ); + &Result->Settings.UseSsao, + &Result->Settings.UseShadowMapping, + &Result->Settings.UseLightingBloom ); // Luminance FBO { @@ -672,7 +654,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr } - InitBloomRenderGroup(&Lighting->Bloom, &Result->Settings, GraphicsMemory); + InitBloomRenderGroup(&Result->Bloom, &Result->Settings, GraphicsMemory); } engine_resources *Resources = GetEngineResources(); @@ -712,7 +694,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr &SG->ShadowMap, &AoGroup->Texture, &Result->Lighting.LuminanceTex, - &Result->Lighting.Bloom.Tex, + &Result->Bloom.Tex, &Result->Transparency.AccumTex, &Result->Transparency.RevealTex, &SG->Shader.MVP, diff --git a/src/engine/shader.h b/src/engine/shader.h new file mode 100644 index 000000000..5d063bfdd --- /dev/null +++ b/src/engine/shader.h @@ -0,0 +1 @@ +b32 SetShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index f9aaef087..6d9fb6729 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -1115,6 +1115,7 @@ MaintainWorldOctree(engine_resources *Engine) done_queueing_nodes: DEBUG_OctreeTraversal(Engine, &World->Root, &Stats); +#if 0 if (Stats.TotalQueued || Stats.NewQueues) { Info("TotalLeaves(%d) TotalBranches(%d) TotalQueued(%d) NewQueues(%d)", @@ -1123,6 +1124,7 @@ MaintainWorldOctree(engine_resources *Engine) Stats.TotalQueued, Stats.NewQueues); } +#endif } From 90329cce874efe21f8d615783e1b09184b60f856 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 12:15:08 -0700 Subject: [PATCH 312/421] Cleanup & polish in stdlib --- external/bonsai_stdlib | 2 +- generated/block_array_h_shader_ptr_688853971_0.h | 2 +- generated/buffer_h_struct_u32.h | 2 +- generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- generated/shader_magic_bloom_downsample_shader.h | 2 ++ generated/shader_magic_bloom_upsample_shader.h | 2 ++ generated/shader_magic_lighting_render_group.h | 2 ++ generated/shader_magic_shadow_map_shader.h | 2 ++ generated/shader_magic_struct_terrain_decoration_shader.h | 2 ++ .../shader_magic_struct_terrain_derivs_render_context.h | 2 ++ .../shader_magic_struct_terrain_finalize_render_context.h | 2 ++ generated/shader_magic_struct_terrain_shaping_shader.h | 2 ++ generated/shader_magic_struct_world_edit_shader.h | 2 ++ shaders/Lighting.fragmentshader | 5 +++-- src/engine/render/shadow_map.h | 1 + 21 files changed, 32 insertions(+), 12 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 83a016646..0a0c8de98 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 83a016646f49a020c828125de6a120cd8348595b +Subproject commit 0a0c8de9831f01b723d5e3c64fafbd4203ebd878 diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index c2fc20584..97c499f2e 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:139:0 +// external/bonsai_stdlib/src/shader.h:141:0 diff --git a/generated/buffer_h_struct_u32.h b/generated/buffer_h_struct_u32.h index 692d02895..a19716750 100644 --- a/generated/buffer_h_struct_u32.h +++ b/generated/buffer_h_struct_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:120:0 +// external/bonsai_stdlib/src/shader.h:122:0 struct shader_uniform_buffer { diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 92b0a1b64..a519f5798 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:320:0 +// external/bonsai_stdlib/src/shader.cpp:323:0 b32 SetShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 43aa9e0d7..161c324cf 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:335:0 +// external/bonsai_stdlib/src/shader.cpp:338:0 b32 SetShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index bc2ba9fa1..0da776623 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:332:0 +// external/bonsai_stdlib/src/shader.cpp:335:0 b32 SetShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index e8cc2f373..7d4c70222 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:317:0 +// external/bonsai_stdlib/src/shader.cpp:320:0 b32 SetShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 5e3161673..786ebd8fa 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:329:0 +// external/bonsai_stdlib/src/shader.cpp:332:0 b32 SetShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index 4a4b48e31..ec6cf7bc3 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:323:0 +// external/bonsai_stdlib/src/shader.cpp:326:0 b32 SetShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index d850a488a..795a00635 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:326:0 +// external/bonsai_stdlib/src/shader.cpp:329:0 b32 SetShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index 8d0aa9351..63ca31c82 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -24,6 +24,8 @@ InitializeBloomDownsampleShader( bloom_downsample_shader *Struct + AssertNoGlErrors; + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index 2e9e548c7..fcab7cc33 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -24,6 +24,8 @@ InitializeBloomUpsampleShader( bloom_upsample_shader *Struct + AssertNoGlErrors; + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } diff --git a/generated/shader_magic_lighting_render_group.h b/generated/shader_magic_lighting_render_group.h index 02fdf656e..6eb45859e 100644 --- a/generated/shader_magic_lighting_render_group.h +++ b/generated/shader_magic_lighting_render_group.h @@ -124,6 +124,8 @@ InitializeLightingRenderGroup( lighting_render_group *Struct + AssertNoGlErrors; + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index 841747364..31fd22a64 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -33,6 +33,8 @@ InitializeShadowMapShader( shadow_map_shader *Struct + AssertNoGlErrors; + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index 5ec540996..e0c96ade1 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -33,6 +33,8 @@ InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Str + AssertNoGlErrors; + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } diff --git a/generated/shader_magic_struct_terrain_derivs_render_context.h b/generated/shader_magic_struct_terrain_derivs_render_context.h index 7a2c88944..32e171b31 100644 --- a/generated/shader_magic_struct_terrain_derivs_render_context.h +++ b/generated/shader_magic_struct_terrain_derivs_render_context.h @@ -24,6 +24,8 @@ InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct + AssertNoGlErrors; + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index 518ae148b..51b3fb56f 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -24,6 +24,8 @@ InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct + AssertNoGlErrors; + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index dcd3df835..ab544becc 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -29,6 +29,8 @@ InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct + AssertNoGlErrors; + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index 650522e48..1de408223 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -33,6 +33,8 @@ InitializeWorldEditRenderContext( world_edit_render_context *Struct + AssertNoGlErrors; + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); } diff --git a/shaders/Lighting.fragmentshader b/shaders/Lighting.fragmentshader index e0c9788c0..57e5ebaab 100644 --- a/shaders/Lighting.fragmentshader +++ b/shaders/Lighting.fragmentshader @@ -42,6 +42,7 @@ uniform v2 ShadowMapResolution; int AoBlurSize = 4; // size of AO noise texture float BlurredAO = 0.0f; +/* fda */ // NOTE(Jesse): Better shader noise function for when I need it : https://www.shadertoy.com/view/4djSRW @@ -244,8 +245,8 @@ void main() f32 LinearDepth = Linearize(Depth, 5000.f, 0.1f); float acneBias = 0.045f * LinearDepth; // Fix acne - vec4 FragPShadowSpace = ShadowMVP * vec4(FragWorldP, 1.f); - float FragDepth = FragPShadowSpace.z - acneBias; + v4 FragPShadowSpace = ShadowMVP * vec4(FragWorldP, 1.f); + f32 FragDepth = FragPShadowSpace.z - acneBias; /* out_LightColor = vec4(FragDepth, FragDepth, FragDepth, 1.f); */ /* out_LightColor = abs(FragPShadowSpace); */ /* return; */ diff --git a/src/engine/render/shadow_map.h b/src/engine/render/shadow_map.h index 1e24f7da7..a90ba4f2c 100644 --- a/src/engine/render/shadow_map.h +++ b/src/engine/render/shadow_map.h @@ -59,5 +59,6 @@ InitializeShadowRenderGroup(graphics *Graphics, shadow_render_group *SG, v2i Sha InitializeShadowMapShader( &SG->Shader , IdentityMatrix, IdentityMatrix, &Graphics->MinClipP_worldspace, &Graphics->MaxClipP_worldspace ); + AssertNoGlErrors; return true; } From f333ff6aa52b7ab5d57177b0a68cf999aa785d15 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 12:37:36 -0700 Subject: [PATCH 313/421] Rename MVP -> ViewProjection in shadow map --- generated/shader_magic_shadow_map_shader.h | 14 +++++++------- shaders/DepthRTT.vertexshader | 4 ++-- src/engine/render.cpp | 9 +++++---- src/engine/render/render_init.cpp | 4 ++-- src/engine/render/shadow_map.h | 6 ++---- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index 31fd22a64..55f2e5853 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -1,9 +1,9 @@ -// src/engine/render/shadow_map.h:21:0 +// src/engine/render/shadow_map.h:19:0 link_internal void InitializeShadowMapShader( shadow_map_shader *Struct - , m4 MVP - , m4 ModelMatrix + , m4 ModelMatrix + , m4 ViewProjection , v3 *MinClipP_worldspace , v3 *MaxClipP_worldspace ) @@ -13,12 +13,12 @@ InitializeShadowMapShader( shadow_map_shader *Struct u32 UniformIndex = 0; - Struct->MVP = MVP; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->MVP, "MVP"); - - Struct->ModelMatrix = ModelMatrix; + Struct->ModelMatrix = ModelMatrix; SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ModelMatrix, "ModelMatrix"); + Struct->ViewProjection = ViewProjection; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ViewProjection, "ViewProjection"); + Struct->MinClipP_worldspace = MinClipP_worldspace; SetShaderUniform(&Struct->Program, UniformIndex++, Struct->MinClipP_worldspace, "MinClipP_worldspace"); diff --git a/shaders/DepthRTT.vertexshader b/shaders/DepthRTT.vertexshader index 9728cf8be..389e8e5af 100644 --- a/shaders/DepthRTT.vertexshader +++ b/shaders/DepthRTT.vertexshader @@ -1,7 +1,7 @@ layout(location = 0) in vec3 vertexPosition_modelspace; // NOTE(Jesse): Camera transform -uniform mat4 MVP; +uniform mat4 ViewProjection; uniform mat4 ModelMatrix; out vec3 vertexP_worldspace; @@ -9,6 +9,6 @@ out vec3 vertexP_worldspace; void main() { vertexP_worldspace = (ModelMatrix * vec4(vertexPosition_modelspace, 1)).xyz; // ?? - gl_Position = MVP * V4(vertexP_worldspace, 1); + gl_Position = ViewProjection * V4(vertexP_worldspace, 1); } diff --git a/src/engine/render.cpp b/src/engine/render.cpp index 696f556b2..6725237b7 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -96,7 +96,7 @@ RenderImmediateGeometryToShadowMap(world *World, graphics *Graphics, gpu_mapped_ // @duplicate_shadow_map_MVP_calculation /* v3 FrustCenter = GetFrustumCenter(&Graphics->GameCamera); */ - SG->Shader.MVP = GetShadowMapMVP(World, &Graphics->GameCamera, Graphics->Settings.Lighting.SunP); + SG->Shader.ViewProjection = GetShadowMapMVP(World, &Graphics->GameCamera, Graphics->Settings.Lighting.SunP); UseShader(&SG->Shader); @@ -161,7 +161,7 @@ RenderLuminanceTexture(v2i ApplicationResolution, gpu_mapped_element_buffer *Gpu UpdateLightingTextures(&Graphics->Lighting.Lights); // TODO(Jesse): Explain this. - Graphics->SG->Shader.MVP = NdcToScreenSpace * Graphics->SG->Shader.MVP; + Graphics->SG->Shader.ViewProjection = NdcToScreenSpace * Graphics->SG->Shader.ViewProjection; /* GL.Enable(GL_BLEND); */ /* GL.BlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); */ @@ -1150,7 +1150,7 @@ DrawLod_world_chunk(engine_resources *Engine, shader *Shader, world_chunk_lod_el } #endif - +#if 1 link_internal void DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Mesh, r32 DistanceSquared, v3 Basis, Quaternion Rotation, v3 Scale ) { @@ -1177,6 +1177,7 @@ DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Mes AssertNoGlErrors; } } +#endif #if 0 link_internal void @@ -1409,7 +1410,7 @@ SetupShadowMapShader(world *World, graphics *Graphics, v2i ShadowMapResolution, // TODO(Jesse): Duplicate MVP calculation // @duplicate_shadow_map_MVP_calculation /* v3 FrustCenter = GetFrustumCenter(&Graphics->GameCamera); */ - SG->Shader.MVP = GetShadowMapMVP(World, &Graphics->GameCamera, Graphics->Settings.Lighting.SunP); + SG->Shader.ViewProjection = GetShadowMapMVP(World, &Graphics->GameCamera, Graphics->Settings.Lighting.SunP); UseShader(&SG->Shader); diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 0e4a528b7..a98e75c09 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -626,7 +626,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr &gBuffer->InverseViewMatrix, &gBuffer->InverseProjectionMatrix, - &SG->Shader.MVP, + &SG->Shader.ViewProjection, &Lighting->Lights, Result->Camera, @@ -697,7 +697,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr &Result->Bloom.Tex, &Result->Transparency.AccumTex, &Result->Transparency.RevealTex, - &SG->Shader.MVP, + &SG->Shader.ViewProjection, Result->Camera, &Result->Exposure, &Result->Settings.UseLightingBloom, diff --git a/src/engine/render/shadow_map.h b/src/engine/render/shadow_map.h index a90ba4f2c..4337d2102 100644 --- a/src/engine/render/shadow_map.h +++ b/src/engine/render/shadow_map.h @@ -5,15 +5,13 @@ poof( @vert_source_file("shaders/DepthRTT.vertexshader") shader Program; shader_uniform Uniforms[4]; - // TODO(Jesse)(rename): Should be ViewProjection - m4 MVP; poof(@uniform) - // NOTE(Jesse): This never gets read from; it's strictly a placeholder/hack // to tell shader_magic there's a uniform called ModelMatrix, which gets set // at the time the model gets drawn. // // @janky_model_matrix_bs - m4 ModelMatrix; poof(@uniform) + m4 ModelMatrix; poof(@uniform) + m4 ViewProjection; poof(@uniform) v3 *MinClipP_worldspace; poof(@uniform) v3 *MaxClipP_worldspace; poof(@uniform) From 010625f53154d45461caadeaead2fe60a2324a38 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 13:26:08 -0700 Subject: [PATCH 314/421] Remove DistanceSquared in DrawLod --- .../asyncify_render_function_c_DrawLod.h | 6 ++--- .../asyncify_render_function_h_DrawLod.h | 1 - shaders/DepthRTT.vertexshader | 4 +++- shaders/gBuffer.vertexshader | 3 ++- src/engine/debug.cpp | 2 +- src/engine/render.cpp | 24 +++++++++---------- src/engine/resources.cpp | 2 +- src/engine/work_queue.h | 2 +- 8 files changed, 23 insertions(+), 21 deletions(-) diff --git a/generated/asyncify_render_function_c_DrawLod.h b/generated/asyncify_render_function_c_DrawLod.h index 841d8ac63..ebd52a57e 100644 --- a/generated/asyncify_render_function_c_DrawLod.h +++ b/generated/asyncify_render_function_c_DrawLod.h @@ -1,11 +1,11 @@ // src/engine/work_queue.h:329:0 link_internal void -DrawLod_Async(work_queue *Queue, engine_resources *Engine , shader *Shader , gpu_mapped_element_buffer *Meshes , r32 DistanceSquared , v3 Basis , Quaternion Rotation , v3 Scale ) +DrawLod_Async(work_queue *Queue, engine_resources *Engine , shader *Shader , gpu_mapped_element_buffer *Meshes , v3 Basis , Quaternion Rotation , v3 Scale ) { draw_lod_async_params Params = { - Engine, Shader, Meshes, DistanceSquared, Basis, Rotation, Scale, + Engine, Shader, Meshes, Basis, Rotation, Scale, }; work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); @@ -15,6 +15,6 @@ DrawLod_Async(work_queue *Queue, engine_resources *Engine , shader *Shader , gp link_internal void DoJob(draw_lod_async_params *Params) { - DrawLod( Params->Engine , Params->Shader , Params->Meshes , Params->DistanceSquared , Params->Basis , Params->Rotation , Params->Scale ); + DrawLod( Params->Engine , Params->Shader , Params->Meshes , Params->Basis , Params->Rotation , Params->Scale ); } diff --git a/generated/asyncify_render_function_h_DrawLod.h b/generated/asyncify_render_function_h_DrawLod.h index 94e3d2560..53848c76a 100644 --- a/generated/asyncify_render_function_h_DrawLod.h +++ b/generated/asyncify_render_function_h_DrawLod.h @@ -5,7 +5,6 @@ struct draw_lod_async_params poof(@async_function_params) engine_resources *Engine; shader *Shader; gpu_mapped_element_buffer *Meshes; - r32 DistanceSquared; v3 Basis; Quaternion Rotation; v3 Scale; diff --git a/shaders/DepthRTT.vertexshader b/shaders/DepthRTT.vertexshader index 389e8e5af..f3c8f8909 100644 --- a/shaders/DepthRTT.vertexshader +++ b/shaders/DepthRTT.vertexshader @@ -1,6 +1,8 @@ layout(location = 0) in vec3 vertexPosition_modelspace; -// NOTE(Jesse): Camera transform +// NOTE(Jesse): It's not just an MVP because of a deficiency on the C++ side; +// we don't have the facilities in the DrawLOD to differentiate between +// this shader and the gBuffer shader, which needs them as two matrices. uniform mat4 ViewProjection; uniform mat4 ModelMatrix; diff --git a/shaders/gBuffer.vertexshader b/shaders/gBuffer.vertexshader index d099e96de..f33cf5935 100644 --- a/shaders/gBuffer.vertexshader +++ b/shaders/gBuffer.vertexshader @@ -45,7 +45,8 @@ void main() vertexP_worldspace = WorldVertex.xyz; - // NOTE(Jesse): We have to normalize because a scale factor will grow/shrink the normal! + // NOTE(Jesse): We have to normalize because a scale factor in the NormalMatrix will grow/shrink the normal! + // TODO(Jesse): Is there some way of avoiding this? I guess hlhl vertexN_worldspace = normalize(mat3(NormalMatrix) * V3(vertexNormal_modelspace)); gl_Position = ViewProjection * WorldVertex; diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index d0d4c99c7..ed4b8c9ae 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -235,7 +235,7 @@ RenderMeshPreviewIntoWorld(engine_resources *Engine, gpu_mapped_element_buffer * v3 AssetHalfDim = Dim/2.f; v3 Basis = GetRenderP(Engine, EntityOrigin) + V3(0.f, 0.f, AssetHalfDim.z); - DrawLod_Async(RenderQ, GetEngineResources(), &Graphics->gBuffer->gBufferShader, Mesh, 0.f, Basis, Quaternion(), V3(1)); + DrawLod_Async(RenderQ, GetEngineResources(), &Graphics->gBuffer->gBufferShader, Mesh, Basis, Quaternion(), V3(1)); PushBonsaiRenderCommandTeardownShader(RenderQ, BonsaiRenderCommand_ShaderId_gBuffer); } diff --git a/src/engine/render.cpp b/src/engine/render.cpp index 6725237b7..84111a469 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1152,23 +1152,23 @@ DrawLod_world_chunk(engine_resources *Engine, shader *Shader, world_chunk_lod_el #if 1 link_internal void -DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Mesh, r32 DistanceSquared, v3 Basis, Quaternion Rotation, v3 Scale ) +DrawLod( engine_resources *Engine, + shader *Shader, + gpu_mapped_element_buffer *Mesh, + v3 Basis, + Quaternion Rotation, + v3 Scale ) { UNPACK_ENGINE_RESOURCES(Engine); AssertNoGlErrors; if (HasGpuMesh(Mesh) && Mesh->Handles.Mapped == False) { - m4 LocalTransform = GetTransformMatrix(Basis*GLOBAL_RENDER_SCALE_FACTOR, Scale*GLOBAL_RENDER_SCALE_FACTOR, Rotation); - m4 NormalMatrix = Transpose(Inverse(LocalTransform)); + m4 ModelMatrix = GetTransformMatrix(Basis*GLOBAL_RENDER_SCALE_FACTOR, Scale*GLOBAL_RENDER_SCALE_FACTOR, Rotation); + TryBindUniform(Shader, "ModelMatrix", &ModelMatrix); - // @janky_model_matrix_bs - // nopush - TryBindUniform(Shader, "ModelMatrix", &LocalTransform); - /* Ensure(TryBindUniform(Shader, "ModelMatrix", &LocalTransform)); */ - AssertNoGlErrors; + m4 NormalMatrix = Transpose(Inverse(ModelMatrix)); TryBindUniform(Shader, "NormalMatrix", &NormalMatrix); // NOTE(Jesse): Not all shaders that use this path draw normals (namely, DepthRTT) - AssertNoGlErrors; auto Handles = &Mesh->Handles; @@ -1236,7 +1236,7 @@ RenderToTexture(engine_resources *Engine, asset_thumbnail *Thumb, gpu_mapped_ele if (Camera == 0) { Camera = &Thumb->Camera; } if (SetupRenderToTextureShader(Engine, &Thumb->Texture, Camera)) { - DrawLod(Engine, &Engine->RTTGroup.Shader, Mesh, 0.f, Offset); + DrawLod(Engine, &Engine->RTTGroup.Shader, Mesh, Offset); } else { @@ -1336,7 +1336,7 @@ DrawEntity( shader *Shader, v3 Basis = GetRenderP(GetEngineResources(), Entity->P) + Offset; AssertNoGlErrors; - DrawLod(GetEngineResources(), Shader, &Model->Mesh, 0.f, Basis, FromEuler(Entity->EulerAngles), V3(Entity->Scale)); + DrawLod(GetEngineResources(), Shader, &Model->Mesh, Basis, FromEuler(Entity->EulerAngles), V3(Entity->Scale)); } } } @@ -1553,7 +1553,7 @@ RenderDrawList(engine_resources *Engine, world_chunk_ptr_paged_list *DrawList, s { Basis = GetSimSpaceP(World, Chunk->WorldP); } - DrawLod(Engine, Shader, &Chunk->Mesh, 0.f, Basis, Quaternion(), V3(Chunk->DimInChunks)); + DrawLod(Engine, Shader, &Chunk->Mesh, Basis, Quaternion(), V3(Chunk->DimInChunks)); AssertNoGlErrors; } } diff --git a/src/engine/resources.cpp b/src/engine/resources.cpp index 082c0c4bf..d1ee52d0c 100644 --- a/src/engine/resources.cpp +++ b/src/engine/resources.cpp @@ -38,7 +38,7 @@ RenderOctree(engine_resources *Engine, shader *Shader) if (Node->Type == OctreeNodeType_Leaf) { - DrawLod(Engine, Shader, &Node->Chunk->Mesh, 0, {}, Quaternion(), V3(1)); + DrawLod(Engine, Shader, &Node->Chunk->Mesh, {}, Quaternion(), V3(1)); } if (Node->Children[0]) { Push(&Stack, Node->Children[0]); } diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index 2f7bf8bf4..d0c744b72 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -177,7 +177,7 @@ poof(asyncify_render_function_h(RenderToTexture)) #include link_internal void -DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Meshes, r32 DistanceSquared, v3 Basis, Quaternion Rotation = Quaternion(), v3 Scale = V3(1.f)); +DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Meshes, v3 Basis, Quaternion Rotation = Quaternion(), v3 Scale = V3(1.f)); poof(asyncify_render_function_h(DrawLod)) #include From 387b47a8dfbac5b182af5e1b3e35b0cccba8d29d Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 13:42:09 -0700 Subject: [PATCH 315/421] Fix some jank : @duplicate_shadow_map_MVP_calculation --- ...ent_buffer_untextured_3d_geometry_buffer.h | 2 +- src/engine/api.cpp | 88 ++++--------------- src/engine/render.cpp | 71 ++++++++++++--- src/engine/render_loop.cpp | 2 +- 4 files changed, 80 insertions(+), 83 deletions(-) diff --git a/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h b/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h index dd3238bf7..21e3aad4e 100644 --- a/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h +++ b/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/render.cpp:1036:0 +// src/engine/render.cpp:1031:0 link_internal void diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 0e437988b..029585095 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -477,6 +477,17 @@ Bonsai_Simulate(engine_resources *Resources) #endif + { // Update tDay and key-light such that we can start drawing + if (Graphics->Settings.Lighting.AutoDayNightCycle) + { + Graphics->Settings.Lighting.tDay += SafeDivide0(Plat->dt, Graphics->Settings.Lighting.tDaySpeed); + } + + UpdateKeyLight(Graphics, Graphics->Settings.Lighting.tDay); + Graphics->SG->Shader.ViewProjection = GetShadowMapMVP(World, &Graphics->GameCamera, Graphics->Settings.Lighting.SunP); + } + + // Draw terrain PushBonsaiRenderCommandGlTimerStart(&Plat->RenderQ, Graphics->gBuffer->GlTimerObject); @@ -496,79 +507,12 @@ Bonsai_Simulate(engine_resources *Resources) return Result; } -link_internal void -UpdateKeyLightColor(graphics *Graphics, r32 tDay) -{ - auto SG = Graphics->SG; - r32 tDaytime = Cos(tDay); - r32 tPostApex = Sin(tDay); - - lighting_settings *Lighting = &Graphics->Settings.Lighting; - - v3 DawnColor = HSVtoRGB(Lighting->DawnHSV) * Lighting->DawnIntensity; - v3 SunColor = HSVtoRGB(Lighting->SunHSV ) * Lighting->SunIntensity; - v3 DuskColor = HSVtoRGB(Lighting->DuskHSV) * Lighting->DuskIntensity; - v3 MoonColor = HSVtoRGB(Lighting->MoonHSV) * Lighting->MoonIntensity; - - Lighting->SunP.x = Sin(((Graphics->SunBasis.x*PI32)) + tDay); - Lighting->SunP.y = Cos(((Graphics->SunBasis.y*PI32))+ tDay); - Lighting->SunP.z = (1.3f+Cos(((Graphics->SunBasis.z*PI32)) + tDay))/2.f; - - if (tDaytime > 0.f) - { - if (tPostApex > 0.f) - { - Lighting->CurrentSunColor = Lerp(tDaytime, DuskColor, SunColor); - } - else - { - Lighting->CurrentSunColor = Lerp(tDaytime, DawnColor, SunColor); - } - } - else - { - if (tPostApex > 0.f) - { - Lighting->CurrentSunColor = Lerp(Abs(tDaytime), DuskColor, MoonColor); - } - else - { - Lighting->CurrentSunColor = Lerp(Abs(tDaytime), DawnColor, MoonColor); - } - } - - switch (Graphics->Settings.ToneMappingType) - { - case ToneMappingType_None: - case ToneMappingType_Reinhard: - case ToneMappingType_Exposure: - { } break; - - case ToneMappingType_AGX: - case ToneMappingType_AGX_Sepia: - case ToneMappingType_AGX_Punchy: - { - if (LengthSq(Lighting->CurrentSunColor) > 1.f) - { - Lighting->CurrentSunColor = Normalize(Lighting->CurrentSunColor); - } - } break; - } -} - link_export b32 Bonsai_Render(engine_resources *Engine) { TIMED_FUNCTION(); UNPACK_ENGINE_RESOURCES(Engine); - if (Graphics->Settings.Lighting.AutoDayNightCycle) - { - Graphics->Settings.Lighting.tDay += SafeDivide0(Plat->dt, Graphics->Settings.Lighting.tDaySpeed); - } - UpdateKeyLightColor(Graphics, Graphics->Settings.Lighting.tDay); - - /* BindUniformByName(Shader, "DrawMinorGrid", False); */ shader_uniform MinorGridUniform = { @@ -587,11 +531,13 @@ Bonsai_Render(engine_resources *Engine) }; - auto SunP = Graphics->Settings.Lighting.SunP; - auto Target = GetRenderP(World->ChunkDim, ComputeTarget(&Graphics->GameCamera), &Graphics->GameCamera); + /* { */ + /* auto SunP = Graphics->Settings.Lighting.SunP; */ + /* auto Target = GetRenderP(World->ChunkDim, ComputeTarget(&Graphics->GameCamera), &Graphics->GameCamera); */ - DEBUG_VALUE(&SunP); - DEBUG_VALUE(&Target); + /* DEBUG_VALUE(&SunP); */ + /* DEBUG_VALUE(&Target); */ + /* } */ PushBonsaiRenderCommandSetupShader(&Plat->RenderQ, BonsaiRenderCommand_ShaderId_gBuffer); diff --git a/src/engine/render.cpp b/src/engine/render.cpp index 84111a469..f25647c71 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -93,11 +93,6 @@ RenderImmediateGeometryToShadowMap(world *World, graphics *Graphics, gpu_mapped_ GL.BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); SetViewport(GetShadowMapResolution(&GetEngineResources()->Settings)); - - // @duplicate_shadow_map_MVP_calculation - /* v3 FrustCenter = GetFrustumCenter(&Graphics->GameCamera); */ - SG->Shader.ViewProjection = GetShadowMapMVP(World, &Graphics->GameCamera, Graphics->Settings.Lighting.SunP); - UseShader(&SG->Shader); Draw(GpuMap->Buffer.At); @@ -1407,11 +1402,6 @@ SetupShadowMapShader(world *World, graphics *Graphics, v2i ShadowMapResolution, SetViewport(ShadowMapResolution); - // TODO(Jesse): Duplicate MVP calculation - // @duplicate_shadow_map_MVP_calculation - /* v3 FrustCenter = GetFrustumCenter(&Graphics->GameCamera); */ - SG->Shader.ViewProjection = GetShadowMapMVP(World, &Graphics->GameCamera, Graphics->Settings.Lighting.SunP); - UseShader(&SG->Shader); GL.Disable(GL_CULL_FACE); @@ -1637,3 +1627,64 @@ DrawWorldAndEntitiesToShadowMap(v2i ShadowMapResolution, engine_resources *Engin TeardownShadowMapShader(Graphics); } + +link_internal void +UpdateKeyLight(graphics *Graphics, r32 tDay) +{ + auto SG = Graphics->SG; + r32 tDaytime = Cos(tDay); + r32 tPostApex = Sin(tDay); + + lighting_settings *Lighting = &Graphics->Settings.Lighting; + + v3 DawnColor = HSVtoRGB(Lighting->DawnHSV) * Lighting->DawnIntensity; + v3 SunColor = HSVtoRGB(Lighting->SunHSV ) * Lighting->SunIntensity; + v3 DuskColor = HSVtoRGB(Lighting->DuskHSV) * Lighting->DuskIntensity; + v3 MoonColor = HSVtoRGB(Lighting->MoonHSV) * Lighting->MoonIntensity; + + Lighting->SunP.x = Sin(((Graphics->SunBasis.x*PI32)) + tDay); + Lighting->SunP.y = Cos(((Graphics->SunBasis.y*PI32))+ tDay); + Lighting->SunP.z = (1.3f+Cos(((Graphics->SunBasis.z*PI32)) + tDay))/2.f; + + if (tDaytime > 0.f) + { + if (tPostApex > 0.f) + { + Lighting->CurrentSunColor = Lerp(tDaytime, DuskColor, SunColor); + } + else + { + Lighting->CurrentSunColor = Lerp(tDaytime, DawnColor, SunColor); + } + } + else + { + if (tPostApex > 0.f) + { + Lighting->CurrentSunColor = Lerp(Abs(tDaytime), DuskColor, MoonColor); + } + else + { + Lighting->CurrentSunColor = Lerp(Abs(tDaytime), DawnColor, MoonColor); + } + } + + switch (Graphics->Settings.ToneMappingType) + { + case ToneMappingType_None: + case ToneMappingType_Reinhard: + case ToneMappingType_Exposure: + { } break; + + case ToneMappingType_AGX: + case ToneMappingType_AGX_Sepia: + case ToneMappingType_AGX_Punchy: + { + if (LengthSq(Lighting->CurrentSunColor) > 1.f) + { + Lighting->CurrentSunColor = Normalize(Lighting->CurrentSunColor); + } + } break; + } +} + diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 67de5cfd7..7734284ee 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -669,7 +669,6 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) // ao_render_group *AoGroup = Graphics->AoGroup; - shadow_render_group *SG = Graphics->SG; EngineDebug->Render.BytesSolidGeoLastFrame = GpuMap->Buffer.At; EngineDebug->Render.BytesTransGeoLastFrame = Graphics->Transparency.GpuBuffer.Buffer.At; @@ -692,6 +691,7 @@ RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) // Editor preview /* DrawStuffToGBufferTextures(Engine, GetApplicationResolution(&Engine->Settings)); */ { + shadow_render_group *SG = Graphics->SG; v3i Radius = World->VisibleRegion/2; v3i Min = World->Center - Radius; v3i Max = World->Center + Radius; From 9040d0c4d8c83f83bdb997d695c8ee448afe3233 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 19:12:38 -0700 Subject: [PATCH 316/421] Get rid of opengl and engine_resources globals --- examples/tile_gen/game.cpp | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 26 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 54 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 26 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...ompound_type_shape_layer_advanced_params.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 2 +- ..._type_world_update_op_shape_params_plane.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._type_world_update_op_shape_params_torus.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 2 +- ...on_pattern_199741702_161749140_632272777.h | 2 +- generated/for_datatypes_Bxw4Q7AW.h | 2 +- generated/for_datatypes_kh9dwrCf.h | 2 +- generated/freelist_allocator_octree_node.h | 7 + generated/freelist_allocator_world_chunk.h | 7 + .../rectalinear_iteration_pattern_812652930.h | 2 +- .../shader_magic_bloom_downsample_shader.h | 2 +- .../shader_magic_bloom_upsample_shader.h | 2 +- .../shader_magic_lighting_render_group.h | 2 +- generated/shader_magic_shadow_map_shader.h | 2 +- ...r_magic_struct_terrain_decoration_shader.h | 2 +- ...gic_struct_terrain_derivs_render_context.h | 2 +- ...c_struct_terrain_finalize_render_context.h | 2 +- ...ader_magic_struct_terrain_shaping_shader.h | 2 +- .../shader_magic_struct_world_edit_shader.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...ing_and_value_tables_visible_region_size.h | 2 +- src/engine/api.cpp | 29 +- src/engine/api.h | 19 +- src/engine/bloom.cpp | 30 +- src/engine/editor.cpp | 3 +- src/engine/gpu_mapped_buffer.cpp | 98 +- src/engine/render.cpp | 228 +-- src/engine/render/gpu_timer.c | 12 +- src/engine/render/gpu_timer.h | 12 +- src/engine/render/render_init.cpp | 42 +- src/engine/render/shadow_map.h | 11 +- src/engine/render_loop.cpp | 1375 ++++++++--------- src/engine/resources.h | 46 +- src/engine/shader.cpp | 4 +- src/engine/terrain_render.cpp | 6 +- src/engine/world_chunk.cpp | 4 +- src/engine/world_update.cpp | 10 +- src/game_loader.cpp | 30 +- 136 files changed, 1155 insertions(+), 1152 deletions(-) diff --git a/examples/tile_gen/game.cpp b/examples/tile_gen/game.cpp index c85cb5b2f..83991d1da 100644 --- a/examples/tile_gen/game.cpp +++ b/examples/tile_gen/game.cpp @@ -26,7 +26,7 @@ BONSAI_API_MAIN_THREAD_CALLBACK() UNPACK_ENGINE_RESOURCES(Resources); - /* GL.Disable(GL_CULL_FACE); */ + /* GetStdlib()->GL.Disable(GL_CULL_FACE); */ entity *Player = GameState->Player; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index cd800dafe..b04351525 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:331:0 +// src/engine/editor.cpp:330:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 8f1a58c33..2efafab65 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:503:0 +// src/engine/editor.cpp:502:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index dc4686d1d..4792b1780 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:495:0 +// src/engine/editor.cpp:494:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index b1fe3391b..0aa46af95 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:370:0 +// src/engine/editor.cpp:369:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 843ca76b4..690424297 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:337:0 +// src/engine/editor.cpp:336:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 2e7ecc5bf..e8d327c39 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:270:0 +// src/engine/editor.cpp:269:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -98,6 +98,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + } + + + { + + + + cs MemberName = CSz("GL"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(opengl*, &Element->GL), + MemberName, + Params + ); + + + + + + + + + } diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index dc40c2ce3..cfec61236 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:406:0 +// src/engine/editor.cpp:405:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 9a4ccde32..fd6cd7387 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:176:0 +// src/engine/editor.cpp:175:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index d93ac4943..165b1bc44 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:364:0 +// src/engine/editor.cpp:363:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 4b4a19109..b0ded6063 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:436:0 +// src/engine/editor.cpp:435:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 805c17b86..aa2d5c434 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:373:0 +// src/engine/editor.cpp:372:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 232e94349..7fc4ada9d 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:506:0 +// src/engine/editor.cpp:505:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index e011d70de..2f9ee28ef 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:266:0 +// src/engine/editor.cpp:265:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 7d87cd92a..e33378716 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:567:0 +// src/engine/editor.cpp:566:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index b55c7e3c3..250e0792f 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:588:0 +// src/engine/editor.cpp:587:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -122,6 +122,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs + } + + + { + + + + cs MemberName = CSz("EngineApi"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(engine_api*, &Element->EngineApi), + MemberName, + Params + ); + + + + + + + + + } @@ -490,11 +514,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - cs MemberName = CSz("DebugState"); + cs MemberName = CSz("EngineDebug"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(debug_state*, Element->DebugState), + Cast(engine_debug*, &Element->EngineDebug), MemberName, Params ); @@ -514,11 +538,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - cs MemberName = CSz("EngineDebug"); + cs MemberName = CSz("Editor"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(engine_debug*, &Element->EngineDebug), + Cast(level_editor*, &Element->Editor), MemberName, Params ); @@ -538,11 +562,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - cs MemberName = CSz("Editor"); + cs MemberName = CSz("MousedOverVoxel"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(level_editor*, &Element->Editor), + Cast(maybe_picked_voxel*, &Element->MousedOverVoxel), MemberName, Params ); @@ -562,11 +586,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - cs MemberName = CSz("MousedOverVoxel"); + cs MemberName = CSz("ClosestStandingSpotToCursor"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(maybe_picked_voxel*, &Element->MousedOverVoxel), + Cast(maybe_standing_spot*, &Element->ClosestStandingSpotToCursor), MemberName, Params ); @@ -586,11 +610,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - cs MemberName = CSz("ClosestStandingSpotToCursor"); + cs MemberName = CSz("HoverEntity"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(maybe_standing_spot*, &Element->ClosestStandingSpotToCursor), + Cast(maybe_entity_ptr*, &Element->HoverEntity), MemberName, Params ); @@ -610,11 +634,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - cs MemberName = CSz("HoverEntity"); + cs MemberName = CSz("RTTGroup"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(maybe_entity_ptr*, &Element->HoverEntity), + Cast(render_entity_to_texture_group*, &Element->RTTGroup), MemberName, Params ); @@ -634,11 +658,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - cs MemberName = CSz("RTTGroup"); + cs MemberName = CSz("SynChunkFreelist"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(render_entity_to_texture_group*, &Element->RTTGroup), + Cast(world_chunk_freelist*, &Element->SynChunkFreelist), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 93d27e71d..8007f2330 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:585:0 +// src/engine/editor.cpp:584:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index a788f2b09..96b3ab400 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:475:0 +// src/engine/editor.cpp:474:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 8242bff80..d93956fc6 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:472:0 +// src/engine/editor.cpp:471:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 122768a41..93024d9ad 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:509:0 +// src/engine/editor.cpp:508:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 53c1426f6..8bacab26c 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:460:0 +// src/engine/editor.cpp:459:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 91ba6ac62..5db08a4fd 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:361:0 +// src/engine/editor.cpp:360:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 8a00b7060..be770213b 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:543:0 +// src/engine/editor.cpp:542:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index b381c39d9..e9c0fa298 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:537:0 +// src/engine/editor.cpp:536:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index f5c0679c2..96b705b9c 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:442:0 +// src/engine/editor.cpp:441:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index f074374ad..ee5f3ab0d 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:445:0 +// src/engine/editor.cpp:444:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 08e1826b8..dadb06f9c 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:558:0 +// src/engine/editor.cpp:557:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index b5e001f13..560047210 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:582:0 +// src/engine/editor.cpp:581:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 4c018e930..632b0b087 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:259:0 +// src/engine/editor.cpp:258:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index c060f2017..005d0e4e6 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:256:0 +// src/engine/editor.cpp:255:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 67d214602..9cf967dca 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:328:0 +// src/engine/editor.cpp:327:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 365a56d5e..f34bb4168 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:409:0 +// src/engine/editor.cpp:408:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 68a4f639a..d3963045f 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:573:0 +// src/engine/editor.cpp:572:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 61c149e0b..0df00c63d 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:540:0 +// src/engine/editor.cpp:539:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 89296f9d4..efea86e8f 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:307:0 +// src/engine/editor.cpp:306:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index cf15ac46e..ef4ed6175 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:448:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 90bea2a5f..71796eb29 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:451:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 6e2d405ba..807f4686c 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:153:0 +// src/engine/editor.cpp:152:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 4075e8310..01e7f0836 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:485:0 +// src/engine/editor.cpp:484:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 48453114e..d44078f18 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:322:0 +// src/engine/editor.cpp:321:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 1c3685114..6341bca54 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:325:0 +// src/engine/editor.cpp:324:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 93160e6cb..75e2876a1 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:149:0 +// src/engine/editor.cpp:148:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index b1c97599f..d7b7d76b6 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:313:0 +// src/engine/editor.cpp:312:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index ec2529f73..6f72288e1 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:358:0 +// src/engine/editor.cpp:357:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 3a85d82b3..27898ea92 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:262:0 +// src/engine/editor.cpp:261:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) @@ -219,30 +219,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u - } - - - { - - - - cs MemberName = CSz("Threads"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(thread_startup_params*, Element->Threads), - MemberName, - Params - ); - - - - - - - - - } diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index b7003a3e7..88285733c 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:316:0 +// src/engine/editor.cpp:315:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index cd5f3ed7a..cbac88fc3 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:531:0 +// src/engine/editor.cpp:530:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index ae565cb27..1fc70f3df 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:561:0 +// src/engine/editor.cpp:560:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index fa8d2e25c..a20951b55 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:310:0 +// src/engine/editor.cpp:309:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index f3e33bcff..2d63bae83 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:534:0 +// src/engine/editor.cpp:533:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 02ffc99ae..35fc817be 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:242:0 +// src/engine/editor.cpp:241:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 4aec772bf..65c00f084 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:174:0 +// src/engine/editor.cpp:173:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h b/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h index 733d2b0a7..293be0fbf 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:172:0 +// src/engine/editor.cpp:171:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer_advanced_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 9ef2e938b..9d3206646 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:549:0 +// src/engine/editor.cpp:548:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 90cf2450b..0b1b30cef 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:552:0 +// src/engine/editor.cpp:551:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 88f1fa0b5..371dc8263 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:546:0 +// src/engine/editor.cpp:545:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index b4600e49e..f9a0d0b47 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:412:0 +// src/engine/editor.cpp:411:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 4434ea8da..b3f7c74dc 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:555:0 +// src/engine/editor.cpp:554:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index ed1089328..a37286ade 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:367:0 +// src/engine/editor.cpp:366:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 17c860d58..8f6712d6c 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:564:0 +// src/engine/editor.cpp:563:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 72b47b204..c34a2b442 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:182:0 +// src/engine/editor.cpp:181:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 27615d6aa..0f8a298c0 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:185:0 +// src/engine/editor.cpp:184:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 7a52e9a17..ce6296e56 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:340:0 +// src/engine/editor.cpp:339:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 352780d5f..4fe6a763a 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:334:0 +// src/engine/editor.cpp:333:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 91048a5e5..db01c02ca 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:151:0 +// src/engine/editor.cpp:150:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index a0c97b5eb..894d0a6cb 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:439:0 +// src/engine/editor.cpp:438:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index edec17eb7..d81778980 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:430:0 +// src/engine/editor.cpp:429:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index d5d329d67..72735c360 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:433:0 +// src/engine/editor.cpp:432:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index b9f645e03..86fb7bc5c 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:147:0 +// src/engine/editor.cpp:146:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index c3a9b9ee9..259fa8eb1 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:253:0 +// src/engine/editor.cpp:252:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 7b4dd1dd6..c698d4cc1 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:250:0 +// src/engine/editor.cpp:249:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 639469616..66b771e1d 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:488:0 +// src/engine/editor.cpp:487:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 258ae7f4d..88452b6aa 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:482:0 +// src/engine/editor.cpp:481:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index 444634bd9..7d91a16c3 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:421:0 +// src/engine/editor.cpp:420:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 66aabd09d..e933b0e6b 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:161:0 +// src/engine/editor.cpp:160:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h index 6067126b1..e6da6a457 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:163:0 +// src/engine/editor.cpp:162:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index b5f15394c..f70160b0b 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:157:0 +// src/engine/editor.cpp:156:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 5d61948bf..d35d44094 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:159:0 +// src/engine/editor.cpp:158:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h index 8fae88958..2ab849aa9 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:165:0 +// src/engine/editor.cpp:164:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_torus *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 173785f3d..64d11e239 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:479:0 +// src/engine/editor.cpp:478:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 91e2ca4e2..7f194b1c7 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:454:0 +// src/engine/editor.cpp:453:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index 6bdb90f4e..8be9445a6 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:245:0 +// src/engine/editor.cpp:244:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 54e68289c..51063ea44 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:239:0 +// src/engine/editor.cpp:238:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 8be2ecacb..c1d87358c 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:194:0 +// src/engine/editor.cpp:193:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index f8d1117f4..f9fd8c188 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:179:0 +// src/engine/editor.cpp:178:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index ee023cae6..fb32c30af 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:424:0 +// src/engine/editor.cpp:423:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index a62869dd6..0b6c78e8b 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:500:0 +// src/engine/editor.cpp:499:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 84e0e6556..39d86f0a5 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:427:0 +// src/engine/editor.cpp:426:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 76948a497..d8b309607 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:570:0 +// src/engine/editor.cpp:569:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index dc55c2acd..0faa627c6 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:298:0 +// src/engine/editor.cpp:297:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index a641fc611..875fa1514 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:295:0 +// src/engine/editor.cpp:294:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 133fa9559..f056991dd 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:457:0 +// src/engine/editor.cpp:456:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 96a52e1ce..fc59957b7 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:319:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 1d4229417..6dbc467bb 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:576:0 +// src/engine/editor.cpp:575:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 8dc5b7f7a..788c1a3e9 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:579:0 +// src/engine/editor.cpp:578:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index deb0cc286..4c3e7e8e8 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:170:0 +// src/engine/editor.cpp:169:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index bd31d39a6..3e3869012 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:301:0 +// src/engine/editor.cpp:300:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index 6d49d9ce1..f7c8efb89 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:143:0 +// src/engine/editor.cpp:142:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index e78237274..d5f4bfaf1 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:577:0 +// src/engine/world_update.cpp:579:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index a6b3ff0d1..52e0eda64 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:517:0 +// src/engine/editor.cpp:516:0 diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 2c43d27d5..5e7251928 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:380:0 +// src/engine/editor.cpp:379:0 diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index 7a8db890d..7ef6f6d5f 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -4,11 +4,15 @@ struct octree_node_freelist { octree_node *First; memory_arena *Memory; + bonsai_futex Lock; }; link_internal octree_node * GetOrAllocate(octree_node_freelist *Freelist) { + + + AcquireFutex(&Freelist->Lock); octree_node *Result = Freelist->First; if (Result) @@ -19,6 +23,7 @@ GetOrAllocate(octree_node_freelist *Freelist) { Result = Allocate( octree_node, Freelist->Memory, 1 ); } + ReleaseFutex(&Freelist->Lock); return Result; } @@ -26,7 +31,9 @@ GetOrAllocate(octree_node_freelist *Freelist) link_internal void Free(octree_node_freelist *Freelist, octree_node *Element) { + AcquireFutex(&Freelist->Lock); Element->Next = Freelist->First; Freelist->First = Element; + ReleaseFutex(&Freelist->Lock); } diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h index e6840fd64..aff58cda5 100644 --- a/generated/freelist_allocator_world_chunk.h +++ b/generated/freelist_allocator_world_chunk.h @@ -4,11 +4,15 @@ struct world_chunk_freelist { world_chunk *First; memory_arena *Memory; + bonsai_futex Lock; }; link_internal world_chunk * GetOrAllocate(world_chunk_freelist *Freelist) { + + + AcquireFutex(&Freelist->Lock); world_chunk *Result = Freelist->First; if (Result) @@ -19,6 +23,7 @@ GetOrAllocate(world_chunk_freelist *Freelist) { Result = Allocate( world_chunk, Freelist->Memory, 1 ); } + ReleaseFutex(&Freelist->Lock); return Result; } @@ -26,7 +31,9 @@ GetOrAllocate(world_chunk_freelist *Freelist) link_internal void Free(world_chunk_freelist *Freelist, world_chunk *Element) { + AcquireFutex(&Freelist->Lock); Element->Next = Freelist->First; Freelist->First = Element; + ReleaseFutex(&Freelist->Lock); } diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index b76de185b..672d5884b 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:612:0 +// src/engine/world_update.cpp:614:0 DimIterator(x, y, z, UpdateDim) { diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index 63ca31c82..83b7ade75 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -32,7 +32,7 @@ InitializeBloomDownsampleShader( bloom_downsample_shader *Struct link_internal void UseShader( bloom_downsample_shader *Struct ) { - GL.UseProgram(Struct->Program.ID); + GetStdlib()->GL.UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index fcab7cc33..21f0f2265 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -32,7 +32,7 @@ InitializeBloomUpsampleShader( bloom_upsample_shader *Struct link_internal void UseShader( bloom_upsample_shader *Struct ) { - GL.UseProgram(Struct->Program.ID); + GetStdlib()->GL.UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_lighting_render_group.h b/generated/shader_magic_lighting_render_group.h index 6eb45859e..b79497a03 100644 --- a/generated/shader_magic_lighting_render_group.h +++ b/generated/shader_magic_lighting_render_group.h @@ -132,7 +132,7 @@ InitializeLightingRenderGroup( lighting_render_group *Struct link_internal void UseShader( lighting_render_group *Struct ) { - GL.UseProgram(Struct->Program.ID); + GetStdlib()->GL.UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index 55f2e5853..ce45e2a11 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -41,7 +41,7 @@ InitializeShadowMapShader( shadow_map_shader *Struct link_internal void UseShader( shadow_map_shader *Struct ) { - GL.UseProgram(Struct->Program.ID); + GetStdlib()->GL.UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index e0c96ade1..7ddc36a28 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -41,7 +41,7 @@ InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Str link_internal void UseShader( terrain_decoration_render_context *Struct ) { - GL.UseProgram(Struct->Program.ID); + GetStdlib()->GL.UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_derivs_render_context.h b/generated/shader_magic_struct_terrain_derivs_render_context.h index 32e171b31..2e35e13f4 100644 --- a/generated/shader_magic_struct_terrain_derivs_render_context.h +++ b/generated/shader_magic_struct_terrain_derivs_render_context.h @@ -32,7 +32,7 @@ InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct link_internal void UseShader( terrain_derivs_render_context *Struct ) { - GL.UseProgram(Struct->Program.ID); + GetStdlib()->GL.UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index 51b3fb56f..a069a8b84 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -32,7 +32,7 @@ InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct link_internal void UseShader( terrain_finalize_render_context *Struct ) { - GL.UseProgram(Struct->Program.ID); + GetStdlib()->GL.UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index ab544becc..ec2439ef6 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -37,7 +37,7 @@ InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct link_internal void UseShader( terrain_shaping_render_context *Struct ) { - GL.UseProgram(Struct->Program.ID); + GetStdlib()->GL.UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index 1de408223..d24d92476 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -41,7 +41,7 @@ InitializeWorldEditRenderContext( world_edit_render_context *Struct link_internal void UseShader( world_edit_render_context *Struct ) { - GL.UseProgram(Struct->Program.ID); + GetStdlib()->GL.UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index d772dda40..38b958be4 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:498:0 +// src/engine/editor.cpp:497:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 865641636..573233725 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:291:0 +// src/engine/editor.cpp:290:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index b3dc7ec96..55183a43a 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:285:0 +// src/engine/editor.cpp:284:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 8592d1c39..06db42759 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:282:0 +// src/engine/editor.cpp:281:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 3fa3aff0a..df8f9b3eb 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:288:0 +// src/engine/editor.cpp:287:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index 0ee54c1b3..6124d210a 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:141:0 +// src/engine/editor.cpp:140:0 link_internal counted_string ToStringPrefixless(visible_region_size Type) diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 029585095..96afde056 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -8,11 +8,6 @@ Bonsai_OnLibraryLoad(engine_resources *Resources) else { Assert(ThreadLocal_ThreadIndex == 0); } Global_ThreadStates = Resources->Stdlib.ThreadStates; - Global_EngineResources = Resources; - - /* Initialize_Global_UpdateWorldCallbackTable(); */ - - /* b32 Result = InitializeOpenglFunctions(); */ return True; } @@ -534,7 +529,6 @@ Bonsai_Render(engine_resources *Engine) /* { */ /* auto SunP = Graphics->Settings.Lighting.SunP; */ /* auto Target = GetRenderP(World->ChunkDim, ComputeTarget(&Graphics->GameCamera), &Graphics->GameCamera); */ - /* DEBUG_VALUE(&SunP); */ /* DEBUG_VALUE(&Target); */ /* } */ @@ -579,9 +573,7 @@ Bonsai_Render(engine_resources *Engine) struct bonsai_thread_user_data { u64 Magic0 = 0x69; - world_chunk_freelist SynChunkFreelist; - u64 Magic1 = 0x420; }; @@ -609,21 +601,10 @@ link_weak void WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_PARAMS) { engine_resources *EngineResources = GetEngineResources(); - world *World = EngineResources->World; + world *World = EngineResources->World; auto RenderQ = &EngineResources->Stdlib.Plat.RenderQ; - if (Thread->UserData == 0) - { - Thread->UserData = Allocate(bonsai_thread_user_data, Thread->PermMemory, 1); - bonsai_thread_user_data *UserData = Cast(bonsai_thread_user_data*, Thread->UserData); - *UserData = {}; - } - - bonsai_thread_user_data *UserData = Cast(bonsai_thread_user_data*, Thread->UserData); - Assert(UserData->Magic0 == 0x69); - Assert(UserData->Magic1 == 0x420); - tswitch (Entry) { InvalidCase(type_work_queue_entry_noop); @@ -655,7 +636,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ Assert(Chunk); world_chunk *DestChunk = Node->Chunk; - world_chunk *SynChunk = GetOrAllocate(&UserData->SynChunkFreelist, {}, Chunk->Dim + V3i(0, 2, 2), Chunk->DimInChunks, Thread->PermMemory); + world_chunk *SynChunk = GetOrAllocate(&EngineResources->SynChunkFreelist, {}, Chunk->Dim + V3i(0, 2, 2), Chunk->DimInChunks, Thread->PermMemory); /* SynChunk->Flags = Chunk_Queued; */ Assert(NoiseDim == V3i(66, 66, 66)); @@ -705,7 +686,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ PushDeallocateBuffersCommand(RenderQ, &DestChunk->Mesh.Handles); } FinalizeNodeInitializaion(Node); - FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); + FreeWorldChunk(&EngineResources->SynChunkFreelist, SynChunk); } } else @@ -716,7 +697,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ PushDeallocateBuffersCommand(RenderQ, &DestChunk->Mesh.Handles); } FinalizeNodeInitializaion(Node); - FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); + FreeWorldChunk(&EngineResources->SynChunkFreelist, SynChunk); } auto Graphics = &EngineResources->Graphics; @@ -749,7 +730,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ SynChunk->Mesh = {}; Assert(GpuMappedBuf.Buffer.At == GpuMappedBuf.Buffer.End); - FreeWorldChunk(&UserData->SynChunkFreelist, SynChunk); + FreeWorldChunk(&EngineResources->SynChunkFreelist, SynChunk); PushBonsaiRenderCommandUnmapGpuElementBuffer(RenderQ, GpuMappedBuf, DestNode); #endif diff --git a/src/engine/api.h b/src/engine/api.h index 8115f8de0..12f5911fb 100644 --- a/src/engine/api.h +++ b/src/engine/api.h @@ -7,11 +7,13 @@ struct engine_api bonsai_engine_callback FrameBegin; bonsai_engine_callback Simulate; bonsai_engine_callback FrameEnd; - bonsai_engine_callback Render; // NOTE(Jesse): This gets loaded such that the render thread shares the same // globals as the game lib. thread_main_callback_type RenderThread_Main; + + bonsai_engine_callback DrainRenderQueue; + bonsai_engine_callback Render; }; link_internal b32 @@ -23,23 +25,24 @@ InitializeEngineApi(engine_api *EngineApi, shared_lib GameLib) EngineApi->Simulate = (bonsai_engine_callback)GetProcFromLib(GameLib, STRINGIZE(Bonsai_Simulate) ); EngineApi->FrameBegin = (bonsai_engine_callback)GetProcFromLib(GameLib, STRINGIZE(Bonsai_FrameBegin) ); EngineApi->FrameEnd = (bonsai_engine_callback)GetProcFromLib(GameLib, STRINGIZE(Bonsai_FrameEnd) ); - EngineApi->Render = (bonsai_engine_callback)GetProcFromLib(GameLib, STRINGIZE(Bonsai_Render) ); + EngineApi->Render = (bonsai_engine_callback) GetProcFromLib(GameLib, STRINGIZE(Bonsai_Render) ); EngineApi->RenderThread_Main = (thread_main_callback_type)GetProcFromLib(GameLib, STRINGIZE(RenderThread_Main) ); + EngineApi->DrainRenderQueue = (bonsai_engine_callback) GetProcFromLib(GameLib, STRINGIZE(DrainRenderQueue) ); - b32 Result = EngineApi->Simulate && EngineApi->OnLibraryLoad && EngineApi->Init && EngineApi->FrameBegin && EngineApi->FrameEnd && EngineApi->Render && EngineApi->RenderThread_Main; + b32 Result = EngineApi->Simulate && EngineApi->OnLibraryLoad && EngineApi->Init && EngineApi->FrameBegin && EngineApi->FrameEnd && EngineApi->Render && EngineApi->RenderThread_Main && EngineApi->DrainRenderQueue; return Result; } link_internal b32 InitializeGameApi(application_api *GameApi, shared_lib GameLib) { - GameApi->GameInit = (bonsai_main_thread_init_callback) GetProcFromLib(GameLib, STRINGIZE(BONSAI_API_MAIN_THREAD_INIT_CALLBACK_NAME)); - GameApi->GameMain = (bonsai_main_thread_callback) GetProcFromLib(GameLib, STRINGIZE(BONSAI_API_MAIN_THREAD_CALLBACK_NAME)); - GameApi->WorkerInit = (bonsai_worker_thread_init_callback)GetProcFromLib(GameLib, STRINGIZE(BONSAI_API_WORKER_THREAD_INIT_CALLBACK_NAME)); - GameApi->WorkerMain = (bonsai_worker_thread_callback) GetProcFromLib(GameLib, STRINGIZE(BONSAI_API_WORKER_THREAD_CALLBACK_NAME) ); + GameApi->GameInit = (bonsai_main_thread_init_callback) GetProcFromLib(GameLib, STRINGIZE(BONSAI_API_MAIN_THREAD_INIT_CALLBACK_NAME)); + GameApi->GameMain = (bonsai_main_thread_callback) GetProcFromLib(GameLib, STRINGIZE(BONSAI_API_MAIN_THREAD_CALLBACK_NAME)); + GameApi->WorkerInit = (bonsai_worker_thread_init_callback) GetProcFromLib(GameLib, STRINGIZE(BONSAI_API_WORKER_THREAD_INIT_CALLBACK_NAME)); + GameApi->WorkerMain = (bonsai_worker_thread_callback) GetProcFromLib(GameLib, STRINGIZE(BONSAI_API_WORKER_THREAD_CALLBACK_NAME) ); GameApi->WorkerBeforeJob = (bonsai_worker_thread_before_job_callback)GetProcFromLib(GameLib, STRINGIZE(BONSAI_API_WORKER_THREAD_BEFORE_JOB_CALLBACK_NAME)); - GameApi->OnLibraryLoad = (bonsai_main_thread_callback) GetProcFromLib(GameLib, STRINGIZE(BONSAI_API_ON_GAME_LIB_LOAD_CALLBACK_NAME) ); + GameApi->OnLibraryLoad = (bonsai_main_thread_callback) GetProcFromLib(GameLib, STRINGIZE(BONSAI_API_ON_GAME_LIB_LOAD_CALLBACK_NAME) ); b32 Result = GameApi->GameMain != 0; return Result; diff --git a/src/engine/bloom.cpp b/src/engine/bloom.cpp index d2d66ee0b..560d84de5 100644 --- a/src/engine/bloom.cpp +++ b/src/engine/bloom.cpp @@ -21,8 +21,8 @@ InitBloomRenderGroup(bloom_render_group *Group, render_settings *Settings, memor // Bloom FBO { Group->BlurFBO = GenFramebuffer(); - GL.BindFramebuffer(GL_FRAMEBUFFER, Group->BlurFBO.ID); - GL.BindTexture(GL_TEXTURE_2D, Group->Tex.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Group->BlurFBO.ID); + GetStdlib()->GL.BindTexture(GL_TEXTURE_2D, Group->Tex.ID); FramebufferTexture(&Group->BlurFBO, &Group->Tex); SetDrawBuffers(&Group->BlurFBO); if (CheckAndClearFramebuffer() == False) { Error("Initializing Bloom FBO"); } @@ -40,13 +40,13 @@ RunBloomRenderPass(graphics *Graphics) { bloom_render_group *Group = &Graphics->Bloom; - GL.BindFramebuffer(GL_FRAMEBUFFER, Group->BlurFBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Group->BlurFBO.ID); // Setup VBO for fullscreen quad Assert(Global_QuadVertexBuffer); - GL.EnableVertexAttribArray(0); - GL.BindBuffer(GL_ARRAY_BUFFER, Global_QuadVertexBuffer); - GL.VertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + GetStdlib()->GL.EnableVertexAttribArray(0); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Global_QuadVertexBuffer); + GetStdlib()->GL.VertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); AssertNoGlErrors; // @@ -56,10 +56,10 @@ RunBloomRenderPass(graphics *Graphics) UseShader(&Group->DownsampleShader); // Activate the 0th texture unit - GL.ActiveTexture(GL_TEXTURE0); + GetStdlib()->GL.ActiveTexture(GL_TEXTURE0); // LuminanceTex is the source for the bloom, start with it as the source tex - GL.BindTexture(GL_TEXTURE_2D, Graphics->Lighting.LuminanceTex.ID); + GetStdlib()->GL.BindTexture(GL_TEXTURE_2D, Graphics->Lighting.LuminanceTex.ID); v2 SrcDim = V2(Graphics->Lighting.LuminanceTex.Dim); RangeIterator(MipIndex, BLOOM_MIP_CHAIN_COUNT) @@ -69,10 +69,10 @@ RunBloomRenderPass(graphics *Graphics) BindUniformByName(&Group->DownsampleShader.Program, "SrcDim", &SrcDim); - GL.FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, MipTex->ID, 0); + GetStdlib()->GL.FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, MipTex->ID, 0); Draw(6); - GL.BindTexture(GL_TEXTURE_2D, MipTex->ID); // Make current mip the source for next iteration + GetStdlib()->GL.BindTexture(GL_TEXTURE_2D, MipTex->ID); // Make current mip the source for next iteration SrcDim = V2(MipTex->Dim); } @@ -89,22 +89,22 @@ RunBloomRenderPass(graphics *Graphics) texture *MipTex = Group->MipChain + MipIndex; SetViewport(MipTex->Dim); - GL.FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, MipTex->ID, 0); + GetStdlib()->GL.FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, MipTex->ID, 0); Draw(6); - GL.BindTexture(GL_TEXTURE_2D, MipTex->ID); // Make current mip the source for next iteration + GetStdlib()->GL.BindTexture(GL_TEXTURE_2D, MipTex->ID); // Make current mip the source for next iteration SrcDim = V2(MipTex->Dim); } // Final upsample into full-res texture SetViewport(Group->Tex.Dim); - GL.FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, Group->Tex.ID, 0); + GetStdlib()->GL.FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, Group->Tex.ID, 0); Draw(6); // Teardown VBO - GL.BindBuffer(GL_ARRAY_BUFFER, 0); - GL.DisableVertexAttribArray(0); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, 0); + GetStdlib()->GL.DisableVertexAttribArray(0); } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 2be280798..83bc2ec78 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -133,8 +133,7 @@ poof(block_array_c(asset_thumbnail, {8})) link_weak ui_debug * GetUiDebug() { - Assert(Global_EngineResources); - return &Global_EngineResources->EngineDebug.UiDebug; + return &GetEngineResources()->EngineDebug.UiDebug; } diff --git a/src/engine/gpu_mapped_buffer.cpp b/src/engine/gpu_mapped_buffer.cpp index a6803406e..3b579ad96 100644 --- a/src/engine/gpu_mapped_buffer.cpp +++ b/src/engine/gpu_mapped_buffer.cpp @@ -14,10 +14,10 @@ FlushBuffersToCard(gpu_mapped_element_buffer *Buffer) AssertNoGlErrors; - GL.EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); - GL.EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); - GL.EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); - GL.EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); + GetStdlib()->GL.EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); + GetStdlib()->GL.EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); + GetStdlib()->GL.EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); + GetStdlib()->GL.EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); AssertNoGlErrors; @@ -28,27 +28,27 @@ FlushBuffersToCard(gpu_mapped_element_buffer *Buffer) case DataType_v3: { - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GL.VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); - BufferUnmapped = GL.UnmapBuffer(GL_ARRAY_BUFFER); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetStdlib()->GL.VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + BufferUnmapped = GetStdlib()->GL.UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); - BufferUnmapped &= GL.UnmapBuffer(GL_ARRAY_BUFFER); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetStdlib()->GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + BufferUnmapped &= GetStdlib()->GL.UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; } break; case DataType_v3_u8: { - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GL.VertexAttribIPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, 0, (void*)0); - BufferUnmapped = GL.UnmapBuffer(GL_ARRAY_BUFFER); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetStdlib()->GL.VertexAttribIPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, 0, (void*)0); + BufferUnmapped = GetStdlib()->GL.UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); - BufferUnmapped &= GL.UnmapBuffer(GL_ARRAY_BUFFER); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetStdlib()->GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); + BufferUnmapped &= GetStdlib()->GL.UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; } break; @@ -59,10 +59,10 @@ FlushBuffersToCard(gpu_mapped_element_buffer *Buffer) const u32 MtlFloatElements = sizeof(matl)/sizeof(u8); CAssert(MtlFloatElements == 4); - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); - GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf( ColorIndex, matl)) ); - GL.VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof - BufferUnmapped &= GL.UnmapBuffer(GL_ARRAY_BUFFER); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetStdlib()->GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf( ColorIndex, matl)) ); + GetStdlib()->GL.VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof + BufferUnmapped &= GetStdlib()->GL.UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; if (BufferUnmapped == False) { Error("glUnmapBuffer Failed"); } @@ -92,19 +92,19 @@ AllocateGpuElementBuffer(gpu_element_buffer_handles *Handles, data_type Type, u3 case DataType_v3: { u32 v3Size = sizeof(v3)*ElementCount; - GL.GenBuffers(3, &Handles->VertexHandle); + GetStdlib()->GL.GenBuffers(3, &Handles->VertexHandle); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GL.BufferData(GL_ARRAY_BUFFER, v3Size, 0, GL_STATIC_DRAW); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetStdlib()->GL.BufferData(GL_ARRAY_BUFFER, v3Size, 0, GL_STATIC_DRAW); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GL.BufferData(GL_ARRAY_BUFFER, v3Size, 0, GL_STATIC_DRAW); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetStdlib()->GL.BufferData(GL_ARRAY_BUFFER, v3Size, 0, GL_STATIC_DRAW); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); - GL.BufferData(GL_ARRAY_BUFFER, matlSize, 0, GL_STATIC_DRAW); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetStdlib()->GL.BufferData(GL_ARRAY_BUFFER, matlSize, 0, GL_STATIC_DRAW); AssertNoGlErrors; } break; @@ -112,25 +112,25 @@ AllocateGpuElementBuffer(gpu_element_buffer_handles *Handles, data_type Type, u3 case DataType_v3_u8: { u32 v3u8Size = sizeof(v3_u8)*ElementCount; - GL.GenBuffers(3, &Handles->VertexHandle); + GetStdlib()->GL.GenBuffers(3, &Handles->VertexHandle); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GL.BufferData(GL_ARRAY_BUFFER, v3u8Size, 0, GL_STATIC_DRAW); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetStdlib()->GL.BufferData(GL_ARRAY_BUFFER, v3u8Size, 0, GL_STATIC_DRAW); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GL.BufferData(GL_ARRAY_BUFFER, v3u8Size, 0, GL_STATIC_DRAW); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetStdlib()->GL.BufferData(GL_ARRAY_BUFFER, v3u8Size, 0, GL_STATIC_DRAW); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); - GL.BufferData(GL_ARRAY_BUFFER, matlSize, 0, GL_STATIC_DRAW); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetStdlib()->GL.BufferData(GL_ARRAY_BUFFER, matlSize, 0, GL_STATIC_DRAW); AssertNoGlErrors; } break; } - GL.BindBuffer(GL_ARRAY_BUFFER, 0); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, 0); AssertNoGlErrors; } @@ -144,7 +144,7 @@ AllocateGpuElementBuffer(gpu_mapped_element_buffer *GpuMap, data_type Type, u32 link_internal void DeallocateGpuElementBuffer(gpu_element_buffer_handles *Handles) { - GL.DeleteBuffers(3, &Handles->VertexHandle); + GetStdlib()->GL.DeleteBuffers(3, &Handles->VertexHandle); Clear(Handles); } @@ -178,20 +178,20 @@ MapGpuBuffer_untextured_3d_geometry_buffer(gpu_element_buffer_handles *Handles) { u32 BufferSize = sizeof(v3)*Handles->ElementCount; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); AssertNoGlErrors; - Buffer.Verts = (v3*)GL.MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); + Buffer.Verts = (v3*) GetStdlib()->GL.MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); AssertNoGlErrors; - Buffer.Normals = (v3*)GL.MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); + Buffer.Normals = (v3*) GetStdlib()->GL.MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; // Color data - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); AssertNoGlErrors; - Buffer.Mat = (matl*)GL.MapBufferRange(GL_ARRAY_BUFFER, 0, MaterialBufferSize, GL_MAP_WRITE_BIT); + Buffer.Mat = (matl*) GetStdlib()->GL.MapBufferRange(GL_ARRAY_BUFFER, 0, MaterialBufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; } break; @@ -200,20 +200,20 @@ MapGpuBuffer_untextured_3d_geometry_buffer(gpu_element_buffer_handles *Handles) { u32 BufferSize = sizeof(v3_u8)*Handles->ElementCount; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); AssertNoGlErrors; - Buffer.Verts = (v3_u8*)GL.MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); + Buffer.Verts = (v3_u8*) GetStdlib()->GL.MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); AssertNoGlErrors; - Buffer.Normals = (v3_u8*)GL.MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); + Buffer.Normals = (v3_u8*) GetStdlib()->GL.MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; // Color data - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); AssertNoGlErrors; - Buffer.Mat = (matl*)GL.MapBufferRange(GL_ARRAY_BUFFER, 0, MaterialBufferSize, GL_MAP_WRITE_BIT); + Buffer.Mat = (matl*) GetStdlib()->GL.MapBufferRange(GL_ARRAY_BUFFER, 0, MaterialBufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; } break; @@ -224,7 +224,7 @@ MapGpuBuffer_untextured_3d_geometry_buffer(gpu_element_buffer_handles *Handles) if (!Buffer.Normals) { Error("Allocating gpu_mapped_element_buffer::Normals"); } if (!Buffer.Mat) { Error("Allocating gpu_mapped_element_buffer::Mat"); } - GL.BindBuffer(GL_ARRAY_BUFFER, 0); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, 0); return {*Handles, Buffer}; } diff --git a/src/engine/render.cpp b/src/engine/render.cpp index f25647c71..e2e7d4242 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -2,12 +2,12 @@ void RenderAoTexture(v2i ApplicationResolution, ao_render_group *AoGroup) { - GL.BindFramebuffer(GL_FRAMEBUFFER, AoGroup->FBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, AoGroup->FBO.ID); SetViewport(ApplicationResolution/2); - GL.UseProgram(AoGroup->Shader.ID); + GetStdlib()->GL.UseProgram(AoGroup->Shader.ID); - GL.Uniform3fv(AoGroup->SsaoKernelUniform, SSAO_KERNEL_SIZE, (r32*)AoGroup->SsaoKernel); + GetStdlib()->GL.Uniform3fv(AoGroup->SsaoKernelUniform, SSAO_KERNEL_SIZE, (r32*)AoGroup->SsaoKernel); BindShaderUniforms(&AoGroup->Shader); @@ -35,14 +35,14 @@ UpdateLightingTextures(game_lights *Lights) u32 Type = GL_TEXTURE_2D; - GL.BindTexture(Type, Lights->PositionTex.ID); - GL.TexImage2D( Type, 0, GL_RGB32F, + GetStdlib()->GL.BindTexture(Type, Lights->PositionTex.ID); + GetStdlib()->GL.TexImage2D( Type, 0, GL_RGB32F, Lights->PositionTex.Dim.x, Lights->PositionTex.Dim.y, 0, GL_RGB, GL_FLOAT, PosData); AssertNoGlErrors; - GL.BindTexture(Type, Lights->ColorTex.ID); - GL.TexImage2D( Type, 0, GL_RGB32F, + GetStdlib()->GL.BindTexture(Type, Lights->ColorTex.ID); + GetStdlib()->GL.TexImage2D( Type, 0, GL_RGB32F, Lights->ColorTex.Dim.x, Lights->ColorTex.Dim.y, 0, GL_RGB, GL_FLOAT, ColorData); AssertNoGlErrors; @@ -54,10 +54,10 @@ UpdateLightingTextures(game_lights *Lights) link_internal void Debug_DrawTextureToDebugQuad( shader *DebugShader ) { - GL.BindFramebuffer(GL_FRAMEBUFFER, 0); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, 0); SetViewport(V2(256)); - GL.UseProgram(DebugShader->ID); + GetStdlib()->GL.UseProgram(DebugShader->ID); BindShaderUniforms(DebugShader); RenderQuad(); @@ -90,14 +90,14 @@ RenderImmediateGeometryToShadowMap(world *World, graphics *Graphics, gpu_mapped_ shadow_render_group *SG = Graphics->SG; - GL.BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); SetViewport(GetShadowMapResolution(&GetEngineResources()->Settings)); UseShader(&SG->Shader); Draw(GpuMap->Buffer.At); - GL.BindFramebuffer(GL_FRAMEBUFFER, 0); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, 0); return; } @@ -109,18 +109,18 @@ RenderImmediateGeometryToGBuffer(v2i ApplicationResolution, gpu_mapped_element_b auto GBufferRenderGroup = Graphics->gBuffer; - GL.BindFramebuffer(GL_FRAMEBUFFER, GBufferRenderGroup->FBO.ID); - GL.UseProgram(GBufferRenderGroup->gBufferShader.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, GBufferRenderGroup->FBO.ID); + GetStdlib()->GL.UseProgram(GBufferRenderGroup->gBufferShader.ID); SetViewport(ApplicationResolution); BindShaderUniforms(&GBufferRenderGroup->gBufferShader); // TODO(Jesse): Hoist this check out of here - GL.Disable(GL_CULL_FACE); + GetStdlib()->GL.Disable(GL_CULL_FACE); Draw(GpuMap->Buffer.At); /* DrawGpuBufferImmediate(GpuMap->Handles); */ - GL.Enable(GL_CULL_FACE); + GetStdlib()->GL.Enable(GL_CULL_FACE); CleanupTextureBindings(&GBufferRenderGroup->gBufferShader); @@ -130,15 +130,15 @@ RenderImmediateGeometryToGBuffer(v2i ApplicationResolution, gpu_mapped_element_b link_internal void CompositeGameTexturesAndDisplay( platform *Plat, graphics *Graphics ) { - GL.BindFramebuffer(GL_FRAMEBUFFER, 0); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, 0); SetViewport(Plat->ScreenDim); - GL.Enable(GL_BLEND); - GL.BlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); + GetStdlib()->GL.Enable(GL_BLEND); + GetStdlib()->GL.BlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); UseShader(&Graphics->CompositeGroup.Shader); - GL.Disable(GL_BLEND); + GetStdlib()->GL.Disable(GL_BLEND); RenderQuad(); @@ -158,12 +158,12 @@ RenderLuminanceTexture(v2i ApplicationResolution, gpu_mapped_element_buffer *Gpu // TODO(Jesse): Explain this. Graphics->SG->Shader.ViewProjection = NdcToScreenSpace * Graphics->SG->Shader.ViewProjection; - /* GL.Enable(GL_BLEND); */ - /* GL.BlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); */ + /* GetStdlib()->GL.Enable(GL_BLEND); */ + /* GetStdlib()->GL.BlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); */ - GL.BindFramebuffer(GL_FRAMEBUFFER, Lighting->FBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Lighting->FBO.ID); -/* GL.Disable(GL_BLEND); */ +/* GetStdlib()->GL.Disable(GL_BLEND); */ { UseShader(&Lighting->Program); @@ -198,11 +198,11 @@ GaussianBlurTexture(gaussian_render_group *Group, texture *TexIn, framebuffer *D if (last_iteration) { - GL.BindFramebuffer(GL_FRAMEBUFFER, DestFBO->ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, DestFBO->ID); } else { - GL.BindFramebuffer(GL_FRAMEBUFFER, Group->FBOs[horizontal].ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Group->FBOs[horizontal].ID); } AssertNoGlErrors; @@ -218,7 +218,7 @@ GaussianBlurTexture(gaussian_render_group *Group, texture *TexIn, framebuffer *D Tex = &Group->Textures[!horizontal]; } - /* GL.BindTexture( GL_TEXTURE_2D, Tex->ID ); */ + /* GetStdlib()->GL.BindTexture( GL_TEXTURE_2D, Tex->ID ); */ BindUniformByName(&Group->Shader, "SrcImage", Tex, 0); AssertNoGlErrors; @@ -228,7 +228,7 @@ GaussianBlurTexture(gaussian_render_group *Group, texture *TexIn, framebuffer *D if (first_iteration) first_iteration = false; } - GL.BindFramebuffer(GL_FRAMEBUFFER, 0); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, 0); } link_internal gpu_mapped_element_buffer * @@ -329,20 +329,20 @@ ClearFramebuffers(graphics *Graphics, render_entity_to_texture_group *RTTGroup) { TIMED_FUNCTION(); - GL.ClearColor(Graphics->SkyColor.r, Graphics->SkyColor.g, Graphics->SkyColor.b, 1.f); - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->gBuffer->FBO.ID); - GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetStdlib()->GL.ClearColor(Graphics->SkyColor.r, Graphics->SkyColor.g, Graphics->SkyColor.b, 1.f); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->gBuffer->FBO.ID); + GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); SetDefaultFramebufferClearColors(); - /* GL.BindFramebuffer(GL_FRAMEBUFFER, RTTGroup->FBO.ID); */ - /* GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); */ + /* GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RTTGroup->FBO.ID); */ + /* GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); */ - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->SG->FramebufferName); - GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->SG->FramebufferName); + GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->Lighting.FBO.ID); - GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->Lighting.FBO.ID); + GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // TODO(Jesse): Why exactly would this not be necessary? /* glBindFramebuffer(GL_FRAMEBUFFER, Graphics->SG->FramebufferName); */ @@ -350,32 +350,32 @@ ClearFramebuffers(graphics *Graphics, render_entity_to_texture_group *RTTGroup) for (s32 Index = 0; Index < 2; ++Index) { - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->Gaussian.FBOs[Index].ID); - GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->Gaussian.FBOs[Index].ID); + GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } - GL.BindFramebuffer(GL_FRAMEBUFFER, 0); - GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, 0); + GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (Graphics->Settings.BravoilMcGuireOIT) { - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->Transparency.FBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->Transparency.FBO.ID); #if 1 - GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); #else { u32 Attachments = GL_COLOR_ATTACHMENT0; - GL.DrawBuffers(1, &Attachments); - GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetStdlib()->GL.DrawBuffers(1, &Attachments); + GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } { u32 Attachments = GL_COLOR_ATTACHMENT0 + 1; - GL.DrawBuffers(1, &Attachments); - GL.ClearColor(1.f, 1.f, 1.f, 1.f); - GL.Clear(GL_COLOR_BUFFER_BIT); + GetStdlib()->GL.DrawBuffers(1, &Attachments); + GetStdlib()->GL.ClearColor(1.f, 1.f, 1.f, 1.f); + GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT); } { @@ -386,8 +386,8 @@ ClearFramebuffers(graphics *Graphics, render_entity_to_texture_group *RTTGroup) } else { - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->Transparency.FBO.ID); - GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->Transparency.FBO.ID); + GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } @@ -749,47 +749,47 @@ RenderTransparencyBuffers(v2i ApplicationResolution, render_settings *Settings, if (Group->GpuBuffer.Buffer.At) { - GL.BindFramebuffer(GL_FRAMEBUFFER, Group->FBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Group->FBO.ID); UseShader(&Group->Shader); if (Settings->BravoilMcGuireOIT) { SetViewport(ApplicationResolution); - GL.Disable(GL_CULL_FACE); + GetStdlib()->GL.Disable(GL_CULL_FACE); - GL.Enable(GL_BLEND); - /* GL.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); */ + GetStdlib()->GL.Enable(GL_BLEND); + /* GetStdlib()->GL.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); */ // TODO(Jesse): The portable version requires changing the shader a bit - /* GL.BlendFuncSeparate(GL_ONE, GL_ONE, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); */ + /* GetStdlib()->GL.BlendFuncSeparate(GL_ONE, GL_ONE, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); */ - GL.BlendFunci(0, GL_ONE, GL_ONE); - GL.BlendFunci(1, GL_ONE, GL_ONE); - /* GL.BlendFunci(1, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); */ - /* GL.BlendFunci(1, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); */ + GetStdlib()->GL.BlendFunci(0, GL_ONE, GL_ONE); + GetStdlib()->GL.BlendFunci(1, GL_ONE, GL_ONE); + /* GetStdlib()->GL.BlendFunci(1, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); */ + /* GetStdlib()->GL.BlendFunci(1, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); */ Draw(Group->GpuBuffer.Buffer.At); - GL.Disable(GL_BLEND); + GetStdlib()->GL.Disable(GL_BLEND); - GL.Enable(GL_CULL_FACE); + GetStdlib()->GL.Enable(GL_CULL_FACE); } else { - GL.Enable(GL_BLEND); - GL.BlendFunc(GL_ONE, GL_ONE); - GL.Disable(GL_CULL_FACE); - /* GL.DepthFunc(GL_LEQUAL); */ - /* GL.DepthFunc(GL_ALWAYS); */ + GetStdlib()->GL.Enable(GL_BLEND); + GetStdlib()->GL.BlendFunc(GL_ONE, GL_ONE); + GetStdlib()->GL.Disable(GL_CULL_FACE); + /* GetStdlib()->GL.DepthFunc(GL_LEQUAL); */ + /* GetStdlib()->GL.DepthFunc(GL_ALWAYS); */ SetViewport(ApplicationResolution); Draw(Group->GpuBuffer.Buffer.At); - GL.Disable(GL_BLEND); - GL.Enable(GL_CULL_FACE); - /* GL.DepthFunc(GL_LEQUAL); */ + GetStdlib()->GL.Disable(GL_BLEND); + GetStdlib()->GL.Enable(GL_CULL_FACE); + /* GetStdlib()->GL.DepthFunc(GL_LEQUAL); */ } Group->GpuBuffer.Buffer.At = 0; @@ -806,8 +806,8 @@ SetupRenderToTextureShader(engine_resources *Engine, texture *Texture, camera *C // GL stuff { - GL.BindFramebuffer(GL_FRAMEBUFFER, RTTGroup->FBO.ID); - GL.BindTexture(GL_TEXTURE_2D, Texture->ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RTTGroup->FBO.ID); + GetStdlib()->GL.BindTexture(GL_TEXTURE_2D, Texture->ID); RTTGroup->FBO.Attachments = 0; FramebufferTexture(&RTTGroup->FBO, Texture); @@ -822,8 +822,8 @@ SetupRenderToTextureShader(engine_resources *Engine, texture *Texture, camera *C SetViewport(V2(Texture->Dim)); - GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - GL.Enable(GL_DEPTH_TEST); + GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetStdlib()->GL.Enable(GL_DEPTH_TEST); } } return Result; @@ -834,18 +834,18 @@ SetupVertexAttribsFor_world_chunk_element_buffer(gpu_element_buffer_handles *Han { AssertNoGlErrors; - GL.EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); - GL.EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); - GL.EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); - GL.EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); + GetStdlib()->GL.EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); + GetStdlib()->GL.EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); + GetStdlib()->GL.EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); + GetStdlib()->GL.EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GL.VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, GL_FALSE, 0, (void*)0); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetStdlib()->GL.VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, GL_FALSE, 0, (void*)0); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetStdlib()->GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); AssertNoGlErrors; @@ -854,10 +854,10 @@ SetupVertexAttribsFor_world_chunk_element_buffer(gpu_element_buffer_handles *Han const u32 MtlFloatElements = sizeof(matl)/sizeof(u8); CAssert(MtlFloatElements == 4); - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); - /* GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_UNSIGNED_INT, 0, 0); */ - GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf(ColorIndex, matl))); - GL.VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + /* GetStdlib()->GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_UNSIGNED_INT, 0, 0); */ + GetStdlib()->GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf(ColorIndex, matl))); + GetStdlib()->GL.VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof AssertNoGlErrors; } @@ -865,10 +865,10 @@ link_internal void SetupVertexAttribsFor_u3d_geo_element_buffer(gpu_element_buffer_handles *Handles) { AssertNoGlErrors; - GL.EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); - GL.EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); - GL.EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); - GL.EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); + GetStdlib()->GL.EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); + GetStdlib()->GL.EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); + GetStdlib()->GL.EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); + GetStdlib()->GL.EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); AssertNoGlErrors; @@ -877,23 +877,23 @@ SetupVertexAttribsFor_u3d_geo_element_buffer(gpu_element_buffer_handles *Handles InvalidCase(DataType_Undefinded); case DataType_v3: { - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GL.VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetStdlib()->GL.VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetStdlib()->GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); AssertNoGlErrors; } break; case DataType_v3_u8: { - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GL.VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, GL_FALSE, 0, (void*)0); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetStdlib()->GL.VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, GL_FALSE, 0, (void*)0); AssertNoGlErrors; - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetStdlib()->GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); AssertNoGlErrors; } break; } @@ -904,10 +904,10 @@ SetupVertexAttribsFor_u3d_geo_element_buffer(gpu_element_buffer_handles *Handles const u32 MtlFloatElements = sizeof(matl)/sizeof(u8); CAssert(MtlFloatElements == 4); - GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); - /* GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_UNSIGNED_INT, 0, 0); */ - GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf(ColorIndex, matl))); - GL.VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + /* GetStdlib()->GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_UNSIGNED_INT, 0, 0); */ + GetStdlib()->GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf(ColorIndex, matl))); + GetStdlib()->GL.VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof AssertNoGlErrors; } @@ -921,12 +921,12 @@ DrawGpuBufferImmediate(gpu_element_buffer_handles *Handles) Draw(Handles->ElementCount); - GL.BindBuffer(GL_ARRAY_BUFFER, 0); + GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, 0); - GL.DisableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); - GL.DisableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); - GL.DisableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); - GL.DisableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); + GetStdlib()->GL.DisableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); + GetStdlib()->GL.DisableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); + GetStdlib()->GL.DisableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); + GetStdlib()->GL.DisableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); } poof( @@ -1036,7 +1036,7 @@ ReallocateGpuBuffers(gpu_element_buffer_handles *Handles, data_type Type, u32 El { if (Handles->VertexHandle) { - GL.DeleteBuffers(3, &Handles->VertexHandle); + GetStdlib()->GL.DeleteBuffers(3, &Handles->VertexHandle); } Clear(Handles); @@ -1262,7 +1262,7 @@ RenderToTexture(engine_resources *Engine, asset_thumbnail *Thumb, untextured_3d_ FlushBuffersToCard(&RTTGroup->GeoBuffer); } - GL.Enable(GL_DEPTH_TEST); + GetStdlib()->GL.Enable(GL_DEPTH_TEST); Draw(RTTGroup->GeoBuffer.Buffer.At); RTTGroup->GeoBuffer.Buffer.At = 0; } @@ -1356,14 +1356,14 @@ SetupGBufferShader(graphics *Graphics, v2i ApplicationResolution, b32 DoSelectio Graphics->MaxClipP_worldspace = {}; } - GL.BindFramebuffer(GL_FRAMEBUFFER, GBufferRenderGroup->FBO.ID); - GL.UseProgram(GBufferRenderGroup->gBufferShader.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, GBufferRenderGroup->FBO.ID); + GetStdlib()->GL.UseProgram(GBufferRenderGroup->gBufferShader.ID); SetViewport(ApplicationResolution); BindShaderUniforms(&GBufferRenderGroup->gBufferShader); - GL.Disable(GL_CULL_FACE); + GetStdlib()->GL.Disable(GL_CULL_FACE); AssertNoGlErrors; } @@ -1373,7 +1373,7 @@ TeardownGBufferShader(graphics *Graphics) { auto GBufferRenderGroup = Graphics->gBuffer; CleanupTextureBindings(&GBufferRenderGroup->gBufferShader); - GL.Enable(GL_CULL_FACE); + GetStdlib()->GL.Enable(GL_CULL_FACE); } @@ -1398,13 +1398,13 @@ SetupShadowMapShader(world *World, graphics *Graphics, v2i ShadowMapResolution, Graphics->MaxClipP_worldspace = {}; } - GL.BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); SetViewport(ShadowMapResolution); UseShader(&SG->Shader); - GL.Disable(GL_CULL_FACE); + GetStdlib()->GL.Disable(GL_CULL_FACE); AssertNoGlErrors; } @@ -1412,7 +1412,7 @@ SetupShadowMapShader(world *World, graphics *Graphics, v2i ShadowMapResolution, link_internal void TeardownShadowMapShader(graphics *Graphics) { - GL.Enable(GL_CULL_FACE); + GetStdlib()->GL.Enable(GL_CULL_FACE); AssertNoGlErrors; } diff --git a/src/engine/render/gpu_timer.c b/src/engine/render/gpu_timer.c index d9d4f914b..aa4c78355 100644 --- a/src/engine/render/gpu_timer.c +++ b/src/engine/render/gpu_timer.c @@ -17,17 +17,17 @@ StartGpuTimer(void) Global_ActiveGPUTimer = True; gpu_timer Result = {}; - GL.GenQueries(1, &Result.Handle); + GetStdlib()->GL.GenQueries(1, &Result.Handle); Assert(Result.Handle != INVALID_GPU_TIMER_HANDLE); - GL.BeginQuery(GL_TIME_ELAPSED, Result.Handle); + GetStdlib()->GL.BeginQuery(GL_TIME_ELAPSED, Result.Handle); return Result; } link_internal void EndGpuTimer(gpu_timer *Timer) { - GL.EndQuery(GL_TIME_ELAPSED); + GetStdlib()->GL.EndQuery(GL_TIME_ELAPSED); Assert(Global_ActiveGPUTimer == True); Global_ActiveGPUTimer = False; } @@ -37,12 +37,12 @@ QueryTimer(gpu_timer *Timer) { Assert(Timer->Handle != INVALID_GPU_TIMER_HANDLE); s32 Available = False; - GL.GetQueryObjectiv(Timer->Handle, GL_QUERY_RESULT_AVAILABLE, &Available); + GetStdlib()->GL.GetQueryObjectiv(Timer->Handle, GL_QUERY_RESULT_AVAILABLE, &Available); if (Available) { - GL.GetQueryObjectui64v(Timer->Handle, GL_QUERY_RESULT, &Timer->Ns); - GL.DeleteQueries(1, &Timer->Handle); + GetStdlib()->GL.GetQueryObjectui64v(Timer->Handle, GL_QUERY_RESULT, &Timer->Ns); + GetStdlib()->GL.DeleteQueries(1, &Timer->Handle); Timer->Handle = INVALID_GPU_TIMER_HANDLE; } diff --git a/src/engine/render/gpu_timer.h b/src/engine/render/gpu_timer.h index 1c13cdda4..21e32dbaa 100644 --- a/src/engine/render/gpu_timer.h +++ b/src/engine/render/gpu_timer.h @@ -18,17 +18,17 @@ StartGpuTimer(void) Global_ActiveGPUTimer = True; gpu_timer Result = {}; - GL.GenQueries(1, &Result.Handle); + GetStdlib()->GL.GenQueries(1, &Result.Handle); Assert(Result.Handle != INVALID_GPU_TIMER_HANDLE); - GL.BeginQuery(GL_TIME_ELAPSED, Result.Handle); + GetStdlib()->GL.BeginQuery(GL_TIME_ELAPSED, Result.Handle); return Result; } link_internal void EndGpuTimer(gpu_timer *Timer) { - GL.EndQuery(GL_TIME_ELAPSED); + GetStdlib()->GL.EndQuery(GL_TIME_ELAPSED); Assert(Global_ActiveGPUTimer == True); Global_ActiveGPUTimer = False; } @@ -38,12 +38,12 @@ QueryGpuTimer(gpu_timer *Timer) { Assert(Timer->Handle != INVALID_GPU_TIMER_HANDLE); s32 Available = False; - GL.GetQueryObjectiv(Timer->Handle, GL_QUERY_RESULT_AVAILABLE, &Available); + GetStdlib()->GL.GetQueryObjectiv(Timer->Handle, GL_QUERY_RESULT_AVAILABLE, &Available); if (Available) { - GL.GetQueryObjectui64v(Timer->Handle, GL_QUERY_RESULT, &Timer->Ns); - GL.DeleteQueries(1, &Timer->Handle); + GetStdlib()->GL.GetQueryObjectui64v(Timer->Handle, GL_QUERY_RESULT, &Timer->Ns); + GetStdlib()->GL.DeleteQueries(1, &Timer->Handle); Timer->Handle = INVALID_GPU_TIMER_HANDLE; } diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index a98e75c09..67ad1e800 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -8,7 +8,7 @@ SetDrawBuffers(framebuffer *FBO) Attachments[AttIndex] = GL_COLOR_ATTACHMENT0 + AttIndex; } - GL.DrawBuffers((s32)FBO->Attachments, Attachments); + GetStdlib()->GL.DrawBuffers((s32)FBO->Attachments, Attachments); } void @@ -214,7 +214,7 @@ framebuffer GenFramebuffer() { framebuffer Framebuffer = {}; - GL.GenFramebuffers(1, &Framebuffer.ID); + GetStdlib()->GL.GenFramebuffers(1, &Framebuffer.ID); return Framebuffer; } @@ -247,14 +247,14 @@ MakeGaussianBlurRenderGroup(v2 *ApplicationResolution, memory_arena *GraphicsMem // TODO(Jesse)(make_texture_rgba): Can we use MakeTexture_RGBA for (s32 Index = 0; Index < 2; ++Index) { - GL.BindFramebuffer(GL_FRAMEBUFFER, Result.FBOs[Index].ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Result.FBOs[Index].ID); AssertNoGlErrors; u32 Channels = 4; u32 Slices = 1; texture_storage_format StorageFormat = TextureStorageFormat_RGBA32F; Result.Textures[Index] = GenTexture(V2i(*ApplicationResolution), CSz("GaussianBlur"), StorageFormat, Channels, Slices); - GL.TexImage2D( GL_TEXTURE_2D, 0, GL_RGBA32F, s32(ApplicationResolution->x), s32(ApplicationResolution->y), 0, GL_RGBA, GL_FLOAT, 0); + GetStdlib()->GL.TexImage2D( GL_TEXTURE_2D, 0, GL_RGBA32F, s32(ApplicationResolution->x), s32(ApplicationResolution->y), 0, GL_RGBA, GL_FLOAT, 0); AssertNoGlErrors; @@ -354,7 +354,7 @@ MakeSsaoShader( memory_arena *GraphicsMemory, link_internal bool InitAoRenderGroup(v2i ApplicationResolution, ao_render_group *AoGroup) { - GL.BindFramebuffer(GL_FRAMEBUFFER, AoGroup->FBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, AoGroup->FBO.ID); b32 IsDepthTexture = False; AoGroup->Texture = MakeTexture_SingleChannel( ApplicationResolution/2, CSz("AoTexture"), IsDepthTexture, TextureStorageFormat_R16F); @@ -374,9 +374,9 @@ InitAoRenderGroup(v2i ApplicationResolution, ao_render_group *AoGroup) bool InitGbufferRenderGroup(v2i ApplicationResolution, g_buffer_render_group *gBuffer) { - GL.GenQueries(1, &gBuffer->GlTimerObject); + GetStdlib()->GL.GenQueries(1, &gBuffer->GlTimerObject); - GL.BindFramebuffer(GL_FRAMEBUFFER, gBuffer->FBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, gBuffer->FBO.ID); gBuffer->Textures.Color = MakeTexture_RGBA(ApplicationResolution, (v4*)0, CSz("gBufferColor"), 1, TextureStorageFormat_RGBA16F); gBuffer->Textures.Normal = MakeTexture_RGB( ApplicationResolution, (v3*)0, CSz("gBufferNormal"), 1, TextureStorageFormat_RGBA16F); @@ -403,7 +403,7 @@ InitRenderToTextureGroup(render_entity_to_texture_group *Group, texture *ColorPa AllocateGpuElementBuffer(&Group->GeoBuffer, DataType_v3, (u32)Megabytes(1)); Group->FBO = GenFramebuffer(); - GL.BindFramebuffer(GL_FRAMEBUFFER, Group->FBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Group->FBO.ID); // TODO(Jesse): Should we not hard-code the depth texture size here? texture DepthTexture = MakeDepthTexture( V2i(1024), CSz("RenderToTexture Depth")); @@ -445,7 +445,7 @@ InitTransparencyRenderGroup(render_settings *Settings, transparency_render_group AllocateGpuElementBuffer(&Group->GpuBuffer, DataType_v3, (u32)Megabytes(1)); Group->FBO = GenFramebuffer(); - GL.BindFramebuffer(GL_FRAMEBUFFER, Group->FBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Group->FBO.ID); // TODO(Jesse)(make_texture_rgba) : ? { @@ -453,7 +453,7 @@ InitTransparencyRenderGroup(render_settings *Settings, transparency_render_group u32 Slices = 1; texture_storage_format StorageFormat = TextureStorageFormat_RGBA16F; Group->AccumTex = GenTexture(TextureSize, CSz("Transparency Accum"), StorageFormat, Channels, Slices); - GL.TexImage2D( GL_TEXTURE_2D, 0, StorageFormat, TextureSize.x, TextureSize.y, 0, GL_RGBA, GL_FLOAT, 0); + GetStdlib()->GL.TexImage2D( GL_TEXTURE_2D, 0, StorageFormat, TextureSize.x, TextureSize.y, 0, GL_RGBA, GL_FLOAT, 0); } { @@ -461,7 +461,7 @@ InitTransparencyRenderGroup(render_settings *Settings, transparency_render_group u32 Slices = 1; texture_storage_format StorageFormat = TextureStorageFormat_RG16F; Group->RevealTex = GenTexture(TextureSize, CSz("Transparency Reveal"), StorageFormat, Channels, Slices); - GL.TexImage2D( GL_TEXTURE_2D, 0, StorageFormat, TextureSize.x, TextureSize.y, 0, GL_RG, GL_FLOAT, 0); + GetStdlib()->GL.TexImage2D( GL_TEXTURE_2D, 0, StorageFormat, TextureSize.x, TextureSize.y, 0, GL_RG, GL_FLOAT, 0); } // NOTE(Jesse): These have to be bound in this order because they're cleared @@ -646,7 +646,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Lighting->FBO = GenFramebuffer(); - GL.BindFramebuffer(GL_FRAMEBUFFER, Lighting->FBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Lighting->FBO.ID); FramebufferTexture(&Lighting->FBO, &Lighting->LuminanceTex); /* FramebufferTexture(&Lighting->FBO, &Lighting->Bloom.Tex); */ SetDrawBuffers(&Lighting->FBO); @@ -725,7 +725,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr RangeIterator(Index, 3) { WorldEditRC->PingPongFBOs[Index] = GenFramebuffer(); - GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[Index].ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[Index].ID); WorldEditRC->PingPongTextures[Index] = MakeTexture_RGBA(TextureDim, Cast(v4*, 0), CSz("PingPongTexture"), 1, TextureStorageFormat_RGBA32F); @@ -747,7 +747,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr RC->DestFBO = GenFramebuffer(); RC->DestTex = MakeTexture_RGBA(V2i(68, 68*68), Cast(v4*, 0), CSz("TerrainShaping"), 1, TextureStorageFormat_RGBA32F); - GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); FramebufferTexture(&RC->DestFBO, &RC->DestTex); SetDrawBuffers(&RC->DestFBO); @@ -766,7 +766,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr RC->DestFBO = GenFramebuffer(); RC->DestTex = MakeTexture_RGB(TextureDim, Cast(v3*, 0), CSz("TerrainDerivs"), 1, TextureStorageFormat_RGB32F); - GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); FramebufferTexture(&RC->DestFBO, &RC->DestTex); SetDrawBuffers(&RC->DestFBO); @@ -785,7 +785,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr TerrainDecorationRC->DestFBO = &WorldEditRC->PingPongFBOs[0]; TerrainDecorationRC->DestTex = &WorldEditRC->PingPongTextures[0]; - GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->DestFBO->ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->DestFBO->ID); FramebufferTexture(TerrainDecorationRC->DestFBO, TerrainDecorationRC->DestTex); SetDrawBuffers(TerrainDecorationRC->DestFBO); @@ -802,16 +802,16 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr { terrain_finalize_render_context *TerrainFinalizeRC = &Result->TerrainFinalizeRC; Result->TerrainFinalizeRC.FBO = GenFramebuffer(); - GL.BindFramebuffer(GL_FRAMEBUFFER, Result->TerrainFinalizeRC.FBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Result->TerrainFinalizeRC.FBO.ID); { u32 Channels = 1; u32 Slices = 1; // @shared_terrain_texture TerrainFinalizeRC->DestTex = GenTexture(TextureDim, CSz("TerrainFinalizeTexture"), TextureStorageFormat_R16I, Channels, Slices, False); - GL.TexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, TextureDim.x, TextureDim.y, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); + GetStdlib()->GL.TexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, TextureDim.x, TextureDim.y, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); AssertNoGlErrors; - GL.BindTexture(GL_TEXTURE_2D, 0); + GetStdlib()->GL.BindTexture(GL_TEXTURE_2D, 0); } FramebufferTexture(&Result->TerrainFinalizeRC.FBO, &TerrainFinalizeRC->DestTex); SetDrawBuffers(&Result->TerrainFinalizeRC.FBO); @@ -822,8 +822,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Ensure(CheckAndClearFramebuffer()); } - GL.Enable(GL_CULL_FACE); - GL.CullFace(GL_BACK); + GetStdlib()->GL.Enable(GL_CULL_FACE); + GetStdlib()->GL.CullFace(GL_BACK); AssertNoGlErrors; diff --git a/src/engine/render/shadow_map.h b/src/engine/render/shadow_map.h index 4337d2102..8fcfeed72 100644 --- a/src/engine/render/shadow_map.h +++ b/src/engine/render/shadow_map.h @@ -31,9 +31,9 @@ link_internal b32 InitializeShadowRenderGroup(graphics *Graphics, shadow_render_group *SG, v2i ShadowMapResolution) { // The framebuffer, which regroups 0, 1, or more textures, and 0 or 1 depth buffer. - GL.GenFramebuffers(1, &SG->FramebufferName); + GetStdlib()->GL.GenFramebuffers(1, &SG->FramebufferName); Assert(SG->FramebufferName); - GL.BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); SG->ShadowMap = MakeDepthTexture(ShadowMapResolution, CSz("ShadowDepth")); @@ -49,11 +49,12 @@ InitializeShadowRenderGroup(graphics *Graphics, shadow_render_group *SG, v2i Sha AssertNoGlErrors; - if(GL.CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + + if( GetStdlib()->GL.CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) return false; - GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - GL.BindFramebuffer(GL_FRAMEBUFFER, 0); + GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, 0); InitializeShadowMapShader( &SG->Shader , IdentityMatrix, IdentityMatrix, &Graphics->MinClipP_worldspace, &Graphics->MaxClipP_worldspace ); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 7734284ee..50aac5c69 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -1,947 +1,924 @@ -link_internal void -RenderLoop(thread_startup_params *ThreadParams, engine_resources *Engine) +link_export void +DrainRenderQueue(engine_resources *Engine) { - // Map immediate GPU buffers for first frame - MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.GpuBuffers[0]); - MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.Transparency.GpuBuffer); - - auto LowPriorityQ = &Engine->Stdlib.Plat.LowPriority; + UNPACK_ENGINE_RESOURCES(Engine); -#if 0 - static v3 xAxis = V3(0,0,0); - static v3 yAxis = V3(0,0,0); - static v3 zAxis = V3(0,0,0); - - static rect3 SimEditRect = {}; - static v3 EditRectRad = {}; - - static v3 PlaneNormal = {}; -#endif + AssertNoGlErrors; - while ( FutexNotSignaled(ThreadParams->WorkerThreadsExitFutex) ) + while (work_queue_entry *Job = PopWorkQueueEntry(RenderQ)) { - UNPACK_ENGINE_RESOURCES(Engine); - - WORKER_THREAD_ADVANCE_DEBUG_SYSTEM(); - WorkerThread_BeforeJobStart(ThreadParams); - - AssertNoGlErrors; - - while (work_queue_entry *Job = PopWorkQueueEntry(RenderQ)) + /* TIMED_NAMED_BLOCK(RENDER_LOOP); */ + tswitch(Job) { - /* TIMED_NAMED_BLOCK(RENDER_LOOP); */ - tswitch(Job) + case type_work_queue_entry_noop: + case type_work_queue_entry_init_world_chunk: + case type_work_queue_entry_copy_buffer_set: + case type_work_queue_entry_copy_buffer_ref: + case type_work_queue_entry_init_asset: + /* case type_work_queue_entry_update_world_region: */ + case type_work_queue_entry_rebuild_mesh: + case type_work_queue_entry_finalize_noise_values: + case type_work_queue_entry_build_chunk_mesh: + case type_work_queue_entry_sim_particle_system: + case type_work_queue_entry__align_to_cache_line_helper: { - case type_work_queue_entry_noop: - case type_work_queue_entry_init_world_chunk: - case type_work_queue_entry_copy_buffer_set: - case type_work_queue_entry_copy_buffer_ref: - case type_work_queue_entry_init_asset: - /* case type_work_queue_entry_update_world_region: */ - case type_work_queue_entry_rebuild_mesh: - case type_work_queue_entry_finalize_noise_values: - case type_work_queue_entry_build_chunk_mesh: - case type_work_queue_entry_sim_particle_system: - case type_work_queue_entry__align_to_cache_line_helper: - { - InvalidCodePath(); - } break; + InvalidCodePath(); + } break; - { tmatch(work_queue_entry_async_function_call, Job, RPC) - TIMED_NAMED_BLOCK(work_queue_entry_async_function_call); - DispatchAsyncFunctionCall(RPC); - } break; + { tmatch(work_queue_entry_async_function_call, Job, RPC) + TIMED_NAMED_BLOCK(work_queue_entry_async_function_call); + DispatchAsyncFunctionCall(RPC); + } break; - { tmatch(work_queue_entry__bonsai_render_command, Job, RenderCommand) - tswitch(RenderCommand) - { - InvalidCase(type_work_queue_entry__bonsai_render_command_noop); + { tmatch(work_queue_entry__bonsai_render_command, Job, RenderCommand) + tswitch(RenderCommand) + { + InvalidCase(type_work_queue_entry__bonsai_render_command_noop); - { case type_bonsai_render_command_cancel_all_noise_readback_jobs: - TIMED_NAMED_BLOCK(CancelReadbackJobs); + { case type_bonsai_render_command_cancel_all_noise_readback_jobs: + TIMED_NAMED_BLOCK(CancelReadbackJobs); - IterateOver(&Graphics->NoiseReadbackJobs, PBOJob, JobIndex) + IterateOver(&Graphics->NoiseReadbackJobs, PBOJob, JobIndex) + { + b32 Done = False; + while (!Done) { - b32 Done = False; - while (!Done) + u32 SyncStatus = GetStdlib()->GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); + switch(SyncStatus) { - u32 SyncStatus = GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); - switch(SyncStatus) + case GL_ALREADY_SIGNALED: + case GL_CONDITION_SATISFIED: { - case GL_ALREADY_SIGNALED: - case GL_CONDITION_SATISFIED: - { - AtomicDecrement(&Graphics->NoiseFinalizeJobsPending); - TIMED_NAMED_BLOCK(MapBuffer); - AssertNoGlErrors; - GL.DeleteBuffers(1, &PBOJob->PBOBuf.PBO); - GL.DeleteSync(PBOJob->PBOBuf.Fence); - AssertNoGlErrors; - /* RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); */ - Done = True; - } break; + AtomicDecrement(&Graphics->NoiseFinalizeJobsPending); + TIMED_NAMED_BLOCK(MapBuffer); + AssertNoGlErrors; + GetStdlib()->GL.DeleteBuffers(1, &PBOJob->PBOBuf.PBO); + GetStdlib()->GL.DeleteSync(PBOJob->PBOBuf.Fence); + AssertNoGlErrors; + /* RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); */ + Done = True; + } break; - case GL_WAIT_FAILED: - { - /* RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); */ - SoftError("Error waiting on gl sync object"); - } break; + case GL_WAIT_FAILED: + { + /* RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); */ + SoftError("Error waiting on gl sync object"); + } break; - case GL_TIMEOUT_EXPIRED: - { - SleepMs(1); - } break; - } + case GL_TIMEOUT_EXPIRED: + { + SleepMs(1); + } break; } - AssertNoGlErrors; } + AssertNoGlErrors; + } - // Clear the jobs - umm C = Count(&Graphics->NoiseReadbackJobs); - auto Z = ZerothIndex(&Graphics->NoiseReadbackJobs); - RangeIterator_t(umm, Index, C) { RemoveUnordered(&Graphics->NoiseReadbackJobs, Z); } - Assert(Count(&Graphics->NoiseReadbackJobs) == 0); - - /* Assert(Graphics->NoiseFinalizeJobsPending == 0); */ - } break; + // Clear the jobs + umm C = Count(&Graphics->NoiseReadbackJobs); + auto Z = ZerothIndex(&Graphics->NoiseReadbackJobs); + RangeIterator_t(umm, Index, C) { RemoveUnordered(&Graphics->NoiseReadbackJobs, Z); } + Assert(Count(&Graphics->NoiseReadbackJobs) == 0); - { tmatch(bonsai_render_command_allocate_and_map_gpu_element_buffer, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_allocate_and_map_gpu_element_buffer); + /* Assert(Graphics->NoiseFinalizeJobsPending == 0); */ + } break; - ReallocateGpuBuffers(&Command->Dest->Handles, Command->Type, Command->ElementCount); - MapGpuBuffer_untextured_3d_geometry_buffer(Command->Dest); + { tmatch(bonsai_render_command_allocate_and_map_gpu_element_buffer, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_allocate_and_map_gpu_element_buffer); - Assert(HasGpuMesh(Command->Dest) == 1); + ReallocateGpuBuffers(&Command->Dest->Handles, Command->Type, Command->ElementCount); + MapGpuBuffer_untextured_3d_geometry_buffer(Command->Dest); - auto Next = WorkQueueEntry(WorkQueueEntryBuildWorldChunkMesh(Command->SynChunk, Command->DestNode)); - PushWorkQueueEntry(LowPriorityQ, &Next); - } break; + Assert(HasGpuMesh(Command->Dest) == 1); - { tmatch(bonsai_render_command_unmap_gpu_element_buffer, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_unmap_gpu_element_buffer); - octree_node *Node = Command->DestNode; - gpu_mapped_element_buffer *Buf = &Command->Buf; + auto LowPriorityQ = &Engine->Stdlib.Plat.LowPriority; + auto Next = WorkQueueEntry(WorkQueueEntryBuildWorldChunkMesh(Command->SynChunk, Command->DestNode)); + PushWorkQueueEntry(LowPriorityQ, &Next); + } break; - FlushBuffersToCard(Buf); + { tmatch(bonsai_render_command_unmap_gpu_element_buffer, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_unmap_gpu_element_buffer); - if (HasGpuMesh(&Node->Chunk->Mesh)) - { - PushDeallocateBuffersCommand(RenderQ, &Node->Chunk->Mesh.Handles); - } + octree_node *Node = Command->DestNode; + gpu_mapped_element_buffer *Buf = &Command->Buf; - Node->Chunk->Mesh = *Buf; + FlushBuffersToCard(Buf); - FinalizeNodeInitializaion(Cast(octree_node*, Cast(void*, Command->DestNode))); + if (HasGpuMesh(&Node->Chunk->Mesh)) + { + PushDeallocateBuffersCommand(RenderQ, &Node->Chunk->Mesh.Handles); + } - } break; + Node->Chunk->Mesh = *Buf; - { tmatch(bonsai_render_command_unmap_and_deallocate_buffer, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_unmap_and_deallocate_buffer); + FinalizeNodeInitializaion(Cast(octree_node*, Cast(void*, Command->DestNode))); - gpu_readback_buffer PBOBuf = Command->PBOBuf; + } break; - /* Info("(%d) Binding and Deallocating PBO (%u)", ThreadLocal_ThreadIndex, PBOBuf.PBO); */ - GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOBuf.PBO); - AssertNoGlErrors; - GL.UnmapBuffer(GL_PIXEL_PACK_BUFFER); - AssertNoGlErrors; - GL.DeleteBuffers(1, &PBOBuf.PBO); - AssertNoGlErrors; - GL.DeleteSync(PBOBuf.Fence); - AssertNoGlErrors; + { tmatch(bonsai_render_command_unmap_and_deallocate_buffer, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_unmap_and_deallocate_buffer); - } break; + gpu_readback_buffer PBOBuf = Command->PBOBuf; - { tmatch(bonsai_render_command_allocate_texture, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_allocate_texture); + /* Info("(%d) Binding and Deallocating PBO (%u)", ThreadLocal_ThreadIndex, PBOBuf.PBO); */ + GetStdlib()->GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOBuf.PBO); + AssertNoGlErrors; + GetStdlib()->GL.UnmapBuffer(GL_PIXEL_PACK_BUFFER); + AssertNoGlErrors; + GetStdlib()->GL.DeleteBuffers(1, &PBOBuf.PBO); + AssertNoGlErrors; + GetStdlib()->GL.DeleteSync(PBOBuf.Fence); + AssertNoGlErrors; - texture *Texture = Command->Texture; - switch (Texture->Channels) - { - case 3: - { - *Texture = MakeTexture_RGB(Texture->Dim, (const v3*)Command->Data, Texture->DebugName, Texture->Slices, Texture->Format); - } break; + } break; - case 4: - { - *Texture = MakeTexture_RGBA(Texture->Dim, Cast(u32*, Command->Data), Texture->DebugName, Texture->Slices, Texture->Format); - } break; + { tmatch(bonsai_render_command_allocate_texture, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_allocate_texture); - InvalidDefaultCase; - } + texture *Texture = Command->Texture; + switch (Texture->Channels) + { + case 3: + { + *Texture = MakeTexture_RGB(Texture->Dim, (const v3*)Command->Data, Texture->DebugName, Texture->Slices, Texture->Format); + } break; - } break; + case 4: + { + *Texture = MakeTexture_RGBA(Texture->Dim, Cast(u32*, Command->Data), Texture->DebugName, Texture->Slices, Texture->Format); + } break; + InvalidDefaultCase; + } - { tmatch(bonsai_render_command_deallocate_texture, RenderCommand, Command) - NotImplemented; - } break; + } break; - { tmatch(bonsai_render_command_allocate_buffers, RenderCommand, Command) - NotImplemented; - } break; + { tmatch(bonsai_render_command_deallocate_texture, RenderCommand, Command) + NotImplemented; + } break; - { tmatch(bonsai_render_command_reallocate_buffers, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_reallocate_buffers); - auto *Handles = Command->Handles; - auto *Mesh = Command->Mesh; - ReallocateAndSyncGpuBuffers(Handles, Mesh); - DeallocateMesh(Mesh, &Engine->geo_u3d_MeshFreelist); - } break; + { tmatch(bonsai_render_command_allocate_buffers, RenderCommand, Command) + NotImplemented; + } break; + { tmatch(bonsai_render_command_reallocate_buffers, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_reallocate_buffers); + auto *Handles = Command->Handles; + auto *Mesh = Command->Mesh; - { tmatch(bonsai_render_command_deallocate_buffers, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_deallocate_buffers); - if (*Command->Buffers) { GL.DeleteBuffers(Command->Count, Command->Buffers); } - RangeIterator(Index, Command->Count) { Command->Buffers[Index] = 0; } - } break; + ReallocateAndSyncGpuBuffers(Handles, Mesh); + DeallocateMesh(Mesh, &Engine->geo_u3d_MeshFreelist); + } break; - { tmatch(bonsai_render_command_deallocate_world_chunk, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_deallocate_world_chunk); - world_chunk *Chunk = Command->Chunk; - FreeWorldChunk(Engine, Chunk); - } break; + { tmatch(bonsai_render_command_deallocate_buffers, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_deallocate_buffers); + if (*Command->Buffers) { GetStdlib()->GL.DeleteBuffers(Command->Count, Command->Buffers); } + RangeIterator(Index, Command->Count) { Command->Buffers[Index] = 0; } + } break; - { tmatch(bonsai_render_command_clear_all_framebuffers, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_clear_all_framebuffers); - ClearFramebuffers(Graphics, &Engine->RTTGroup); - } break; + { tmatch(bonsai_render_command_deallocate_world_chunk, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_deallocate_world_chunk); + world_chunk *Chunk = Command->Chunk; + FreeWorldChunk(Engine, Chunk); + } break; + { tmatch(bonsai_render_command_clear_all_framebuffers, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_clear_all_framebuffers); + ClearFramebuffers(Graphics, &Engine->RTTGroup); + } break; - { tmatch(bonsai_render_command_setup_shader, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_setup_shader); - switch (Command->ShaderId) - { - InvalidCase(BonsaiRenderCommand_ShaderId_noop); - case BonsaiRenderCommand_ShaderId_gBuffer: - { - SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), False); - } break; - case BonsaiRenderCommand_ShaderId_ShadowMap: - { - SetupShadowMapShader(World, Graphics, GetShadowMapResolution(&Engine->Settings), False); - } break; - } - } break; + { tmatch(bonsai_render_command_setup_shader, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_setup_shader); + switch (Command->ShaderId) + { + InvalidCase(BonsaiRenderCommand_ShaderId_noop); - { tmatch(bonsai_render_command_teardown_shader, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_teardown_shader); - switch (Command->ShaderId) + case BonsaiRenderCommand_ShaderId_gBuffer: { - InvalidCase(BonsaiRenderCommand_ShaderId_noop); + SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), False); + } break; - case BonsaiRenderCommand_ShaderId_gBuffer: - { - TeardownGBufferShader(Graphics); - } break; + case BonsaiRenderCommand_ShaderId_ShadowMap: + { + SetupShadowMapShader(World, Graphics, GetShadowMapResolution(&Engine->Settings), False); + } break; + } + } break; - case BonsaiRenderCommand_ShaderId_ShadowMap: - { - TeardownShadowMapShader(Graphics); - } break; - } - } break; + { tmatch(bonsai_render_command_teardown_shader, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_teardown_shader); + switch (Command->ShaderId) + { + InvalidCase(BonsaiRenderCommand_ShaderId_noop); - { tmatch(bonsai_render_command_set_shader_uniform, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_set_shader_uniform); - shader *Shader = Command->Shader; - shader_uniform *Uniform = &Command->Uniform; - if (Uniform->ID >= 0) + case BonsaiRenderCommand_ShaderId_gBuffer: { - BindUniformById(Uniform, &Command->TextureUnit); - } - else + TeardownGBufferShader(Graphics); + } break; + + case BonsaiRenderCommand_ShaderId_ShadowMap: { - BindUniformByName(Shader, Uniform, &Command->TextureUnit); - } - } break; + TeardownShadowMapShader(Graphics); + } break; + } + } break; - { tmatch(bonsai_render_command_draw_world_chunk_draw_list, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_draw_world_chunk_draw_list); - RenderDrawList(Engine, Command->DrawList, Command->Shader, Command->Camera); - } break; + { tmatch(bonsai_render_command_set_shader_uniform, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_set_shader_uniform); + shader *Shader = Command->Shader; + shader_uniform *Uniform = &Command->Uniform; + if (Uniform->ID >= 0) + { + BindUniformById(Uniform, &Command->TextureUnit); + } + else + { + BindUniformByName(Shader, Uniform, &Command->TextureUnit); + } + } break; - { tmatch(bonsai_render_command_draw_all_entities, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_draw_all_entities); - DrawEntities(Command->Shader, EntityTable, &GpuMap->Buffer, 0, Graphics, World, Plat->dt); - } break; + { tmatch(bonsai_render_command_draw_world_chunk_draw_list, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_draw_world_chunk_draw_list); + RenderDrawList(Engine, Command->DrawList, Command->Shader, Command->Camera); + } break; + { tmatch(bonsai_render_command_draw_all_entities, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_draw_all_entities); + DrawEntities(Command->Shader, EntityTable, &GpuMap->Buffer, 0, Graphics, World, Plat->dt); + } break; - { tmatch(bonsai_render_command_initialize_noise_buffer, RenderCommand, _Command) - TIMED_NAMED_BLOCK(bonsai_render_command_initialize_noise_buffer); - /* Command = 0; */ + { tmatch(bonsai_render_command_initialize_noise_buffer, RenderCommand, _Command) + TIMED_NAMED_BLOCK(bonsai_render_command_initialize_noise_buffer); + /* Command = 0; */ - AtomicIncrement(&Graphics->NoiseFinalizeJobsPending); - bonsai_render_command_initialize_noise_buffer C = RenderCommand->bonsai_render_command_initialize_noise_buffer; + AtomicIncrement(&Graphics->NoiseFinalizeJobsPending); - octree_node *Node = C.DestNode; - world_chunk **Chunk2 = &C.DestNode->Chunk; - world_chunk *Chunk1 = C.DestNode->Chunk; - world_chunk *Chunk = Chunk1; + bonsai_render_command_initialize_noise_buffer C = RenderCommand->bonsai_render_command_initialize_noise_buffer; - Assert(s64(Chunk) == s64(Chunk1)); + octree_node *Node = C.DestNode; + world_chunk **Chunk2 = &C.DestNode->Chunk; + world_chunk *Chunk1 = C.DestNode->Chunk; + world_chunk *Chunk = Chunk1; - DispatchTerrainShaders(Graphics, Chunk); + Assert(s64(Chunk) == s64(Chunk1)); - s32 CurrentAccumulationTextureIndex = 0; + DispatchTerrainShaders(Graphics, Chunk); - // - // Apply edits - // + s32 CurrentAccumulationTextureIndex = 0; + + // + // Apply edits + // - auto WorldEditRC = &Graphics->WorldEditRC; + auto WorldEditRC = &Graphics->WorldEditRC; + { + AcquireFutex(&Node->Lock); + if (TotalElements(&Node->Edits)) { - AcquireFutex(&Node->Lock); - if (TotalElements(&Node->Edits)) - { - AssertNoGlErrors; + AssertNoGlErrors; - UseShader(WorldEditRC); - AssertNoGlErrors; + UseShader(WorldEditRC); + AssertNoGlErrors; - // NOTE(Jesse): @duplicated_edit_ordinal_sort_code - // Was too lazy to make a templated overload for the sort - // function.. so here we are. Hopefully I don't pay for this - // in the future. - // { + // NOTE(Jesse): @duplicated_edit_ordinal_sort_code + // Was too lazy to make a templated overload for the sort + // function.. so here we are. Hopefully I don't pay for this + // in the future. + // { #if 1 - s32 EditCount = s32(TotalElements(&Node->Edits)); - sort_key *Keys = Allocate(sort_key, GetTranArena(), EditCount); + s32 EditCount = s32(TotalElements(&Node->Edits)); + sort_key *Keys = Allocate(sort_key, GetTranArena(), EditCount); - IterateOver(&Node->Edits, Edit, EditIndex) - { - u32 KeyIndex = u32(GetIndex(&EditIndex)); - Keys[KeyIndex] = {u64(Edit), u64(Edit->Ordinal)}; - } + IterateOver(&Node->Edits, Edit, EditIndex) + { + u32 KeyIndex = u32(GetIndex(&EditIndex)); + Keys[KeyIndex] = {u64(Edit), u64(Edit->Ordinal)}; + } - BubbleSort_descending(Keys, u32(EditCount)); + BubbleSort_descending(Keys, u32(EditCount)); #endif - // } + // } #define AdvanceIndex(i) i = ((i+1) % 3) #define Swap(a, b) do { auto tmp = b; b = a; a = tmp; } while (false) - RangeIterator(KeyIndex, EditCount) - /* IterateOver(&Node->Edits, Edit, EditIndex) */ + RangeIterator(KeyIndex, EditCount) + /* IterateOver(&Node->Edits, Edit, EditIndex) */ + { + TIMED_NAMED_BLOCK(WorldEditDrawCall); + + /* world_edit *Edit = GetPtr(&Editor->Edits, *Edit); */ + + world_edit *Edit = Cast(world_edit*, Keys[KeyIndex].Index); + if (Edit->Brush) // NOTE(Jesse): Don't necessarily have to have a brush if we created the edit before we created a brush. { - TIMED_NAMED_BLOCK(WorldEditDrawCall); + layered_brush *Brush = &Edit->Brush->Layered; - /* world_edit *Edit = GetPtr(&Editor->Edits, *Edit); */ - world_edit *Edit = Cast(world_edit*, Keys[KeyIndex].Index); - if (Edit->Brush) // NOTE(Jesse): Don't necessarily have to have a brush if we created the edit before we created a brush. - { - layered_brush *Brush = &Edit->Brush->Layered; + b32 BindInputTexture = Brush->AffectExisting; + s32 CurrentWriteTextureIndex = CurrentAccumulationTextureIndex; + s32 CurrentReadTextureIndex = CurrentAccumulationTextureIndex; - b32 BindInputTexture = Brush->AffectExisting; + AdvanceIndex(CurrentWriteTextureIndex); - s32 CurrentWriteTextureIndex = CurrentAccumulationTextureIndex; - s32 CurrentReadTextureIndex = CurrentAccumulationTextureIndex; + // If we're not trying to seed the brush with the current + // accumulator texture, set to the empty one + if (BindInputTexture == False) + { + AdvanceIndex(CurrentReadTextureIndex); + AdvanceIndex(CurrentReadTextureIndex); + } - AdvanceIndex(CurrentWriteTextureIndex); + RangeIterator(LayerIndex, Brush->LayerCount) + { + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[CurrentWriteTextureIndex].ID); - // If we're not trying to seed the brush with the current - // accumulator texture, set to the empty one - if (BindInputTexture == False) + BindUniformByName(&WorldEditRC->Program, "SampleInputTex", BindInputTexture); + if (BindInputTexture) { - AdvanceIndex(CurrentReadTextureIndex); - AdvanceIndex(CurrentReadTextureIndex); + texture *InputTex = &WorldEditRC->PingPongTextures[CurrentReadTextureIndex]; + // @derivs_texture_binding_to_shader_unit_0 + BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 1); } + BindInputTexture = True; - RangeIterator(LayerIndex, Brush->LayerCount) + b32 LastLayer = LayerIndex == Brush->LayerCount-1; + b32 BindBlendTex = (Brush->AffectExisting == False) && LastLayer; + BindUniformByName(&WorldEditRC->Program, "SampleBlendTex", BindBlendTex); + if (BindBlendTex) { - GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[CurrentWriteTextureIndex].ID); + texture *BlendTex = &WorldEditRC->PingPongTextures[CurrentAccumulationTextureIndex]; + BindUniformByName(&WorldEditRC->Program, "BlendTex", BlendTex, 2); + } - BindUniformByName(&WorldEditRC->Program, "SampleInputTex", BindInputTexture); - if (BindInputTexture) - { - texture *InputTex = &WorldEditRC->PingPongTextures[CurrentReadTextureIndex]; - // @derivs_texture_binding_to_shader_unit_0 - BindUniformByName(&WorldEditRC->Program, "InputTex", InputTex, 1); - } - BindInputTexture = True; - - b32 LastLayer = LayerIndex == Brush->LayerCount-1; - b32 BindBlendTex = (Brush->AffectExisting == False) && LastLayer; - BindUniformByName(&WorldEditRC->Program, "SampleBlendTex", BindBlendTex); - if (BindBlendTex) - { - texture *BlendTex = &WorldEditRC->PingPongTextures[CurrentAccumulationTextureIndex]; - BindUniformByName(&WorldEditRC->Program, "BlendTex", BlendTex, 2); - } + brush_layer *Layer = Brush->Layers + LayerIndex; + + { + v3 RGBColor = HSVtoRGB(Layer->Settings.HSVColor); + BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); + } - brush_layer *Layer = Brush->Layers + LayerIndex; + BindUniformByName(&WorldEditRC->Program, "ValueBias", Layer->Settings.ValueBias); + BindUniformByName(&WorldEditRC->Program, "BrushType", Layer->Settings.Type); + BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.BlendMode); + BindUniformByName(&WorldEditRC->Program, "ValueModifiers", Layer->Settings.ValueModifier); + BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); + BindUniformByName(&WorldEditRC->Program, "Invert", Layer->Settings.Invert); + BindUniformByName(&WorldEditRC->Program, "Threshold", Layer->Settings.Threshold); + BindUniformByName(&WorldEditRC->Program, "Power", Layer->Settings.Power); + + + rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); + v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); + v3 EditRectRad = GetRadius(&SimEditRect); + + // NOTE(Jesse): Must call bind explicitly because the + // driver doesn't cache these values otherwise .. it + // just reads them whenever it wants through the pointer.. + v3 ChunkRelEditMin = SimEditRect.Min - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &ChunkRelEditMin); + AssertNoGlErrors; + v3 ChunkRelEditMax = SimEditRect.Max - SimChunkMin; + BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &ChunkRelEditMax); + AssertNoGlErrors; + + v3 EditDim = ChunkRelEditMax - ChunkRelEditMin; + + switch (Layer->Settings.Type) + { + case BrushLayerType_Noise: { - v3 RGBColor = HSVtoRGB(Layer->Settings.HSVColor); - BindUniformByName(&WorldEditRC->Program, "RGBColor", &RGBColor); - } - - BindUniformByName(&WorldEditRC->Program, "ValueBias", Layer->Settings.ValueBias); - BindUniformByName(&WorldEditRC->Program, "BrushType", Layer->Settings.Type); - BindUniformByName(&WorldEditRC->Program, "BlendMode", Layer->Settings.BlendMode); - BindUniformByName(&WorldEditRC->Program, "ValueModifiers", Layer->Settings.ValueModifier); - BindUniformByName(&WorldEditRC->Program, "ColorMode", Layer->Settings.ColorMode); - BindUniformByName(&WorldEditRC->Program, "Invert", Layer->Settings.Invert); - BindUniformByName(&WorldEditRC->Program, "Threshold", Layer->Settings.Threshold); - BindUniformByName(&WorldEditRC->Program, "Power", Layer->Settings.Power); - - - rect3 SimEditRect = GetSimSpaceRect(World, Edit->Region); - v3 SimChunkMin = GetSimSpaceP(World, Chunk->WorldP); - v3 EditRectRad = GetRadius(&SimEditRect); - - // NOTE(Jesse): Must call bind explicitly because the - // driver doesn't cache these values otherwise .. it - // just reads them whenever it wants through the pointer.. - v3 ChunkRelEditMin = SimEditRect.Min - SimChunkMin; - BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMin", &ChunkRelEditMin); - AssertNoGlErrors; - - v3 ChunkRelEditMax = SimEditRect.Max - SimChunkMin; - BindUniformByName(&WorldEditRC->Program, "ChunkRelEditMax", &ChunkRelEditMax); - AssertNoGlErrors; - - v3 EditDim = ChunkRelEditMax - ChunkRelEditMin; - - switch (Layer->Settings.Type) - { - case BrushLayerType_Noise: + noise_layer *Noise = &Layer->Settings.Noise; + BindUniformByName(&WorldEditRC->Program, "NoiseType", Noise->Type); + + switch (Noise->Type) { - noise_layer *Noise = &Layer->Settings.Noise; - BindUniformByName(&WorldEditRC->Program, "NoiseType", Noise->Type); + case NoiseType_Perlin: + { + auto *Perlin = &Noise->Perlin; + BindUniformByName(&WorldEditRC->Program, "Period", &Perlin->Period); + } break; - switch (Noise->Type) + case NoiseType_Voronoi: { - case NoiseType_Perlin: - { - auto *Perlin = &Noise->Perlin; - BindUniformByName(&WorldEditRC->Program, "Period", &Perlin->Period); - } break; + auto *Voronoi = &Noise->Voronoi; + BindUniformByName(&WorldEditRC->Program, "Squareness", Voronoi->Squareness); + BindUniformByName(&WorldEditRC->Program, "Period", &Voronoi->Period); + } break; - case NoiseType_Voronoi: - { - auto *Voronoi = &Noise->Voronoi; - BindUniformByName(&WorldEditRC->Program, "Squareness", Voronoi->Squareness); - BindUniformByName(&WorldEditRC->Program, "Period", &Voronoi->Period); - } break; + case NoiseType_White: + {} break; + } - case NoiseType_White: - {} break; - } + } break; - } break; + case BrushLayerType_Shape: + { + shape_layer *Shape = &Layer->Settings.Shape; + BindUniformByName(&WorldEditRC->Program, "ShapeType", Shape->Type); + + BindUniformByName(&WorldEditRC->Program, "Rounding", Shape->Advanced.Rounding); + BindUniformByName(&WorldEditRC->Program, "Stretch", &Shape->Advanced.Stretch); + BindUniformByName(&WorldEditRC->Program, "Repeat", &Shape->Advanced.Repeat); - case BrushLayerType_Shape: + m4 Rot = RotateTransform(Shape->Advanced.Axis*PI32); + BindUniformByName(&WorldEditRC->Program, "RotTransform", &Rot); + + switch(Shape->Type) { - shape_layer *Shape = &Layer->Settings.Shape; - BindUniformByName(&WorldEditRC->Program, "ShapeType", Shape->Type); + case ShapeType_Rect: + { + auto Sphere = &Shape->Rect; + } break; - BindUniformByName(&WorldEditRC->Program, "Rounding", Shape->Advanced.Rounding); - BindUniformByName(&WorldEditRC->Program, "Stretch", &Shape->Advanced.Stretch); - BindUniformByName(&WorldEditRC->Program, "Repeat", &Shape->Advanced.Repeat); + case ShapeType_Sphere: + { + auto Sphere = &Shape->Sphere; + + v3 SimSphereOrigin = GetSimSpaceP(World, Edit->Region.Min + EditRectRad); + v3 EditRelativeSphereCenter = SimSphereOrigin - SimEditRect.Min; - m4 Rot = RotateTransform(Shape->Advanced.Axis*PI32); - BindUniformByName(&WorldEditRC->Program, "RotTransform", &Rot); + BindUniformByName(&WorldEditRC->Program, "EditRelativeSphereCenter", &EditRelativeSphereCenter); + BindUniformByName(&WorldEditRC->Program, "Radius", Sphere->Radius); + } break; - switch(Shape->Type) + case ShapeType_Line: { - case ShapeType_Rect: - { - auto Sphere = &Shape->Rect; - } break; + auto Line = &Shape->Line; + BindUniformByName(&WorldEditRC->Program, "Radius", Line->Radius); + } break; - case ShapeType_Sphere: - { - auto Sphere = &Shape->Sphere; + case ShapeType_Cylinder: + { + auto Cylinder = &Shape->Cylinder; + BindUniformByName(&WorldEditRC->Program, "Radius", Cylinder->Radius); + BindUniformByName(&WorldEditRC->Program, "Height", Cylinder->Height); + } break; - v3 SimSphereOrigin = GetSimSpaceP(World, Edit->Region.Min + EditRectRad); - v3 EditRelativeSphereCenter = SimSphereOrigin - SimEditRect.Min; + case ShapeType_Plane: + { + auto Plane = &Shape->Plane; + auto Orientation = Plane->Orientation; - BindUniformByName(&WorldEditRC->Program, "EditRelativeSphereCenter", &EditRelativeSphereCenter); - BindUniformByName(&WorldEditRC->Program, "Radius", Sphere->Radius); - } break; + v3 xAxis = V3(1,0,0); + v3 yAxis = V3(0,1,0); + v3 zAxis = V3(0,0,1); - case ShapeType_Line: + switch (Orientation) { - auto Line = &Shape->Line; - BindUniformByName(&WorldEditRC->Program, "Radius", Line->Radius); - } break; + InvalidCase(ShapeAxis_Count); - case ShapeType_Cylinder: - { - auto Cylinder = &Shape->Cylinder; - BindUniformByName(&WorldEditRC->Program, "Radius", Cylinder->Radius); - BindUniformByName(&WorldEditRC->Program, "Height", Cylinder->Height); - } break; + case ShapeAxis_InferFromMajorAxis: + {} break; - case ShapeType_Plane: - { - auto Plane = &Shape->Plane; - auto Orientation = Plane->Orientation; + // Traverses the X axis and ascends + case ShapeAxis_PosX: + { + xAxis = Normalize(V3(EditRectRad.x, 0.f, EditRectRad.z)); + yAxis = Normalize(V3(0.f, EditRectRad.y, 0.f)); + zAxis = Normalize(Cross(xAxis, yAxis)); + } break; + // Traverses the X axis and descends + case ShapeAxis_NegX: + { + xAxis = Normalize(V3(EditRectRad.x, 0.f, -EditRectRad.z)); + yAxis = Normalize(V3(0.f, EditRectRad.y, 0.f)); + zAxis = Normalize(Cross(xAxis, yAxis)); + } break; - v3 xAxis = V3(1,0,0); - v3 yAxis = V3(0,1,0); - v3 zAxis = V3(0,0,1); - switch (Orientation) + case ShapeAxis_PosY: { - InvalidCase(ShapeAxis_Count); - - case ShapeAxis_InferFromMajorAxis: - {} break; - - // Traverses the X axis and ascends - case ShapeAxis_PosX: - { - xAxis = Normalize(V3(EditRectRad.x, 0.f, EditRectRad.z)); - yAxis = Normalize(V3(0.f, EditRectRad.y, 0.f)); - zAxis = Normalize(Cross(xAxis, yAxis)); - } break; - // Traverses the X axis and descends - case ShapeAxis_NegX: - { - xAxis = Normalize(V3(EditRectRad.x, 0.f, -EditRectRad.z)); - yAxis = Normalize(V3(0.f, EditRectRad.y, 0.f)); - zAxis = Normalize(Cross(xAxis, yAxis)); - } break; - - - case ShapeAxis_PosY: - { - xAxis = Normalize(V3(0.f, EditRectRad.y, EditRectRad.z)); - yAxis = Normalize(V3(EditRectRad.x, 0.f, 0.f)); - zAxis = Normalize(Cross(xAxis, yAxis)); - } break; - case ShapeAxis_NegY: - { - xAxis = Normalize(V3(0.f, EditRectRad.y, -EditRectRad.z)); - yAxis = Normalize(V3(EditRectRad.x, 0.f, 0.f)); - zAxis = Normalize(Cross(xAxis, yAxis)); - } break; - - - case ShapeAxis_PosZ: - { - xAxis = Normalize(V3(0.f, 0.f, EditRectRad.z)); - yAxis = Normalize(V3(EditRectRad.x, EditRectRad.y, 0.f)); - zAxis = Normalize(Cross(xAxis, yAxis)); - } break; - - case ShapeAxis_NegZ: - { - xAxis = Normalize(V3(0.f, 0.f, EditRectRad.z)); - yAxis = Normalize(V3(-EditRectRad.x, EditRectRad.y, 0.f)); - zAxis = Normalize(Cross(xAxis, yAxis)); - } break; - } - - v3 Plane_SimShapeOrigin = EditRectRad; - v3 PlaneNormal = zAxis; - - auto PlaneRadius = Plane->Thickness/2.f; - auto Planed = -1.0f * ( PlaneNormal.x*Plane_SimShapeOrigin.x + - PlaneNormal.y*Plane_SimShapeOrigin.y + - PlaneNormal.z*Plane_SimShapeOrigin.z ); - - auto PlanePos = Plane_SimShapeOrigin; - - BindUniformByName(&WorldEditRC->Program, "PlaneNormal", &PlaneNormal); - BindUniformByName(&WorldEditRC->Program, "Planed", Planed); - BindUniformByName(&WorldEditRC->Program, "PlaneRadius", PlaneRadius); - - } break; - - case ShapeType_Torus: - { - auto Torus = &Shape->Torus; + xAxis = Normalize(V3(0.f, EditRectRad.y, EditRectRad.z)); + yAxis = Normalize(V3(EditRectRad.x, 0.f, 0.f)); + zAxis = Normalize(Cross(xAxis, yAxis)); + } break; + case ShapeAxis_NegY: + { + xAxis = Normalize(V3(0.f, EditRectRad.y, -EditRectRad.z)); + yAxis = Normalize(V3(EditRectRad.x, 0.f, 0.f)); + zAxis = Normalize(Cross(xAxis, yAxis)); + } break; + + + case ShapeAxis_PosZ: + { + xAxis = Normalize(V3(0.f, 0.f, EditRectRad.z)); + yAxis = Normalize(V3(EditRectRad.x, EditRectRad.y, 0.f)); + zAxis = Normalize(Cross(xAxis, yAxis)); + } break; + + case ShapeAxis_NegZ: + { + xAxis = Normalize(V3(0.f, 0.f, EditRectRad.z)); + yAxis = Normalize(V3(-EditRectRad.x, EditRectRad.y, 0.f)); + zAxis = Normalize(Cross(xAxis, yAxis)); + } break; + } + + v3 Plane_SimShapeOrigin = EditRectRad; + v3 PlaneNormal = zAxis; + + auto PlaneRadius = Plane->Thickness/2.f; + auto Planed = -1.0f * ( PlaneNormal.x*Plane_SimShapeOrigin.x + + PlaneNormal.y*Plane_SimShapeOrigin.y + + PlaneNormal.z*Plane_SimShapeOrigin.z ); - BindUniformByName(&WorldEditRC->Program, "Radius", Torus->MajorRadius); - BindUniformByName(&WorldEditRC->Program, "MinorRadius", Torus->MinorRadius); + auto PlanePos = Plane_SimShapeOrigin; - } break; + BindUniformByName(&WorldEditRC->Program, "PlaneNormal", &PlaneNormal); + BindUniformByName(&WorldEditRC->Program, "Planed", Planed); + BindUniformByName(&WorldEditRC->Program, "PlaneRadius", PlaneRadius); - // @sdf_shape_step(5): Calculate values and bind uniform variables for the new shape - // - } - } break; - } + } break; + case ShapeType_Torus: + { + auto Torus = &Shape->Torus; + + BindUniformByName(&WorldEditRC->Program, "Radius", Torus->MajorRadius); + BindUniformByName(&WorldEditRC->Program, "MinorRadius", Torus->MinorRadius); - /* gpu_timer Timer = StartGpuTimer(); */ - RenderQuad(); - /* EndGpuTimer(&Timer); */ - /* Push(&Graphics->GpuTimers, &Timer); */ + } break; - Swap(CurrentWriteTextureIndex, CurrentReadTextureIndex); + // @sdf_shape_step(5): Calculate values and bind uniform variables for the new shape + // + } + } break; } - CurrentAccumulationTextureIndex = CurrentReadTextureIndex; + + /* gpu_timer Timer = StartGpuTimer(); */ + RenderQuad(); + /* EndGpuTimer(&Timer); */ + /* Push(&Graphics->GpuTimers, &Timer); */ + + Swap(CurrentWriteTextureIndex, CurrentReadTextureIndex); } - AssertNoGlErrors; + CurrentAccumulationTextureIndex = CurrentReadTextureIndex; } + + AssertNoGlErrors; } - ReleaseFutex(&Node->Lock); } + ReleaseFutex(&Node->Lock); + } - /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, xAxis*200.f, RGB_RED, DEFAULT_LINE_THICKNESS*4.f ); */ - /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, yAxis*200.f, RGB_GREEN, DEFAULT_LINE_THICKNESS*4.f ); */ - /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, zAxis*200.f, RGB_BLUE, DEFAULT_LINE_THICKNESS*4.f ); */ - /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, PlaneNormal*400.f, RGB_PINK, DEFAULT_LINE_THICKNESS*2.f ); */ + /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, xAxis*200.f, RGB_RED, DEFAULT_LINE_THICKNESS*4.f ); */ + /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, yAxis*200.f, RGB_GREEN, DEFAULT_LINE_THICKNESS*4.f ); */ + /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, zAxis*200.f, RGB_BLUE, DEFAULT_LINE_THICKNESS*4.f ); */ + /* DEBUG_DrawSimSpaceVectorAt(Engine, SimEditRect.Min + EditRectRad, PlaneNormal*400.f, RGB_PINK, DEFAULT_LINE_THICKNESS*2.f ); */ - texture *CurrentAccumulationTexture = &WorldEditRC->PingPongTextures[CurrentAccumulationTextureIndex]; + texture *CurrentAccumulationTexture = &WorldEditRC->PingPongTextures[CurrentAccumulationTextureIndex]; - // - // Terrain Finalize - // - { - TIMED_NAMED_BLOCK(TerrainFinalizeDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->TerrainFinalizeRC.FBO.ID); + // + // Terrain Finalize + // + { + TIMED_NAMED_BLOCK(TerrainFinalizeDrawCall); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->TerrainFinalizeRC.FBO.ID); - UseShader(&Graphics->TerrainFinalizeRC); + UseShader(&Graphics->TerrainFinalizeRC); - // NOTE(Jesse): The other inputtex calls bind to texture unit 1 .. it is correct that - // this bind to unit 0 because there's no derivs texture being bound here. - // - // @derivs_texture_binding_to_shader_unit_0 - BindUniformByName(&Graphics->TerrainFinalizeRC.Program, "InputTex", CurrentAccumulationTexture, 0); + // NOTE(Jesse): The other inputtex calls bind to texture unit 1 .. it is correct that + // this bind to unit 0 because there's no derivs texture being bound here. + // + // @derivs_texture_binding_to_shader_unit_0 + BindUniformByName(&Graphics->TerrainFinalizeRC.Program, "InputTex", CurrentAccumulationTexture, 0); - /* gpu_timer Timer = StartGpuTimer(); */ - RenderQuad(); - /* EndGpuTimer(&Timer); */ - /* Push(&Graphics->GpuTimers, &Timer); */ + /* gpu_timer Timer = StartGpuTimer(); */ + RenderQuad(); + /* EndGpuTimer(&Timer); */ + /* Push(&Graphics->GpuTimers, &Timer); */ - AssertNoGlErrors; - } + AssertNoGlErrors; + } - /* Assert(Chunk1->Dim == V3i(64)); */ - /* Assert(NoiseDim == V3(66)); */ - v3i NoiseDim = V3i(66); + /* Assert(Chunk1->Dim == V3i(64)); */ + /* Assert(NoiseDim == V3(66)); */ + v3i NoiseDim = V3i(66); - s32 NoiseElementCount = s32(Volume(CurrentAccumulationTexture->Dim)); - s32 NoiseByteCount = NoiseElementCount*s32(sizeof(u16)); + s32 NoiseElementCount = s32(Volume(CurrentAccumulationTexture->Dim)); + s32 NoiseByteCount = NoiseElementCount*s32(sizeof(u16)); - { - TIMED_NAMED_BLOCK(GenPboAndInitTransfer); - u32 PBO; - GL.GenBuffers(1, &PBO); - AssertNoGlErrors; + { + TIMED_NAMED_BLOCK(GenPboAndInitTransfer); + u32 PBO; + GetStdlib()->GL.GenBuffers(1, &PBO); + AssertNoGlErrors; - /* Info("(%d) Allocated PBO (%u)", ThreadLocal_ThreadIndex, PBO); */ - GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); - GL.BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); - AssertNoGlErrors; - GL.ReadPixels(0, 0, CurrentAccumulationTexture->Dim.x, CurrentAccumulationTexture->Dim.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); - AssertNoGlErrors; - GL.BindBuffer(GL_PIXEL_PACK_BUFFER, 0); + /* Info("(%d) Allocated PBO (%u)", ThreadLocal_ThreadIndex, PBO); */ + GetStdlib()->GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); + GetStdlib()->GL.BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); + AssertNoGlErrors; + GetStdlib()->GL.ReadPixels(0, 0, CurrentAccumulationTexture->Dim.x, CurrentAccumulationTexture->Dim.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); + AssertNoGlErrors; + GetStdlib()->GL.BindBuffer(GL_PIXEL_PACK_BUFFER, 0); - gl_fence Fence = GL.FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + gl_fence Fence = GetStdlib()->GL.FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, NoiseDim, Node}; - Push(&Graphics->NoiseReadbackJobs, &Readback); - } - } break; + dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, NoiseDim, Node}; + Push(&Graphics->NoiseReadbackJobs, &Readback); + } + } break; - { tmatch(bonsai_render_command_do_stuff, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_do_stuff); + { tmatch(bonsai_render_command_do_stuff, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_do_stuff); - // - // Render begin - // + // + // Render begin + // - ao_render_group *AoGroup = Graphics->AoGroup; + ao_render_group *AoGroup = Graphics->AoGroup; - EngineDebug->Render.BytesSolidGeoLastFrame = GpuMap->Buffer.At; - EngineDebug->Render.BytesTransGeoLastFrame = Graphics->Transparency.GpuBuffer.Buffer.At; + EngineDebug->Render.BytesSolidGeoLastFrame = GpuMap->Buffer.At; + EngineDebug->Render.BytesTransGeoLastFrame = Graphics->Transparency.GpuBuffer.Buffer.At; - // TODO(Jesse): Make a render frame begin event to stuff this kinda thing onto? - // - // Update color texture, if necessary - // - s32 ColorCount = s32(AtElements(&Graphics->ColorPalette)); - if (ColorCount != Graphics->ColorPaletteTexture.Dim.x) - { - if (Graphics->ColorPaletteTexture.ID) { DeleteTexture(&Graphics->ColorPaletteTexture); } - Graphics->ColorPaletteTexture = - MakeTexture_RGB( V2i(ColorCount, 1), Graphics->ColorPalette.Start, CSz("ColorPalette")); - } + // TODO(Jesse): Make a render frame begin event to stuff this kinda thing onto? + // + // Update color texture, if necessary + // + s32 ColorCount = s32(AtElements(&Graphics->ColorPalette)); + if (ColorCount != Graphics->ColorPaletteTexture.Dim.x) + { + if (Graphics->ColorPaletteTexture.ID) { DeleteTexture(&Graphics->ColorPaletteTexture); } + Graphics->ColorPaletteTexture = + MakeTexture_RGB( V2i(ColorCount, 1), Graphics->ColorPalette.Start, CSz("ColorPalette")); + } #if 0 - // - // Editor preview - /* DrawStuffToGBufferTextures(Engine, GetApplicationResolution(&Engine->Settings)); */ - { - shadow_render_group *SG = Graphics->SG; - v3i Radius = World->VisibleRegion/2; - v3i Min = World->Center - Radius; - v3i Max = World->Center + Radius; - - SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), False); - shader *Shader = &Graphics->gBuffer->gBufferShader; - DrawEditorPreview(Engine, Shader); - TeardownGBufferShader(Graphics); - - SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), False); - Shader = &Graphics->SG->Shader.Program; - DrawEditorPreview(Engine, Shader); - TeardownShadowMapShader(Graphics); - } + // + // Editor preview + /* DrawStuffToGBufferTextures(Engine, GetApplicationResolution(&Engine->Settings)); */ + { + shadow_render_group *SG = Graphics->SG; + v3i Radius = World->VisibleRegion/2; + v3i Min = World->Center - Radius; + v3i Max = World->Center + Radius; + + SetupGBufferShader(Graphics, GetApplicationResolution(&Engine->Settings), False); + shader *Shader = &Graphics->gBuffer->gBufferShader; + DrawEditorPreview(Engine, Shader); + TeardownGBufferShader(Graphics); + + SetupShadowMapShader(Graphics, GetShadowMapResolution(&Engine->Settings), False); + Shader = &Graphics->SG->Shader.Program; + DrawEditorPreview(Engine, Shader); + TeardownShadowMapShader(Graphics); + } #endif - /* DrawWorldAndEntitiesToShadowMap(GetShadowMapResolution(&Engine->Settings), Engine); */ + /* DrawWorldAndEntitiesToShadowMap(GetShadowMapResolution(&Engine->Settings), Engine); */ - // TODO(Jesse): Move into engine debug - world_chunk *C = EngineDebug->PickedNode ? EngineDebug->PickedNode->Chunk : 0; - DebugHighlightWorldChunkBasedOnState(Graphics, C, &GpuMap->Buffer); + // TODO(Jesse): Move into engine debug + world_chunk *C = EngineDebug->PickedNode ? EngineDebug->PickedNode->Chunk : 0; + DebugHighlightWorldChunkBasedOnState(Graphics, C, &GpuMap->Buffer); - AssertNoGlErrors; + AssertNoGlErrors; - if (Graphics->Settings.DrawCameraGhost) - { - untextured_3d_geometry_buffer Mesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); - DrawVoxel(&Mesh, {}, V3(0.7f), V3(1)*(Graphics->GameCamera.DistanceFromTarget/1000.f*Graphics->Settings.CameraGhostSize)); - } + if (Graphics->Settings.DrawCameraGhost) + { + untextured_3d_geometry_buffer Mesh = ReserveBufferSpace(&GpuMap->Buffer, VERTS_PER_VOXEL); + DrawVoxel(&Mesh, {}, V3(0.7f), V3(1)*(Graphics->GameCamera.DistanceFromTarget/1000.f*Graphics->Settings.CameraGhostSize)); + } - Ensure( FlushBuffersToCard(GpuMap) ); // Unmaps buffer - if (GpuMap->Buffer.At) - { - RenderImmediateGeometryToGBuffer(GetApplicationResolution(&Engine->Settings), GpuMap, Graphics); - RenderImmediateGeometryToShadowMap(World, Graphics, GpuMap); - } - Clear(&GpuMap->Buffer); + Ensure( FlushBuffersToCard(GpuMap) ); // Unmaps buffer + if (GpuMap->Buffer.At) + { + RenderImmediateGeometryToGBuffer(GetApplicationResolution(&Engine->Settings), GpuMap, Graphics); + RenderImmediateGeometryToShadowMap(World, Graphics, GpuMap); + } + Clear(&GpuMap->Buffer); - // NOTE(Jesse): I observed the AO lagging a frame behind if this is re-ordered - // after the transparency/luminance textures. I have literally 0 ideas as to - // why that would be, but here we are. - if (Graphics->Settings.UseSsao) { RenderAoTexture(GetApplicationResolution(&Engine->Settings), AoGroup); } + // NOTE(Jesse): I observed the AO lagging a frame behind if this is re-ordered + // after the transparency/luminance textures. I have literally 0 ideas as to + // why that would be, but here we are. + if (Graphics->Settings.UseSsao) { RenderAoTexture(GetApplicationResolution(&Engine->Settings), AoGroup); } - { - RenderTransparencyBuffers(GetApplicationResolution(&Engine->Settings), &Graphics->Settings, &Graphics->Transparency); - RenderLuminanceTexture(GetApplicationResolution(&Engine->Settings), GpuMap, Lighting, Graphics); - } + { + RenderTransparencyBuffers(GetApplicationResolution(&Engine->Settings), &Graphics->Settings, &Graphics->Transparency); + RenderLuminanceTexture(GetApplicationResolution(&Engine->Settings), GpuMap, Lighting, Graphics); + } - if (Graphics->Settings.UseLightingBloom) { RunBloomRenderPass(Graphics); } - /* if (Graphics->Settings.UseLightingBloom) { GaussianBlurTexture(&Graphics->Gaussian, &Graphics->Lighting.BloomTex, &Graphics->Lighting.BloomFBO); } */ + if (Graphics->Settings.UseLightingBloom) { RunBloomRenderPass(Graphics); } + /* if (Graphics->Settings.UseLightingBloom) { GaussianBlurTexture(&Graphics->Gaussian, &Graphics->Lighting.BloomTex, &Graphics->Lighting.BloomFBO); } */ - CompositeGameTexturesAndDisplay(Plat, Graphics); + CompositeGameTexturesAndDisplay(Plat, Graphics); - UiFrameEnd(&Engine->Ui); + UiFrameEnd(&Engine->Ui); - BonsaiSwapBuffers(&Engine->Stdlib.Os); + BonsaiSwapBuffers(&Engine->Stdlib.Os); - HotReloadShaders(GetStdlib()); + HotReloadShaders(GetStdlib()); - /* GpuMap = GetNextGpuMap(Graphics); */ + /* GpuMap = GetNextGpuMap(Graphics); */ - // Map immediate GPU buffers for next frame - MapGpuBuffer_untextured_3d_geometry_buffer(GpuMap); - MapGpuBuffer_untextured_3d_geometry_buffer(&Graphics->Transparency.GpuBuffer); - Assert(GpuMap->Buffer.At == 0); + // Map immediate GPU buffers for next frame + MapGpuBuffer_untextured_3d_geometry_buffer(GpuMap); + MapGpuBuffer_untextured_3d_geometry_buffer(&Graphics->Transparency.GpuBuffer); + Assert(GpuMap->Buffer.At == 0); - Graphics->RenderGate = False; + Graphics->RenderGate = False; - IterateOver(&Graphics->GpuTimers, Timer, TimerIndex) + IterateOver(&Graphics->GpuTimers, Timer, TimerIndex) + { + if (Timer->Ns == 0) { - if (Timer->Ns == 0) + if (QueryGpuTimer(Timer)) { - if (QueryGpuTimer(Timer)) - { #if BONSAI_DEBUG_SYSTEM_API - GetDebugState()->PushHistogramDataPoint(Timer->Ns); - // NOTE(Jesse): This skips the next timer, but it'll get - // hit on the next frame, so no worries .. - RemoveUnordered(&Graphics->GpuTimers, TimerIndex); + GetDebugState()->PushHistogramDataPoint(Timer->Ns); + // NOTE(Jesse): This skips the next timer, but it'll get + // hit on the next frame, so no worries .. + RemoveUnordered(&Graphics->GpuTimers, TimerIndex); #endif - } } } - } break; + } + } break; - { tmatch(bonsai_render_command_gl_timer_init, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_init); - AssertNoGlErrors; - GL.GenQueries(1, Command->GlTimerObject); - AssertNoGlErrors; - } break; + { tmatch(bonsai_render_command_gl_timer_init, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_init); + AssertNoGlErrors; + GetStdlib()->GL.GenQueries(1, Command->GlTimerObject); + AssertNoGlErrors; + } break; - { tmatch(bonsai_render_command_gl_timer_start, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_start); - AssertNoGlErrors; - GL.BeginQuery(GL_TIME_ELAPSED, Command->GlTimerObject); - AssertNoGlErrors; - } break; + { tmatch(bonsai_render_command_gl_timer_start, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_start); + AssertNoGlErrors; + GetStdlib()->GL.BeginQuery(GL_TIME_ELAPSED, Command->GlTimerObject); + AssertNoGlErrors; + } break; - { tmatch(bonsai_render_command_gl_timer_end, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_end); - AssertNoGlErrors; - GL.EndQuery(GL_TIME_ELAPSED); - AssertNoGlErrors; - } break; + { tmatch(bonsai_render_command_gl_timer_end, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_end); + AssertNoGlErrors; + GetStdlib()->GL.EndQuery(GL_TIME_ELAPSED); + AssertNoGlErrors; + } break; - { tmatch(bonsai_render_command_gl_timer_read_value_and_histogram, RenderCommand, Command) - TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_read_value_and_histogram); + { tmatch(bonsai_render_command_gl_timer_read_value_and_histogram, RenderCommand, Command) + TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_read_value_and_histogram); #if 0 - AssertNoGlErrors; - u64 TimerNs = 0; + AssertNoGlErrors; + u64 TimerNs = 0; - s32 Available = False; - while (!Available) - { - GL.GetQueryObjectiv(Command->GlTimerObject, GL_QUERY_RESULT_AVAILABLE, &Available); - /* if (Available == False) { Info("Waiting for query object to become available"); } */ - } + s32 Available = False; + while (!Available) + { + GetStdlib()->GL.GetQueryObjectiv(Command->GlTimerObject, GL_QUERY_RESULT_AVAILABLE, &Available); + /* if (Available == False) { Info("Waiting for query object to become available"); } */ + } - GL.GetQueryObjectui64v(Command->GlTimerObject, GL_QUERY_RESULT, &TimerNs); - /* Info("GL reported time of (%.2f)ms", f64(TimerNs)/1000000.0); */ - /* GetDebugState()->PushHistogramDataPoint(TimerNs); */ - AssertNoGlErrors; + GetStdlib()->GL.GetQueryObjectui64v(Command->GlTimerObject, GL_QUERY_RESULT, &TimerNs); + /* Info("GL reported time of (%.2f)ms", f64(TimerNs)/1000000.0); */ + /* GetDebugState()->PushHistogramDataPoint(TimerNs); */ + AssertNoGlErrors; #endif - } break; - - } - } break; - } + } break; - RewindArena(GetTranArena()); + } + } break; } + RewindArena(GetTranArena()); + } + + { + TIMED_NAMED_BLOCK(CheckReadbackJobs); + IterateOver(&Graphics->NoiseReadbackJobs, PBOJob, JobIndex) { - TIMED_NAMED_BLOCK(CheckReadbackJobs); - IterateOver(&Graphics->NoiseReadbackJobs, PBOJob, JobIndex) - { - Assert(PBOJob); + Assert(PBOJob); - /* Info("PBOJob(0x%x) JobIndex(%u)", PBOJob, JobIndex.Index); */ - /* Info("0x%x 0x%x", PBOJob->PBOBuf.PBO, PBOJob->PBOBuf.Fence); */ + /* Info("PBOJob(0x%x) JobIndex(%u)", PBOJob, JobIndex.Index); */ + /* Info("0x%x 0x%x", PBOJob->PBOBuf.PBO, PBOJob->PBOBuf.Fence); */ - u32 SyncStatus = GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); - AssertNoGlErrors; - switch(SyncStatus) + u32 SyncStatus = GetStdlib()->GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); + AssertNoGlErrors; + switch(SyncStatus) + { + case GL_ALREADY_SIGNALED: + case GL_CONDITION_SATISFIED: { - case GL_ALREADY_SIGNALED: - case GL_CONDITION_SATISFIED: - { - TIMED_NAMED_BLOCK(MapBuffer); - - AssertNoGlErrors; - /* umm JobCount = AtElements(&Graphics->NoiseReadbackJobs).Index; */ - /* Info("(%d) Binding and Mapping PBOJob(0x%x) PBO(%u) JobCount(%d) JobIndex(%u)", ThreadLocal_ThreadIndex, PBOJob, PBOJob->PBOBuf.PBO, JobCount, JobIndex.Index); */ - GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOJob->PBOBuf.PBO); - AssertNoGlErrors; - u16 *NoiseValues = Cast(u16*, GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); - AssertNoGlErrors; - - auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->DestNode)); - PushWorkQueueEntry(&Plat->LowPriority, &BuildMeshJob); - - // TODO(Jesse): This actually makes the loop skip a job because we - // shorten the array, but never update the index we're looking at. - // - // It doesn't matter in this case because this runs every frame, so - // the skipped job is just a frame late. But, it would be nice if - // this was better. - // - // NOTE(Jesse): Must happen after we read the PBOJob values for the work queue entry - RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); - } break; + TIMED_NAMED_BLOCK(MapBuffer); + + AssertNoGlErrors; + /* umm JobCount = AtElements(&Graphics->NoiseReadbackJobs).Index; */ + /* Info("(%d) Binding and Mapping PBOJob(0x%x) PBO(%u) JobCount(%d) JobIndex(%u)", ThreadLocal_ThreadIndex, PBOJob, PBOJob->PBOBuf.PBO, JobCount, JobIndex.Index); */ + GetStdlib()->GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOJob->PBOBuf.PBO); + AssertNoGlErrors; + u16 *NoiseValues = Cast(u16*, GetStdlib()->GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); + AssertNoGlErrors; + + auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->DestNode)); + PushWorkQueueEntry(&Plat->LowPriority, &BuildMeshJob); + + // TODO(Jesse): This actually makes the loop skip a job because we + // shorten the array, but never update the index we're looking at. + // + // It doesn't matter in this case because this runs every frame, so + // the skipped job is just a frame late. But, it would be nice if + // this was better. + // + // NOTE(Jesse): Must happen after we read the PBOJob values for the work queue entry + RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); + } break; - case GL_TIMEOUT_EXPIRED: - { - } break; + case GL_TIMEOUT_EXPIRED: + { + } break; - case GL_WAIT_FAILED: - { - SoftError("Error waiting on gl sync object"); - } break; - } + case GL_WAIT_FAILED: + { + SoftError("Error waiting on gl sync object"); + } break; } } - - if (FutexIsSignaled(ThreadParams->WorkerThreadsExitFutex)) break; - - if (FutexIsSignaled(ThreadParams->WorkerThreadsSuspendFutex)) { WaitOnFutex(ThreadParams->WorkerThreadsSuspendFutex); } - - SleepMs(1); } - - Info("Exiting Render Thread (%d)", ThreadParams->ThreadIndex); - WaitOnFutex(ThreadParams->WorkerThreadsExitFutex); } link_export THREAD_MAIN_RETURN RenderThread_Main(void *ThreadStartupParams) { thread_startup_params *ThreadParams = Cast(thread_startup_params*, ThreadStartupParams); + WorkerThread_BeforeJobStart(ThreadParams); - Global_EngineResources = (engine_resources*)ThreadParams->EngineResources; - Global_ThreadStates = Global_EngineResources->Stdlib.ThreadStates; - Assert(Global_EngineResources); + + Global_ThreadStates = GetStdlib()->ThreadStates; Assert(Global_ThreadStates); - WorkerThread_BeforeJobStart(ThreadParams); /* Assert(ThreadParams->ThreadIndex > 0); */ /* SetThreadLocal_ThreadIndex(ThreadParams->ThreadIndex); */ - engine_resources *Engine = GetEngineResources(); - os *Os = &Engine->Stdlib.Os; - platform *Plat = &Engine->Stdlib.Plat; + engine_resources *Engine = GetEngineResources(); + application_api *AppApi = ThreadParams->AppApi; + os *Os = &Engine->Stdlib.Os; + platform *Plat = &Engine->Stdlib.Plat; + engine_api *EngineApi = &Engine->EngineApi; PlatformMakeRenderContextCurrent(Os); - // NOTE(Jesse): This now happens in stdlib startup - /* s32 VSyncFrames = 0; */ - /* InitResult &= OpenAndInitializeWindow(Os, Plat, VSyncFrames); */ - /* if (InitResult) { InitResult &= InitializeOpenglFunctions(); } */ - - b32 InitResult = True; - if (InitResult) { InitResult &= GraphicsInit(&Engine->Graphics, &Engine->Settings, AllocateArena()); } + b32 InitResult = GraphicsInit(&Engine->Graphics, &Engine->Settings, AllocateArena()); if (InitResult) { memory_arena *UiMemory = AllocateArena(); InitRenderer2D(&Engine->Ui, &Engine->Heap, UiMemory, &Plat->MouseP, &Plat->MouseDP, &Plat->ScreenDim, &Plat->Input); - bitmap_block_array Bitmaps = {}; - Bitmaps.Memory = GetTranArena(); + bitmap_block_array Bitmaps = BitmapBlockArray(GetTranArena()); LoadBitmapsFromFolderOrdered(CSz("assets/mystic_rpg_icon_pack/Sprites/300%/64x64_sprites"), &Bitmaps, GetTranArena(), GetTranArena()); LoadBitmapsFromFolderOrdered(CSz("assets/mystic_rpg_icon_pack/Sprites/300%/44x44_sprites"), &Bitmaps, GetTranArena(), GetTranArena()); Engine->Ui.SpriteTextureArray = CreateTextureArrayFromBitmapBlockArray(&Bitmaps, V2i(64,64)); } - FullBarrier; + // Map immediate GPU buffers for first frame + MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.GpuBuffers[0]); + MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.Transparency.GpuBuffer); + FullBarrier; Engine->Graphics.Initialized = True; if (InitResult) { - RenderLoop(ThreadParams, Engine); + while ( FutexNotSignaled(ThreadParams->WorkerThreadsExitFutex) ) + { + WORKER_THREAD_ADVANCE_DEBUG_SYSTEM(); + AppApi->WorkerBeforeJob(GetThreadLocalState(ThreadLocal_ThreadIndex), ThreadParams); + EngineApi->DrainRenderQueue(Engine); + if (FutexIsSignaled(ThreadParams->WorkerThreadsSuspendFutex)) { WaitOnFutex(ThreadParams->WorkerThreadsSuspendFutex); } + SleepMs(1); + } + + Info("Exiting Render Thread (%d)", ThreadParams->ThreadIndex); + WaitOnFutex(ThreadParams->WorkerThreadsExitFutex); } else { diff --git a/src/engine/resources.h b/src/engine/resources.h index cb4632edb..a0e6ddae1 100644 --- a/src/engine/resources.h +++ b/src/engine/resources.h @@ -43,6 +43,7 @@ struct engine_resources renderer_2d Ui; application_api GameApi; + engine_api EngineApi; // Engine hotkeys Hotkeys; @@ -73,8 +74,6 @@ struct engine_resources // NOTE(Jesse): This is kinda-sorta all debug stuff // - debug_state *DebugState; - engine_debug EngineDebug; level_editor Editor; @@ -84,31 +83,42 @@ struct engine_resources maybe_entity_ptr HoverEntity; render_entity_to_texture_group RTTGroup; + + world_chunk_freelist SynChunkFreelist; }; -// TODO(Jesse): Should this actually be a thing? -global_variable engine_resources *Global_EngineResources; +link_internal engine_resources * +TryGetEngineResources() +{ + engine_resources *Result = 0; + if (ThreadLocal_ThreadIndex != INVALID_THREAD_LOCAL_THREAD_INDEX) + { + thread_local_state *Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); + Result = Cast(engine_resources*, Thread->UserData); + } + return Result; +} link_internal engine_resources * GetEngineResources() { - Assert(Global_EngineResources); - return Global_EngineResources; + thread_local_state *Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); + return Cast(engine_resources*, Thread->UserData); } link_internal engine_debug * GetEngineDebug() { - Assert(Global_EngineResources); - return &Global_EngineResources->EngineDebug; + auto Result = &GetEngineResources()->EngineDebug; + return Result; } link_internal world * GetWorld() { - Assert(Global_EngineResources); - return Global_EngineResources->World; + auto Result = GetEngineResources()->World; + return Result; } link_internal v3i @@ -117,26 +127,24 @@ GetWorldChunkDim() return GetWorld()->ChunkDim; } +// NOTE(Jesse): We have to fail on this for avoiding stackoverflows on startup link_weak bonsai_stdlib * GetStdlib() { - /* Assert(Global_EngineResources); */ - if (Global_EngineResources) + bonsai_stdlib *Result = 0; + if (auto Engine = TryGetEngineResources()) { - return &Global_EngineResources->Stdlib; - } - else - { - return 0; + Result = &Engine->Stdlib; } + return Result; } link_internal level_editor * GetLevelEditor() { - Assert(Global_EngineResources); - return &Global_EngineResources->Editor; + auto Result = &GetEngineResources()->Editor; + return Result; } link_internal entity * diff --git a/src/engine/shader.cpp b/src/engine/shader.cpp index e57e9eca7..db787cc56 100644 --- a/src/engine/shader.cpp +++ b/src/engine/shader.cpp @@ -17,14 +17,14 @@ BindEngineUniform(shader_uniform *Uniform) case ShaderUniform_Light: { TIMED_BLOCK("ShaderUniform_Light"); - GL.Uniform3fv(Uniform->ID, 1, &Uniform->Light->Position.E[0]); + GetStdlib()->GL.Uniform3fv(Uniform->ID, 1, &Uniform->Light->Position.E[0]); END_BLOCK(); } break; case ShaderUniform_Camera: { TIMED_BLOCK("ShaderUniform_Camera"); - GL.Uniform3fv(Uniform->ID, 1, &Uniform->Camera->RenderSpacePosition.E[0]); + GetStdlib()->GL.Uniform3fv(Uniform->ID, 1, &Uniform->Camera->RenderSpacePosition.E[0]); END_BLOCK(); } break; diff --git a/src/engine/terrain_render.cpp b/src/engine/terrain_render.cpp index 55267bc44..f17818b68 100644 --- a/src/engine/terrain_render.cpp +++ b/src/engine/terrain_render.cpp @@ -14,7 +14,7 @@ DispatchTerrainShaders(graphics *Graphics, world_chunk *Chunk) RC->ChunkResolution = V3(Chunk->DimInChunks); TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); UseShader(RC); v2i DestTextureDim = RC->DestTex.Dim; @@ -35,7 +35,7 @@ DispatchTerrainShaders(graphics *Graphics, world_chunk *Chunk) auto *RC = &Graphics->TerrainDerivsRC; TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); UseShader(RC); // @derivs_texture_binding_to_shader_unit_0 @@ -62,7 +62,7 @@ DispatchTerrainShaders(graphics *Graphics, world_chunk *Chunk) RC->ChunkResolution = V3(Chunk->DimInChunks); TIMED_NAMED_BLOCK(TerrainDrawCall); - GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO->ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO->ID); UseShader(RC); // Using texture unit 1 because the DerivsTex is automatically bound in UseShader to unit 0 // @derivs_texture_binding_to_shader_unit_0 diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 2aa74b917..30c057825 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -4702,14 +4702,14 @@ DrawPickedChunks(renderer_2d* Group, render_entity_to_texture_group *PickedChunk { // Draw hotchunk to the GameGeo FBO - GL.BindFramebuffer(GL_FRAMEBUFFER, PickedChunksRenderGroup->GameGeoFBO.ID); + GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, PickedChunksRenderGroup->GameGeoFBO.ID); FlushBuffersToCard(&PickedChunksRenderGroup->GameGeo); PickedChunksRenderGroup->ViewProjection = ProjectionMatrix(PickedChunksRenderGroup->Camera, DEBUG_TEXTURE_DIM, DEBUG_TEXTURE_DIM) * ViewMatrix(ChunkDimension(HotChunk->Chunk), PickedChunksRenderGroup->Camera); - GL.UseProgram(PickedChunksRenderGroup->GameGeoShader.ID); + GetStdlib()->GL.UseProgram(PickedChunksRenderGroup->GameGeoShader.ID); SetViewport(V2(DEBUG_TEXTURE_DIM, DEBUG_TEXTURE_DIM)); diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 4dd1447bd..0eabde058 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -1,16 +1,17 @@ +#if 0 link_export THREAD_MAIN_RETURN WorldUpdateThread_Main(void *ThreadStartupParams) { b32 InitResult = True; - thread_startup_params *ThreadParams = Cast(thread_startup_params*, ThreadStartupParams); - - engine_resources *Engine = Cast(engine_resources*, ThreadParams->EngineResources); + thread_startup_params *ThreadParams = Cast(thread_startup_params*, ThreadStartupParams); SetThreadLocal_ThreadIndex(ThreadParams->ThreadIndex); + engine_resources *Engine = Cast(engine_resources*, GetEngineResources()); + thread_local_state *Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); - Assert(Global_EngineResources); + Assert(GetEngineResources()); Assert(Global_ThreadStates); while ( FutexNotSignaled(ThreadParams->WorkerThreadsExitFutex) ) @@ -92,6 +93,7 @@ WorldUpdateThread_Main(void *ThreadStartupParams) THREAD_MAIN_RETURN Result = ReinterpretCast(THREAD_MAIN_RETURN, InitResult); return Result; } +#endif link_internal void QueueWorldUpdateForRegion( engine_resources *Engine, diff --git a/src/game_loader.cpp b/src/game_loader.cpp index 5e5d08550..c85e785da 100644 --- a/src/game_loader.cpp +++ b/src/game_loader.cpp @@ -114,7 +114,6 @@ main( s32 ArgCount, const char ** Args ) engine_resources EngineResources_ = {}; engine_resources *EngineResources = &EngineResources_; - Global_EngineResources = EngineResources; const char* GameLibName = Global_ProjectSwitcherGameLibName; switch (ArgCount) @@ -131,7 +130,7 @@ main( s32 ArgCount, const char ** Args ) // shared_lib GameLib = {}; application_api *GameApi = &EngineResources->GameApi; - engine_api EngineApi = {}; + engine_api *EngineApi = &EngineResources->EngineApi; { FileIsNew(GameLibName, &LastGameLibTime); // Hack to initialize the lib timer statics FileIsNew(DEFAULT_DEBUG_LIB, &LastDebugLibTime); @@ -141,13 +140,10 @@ main( s32 ArgCount, const char ** Args ) if (!InitializeGameApi(GameApi, GameLib)) { Error("Initializing GameApi :( "); return 1; } - if (!InitializeEngineApi(&EngineApi, GameLib)) { Error("Initializing EngineApi :( "); return 1; } + if (!InitializeEngineApi(EngineApi, GameLib)) { Error("Initializing EngineApi :( "); return 1; } } - memory_arena BootstrapArena = {}; - memory_arena *GameMemory = AllocateArena(); - { temp_memory_handle TempHandle = BeginTemporaryMemory(&BootstrapArena); @@ -156,15 +152,14 @@ main( s32 ArgCount, const char ** Args ) EngineResources->Stdlib.Plat.ScreenDim = V2(SettingToValue(EngineResources->Settings.Graphics.WindowStartingSize)); - thread_main_callback_type Procs[2] = { RenderThread_Main, WorldUpdateThread_Main }; - thread_main_callback_type_buffer CustomWorkerProcs = {}; - CustomWorkerProcs.Start = Procs; - CustomWorkerProcs.Count = 2; + thread_main_callback_type Procs[1] = { RenderThread_Main }; + thread_main_callback_type_buffer CustomWorkerProcs = ThreadMainCallbackTypeBuffer(Procs, ArrayCount(Procs)); Ensure( InitializeBonsaiStdlib( bonsai_init_flags(BonsaiInit_OpenWindow|BonsaiInit_LaunchThreadPool|BonsaiInit_InitDebugSystem), GameApi, &EngineResources->Stdlib, &BootstrapArena, + EngineResources, &CustomWorkerProcs )); while (EngineResources->Graphics.Initialized == False) { SleepMs(1); } @@ -174,7 +169,7 @@ main( s32 ArgCount, const char ** Args ) Assert(EngineResources->Stdlib.ThreadStates); Assert(Global_ThreadStates); - Ensure( EngineApi.OnLibraryLoad(EngineResources) ); + Ensure( EngineApi->OnLibraryLoad(EngineResources) ); Ensure( Bonsai_Init(EngineResources) ); // <-- EngineResources now initialized #if BONSAI_DEBUG_SYSTEM_API @@ -189,7 +184,6 @@ main( s32 ArgCount, const char ** Args ) InitQueue(&Plat->RenderQ, WorkQueueMemory); InitQueue(&Plat->WorldUpdateQ, WorkQueueMemory); - DEBUG_REGISTER_ARENA(GameMemory, 0); DEBUG_REGISTER_ARENA(WorkQueueMemory, 0); DEBUG_REGISTER_ARENA(&BootstrapArena, 0); @@ -274,11 +268,11 @@ main( s32 ArgCount, const char ** Args ) CloseLibrary(GameLib); GameLib = OpenLibrary(GameLibName); - Ensure(InitializeEngineApi(&EngineApi, GameLib)); + Ensure(InitializeEngineApi(EngineApi, GameLib)); Ensure(InitializeGameApi(GameApi, GameLib)); // Hook up global pointers - Ensure( EngineApi.OnLibraryLoad(EngineResources) ); + Ensure( EngineApi->OnLibraryLoad(EngineResources) ); if (EngineResources->RequestedGameLibReloadBehavior & GameLibReloadBehavior_FullInitialize) { @@ -308,22 +302,22 @@ main( s32 ArgCount, const char ** Args ) /* if (IsDisconnected(&Plat->Network)) { ConnectToServer(&Plat->Network); } */ /* END_BLOCK("Network Ops"); */ - EngineApi.FrameBegin(EngineResources); + EngineApi->FrameBegin(EngineResources); TIMED_BLOCK("GameMain"); GameApi->GameMain(EngineResources, MainThread); END_BLOCK("GameMain"); - EngineApi.Simulate(EngineResources); + EngineApi->Simulate(EngineResources); DrainQueue(&Plat->HighPriority, MainThread, GameApi); WaitForWorkerThreads(&Plat->HighPriorityWorkerCount); - EngineApi.Render(EngineResources); + EngineApi->Render(EngineResources); DEBUG_FRAME_END(Plat->dt); - EngineApi.FrameEnd(EngineResources); + EngineApi->FrameEnd(EngineResources); // NOTE(Jesse): We can't hold strings from PlatformTraverseDirectoryTreeUnordered From 255de62c53f8c39f018a96fc17a6dfa8a0a68fdd Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 19:50:26 -0700 Subject: [PATCH 317/421] Update submodules --- external/bonsai_debug | 2 +- external/bonsai_stdlib | 2 +- generated/anonymous_input_5Nt8cwGP.h | 2 +- generated/anonymous_input_nPw6miGy.h | 2 +- src/game_loader.cpp | 7 ++++++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/external/bonsai_debug b/external/bonsai_debug index 36ef297c3..a7d9ba261 160000 --- a/external/bonsai_debug +++ b/external/bonsai_debug @@ -1 +1 @@ -Subproject commit 36ef297c3c765773d071e19691fda27d2ef57f6d +Subproject commit a7d9ba2612b7b86931128a7e8627199bd14dadb0 diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 0a0c8de98..b97e019c4 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 0a0c8de9831f01b723d5e3c64fafbd4203ebd878 +Subproject commit b97e019c4227777a491feb0b2fe4cdaf4f3ac9f7 diff --git a/generated/anonymous_input_5Nt8cwGP.h b/generated/anonymous_input_5Nt8cwGP.h index 3743b3e31..47e0d9a34 100644 --- a/generated/anonymous_input_5Nt8cwGP.h +++ b/generated/anonymous_input_5Nt8cwGP.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:410:0 +// external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:412:0 BindKeyupToInput( VK_RETURN, Enter); diff --git a/generated/anonymous_input_nPw6miGy.h b/generated/anonymous_input_nPw6miGy.h index 6b6a7c94d..019fe6fe8 100644 --- a/generated/anonymous_input_nPw6miGy.h +++ b/generated/anonymous_input_nPw6miGy.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:438:0 +// external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:440:0 BindKeydownToInput( VK_RETURN, Enter); diff --git a/src/game_loader.cpp b/src/game_loader.cpp index c85e785da..fdcfa5459 100644 --- a/src/game_loader.cpp +++ b/src/game_loader.cpp @@ -155,7 +155,12 @@ main( s32 ArgCount, const char ** Args ) thread_main_callback_type Procs[1] = { RenderThread_Main }; thread_main_callback_type_buffer CustomWorkerProcs = ThreadMainCallbackTypeBuffer(Procs, ArrayCount(Procs)); - Ensure( InitializeBonsaiStdlib( bonsai_init_flags(BonsaiInit_OpenWindow|BonsaiInit_LaunchThreadPool|BonsaiInit_InitDebugSystem), + auto Flags = bonsai_init_flags( BonsaiInit_OpenWindow | + BonsaiInit_LaunchThreadPool | + BonsaiInit_InitDebugSystem ); + /* BonsaiInit_ProfileContextSwitches ); */ + + Ensure( InitializeBonsaiStdlib( Flags, GameApi, &EngineResources->Stdlib, &BootstrapArena, From 891de48125e592ee21d22fae824aae8862bae58c Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 20:13:23 -0700 Subject: [PATCH 318/421] Minor cleanup --- examples/tile_gen/game.cpp | 2 - external/bonsai_debug | 2 +- external/bonsai_stdlib | 2 +- generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- jesse.make.sh | 2 +- src/engine/render/gpu_timer.c | 50 --------------------- src/engine/render/gpu_timer.h | 1 + 13 files changed, 11 insertions(+), 62 deletions(-) delete mode 100644 src/engine/render/gpu_timer.c diff --git a/examples/tile_gen/game.cpp b/examples/tile_gen/game.cpp index 83991d1da..ac3f77c3b 100644 --- a/examples/tile_gen/game.cpp +++ b/examples/tile_gen/game.cpp @@ -6,8 +6,6 @@ #include -/* global_variable debug_state *Global_DebugStatePointer; */ - model * AllocateGameModels(game_state *GameState, memory_arena *Memory, heap_allocator *Heap) { diff --git a/external/bonsai_debug b/external/bonsai_debug index a7d9ba261..492b0ad83 160000 --- a/external/bonsai_debug +++ b/external/bonsai_debug @@ -1 +1 @@ -Subproject commit a7d9ba2612b7b86931128a7e8627199bd14dadb0 +Subproject commit 492b0ad83a1451554b118982dd889700a05ec957 diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index b97e019c4..7eccab130 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit b97e019c4227777a491feb0b2fe4cdaf4f3ac9f7 +Subproject commit 7eccab130185953d7196019c295a1caac3c6f140 diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index a519f5798..793f70bf1 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:323:0 +// external/bonsai_stdlib/src/shader.cpp:324:0 b32 SetShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 161c324cf..86ed8069b 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:338:0 +// external/bonsai_stdlib/src/shader.cpp:339:0 b32 SetShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index 0da776623..4ceee9be5 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:335:0 +// external/bonsai_stdlib/src/shader.cpp:336:0 b32 SetShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index 7d4c70222..eee94cea8 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:320:0 +// external/bonsai_stdlib/src/shader.cpp:321:0 b32 SetShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 786ebd8fa..4e479a440 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:332:0 +// external/bonsai_stdlib/src/shader.cpp:333:0 b32 SetShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index ec6cf7bc3..1e1d82f07 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:326:0 +// external/bonsai_stdlib/src/shader.cpp:327:0 b32 SetShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index 795a00635..d05070cd0 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:329:0 +// external/bonsai_stdlib/src/shader.cpp:330:0 b32 SetShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) diff --git a/jesse.make.sh b/jesse.make.sh index 384beb04f..bbc35e240 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,7 +11,7 @@ ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ - BuildExecutables \ + # BuildExecutables \ # BuildTests \ # BuildSingleExample examples/ui_test \ # BuildSingleExample examples/blank_project \ diff --git a/src/engine/render/gpu_timer.c b/src/engine/render/gpu_timer.c deleted file mode 100644 index aa4c78355..000000000 --- a/src/engine/render/gpu_timer.c +++ /dev/null @@ -1,50 +0,0 @@ -#define INVALID_GPU_TIMER_HANDLE (0xFFFFFFFF) - -struct gpu_timer -{ - u32 Handle = INVALID_GPU_TIMER_HANDLE; - u64 Ns; -}; - -poof(block_array_h(gpu_timer)) - -global_variable b32 Global_ActiveGPUTimer; - -link_internal gpu_timer -StartGpuTimer(void) -{ - Assert(Global_ActiveGPUTimer == False); - Global_ActiveGPUTimer = True; - - gpu_timer Result = {}; - GetStdlib()->GL.GenQueries(1, &Result.Handle); - Assert(Result.Handle != INVALID_GPU_TIMER_HANDLE); - - GetStdlib()->GL.BeginQuery(GL_TIME_ELAPSED, Result.Handle); - return Result; -} - -link_internal void -EndGpuTimer(gpu_timer *Timer) -{ - GetStdlib()->GL.EndQuery(GL_TIME_ELAPSED); - Assert(Global_ActiveGPUTimer == True); - Global_ActiveGPUTimer = False; -} - -link_internal s32 -QueryTimer(gpu_timer *Timer) -{ - Assert(Timer->Handle != INVALID_GPU_TIMER_HANDLE); - s32 Available = False; - GetStdlib()->GL.GetQueryObjectiv(Timer->Handle, GL_QUERY_RESULT_AVAILABLE, &Available); - - if (Available) - { - GetStdlib()->GL.GetQueryObjectui64v(Timer->Handle, GL_QUERY_RESULT, &Timer->Ns); - GetStdlib()->GL.DeleteQueries(1, &Timer->Handle); - Timer->Handle = INVALID_GPU_TIMER_HANDLE; - } - - return Available; -} diff --git a/src/engine/render/gpu_timer.h b/src/engine/render/gpu_timer.h index 21e32dbaa..0c3f45686 100644 --- a/src/engine/render/gpu_timer.h +++ b/src/engine/render/gpu_timer.h @@ -9,6 +9,7 @@ struct gpu_timer poof(block_array_h(gpu_timer, {128}, {})) #include +// TODO(Jesse, globals_cleanup) global_variable b32 Global_ActiveGPUTimer; link_internal gpu_timer From e7609976e832f3e3274b3fc79cd127cb7749a6f7 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 21:03:11 -0700 Subject: [PATCH 319/421] Remove Global_ThreadStates and make Global_Stdlib primal --- examples/blank_project/game_constants.h | 11 - .../project_and_level_picker/game_constants.h | 9 - examples/tile_gen/game.cpp | 2 +- external/bonsai_debug | 2 +- external/bonsai_stdlib | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 24 ++ ...or_ui_for_compound_type_engine_resources.h | 36 +-- .../shader_magic_bloom_downsample_shader.h | 2 +- .../shader_magic_bloom_upsample_shader.h | 2 +- .../shader_magic_lighting_render_group.h | 2 +- generated/shader_magic_shadow_map_shader.h | 2 +- ...r_magic_struct_terrain_decoration_shader.h | 2 +- ...gic_struct_terrain_derivs_render_context.h | 2 +- ...c_struct_terrain_finalize_render_context.h | 2 +- ...ader_magic_struct_terrain_shaping_shader.h | 2 +- .../shader_magic_struct_world_edit_shader.h | 2 +- jesse.make.sh | 2 +- src/engine/bloom.cpp | 30 +-- src/engine/editor.cpp | 2 +- src/engine/gpu_mapped_buffer.cpp | 98 ++++---- src/engine/render.cpp | 228 +++++++++--------- src/engine/render/gpu_timer.h | 12 +- src/engine/render/render_init.cpp | 42 ++-- src/engine/render/shadow_map.h | 10 +- src/engine/render_loop.cpp | 50 ++-- src/engine/resources.h | 20 +- src/engine/shader.cpp | 4 +- src/engine/terrain_render.cpp | 6 +- src/engine/world_chunk.cpp | 4 +- src/game_loader.cpp | 2 +- 30 files changed, 290 insertions(+), 324 deletions(-) diff --git a/examples/blank_project/game_constants.h b/examples/blank_project/game_constants.h index db1e55d09..350c7a45b 100644 --- a/examples/blank_project/game_constants.h +++ b/examples/blank_project/game_constants.h @@ -1,13 +1,2 @@ - -#if 0 -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(32, 32, 8); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); -#else - global_variable chunk_dimension WORLD_CHUNK_DIM = Chunk_Dimension(64, 64, 64); - -#endif diff --git a/examples/project_and_level_picker/game_constants.h b/examples/project_and_level_picker/game_constants.h index ff8c73fa2..027c78b54 100644 --- a/examples/project_and_level_picker/game_constants.h +++ b/examples/project_and_level_picker/game_constants.h @@ -1,15 +1,6 @@ -#if 0 -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(32, 32, 8); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); -#else global_variable chunk_dimension g_VisibleRegion = Chunk_Dimension(16, 16, 4); global_variable chunk_dimension WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 32); - -#endif diff --git a/examples/tile_gen/game.cpp b/examples/tile_gen/game.cpp index ac3f77c3b..114d29ffe 100644 --- a/examples/tile_gen/game.cpp +++ b/examples/tile_gen/game.cpp @@ -24,7 +24,7 @@ BONSAI_API_MAIN_THREAD_CALLBACK() UNPACK_ENGINE_RESOURCES(Resources); - /* GetStdlib()->GL.Disable(GL_CULL_FACE); */ + /* GetGL()->Disable(GL_CULL_FACE); */ entity *Player = GameState->Player; diff --git a/external/bonsai_debug b/external/bonsai_debug index 492b0ad83..926e0c39c 160000 --- a/external/bonsai_debug +++ b/external/bonsai_debug @@ -1 +1 @@ -Subproject commit 492b0ad83a1451554b118982dd889700a05ec957 +Subproject commit 926e0c39c9528311d8924760e28d625b53f2c841 diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 7eccab130..629ae1b30 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 7eccab130185953d7196019c295a1caac3c6f140 +Subproject commit 629ae1b3080fc6dec34f3c1fc9122bc6f6cb6f65 diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index e8d327c39..8ea802b26 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -74,6 +74,30 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + } + + + { + + + + cs MemberName = CSz("AppApi"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(application_api*, &Element->AppApi), + MemberName, + Params + ); + + + + + + + + + } diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 250e0792f..8d2f35c75 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -29,30 +29,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - { - - - - cs MemberName = CSz("Settings"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(engine_settings*, &Element->Settings), - MemberName, - Params - ); - - - - - - - - - - } - - { @@ -81,11 +57,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - cs MemberName = CSz("Ui"); + cs MemberName = CSz("EngineApi"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(renderer_2d*, &Element->Ui), + Cast(engine_api*, &Element->EngineApi), MemberName, Params ); @@ -105,11 +81,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - cs MemberName = CSz("GameApi"); + cs MemberName = CSz("Settings"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(application_api*, &Element->GameApi), + Cast(engine_settings*, &Element->Settings), MemberName, Params ); @@ -129,11 +105,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs - cs MemberName = CSz("EngineApi"); + cs MemberName = CSz("Ui"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(engine_api*, &Element->EngineApi), + Cast(renderer_2d*, &Element->Ui), MemberName, Params ); diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index 83b7ade75..2d3089f60 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -32,7 +32,7 @@ InitializeBloomDownsampleShader( bloom_downsample_shader *Struct link_internal void UseShader( bloom_downsample_shader *Struct ) { - GetStdlib()->GL.UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index 21f0f2265..0f776a83b 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -32,7 +32,7 @@ InitializeBloomUpsampleShader( bloom_upsample_shader *Struct link_internal void UseShader( bloom_upsample_shader *Struct ) { - GetStdlib()->GL.UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_lighting_render_group.h b/generated/shader_magic_lighting_render_group.h index b79497a03..a10295ad2 100644 --- a/generated/shader_magic_lighting_render_group.h +++ b/generated/shader_magic_lighting_render_group.h @@ -132,7 +132,7 @@ InitializeLightingRenderGroup( lighting_render_group *Struct link_internal void UseShader( lighting_render_group *Struct ) { - GetStdlib()->GL.UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index ce45e2a11..4dc59e75a 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -41,7 +41,7 @@ InitializeShadowMapShader( shadow_map_shader *Struct link_internal void UseShader( shadow_map_shader *Struct ) { - GetStdlib()->GL.UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index 7ddc36a28..c54c7ca8f 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -41,7 +41,7 @@ InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Str link_internal void UseShader( terrain_decoration_render_context *Struct ) { - GetStdlib()->GL.UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_derivs_render_context.h b/generated/shader_magic_struct_terrain_derivs_render_context.h index 2e35e13f4..e3adef5ef 100644 --- a/generated/shader_magic_struct_terrain_derivs_render_context.h +++ b/generated/shader_magic_struct_terrain_derivs_render_context.h @@ -32,7 +32,7 @@ InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct link_internal void UseShader( terrain_derivs_render_context *Struct ) { - GetStdlib()->GL.UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index a069a8b84..388e9fa03 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -32,7 +32,7 @@ InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct link_internal void UseShader( terrain_finalize_render_context *Struct ) { - GetStdlib()->GL.UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index ec2439ef6..05a3c139b 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -37,7 +37,7 @@ InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct link_internal void UseShader( terrain_shaping_render_context *Struct ) { - GetStdlib()->GL.UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index d24d92476..c5c8c8c69 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -41,7 +41,7 @@ InitializeWorldEditRenderContext( world_edit_render_context *Struct link_internal void UseShader( world_edit_render_context *Struct ) { - GetStdlib()->GL.UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Struct->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; diff --git a/jesse.make.sh b/jesse.make.sh index bbc35e240..384beb04f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,7 +11,7 @@ ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ - # BuildExecutables \ + BuildExecutables \ # BuildTests \ # BuildSingleExample examples/ui_test \ # BuildSingleExample examples/blank_project \ diff --git a/src/engine/bloom.cpp b/src/engine/bloom.cpp index 560d84de5..7c447bdc7 100644 --- a/src/engine/bloom.cpp +++ b/src/engine/bloom.cpp @@ -21,8 +21,8 @@ InitBloomRenderGroup(bloom_render_group *Group, render_settings *Settings, memor // Bloom FBO { Group->BlurFBO = GenFramebuffer(); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Group->BlurFBO.ID); - GetStdlib()->GL.BindTexture(GL_TEXTURE_2D, Group->Tex.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Group->BlurFBO.ID); + GetGL()->BindTexture(GL_TEXTURE_2D, Group->Tex.ID); FramebufferTexture(&Group->BlurFBO, &Group->Tex); SetDrawBuffers(&Group->BlurFBO); if (CheckAndClearFramebuffer() == False) { Error("Initializing Bloom FBO"); } @@ -40,13 +40,13 @@ RunBloomRenderPass(graphics *Graphics) { bloom_render_group *Group = &Graphics->Bloom; - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Group->BlurFBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Group->BlurFBO.ID); // Setup VBO for fullscreen quad Assert(Global_QuadVertexBuffer); - GetStdlib()->GL.EnableVertexAttribArray(0); - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Global_QuadVertexBuffer); - GetStdlib()->GL.VertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + GetGL()->EnableVertexAttribArray(0); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Global_QuadVertexBuffer); + GetGL()->VertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); AssertNoGlErrors; // @@ -56,10 +56,10 @@ RunBloomRenderPass(graphics *Graphics) UseShader(&Group->DownsampleShader); // Activate the 0th texture unit - GetStdlib()->GL.ActiveTexture(GL_TEXTURE0); + GetGL()->ActiveTexture(GL_TEXTURE0); // LuminanceTex is the source for the bloom, start with it as the source tex - GetStdlib()->GL.BindTexture(GL_TEXTURE_2D, Graphics->Lighting.LuminanceTex.ID); + GetGL()->BindTexture(GL_TEXTURE_2D, Graphics->Lighting.LuminanceTex.ID); v2 SrcDim = V2(Graphics->Lighting.LuminanceTex.Dim); RangeIterator(MipIndex, BLOOM_MIP_CHAIN_COUNT) @@ -69,10 +69,10 @@ RunBloomRenderPass(graphics *Graphics) BindUniformByName(&Group->DownsampleShader.Program, "SrcDim", &SrcDim); - GetStdlib()->GL.FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, MipTex->ID, 0); + GetGL()->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, MipTex->ID, 0); Draw(6); - GetStdlib()->GL.BindTexture(GL_TEXTURE_2D, MipTex->ID); // Make current mip the source for next iteration + GetGL()->BindTexture(GL_TEXTURE_2D, MipTex->ID); // Make current mip the source for next iteration SrcDim = V2(MipTex->Dim); } @@ -89,22 +89,22 @@ RunBloomRenderPass(graphics *Graphics) texture *MipTex = Group->MipChain + MipIndex; SetViewport(MipTex->Dim); - GetStdlib()->GL.FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, MipTex->ID, 0); + GetGL()->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, MipTex->ID, 0); Draw(6); - GetStdlib()->GL.BindTexture(GL_TEXTURE_2D, MipTex->ID); // Make current mip the source for next iteration + GetGL()->BindTexture(GL_TEXTURE_2D, MipTex->ID); // Make current mip the source for next iteration SrcDim = V2(MipTex->Dim); } // Final upsample into full-res texture SetViewport(Group->Tex.Dim); - GetStdlib()->GL.FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, Group->Tex.ID, 0); + GetGL()->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, Group->Tex.ID, 0); Draw(6); // Teardown VBO - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, 0); - GetStdlib()->GL.DisableVertexAttribArray(0); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, 0); + GetGL()->DisableVertexAttribArray(0); } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 83bc2ec78..bb2b9deb9 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2639,7 +2639,7 @@ DoLevelWindow(engine_resources *Engine) Ensure(Read_u64(&LevelBytes) == Delimeter); Assert(ThreadLocal_ThreadIndex == 0); - if (Engine->GameApi.OnLibraryLoad) { Engine->GameApi.OnLibraryLoad(Engine, GetThreadLocalState(ThreadLocal_ThreadIndex)); } + if (Engine->Stdlib.AppApi.OnLibraryLoad) { Engine->Stdlib.AppApi.OnLibraryLoad(Engine, GetThreadLocalState(ThreadLocal_ThreadIndex)); } UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); } diff --git a/src/engine/gpu_mapped_buffer.cpp b/src/engine/gpu_mapped_buffer.cpp index 3b579ad96..9c7ac85ad 100644 --- a/src/engine/gpu_mapped_buffer.cpp +++ b/src/engine/gpu_mapped_buffer.cpp @@ -14,10 +14,10 @@ FlushBuffersToCard(gpu_mapped_element_buffer *Buffer) AssertNoGlErrors; - GetStdlib()->GL.EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); - GetStdlib()->GL.EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); - GetStdlib()->GL.EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); - GetStdlib()->GL.EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); + GetGL()->EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); + GetGL()->EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); + GetGL()->EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); + GetGL()->EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); AssertNoGlErrors; @@ -28,27 +28,27 @@ FlushBuffersToCard(gpu_mapped_element_buffer *Buffer) case DataType_v3: { - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GetStdlib()->GL.VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); - BufferUnmapped = GetStdlib()->GL.UnmapBuffer(GL_ARRAY_BUFFER); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + BufferUnmapped = GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GetStdlib()->GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); - BufferUnmapped &= GetStdlib()->GL.UnmapBuffer(GL_ARRAY_BUFFER); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + BufferUnmapped &= GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; } break; case DataType_v3_u8: { - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GetStdlib()->GL.VertexAttribIPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, 0, (void*)0); - BufferUnmapped = GetStdlib()->GL.UnmapBuffer(GL_ARRAY_BUFFER); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->VertexAttribIPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, 0, (void*)0); + BufferUnmapped = GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GetStdlib()->GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); - BufferUnmapped &= GetStdlib()->GL.UnmapBuffer(GL_ARRAY_BUFFER); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); + BufferUnmapped &= GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; } break; @@ -59,10 +59,10 @@ FlushBuffersToCard(gpu_mapped_element_buffer *Buffer) const u32 MtlFloatElements = sizeof(matl)/sizeof(u8); CAssert(MtlFloatElements == 4); - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); - GetStdlib()->GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf( ColorIndex, matl)) ); - GetStdlib()->GL.VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof - BufferUnmapped &= GetStdlib()->GL.UnmapBuffer(GL_ARRAY_BUFFER); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetGL()->VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf( ColorIndex, matl)) ); + GetGL()->VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof + BufferUnmapped &= GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; if (BufferUnmapped == False) { Error("glUnmapBuffer Failed"); } @@ -92,19 +92,19 @@ AllocateGpuElementBuffer(gpu_element_buffer_handles *Handles, data_type Type, u3 case DataType_v3: { u32 v3Size = sizeof(v3)*ElementCount; - GetStdlib()->GL.GenBuffers(3, &Handles->VertexHandle); + GetGL()->GenBuffers(3, &Handles->VertexHandle); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GetStdlib()->GL.BufferData(GL_ARRAY_BUFFER, v3Size, 0, GL_STATIC_DRAW); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BufferData(GL_ARRAY_BUFFER, v3Size, 0, GL_STATIC_DRAW); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GetStdlib()->GL.BufferData(GL_ARRAY_BUFFER, v3Size, 0, GL_STATIC_DRAW); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BufferData(GL_ARRAY_BUFFER, v3Size, 0, GL_STATIC_DRAW); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); - GetStdlib()->GL.BufferData(GL_ARRAY_BUFFER, matlSize, 0, GL_STATIC_DRAW); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetGL()->BufferData(GL_ARRAY_BUFFER, matlSize, 0, GL_STATIC_DRAW); AssertNoGlErrors; } break; @@ -112,25 +112,25 @@ AllocateGpuElementBuffer(gpu_element_buffer_handles *Handles, data_type Type, u3 case DataType_v3_u8: { u32 v3u8Size = sizeof(v3_u8)*ElementCount; - GetStdlib()->GL.GenBuffers(3, &Handles->VertexHandle); + GetGL()->GenBuffers(3, &Handles->VertexHandle); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GetStdlib()->GL.BufferData(GL_ARRAY_BUFFER, v3u8Size, 0, GL_STATIC_DRAW); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BufferData(GL_ARRAY_BUFFER, v3u8Size, 0, GL_STATIC_DRAW); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GetStdlib()->GL.BufferData(GL_ARRAY_BUFFER, v3u8Size, 0, GL_STATIC_DRAW); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BufferData(GL_ARRAY_BUFFER, v3u8Size, 0, GL_STATIC_DRAW); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); - GetStdlib()->GL.BufferData(GL_ARRAY_BUFFER, matlSize, 0, GL_STATIC_DRAW); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetGL()->BufferData(GL_ARRAY_BUFFER, matlSize, 0, GL_STATIC_DRAW); AssertNoGlErrors; } break; } - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, 0); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, 0); AssertNoGlErrors; } @@ -144,7 +144,7 @@ AllocateGpuElementBuffer(gpu_mapped_element_buffer *GpuMap, data_type Type, u32 link_internal void DeallocateGpuElementBuffer(gpu_element_buffer_handles *Handles) { - GetStdlib()->GL.DeleteBuffers(3, &Handles->VertexHandle); + GetGL()->DeleteBuffers(3, &Handles->VertexHandle); Clear(Handles); } @@ -178,20 +178,20 @@ MapGpuBuffer_untextured_3d_geometry_buffer(gpu_element_buffer_handles *Handles) { u32 BufferSize = sizeof(v3)*Handles->ElementCount; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); AssertNoGlErrors; - Buffer.Verts = (v3*) GetStdlib()->GL.MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); + Buffer.Verts = (v3*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); AssertNoGlErrors; - Buffer.Normals = (v3*) GetStdlib()->GL.MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); + Buffer.Normals = (v3*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; // Color data - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); AssertNoGlErrors; - Buffer.Mat = (matl*) GetStdlib()->GL.MapBufferRange(GL_ARRAY_BUFFER, 0, MaterialBufferSize, GL_MAP_WRITE_BIT); + Buffer.Mat = (matl*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, MaterialBufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; } break; @@ -200,20 +200,20 @@ MapGpuBuffer_untextured_3d_geometry_buffer(gpu_element_buffer_handles *Handles) { u32 BufferSize = sizeof(v3_u8)*Handles->ElementCount; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); AssertNoGlErrors; - Buffer.Verts = (v3_u8*) GetStdlib()->GL.MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); + Buffer.Verts = (v3_u8*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); AssertNoGlErrors; - Buffer.Normals = (v3_u8*) GetStdlib()->GL.MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); + Buffer.Normals = (v3_u8*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; // Color data - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); AssertNoGlErrors; - Buffer.Mat = (matl*) GetStdlib()->GL.MapBufferRange(GL_ARRAY_BUFFER, 0, MaterialBufferSize, GL_MAP_WRITE_BIT); + Buffer.Mat = (matl*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, MaterialBufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; } break; @@ -224,7 +224,7 @@ MapGpuBuffer_untextured_3d_geometry_buffer(gpu_element_buffer_handles *Handles) if (!Buffer.Normals) { Error("Allocating gpu_mapped_element_buffer::Normals"); } if (!Buffer.Mat) { Error("Allocating gpu_mapped_element_buffer::Mat"); } - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, 0); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, 0); return {*Handles, Buffer}; } diff --git a/src/engine/render.cpp b/src/engine/render.cpp index e2e7d4242..a63665986 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -2,12 +2,12 @@ void RenderAoTexture(v2i ApplicationResolution, ao_render_group *AoGroup) { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, AoGroup->FBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, AoGroup->FBO.ID); SetViewport(ApplicationResolution/2); - GetStdlib()->GL.UseProgram(AoGroup->Shader.ID); + GetGL()->UseProgram(AoGroup->Shader.ID); - GetStdlib()->GL.Uniform3fv(AoGroup->SsaoKernelUniform, SSAO_KERNEL_SIZE, (r32*)AoGroup->SsaoKernel); + GetGL()->Uniform3fv(AoGroup->SsaoKernelUniform, SSAO_KERNEL_SIZE, (r32*)AoGroup->SsaoKernel); BindShaderUniforms(&AoGroup->Shader); @@ -35,14 +35,14 @@ UpdateLightingTextures(game_lights *Lights) u32 Type = GL_TEXTURE_2D; - GetStdlib()->GL.BindTexture(Type, Lights->PositionTex.ID); - GetStdlib()->GL.TexImage2D( Type, 0, GL_RGB32F, + GetGL()->BindTexture(Type, Lights->PositionTex.ID); + GetGL()->TexImage2D( Type, 0, GL_RGB32F, Lights->PositionTex.Dim.x, Lights->PositionTex.Dim.y, 0, GL_RGB, GL_FLOAT, PosData); AssertNoGlErrors; - GetStdlib()->GL.BindTexture(Type, Lights->ColorTex.ID); - GetStdlib()->GL.TexImage2D( Type, 0, GL_RGB32F, + GetGL()->BindTexture(Type, Lights->ColorTex.ID); + GetGL()->TexImage2D( Type, 0, GL_RGB32F, Lights->ColorTex.Dim.x, Lights->ColorTex.Dim.y, 0, GL_RGB, GL_FLOAT, ColorData); AssertNoGlErrors; @@ -54,10 +54,10 @@ UpdateLightingTextures(game_lights *Lights) link_internal void Debug_DrawTextureToDebugQuad( shader *DebugShader ) { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, 0); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); SetViewport(V2(256)); - GetStdlib()->GL.UseProgram(DebugShader->ID); + GetGL()->UseProgram(DebugShader->ID); BindShaderUniforms(DebugShader); RenderQuad(); @@ -90,14 +90,14 @@ RenderImmediateGeometryToShadowMap(world *World, graphics *Graphics, gpu_mapped_ shadow_render_group *SG = Graphics->SG; - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); SetViewport(GetShadowMapResolution(&GetEngineResources()->Settings)); UseShader(&SG->Shader); Draw(GpuMap->Buffer.At); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, 0); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); return; } @@ -109,18 +109,18 @@ RenderImmediateGeometryToGBuffer(v2i ApplicationResolution, gpu_mapped_element_b auto GBufferRenderGroup = Graphics->gBuffer; - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, GBufferRenderGroup->FBO.ID); - GetStdlib()->GL.UseProgram(GBufferRenderGroup->gBufferShader.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, GBufferRenderGroup->FBO.ID); + GetGL()->UseProgram(GBufferRenderGroup->gBufferShader.ID); SetViewport(ApplicationResolution); BindShaderUniforms(&GBufferRenderGroup->gBufferShader); // TODO(Jesse): Hoist this check out of here - GetStdlib()->GL.Disable(GL_CULL_FACE); + GetGL()->Disable(GL_CULL_FACE); Draw(GpuMap->Buffer.At); /* DrawGpuBufferImmediate(GpuMap->Handles); */ - GetStdlib()->GL.Enable(GL_CULL_FACE); + GetGL()->Enable(GL_CULL_FACE); CleanupTextureBindings(&GBufferRenderGroup->gBufferShader); @@ -130,15 +130,15 @@ RenderImmediateGeometryToGBuffer(v2i ApplicationResolution, gpu_mapped_element_b link_internal void CompositeGameTexturesAndDisplay( platform *Plat, graphics *Graphics ) { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, 0); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); SetViewport(Plat->ScreenDim); - GetStdlib()->GL.Enable(GL_BLEND); - GetStdlib()->GL.BlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); + GetGL()->Enable(GL_BLEND); + GetGL()->BlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); UseShader(&Graphics->CompositeGroup.Shader); - GetStdlib()->GL.Disable(GL_BLEND); + GetGL()->Disable(GL_BLEND); RenderQuad(); @@ -158,12 +158,12 @@ RenderLuminanceTexture(v2i ApplicationResolution, gpu_mapped_element_buffer *Gpu // TODO(Jesse): Explain this. Graphics->SG->Shader.ViewProjection = NdcToScreenSpace * Graphics->SG->Shader.ViewProjection; - /* GetStdlib()->GL.Enable(GL_BLEND); */ - /* GetStdlib()->GL.BlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); */ + /* GetGL()->Enable(GL_BLEND); */ + /* GetGL()->BlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); */ - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Lighting->FBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Lighting->FBO.ID); -/* GetStdlib()->GL.Disable(GL_BLEND); */ +/* GetGL()->Disable(GL_BLEND); */ { UseShader(&Lighting->Program); @@ -198,11 +198,11 @@ GaussianBlurTexture(gaussian_render_group *Group, texture *TexIn, framebuffer *D if (last_iteration) { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, DestFBO->ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, DestFBO->ID); } else { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Group->FBOs[horizontal].ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Group->FBOs[horizontal].ID); } AssertNoGlErrors; @@ -218,7 +218,7 @@ GaussianBlurTexture(gaussian_render_group *Group, texture *TexIn, framebuffer *D Tex = &Group->Textures[!horizontal]; } - /* GetStdlib()->GL.BindTexture( GL_TEXTURE_2D, Tex->ID ); */ + /* GetGL()->BindTexture( GL_TEXTURE_2D, Tex->ID ); */ BindUniformByName(&Group->Shader, "SrcImage", Tex, 0); AssertNoGlErrors; @@ -228,7 +228,7 @@ GaussianBlurTexture(gaussian_render_group *Group, texture *TexIn, framebuffer *D if (first_iteration) first_iteration = false; } - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, 0); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); } link_internal gpu_mapped_element_buffer * @@ -329,20 +329,20 @@ ClearFramebuffers(graphics *Graphics, render_entity_to_texture_group *RTTGroup) { TIMED_FUNCTION(); - GetStdlib()->GL.ClearColor(Graphics->SkyColor.r, Graphics->SkyColor.g, Graphics->SkyColor.b, 1.f); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->gBuffer->FBO.ID); - GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetGL()->ClearColor(Graphics->SkyColor.r, Graphics->SkyColor.g, Graphics->SkyColor.b, 1.f); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Graphics->gBuffer->FBO.ID); + GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); SetDefaultFramebufferClearColors(); - /* GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RTTGroup->FBO.ID); */ - /* GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); */ + /* GetGL()->BindFramebuffer(GL_FRAMEBUFFER, RTTGroup->FBO.ID); */ + /* GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); */ - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->SG->FramebufferName); - GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Graphics->SG->FramebufferName); + GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->Lighting.FBO.ID); - GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Graphics->Lighting.FBO.ID); + GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // TODO(Jesse): Why exactly would this not be necessary? /* glBindFramebuffer(GL_FRAMEBUFFER, Graphics->SG->FramebufferName); */ @@ -350,32 +350,32 @@ ClearFramebuffers(graphics *Graphics, render_entity_to_texture_group *RTTGroup) for (s32 Index = 0; Index < 2; ++Index) { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->Gaussian.FBOs[Index].ID); - GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Graphics->Gaussian.FBOs[Index].ID); + GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, 0); - GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); + GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (Graphics->Settings.BravoilMcGuireOIT) { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->Transparency.FBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Graphics->Transparency.FBO.ID); #if 1 - GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); #else { u32 Attachments = GL_COLOR_ATTACHMENT0; - GetStdlib()->GL.DrawBuffers(1, &Attachments); - GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetGL()->DrawBuffers(1, &Attachments); + GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } { u32 Attachments = GL_COLOR_ATTACHMENT0 + 1; - GetStdlib()->GL.DrawBuffers(1, &Attachments); - GetStdlib()->GL.ClearColor(1.f, 1.f, 1.f, 1.f); - GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT); + GetGL()->DrawBuffers(1, &Attachments); + GetGL()->ClearColor(1.f, 1.f, 1.f, 1.f); + GetGL()->Clear(GL_COLOR_BUFFER_BIT); } { @@ -386,8 +386,8 @@ ClearFramebuffers(graphics *Graphics, render_entity_to_texture_group *RTTGroup) } else { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->Transparency.FBO.ID); - GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Graphics->Transparency.FBO.ID); + GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } @@ -749,47 +749,47 @@ RenderTransparencyBuffers(v2i ApplicationResolution, render_settings *Settings, if (Group->GpuBuffer.Buffer.At) { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Group->FBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Group->FBO.ID); UseShader(&Group->Shader); if (Settings->BravoilMcGuireOIT) { SetViewport(ApplicationResolution); - GetStdlib()->GL.Disable(GL_CULL_FACE); + GetGL()->Disable(GL_CULL_FACE); - GetStdlib()->GL.Enable(GL_BLEND); - /* GetStdlib()->GL.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); */ + GetGL()->Enable(GL_BLEND); + /* GetGL()->BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); */ // TODO(Jesse): The portable version requires changing the shader a bit - /* GetStdlib()->GL.BlendFuncSeparate(GL_ONE, GL_ONE, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); */ + /* GetGL()->BlendFuncSeparate(GL_ONE, GL_ONE, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); */ - GetStdlib()->GL.BlendFunci(0, GL_ONE, GL_ONE); - GetStdlib()->GL.BlendFunci(1, GL_ONE, GL_ONE); - /* GetStdlib()->GL.BlendFunci(1, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); */ - /* GetStdlib()->GL.BlendFunci(1, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); */ + GetGL()->BlendFunci(0, GL_ONE, GL_ONE); + GetGL()->BlendFunci(1, GL_ONE, GL_ONE); + /* GetGL()->BlendFunci(1, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); */ + /* GetGL()->BlendFunci(1, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); */ Draw(Group->GpuBuffer.Buffer.At); - GetStdlib()->GL.Disable(GL_BLEND); + GetGL()->Disable(GL_BLEND); - GetStdlib()->GL.Enable(GL_CULL_FACE); + GetGL()->Enable(GL_CULL_FACE); } else { - GetStdlib()->GL.Enable(GL_BLEND); - GetStdlib()->GL.BlendFunc(GL_ONE, GL_ONE); - GetStdlib()->GL.Disable(GL_CULL_FACE); - /* GetStdlib()->GL.DepthFunc(GL_LEQUAL); */ - /* GetStdlib()->GL.DepthFunc(GL_ALWAYS); */ + GetGL()->Enable(GL_BLEND); + GetGL()->BlendFunc(GL_ONE, GL_ONE); + GetGL()->Disable(GL_CULL_FACE); + /* GetGL()->DepthFunc(GL_LEQUAL); */ + /* GetGL()->DepthFunc(GL_ALWAYS); */ SetViewport(ApplicationResolution); Draw(Group->GpuBuffer.Buffer.At); - GetStdlib()->GL.Disable(GL_BLEND); - GetStdlib()->GL.Enable(GL_CULL_FACE); - /* GetStdlib()->GL.DepthFunc(GL_LEQUAL); */ + GetGL()->Disable(GL_BLEND); + GetGL()->Enable(GL_CULL_FACE); + /* GetGL()->DepthFunc(GL_LEQUAL); */ } Group->GpuBuffer.Buffer.At = 0; @@ -806,8 +806,8 @@ SetupRenderToTextureShader(engine_resources *Engine, texture *Texture, camera *C // GL stuff { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RTTGroup->FBO.ID); - GetStdlib()->GL.BindTexture(GL_TEXTURE_2D, Texture->ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, RTTGroup->FBO.ID); + GetGL()->BindTexture(GL_TEXTURE_2D, Texture->ID); RTTGroup->FBO.Attachments = 0; FramebufferTexture(&RTTGroup->FBO, Texture); @@ -822,8 +822,8 @@ SetupRenderToTextureShader(engine_resources *Engine, texture *Texture, camera *C SetViewport(V2(Texture->Dim)); - GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - GetStdlib()->GL.Enable(GL_DEPTH_TEST); + GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetGL()->Enable(GL_DEPTH_TEST); } } return Result; @@ -834,18 +834,18 @@ SetupVertexAttribsFor_world_chunk_element_buffer(gpu_element_buffer_handles *Han { AssertNoGlErrors; - GetStdlib()->GL.EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); - GetStdlib()->GL.EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); - GetStdlib()->GL.EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); - GetStdlib()->GL.EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); + GetGL()->EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); + GetGL()->EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); + GetGL()->EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); + GetGL()->EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GetStdlib()->GL.VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, GL_FALSE, 0, (void*)0); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, GL_FALSE, 0, (void*)0); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GetStdlib()->GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); AssertNoGlErrors; @@ -854,10 +854,10 @@ SetupVertexAttribsFor_world_chunk_element_buffer(gpu_element_buffer_handles *Han const u32 MtlFloatElements = sizeof(matl)/sizeof(u8); CAssert(MtlFloatElements == 4); - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); - /* GetStdlib()->GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_UNSIGNED_INT, 0, 0); */ - GetStdlib()->GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf(ColorIndex, matl))); - GetStdlib()->GL.VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + /* GetGL()->VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_UNSIGNED_INT, 0, 0); */ + GetGL()->VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf(ColorIndex, matl))); + GetGL()->VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof AssertNoGlErrors; } @@ -865,10 +865,10 @@ link_internal void SetupVertexAttribsFor_u3d_geo_element_buffer(gpu_element_buffer_handles *Handles) { AssertNoGlErrors; - GetStdlib()->GL.EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); - GetStdlib()->GL.EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); - GetStdlib()->GL.EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); - GetStdlib()->GL.EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); + GetGL()->EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); + GetGL()->EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); + GetGL()->EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); + GetGL()->EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); AssertNoGlErrors; @@ -877,23 +877,23 @@ SetupVertexAttribsFor_u3d_geo_element_buffer(gpu_element_buffer_handles *Handles InvalidCase(DataType_Undefinded); case DataType_v3: { - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GetStdlib()->GL.VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GetStdlib()->GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); AssertNoGlErrors; } break; case DataType_v3_u8: { - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); - GetStdlib()->GL.VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, GL_FALSE, 0, (void*)0); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, GL_FALSE, 0, (void*)0); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); - GetStdlib()->GL.VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); AssertNoGlErrors; } break; } @@ -904,10 +904,10 @@ SetupVertexAttribsFor_u3d_geo_element_buffer(gpu_element_buffer_handles *Handles const u32 MtlFloatElements = sizeof(matl)/sizeof(u8); CAssert(MtlFloatElements == 4); - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); - /* GetStdlib()->GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_UNSIGNED_INT, 0, 0); */ - GetStdlib()->GL.VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf(ColorIndex, matl))); - GetStdlib()->GL.VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + /* GetGL()->VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_UNSIGNED_INT, 0, 0); */ + GetGL()->VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf(ColorIndex, matl))); + GetGL()->VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof AssertNoGlErrors; } @@ -921,12 +921,12 @@ DrawGpuBufferImmediate(gpu_element_buffer_handles *Handles) Draw(Handles->ElementCount); - GetStdlib()->GL.BindBuffer(GL_ARRAY_BUFFER, 0); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, 0); - GetStdlib()->GL.DisableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); - GetStdlib()->GL.DisableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); - GetStdlib()->GL.DisableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); - GetStdlib()->GL.DisableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); + GetGL()->DisableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); + GetGL()->DisableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); + GetGL()->DisableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); + GetGL()->DisableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); } poof( @@ -1036,7 +1036,7 @@ ReallocateGpuBuffers(gpu_element_buffer_handles *Handles, data_type Type, u32 El { if (Handles->VertexHandle) { - GetStdlib()->GL.DeleteBuffers(3, &Handles->VertexHandle); + GetGL()->DeleteBuffers(3, &Handles->VertexHandle); } Clear(Handles); @@ -1262,7 +1262,7 @@ RenderToTexture(engine_resources *Engine, asset_thumbnail *Thumb, untextured_3d_ FlushBuffersToCard(&RTTGroup->GeoBuffer); } - GetStdlib()->GL.Enable(GL_DEPTH_TEST); + GetGL()->Enable(GL_DEPTH_TEST); Draw(RTTGroup->GeoBuffer.Buffer.At); RTTGroup->GeoBuffer.Buffer.At = 0; } @@ -1356,14 +1356,14 @@ SetupGBufferShader(graphics *Graphics, v2i ApplicationResolution, b32 DoSelectio Graphics->MaxClipP_worldspace = {}; } - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, GBufferRenderGroup->FBO.ID); - GetStdlib()->GL.UseProgram(GBufferRenderGroup->gBufferShader.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, GBufferRenderGroup->FBO.ID); + GetGL()->UseProgram(GBufferRenderGroup->gBufferShader.ID); SetViewport(ApplicationResolution); BindShaderUniforms(&GBufferRenderGroup->gBufferShader); - GetStdlib()->GL.Disable(GL_CULL_FACE); + GetGL()->Disable(GL_CULL_FACE); AssertNoGlErrors; } @@ -1373,7 +1373,7 @@ TeardownGBufferShader(graphics *Graphics) { auto GBufferRenderGroup = Graphics->gBuffer; CleanupTextureBindings(&GBufferRenderGroup->gBufferShader); - GetStdlib()->GL.Enable(GL_CULL_FACE); + GetGL()->Enable(GL_CULL_FACE); } @@ -1398,13 +1398,13 @@ SetupShadowMapShader(world *World, graphics *Graphics, v2i ShadowMapResolution, Graphics->MaxClipP_worldspace = {}; } - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); SetViewport(ShadowMapResolution); UseShader(&SG->Shader); - GetStdlib()->GL.Disable(GL_CULL_FACE); + GetGL()->Disable(GL_CULL_FACE); AssertNoGlErrors; } @@ -1412,7 +1412,7 @@ SetupShadowMapShader(world *World, graphics *Graphics, v2i ShadowMapResolution, link_internal void TeardownShadowMapShader(graphics *Graphics) { - GetStdlib()->GL.Enable(GL_CULL_FACE); + GetGL()->Enable(GL_CULL_FACE); AssertNoGlErrors; } diff --git a/src/engine/render/gpu_timer.h b/src/engine/render/gpu_timer.h index 0c3f45686..284131dfa 100644 --- a/src/engine/render/gpu_timer.h +++ b/src/engine/render/gpu_timer.h @@ -19,17 +19,17 @@ StartGpuTimer(void) Global_ActiveGPUTimer = True; gpu_timer Result = {}; - GetStdlib()->GL.GenQueries(1, &Result.Handle); + GetGL()->GenQueries(1, &Result.Handle); Assert(Result.Handle != INVALID_GPU_TIMER_HANDLE); - GetStdlib()->GL.BeginQuery(GL_TIME_ELAPSED, Result.Handle); + GetGL()->BeginQuery(GL_TIME_ELAPSED, Result.Handle); return Result; } link_internal void EndGpuTimer(gpu_timer *Timer) { - GetStdlib()->GL.EndQuery(GL_TIME_ELAPSED); + GetGL()->EndQuery(GL_TIME_ELAPSED); Assert(Global_ActiveGPUTimer == True); Global_ActiveGPUTimer = False; } @@ -39,12 +39,12 @@ QueryGpuTimer(gpu_timer *Timer) { Assert(Timer->Handle != INVALID_GPU_TIMER_HANDLE); s32 Available = False; - GetStdlib()->GL.GetQueryObjectiv(Timer->Handle, GL_QUERY_RESULT_AVAILABLE, &Available); + GetGL()->GetQueryObjectiv(Timer->Handle, GL_QUERY_RESULT_AVAILABLE, &Available); if (Available) { - GetStdlib()->GL.GetQueryObjectui64v(Timer->Handle, GL_QUERY_RESULT, &Timer->Ns); - GetStdlib()->GL.DeleteQueries(1, &Timer->Handle); + GetGL()->GetQueryObjectui64v(Timer->Handle, GL_QUERY_RESULT, &Timer->Ns); + GetGL()->DeleteQueries(1, &Timer->Handle); Timer->Handle = INVALID_GPU_TIMER_HANDLE; } diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 67ad1e800..4b8c44f0d 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -8,7 +8,7 @@ SetDrawBuffers(framebuffer *FBO) Attachments[AttIndex] = GL_COLOR_ATTACHMENT0 + AttIndex; } - GetStdlib()->GL.DrawBuffers((s32)FBO->Attachments, Attachments); + GetGL()->DrawBuffers((s32)FBO->Attachments, Attachments); } void @@ -214,7 +214,7 @@ framebuffer GenFramebuffer() { framebuffer Framebuffer = {}; - GetStdlib()->GL.GenFramebuffers(1, &Framebuffer.ID); + GetGL()->GenFramebuffers(1, &Framebuffer.ID); return Framebuffer; } @@ -247,14 +247,14 @@ MakeGaussianBlurRenderGroup(v2 *ApplicationResolution, memory_arena *GraphicsMem // TODO(Jesse)(make_texture_rgba): Can we use MakeTexture_RGBA for (s32 Index = 0; Index < 2; ++Index) { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Result.FBOs[Index].ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Result.FBOs[Index].ID); AssertNoGlErrors; u32 Channels = 4; u32 Slices = 1; texture_storage_format StorageFormat = TextureStorageFormat_RGBA32F; Result.Textures[Index] = GenTexture(V2i(*ApplicationResolution), CSz("GaussianBlur"), StorageFormat, Channels, Slices); - GetStdlib()->GL.TexImage2D( GL_TEXTURE_2D, 0, GL_RGBA32F, s32(ApplicationResolution->x), s32(ApplicationResolution->y), 0, GL_RGBA, GL_FLOAT, 0); + GetGL()->TexImage2D( GL_TEXTURE_2D, 0, GL_RGBA32F, s32(ApplicationResolution->x), s32(ApplicationResolution->y), 0, GL_RGBA, GL_FLOAT, 0); AssertNoGlErrors; @@ -354,7 +354,7 @@ MakeSsaoShader( memory_arena *GraphicsMemory, link_internal bool InitAoRenderGroup(v2i ApplicationResolution, ao_render_group *AoGroup) { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, AoGroup->FBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, AoGroup->FBO.ID); b32 IsDepthTexture = False; AoGroup->Texture = MakeTexture_SingleChannel( ApplicationResolution/2, CSz("AoTexture"), IsDepthTexture, TextureStorageFormat_R16F); @@ -374,9 +374,9 @@ InitAoRenderGroup(v2i ApplicationResolution, ao_render_group *AoGroup) bool InitGbufferRenderGroup(v2i ApplicationResolution, g_buffer_render_group *gBuffer) { - GetStdlib()->GL.GenQueries(1, &gBuffer->GlTimerObject); + GetGL()->GenQueries(1, &gBuffer->GlTimerObject); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, gBuffer->FBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, gBuffer->FBO.ID); gBuffer->Textures.Color = MakeTexture_RGBA(ApplicationResolution, (v4*)0, CSz("gBufferColor"), 1, TextureStorageFormat_RGBA16F); gBuffer->Textures.Normal = MakeTexture_RGB( ApplicationResolution, (v3*)0, CSz("gBufferNormal"), 1, TextureStorageFormat_RGBA16F); @@ -403,7 +403,7 @@ InitRenderToTextureGroup(render_entity_to_texture_group *Group, texture *ColorPa AllocateGpuElementBuffer(&Group->GeoBuffer, DataType_v3, (u32)Megabytes(1)); Group->FBO = GenFramebuffer(); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Group->FBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Group->FBO.ID); // TODO(Jesse): Should we not hard-code the depth texture size here? texture DepthTexture = MakeDepthTexture( V2i(1024), CSz("RenderToTexture Depth")); @@ -445,7 +445,7 @@ InitTransparencyRenderGroup(render_settings *Settings, transparency_render_group AllocateGpuElementBuffer(&Group->GpuBuffer, DataType_v3, (u32)Megabytes(1)); Group->FBO = GenFramebuffer(); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Group->FBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Group->FBO.ID); // TODO(Jesse)(make_texture_rgba) : ? { @@ -453,7 +453,7 @@ InitTransparencyRenderGroup(render_settings *Settings, transparency_render_group u32 Slices = 1; texture_storage_format StorageFormat = TextureStorageFormat_RGBA16F; Group->AccumTex = GenTexture(TextureSize, CSz("Transparency Accum"), StorageFormat, Channels, Slices); - GetStdlib()->GL.TexImage2D( GL_TEXTURE_2D, 0, StorageFormat, TextureSize.x, TextureSize.y, 0, GL_RGBA, GL_FLOAT, 0); + GetGL()->TexImage2D( GL_TEXTURE_2D, 0, StorageFormat, TextureSize.x, TextureSize.y, 0, GL_RGBA, GL_FLOAT, 0); } { @@ -461,7 +461,7 @@ InitTransparencyRenderGroup(render_settings *Settings, transparency_render_group u32 Slices = 1; texture_storage_format StorageFormat = TextureStorageFormat_RG16F; Group->RevealTex = GenTexture(TextureSize, CSz("Transparency Reveal"), StorageFormat, Channels, Slices); - GetStdlib()->GL.TexImage2D( GL_TEXTURE_2D, 0, StorageFormat, TextureSize.x, TextureSize.y, 0, GL_RG, GL_FLOAT, 0); + GetGL()->TexImage2D( GL_TEXTURE_2D, 0, StorageFormat, TextureSize.x, TextureSize.y, 0, GL_RG, GL_FLOAT, 0); } // NOTE(Jesse): These have to be bound in this order because they're cleared @@ -646,7 +646,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Lighting->FBO = GenFramebuffer(); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Lighting->FBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Lighting->FBO.ID); FramebufferTexture(&Lighting->FBO, &Lighting->LuminanceTex); /* FramebufferTexture(&Lighting->FBO, &Lighting->Bloom.Tex); */ SetDrawBuffers(&Lighting->FBO); @@ -725,7 +725,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr RangeIterator(Index, 3) { WorldEditRC->PingPongFBOs[Index] = GenFramebuffer(); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[Index].ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[Index].ID); WorldEditRC->PingPongTextures[Index] = MakeTexture_RGBA(TextureDim, Cast(v4*, 0), CSz("PingPongTexture"), 1, TextureStorageFormat_RGBA32F); @@ -747,7 +747,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr RC->DestFBO = GenFramebuffer(); RC->DestTex = MakeTexture_RGBA(V2i(68, 68*68), Cast(v4*, 0), CSz("TerrainShaping"), 1, TextureStorageFormat_RGBA32F); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); FramebufferTexture(&RC->DestFBO, &RC->DestTex); SetDrawBuffers(&RC->DestFBO); @@ -766,7 +766,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr RC->DestFBO = GenFramebuffer(); RC->DestTex = MakeTexture_RGB(TextureDim, Cast(v3*, 0), CSz("TerrainDerivs"), 1, TextureStorageFormat_RGB32F); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); FramebufferTexture(&RC->DestFBO, &RC->DestTex); SetDrawBuffers(&RC->DestFBO); @@ -785,7 +785,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr TerrainDecorationRC->DestFBO = &WorldEditRC->PingPongFBOs[0]; TerrainDecorationRC->DestTex = &WorldEditRC->PingPongTextures[0]; - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->DestFBO->ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, TerrainDecorationRC->DestFBO->ID); FramebufferTexture(TerrainDecorationRC->DestFBO, TerrainDecorationRC->DestTex); SetDrawBuffers(TerrainDecorationRC->DestFBO); @@ -802,16 +802,16 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr { terrain_finalize_render_context *TerrainFinalizeRC = &Result->TerrainFinalizeRC; Result->TerrainFinalizeRC.FBO = GenFramebuffer(); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Result->TerrainFinalizeRC.FBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Result->TerrainFinalizeRC.FBO.ID); { u32 Channels = 1; u32 Slices = 1; // @shared_terrain_texture TerrainFinalizeRC->DestTex = GenTexture(TextureDim, CSz("TerrainFinalizeTexture"), TextureStorageFormat_R16I, Channels, Slices, False); - GetStdlib()->GL.TexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, TextureDim.x, TextureDim.y, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); + GetGL()->TexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, TextureDim.x, TextureDim.y, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); AssertNoGlErrors; - GetStdlib()->GL.BindTexture(GL_TEXTURE_2D, 0); + GetGL()->BindTexture(GL_TEXTURE_2D, 0); } FramebufferTexture(&Result->TerrainFinalizeRC.FBO, &TerrainFinalizeRC->DestTex); SetDrawBuffers(&Result->TerrainFinalizeRC.FBO); @@ -822,8 +822,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Ensure(CheckAndClearFramebuffer()); } - GetStdlib()->GL.Enable(GL_CULL_FACE); - GetStdlib()->GL.CullFace(GL_BACK); + GetGL()->Enable(GL_CULL_FACE); + GetGL()->CullFace(GL_BACK); AssertNoGlErrors; diff --git a/src/engine/render/shadow_map.h b/src/engine/render/shadow_map.h index 8fcfeed72..660d129b2 100644 --- a/src/engine/render/shadow_map.h +++ b/src/engine/render/shadow_map.h @@ -31,9 +31,9 @@ link_internal b32 InitializeShadowRenderGroup(graphics *Graphics, shadow_render_group *SG, v2i ShadowMapResolution) { // The framebuffer, which regroups 0, 1, or more textures, and 0 or 1 depth buffer. - GetStdlib()->GL.GenFramebuffers(1, &SG->FramebufferName); + GetGL()->GenFramebuffers(1, &SG->FramebufferName); Assert(SG->FramebufferName); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); SG->ShadowMap = MakeDepthTexture(ShadowMapResolution, CSz("ShadowDepth")); @@ -50,11 +50,11 @@ InitializeShadowRenderGroup(graphics *Graphics, shadow_render_group *SG, v2i Sha AssertNoGlErrors; - if( GetStdlib()->GL.CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + if( GetGL()->CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) return false; - GetStdlib()->GL.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, 0); + GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); InitializeShadowMapShader( &SG->Shader , IdentityMatrix, IdentityMatrix, &Graphics->MinClipP_worldspace, &Graphics->MaxClipP_worldspace ); diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 50aac5c69..db0c33f49 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -43,7 +43,7 @@ DrainRenderQueue(engine_resources *Engine) b32 Done = False; while (!Done) { - u32 SyncStatus = GetStdlib()->GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); + u32 SyncStatus = GetGL()->ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); switch(SyncStatus) { case GL_ALREADY_SIGNALED: @@ -52,8 +52,8 @@ DrainRenderQueue(engine_resources *Engine) AtomicDecrement(&Graphics->NoiseFinalizeJobsPending); TIMED_NAMED_BLOCK(MapBuffer); AssertNoGlErrors; - GetStdlib()->GL.DeleteBuffers(1, &PBOJob->PBOBuf.PBO); - GetStdlib()->GL.DeleteSync(PBOJob->PBOBuf.Fence); + GetGL()->DeleteBuffers(1, &PBOJob->PBOBuf.PBO); + GetGL()->DeleteSync(PBOJob->PBOBuf.Fence); AssertNoGlErrors; /* RemoveUnordered(&Graphics->NoiseReadbackJobs, JobIndex); */ Done = True; @@ -122,13 +122,13 @@ DrainRenderQueue(engine_resources *Engine) gpu_readback_buffer PBOBuf = Command->PBOBuf; /* Info("(%d) Binding and Deallocating PBO (%u)", ThreadLocal_ThreadIndex, PBOBuf.PBO); */ - GetStdlib()->GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOBuf.PBO); + GetGL()->BindBuffer(GL_PIXEL_PACK_BUFFER, PBOBuf.PBO); AssertNoGlErrors; - GetStdlib()->GL.UnmapBuffer(GL_PIXEL_PACK_BUFFER); + GetGL()->UnmapBuffer(GL_PIXEL_PACK_BUFFER); AssertNoGlErrors; - GetStdlib()->GL.DeleteBuffers(1, &PBOBuf.PBO); + GetGL()->DeleteBuffers(1, &PBOBuf.PBO); AssertNoGlErrors; - GetStdlib()->GL.DeleteSync(PBOBuf.Fence); + GetGL()->DeleteSync(PBOBuf.Fence); AssertNoGlErrors; } break; @@ -176,7 +176,7 @@ DrainRenderQueue(engine_resources *Engine) { tmatch(bonsai_render_command_deallocate_buffers, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_deallocate_buffers); - if (*Command->Buffers) { GetStdlib()->GL.DeleteBuffers(Command->Count, Command->Buffers); } + if (*Command->Buffers) { GetGL()->DeleteBuffers(Command->Count, Command->Buffers); } RangeIterator(Index, Command->Count) { Command->Buffers[Index] = 0; } } break; @@ -347,7 +347,7 @@ DrainRenderQueue(engine_resources *Engine) RangeIterator(LayerIndex, Brush->LayerCount) { - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[CurrentWriteTextureIndex].ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, WorldEditRC->PingPongFBOs[CurrentWriteTextureIndex].ID); BindUniformByName(&WorldEditRC->Program, "SampleInputTex", BindInputTexture); if (BindInputTexture) @@ -594,7 +594,7 @@ DrainRenderQueue(engine_resources *Engine) // { TIMED_NAMED_BLOCK(TerrainFinalizeDrawCall); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, Graphics->TerrainFinalizeRC.FBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Graphics->TerrainFinalizeRC.FBO.ID); UseShader(&Graphics->TerrainFinalizeRC); @@ -622,18 +622,18 @@ DrainRenderQueue(engine_resources *Engine) { TIMED_NAMED_BLOCK(GenPboAndInitTransfer); u32 PBO; - GetStdlib()->GL.GenBuffers(1, &PBO); + GetGL()->GenBuffers(1, &PBO); AssertNoGlErrors; /* Info("(%d) Allocated PBO (%u)", ThreadLocal_ThreadIndex, PBO); */ - GetStdlib()->GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); - GetStdlib()->GL.BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); + GetGL()->BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); + GetGL()->BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); AssertNoGlErrors; - GetStdlib()->GL.ReadPixels(0, 0, CurrentAccumulationTexture->Dim.x, CurrentAccumulationTexture->Dim.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); + GetGL()->ReadPixels(0, 0, CurrentAccumulationTexture->Dim.x, CurrentAccumulationTexture->Dim.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); AssertNoGlErrors; - GetStdlib()->GL.BindBuffer(GL_PIXEL_PACK_BUFFER, 0); + GetGL()->BindBuffer(GL_PIXEL_PACK_BUFFER, 0); - gl_fence Fence = GetStdlib()->GL.FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + gl_fence Fence = GetGL()->FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); dummy_work_queue_entry_build_chunk_mesh Readback = { {PBO,Fence}, NoiseDim, Node}; Push(&Graphics->NoiseReadbackJobs, &Readback); @@ -765,21 +765,21 @@ DrainRenderQueue(engine_resources *Engine) { tmatch(bonsai_render_command_gl_timer_init, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_init); AssertNoGlErrors; - GetStdlib()->GL.GenQueries(1, Command->GlTimerObject); + GetGL()->GenQueries(1, Command->GlTimerObject); AssertNoGlErrors; } break; { tmatch(bonsai_render_command_gl_timer_start, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_start); AssertNoGlErrors; - GetStdlib()->GL.BeginQuery(GL_TIME_ELAPSED, Command->GlTimerObject); + GetGL()->BeginQuery(GL_TIME_ELAPSED, Command->GlTimerObject); AssertNoGlErrors; } break; { tmatch(bonsai_render_command_gl_timer_end, RenderCommand, Command) TIMED_NAMED_BLOCK(bonsai_render_command_gl_timer_end); AssertNoGlErrors; - GetStdlib()->GL.EndQuery(GL_TIME_ELAPSED); + GetGL()->EndQuery(GL_TIME_ELAPSED); AssertNoGlErrors; } break; @@ -792,12 +792,12 @@ DrainRenderQueue(engine_resources *Engine) s32 Available = False; while (!Available) { - GetStdlib()->GL.GetQueryObjectiv(Command->GlTimerObject, GL_QUERY_RESULT_AVAILABLE, &Available); + GetGL()->GetQueryObjectiv(Command->GlTimerObject, GL_QUERY_RESULT_AVAILABLE, &Available); /* if (Available == False) { Info("Waiting for query object to become available"); } */ } - GetStdlib()->GL.GetQueryObjectui64v(Command->GlTimerObject, GL_QUERY_RESULT, &TimerNs); + GetGL()->GetQueryObjectui64v(Command->GlTimerObject, GL_QUERY_RESULT, &TimerNs); /* Info("GL reported time of (%.2f)ms", f64(TimerNs)/1000000.0); */ /* GetDebugState()->PushHistogramDataPoint(TimerNs); */ AssertNoGlErrors; @@ -820,7 +820,7 @@ DrainRenderQueue(engine_resources *Engine) /* Info("PBOJob(0x%x) JobIndex(%u)", PBOJob, JobIndex.Index); */ /* Info("0x%x 0x%x", PBOJob->PBOBuf.PBO, PBOJob->PBOBuf.Fence); */ - u32 SyncStatus = GetStdlib()->GL.ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); + u32 SyncStatus = GetGL()->ClientWaitSync(PBOJob->PBOBuf.Fence, GL_SYNC_FLUSH_COMMANDS_BIT, 0); AssertNoGlErrors; switch(SyncStatus) { @@ -832,9 +832,9 @@ DrainRenderQueue(engine_resources *Engine) AssertNoGlErrors; /* umm JobCount = AtElements(&Graphics->NoiseReadbackJobs).Index; */ /* Info("(%d) Binding and Mapping PBOJob(0x%x) PBO(%u) JobCount(%d) JobIndex(%u)", ThreadLocal_ThreadIndex, PBOJob, PBOJob->PBOBuf.PBO, JobCount, JobIndex.Index); */ - GetStdlib()->GL.BindBuffer(GL_PIXEL_PACK_BUFFER, PBOJob->PBOBuf.PBO); + GetGL()->BindBuffer(GL_PIXEL_PACK_BUFFER, PBOJob->PBOBuf.PBO); AssertNoGlErrors; - u16 *NoiseValues = Cast(u16*, GetStdlib()->GL.MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); + u16 *NoiseValues = Cast(u16*, GetGL()->MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); AssertNoGlErrors; auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->DestNode)); @@ -879,7 +879,7 @@ RenderThread_Main(void *ThreadStartupParams) /* SetThreadLocal_ThreadIndex(ThreadParams->ThreadIndex); */ engine_resources *Engine = GetEngineResources(); - application_api *AppApi = ThreadParams->AppApi; + application_api *AppApi = &ThreadParams->Stdlib->AppApi; os *Os = &Engine->Stdlib.Os; platform *Plat = &Engine->Stdlib.Plat; engine_api *EngineApi = &Engine->EngineApi; diff --git a/src/engine/resources.h b/src/engine/resources.h index a0e6ddae1..37d1550b2 100644 --- a/src/engine/resources.h +++ b/src/engine/resources.h @@ -35,16 +35,14 @@ struct asset_system struct engine_resources { - engine_settings Settings; - bonsai_stdlib Stdlib; + engine_api EngineApi; + + engine_settings Settings; // TODO(Jesse): Should this go in stdlib? renderer_2d Ui; - application_api GameApi; - engine_api EngineApi; - // Engine hotkeys Hotkeys; maybe_ray MaybeMouseRay; @@ -127,18 +125,6 @@ GetWorldChunkDim() return GetWorld()->ChunkDim; } -// NOTE(Jesse): We have to fail on this for avoiding stackoverflows on startup -link_weak bonsai_stdlib * -GetStdlib() -{ - bonsai_stdlib *Result = 0; - if (auto Engine = TryGetEngineResources()) - { - Result = &Engine->Stdlib; - } - return Result; -} - link_internal level_editor * GetLevelEditor() diff --git a/src/engine/shader.cpp b/src/engine/shader.cpp index db787cc56..92a3b25df 100644 --- a/src/engine/shader.cpp +++ b/src/engine/shader.cpp @@ -17,14 +17,14 @@ BindEngineUniform(shader_uniform *Uniform) case ShaderUniform_Light: { TIMED_BLOCK("ShaderUniform_Light"); - GetStdlib()->GL.Uniform3fv(Uniform->ID, 1, &Uniform->Light->Position.E[0]); + GetGL()->Uniform3fv(Uniform->ID, 1, &Uniform->Light->Position.E[0]); END_BLOCK(); } break; case ShaderUniform_Camera: { TIMED_BLOCK("ShaderUniform_Camera"); - GetStdlib()->GL.Uniform3fv(Uniform->ID, 1, &Uniform->Camera->RenderSpacePosition.E[0]); + GetGL()->Uniform3fv(Uniform->ID, 1, &Uniform->Camera->RenderSpacePosition.E[0]); END_BLOCK(); } break; diff --git a/src/engine/terrain_render.cpp b/src/engine/terrain_render.cpp index f17818b68..4a9fda51c 100644 --- a/src/engine/terrain_render.cpp +++ b/src/engine/terrain_render.cpp @@ -14,7 +14,7 @@ DispatchTerrainShaders(graphics *Graphics, world_chunk *Chunk) RC->ChunkResolution = V3(Chunk->DimInChunks); TIMED_NAMED_BLOCK(TerrainDrawCall); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); UseShader(RC); v2i DestTextureDim = RC->DestTex.Dim; @@ -35,7 +35,7 @@ DispatchTerrainShaders(graphics *Graphics, world_chunk *Chunk) auto *RC = &Graphics->TerrainDerivsRC; TIMED_NAMED_BLOCK(TerrainDrawCall); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO.ID); UseShader(RC); // @derivs_texture_binding_to_shader_unit_0 @@ -62,7 +62,7 @@ DispatchTerrainShaders(graphics *Graphics, world_chunk *Chunk) RC->ChunkResolution = V3(Chunk->DimInChunks); TIMED_NAMED_BLOCK(TerrainDrawCall); - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO->ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, RC->DestFBO->ID); UseShader(RC); // Using texture unit 1 because the DerivsTex is automatically bound in UseShader to unit 0 // @derivs_texture_binding_to_shader_unit_0 diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 30c057825..df48f853c 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -4702,14 +4702,14 @@ DrawPickedChunks(renderer_2d* Group, render_entity_to_texture_group *PickedChunk { // Draw hotchunk to the GameGeo FBO - GetStdlib()->GL.BindFramebuffer(GL_FRAMEBUFFER, PickedChunksRenderGroup->GameGeoFBO.ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, PickedChunksRenderGroup->GameGeoFBO.ID); FlushBuffersToCard(&PickedChunksRenderGroup->GameGeo); PickedChunksRenderGroup->ViewProjection = ProjectionMatrix(PickedChunksRenderGroup->Camera, DEBUG_TEXTURE_DIM, DEBUG_TEXTURE_DIM) * ViewMatrix(ChunkDimension(HotChunk->Chunk), PickedChunksRenderGroup->Camera); - GetStdlib()->GL.UseProgram(PickedChunksRenderGroup->GameGeoShader.ID); + GetGL()->UseProgram(PickedChunksRenderGroup->GameGeoShader.ID); SetViewport(V2(DEBUG_TEXTURE_DIM, DEBUG_TEXTURE_DIM)); diff --git a/src/game_loader.cpp b/src/game_loader.cpp index fdcfa5459..96dec68c0 100644 --- a/src/game_loader.cpp +++ b/src/game_loader.cpp @@ -129,7 +129,7 @@ main( s32 ArgCount, const char ** Args ) // kick off the worker threads. // shared_lib GameLib = {}; - application_api *GameApi = &EngineResources->GameApi; + application_api *GameApi = &EngineResources->Stdlib.AppApi; engine_api *EngineApi = &EngineResources->EngineApi; { FileIsNew(GameLibName, &LastGameLibTime); // Hack to initialize the lib timer statics From d0d349d1b8d15bd08e7de4a09e6c1d9d748adfd4 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 21:27:14 -0700 Subject: [PATCH 320/421] Kill thread_startup_params --- external/bonsai_debug | 2 +- external/bonsai_stdlib | 2 +- ...on_pattern_199741702_161749140_632272777.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 - generated/for_datatypes_Bxw4Q7AW.h | 1 - generated/for_datatypes_fkubhsYl.h | 1 - generated/for_datatypes_kv3WBTai.h | 1 - .../rectalinear_iteration_pattern_812652930.h | 2 +- src/engine/render_loop.cpp | 21 ++-- src/engine/world_update.cpp | 97 ------------------- 10 files changed, 15 insertions(+), 115 deletions(-) diff --git a/external/bonsai_debug b/external/bonsai_debug index 926e0c39c..6ecb6923f 160000 --- a/external/bonsai_debug +++ b/external/bonsai_debug @@ -1 +1 @@ -Subproject commit 926e0c39c9528311d8924760e28d625b53f2c841 +Subproject commit 6ecb6923ffcae564bd5d04139a4c8510233e7ec8 diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 629ae1b30..83b5ba922 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 629ae1b3080fc6dec34f3c1fc9122bc6f6cb6f65 +Subproject commit 83b5ba922201f37a27d471d7dd9191ac83a67498 diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index d5f4bfaf1..162da0e8d 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:579:0 +// src/engine/world_update.cpp:482:0 random_series ColorEntropy = {4654376543246}; diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 09853978c..19960c783 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -756,7 +756,6 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) - struct draw_lod_async_params; diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 52e0eda64..b586a3d64 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1144,6 +1144,5 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 27a2c507e..51bf0cbb5 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -746,7 +746,6 @@ render_to_texture_async_params render_to_texture_async_params; - draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index c4b4a8a0c..53fd7135f 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -746,7 +746,6 @@ type_render_to_texture_async_params, - type_draw_lod_async_params, diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index 672d5884b..c87a8f73b 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -1,4 +1,4 @@ -// src/engine/world_update.cpp:614:0 +// src/engine/world_update.cpp:517:0 DimIterator(x, y, z, UpdateDim) { diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index db0c33f49..88079d791 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -867,19 +867,19 @@ DrainRenderQueue(engine_resources *Engine) link_export THREAD_MAIN_RETURN RenderThread_Main(void *ThreadStartupParams) { - thread_startup_params *ThreadParams = Cast(thread_startup_params*, ThreadStartupParams); - WorkerThread_BeforeJobStart(ThreadParams); + thread_local_state *Thread = Cast(thread_local_state*, ThreadStartupParams); + WorkerThread_BeforeJobStart(Thread); Global_ThreadStates = GetStdlib()->ThreadStates; Assert(Global_ThreadStates); - /* Assert(ThreadParams->ThreadIndex > 0); */ - /* SetThreadLocal_ThreadIndex(ThreadParams->ThreadIndex); */ + /* Assert(Thread->ThreadIndex > 0); */ + /* SetThreadLocal_ThreadIndex(Thread->ThreadIndex); */ engine_resources *Engine = GetEngineResources(); - application_api *AppApi = &ThreadParams->Stdlib->AppApi; + application_api *AppApi = &Thread->Stdlib->AppApi; os *Os = &Engine->Stdlib.Os; platform *Plat = &Engine->Stdlib.Plat; engine_api *EngineApi = &Engine->EngineApi; @@ -908,17 +908,18 @@ RenderThread_Main(void *ThreadStartupParams) if (InitResult) { - while ( FutexNotSignaled(ThreadParams->WorkerThreadsExitFutex) ) + bonsai_futex *WorkerThreadsExitFutex = &Plat->WorkerThreadsExitFutex; + while ( FutexNotSignaled(WorkerThreadsExitFutex) ) { WORKER_THREAD_ADVANCE_DEBUG_SYSTEM(); - AppApi->WorkerBeforeJob(GetThreadLocalState(ThreadLocal_ThreadIndex), ThreadParams); + AppApi->WorkerBeforeJob(Thread); EngineApi->DrainRenderQueue(Engine); - if (FutexIsSignaled(ThreadParams->WorkerThreadsSuspendFutex)) { WaitOnFutex(ThreadParams->WorkerThreadsSuspendFutex); } + if (FutexIsSignaled(&Plat->WorkerThreadsSuspendFutex)) { WaitOnFutex(&Plat->WorkerThreadsSuspendFutex); } SleepMs(1); } - Info("Exiting Render Thread (%d)", ThreadParams->ThreadIndex); - WaitOnFutex(ThreadParams->WorkerThreadsExitFutex); + Info("Exiting Render Thread (%d)", Thread->ThreadIndex); + WaitOnFutex(WorkerThreadsExitFutex); } else { diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index 0eabde058..e18fa36af 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -1,100 +1,3 @@ -#if 0 -link_export THREAD_MAIN_RETURN -WorldUpdateThread_Main(void *ThreadStartupParams) -{ - b32 InitResult = True; - - thread_startup_params *ThreadParams = Cast(thread_startup_params*, ThreadStartupParams); - SetThreadLocal_ThreadIndex(ThreadParams->ThreadIndex); - - engine_resources *Engine = Cast(engine_resources*, GetEngineResources()); - - thread_local_state *Thread = GetThreadLocalState(ThreadLocal_ThreadIndex); - - Assert(GetEngineResources()); - Assert(Global_ThreadStates); - - while ( FutexNotSignaled(ThreadParams->WorkerThreadsExitFutex) ) - { - UNPACK_ENGINE_RESOURCES(Engine); - - WORKER_THREAD_ADVANCE_DEBUG_SYSTEM(); - WorkerThread_BeforeJobStart(ThreadParams); - - /* world_chunk_ptr_block_array UpdatedChunks = WorldChunkPtrBlockArray(Thread->TempMemory); */ - - while (work_queue_entry *Entry = PopWorkQueueEntry(WorldUpdateQ)) - { - tswitch(Entry) - { - case type_work_queue_entry_noop: - case type_work_queue_entry_init_world_chunk: - case type_work_queue_entry_copy_buffer_set: - case type_work_queue_entry_copy_buffer_ref: - case type_work_queue_entry_init_asset: - case type_work_queue_entry_rebuild_mesh: - case type_work_queue_entry_finalize_noise_values: - case type_work_queue_entry_build_chunk_mesh: - case type_work_queue_entry_sim_particle_system: - case type_work_queue_entry__align_to_cache_line_helper: - case type_work_queue_entry_async_function_call: - case type_work_queue_entry__bonsai_render_command: - { - InvalidCodePath(); - } break; - -#if 0 - case type_work_queue_entry_update_world_region: - { - work_queue_entry_update_world_region *Job = SafeAccess(work_queue_entry_update_world_region, Entry); - DoWorldUpdate(&Engine->Stdlib.Plat.LowPriority, World, Thread, Job); - - RangeIterator_t(u32, ChunkIndex, Job->ChunkCount) - { - world_chunk *Chunk = Job->DestChunkBuffer[ChunkIndex]; - // Only push each chunk to have it's mesh rebuilt once, even if it - // was updated multiple times. - if (Chunk->Flags & Chunk_Queued) - { - UnSetFlag(&Chunk->Flags, Chunk_Queued); - Push(&UpdatedChunks, &Chunk); - } - } - - - } break; -#endif - - } - - } - - /* IterateOver(&UpdatedChunks, Chunk, ChunkIndex) */ - /* { */ - /* QueueChunkForMeshRebuild(&Plat->LowPriority, Chunk); */ - /* } */ - - // NOTE(Jesse): This is intentionally after all the updates have completed - // such that the UpdatedChunks block array persists between jobs and we - // clear it at the end. - RewindArena(GetTranArena()); - - SleepMs(1); - - if (FutexIsSignaled(ThreadParams->WorkerThreadsExitFutex)) break; - - if (FutexIsSignaled(ThreadParams->WorkerThreadsSuspendFutex)) { WaitOnFutex(ThreadParams->WorkerThreadsSuspendFutex); } - } - - - Info("Exiting WorldUpdate Thread (%d)", ThreadParams->ThreadIndex); - WaitOnFutex(ThreadParams->WorkerThreadsExitFutex); - - THREAD_MAIN_RETURN Result = ReinterpretCast(THREAD_MAIN_RETURN, InitResult); - return Result; -} -#endif - link_internal void QueueWorldUpdateForRegion( engine_resources *Engine, world_edit_blend_mode Mode, From 18b85710b060a0f44c558fdaf7b76e872ba5c2a6 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 21:41:33 -0700 Subject: [PATCH 321/421] Remove Global_ThreadStates --- examples/terrain_gen/game.cpp | 3 +-- external/bonsai_stdlib | 2 +- src/engine/api.cpp | 2 +- src/engine/render_loop.cpp | 5 +---- src/game_loader.cpp | 1 - 5 files changed, 4 insertions(+), 9 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index ee8e2b1be..e1311e749 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -365,8 +365,7 @@ WarpedTerrain( world_chunk *Chunk, BONSAI_API_WORKER_THREAD_INIT_CALLBACK() { - Global_ThreadStates = AllThreads; - SetThreadLocal_ThreadIndex(ThreadIndex); + SetThreadLocal_ThreadIndex(Thread->Index); } BONSAI_API_WORKER_THREAD_CALLBACK() diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 83b5ba922..b7179c656 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 83b5ba922201f37a27d471d7dd9191ac83a67498 +Subproject commit b7179c6562d0f31d236810b7d2c0c90ea6c94ba9 diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 96afde056..6615936da 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -7,7 +7,7 @@ Bonsai_OnLibraryLoad(engine_resources *Resources) if (ThreadLocal_ThreadIndex == -1) { SetThreadLocal_ThreadIndex(0); } else { Assert(ThreadLocal_ThreadIndex == 0); } - Global_ThreadStates = Resources->Stdlib.ThreadStates; + Assert(Resources->Stdlib.ThreadStates); return True; } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 88079d791..626057dc4 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -870,10 +870,7 @@ RenderThread_Main(void *ThreadStartupParams) thread_local_state *Thread = Cast(thread_local_state*, ThreadStartupParams); WorkerThread_BeforeJobStart(Thread); - - Global_ThreadStates = GetStdlib()->ThreadStates; - Assert(Global_ThreadStates); - + Assert(GetStdlib()->ThreadStates); /* Assert(Thread->ThreadIndex > 0); */ /* SetThreadLocal_ThreadIndex(Thread->ThreadIndex); */ diff --git a/src/game_loader.cpp b/src/game_loader.cpp index 96dec68c0..22add8f1b 100644 --- a/src/game_loader.cpp +++ b/src/game_loader.cpp @@ -172,7 +172,6 @@ main( s32 ArgCount, const char ** Args ) /* EngineResources->DebugState = Global_DebugStatePointer; */ Assert(EngineResources->Stdlib.ThreadStates); - Assert(Global_ThreadStates); Ensure( EngineApi->OnLibraryLoad(EngineResources) ); Ensure( Bonsai_Init(EngineResources) ); // <-- EngineResources now initialized From 05420e5aabc7bfbe7ac91ed609e65ffddc2c28ab Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 20 Jun 2025 22:00:30 -0700 Subject: [PATCH 322/421] Re-enable context switch tracing --- external/bonsai_stdlib | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 22 ------------------- src/game_loader.cpp | 4 ++-- 3 files changed, 3 insertions(+), 25 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index b7179c656..13c35d87c 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit b7179c6562d0f31d236810b7d2c0c90ea6c94ba9 +Subproject commit 13c35d87c283c324ab8cd131574b3583d26db411 diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 690424297..115de9ae2 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -74,28 +74,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam - PushNewRow(Ui); - - } - - - { - - - - cs MemberName = CSz("Initialized"); - DoEditorUi(Ui, - Window, - Cast(b8*, &Element->Initialized), - MemberName, - &DefaultUiRenderParams_Checkbox - ); - - - - - - PushNewRow(Ui); } diff --git a/src/game_loader.cpp b/src/game_loader.cpp index 22add8f1b..d026fccdd 100644 --- a/src/game_loader.cpp +++ b/src/game_loader.cpp @@ -157,8 +157,8 @@ main( s32 ArgCount, const char ** Args ) auto Flags = bonsai_init_flags( BonsaiInit_OpenWindow | BonsaiInit_LaunchThreadPool | - BonsaiInit_InitDebugSystem ); - /* BonsaiInit_ProfileContextSwitches ); */ + BonsaiInit_InitDebugSystem | + BonsaiInit_ProfileContextSwitches ); Ensure( InitializeBonsaiStdlib( Flags, GameApi, From d04533b51dd0827a05551d4384e1dec08e0fcd3a Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 21 Jun 2025 09:03:01 -0700 Subject: [PATCH 323/421] Add assert_fail in stdlib --- external/bonsai_stdlib | 2 +- generated/gen_are_equal_665365505.h | 2 +- generated/gen_primitive_deep_copy_715421923.h | 2 +- jesse.make.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 13c35d87c..0306387a9 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 13c35d87c283c324ab8cd131574b3583d26db411 +Subproject commit 0306387a9901da4e5e3e6c2e225573cca9d4b799 diff --git a/generated/gen_are_equal_665365505.h b/generated/gen_are_equal_665365505.h index 1d7fb0c1e..641df5d52 100644 --- a/generated/gen_are_equal_665365505.h +++ b/generated/gen_are_equal_665365505.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/primitives.h:233:0 +// external/bonsai_stdlib/src/primitives.h:236:0 link_internal b32 AreEqual( s64 E1, s64 E2 ) diff --git a/generated/gen_primitive_deep_copy_715421923.h b/generated/gen_primitive_deep_copy_715421923.h index 2c46f2098..2798be096 100644 --- a/generated/gen_primitive_deep_copy_715421923.h +++ b/generated/gen_primitive_deep_copy_715421923.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/primitives.h:250:0 +// external/bonsai_stdlib/src/primitives.h:253:0 link_internal void DeepCopy( s64 *Src, s64 *Dest ) diff --git a/jesse.make.sh b/jesse.make.sh index 384beb04f..11051035c 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 From 749d806c6443057f079279c12b3c579d706d9939 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 10 Sep 2025 20:31:28 -0700 Subject: [PATCH 324/421] WIP --- examples/terrain_gen/game.cpp | 758 ------------------ external/bonsai_debug | 2 +- external/bonsai_stdlib | 2 +- .../shader_magic_textured_quad_render_pass.h | 65 ++ jesse.make.sh | 2 +- settings.init | 8 +- .../terrain_decoration.fragmentshader | 27 +- .../shaping/terrain_shaping.fragmentshader | 47 +- 8 files changed, 77 insertions(+), 834 deletions(-) create mode 100644 generated/shader_magic_textured_quad_render_pass.h diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index e1311e749..5a6b2b983 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -4,760 +4,11 @@ #include "game_types.h" -#if 0 -link_internal u32 -Terrain_Debug( world_chunk *Chunk, - v3i NoiseBasis, - void *NoiseParams, - void *UserData ) -{ - UNPACK_NOISE_PARAMS(NoiseParams); - - u32 Result = 0; - - auto AbsX = Abs(Chunk->WorldP.x); - auto AbsY = Abs(Chunk->WorldP.y); - - for ( s32 z = 0; z < Dim.z; ++ z) - { - for ( s32 y = 0; y < Dim.y; ++ y) - { - for ( s32 x = 0; x < Dim.x; ++ x) - { - if (x == 2 && y == 2 && z == 2) - { - s32 Index = GetIndex(Voxel_Position(x,y,z), Dim); - SetOccupancyBit(Chunk, Index, VoxelOccupancy_Filled); - Chunk->Voxels[Index].Color = RGBtoPackedHSV(RGBColor); - ++Result; - } - } - } - } - - return Result;; -} -link_internal u32 -Terrain_Checkerboard( world_chunk *Chunk, - v3i NoiseBasis, - void *NoiseParams, - void *UserData ) -{ - UNPACK_NOISE_PARAMS(NoiseParams); - - u32 Result = 0; - - auto AbsX = Abs(Chunk->WorldP.x); - auto AbsY = Abs(Chunk->WorldP.y); - - - if ( AbsX % 2 == 0 && AbsY % 2 == 1) { RGBColor = MagicaVoxelDefaultPaletteToRGB(MCV_RED); } - if ( AbsX % 2 == 1 && AbsY % 2 == 0) { RGBColor = MagicaVoxelDefaultPaletteToRGB(MCV_BLUE); } - - for ( s32 z = 0; z < Dim.z; ++ z) - { - s64 WorldZ = z - zMin - SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z); - for ( s32 y = 0; y < Dim.y; ++ y) - { - for ( s32 x = 0; x < Dim.x; ++ x) - { - if (WorldZ < zMin) - { - s32 Index = GetIndex(Voxel_Position(x,y,z), Dim); - /* Chunk->Voxels[Index].Flags = Voxel_Filled; */ - SetOccupancyBit(Chunk, Index, VoxelOccupancy_Filled); - Chunk->Voxels[Index].Color = RGBtoPackedHSV(RGBColor); - ++Result; - } - } - } - } - - return Result;; -} - -link_internal u32 -GrassyIslandTerrain( world_chunk *Chunk, - v3i NoiseBasis, - void *NoiseParams, - void *UserData ) -{ - TIMED_FUNCTION(); - UNPACK_NOISE_PARAMS(NoiseParams); - u32 ChunkSum = 0; - - s32 MinZ = Chunk->WorldP.z*WorldChunkDim.z; - s32 MaxZ = MinZ+WorldChunkDim.z ; - - octave_buffer *OctaveBuf = (octave_buffer*)UserData; - u32 OctaveCount = OctaveBuf->Count; - - for ( s32 z = 0; z < Dim.z; ++ z) - { - s64 WorldZ = z - SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z); - s64 WorldZBiased = WorldZ - zMin; - for ( s32 y = 0; y < Dim.y; ++ y) - { - s64 WorldY = y - SrcToDest.y + (WorldChunkDim.y*Chunk->WorldP.y); - for ( s32 x = 0; x < Dim.x; ++ x) - { - s64 WorldX = x - SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); - s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); - NotImplemented; - /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ - /* Assert( NotSet(&Chunk->Voxels[VoxIndex], Voxel_Filled) ); */ - - r32 NoiseValue = 0.f; - for (u32 OctaveIndex = 0; OctaveIndex < OctaveCount; ++OctaveIndex) - { - octave *Octave = OctaveBuf->Octaves+OctaveIndex; - - f32 InX = SafeDivide0((x + SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x)), Octave->Freq.x); - f32 InY = SafeDivide0((y + SrcToDest.y + (WorldChunkDim.y*Chunk->WorldP.y)), Octave->Freq.y); - f32 InZ = SafeDivide0((z + SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z)), Octave->Freq.z); - - r32 Warp = PerlinNoise(InX, InY, InZ); - v3 WarpFactor = Warp*Octave->WarpStrength; - - r32 N = PerlinNoise(InX+WarpFactor.x, InY+WarpFactor.y, InZ+WarpFactor.z); - - Assert(N <= 1.05f); - Assert(N > -1.05f); - - NoiseValue += (N*Octave->Amp); - } - - b32 NoiseChoice = r64(NoiseValue) > r64(WorldZBiased); - - /* if (NoiseValue > WorldZBiased) */ - /* { */ - /* } */ - - /* u16 StartColorMin = GREY_4; */ - /* u16 StartColorMax = GREY_6; */ - /* u16 ThisColor = SafeTruncateToU16(umm(RandomBetween(StartColorMin, &GenColorEntropy, StartColorMax))); */ - v3 ThisColor = RGB_GRASS_GREEN; - - u8 ThisTransparency = 0; - - s32 SnowThreshold = 100; - if (NoiseChoice == True && WorldZ > SnowThreshold) - { - ThisColor = RGB_WHITE; - } - - s32 SandThreshold = 3; - if (NoiseChoice == True && WorldZ < SandThreshold) - { - ThisColor = RGB_SAND; - } - - s32 GravelThreshold = 1; - if (NoiseChoice == True && WorldZ < GravelThreshold) - { - ThisColor = RGB_GRAVEL; - } - - s32 WaterThreshold = 0; - if (NoiseChoice == False && WorldZ < WaterThreshold) - { - NoiseChoice = True; - ThisColor = RGB_BLUE; - ThisTransparency = 255; - } - -#if 1 - GrowGrassPerlin( Chunk, V3i(x,y,z), NoiseValue, 1.f, SrcToDest, WorldChunkDim, WorldZBiased, &ThisColor, &NoiseChoice ); -#else - s32 Below = TryGetIndex(x, y, z-1, Dim); - s32 B0 = TryGetIndex(x+1, y, z-1, Dim); - s32 B1 = TryGetIndex(x-1, y, z-1, Dim); - s32 B2 = TryGetIndex(x, y+1, z-1, Dim); - s32 B3 = TryGetIndex(x, y-1, z-1, Dim); - - u32 CornersFilled = 0; - if (B0 > -1) { CornersFilled += (Chunk->Voxels[B0].Flags & Voxel_Filled); } - if (B1 > -1) { CornersFilled += (Chunk->Voxels[B1].Flags & Voxel_Filled); } - if (B2 > -1) { CornersFilled += (Chunk->Voxels[B2].Flags & Voxel_Filled); } - if (B3 > -1) { CornersFilled += (Chunk->Voxels[B3].Flags & Voxel_Filled); } - - if (NoiseChoice == False) - { - /* s32 Above = TryGetIndex(x, y, z+1, Dim); */ - if (Below > -1) - { - if ( CornersFilled > 3 && - Chunk->Voxels[Below].Flags & Voxel_Filled && - Chunk->Voxels[Below].Color >= StartColorMin && Chunk->Voxels[Below].Color <= StartColorMax ) - { - NoiseChoice = True; - ThisColor = DIRT; - } -#if 1 - if (Chunk->Voxels[Below].Flags&Voxel_Filled && - Chunk->Voxels[Below].Color == DIRT) - { - f32 InX = SafeDivide0((x + SrcToDest.x + ( WorldChunkDim.x*Chunk->WorldP.x)), 10.f); - f32 InY = SafeDivide0((y + SrcToDest.y + ( WorldChunkDim.y*Chunk->WorldP.y)), 10.f); - f32 InZ = SafeDivide0((z + SrcToDest.z + ( WorldChunkDim.z*Chunk->WorldP.z)), 10.f); - - u16 GrassColorMin = RGB_GRASS_GREEN; - u16 GrassColorMax = RGB_GRASS_GREEN+2; - ThisColor = SafeTruncateToU16(umm(RandomBetween(GrassColorMin, &GenColorEntropy, GrassColorMax))); - NoiseChoice = True; - - r32 GrassChance = PerlinNoise(InX, InY, InZ); - if (GrassChance > 0.45f) { ThisColor = RGB_GRASS_GREEN-1; } - } - - if (Chunk->Voxels[Below].Flags&Voxel_Filled && - Chunk->Voxels[Below].Color == RGB_GRASS_GREEN-1) - { - r32 GrassChance = RandomUnilateral(&GenColorEntropy); - if (GrassChance > 0.85f) - { - NoiseChoice = True; - ThisColor = RGB_GRASS_GREEN-1; - } - if (GrassChance > 0.997f) - { - ThisColor = RED; - } - if (GrassChance > 0.998f) - { - ThisColor = YELLOW; - } - if (GrassChance > 0.999f) - { - ThisColor = PINK; - } - } - - - -#endif - } - } - else // NoiseChoice == True - { - if (Below > -1) - { - if (ThisColor == StartColorMin && (Chunk->Voxels[Below].Flags&Voxel_Filled)==0 ) - { - r32 VineChance = RandomUnilateral(&GenColorEntropy); - if (CornersFilled <= 2 && VineChance > 0.9f) - { - ThisColor = RGB_GRASS_GREEN; - while (RandomUnilateral(&GenColorEntropy) > 0.95f) - { - } - } - } - } - } -#endif - - /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); */ - SetOccupancyBit(Chunk, VoxIndex, s32(NoiseChoice)); - Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor)*u16(NoiseChoice); - Chunk->Voxels[VoxIndex].Transparency = ThisTransparency; - ChunkSum += NoiseChoice; - - NotImplemented; - /* Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); */ - } - } - } - - return ChunkSum; -} - -link_internal u32 -WarpedTerrain( world_chunk *Chunk, - v3i NoiseBasis, - void *NoiseParams, - void *UserData ) -{ - TIMED_FUNCTION(); - UNPACK_NOISE_PARAMS(NoiseParams); - - u32 ChunkSum = 0; - - s32 MinZ = Chunk->WorldP.z*WorldChunkDim.z; - s32 MaxZ = MinZ+WorldChunkDim.z ; - - octave_buffer *OctaveBuf = (octave_buffer*)UserData; - u32 OctaveCount = OctaveBuf->Count; - - for ( s32 z = 0; z < Dim.z; ++ z) - { - s64 WorldZ = z - SrcToDest.z + (WorldChunkDim.z*Chunk->WorldP.z); - s64 WorldZBiased = WorldZ - zMin; - for ( s32 y = 0; y < Dim.y; ++ y) - { - s64 WorldY = y - SrcToDest.y + (WorldChunkDim.y*Chunk->WorldP.y); - for ( s32 x = 0; x < Dim.x; ++ x) - { - s64 WorldX = x - SrcToDest.x + (WorldChunkDim.x*Chunk->WorldP.x); - s32 VoxIndex = GetIndex(Voxel_Position(x,y,z), Dim); - NotImplemented; - /* Chunk->Voxels[VoxIndex].Flags = Voxel_Empty; */ - - r32 NoiseValue = 0.f; - for (u32 OctaveIndex = 0; OctaveIndex < OctaveCount; ++OctaveIndex) - { - octave *Octave = OctaveBuf->Octaves+OctaveIndex; - - f32 InX = SafeDivide0((x + SrcToDest.x + ( WorldChunkDim.x*Chunk->WorldP.x)), Octave->Freq.x); - f32 InY = SafeDivide0((y + SrcToDest.y + ( WorldChunkDim.y*Chunk->WorldP.y)), Octave->Freq.y); - f32 InZ = SafeDivide0((z + SrcToDest.z + ( WorldChunkDim.z*Chunk->WorldP.z)), Octave->Freq.z); - - r32 Warp = PerlinNoise(InX, InY, InZ); - v3 WarpFactor = Warp*Octave->WarpStrength; - - r32 N = PerlinNoise(InX+WarpFactor.x, InY+WarpFactor.y, InZ+WarpFactor.z); - - Assert(N <= 1.05f); - Assert(N > -1.05f); - - NoiseValue += (N*Octave->Amp); - } - - b32 NoiseChoice = r64(NoiseValue) > r64(WorldZBiased); - - v3 ThisColor = RGBColor; - -#if 0 - s32 SnowThreshold = 100; - if (NoiseChoice == True && WorldZ > SnowThreshold) - { - ThisColor = WHITE; - } - - s32 SandThreshold = 3; - if (NoiseChoice == True && WorldZ < SandThreshold) - { - ThisColor = YELLOW; - } - - s32 WaterThreshold = 0; - if (NoiseChoice == False && WorldZ < WaterThreshold) - { - NoiseChoice = True; - ThisColor = BLUE; - } -#endif - - /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*NoiseChoice)); */ - SetOccupancyBit(Chunk, VoxIndex, s32(NoiseChoice)); - Chunk->Voxels[VoxIndex].Color = RGBtoPackedHSV(ThisColor)*u16(NoiseChoice); - ChunkSum += NoiseChoice; - - NotImplemented; - /* Assert( (Chunk->Voxels[VoxIndex].Flags&VoxelFaceMask) == 0); */ - } - } - } - - return ChunkSum; -} -#endif - BONSAI_API_WORKER_THREAD_INIT_CALLBACK() { SetThreadLocal_ThreadIndex(Thread->Index); } -BONSAI_API_WORKER_THREAD_CALLBACK() -{ - if (ThreadLocal_ThreadIndex == INVALID_THREAD_LOCAL_THREAD_INDEX) { SetThreadLocal_ThreadIndex(Thread->Index); } - - b32 Result = True; - switch (Entry->Type) - { - default: { Result = False; } break; - - // NOTE(Jesse): Here we're going to provide an implementation for - // initializing a world chunk. - case type_work_queue_entry_init_world_chunk: - { - volatile work_queue_entry_init_world_chunk *Job = SafeAccess(work_queue_entry_init_world_chunk, Entry); - world_chunk *Chunk = Job->Chunk; - - NotImplemented; -#if 0 - if (ChunkIsGarbage(Chunk)) - { - // NOTE(Jesse): This is an optimization; the engine marks chunks that - // have moved outside of the visible region as garbage. - /* Chunk->Flags = Chunk_Uninitialized; */ - } - else -#endif - { - auto GenType = GetEngineResources()->GameState->TerrainGenType; - - auto Ignored = MeshBit_Lod0; - -#if 0 - /* Info("%S", ToString(GenType)); */ - switch (GenType) - { - case TerrainGenType_Debug: - { - // Flat Params - v3 Period = {}; - s32 Amplititude = {}; - s32 StartingZDepth = {}; - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( Terrain_Debug, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, Ignored, ChunkInitFlag_Noop, 0); - } break; - case TerrainGenType_Flat: - { - // Flat Params - v3 Period = V3(100); - s32 Amplititude = 25; - s32 StartingZDepth = -1; - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( Terrain_Flat, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, Ignored, ChunkInitFlag_Noop, 0); - } break; - - case TerrainGenType_SinCos: - { - // Bumpy Sin(x)+Cos(y) noise. Useful for visualizing the polylines/splines mapping noise values to their final values. - v3 Period = V3(20); - s32 Amplititude = 70; - /* s32 Period = 100; */ - /* s32 Amplititude = 2500; */ - s32 StartingZDepth = 15; - chunk_init_flags InitFlags = ChunkInitFlag_Noop; - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( Terrain_SinCos, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, Ignored, InitFlags, 0); - } break; - - case TerrainGenType_Voronoi: - { - // Voronoi noise .. looks like rocks. - v3 Period = V3(100); - s32 Amplititude = 50; - s32 StartingZDepth = -1; - chunk_init_flags InitFlags = ChunkInitFlag_Noop; - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( Terrain_Voronoi2D, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, Ignored, InitFlags, 0); - } break; - - case TerrainGenType_Checkerboard: - { - // Custom flat noise function that produces a checkerboard - v3 Period = V3(0); - s32 Amplititude = 0; - s32 StartingZDepth = -1; - chunk_init_flags InitFlags = ChunkInitFlag_Noop; - /* chunk_init_flags InitFlags = ChunkInitFlag_GenMipMapLODs; */ - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( Terrain_Checkerboard, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, Ignored, InitFlags, 0); - } break; - - case TerrainGenType_Perlin2D: - { - // Perlin 2D Params - v3 Period = V3(100); - s32 Amplititude = 5; - s32 StartingZDepth = 0; - v3 Color = RGB_GRASS_GREEN; - u32 Octaves = 1; - InitializeChunkWithNoise( Terrain_Perlin2D, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, MeshBit_Lod0, ChunkInitFlag_Noop, &Octaves); - } break; - - case TerrainGenType_Perlin3D: - { - // Perlin 3D Params - v3 Period = V3(50); - s32 Amplititude = 8; - s32 StartingZDepth = 2; - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( Terrain_Perlin3D, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, MeshBit_Lod0, ChunkInitFlag_Noop, 0); - } break; - - - case TerrainGenType_FBM2D: - { - /* // FBM params */ - - // 5km features - /* v3 Period = V3(500'000); */ - /* s32 Amplititude = 80'000; */ - /* s32 StartingZDepth = 20000; */ - /* u32 Octaves = 9; */ - - // 2km features - /* v3 Period = V3(200'000); */ - /* // 600m high */ - /* s32 Amplititude = 60'000; */ - /* s32 StartingZDepth = 60000; */ - /* u32 Octaves = 7; */ - - /* v3 Period = V3(5000); */ - /* s32 Amplititude = 1500; */ - /* s32 StartingZDepth = 1600; */ - /* u32 Octaves = 9; */ - - v3 Period = V3(2500); - s32 Amplititude = 1500; - s32 StartingZDepth = 1600; - u32 Octaves = 9; - /* u32 Octaves = 4; */ - /* u32 Octaves = 1; */ - - /* v3 Period = V3(50); */ - /* s32 Amplititude = 60; */ - /* s32 StartingZDepth = 6000; */ - /* u32 Octaves = 1; */ - /* u32 Octaves = 4; */ - - - /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ - chunk_init_flags InitFlags = ChunkInitFlag_Noop; - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( Terrain_FBM2D, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, Ignored, InitFlags, (void*)&Octaves); - } break; - - case TerrainGenType_GrassyTerracedTerrain: - { - // Custom FBM noise example generating slightly-more-complex game-world-like terrain - v3 Period = V3(0); // Ignored - s32 Amplititude = 0; // Ignored - s32 StartingZDepth = -100; - u32 OctaveCount = 1; - - octave_buffer OctaveBuf = { OctaveCount, {} }; - OctaveBuf.Octaves = Allocate(octave, Thread->TempMemory, OctaveCount); - - OctaveBuf.Octaves[0] = {V3(400, 400, 200), 150, V3(1)}; - /* OctaveBuf.Octaves[1] = {V3(35, 35, 50), 6, V3(2.f)}; */ - /* OctaveBuf.Octaves[2] = {V3(500, 500, 20), 200, V3(2.f)}; */ - /* OctaveBuf.Octaves[2] = {75, 60, 1}; */ - /* OctaveBuf.Octaves[3] = {37, 30, 0}; */ - - - /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ - /* chunk_init_flags InitFlags = ChunkInitFlag_GenMipMapLODs; */ - chunk_init_flags InitFlags = ChunkInitFlag_Noop; - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( GrassyTerracedTerrain, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, MeshBit_Lod0, InitFlags, (void*)&OctaveBuf); - } break; - - case TerrainGenType_GrassyTerracedTerrain2: - { - // Custom FBM noise example generating slightly-more-complex game-world-like terrain - v3 Period = V3(0); // Ignored - s32 Amplititude = 0; // Ignored - s32 StartingZDepth = -100; - u32 OctaveCount = 1; - - octave_buffer OctaveBuf = { OctaveCount, {} }; - OctaveBuf.Octaves = Allocate(octave, Thread->TempMemory, OctaveCount); - - OctaveBuf.Octaves[0] = {V3(400, 400, 200), 150, V3(1)}; - /* OctaveBuf.Octaves[1] = {V3(35, 35, 50), 60, V3(2.f)}; */ - /* OctaveBuf.Octaves[2] = {V3(500, 500, 20), 200, V3(2.f)}; */ - /* OctaveBuf.Octaves[2] = {75, 60, 1}; */ - /* OctaveBuf.Octaves[3] = {37, 30, 0}; */ - - - /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ - /* chunk_init_flags InitFlags = ChunkInitFlag_GenMipMapLODs; */ - chunk_init_flags InitFlags = ChunkInitFlag_Noop; - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( GrassyTerracedTerrain2, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, MeshBit_Lod0, InitFlags, (void*)&OctaveBuf); - } break; - - - case TerrainGenType_GrassyTerracedTerrain3: - { - // Custom FBM noise example generating slightly-more-complex game-world-like terrain - v3 Period = V3(0); // Ignored - s32 Amplititude = 0; // Ignored - s32 StartingZDepth = -100; - u32 OctaveCount = 2; - - octave_buffer OctaveBuf = { OctaveCount, {} }; - OctaveBuf.Octaves = Allocate(octave, Thread->TempMemory, OctaveCount); - - OctaveBuf.Octaves[0] = {V3(1400, 1400, 800), 350, V3(1.f)}; - OctaveBuf.Octaves[1] = {V3(400, 400, 200), 150, V3(1.f)}; - /* OctaveBuf.Octaves[2] = {V3(35, 35, 50), 6, V3(2.f)}; */ - /* OctaveBuf.Octaves[2] = {V3(500, 500, 20), 200, V3(2.f)}; */ - /* OctaveBuf.Octaves[2] = {75, 60, 1}; */ - /* OctaveBuf.Octaves[3] = {37, 30, 0}; */ - - - /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ - /* chunk_init_flags InitFlags = ChunkInitFlag_GenMipMapLODs; */ - chunk_init_flags InitFlags = ChunkInitFlag_Noop; - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( GrassyTerracedTerrain3, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, MeshBit_Lod0, InitFlags, (void*)&OctaveBuf); - } break; - - case TerrainGenType_GrassyTerracedTerrain4: - { - // Custom FBM noise example generating slightly-more-complex game-world-like terrain - v3 Period = V3(0); // Ignored - s32 Amplititude = 0; // Ignored - s32 StartingZDepth = -100; - u32 OctaveCount = 3; - - octave_buffer OctaveBuf = { OctaveCount, {} }; - OctaveBuf.Octaves = Allocate(octave, Thread->TempMemory, OctaveCount); - - OctaveBuf.Octaves[0] = {V3(800, 800, 1700), 350, V3(1.f)}; - OctaveBuf.Octaves[1] = {V3(400, 400, 200), 350, V3(1.f)}; - OctaveBuf.Octaves[2] = {V3(35, 35, 25), 6, V3(2.f)}; - - /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ - /* chunk_init_flags InitFlags = ChunkInitFlag_GenMipMapLODs; */ - chunk_init_flags InitFlags = ChunkInitFlag_Noop; - v3 Color = RGB_GRASS_GREEN; - /* InitializeChunkWithNoise( GrassyTerracedTerrain4, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, MeshBit_Lod0, InitFlags, (void*)&OctaveBuf); */ - } break; - - - case TerrainGenType_TerracedTerrain: - { - // Custom FBM noise example generating slightly-more-complex game-world-like terrain - v3 Period = V3(0); // Ignored - s32 Amplititude = 0; // Ignored - s32 StartingZDepth = 100; - u32 OctaveCount = 1; - - octave_buffer OctaveBuf = { OctaveCount, {} }; - OctaveBuf.Octaves = Allocate(octave, Thread->TempMemory, OctaveCount); - - OctaveBuf.Octaves[0] = {V3(400, 400, 200), 150, V3(1)}; - /* OctaveBuf.Octaves[1] = {V3(35, 35, 50), 6, V3(2.f)}; */ - /* OctaveBuf.Octaves[2] = {V3(500, 500, 20), 200, V3(2.f)}; */ - /* OctaveBuf.Octaves[2] = {75, 60, 1}; */ - /* OctaveBuf.Octaves[3] = {37, 30, 0}; */ - - - /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ - /* chunk_init_flags InitFlags = ChunkInitFlag_GenMipMapLODs; */ - chunk_init_flags InitFlags = ChunkInitFlag_Noop; - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( TerracedTerrain, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, MeshBit_Lod0, InitFlags, (void*)&OctaveBuf); - } break; - - case TerrainGenType_GrassyLargeTerracedTerrain: - { - // Custom FBM noise example generating slightly-more-complex game-world-like terrain - v3 Period = V3(0); // Ignored - s32 Amplititude = 0; // Ignored - s32 StartingZDepth = -140; - u32 OctaveCount = 4; - - octave_buffer OctaveBuf = { OctaveCount, {} }; - OctaveBuf.Octaves = Allocate(octave, Thread->TempMemory, OctaveCount); - - OctaveBuf.Octaves[0] = {V3(1200, 1200, 900), 500, V3(1)}; - OctaveBuf.Octaves[1] = {V3(1200, 1200, 900), 500, V3(1)}; - OctaveBuf.Octaves[2] = {V3(800, 800, 500), 125, V3(1)}; - OctaveBuf.Octaves[3] = {V3(35, 35, 25), 5, V3(2.f)}; - /* OctaveBuf.Octaves[2] = {V3(500, 500, 20), 200, V3(2.f)}; */ - /* OctaveBuf.Octaves[2] = {75, 60, 1}; */ - /* OctaveBuf.Octaves[3] = {37, 30, 0}; */ - - - /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ - chunk_init_flags InitFlags = ChunkInitFlag_GenLODs; - /* chunk_init_flags InitFlags = ChunkInitFlag_Noop; */ - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( GrassyLargeTerracedTerrain, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, MeshBit_Lod0, InitFlags, (void*)&OctaveBuf); - } break; - - case TerrainGenType_GrassyIsland: - { - // Custom FBM noise example generating slightly-more-complex game-world-like terrain - v3 Period = V3(0); // Ignored - s32 Amplititude = 0; // Ignored - s32 StartingZDepth = -140; - u32 OctaveCount = 2; - - octave_buffer OctaveBuf = { OctaveCount, {} }; - OctaveBuf.Octaves = Allocate(octave, Thread->TempMemory, OctaveCount); - - OctaveBuf.Octaves[0] = {V3(800, 800, 300), 275, V3(1)}; - OctaveBuf.Octaves[1] = {V3(35, 35, 50), 25, V3(2.f)}; - /* OctaveBuf.Octaves[2] = {V3(500, 500, 20), 200, V3(2.f)}; */ - /* OctaveBuf.Octaves[2] = {75, 60, 1}; */ - /* OctaveBuf.Octaves[3] = {37, 30, 0}; */ - - - /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ - /* chunk_init_flags InitFlags = ChunkInitFlag_GenMipMapLODs; */ - chunk_init_flags InitFlags = ChunkInitFlag_Noop; - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( GrassyIslandTerrain, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, MeshBit_Lod0, InitFlags, (void*)&OctaveBuf); - } break; - - case TerrainGenType_Hoodoo: - { - v3 Period = V3(300); - s32 Amplititude = 220; - s32 StartingZDepth = 70; - u32 OctaveCount = 2; - - octave_buffer OctaveBuf = { OctaveCount, {} }; - OctaveBuf.Octaves = Allocate(octave, Thread->TempMemory, OctaveCount); - - OctaveBuf.Octaves[0] = {V3(350, 150, 50), 25, V3(1.f)}; - OctaveBuf.Octaves[1] = {V3(120, 60, 35), 7.5, V3(1.f)}; - /* OctaveBuf.Octaves[1] = {V3(90, 60, 35), 25, V3(1.f)}; */ - - chunk_init_flags InitFlags = ChunkInitFlag_Noop; - /* chunk_init_flags InitFlags = ChunkInitFlag_GenMipMapLODs; */ - /* chunk_init_flags InitFlags = chunk_init_flags(ChunkInitFlag_ComputeStandingSpots | ChunkInitFlag_GenMipMapLODs); */ - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( HoodooTerrain, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, MeshBit_Lod0, InitFlags, (void*)&OctaveBuf); - } break; - - case TerrainGenType_Warped: - { - // Custom FBM noise example generating highly domain-warped terrain - v3 Period = V3(0); // Ignored - s32 Amplititude = 0; // Ignored - s32 StartingZDepth = -200; - u32 OctaveCount = 2; - - octave_buffer OctaveBuf = { OctaveCount, {} }; - OctaveBuf.Octaves = Allocate(octave, Thread->TempMemory, OctaveCount); - - OctaveBuf.Octaves[0] = {V3(800, 800, 300), 350, V3(1)}; - OctaveBuf.Octaves[1] = {V3(35, 35, 50), 20, V3(3.f)}; - /* OctaveBuf.Octaves[2] = {V3(500, 500, 20), 200, V3(2.f)}; */ - /* OctaveBuf.Octaves[2] = {V3(500, 500, 20), 200, V3(2.f)}; */ - /* OctaveBuf.Octaves[2] = {75, 60, 1}; */ - /* OctaveBuf.Octaves[3] = {37, 30, 0}; */ - - - /* chunk_init_flags InitFlags = ChunkInitFlag_ComputeStandingSpots; */ - /* chunk_init_flags InitFlags = ChunkInitFlag_GenMipMapLODs; */ - chunk_init_flags InitFlags = ChunkInitFlag_Noop; - v3 Color = RGB_GRASS_GREEN; - InitializeChunkWithNoise( WarpedTerrain, Thread, Chunk, Chunk->Dim, 0, Period, Amplititude, StartingZDepth, Color, Ignored, InitFlags, (void*)&OctaveBuf); - } break; - - - } -#endif - - } - - } break; - } - - return Result; -} - BONSAI_API_MAIN_THREAD_INIT_CALLBACK() { UNPACK_ENGINE_RESOURCES(Resources); @@ -867,13 +118,4 @@ BONSAI_API_MAIN_THREAD_CALLBACK() } - - /* Info("%S :: %d", ToString(GameState->TerrainGenType), GameState->TerrainGenType); */ - - /* if (TerrainGenTypeRadio.AnyElementClicked) */ - /* { */ - /* SignalAndWaitForWorkers(&Plat->WorkerThreadsSuspendFutex); */ - /* SoftResetEngine(Resources, HardResetFlag_NoResetCamera); */ - /* UnsignalFutex(&Plat->WorkerThreadsSuspendFutex); */ - /* } */ } diff --git a/external/bonsai_debug b/external/bonsai_debug index 6ecb6923f..e322cbeb5 160000 --- a/external/bonsai_debug +++ b/external/bonsai_debug @@ -1 +1 @@ -Subproject commit 6ecb6923ffcae564bd5d04139a4c8510233e7ec8 +Subproject commit e322cbeb560ce5b099e759eb8c73642681fec95d diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 0306387a9..07e15da09 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 0306387a9901da4e5e3e6c2e225573cca9d4b799 +Subproject commit 07e15da09d4be094ed04c27fb120e97417cf5d3b diff --git a/generated/shader_magic_textured_quad_render_pass.h b/generated/shader_magic_textured_quad_render_pass.h new file mode 100644 index 000000000..815d84510 --- /dev/null +++ b/generated/shader_magic_textured_quad_render_pass.h @@ -0,0 +1,65 @@ +// external/bonsai_stdlib/src/ui/ui.cpp:1:0 + +link_internal void +InitializeTexturedQuadRenderPass( textured_quad_render_pass *Struct + , b32 IsDepthTexture + , b32 HasAlphaChannel + , s32 TextureSlice + , v3 Tint +) +{ + Struct->Program = CompileShaderPair(CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(STDLIB_SHADER_PATH "SimpleTexture.fragmentshader")); + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + + u32 UniformIndex = 0; + + Struct->IsDepthTexture = IsDepthTexture; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->IsDepthTexture, "IsDepthTexture"); + + Struct->HasAlphaChannel = HasAlphaChannel; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->HasAlphaChannel, "HasAlphaChannel"); + + Struct->TextureSlice = TextureSlice; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->TextureSlice, "TextureSlice"); + + Struct->Tint = Tint; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Tint, "Tint"); + + u32 Expected = 4 ; + if (UniformIndex != Expected ) + { + Error("Shader (textured_quad_render_pass) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } + + + + AssertNoGlErrors; + + RegisterShaderForHotReload(GetStdlib(), &Struct->Program); +} + +link_internal void +UseShader( textured_quad_render_pass *Struct ) +{ + GetGL()->UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + if (UniformIndex != 4 ) + { + Error("Shader (textured_quad_render_pass) had an incorrect number of uniform slots!"); + } +} + diff --git a/jesse.make.sh b/jesse.make.sh index 11051035c..384beb04f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/settings.init b/settings.init index 14279f01f..3679271cd 100644 --- a/settings.init +++ b/settings.init @@ -14,10 +14,10 @@ // When I get around to improving the shadows it'll control more than that.. // - shadow_quality = ShadowQualitySetting_High +// shadow_quality = ShadowQualitySetting_High // shadow_quality = ShadowQualitySetting_Med // shadow_quality = ShadowQualitySetting_Low -// shadow_quality = ShadowQualitySetting_Off + shadow_quality = ShadowQualitySetting_Off @@ -25,10 +25,10 @@ // NOTE(Jesse)(lighting_setting): Currently does nothing // - lighting_quality = LightingQualitySetting_High +// lighting_quality = LightingQualitySetting_High // lighting_quality = LightingQualitySetting_Med // lighting_quality = LightingQualitySetting_Low -// lighting_quality = LightingQualitySetting_Off + lighting_quality = LightingQualitySetting_Off diff --git a/shaders/terrain/decoration/terrain_decoration.fragmentshader b/shaders/terrain/decoration/terrain_decoration.fragmentshader index 432f434ef..8d7127e6e 100644 --- a/shaders/terrain/decoration/terrain_decoration.fragmentshader +++ b/shaders/terrain/decoration/terrain_decoration.fragmentshader @@ -168,10 +168,6 @@ void main() f32 y = floor(gl_FragCoord.y - (z*66)); - /* if (x == 0 || x == 65) { Output = V4(1,0,0,1); return; } */ - /* if (y == 0 || y == 65) { Output = V4(1,1,0,1); return; } */ - /* if (z == 0 || z == 65) { Output = V4(1,0,1,1); return; } */ - /* v3 Offset = V3(-1, -1, -1); */ v3 Offset = V3(0); v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); @@ -192,31 +188,12 @@ void main() { // Put random junk here - - /* f32 White = Clamp01(1.5f+white_noise(Basis)); */ - /* v3 Green = V3(0.1f, 0.7f, 0.1f)*White; */ - /* /1* ColorValue = V3(White); *1/ */ f32 CosTheta = Dot(Derivs, Normalize(V3(0,0,1))); - /* ColorValue = abs(Derivs); */ - /* ColorValue = v3(CosTheta); */ - /* /1* ColorValue = Green*Clamp01(0.5+CosTheta); *1/ */ - - v4 Cliffs = DoCliffs(Basis, Derivs); - ColorValue = Cliffs.xyz*Clamp01(0.8f+CosTheta); + v4 Cliffs = V4(0); + ColorValue = V3(0.1f, 0.8f, 0.1f); NoiseValue += Cliffs.w; - /* v3 v = voronoi_noise(Basis/v3(200,200,1800)) * 100.f; */ - /* NoiseValue += v.x * CosTheta; */ - /* /1* NoiseValue += v.x; *1/ */ - /* /1* if (CosTheta < 0.85f) NoiseValue += v.x; *1/ */ - - /* if (NoiseValue <= 0.f) ColorValue = V3(0); */ - - /* ColorValue = Derivs; */ - /* ColorValue = abs(Derivs); */ - /* ColorValue = NoiseValue/V3(5000.f); */ - } // diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/terrain_shaping.fragmentshader index 44b441b30..8b6e8d8e2 100644 --- a/shaders/terrain/shaping/terrain_shaping.fragmentshader +++ b/shaders/terrain/shaping/terrain_shaping.fragmentshader @@ -279,57 +279,16 @@ void main() NoiseValue += StartingZDepth - Basis.z; f32 CliffMask = 1.f; -#if 1 { - v3 Period = V3(12000.f); - float Amplitude = 2000.f; + v3 Period = V3(1800.f); + float Amplitude = 200.f; v3 xyz = Basis / Period; v4 gn = gradient_noise_derivs(xyz); - CliffMask = (gn.x+1.f)/2.f; - CliffMask += 0.3f; - CliffMask = min(CliffMask, 1.f); - CliffMask = pow(CliffMask, 8); - CliffMask = max(CliffMask, 0.f); - CliffMask = CliffMask; - - NoiseValue += CliffMask * Amplitude; - } -#endif - -#if 1 - { - v3 Period = V3(2000.f); - float Amplitude = 1200.f; - - v3 xyz = Basis / Period; - v4 gn = gradient_noise_derivs(xyz); - - f32 N = 0.33f+(1.f+gn.x)/2.f; - NoiseValue += pow(N, 5) * Amplitude * CliffMask; + NoiseValue += gn.x * Amplitude; } -#endif -#if 0 - { - v3 Period = V3(200.f); - float Amplitude = 150.f; - - v3 xyz = Basis / Period; - v4 gn = gradient_noise_derivs(xyz); - - /* NoiseValue += (CosineInterpolatePointSet((gn.x+1.f)/2.f)*2.f-1.f) * Amplitude; */ - f32 N = 0.20f+(1.f+gn.x)/2.f; - NoiseValue += pow(N, 5) * Amplitude; - - /* NoiseValue += Smoothstep(pow(Clamp01(gn.x), 0.1)) * Amplitude; */ - - f32 xyContrib = 0.2f*(max(abs(Basis.x), abs(Basis.y))); - /* f32 xyContrib = 0.f; */ - NoiseValue -= Basis.z - xyContrib; - } -#endif } // From 0d18936fdb7e164687c255849903ff75252b8f30 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 10 Sep 2025 22:53:13 -0700 Subject: [PATCH 325/421] Update docs --- docs/controls.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ readme.md | 27 +++++++++++++++++---------- 2 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 docs/controls.md diff --git a/docs/controls.md b/docs/controls.md new file mode 100644 index 000000000..f18380ff2 --- /dev/null +++ b/docs/controls.md @@ -0,0 +1,45 @@ +# Legend + +This is notation for the single keystroke 'a' +``` +a +``` + +This is notation for a single keystroke of any of 'w', 'a', 's', 'd', +``` +wasd +``` + +This is notation for the chord 'Ctrl + s' +``` + +``` + +This is notation for the chord 'Alt + s' +``` + +``` + + +# General + +`f1` : toggle debug menu + +`escape` : load "project\_and\_level\_picker", or quit + +# Camera Controls + +`wasd` : move camera on a horizontal plane + +`q` : move camera down + +`e` : move camera up + +hold `rmouse` : rotate camera + + +# Editor + +`` : Begin selection + +`` : Center camera on selection diff --git a/readme.md b/readme.md index 87415ab91..593ce72ab 100644 --- a/readme.md +++ b/readme.md @@ -5,24 +5,31 @@ # Welcome to Bonsai! -Bonsai is a 3D voxel-based engine built with the intention of writing both +Bonsai is a small voxel engine, in a pot. It's been tended to with love and +care over the years, and has been built with the intention of writing both fast-paced arcade games and tile/turn-based RPGs Bonsai, and nearly all it's dependencies, are written completely from scratch. -One external dependency is the C runtime library for program startup. I have a -back-burner task to remove the CRT entirely, though it's unclear when/if I'll -get around to it. +One external dependency is the C runtime library for program startup. There is +a back-burner task to remove the CRT entirely, athough it's unclear when/if +anyone will ever get around to it. -The only requirements to build and run Bonsai are an OpenGL 3.3+ driver, C++ -compiler, and a few appropriate system headers. +The only external requirements to build Bonsai are clang++ (>= version 16) and +a few appropriate system headers. ![banner](screenshots/two_doors.png) -# Quickstart +# Getting Started + +## Quickstart Grab pre-built binaries & assets from the [Latest Releases](../../releases/latest) for your platform of your choice (as long as your platform of choice is Windows or Linux) ;) +## New Project + +TODO(Jesse): Docs for starting a new project + ## Build from Source See the docs on the [build process](docs/01_build_process.md). @@ -76,15 +83,15 @@ See the docs on the [build process](docs/01_build_process.md). ## SDF Brushes * Layer-based brush GUI -* (coming soon) Fully programmable custom brush shaders +* (coming soon) glsl brush shaders ![banner](screenshots/brush.png) ## Performance Profiler * Manual Instrumentation -* Memory allocation tracing -* Per frame call-graph tracing +* Memory allocation tracking +* Multithreaded callgraph tracing * Context Switches (windows only) * Physical Core (windows only) From 94400b678486ae67abe1b78377ac4ab3ecefd86e Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 11 Sep 2025 09:53:15 -0700 Subject: [PATCH 326/421] Cleanup terrain shaders, add controls.md --- docs/controls.md | 21 +- examples/terrain_gen/game.cpp | 6 +- external/bonsai_stdlib | 2 +- ...r_magic_struct_terrain_decoration_shader.h | 2 +- ...ader_magic_struct_terrain_shaping_shader.h | 2 +- jesse.make.sh | 2 +- ...mentshader => cliffy_hills.fragmentshader} | 0 .../terrain/decoration/default.fragmentshader | 51 +++++ .../terrain/shaping/0_gradient.fragmentshader | 58 ++++++ ...gmentshader => 1_FBM_small.fragmentshader} | 25 +-- ...ragmentshader => 2_voronoi.fragmentshader} | 9 +- ...ntshader => 3_cliffy_hills.fragmentshader} | 0 ...der => 4_dottedboxguy_arch.fragmentshader} | 11 +- ...mentshader => 5_mandlebulb.fragmentshader} | 8 +- ...agmentshader => 6_trunchet.fragmentshader} | 7 +- ....fragmentshader => default.fragmentshader} | 0 .../terrain/shaping/gradient.fragmentshader | 187 ------------------ src/engine/graphics.h | 4 +- src/engine/level.h | 2 +- src/engine/render/render_init.cpp | 6 +- 20 files changed, 165 insertions(+), 238 deletions(-) rename shaders/terrain/decoration/{terrain_decoration.fragmentshader => cliffy_hills.fragmentshader} (100%) create mode 100644 shaders/terrain/decoration/default.fragmentshader create mode 100644 shaders/terrain/shaping/0_gradient.fragmentshader rename shaders/terrain/shaping/{FBM_small.fragmentshader => 1_FBM_small.fragmentshader} (51%) rename shaders/terrain/shaping/{voronoi.fragmentshader => 2_voronoi.fragmentshader} (92%) rename shaders/terrain/shaping/{cliffy_hills.fragmentshader => 3_cliffy_hills.fragmentshader} (100%) rename shaders/terrain/shaping/{dottedboxguy_arch.fragmentshader => 4_dottedboxguy_arch.fragmentshader} (93%) rename shaders/terrain/shaping/{mandlebulb.fragmentshader => 5_mandlebulb.fragmentshader} (91%) rename shaders/terrain/shaping/{trunchet.fragmentshader => 6_trunchet.fragmentshader} (93%) rename shaders/terrain/shaping/{terrain_shaping.fragmentshader => default.fragmentshader} (100%) delete mode 100644 shaders/terrain/shaping/gradient.fragmentshader diff --git a/docs/controls.md b/docs/controls.md index f18380ff2..6f8a50da5 100644 --- a/docs/controls.md +++ b/docs/controls.md @@ -40,6 +40,23 @@ hold `rmouse` : rotate camera # Editor -`` : Begin selection +`` : Begin area selection + +`lclick` : Finish area selection + +`` : Center camera on selection + +`` : Multi-select + +## With area selected + +`` : Scale along axis + +`` : Scale along axis; both sides + +`` : Scale along all axies + +`` : Translate along axis -`` : Center camera on selection diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 5a6b2b983..1d4122c99 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -15,7 +15,6 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() Global_AssetPrefixPath = CSz("examples/terrain_gen/assets"); - /* world_position WorldCenter = V3i(s32_MAX-1000); */ world_position WorldCenter = V3i(100, 100, 0); canonical_position CameraTargetP = {}; @@ -74,7 +73,10 @@ BONSAI_API_MAIN_THREAD_CALLBACK() { global_variable window_layout Window = WindowLayout("Terrain Shaping Shader", WindowLayoutFlag_Align_Right); PushWindowStart(Ui, &Window); - file_traversal_node_block_array Files = GetLexicographicallySortedListOfFilesInDirectory(CSz("shaders/terrain/shaping"), GetTranArena()); + + file_traversal_node_block_array Files = + GetLexicographicallySortedListOfFilesInDirectory( + CSz("shaders/terrain/shaping"), GetTranArena()); u32 I = 0; IterateOver(&Files, FileNode, FileNodeIndex) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 07e15da09..0306387a9 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 07e15da09d4be094ed04c27fb120e97417cf5d3b +Subproject commit 0306387a9901da4e5e3e6c2e225573cca9d4b799 diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index c54c7ca8f..3dbaa4caf 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -8,7 +8,7 @@ InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Str , v3 ChunkResolution ) { - Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/terrain_decoration.fragmentshader")); + Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/default.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index 05a3c139b..e8676b4d9 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -7,7 +7,7 @@ InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct , v3 ChunkResolution ) { - Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/terrain_shaping.fragmentshader")); + Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/default.fragmentshader")); Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); u32 UniformIndex = 0; diff --git a/jesse.make.sh b/jesse.make.sh index 384beb04f..11051035c 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/terrain/decoration/terrain_decoration.fragmentshader b/shaders/terrain/decoration/cliffy_hills.fragmentshader similarity index 100% rename from shaders/terrain/decoration/terrain_decoration.fragmentshader rename to shaders/terrain/decoration/cliffy_hills.fragmentshader diff --git a/shaders/terrain/decoration/default.fragmentshader b/shaders/terrain/decoration/default.fragmentshader new file mode 100644 index 000000000..0baca7eea --- /dev/null +++ b/shaders/terrain/decoration/default.fragmentshader @@ -0,0 +1,51 @@ +uniform v3 WorldspaceChunkBasis; +uniform v3 ChunkResolution; + +uniform sampler2D DerivsTex; +uniform sampler2D InputTex; + +in vec2 UV; +out v4 Output; + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); + + + v3 Offset = V3(0); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); + + ivec2 InputTexCoord = ivec2(gl_FragCoord.x + 1, (y + 1) + (z * 68) + 68 ); + v4 TexLookup = texelFetch(InputTex, InputTexCoord, 0); + v3 Derivs = texelFetch(DerivsTex, ivec2(gl_FragCoord.xy) + ivec2(0, 0), 0).xyz; + + // NOTE(Jesse): Set these in the -- user code -- section + vec3 ColorValue = TexLookup.rgb; + f32 NoiseValue = TexLookup.a; + + // + // -- user code -- + // + + { + if (length(ColorValue) < 0.01f) + { + ColorValue = V3(0.1f, 0.8f, 0.1f); + } + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; + + /* uint SolidBit = NoiseValue > 0.f ? 1u : 0u; */ + /* uint PackedColor = PackRGB(ColorValue); */ + /* /1* uint PackedColor = 3543u; *1/ */ + + /* Output = (SolidBit << 15) | PackedColor; */ +} diff --git a/shaders/terrain/shaping/0_gradient.fragmentshader b/shaders/terrain/shaping/0_gradient.fragmentshader new file mode 100644 index 000000000..f5ffbe12c --- /dev/null +++ b/shaders/terrain/shaping/0_gradient.fragmentshader @@ -0,0 +1,58 @@ +uniform v3 WorldspaceChunkBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out v4 Output; + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); + + v3 Offset = V3(-1, -1, -1); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + v3 Period = V3(100.f); + float Amplitude = 200.f; + f32 StartingZDepth = 400.f; + s32 Octaves = 1; + + NoiseValue = StartingZDepth; + + v3 deriv = v3(0.f); + f32 warp = 0.f; + + for (s32 Octave = 1; Octave <= Octaves; ++Octave) + { + v3 xyz = Basis / (Period/Octave); + + v4 gn = gradient_noise_derivs(xyz+warp); + deriv += gn.yzw; + + NoiseValue = NoiseValue + (gn.x * (Amplitude/Octave)); + } + + deriv = normalize(deriv); + ColorValue = abs(deriv); + + // Bias noise value to lower values as we get higher in z. + // This creates a "plane" of terrain + NoiseValue = NoiseValue - Basis.z; + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; +} diff --git a/shaders/terrain/shaping/FBM_small.fragmentshader b/shaders/terrain/shaping/1_FBM_small.fragmentshader similarity index 51% rename from shaders/terrain/shaping/FBM_small.fragmentshader rename to shaders/terrain/shaping/1_FBM_small.fragmentshader index 5006cfb19..14b1a12a3 100644 --- a/shaders/terrain/shaping/FBM_small.fragmentshader +++ b/shaders/terrain/shaping/1_FBM_small.fragmentshader @@ -8,12 +8,10 @@ out v4 Output; void main() { f32 x = floor(gl_FragCoord.x); - f32 z = floor(gl_FragCoord.y / 66); - f32 y = floor(gl_FragCoord.y - (z*66)); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); - /* v3 Offset = V3(-1, -1, -1); */ - v3 Offset = V3(0); - v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); + v3 Basis = WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); // NOTE(Jesse): Set these in the -- user code -- section v3 ColorValue = V3(0.f); @@ -24,11 +22,10 @@ void main() // { - v3 Period = V3(1500.f); + v3 Period = V3(500.f); float Amplitude = 150.f; - f32 StartingZDepth = 1000; - /* f32 StartingZDepth = 0; */ - s32 Octaves = 6; + f32 StartingZDepth = 200; + s32 Octaves = 5; NoiseValue = StartingZDepth; f32 warp = 0.f; @@ -43,9 +40,6 @@ void main() NoiseValue -= Basis.z; ColorValue = V3(0.2f, 0.8f, 0.15f); - /* ColorValue = Basis/1000.f; */ - /* ColorValue = V3(x,y,z); */ - /* ColorValue = ChunkResolution/100.f; */ } // @@ -54,11 +48,4 @@ void main() Output.rgb = ColorValue; Output.a = NoiseValue; - - /* uint SolidBit = NoiseValue > 0.f ? 1u : 0u; */ - /* ColorValue = min(ColorValue, v3(1.f)); */ - /* uint PackedColor = PackRGB(ColorValue); */ - /* /1* uint PackedColor = 3543u; *1/ */ - - /* Output = (SolidBit << 15) | PackedColor; */ } diff --git a/shaders/terrain/shaping/voronoi.fragmentshader b/shaders/terrain/shaping/2_voronoi.fragmentshader similarity index 92% rename from shaders/terrain/shaping/voronoi.fragmentshader rename to shaders/terrain/shaping/2_voronoi.fragmentshader index 35a708383..afb35ae47 100644 --- a/shaders/terrain/shaping/voronoi.fragmentshader +++ b/shaders/terrain/shaping/2_voronoi.fragmentshader @@ -1,3 +1,4 @@ + uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; @@ -11,7 +12,7 @@ vec3 vhash(vec3 UV, vec3 offset) return vec3(sin(UV.z * +offset.x) * 0.5 + 0.5, cos(UV.x* offset.y) * 0.5 + 0.5,tan(UV.y * offset.z) * 0.5 + 0.5); } -#if 0 +#if 1 vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) { vec3 g = floor(p * CellDensity); @@ -68,7 +69,7 @@ void main() f32 z = floor(gl_FragCoord.y / 66); f32 y = floor(gl_FragCoord.y - (z*66)); - v3 Offset = V3(-1, -1, -1); + v3 Offset = V3(-2); v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); // NOTE(Jesse): Set these in the -- user code -- section @@ -107,8 +108,4 @@ void main() Output.rgb = ColorValue; Output.a = NoiseValue; - /* uint SolidBit = NoiseValue > 0.f ? 1u : 0u; */ - /* uint PackedColor = PackRGB(ColorValue); */ - - /* Output = (SolidBit << 15) | PackedColor; */ } diff --git a/shaders/terrain/shaping/cliffy_hills.fragmentshader b/shaders/terrain/shaping/3_cliffy_hills.fragmentshader similarity index 100% rename from shaders/terrain/shaping/cliffy_hills.fragmentshader rename to shaders/terrain/shaping/3_cliffy_hills.fragmentshader diff --git a/shaders/terrain/shaping/dottedboxguy_arch.fragmentshader b/shaders/terrain/shaping/4_dottedboxguy_arch.fragmentshader similarity index 93% rename from shaders/terrain/shaping/dottedboxguy_arch.fragmentshader rename to shaders/terrain/shaping/4_dottedboxguy_arch.fragmentshader index 8738108ba..5e1b69597 100644 --- a/shaders/terrain/shaping/dottedboxguy_arch.fragmentshader +++ b/shaders/terrain/shaping/4_dottedboxguy_arch.fragmentshader @@ -2,7 +2,7 @@ uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; in vec2 UV; -out uint Output; +out vec4 Output; float sstep(float init_x){ float x = clamp(init_x,-1.,1.); @@ -125,9 +125,12 @@ void main() // -- end user code -- // - uint SolidBit = NoiseValue > 0.0f ? 1u : 0u; - uint PackedColor = PackRGB(ColorValue); + + Output.rgb = ColorValue; + Output.a = NoiseValue; + /* uint SolidBit = NoiseValue > 0.0f ? 1u : 0u; */ + /* uint PackedColor = PackRGB(ColorValue); */ /* uint PackedColor = 3543u; */ - Output = (SolidBit << 15) | PackedColor; + /* Output = (SolidBit << 15) | PackedColor; */ } diff --git a/shaders/terrain/shaping/mandlebulb.fragmentshader b/shaders/terrain/shaping/5_mandlebulb.fragmentshader similarity index 91% rename from shaders/terrain/shaping/mandlebulb.fragmentshader rename to shaders/terrain/shaping/5_mandlebulb.fragmentshader index d476a3c92..6dcc2b965 100644 --- a/shaders/terrain/shaping/mandlebulb.fragmentshader +++ b/shaders/terrain/shaping/5_mandlebulb.fragmentshader @@ -2,7 +2,7 @@ uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; in vec2 UV; -out uint Output; +out vec4 Output; vec4 mandlebulb(vec3 p) { @@ -81,8 +81,6 @@ void main() // -- end user code -- // - uint SolidBit = NoiseValue > 0.f ? 1u : 0u; - uint PackedColor = PackRGB(ColorValue); - - Output = (SolidBit << 15) | PackedColor; + Output.rgb = ColorValue; + Output.a = NoiseValue; } diff --git a/shaders/terrain/shaping/trunchet.fragmentshader b/shaders/terrain/shaping/6_trunchet.fragmentshader similarity index 93% rename from shaders/terrain/shaping/trunchet.fragmentshader rename to shaders/terrain/shaping/6_trunchet.fragmentshader index 9f7600a2a..f2f88be02 100644 --- a/shaders/terrain/shaping/trunchet.fragmentshader +++ b/shaders/terrain/shaping/6_trunchet.fragmentshader @@ -2,7 +2,7 @@ uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; in vec2 UV; -out uint Output; +out vec4 Output; // https://www.shadertoy.com/view/4td3zj float heightMap(in vec2 p) { @@ -72,8 +72,5 @@ void main() // -- end user code -- // - uint SolidBit = NoiseValue > 0.0f ? 1u : 0u; - uint PackedColor = PackRGB(ColorValue); - - Output = (SolidBit << 15) | PackedColor; + Output.rgb = ColorValue; Output.a = NoiseValue; } diff --git a/shaders/terrain/shaping/terrain_shaping.fragmentshader b/shaders/terrain/shaping/default.fragmentshader similarity index 100% rename from shaders/terrain/shaping/terrain_shaping.fragmentshader rename to shaders/terrain/shaping/default.fragmentshader diff --git a/shaders/terrain/shaping/gradient.fragmentshader b/shaders/terrain/shaping/gradient.fragmentshader deleted file mode 100644 index 875dd9d07..000000000 --- a/shaders/terrain/shaping/gradient.fragmentshader +++ /dev/null @@ -1,187 +0,0 @@ -uniform v3 WorldspaceChunkBasis; -uniform v3 ChunkResolution; - -in vec2 UV; -out v4 Output; -/* layout (location = 0) out float Output; */ - - -// https://www.shadertoy.com/view/4dffRH -// -// -// -// The MIT License -// Copyright © 2017 Inigo Quilez -// 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. -// -// https://www.youtube.com/c/InigoQuilez -// https://iquilezles.org/ - -// Computes the analytic derivatives of a 3D Gradient Noise. This can be used for example to compute normals to a -// 3d rocks based on Gradient Noise without approximating the gradient by having to take central differences. -// -// More info here: https://iquilezles.org/articles/gradientnoise - -// All noise functions here: -// -// https://www.shadertoy.com/playlist/fXlXzf&from=0&num=12 - - -// 0: integer hash -// 1: float hash (aliasing based) -#define METHOD 1 - -// 0: cubic -// 1: quintic -#define INTERPOLANT 1 - - -#if METHOD==0 -vec3 hash( ivec3 p ) // this hash is not production ready, please -{ // replace this by something better - ivec3 n = ivec3( p.x*127 + p.y*311 + p.z*74, - p.x*269 + p.y*183 + p.z*246, - p.x*113 + p.y*271 + p.z*124); - - // 1D hash by Hugo Elias - n = (n << 13) ^ n; - n = n * (n * n * 15731 + 789221) + 1376312589; - return -1.0+2.0*vec3( n & ivec3(0x0fffffff))/float(0x0fffffff); -} - -#else -vec3 hash( vec3 p ) // this hash is not production ready, please -{ // replace this by something better - p = vec3( dot(p,vec3(127.1,311.7, 74.7)), - dot(p,vec3(269.5,183.3,246.1)), - dot(p,vec3(113.5,271.9,124.6))); - - return -1.0 + 2.0*fract(sin(p)*43758.5453123); -} -#endif - -// return value noise (in x) and its derivatives (in yzw) -// -vec4 gradient_noise_derivs( in vec3 x ) -{ - // grid - #if METHOD==0 - ivec3 i = ivec3(floor(x)); - #else - vec3 i = floor(x); - #endif - vec3 f = fract(x); - - #if INTERPOLANT==1 - // quintic interpolant - vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); - vec3 du = 30.0*f*f*(f*(f-2.0)+1.0); - #else - // cubic interpolant - vec3 u = f*f*(3.0-2.0*f); - vec3 du = 6.0*f*(1.0-f); - #endif - - // gradients - #if METHOD==0 - vec3 ga = hash( i+ivec3(0,0,0) ); - vec3 gb = hash( i+ivec3(1,0,0) ); - vec3 gc = hash( i+ivec3(0,1,0) ); - vec3 gd = hash( i+ivec3(1,1,0) ); - vec3 ge = hash( i+ivec3(0,0,1) ); - vec3 gf = hash( i+ivec3(1,0,1) ); - vec3 gg = hash( i+ivec3(0,1,1) ); - vec3 gh = hash( i+ivec3(1,1,1) ); - #else - vec3 ga = hash( i+vec3(0.0,0.0,0.0) ); - vec3 gb = hash( i+vec3(1.0,0.0,0.0) ); - vec3 gc = hash( i+vec3(0.0,1.0,0.0) ); - vec3 gd = hash( i+vec3(1.0,1.0,0.0) ); - vec3 ge = hash( i+vec3(0.0,0.0,1.0) ); - vec3 gf = hash( i+vec3(1.0,0.0,1.0) ); - vec3 gg = hash( i+vec3(0.0,1.0,1.0) ); - vec3 gh = hash( i+vec3(1.0,1.0,1.0) ); - #endif - - // projections - float va = dot( ga, f-vec3(0.0,0.0,0.0) ); - float vb = dot( gb, f-vec3(1.0,0.0,0.0) ); - float vc = dot( gc, f-vec3(0.0,1.0,0.0) ); - float vd = dot( gd, f-vec3(1.0,1.0,0.0) ); - float ve = dot( ge, f-vec3(0.0,0.0,1.0) ); - float vf = dot( gf, f-vec3(1.0,0.0,1.0) ); - float vg = dot( gg, f-vec3(0.0,1.0,1.0) ); - float vh = dot( gh, f-vec3(1.0,1.0,1.0) ); - - // interpolations - return vec4( va + u.x*(vb-va) + u.y*(vc-va) + u.z*(ve-va) + u.x*u.y*(va-vb-vc+vd) + u.y*u.z*(va-vc-ve+vg) + u.z*u.x*(va-vb-ve+vf) + (-va+vb+vc-vd+ve-vf-vg+vh)*u.x*u.y*u.z, // value - ga + u.x*(gb-ga) + u.y*(gc-ga) + u.z*(ge-ga) + u.x*u.y*(ga-gb-gc+gd) + u.y*u.z*(ga-gc-ge+gg) + u.z*u.x*(ga-gb-ge+gf) + (-ga+gb+gc-gd+ge-gf-gg+gh)*u.x*u.y*u.z + // derivatives - du * (vec3(vb,vc,ve) - va + u.yzx*vec3(va-vb-vc+vd,va-vc-ve+vg,va-vb-ve+vf) + u.zxy*vec3(va-vb-ve+vf,va-vb-vc+vd,va-vc-ve+vg) + u.yzx*u.zxy*(-va+vb+vc-vd+ve-vf-vg+vh) )); -} - -void main() -{ - f32 x = floor(gl_FragCoord.x); - f32 z = floor(gl_FragCoord.y / 66); - f32 y = floor(gl_FragCoord.y - (z*66)); - - v3 Offset = V3(-1, -1, -1); - v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); - - // NOTE(Jesse): Set these in the -- user code -- section - v3 ColorValue = V3(0.f); - f32 NoiseValue = 0.f; - - // - // -- user code -- - // - { - v3 Period = V3(100.f); - float Amplitude = 200.f; - f32 StartingZDepth = 400.f; - s32 Octaves = 1; - - NoiseValue = StartingZDepth; - - v3 deriv = v3(0.f); - /* f32 warp = gradient_noise(Basis*1.001); */ - f32 warp = 0.f; - - for (s32 Octave = 1; Octave <= Octaves; ++Octave) - { - v3 xyz = Basis / (Period/Octave); - - v4 gn = gradient_noise_derivs(xyz+warp); - deriv += gn.yzw; - - NoiseValue = NoiseValue + (gn.x * (Amplitude/Octave)); - } - - deriv = normalize(deriv); - ColorValue = abs(deriv); - - // Bias noise value to lower values as we get higher in z. - // This creates a "plane" of terrain - NoiseValue = NoiseValue - Basis.z; - } - - // - // -- end user code -- - // - - Output.rgb = ColorValue; - Output.a = NoiseValue; -} diff --git a/src/engine/graphics.h b/src/engine/graphics.h index e96493ad2..58ffdf4aa 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -2,7 +2,7 @@ struct terrain_shaping_render_context poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") - @frag_source_file("shaders/terrain/shaping/terrain_shaping.fragmentshader") ) + @frag_source_file("shaders/terrain/shaping/default.fragmentshader") ) { shader Program; shader_uniform Uniforms[3]; @@ -28,7 +28,7 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader struct terrain_decoration_render_context poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") - @frag_source_file("shaders/terrain/decoration/terrain_decoration.fragmentshader") ) + @frag_source_file("shaders/terrain/decoration/default.fragmentshader") ) { shader Program; shader_uniform Uniforms[4]; diff --git a/src/engine/level.h b/src/engine/level.h index 6d5dc6f3c..a86b3da0d 100644 --- a/src/engine/level.h +++ b/src/engine/level.h @@ -12,7 +12,7 @@ struct level_header // World Params // - v3i WorldCenter; + v3i WorldCenter; // in world chunks ..? visible_region_size VisibleRegionSize; camera Camera; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 4b8c44f0d..10ffe3ef3 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -357,7 +357,11 @@ InitAoRenderGroup(v2i ApplicationResolution, ao_render_group *AoGroup) GetGL()->BindFramebuffer(GL_FRAMEBUFFER, AoGroup->FBO.ID); b32 IsDepthTexture = False; - AoGroup->Texture = MakeTexture_SingleChannel( ApplicationResolution/2, CSz("AoTexture"), IsDepthTexture, TextureStorageFormat_R16F); + AoGroup->Texture = MakeTexture_SingleChannel( + ApplicationResolution/2, + CSz("AoTexture"), + IsDepthTexture, + TextureStorageFormat_R16F ); FramebufferTexture(&AoGroup->FBO, &AoGroup->Texture); SetDrawBuffers(&AoGroup->FBO); From bc8502507cd5189153907d8a10bd475de74ab0f1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 11 Sep 2025 10:43:32 -0700 Subject: [PATCH 327/421] Cleanup --- external/bonsai_stdlib | 2 +- .../terrain/TerrainFinalize.fragmentshader | 4 - .../decoration/cliffy_hills.fragmentshader | 27 +- .../terrain/decoration/default.fragmentshader | 10 +- .../terrain/decoration/derivs.fragmentshader | 42 +++ .../terrain/shaping/2_voronoi.fragmentshader | 4 +- .../shaping/3_cliffy_hills.fragmentshader | 4 +- .../terrain/shaping/default.fragmentshader | 264 +----------------- 8 files changed, 64 insertions(+), 293 deletions(-) create mode 100644 shaders/terrain/decoration/derivs.fragmentshader diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 0306387a9..f0ea55010 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 0306387a9901da4e5e3e6c2e225573cca9d4b799 +Subproject commit f0ea55010612c95e73ff25c54a9c1b5b58cf1bf5 diff --git a/shaders/terrain/TerrainFinalize.fragmentshader b/shaders/terrain/TerrainFinalize.fragmentshader index b3b156b52..e371ea79a 100644 --- a/shaders/terrain/TerrainFinalize.fragmentshader +++ b/shaders/terrain/TerrainFinalize.fragmentshader @@ -10,13 +10,9 @@ void main() f32 NoiseValue = TexLookup.a; v3 ColorValue = TexLookup.rgb; - /* v3 ColorValue = V3(1.f,0.f,0.f); */ uint SolidBit = NoiseValue > 0.f ? 1u : 0u; uint PackedColor = PackRGB(ColorValue); - /* uint SolidBit = 1u & uint(white_noise(v3(gl_FragCoord.xy, 1.f)) > 0.f); */ - /* uint PackedColor = 3543u; */ - Output = (SolidBit << 15) | PackedColor; } diff --git a/shaders/terrain/decoration/cliffy_hills.fragmentshader b/shaders/terrain/decoration/cliffy_hills.fragmentshader index 8d7127e6e..310482079 100644 --- a/shaders/terrain/decoration/cliffy_hills.fragmentshader +++ b/shaders/terrain/decoration/cliffy_hills.fragmentshader @@ -48,7 +48,7 @@ v4 DoCliffs(v3 Basis, v3 Deriv) CliffValue += (v.y*50)*Cliffness; CliffColor = mix(CliffColor, BaseCliffColor, clamp(10*Cliffness*v.x,0,1)); } -#if 1 +#if 0 { v3 v = voronoi_noise(Basis/v3(100,100,600)); v.x += 0.5f; @@ -134,16 +134,16 @@ v4 DoCliffs(v3 Basis, v3 Deriv) } // Rocky edges - { - f32 MinDotValue = 0.6f; - v3 v = voronoi_noise(Basis/v3(20,20,20)); - f32 Power = 100*gravel_patch_stregth*Cliffness*abs(clamp(Cliffness-MinDotValue, -MinDotValue, 0)); - if (v.x*Power > 3.f) - { - NoiseValue += v.x*Power; - ColorValue = v3(1.0); - } - } + /* { */ + /* f32 MinDotValue = 0.6f; */ + /* v3 v = voronoi_noise(Basis/v3(20,20,20)); */ + /* f32 Power = 100*gravel_patch_stregth*Cliffness*abs(clamp(Cliffness-MinDotValue, -MinDotValue, 0)); */ + /* if (v.x*Power > 3.f) */ + /* { */ + /* NoiseValue += v.x*Power; */ + /* ColorValue = v3(1.0); */ + /* } */ + /* } */ /* { */ /* f32 MinDotValue = 0.4f; */ /* v3 v = voronoi_noise(Basis/v3(10,10,10)); */ @@ -168,19 +168,16 @@ void main() f32 y = floor(gl_FragCoord.y - (z*66)); - /* v3 Offset = V3(-1, -1, -1); */ v3 Offset = V3(0); v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); ivec2 InputTexCoord = ivec2(gl_FragCoord.x + 1, (y + 1) + (z * 68) + 68 ); v4 TexLookup = texelFetch(InputTex, InputTexCoord, 0); v3 Derivs = texelFetch(DerivsTex, ivec2(gl_FragCoord.xy) + ivec2(0, 0), 0).xyz; - /* v3 Derivs = texelFetch(DerivsTex, ivec2(gl_FragCoord.xy+ivec2(1,66)), 0).xyz; */ // NOTE(Jesse): Set these in the -- user code -- section vec3 ColorValue = TexLookup.rgb; f32 NoiseValue = TexLookup.a; - // // -- user code -- // @@ -190,7 +187,7 @@ void main() // Put random junk here f32 CosTheta = Dot(Derivs, Normalize(V3(0,0,1))); - v4 Cliffs = V4(0); + v4 Cliffs = DoCliffs(ColorValue, Derivs); ColorValue = V3(0.1f, 0.8f, 0.1f); NoiseValue += Cliffs.w; diff --git a/shaders/terrain/decoration/default.fragmentshader b/shaders/terrain/decoration/default.fragmentshader index 0baca7eea..6d4d775b5 100644 --- a/shaders/terrain/decoration/default.fragmentshader +++ b/shaders/terrain/decoration/default.fragmentshader @@ -10,8 +10,8 @@ out v4 Output; void main() { f32 x = floor(gl_FragCoord.x); - f32 z = floor(gl_FragCoord.y / 68); - f32 y = floor(gl_FragCoord.y - (z*68)); + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); v3 Offset = V3(0); @@ -42,10 +42,4 @@ void main() Output.rgb = ColorValue; Output.a = NoiseValue; - - /* uint SolidBit = NoiseValue > 0.f ? 1u : 0u; */ - /* uint PackedColor = PackRGB(ColorValue); */ - /* /1* uint PackedColor = 3543u; *1/ */ - - /* Output = (SolidBit << 15) | PackedColor; */ } diff --git a/shaders/terrain/decoration/derivs.fragmentshader b/shaders/terrain/decoration/derivs.fragmentshader new file mode 100644 index 000000000..cdb3c61d4 --- /dev/null +++ b/shaders/terrain/decoration/derivs.fragmentshader @@ -0,0 +1,42 @@ +uniform v3 WorldspaceChunkBasis; +uniform v3 ChunkResolution; + +uniform sampler2D DerivsTex; +uniform sampler2D InputTex; + +in vec2 UV; +out v4 Output; + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); + + + v3 Offset = V3(0); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); + + ivec2 InputTexCoord = ivec2(gl_FragCoord.x + 1, (y + 1) + (z * 68) + 68 ); + v4 TexLookup = texelFetch(InputTex, InputTexCoord, 0); + v3 Derivs = texelFetch(DerivsTex, ivec2(gl_FragCoord.xy) + ivec2(0, 0), 0).xyz; + + // NOTE(Jesse): Set these in the -- user code -- section + vec3 ColorValue = TexLookup.rgb; + f32 NoiseValue = TexLookup.a; + + // + // -- user code -- + // + + { + ColorValue = abs(Derivs); + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; +} diff --git a/shaders/terrain/shaping/2_voronoi.fragmentshader b/shaders/terrain/shaping/2_voronoi.fragmentshader index afb35ae47..fe69b1ec8 100644 --- a/shaders/terrain/shaping/2_voronoi.fragmentshader +++ b/shaders/terrain/shaping/2_voronoi.fragmentshader @@ -66,8 +66,8 @@ void main() { f32 x = floor(gl_FragCoord.x); - f32 z = floor(gl_FragCoord.y / 66); - f32 y = floor(gl_FragCoord.y - (z*66)); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); v3 Offset = V3(-2); v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); diff --git a/shaders/terrain/shaping/3_cliffy_hills.fragmentshader b/shaders/terrain/shaping/3_cliffy_hills.fragmentshader index 06e08ea14..91d3eb9d8 100644 --- a/shaders/terrain/shaping/3_cliffy_hills.fragmentshader +++ b/shaders/terrain/shaping/3_cliffy_hills.fragmentshader @@ -110,8 +110,8 @@ RoundToNearestMultiple(f32 NumToRound, f32 Multiple) void main() { f32 x = floor(gl_FragCoord.x); - f32 z = floor(gl_FragCoord.y / 66); - f32 y = floor(gl_FragCoord.y - (z*66)); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); /* v3 Offset = V3(-1, -1, -1); */ v3 Offset = V3(0); diff --git a/shaders/terrain/shaping/default.fragmentshader b/shaders/terrain/shaping/default.fragmentshader index 8b6e8d8e2..e24655041 100644 --- a/shaders/terrain/shaping/default.fragmentshader +++ b/shaders/terrain/shaping/default.fragmentshader @@ -4,272 +4,20 @@ uniform v3 ChunkResolution; in vec2 UV; out v4 Output; - -// https://www.shadertoy.com/view/4dffRH -// -// -// -// The MIT License -// Copyright © 2017 Inigo Quilez -// 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. -// -// https://www.youtube.com/c/InigoQuilez -// https://iquilezles.org/ - -// Computes the analytic derivatives of a 3D Gradient Noise. This can be used for example to compute normals to a -// 3d rocks based on Gradient Noise without approximating the gradient by having to take central differences. -// -// More info here: https://iquilezles.org/articles/gradientnoise - -// All noise functions here: -// -// https://www.shadertoy.com/playlist/fXlXzf&from=0&num=12 - - -// 0: integer hash -// 1: float hash (aliasing based) -#define METHOD 1 - -// 0: cubic -// 1: quintic -#define INTERPOLANT 1 - - -#if METHOD==0 -vec3 hash( ivec3 p ) // this hash is not production ready, please -{ // replace this by something better - ivec3 n = ivec3( p.x*127 + p.y*311 + p.z*74, - p.x*269 + p.y*183 + p.z*246, - p.x*113 + p.y*271 + p.z*124); - - // 1D hash by Hugo Elias - n = (n << 13) ^ n; - n = n * (n * n * 15731 + 789221) + 1376312589; - return -1.0+2.0*vec3( n & ivec3(0x0fffffff))/float(0x0fffffff); -} - -#else -vec3 hash( vec3 p ) // this hash is not production ready, please -{ // replace this by something better - p = vec3( dot(p,vec3(127.1,311.7, 74.7)), - dot(p,vec3(269.5,183.3,246.1)), - dot(p,vec3(113.5,271.9,124.6))); - - return -1.0 + 2.0*fract(sin(p)*43758.5453123); -} -#endif - -// Doesn't support integer hashing -#if METHOD == 1 -float gradient_noise( in vec3 p ) -{ - vec3 i = floor( p ); - vec3 f = fract( p ); - - #if INTERPOLANT==1 - // quintic interpolant - vec3 u = f*f*f*(f*(f*6.0-15.0)+10.0); - #else - // cubic interpolant - vec3 u = f*f*(3.0-2.0*f); - #endif - - return mix( mix( mix( dot( hash( i + vec3(0.0,0.0,0.0) ), f - vec3(0.0,0.0,0.0) ), - dot( hash( i + vec3(1.0,0.0,0.0) ), f - vec3(1.0,0.0,0.0) ), u.x), - mix( dot( hash( i + vec3(0.0,1.0,0.0) ), f - vec3(0.0,1.0,0.0) ), - dot( hash( i + vec3(1.0,1.0,0.0) ), f - vec3(1.0,1.0,0.0) ), u.x), u.y), - mix( mix( dot( hash( i + vec3(0.0,0.0,1.0) ), f - vec3(0.0,0.0,1.0) ), - dot( hash( i + vec3(1.0,0.0,1.0) ), f - vec3(1.0,0.0,1.0) ), u.x), - mix( dot( hash( i + vec3(0.0,1.0,1.0) ), f - vec3(0.0,1.0,1.0) ), - dot( hash( i + vec3(1.0,1.0,1.0) ), f - vec3(1.0,1.0,1.0) ), u.x), u.y), u.z ); -} -#endif - -vec3 vhash(vec3 UV, vec3 offset) -{ - mat3 m = mat3(127.1,311.7, 74.7,269.5,183.3,246.1,113.5,271.9,124.6); - UV = fract(sin(UV* m) * 46839.32); - return vec3(sin(UV.z * +offset.x) * 0.5 + 0.5, cos(UV.x* offset.y) * 0.5 + 0.5,tan(UV.y * offset.z) * 0.5 + 0.5); -} - -vec4 voronoi_noise(vec3 p, vec3 AngleOffset, vec3 CellDensity) -{ - vec3 g = floor(p * CellDensity); - vec3 f = fract(p * CellDensity); - float res = 8.0; - float md=8.0; - vec3 mr; - vec4 Out; - for( int z=-1; z<=1; z++ ) - for( int y=-1; y<=1; y++ ) - for( int x=-1; x<=1; x++ ) - { - vec3 lattice = vec3(x,y,z); - vec3 offset=vhash(lattice + g ,AngleOffset); - vec3 r = lattice +offset -f; - float d = dot( r, r ); - if (d < res) - { - res=d; - mr=r; - } - } - - res = 8.0; - for( int z=-1; z<=1; z++ ) - for( int y=-1; y<=1; y++ ) - for( int x=-1; x<=1; x++ ) - { - vec3 lattice = vec3(x,y,z); - vec3 offset=vhash(lattice + g ,AngleOffset); - vec3 r = lattice +offset -f; - float d = dot( r, r ); - if( d < res ) - { - res = d; - Out.x= offset.x; - Out.y = d; - } - if( dot(mr-r,mr-r)>0.00001) - { - md = min( md, dot( 0.5*(mr+r), normalize(r-mr) ) ); - } - } - Out.z = mix(1.0, 0.0, smoothstep( 0.0, 0.1, md )); - Out.w = 1.0-smoothstep( 0.0, 0.1, res); - return Out; -} - -#if 0 -#extension GL_NV_shader_buffer_load : enable -// tx should be range 0-1 -f32 CosineInterpolatePointSet(f32 tx) -{ - /* Assert(Value <= 1.f); */ - /* Assert(Value >= 0.f); */ - - // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about - - /* v2 Points[] = */ - /* { */ - /* {{1.0f, 1.0f }}, */ - /* {{0.7f, 0.85f }}, */ - /* {{0.6f, 0.5f }}, */ - /* {{0.3f, 0.4f }}, */ - /* {{0.2f, 0.1f }}, */ - /* {{0.0f, 0.0f }}, */ - /* }; */ - - /* v2 Points[] = */ - /* { */ - /* {{1.0f, 1.0f }}, */ - /* {{0.5f, 0.7f }}, */ - /* {{0.35f, 0.43f }}, */ - /* {{0.3f, 0.4f }}, */ - /* {{0.2f, 0.1f }}, */ - /* {{0.0f, 0.0f }}, */ - /* }; */ - - const s32 PointCount = 2; - v2 Points[PointCount]; - Points[0] = v2(0.f, 0.0f); - Points[1] = v2(1.0f, 1.0f); - - /* const s32 PointCount = 4; */ - /* v2 Points[PointCount]; */ - /* Points[3] = v2(0.0f, 0.0f); */ - /* Points[2] = v2(0.1f, 0.2f); */ - /* Points[1] = v2(0.8f, 1.0f); */ - /* Points[0] = v2(1.0f, 1.0f); */ - - // Pretty nice - - /* s32 PointCount = 6; */ - /* v2 Points[6]; */ - /* Points[0] = v2(1.0f, 1.0f); */ - /* Points[1] = v2(0.7f, 0.7f); */ - /* Points[2] = v2(0.65f, 0.43f); */ - /* Points[3] = v2(0.6f, 0.4f); */ - /* Points[4] = v2(0.5f, 0.2f); */ - /* Points[5] = v2(0.0f, 0.1f); */ - - // Pillar-y - /* v2 Points[] = */ - /* { */ - /* {{2.0f, 0.5f }}, */ - /* {{0.6f, 0.3f }}, */ - /* {{0.1f, 0.2f }}, */ - /* {{0.05f, 0.45f }}, */ - /* {{0.0f , 0.5f }}, */ - /* }; */ - -/* v2 Points[] = */ -/* { */ -/* {{1.0f, 0.0f }}, */ -/* {{0.9f, 1.0f }}, */ -/* {{0.6f, 0.3f }}, */ -/* {{0.1f, 0.1f }}, */ -/* {{0.05f, 0.45f }}, */ -/* {{0.0f , 0.5f }}, */ -/* }; */ - - - - r32 Result = Points[0].x; - for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) - { - v2 P = Points[PointIndex]; - - if (tx >= P.x) - { - v2 PNext = Points[PointIndex + 1]; - v2 Tmp = P; - - P = PNext; - PNext = Tmp; - - r32 Range = PNext.x - P.x; - r32 t = Clamp01((tx-P.x) / Range); - Result = CosineInterpolate(t, P.y, PNext.y); - /* Result = mix(P.y, PNext.y, t); */ - break; - } - } - - /* Result = abs(max(Result, 1.0)); */ - return Result; -} -#endif - void main() { f32 x = floor(gl_FragCoord.x); f32 z = floor(gl_FragCoord.y / 68); f32 y = floor(gl_FragCoord.y - (z*68)); - ivec2 InputTexCoord = ivec2(gl_FragCoord.x + 1, (y + 1) + (z * 68) + 68 ); - v4 TexLookup = V4(0.f); - v3 Offset = V3(-2, -2, -2); + v3 Offset = V3(0); v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); // NOTE(Jesse): Set these in the -- user code -- section - v3 ColorValue = TexLookup.rgb; - f32 NoiseValue = TexLookup.a; + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; // // -- user code -- @@ -297,10 +45,4 @@ void main() Output.rgb = ColorValue; Output.a = NoiseValue; - - /* uint SolidBit = NoiseValue > 0.f ? 1u : 0u; */ - /* uint PackedColor = PackRGB(ColorValue); */ - /* /1* uint PackedColor = 3543u; *1/ */ - - /* Output = (SolidBit << 15) | PackedColor; */ } From e4d4e28b453bcf2950b25adb0ee524bc03533911 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 11 Sep 2025 12:17:42 -0700 Subject: [PATCH 328/421] Update stdlib --- external/bonsai_stdlib | 2 +- generated/anonymous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- generated/anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/buffer_ui_toggle_button_handle.h | 2 +- generated/d_union_ui_render_command.h | 2 +- generated/do_editor_ui_for_compound_type_renderer_2d.h | 4 ++-- generated/for_datatypes_0XxWqGSZ.h | 2 ++ generated/for_datatypes_Bxw4Q7AW.h | 2 ++ generated/for_datatypes_fkubhsYl.h | 2 ++ generated/for_datatypes_kv3WBTai.h | 2 ++ generated/gen_are_equal_665365505.h | 2 +- generated/gen_primitive_deep_copy_715421923.h | 2 +- generated/hashtable_get_ptr_ui_toggle_31501_688856534.h | 2 +- .../hashtable_get_ptr_window_layout_705671517_599498827.h | 2 +- generated/hashtable_get_ui_toggle_31501_688856534.h | 2 +- generated/hashtable_get_window_layout_705671517_599498827.h | 2 +- generated/hashtable_impl_ui_toggle.h | 2 +- generated/hashtable_impl_window_layout.h | 2 +- src/engine/render/render_init.cpp | 1 + 20 files changed, 25 insertions(+), 16 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index f0ea55010..ea1175dad 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit f0ea55010612c95e73ff25c54a9c1b5b58cf1bf5 +Subproject commit ea1175dadcc673bf39756953d37959221a93e3d5 diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 724c2c284..7cb87d232 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2418:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2426:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index c019f7d3d..d3d80cc19 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3400:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3419:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index c3db9651e..7507ab7f5 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2371:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2379:0 case type_ui_render_command_window_start: { diff --git a/generated/buffer_ui_toggle_button_handle.h b/generated/buffer_ui_toggle_button_handle.h index 3d5a181a2..6b8cdda4c 100644 --- a/generated/buffer_ui_toggle_button_handle.h +++ b/generated/buffer_ui_toggle_button_handle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:4:0 +// external/bonsai_stdlib/src/ui/ui.cpp:7:0 struct ui_toggle_button_handle_buffer { diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 183d81d40..da0a8f47a 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:846:0 +// external/bonsai_stdlib/src/ui/ui.h:862:0 enum ui_render_command_type { diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 2d63bae83..10b2d7c07 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -444,11 +444,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - cs MemberName = CSz("TexturedQuadShader"); + cs MemberName = CSz("TexturedQuadRenderPass"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->TexturedQuadShader), + Cast(textured_quad_render_pass*, &Element->TexturedQuadRenderPass), MemberName, Params ); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 19960c783..c84a026d5 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -224,6 +224,7 @@ + struct render_to_texture_async_params; @@ -756,6 +757,7 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index b586a3d64..8a1d3ef21 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -295,6 +295,8 @@ + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 51bf0cbb5..80b5078ea 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -224,6 +224,7 @@ + render_to_texture_async_params render_to_texture_async_params; @@ -746,6 +747,7 @@ render_to_texture_async_params render_to_texture_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 53fd7135f..18a5e9974 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -224,6 +224,7 @@ + type_render_to_texture_async_params, @@ -746,6 +747,7 @@ type_render_to_texture_async_params, + type_draw_lod_async_params, diff --git a/generated/gen_are_equal_665365505.h b/generated/gen_are_equal_665365505.h index 641df5d52..bcc35db4a 100644 --- a/generated/gen_are_equal_665365505.h +++ b/generated/gen_are_equal_665365505.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/primitives.h:236:0 +// external/bonsai_stdlib/src/primitives.h:234:0 link_internal b32 AreEqual( s64 E1, s64 E2 ) diff --git a/generated/gen_primitive_deep_copy_715421923.h b/generated/gen_primitive_deep_copy_715421923.h index 2798be096..e6ca97392 100644 --- a/generated/gen_primitive_deep_copy_715421923.h +++ b/generated/gen_primitive_deep_copy_715421923.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/primitives.h:253:0 +// external/bonsai_stdlib/src/primitives.h:251:0 link_internal void DeepCopy( s64 *Src, s64 *Dest ) diff --git a/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h b/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h index 670a502fb..ade7a6db9 100644 --- a/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h +++ b/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:13:0 +// external/bonsai_stdlib/src/ui/ui.cpp:16:0 maybe_ui_toggle_ptr GetPtrById( ui_toggle_hashtable *Table, ui_id Query ) diff --git a/generated/hashtable_get_ptr_window_layout_705671517_599498827.h b/generated/hashtable_get_ptr_window_layout_705671517_599498827.h index c4a321042..7744e96f5 100644 --- a/generated/hashtable_get_ptr_window_layout_705671517_599498827.h +++ b/generated/hashtable_get_ptr_window_layout_705671517_599498827.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:22:0 +// external/bonsai_stdlib/src/ui/ui.cpp:25:0 maybe_window_layout_ptr GetPtrByHashtableKey( window_layout_hashtable *Table, ui_id Query ) diff --git a/generated/hashtable_get_ui_toggle_31501_688856534.h b/generated/hashtable_get_ui_toggle_31501_688856534.h index 863b4dcbd..c1ea843bc 100644 --- a/generated/hashtable_get_ui_toggle_31501_688856534.h +++ b/generated/hashtable_get_ui_toggle_31501_688856534.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:10:0 +// external/bonsai_stdlib/src/ui/ui.cpp:13:0 ui_toggle_linked_list_node* GetBucketById( ui_toggle_hashtable *Table, ui_id Query ) diff --git a/generated/hashtable_get_window_layout_705671517_599498827.h b/generated/hashtable_get_window_layout_705671517_599498827.h index b71709d3e..3991999da 100644 --- a/generated/hashtable_get_window_layout_705671517_599498827.h +++ b/generated/hashtable_get_window_layout_705671517_599498827.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:20:0 +// external/bonsai_stdlib/src/ui/ui.cpp:23:0 window_layout_linked_list_node* GetBucketByHashtableKey( window_layout_hashtable *Table, ui_id Query ) diff --git a/generated/hashtable_impl_ui_toggle.h b/generated/hashtable_impl_ui_toggle.h index 7b7d0f6a4..078dea688 100644 --- a/generated/hashtable_impl_ui_toggle.h +++ b/generated/hashtable_impl_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:7:0 +// external/bonsai_stdlib/src/ui/ui.cpp:10:0 link_internal b32 AreEqual(ui_toggle_linked_list_node *Node1, ui_toggle_linked_list_node *Node2 ); diff --git a/generated/hashtable_impl_window_layout.h b/generated/hashtable_impl_window_layout.h index 797294452..7fc80f769 100644 --- a/generated/hashtable_impl_window_layout.h +++ b/generated/hashtable_impl_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:17:0 +// external/bonsai_stdlib/src/ui/ui.cpp:20:0 link_internal b32 AreEqual(window_layout_linked_list_node *Node1, window_layout_linked_list_node *Node2 ); diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 10ffe3ef3..573c160fc 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -359,6 +359,7 @@ InitAoRenderGroup(v2i ApplicationResolution, ao_render_group *AoGroup) b32 IsDepthTexture = False; AoGroup->Texture = MakeTexture_SingleChannel( ApplicationResolution/2, + 0, CSz("AoTexture"), IsDepthTexture, TextureStorageFormat_R16F ); From 7da1eaa6612b85bdd01bc9a9ea538849e28ee124 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 11 Sep 2025 12:38:51 -0700 Subject: [PATCH 329/421] Readme and fix 2 terrain shaders --- readme.md | 7 +++---- shaders/terrain/shaping/4_dottedboxguy_arch.fragmentshader | 4 ++-- shaders/terrain/shaping/5_mandlebulb.fragmentshader | 4 ++-- shaders/terrain/shaping/6_trunchet.fragmentshader | 4 ++-- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/readme.md b/readme.md index 593ce72ab..ab2ba90ae 100644 --- a/readme.md +++ b/readme.md @@ -26,13 +26,12 @@ a few appropriate system headers. Grab pre-built binaries & assets from the [Latest Releases](../../releases/latest) for your platform of your choice (as long as your platform of choice is Windows or Linux) ;) -## New Project +## Links -TODO(Jesse): Docs for starting a new project +### [Build From Source](docs/01_build_process.md). -## Build from Source +### [Controls](docs/controls.md). -See the docs on the [build process](docs/01_build_process.md). ![banner](screenshots/orks.png) diff --git a/shaders/terrain/shaping/4_dottedboxguy_arch.fragmentshader b/shaders/terrain/shaping/4_dottedboxguy_arch.fragmentshader index 5e1b69597..026d5648e 100644 --- a/shaders/terrain/shaping/4_dottedboxguy_arch.fragmentshader +++ b/shaders/terrain/shaping/4_dottedboxguy_arch.fragmentshader @@ -88,8 +88,8 @@ float sdBrickCircle(vec2 p, float r, float n, float padding, float rotation){ void main() { f32 x = floor(gl_FragCoord.x); - f32 z = floor(gl_FragCoord.y / 66); - f32 y = floor(gl_FragCoord.y - (z*66)); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); v3 Offset = V3(-1, -1, -1); v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); diff --git a/shaders/terrain/shaping/5_mandlebulb.fragmentshader b/shaders/terrain/shaping/5_mandlebulb.fragmentshader index 6dcc2b965..c08e419cd 100644 --- a/shaders/terrain/shaping/5_mandlebulb.fragmentshader +++ b/shaders/terrain/shaping/5_mandlebulb.fragmentshader @@ -47,8 +47,8 @@ vec4 mandlebulb(vec3 p) void main() { f32 x = floor(gl_FragCoord.x); - f32 z = floor(gl_FragCoord.y / 66); - f32 y = floor(gl_FragCoord.y - (z*66)); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); v3 Offset = V3(-1, -1, -1); v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); diff --git a/shaders/terrain/shaping/6_trunchet.fragmentshader b/shaders/terrain/shaping/6_trunchet.fragmentshader index f2f88be02..a94dc7306 100644 --- a/shaders/terrain/shaping/6_trunchet.fragmentshader +++ b/shaders/terrain/shaping/6_trunchet.fragmentshader @@ -48,8 +48,8 @@ float heightMap(in vec2 p) { void main() { f32 x = floor(gl_FragCoord.x); - f32 z = floor(gl_FragCoord.y / 66); - f32 y = floor(gl_FragCoord.y - (z*66)); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); v3 Offset = V3(-1, -1, -1); v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); From bf92225b411ded265ee1f96ca7a27d2af66162c6 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 11 Sep 2025 12:43:33 -0700 Subject: [PATCH 330/421] Minor docs updates --- docs/controls.md | 6 ++++-- readme.md | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/controls.md b/docs/controls.md index 6f8a50da5..77c278ee8 100644 --- a/docs/controls.md +++ b/docs/controls.md @@ -15,9 +15,9 @@ This is notation for the chord 'Ctrl + s' ``` -This is notation for the chord 'Alt + s' +This is notation for the chord 'Alt + Shift + s' ``` - + ``` @@ -40,6 +40,8 @@ hold `rmouse` : rotate camera # Editor +Select the 'World Edit' tab from the top menu + `` : Begin area selection `lclick` : Finish area selection diff --git a/readme.md b/readme.md index ab2ba90ae..d4a5037a5 100644 --- a/readme.md +++ b/readme.md @@ -28,9 +28,9 @@ for your platform of your choice (as long as your platform of choice is Windows ## Links -### [Build From Source](docs/01_build_process.md). +### [Build From Source](docs/01_build_process.md) -### [Controls](docs/controls.md). +### [Controls](docs/controls.md) ![banner](screenshots/orks.png) From 02301d390cdf29ccbc8013002acd6300bdc90df1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 11 Sep 2025 13:14:39 -0700 Subject: [PATCH 331/421] Display which terrain shaders are currently selected --- examples/terrain_gen/game.cpp | 6 ++++-- external/bonsai_stdlib | 2 +- generated/anonymous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- generated/anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/d_union_ui_render_command.h | 2 +- jesse.make.sh | 2 +- 7 files changed, 10 insertions(+), 8 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 1d4122c99..7fbd74ba9 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -83,7 +83,8 @@ BONSAI_API_MAIN_THREAD_CALLBACK() { if (FileNode->Type == FileTraversalType_File) { - if (Button(Ui, FileNode->Name, UiId(&Window, "shader file name", I++))) + b32 Selected = Contains(Resources->Graphics.TerrainShapingRC.Program.FragSourceFilename, FileNode->Name); + if (Button(Ui, FileNode->Name, UiId(&Window, "shader file name", I++), Selected)) { // Force engine to reload new shader Resources->Graphics.TerrainShapingRC.Program.FragSourceFilename = Concat(FileNode->Dir, CSz("/"), FileNode->Name, GetTranArena()); @@ -106,7 +107,8 @@ BONSAI_API_MAIN_THREAD_CALLBACK() { if (FileNode->Type == FileTraversalType_File) { - if (Button(Ui, FileNode->Name, UiId(&Window, "shader file name", I++))) + b32 Selected = Contains(Resources->Graphics.TerrainShapingRC.Program.FragSourceFilename, FileNode->Name); + if (Button(Ui, FileNode->Name, UiId(&Window, "shader file name", I++), Selected)) { // Force engine to reload new shader Resources->Graphics.TerrainDecorationRC.Program.FragSourceFilename = Concat(FileNode->Dir, CSz("/"), FileNode->Name, GetTranArena()); diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index ea1175dad..eec111760 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit ea1175dadcc673bf39756953d37959221a93e3d5 +Subproject commit eec111760fe349c71e98d11aafcda975abc44bc4 diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 7cb87d232..f96dd39a6 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2426:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2439:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index d3d80cc19..f08676fdc 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3419:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3432:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 7507ab7f5..533a684a0 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2379:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2392:0 case type_ui_render_command_window_start: { diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index da0a8f47a..55f9cdebd 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:862:0 +// external/bonsai_stdlib/src/ui/ui.h:874:0 enum ui_render_command_type { diff --git a/jesse.make.sh b/jesse.make.sh index 11051035c..384beb04f 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 From 0f83ccb19e84054a55451fb319cdf17ee211624c Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 21 Sep 2025 19:25:26 -0700 Subject: [PATCH 332/421] WIP --- examples/project_and_level_picker/game.cpp | 6 +- .../project_and_level_picker/game_constants.h | 6 - examples/terrain_gen/game.cpp | 26 +- examples/terrain_gen/game_types.h | 2 + external/bonsai_stdlib | 2 +- generated/cursor_v3i.h | 10 +- generated/d_union_ui_render_command.h | 2 +- .../generate_cursor_debug_profile_scope.h | 10 +- ...generate_cursor_functions_c_token_cursor.h | 9 +- generated/generate_cursor_functions_u64.h | 9 +- generated/generate_cursor_octree_node.h | 10 +- generated/generate_cursor_parser.h | 10 +- generated/generate_cursor_struct_u64.h | 1 - generated/generate_cursor_texture.h | 10 +- generated/generate_cursor_u8.h | 10 +- generated/generate_cursor_v3.h | 10 +- .../generate_cursor_voxel_stack_element.h | 10 +- generated/hashtable_struct_ui_toggle.h | 2 +- generated/maybe_ui_toggle.h | 2 +- generated/maybe_ui_toggle_ptr.h | 2 +- generated/stream_and_cursor_counted_string.h | 10 +- generated/stream_and_cursor_s32.h | 10 +- generated/stream_and_cursor_u32.h | 10 +- jesse.make.sh | 6 +- shaders/cosine_interp_vis.fragmentshader | 206 ++++++++++++++ .../shaping/7_steep_ravines.fragmentshader | 260 ++++++++++++++++++ src/engine/loaders/vox.h | 34 +++ src/engine/world.cpp | 2 +- 28 files changed, 594 insertions(+), 93 deletions(-) delete mode 100644 examples/project_and_level_picker/game_constants.h create mode 100644 shaders/cosine_interp_vis.fragmentshader create mode 100644 shaders/terrain/shaping/7_steep_ravines.fragmentshader create mode 100644 src/engine/loaders/vox.h diff --git a/examples/project_and_level_picker/game.cpp b/examples/project_and_level_picker/game.cpp index 4200d1949..78923ca80 100644 --- a/examples/project_and_level_picker/game.cpp +++ b/examples/project_and_level_picker/game.cpp @@ -1,6 +1,4 @@ #include - -#include #include BONSAI_API_WORKER_THREAD_CALLBACK() @@ -17,6 +15,8 @@ BONSAI_API_WORKER_THREAD_CALLBACK() Result = True; } break; + case type_work_queue_entry_build_chunk_mesh: + case type_work_queue_entry_finalize_noise_values: case type_work_queue_entry_async_function_call: /* case type_work_queue_entry_update_world_region: */ case type_work_queue_entry_rebuild_mesh: @@ -33,7 +33,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() { UNPACK_ENGINE_RESOURCES(Resources); - AllocateWorld(World, {}, WORLD_CHUNK_DIM, g_VisibleRegion); + AllocateWorld(World, {}, WORLD_CHUNK_DIM, VisibleRegionSize_128); GameState = Allocate(game_state, Resources->GameMemory, 1); return GameState; diff --git a/examples/project_and_level_picker/game_constants.h b/examples/project_and_level_picker/game_constants.h deleted file mode 100644 index 027c78b54..000000000 --- a/examples/project_and_level_picker/game_constants.h +++ /dev/null @@ -1,6 +0,0 @@ - -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(16, 16, 4); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 32); diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 7fbd74ba9..c06909eee 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -29,16 +29,6 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() GameState = Allocate(game_state, Resources->GameMemory, 1); - /* GameState->TerrainGenType = TerrainGenType_GrassyTerracedTerrain; */ - - /* GameState->TerrainGenType = TerrainGenType_Debug; */ - /* GameState->TerrainGenType = TerrainGenType_SinCos; */ - /* GameState->TerrainGenType = TerrainGenType_TerracedTerrain; */ - GameState->TerrainGenType = TerrainGenType_FBM2D; - /* GameState->TerrainGenType = TerrainGenType_GrassyTerracedTerrain4; */ - /* GameState->TerrainGenType = TerrainGenType_Voronoi; */ - /* World->Center = V3i(-22, 101, 1); */ - Camera->GhostId = GetFreeEntity(EntityTable); entity *CameraGhost = GetEntity(EntityTable, Camera->GhostId); /* CameraGhost->P.WorldP = V3i(-53, -93, 2); */ @@ -54,8 +44,10 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() CameraGhost->P.WorldP = VisibleRegion/2; CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); - SpawnEntity(CameraGhost); + GameState->Shader = CompileShaderPair(CSz(STDLIB_SHADER_PATH "passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "cosine_interp_vis.fragmentshader")); + + SpawnEntity(CameraGhost); return GameState; } @@ -70,6 +62,18 @@ BONSAI_API_MAIN_THREAD_CALLBACK() f32 dt = Plat->dt; f32 Speed = 80.f; + { + window_layout *Window = GetOrCreateWindow(Ui, UiId("EasingWindow")); + PushWindowStart(Ui, Window); + + /* PushSetCustomShader(Ui, ); */ + + PushUntexturedQuad(Ui, V2(0), V2(128), zDepth_Text); + + + PushWindowEnd(Ui, Window); + } + { global_variable window_layout Window = WindowLayout("Terrain Shaping Shader", WindowLayoutFlag_Align_Right); PushWindowStart(Ui, &Window); diff --git a/examples/terrain_gen/game_types.h b/examples/terrain_gen/game_types.h index 9addf0b00..5c8b82bfe 100644 --- a/examples/terrain_gen/game_types.h +++ b/examples/terrain_gen/game_types.h @@ -31,5 +31,7 @@ poof(string_and_value_tables(terrain_gen_type)) struct game_state { terrain_gen_type TerrainGenType; + + shader Shader; }; diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index eec111760..96406edf4 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit eec111760fe349c71e98d11aafcda975abc44bc4 +Subproject commit 96406edf4bd80062a447fc96bb66788d78b50947 diff --git a/generated/cursor_v3i.h b/generated/cursor_v3i.h index fa4ca5925..27da027cc 100644 --- a/generated/cursor_v3i.h +++ b/generated/cursor_v3i.h @@ -6,7 +6,6 @@ struct v3i_cursor // TODO(Jesse)(immediate): For the love of fucksakes change these to indices v3i *At; v3i *End; - /* OWNED_BY_THREAD_MEMBER(); */ }; @@ -15,10 +14,11 @@ link_internal v3i_cursor V3iCursor(umm ElementCount, memory_arena* Memory) { v3i *Start = (v3i*)PushStruct(Memory, sizeof(v3i)*ElementCount, 1, 0); - v3i_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + v3i_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 55f9cdebd..0cbcc66b8 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:874:0 +// external/bonsai_stdlib/src/ui/ui.h:881:0 enum ui_render_command_type { diff --git a/generated/generate_cursor_debug_profile_scope.h b/generated/generate_cursor_debug_profile_scope.h index 7b5ae0c55..4f1c2e494 100644 --- a/generated/generate_cursor_debug_profile_scope.h +++ b/generated/generate_cursor_debug_profile_scope.h @@ -6,7 +6,6 @@ struct debug_profile_scope_cursor // TODO(Jesse)(immediate): For the love of fucksakes change these to indices debug_profile_scope *At; debug_profile_scope *End; - /* OWNED_BY_THREAD_MEMBER(); */ }; @@ -15,10 +14,11 @@ link_internal debug_profile_scope_cursor DebugProfileScopeCursor(umm ElementCount, memory_arena* Memory) { debug_profile_scope *Start = (debug_profile_scope*)PushStruct(Memory, sizeof(debug_profile_scope)*ElementCount, 1, 0); - debug_profile_scope_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + debug_profile_scope_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/generated/generate_cursor_functions_c_token_cursor.h b/generated/generate_cursor_functions_c_token_cursor.h index 0efdf1d9d..f735cfff8 100644 --- a/generated/generate_cursor_functions_c_token_cursor.h +++ b/generated/generate_cursor_functions_c_token_cursor.h @@ -5,10 +5,11 @@ link_internal c_token_cursor CTokenCursor(umm ElementCount, memory_arena* Memory) { c_token *Start = (c_token*)PushStruct(Memory, sizeof(c_token)*ElementCount, 1, 0); - c_token_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + c_token_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/generated/generate_cursor_functions_u64.h b/generated/generate_cursor_functions_u64.h index 9abee6807..91cdc555c 100644 --- a/generated/generate_cursor_functions_u64.h +++ b/generated/generate_cursor_functions_u64.h @@ -5,10 +5,11 @@ link_internal u64_cursor U64Cursor(umm ElementCount, memory_arena* Memory) { u64 *Start = (u64*)PushStruct(Memory, sizeof(u64)*ElementCount, 1, 0); - u64_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + u64_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index d94dd13d1..47483ca0b 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -6,7 +6,6 @@ struct octree_node_ptr_cursor // TODO(Jesse)(immediate): For the love of fucksakes change these to indices octree_node_ptr *At; octree_node_ptr *End; - /* OWNED_BY_THREAD_MEMBER(); */ }; @@ -15,10 +14,11 @@ link_internal octree_node_ptr_cursor OctreeNodePtrCursor(umm ElementCount, memory_arena* Memory) { octree_node_ptr *Start = (octree_node_ptr*)PushStruct(Memory, sizeof(octree_node_ptr)*ElementCount, 1, 0); - octree_node_ptr_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + octree_node_ptr_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/generated/generate_cursor_parser.h b/generated/generate_cursor_parser.h index 35a1d3743..26f447192 100644 --- a/generated/generate_cursor_parser.h +++ b/generated/generate_cursor_parser.h @@ -6,7 +6,6 @@ struct parser_cursor // TODO(Jesse)(immediate): For the love of fucksakes change these to indices parser *At; parser *End; - /* OWNED_BY_THREAD_MEMBER(); */ }; @@ -15,10 +14,11 @@ link_internal parser_cursor ParserCursor(umm ElementCount, memory_arena* Memory) { parser *Start = (parser*)PushStruct(Memory, sizeof(parser)*ElementCount, 1, 0); - parser_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + parser_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/generated/generate_cursor_struct_u64.h b/generated/generate_cursor_struct_u64.h index 209f82f55..1a9db2d41 100644 --- a/generated/generate_cursor_struct_u64.h +++ b/generated/generate_cursor_struct_u64.h @@ -6,7 +6,6 @@ struct u64_cursor // TODO(Jesse)(immediate): For the love of fucksakes change these to indices u64 *At; u64 *End; - /* OWNED_BY_THREAD_MEMBER(); */ }; diff --git a/generated/generate_cursor_texture.h b/generated/generate_cursor_texture.h index 394ee1304..3e2a31636 100644 --- a/generated/generate_cursor_texture.h +++ b/generated/generate_cursor_texture.h @@ -6,7 +6,6 @@ struct texture_cursor // TODO(Jesse)(immediate): For the love of fucksakes change these to indices texture *At; texture *End; - /* OWNED_BY_THREAD_MEMBER(); */ }; @@ -15,10 +14,11 @@ link_internal texture_cursor TextureCursor(umm ElementCount, memory_arena* Memory) { texture *Start = (texture*)PushStruct(Memory, sizeof(texture)*ElementCount, 1, 0); - texture_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + texture_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/generated/generate_cursor_u8.h b/generated/generate_cursor_u8.h index 8695ab9f8..0cd2080e9 100644 --- a/generated/generate_cursor_u8.h +++ b/generated/generate_cursor_u8.h @@ -6,7 +6,6 @@ struct u8_cursor // TODO(Jesse)(immediate): For the love of fucksakes change these to indices u8 *At; u8 *End; - /* OWNED_BY_THREAD_MEMBER(); */ }; @@ -15,10 +14,11 @@ link_internal u8_cursor U8Cursor(umm ElementCount, memory_arena* Memory) { u8 *Start = (u8*)PushStruct(Memory, sizeof(u8)*ElementCount, 1, 0); - u8_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + u8_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/generated/generate_cursor_v3.h b/generated/generate_cursor_v3.h index b1fa3a4a1..49995e62c 100644 --- a/generated/generate_cursor_v3.h +++ b/generated/generate_cursor_v3.h @@ -6,7 +6,6 @@ struct v3_cursor // TODO(Jesse)(immediate): For the love of fucksakes change these to indices v3 *At; v3 *End; - /* OWNED_BY_THREAD_MEMBER(); */ }; @@ -15,10 +14,11 @@ link_internal v3_cursor V3Cursor(umm ElementCount, memory_arena* Memory) { v3 *Start = (v3*)PushStruct(Memory, sizeof(v3)*ElementCount, 1, 0); - v3_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + v3_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/generated/generate_cursor_voxel_stack_element.h b/generated/generate_cursor_voxel_stack_element.h index df9612a90..ff83a931f 100644 --- a/generated/generate_cursor_voxel_stack_element.h +++ b/generated/generate_cursor_voxel_stack_element.h @@ -6,7 +6,6 @@ struct voxel_stack_element_cursor // TODO(Jesse)(immediate): For the love of fucksakes change these to indices voxel_stack_element *At; voxel_stack_element *End; - /* OWNED_BY_THREAD_MEMBER(); */ }; @@ -15,10 +14,11 @@ link_internal voxel_stack_element_cursor VoxelStackElementCursor(umm ElementCount, memory_arena* Memory) { voxel_stack_element *Start = (voxel_stack_element*)PushStruct(Memory, sizeof(voxel_stack_element)*ElementCount, 1, 0); - voxel_stack_element_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + voxel_stack_element_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/generated/hashtable_struct_ui_toggle.h b/generated/hashtable_struct_ui_toggle.h index acd84e5b4..b67d0185f 100644 --- a/generated/hashtable_struct_ui_toggle.h +++ b/generated/hashtable_struct_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:246:0 +// external/bonsai_stdlib/src/ui/ui.h:253:0 struct ui_toggle_linked_list_node { diff --git a/generated/maybe_ui_toggle.h b/generated/maybe_ui_toggle.h index 9412c50d0..00193f02b 100644 --- a/generated/maybe_ui_toggle.h +++ b/generated/maybe_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:240:0 +// external/bonsai_stdlib/src/ui/ui.h:247:0 struct maybe_ui_toggle { diff --git a/generated/maybe_ui_toggle_ptr.h b/generated/maybe_ui_toggle_ptr.h index 4c1db3cf4..022440e6e 100644 --- a/generated/maybe_ui_toggle_ptr.h +++ b/generated/maybe_ui_toggle_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:243:0 +// external/bonsai_stdlib/src/ui/ui.h:250:0 struct maybe_ui_toggle_ptr { diff --git a/generated/stream_and_cursor_counted_string.h b/generated/stream_and_cursor_counted_string.h index e96778037..8b58b52e8 100644 --- a/generated/stream_and_cursor_counted_string.h +++ b/generated/stream_and_cursor_counted_string.h @@ -6,7 +6,6 @@ struct counted_string_cursor // TODO(Jesse)(immediate): For the love of fucksakes change these to indices counted_string *At; counted_string *End; - /* OWNED_BY_THREAD_MEMBER(); */ }; @@ -15,10 +14,11 @@ link_internal counted_string_cursor CountedStringCursor(umm ElementCount, memory_arena* Memory) { counted_string *Start = (counted_string*)PushStruct(Memory, sizeof(counted_string)*ElementCount, 1, 0); - counted_string_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + counted_string_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/generated/stream_and_cursor_s32.h b/generated/stream_and_cursor_s32.h index 4243376df..8466e3b92 100644 --- a/generated/stream_and_cursor_s32.h +++ b/generated/stream_and_cursor_s32.h @@ -6,7 +6,6 @@ struct s32_cursor // TODO(Jesse)(immediate): For the love of fucksakes change these to indices s32 *At; s32 *End; - /* OWNED_BY_THREAD_MEMBER(); */ }; @@ -15,10 +14,11 @@ link_internal s32_cursor S32Cursor(umm ElementCount, memory_arena* Memory) { s32 *Start = (s32*)PushStruct(Memory, sizeof(s32)*ElementCount, 1, 0); - s32_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + s32_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/generated/stream_and_cursor_u32.h b/generated/stream_and_cursor_u32.h index f6064a859..3609b2b5a 100644 --- a/generated/stream_and_cursor_u32.h +++ b/generated/stream_and_cursor_u32.h @@ -6,7 +6,6 @@ struct u32_cursor // TODO(Jesse)(immediate): For the love of fucksakes change these to indices u32 *At; u32 *End; - /* OWNED_BY_THREAD_MEMBER(); */ }; @@ -15,10 +14,11 @@ link_internal u32_cursor U32Cursor(umm ElementCount, memory_arena* Memory) { u32 *Start = (u32*)PushStruct(Memory, sizeof(u32)*ElementCount, 1, 0); - u32_cursor Result = {}; - Result.Start = Start; - Result.End = Start+ElementCount; - Result.At = Start; + u32_cursor Result = { + .Start = Start, + .End = Start+ElementCount, + .At = Start, + }; return Result; } diff --git a/jesse.make.sh b/jesse.make.sh index 384beb04f..9169579d9 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -2,8 +2,8 @@ # OPT="-O2" -./make.sh RunPoof -[ $? -ne 0 ] && exit 1 +# ./make.sh RunPoof +# [ $? -ne 0 ] && exit 1 # ./make.sh $OPT BuildAll @@ -12,11 +12,11 @@ ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ BuildExecutables \ + BuildSingleExample examples/project_and_level_picker \ # BuildTests \ # BuildSingleExample examples/ui_test \ # BuildSingleExample examples/blank_project \ # BuildSingleExample examples/blank_project \ - # BuildSingleExample examples/project_and_level_picker \ # BuildSingleExample examples/transparency \ # BuildSingleExample examples/tools/voxel_synthesis_rule_baker \ # BuildSingleExample examples/turn_based \ diff --git a/shaders/cosine_interp_vis.fragmentshader b/shaders/cosine_interp_vis.fragmentshader new file mode 100644 index 000000000..06330e8b7 --- /dev/null +++ b/shaders/cosine_interp_vis.fragmentshader @@ -0,0 +1,206 @@ +out vec2 UV; +out v4 Output; + + + +f32 +MapNoiseValueToFinal(f32 Value) +{ + // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 1.0f }}, */ + /* {{0.7f, 0.85f }}, */ + /* {{0.6f, 0.5f }}, */ + /* {{0.3f, 0.4f }}, */ + /* {{0.2f, 0.1f }}, */ + /* {{0.0f, 0.0f }}, */ + /* }; */ + + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 1.0f }}, */ + /* {{0.5f, 0.7f }}, */ + /* {{0.35f, 0.43f }}, */ + /* {{0.3f, 0.4f }}, */ + /* {{0.2f, 0.1f }}, */ + /* {{0.0f, 0.0f }}, */ + /* }; */ + + const s32 PointCount = 3; + v2 Points[PointCount]; + + /* Points[0] = v2(1.0f, 1.0f); */ + /* Points[1] = v2(0.f, 0.0f); */ + + + // Steep + + Points[0] = v2(1.0f, 1.0f); + Points[1] = v2(0.5f, 0.85f); + Points[2] = v2(0.0f, 0.0f); + + // Pretty nice + + /* Points[0] = v2(1.0f, 1.0f); */ + /* Points[1] = v2(0.7f, 0.7f); */ + /* Points[2] = v2(0.65f, 0.43f); */ + /* Points[3] = v2(0.6f, 0.4f); */ + /* Points[4] = v2(0.5f, 0.2f); */ + /* Points[5] = v2(0.0f, 0.1f); */ + + // Pillar-y + + /* Points[0] = v2(2.0f, 0.5f); */ + /* Points[1] = v2(0.6f, 0.3f); */ + /* Points[2] = v2(0.1f, 0.2f); */ + /* Points[3] = v2(0.05f, 0.45f); */ + /* Points[4] = v2(0.0f , 0.5f); */ + +/* v2 Points[] = */ +/* { */ +/* {{1.0f, 0.0f }}, */ +/* {{0.9f, 1.0f }}, */ +/* {{0.6f, 0.3f }}, */ +/* {{0.1f, 0.1f }}, */ +/* {{0.05f, 0.45f }}, */ +/* {{0.0f , 0.5f }}, */ +/* }; */ + + + + r32 Result = Value; + for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) + { + v2 P = Points[PointIndex]; + + // This is sort of a hack to fix the degenerate case when the value is 0 or 1. + // TODO(Jesse): Make this branchless + if (Value == P.x) return P.y; + + if (Value > P.x) + { + v2 PNext = Points[PointIndex + 1]; + + r32 Range = PNext.x - P.x; + r32 t = (Value-P.x) / Range; + Result = mix(t, P.y, PNext.y); + break; + } + } + + Result = abs(max(Result, 1.0)); + return Result; +} + +f32 +RoundToNearestMultiple(f32 NumToRound, f32 Multiple) +{ + f32 Remainder = mod(NumToRound, Multiple); + if (Remainder == 0) + return NumToRound; + + return NumToRound + Multiple - Remainder; +} + + +f32 MapToFinal(f32 tx) +{ + /* Assert(Value <= 1.f); */ + /* Assert(Value >= 0.f); */ + + // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about + + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 1.0f }}, */ + /* {{0.7f, 0.85f }}, */ + /* {{0.6f, 0.5f }}, */ + /* {{0.3f, 0.4f }}, */ + /* {{0.2f, 0.1f }}, */ + /* {{0.0f, 0.0f }}, */ + /* }; */ + + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 1.0f }}, */ + /* {{0.5f, 0.7f }}, */ + /* {{0.35f, 0.43f }}, */ + /* {{0.3f, 0.4f }}, */ + /* {{0.2f, 0.1f }}, */ + /* {{0.0f, 0.0f }}, */ + /* }; */ + + /* const s32 PointCount = 2; */ + /* v2 Points[PointCount]; */ + /* Points[0] = v2(0.f, 0.0f); */ + /* Points[1] = v2(1.0f, 1.0f); */ + + const s32 PointCount = 3; + v2 Points[PointCount]; + Points[0] = v2(0.0f, 0.0f); + Points[1] = v2(0.2f, 1.0f); + Points[2] = v2(1.0f, 1.0f); + + // Pretty nice + + /* s32 PointCount = 6; */ + /* v2 Points[6]; */ + /* Points[0] = v2(1.0f, 1.0f); */ + /* Points[1] = v2(0.7f, 0.7f); */ + /* Points[2] = v2(0.65f, 0.43f); */ + /* Points[3] = v2(0.6f, 0.4f); */ + /* Points[4] = v2(0.5f, 0.2f); */ + /* Points[5] = v2(0.0f, 0.1f); */ + + // Pillar-y + /* v2 Points[] = */ + /* { */ + /* {{2.0f, 0.5f }}, */ + /* {{0.6f, 0.3f }}, */ + /* {{0.1f, 0.2f }}, */ + /* {{0.05f, 0.45f }}, */ + /* {{0.0f , 0.5f }}, */ + /* }; */ + +/* v2 Points[] = */ +/* { */ +/* {{1.0f, 0.0f }}, */ +/* {{0.9f, 1.0f }}, */ +/* {{0.6f, 0.3f }}, */ +/* {{0.1f, 0.1f }}, */ +/* {{0.05f, 0.45f }}, */ +/* {{0.0f , 0.5f }}, */ +/* }; */ + + + + r32 Result = Points[0].x; + for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) + { + v2 P = Points[PointIndex]; + + if (tx >= P.x) + { + v2 PNext = Points[PointIndex + 1]; + v2 Tmp = P; + + r32 Range = PNext.x - P.x; + r32 t = Clamp01((tx-P.x) / Range); + Result = CosineInterpolate(t, P.y, PNext.y); + /* Result = mix(P.y, PNext.y, t); */ + break; + } + } + + /* Result = abs(max(Result, 1.0)); */ + return Result; +} + +void main() +{ + + Output.xy = UV; + Output.z = 0.f; + Output.w = 1.f +} diff --git a/shaders/terrain/shaping/7_steep_ravines.fragmentshader b/shaders/terrain/shaping/7_steep_ravines.fragmentshader new file mode 100644 index 000000000..6d4fcb04b --- /dev/null +++ b/shaders/terrain/shaping/7_steep_ravines.fragmentshader @@ -0,0 +1,260 @@ +uniform v3 WorldspaceChunkBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out v4 Output; + + + + +f32 +MapNoiseValueToFinal(f32 Value) +{ + // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 1.0f }}, */ + /* {{0.7f, 0.85f }}, */ + /* {{0.6f, 0.5f }}, */ + /* {{0.3f, 0.4f }}, */ + /* {{0.2f, 0.1f }}, */ + /* {{0.0f, 0.0f }}, */ + /* }; */ + + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 1.0f }}, */ + /* {{0.5f, 0.7f }}, */ + /* {{0.35f, 0.43f }}, */ + /* {{0.3f, 0.4f }}, */ + /* {{0.2f, 0.1f }}, */ + /* {{0.0f, 0.0f }}, */ + /* }; */ + + const s32 PointCount = 3; + v2 Points[PointCount]; + + /* Points[0] = v2(1.0f, 1.0f); */ + /* Points[1] = v2(0.f, 0.0f); */ + + + // Steep + + Points[0] = v2(1.0f, 1.0f); + Points[1] = v2(0.5f, 0.85f); + Points[2] = v2(0.0f, 0.0f); + + // Pretty nice + + /* Points[0] = v2(1.0f, 1.0f); */ + /* Points[1] = v2(0.7f, 0.7f); */ + /* Points[2] = v2(0.65f, 0.43f); */ + /* Points[3] = v2(0.6f, 0.4f); */ + /* Points[4] = v2(0.5f, 0.2f); */ + /* Points[5] = v2(0.0f, 0.1f); */ + + // Pillar-y + + /* Points[0] = v2(2.0f, 0.5f); */ + /* Points[1] = v2(0.6f, 0.3f); */ + /* Points[2] = v2(0.1f, 0.2f); */ + /* Points[3] = v2(0.05f, 0.45f); */ + /* Points[4] = v2(0.0f , 0.5f); */ + +/* v2 Points[] = */ +/* { */ +/* {{1.0f, 0.0f }}, */ +/* {{0.9f, 1.0f }}, */ +/* {{0.6f, 0.3f }}, */ +/* {{0.1f, 0.1f }}, */ +/* {{0.05f, 0.45f }}, */ +/* {{0.0f , 0.5f }}, */ +/* }; */ + + + + r32 Result = Value; + for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) + { + v2 P = Points[PointIndex]; + + // This is sort of a hack to fix the degenerate case when the value is 0 or 1. + // TODO(Jesse): Make this branchless + if (Value == P.x) return P.y; + + if (Value > P.x) + { + v2 PNext = Points[PointIndex + 1]; + + r32 Range = PNext.x - P.x; + r32 t = (Value-P.x) / Range; + Result = mix(t, P.y, PNext.y); + break; + } + } + + Result = abs(max(Result, 1.0)); + return Result; +} + +f32 +RoundToNearestMultiple(f32 NumToRound, f32 Multiple) +{ + f32 Remainder = mod(NumToRound, Multiple); + if (Remainder == 0) + return NumToRound; + + return NumToRound + Multiple - Remainder; +} + + +f32 MapToFinal(f32 tx) +{ + /* Assert(Value <= 1.f); */ + /* Assert(Value >= 0.f); */ + + // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about + + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 1.0f }}, */ + /* {{0.7f, 0.85f }}, */ + /* {{0.6f, 0.5f }}, */ + /* {{0.3f, 0.4f }}, */ + /* {{0.2f, 0.1f }}, */ + /* {{0.0f, 0.0f }}, */ + /* }; */ + + /* v2 Points[] = */ + /* { */ + /* {{1.0f, 1.0f }}, */ + /* {{0.5f, 0.7f }}, */ + /* {{0.35f, 0.43f }}, */ + /* {{0.3f, 0.4f }}, */ + /* {{0.2f, 0.1f }}, */ + /* {{0.0f, 0.0f }}, */ + /* }; */ + + /* const s32 PointCount = 2; */ + /* v2 Points[PointCount]; */ + /* Points[0] = v2(0.f, 0.0f); */ + /* Points[1] = v2(1.0f, 1.0f); */ + + const s32 PointCount = 3; + v2 Points[PointCount]; + Points[0] = v2(0.0f, 0.0f); + Points[1] = v2(0.2f, 1.0f); + Points[2] = v2(1.0f, 1.0f); + + // Pretty nice + + /* s32 PointCount = 6; */ + /* v2 Points[6]; */ + /* Points[0] = v2(1.0f, 1.0f); */ + /* Points[1] = v2(0.7f, 0.7f); */ + /* Points[2] = v2(0.65f, 0.43f); */ + /* Points[3] = v2(0.6f, 0.4f); */ + /* Points[4] = v2(0.5f, 0.2f); */ + /* Points[5] = v2(0.0f, 0.1f); */ + + // Pillar-y + /* v2 Points[] = */ + /* { */ + /* {{2.0f, 0.5f }}, */ + /* {{0.6f, 0.3f }}, */ + /* {{0.1f, 0.2f }}, */ + /* {{0.05f, 0.45f }}, */ + /* {{0.0f , 0.5f }}, */ + /* }; */ + +/* v2 Points[] = */ +/* { */ +/* {{1.0f, 0.0f }}, */ +/* {{0.9f, 1.0f }}, */ +/* {{0.6f, 0.3f }}, */ +/* {{0.1f, 0.1f }}, */ +/* {{0.05f, 0.45f }}, */ +/* {{0.0f , 0.5f }}, */ +/* }; */ + + + + r32 Result = Points[0].x; + for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) + { + v2 P = Points[PointIndex]; + + if (tx >= P.x) + { + v2 PNext = Points[PointIndex + 1]; + v2 Tmp = P; + + r32 Range = PNext.x - P.x; + r32 t = Clamp01((tx-P.x) / Range); + Result = CosineInterpolate(t, P.y, PNext.y); + /* Result = mix(P.y, PNext.y, t); */ + break; + } + } + + /* Result = abs(max(Result, 1.0)); */ + return Result; +} +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); + + v3 Offset = V3(0); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + v3 Period = V3(1200.f); + float Amplitude = 400.f; + /* f32 StartingZDepth = 10000; */ + f32 StartingZDepth = 2500; + /* f32 StartingZDepth = 0; */ + s32 Octaves = 1; + NoiseValue = StartingZDepth; + + v3 Deriv = v3(0.f); + f32 warp = 0.f; + + for (s32 Octave = 1; Octave <= Octaves; ++Octave) + { + v3 xyz = Basis / (Period/Octave); + + v4 gn = gradient_noise_derivs(xyz+warp); + /* NoiseValue += gn.x*(Amplitude/Octave); */ + NoiseValue += MapToFinal(gn.x)*(Amplitude/Octave); + } + + v3 Up = V3(0, 0, 1); + + NoiseValue -= Basis.z; + /* NoiseValue = StartingZDepth; */ + + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; + + /* uint SolidBit = NoiseValue > 0.f ? 1u : 0u; */ + /* ColorValue = min(ColorValue, v3(1.f)); */ + /* uint PackedColor = PackRGB(ColorValue); */ + /* /1* uint PackedColor = 3543u; *1/ */ + + /* Output = (SolidBit << 15) | PackedColor; */ +} diff --git a/src/engine/loaders/vox.h b/src/engine/loaders/vox.h new file mode 100644 index 000000000..e2a107472 --- /dev/null +++ b/src/engine/loaders/vox.h @@ -0,0 +1,34 @@ +// Used when loading .vox files +// + +struct vox_voxel +{ + voxel V; + v3i Offset; + + vox_voxel(s32 x, s32 y, s32 z, u8 w) + { + this->Offset.x = x; + this->Offset.y = y; + this->Offset.z = z; + + this->V.Color = w; + + /* this->V.Flags = Voxel_Empty; */ + this->V.Transparency = 0; + } + + vox_voxel(voxel *V_in, voxel_position Offset_in) + { + this->V = *V_in; + this->Offset = Offset_in; + } +}; + +struct vox_loader_buffer +{ + chunk_data *ChunkData[4*4*4]; +}; + +poof(block_array(vox_loader_buffer, {8})) +#include diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 6d9fb6729..2fac8f302 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -540,7 +540,7 @@ DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats } } -#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (6) +#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (4) link_internal v3i ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) From 7d36bcf1c93a25f4c076a9db2bd5dae520432bb6 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 22 Sep 2025 08:32:30 -0700 Subject: [PATCH 333/421] Updates for all examples to build --- examples/blank_project/game.cpp | 2 - examples/blank_project/game_constants.h | 2 - examples/the_wanderer/game.cpp | 4 +- examples/the_wanderer/game_constants.h | 14 -- examples/tile_gen/game.cpp | 4 +- examples/tile_gen/game_constants.h | 14 -- .../tools/voxel_synthesis_rule_baker/game.cpp | 6 +- .../game_constants.h | 22 --- examples/transparency/game.cpp | 27 +--- examples/transparency/game_constants.h | 15 -- examples/turn_based/game.cpp | 69 ++------ examples/turn_based/game_constants.h | 35 ----- examples/ui_test/game_constants.h | 13 -- ..._for_compound_type_entity_aggregate_type.h | 95 +++++++++++ ...or_ui_for_compound_type_entity_game_data.h | 147 ++++++++++++++++++ ...itor_ui_for_compound_type_fireball_state.h | 96 ++++++++++++ .../do_editor_ui_for_enum_entity_status.h | 47 ++++++ generated/do_editor_ui_for_enum_entity_type.h | 74 +++++++++ generated/for_datatypes_0XxWqGSZ.h | 3 + generated/for_datatypes_Bxw4Q7AW.h | 3 + generated/for_datatypes_fkubhsYl.h | 3 + generated/for_datatypes_kh9dwrCf.h | 18 +++ generated/for_datatypes_kv3WBTai.h | 3 + .../generate_string_table_entity_status.h | 34 ++++ generated/generate_string_table_entity_type.h | 40 +++++ .../generate_string_table_player_action.h | 44 ++++++ generated/generate_string_table_turn_mode.h | 32 ++++ generated/serdes_struct_entity_game_data.h | 130 ++++++++++++++++ jesse.make.sh | 10 +- make.sh | 10 +- 30 files changed, 793 insertions(+), 223 deletions(-) delete mode 100644 examples/blank_project/game_constants.h delete mode 100644 examples/the_wanderer/game_constants.h delete mode 100644 examples/tile_gen/game_constants.h delete mode 100644 examples/tools/voxel_synthesis_rule_baker/game_constants.h delete mode 100644 examples/transparency/game_constants.h delete mode 100644 examples/turn_based/game_constants.h delete mode 100644 examples/ui_test/game_constants.h create mode 100644 generated/do_editor_ui_for_compound_type_entity_aggregate_type.h create mode 100644 generated/do_editor_ui_for_compound_type_entity_game_data.h create mode 100644 generated/do_editor_ui_for_compound_type_fireball_state.h create mode 100644 generated/do_editor_ui_for_enum_entity_status.h create mode 100644 generated/do_editor_ui_for_enum_entity_type.h create mode 100644 generated/generate_string_table_entity_status.h create mode 100644 generated/generate_string_table_entity_type.h create mode 100644 generated/generate_string_table_player_action.h create mode 100644 generated/generate_string_table_turn_mode.h create mode 100644 generated/serdes_struct_entity_game_data.h diff --git a/examples/blank_project/game.cpp b/examples/blank_project/game.cpp index a6eefb37f..27d19e1c4 100644 --- a/examples/blank_project/game.cpp +++ b/examples/blank_project/game.cpp @@ -2,8 +2,6 @@ #define BONSAI_DEBUG_SYSTEM_API 1 #include - -#include #include // NOTE(Jesse): This is an optional function that gets called for each worker diff --git a/examples/blank_project/game_constants.h b/examples/blank_project/game_constants.h deleted file mode 100644 index 350c7a45b..000000000 --- a/examples/blank_project/game_constants.h +++ /dev/null @@ -1,2 +0,0 @@ -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(64, 64, 64); diff --git a/examples/the_wanderer/game.cpp b/examples/the_wanderer/game.cpp index 6d61308f5..b72fb70a6 100644 --- a/examples/the_wanderer/game.cpp +++ b/examples/the_wanderer/game.cpp @@ -1,8 +1,6 @@ #define BONSAI_DEBUG_SYSTEM_API 1 #include - -#include #include @@ -102,7 +100,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() GameState->Entropy.Seed = DEBUG_NOISE_SEED; world_position WorldCenter = World_Position(0, 0, 0); - AllocateWorld(Resources->World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); + AllocateWorld(Resources->World, WorldCenter, WORLD_CHUNK_DIM, VisibleRegionSize_128); /* Resources->World->Flags = world_flag(Resources->World->Flags|WorldFlag_WorldCenterFollowsCameraTarget); */ GameState->Models = AllocateGameModels(GameState, Resources->GameMemory, Heap); diff --git a/examples/the_wanderer/game_constants.h b/examples/the_wanderer/game_constants.h deleted file mode 100644 index afa33ecb4..000000000 --- a/examples/the_wanderer/game_constants.h +++ /dev/null @@ -1,14 +0,0 @@ - -#if 0 -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(32, 32, 8); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); -#else -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(16, 8, 8); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 32); -#endif diff --git a/examples/tile_gen/game.cpp b/examples/tile_gen/game.cpp index 114d29ffe..0bd2be3f0 100644 --- a/examples/tile_gen/game.cpp +++ b/examples/tile_gen/game.cpp @@ -1,8 +1,6 @@ #define BONSAI_DEBUG_SYSTEM_API 1 #include - -#include #include @@ -55,7 +53,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() GameState->Models = AllocateGameModels(GameState, Memory, Heap); world_position WorldCenter = World_Position(0, 0, 0); - AllocateAndInitWorld(Resources->World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); + AllocateAndInitWorld(Resources->World, WorldCenter, WORLD_CHUNK_DIM, VisibleRegionSize_128); GameState->Player = GetFreeEntity(EntityTable); SpawnPlayer( Plat, diff --git a/examples/tile_gen/game_constants.h b/examples/tile_gen/game_constants.h deleted file mode 100644 index afa33ecb4..000000000 --- a/examples/tile_gen/game_constants.h +++ /dev/null @@ -1,14 +0,0 @@ - -#if 0 -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(32, 32, 8); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); -#else -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(16, 8, 8); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 32); -#endif diff --git a/examples/tools/voxel_synthesis_rule_baker/game.cpp b/examples/tools/voxel_synthesis_rule_baker/game.cpp index 28a828392..db5eeb1c7 100644 --- a/examples/tools/voxel_synthesis_rule_baker/game.cpp +++ b/examples/tools/voxel_synthesis_rule_baker/game.cpp @@ -1,8 +1,6 @@ #define BONSAI_DEBUG_SYSTEM_API 1 #include - -#include "game_constants.h" #include "game_types.h" BONSAI_API_WORKER_THREAD_CALLBACK() @@ -722,7 +720,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* world_position WorldCenter = {{2,2,2}}; */ - world_position WorldCenter = g_VisibleRegion/2; + world_position WorldCenter = V3i(VisibleRegionSize_128)/2; /* world_position WorldCenter = {{}}; */ /* canonical_position CameraTargetP = Canonical_Position(V3(0), {{4,4,4}}); */ @@ -733,7 +731,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() GameState->Entropy.Seed = DEBUG_NOISE_SEED; - AllocateWorld(Resources->World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); + AllocateWorld(Resources->World, WorldCenter, WORLD_CHUNK_DIM, VisibleRegionSize_128); random_series WorldEntropy = {54930695483}; WaitForWorkerThreads(&Plat->HighPriorityWorkerCount); diff --git a/examples/tools/voxel_synthesis_rule_baker/game_constants.h b/examples/tools/voxel_synthesis_rule_baker/game_constants.h deleted file mode 100644 index 3723ecf5c..000000000 --- a/examples/tools/voxel_synthesis_rule_baker/game_constants.h +++ /dev/null @@ -1,22 +0,0 @@ - -#if 0 -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(32, 32, 8); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); -#else - -/* global_variable chunk_dimension */ -/* g_VisibleRegion = Chunk_Dimension(16, 8, 4); */ - -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(4, 4, 4); - -/* global_variable chunk_dimension */ -/* g_VisibleRegion = Chunk_Dimension(8, 8, 4); */ - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 32); - -#endif diff --git a/examples/transparency/game.cpp b/examples/transparency/game.cpp index a244c1c6e..976f46d83 100644 --- a/examples/transparency/game.cpp +++ b/examples/transparency/game.cpp @@ -2,33 +2,8 @@ #define BONSAI_DEBUG_SYSTEM_API 1 #include - -#include #include -BONSAI_API_WORKER_THREAD_CALLBACK() -{ - switch (Entry->Type) - { - InvalidCase(type_work_queue_entry_noop); - InvalidCase(type_work_queue_entry__align_to_cache_line_helper); - InvalidCase(type_work_queue_entry__bonsai_render_command); - - case type_work_queue_entry_async_function_call: - /* case type_work_queue_entry_update_world_region: */ - case type_work_queue_entry_rebuild_mesh: - case type_work_queue_entry_init_asset: - case type_work_queue_entry_init_world_chunk: - case type_work_queue_entry_copy_buffer_ref: - case type_work_queue_entry_copy_buffer_set: - case type_work_queue_entry_sim_particle_system: {} break; - } - - return False; -} - - - link_internal void SpawnSplosionEmitters(entity_block_array *Entities) { @@ -94,7 +69,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() StandardCamera(Graphics->Camera, 10000.0f, 1000.0f); - AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); + AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, VisibleRegionSize_128); /* World->Flags = WorldFlag_WorldCenterFollowsCameraTarget; */ diff --git a/examples/transparency/game_constants.h b/examples/transparency/game_constants.h deleted file mode 100644 index ff8c73fa2..000000000 --- a/examples/transparency/game_constants.h +++ /dev/null @@ -1,15 +0,0 @@ - -#if 0 -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(32, 32, 8); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); -#else -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(16, 16, 4); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 32); - -#endif diff --git a/examples/turn_based/game.cpp b/examples/turn_based/game.cpp index 0362252ea..7bd733b95 100644 --- a/examples/turn_based/game.cpp +++ b/examples/turn_based/game.cpp @@ -1,8 +1,6 @@ #define BONSAI_DEBUG_SYSTEM_API 1 #include - -#include "game_constants.h" #include "game_types.h" global_variable v3 @@ -457,61 +455,11 @@ GameEntityUpdate(engine_resources *Engine, entity *Entity ) } -BONSAI_API_WORKER_THREAD_INIT_CALLBACK() -{ - Global_ThreadStates = AllThreads; - SetThreadLocal_ThreadIndex(ThreadIndex); -} - -BONSAI_API_WORKER_THREAD_CALLBACK() -{ - b32 Result = True; - switch (Entry->Type) - { - default: { Result = False; } break; - - // NOTE(Jesse): Here we're going to provide an implementation for - // initializing a world chunk. - case type_work_queue_entry_init_world_chunk: - { - volatile work_queue_entry_init_world_chunk *Job = SafeAccess(work_queue_entry_init_world_chunk, Entry); - world_chunk *Chunk = Job->Chunk; - - if (ChunkIsGarbage(Chunk)) - { - // NOTE(Jesse): This is an optimization; the engine marks chunks that - // have moved outside of the visible region as garbage. - Chunk->Flags = Chunk_Uninitialized; - } - else - { - s32 Period = 0; // Ignored - s32 Amplititude = 0; // Ignored - s32 StartingZDepth = -400; - u32 OctaveCount = 3; - - octave_buffer OctaveBuf = { OctaveCount, {} }; - OctaveBuf.Octaves = Allocate(octave, Thread->TempMemory, OctaveCount); - - - OctaveBuf.Octaves[0] = {V3(800, 800, 1700), 350, V3(1.f)}; - OctaveBuf.Octaves[1] = {V3(400, 400, 200), 350, V3(3.f)}; - OctaveBuf.Octaves[2] = {V3(35, 35, 25), 6, V3(2.f)}; - - /* OctaveBuf.Octaves[0] = {V3(1000, 1000, 700), 150, V3(1)}; */ - /* OctaveBuf.Octaves[1] = {V3(400, 400, 200), 150, V3(1,1,2)}; */ - /* /1* OctaveBuf.Octaves[2] = {V3(6, 6, 200), 150, V3(1,1,2)}; *1/ */ - - chunk_init_flags InitFlags = chunk_init_flags(ChunkInitFlag_ComputeStandingSpots|ChunkInitFlag_GenLODs); - /* chunk_init_flags InitFlags = chunk_init_flags(ChunkInitFlag_ComputeStandingSpots); */ - /* chunk_init_flags InitFlags = ChunkInitFlag_Noop; */ - InitializeChunkWithNoise( GrassyTerracedTerrain4, Thread, Chunk, Chunk->Dim, 0, V3(Period), Amplititude, StartingZDepth, HSV_GRASS_GREEN, MeshBit_Lod0, InitFlags, (void*)&OctaveBuf); - } - } - } - - return Result; -} +/* BONSAI_API_WORKER_THREAD_INIT_CALLBACK() */ +/* { */ +/* Global_ThreadStates = AllThreads; */ +/* SetThreadLocal_ThreadIndex(ThreadIndex); */ +/* } */ link_internal physics FireballPhysics() @@ -809,7 +757,8 @@ BONSAI_API_MAIN_THREAD_CALLBACK() } - b32 WorldEditMode = (Editor->EngineDebugViewModeToggleBits & (1<EngineDebugViewModeToggleBits & (1<TurnMode == TurnMode_Default && WorldEditMode == 0 ) { @@ -1198,7 +1147,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() GameState->Entropy = {DEBUG_NOISE_SEED}; - AllocateWorld(Resources->World, WorldCenter, WORLD_CHUNK_DIM, g_VisibleRegion); + AllocateWorld(Resources->World, WorldCenter, WORLD_CHUNK_DIM, VisibleRegionSize_128); u32 PlayerModelIndex = ModelIndex_Player_old; GameState->PlayerId = GetFreeEntity(EntityTable); @@ -1215,7 +1164,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() Graphics->GameCamera.GhostId = Player->Id; u32 EnemyCount = 3; - v3i HalfVisibleRegion = g_VisibleRegion / 2; + v3i HalfVisibleRegion = V3i(VisibleRegionSize_128) / 2; HalfVisibleRegion.z = 0; for (u32 EnemyIndex = 0; EnemyIndex < EnemyCount; ++EnemyIndex) { diff --git a/examples/turn_based/game_constants.h b/examples/turn_based/game_constants.h deleted file mode 100644 index eeeb76a8b..000000000 --- a/examples/turn_based/game_constants.h +++ /dev/null @@ -1,35 +0,0 @@ - -#if 0 -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(32, 32, 8); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); -#else - -/* global_variable chunk_dimension */ -/* g_VisibleRegion = Chunk_Dimension(8, 8, 8); */ - -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(12, 12, 8); - -/* global_variable chunk_dimension */ -/* g_VisibleRegion = Chunk_Dimension(24, 16, 6); */ - -/* global_variable chunk_dimension */ -/* g_VisibleRegion = Chunk_Dimension(20, 20, 6); */ - -/* global_variable chunk_dimension */ -/* g_VisibleRegion = Chunk_Dimension(24, 24, 8); */ - -/* global_variable chunk_dimension */ -/* g_VisibleRegion = Chunk_Dimension(32, 32, 8); */ - - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 32); - -/* global_variable chunk_dimension */ -/* WORLD_CHUNK_DIM = Chunk_Dimension(64, 64, 64); */ - -#endif diff --git a/examples/ui_test/game_constants.h b/examples/ui_test/game_constants.h deleted file mode 100644 index db1e55d09..000000000 --- a/examples/ui_test/game_constants.h +++ /dev/null @@ -1,13 +0,0 @@ - -#if 0 -global_variable chunk_dimension -g_VisibleRegion = Chunk_Dimension(32, 32, 8); - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(32, 32, 8); -#else - -global_variable chunk_dimension -WORLD_CHUNK_DIM = Chunk_Dimension(64, 64, 64); - -#endif diff --git a/generated/do_editor_ui_for_compound_type_entity_aggregate_type.h b/generated/do_editor_ui_for_compound_type_entity_aggregate_type.h new file mode 100644 index 000000000..c365e0297 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_entity_aggregate_type.h @@ -0,0 +1,95 @@ +// examples/turn_based/game_types.h:84:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_aggregate_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle entity_aggregate_type", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("Type"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(entity_type*, &Element->Type), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("Status"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(entity_status*, &Element->Status), + MemberName, + Params + ); + + + + + + + + + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_entity_game_data.h b/generated/do_editor_ui_for_compound_type_entity_game_data.h new file mode 100644 index 000000000..09a5eecde --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_entity_game_data.h @@ -0,0 +1,147 @@ +// examples/turn_based/game_types.h:98:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_game_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle entity_game_data", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("FireballChargeLevel"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->FireballChargeLevel), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("FireballCharges"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->FireballCharges), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("IceBlockCharges"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->IceBlockCharges), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("HoldingItem"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->HoldingItem), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_fireball_state.h b/generated/do_editor_ui_for_compound_type_fireball_state.h new file mode 100644 index 000000000..1c89eff17 --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_fireball_state.h @@ -0,0 +1,96 @@ +// examples/turn_based/game_types.h:107:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, fireball_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle fireball_state", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("ChargeLevel"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->ChargeLevel), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("TargetP"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cp*, &Element->TargetP), + MemberName, + Params + ); + + + + + + + + + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_enum_entity_status.h b/generated/do_editor_ui_for_enum_entity_status.h new file mode 100644 index 000000000..1822ffa44 --- /dev/null +++ b/generated/do_editor_ui_for_enum_entity_status.h @@ -0,0 +1,47 @@ +// examples/turn_based/game_types.h:81:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_status *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + { + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("None"), UiId(Window, "enum EntityStatus_None", Element), Params)) + { + *Element = EntityStatus_None; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Carried"), UiId(Window, "enum EntityStatus_Carried", Element), Params)) + { + *Element = EntityStatus_Carried; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Thrown"), UiId(Window, "enum EntityStatus_Thrown", Element), Params)) + { + *Element = EntityStatus_Thrown; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + } + else + { + PushNewRow(Ui); + } +} + + diff --git a/generated/do_editor_ui_for_enum_entity_type.h b/generated/do_editor_ui_for_enum_entity_type.h new file mode 100644 index 000000000..ac864dc94 --- /dev/null +++ b/generated/do_editor_ui_for_enum_entity_type.h @@ -0,0 +1,74 @@ +// examples/turn_based/game_types.h:78:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +{ + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } + + cs ElementName = ToStringPrefixless(*Element); + ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) + { + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Default"), UiId(Window, "enum EntityType_Default", Element), Params)) + { + *Element = EntityType_Default; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Enemy"), UiId(Window, "enum EntityType_Enemy", Element), Params)) + { + *Element = EntityType_Enemy; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Player"), UiId(Window, "enum EntityType_Player", Element), Params)) + { + *Element = EntityType_Player; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Fireball"), UiId(Window, "enum EntityType_Fireball", Element), Params)) + { + *Element = EntityType_Fireball; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("Loot"), UiId(Window, "enum EntityType_Loot", Element), Params)) + { + *Element = EntityType_Loot; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("ItemSpawn"), UiId(Window, "enum EntityType_ItemSpawn", Element), Params)) + { + *Element = EntityType_ItemSpawn; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + } + else + { + PushNewRow(Ui); + } +} + + diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index c84a026d5..b45195f22 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -225,6 +225,7 @@ + struct render_to_texture_async_params; @@ -757,6 +758,8 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 8a1d3ef21..669ec9083 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -297,6 +297,8 @@ + + @@ -1146,5 +1148,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 80b5078ea..6399ec22b 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -225,6 +225,7 @@ + render_to_texture_async_params render_to_texture_async_params; @@ -747,6 +748,8 @@ render_to_texture_async_params render_to_texture_async_params; + + diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 5e7251928..ae682b349 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -90,6 +90,12 @@ + + + + + + @@ -275,6 +281,12 @@ PushToolbar( renderer_2d *Ui, + + + + + + link_internal counted_string ToStringPrefixless(selection_modification_mode Type) @@ -1363,6 +1375,12 @@ PushToolbar( renderer_2d *Ui, + + + + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 18a5e9974..d35e6424b 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -225,6 +225,7 @@ + type_render_to_texture_async_params, @@ -747,6 +748,8 @@ type_render_to_texture_async_params, + + diff --git a/generated/generate_string_table_entity_status.h b/generated/generate_string_table_entity_status.h new file mode 100644 index 000000000..669d4e9c2 --- /dev/null +++ b/generated/generate_string_table_entity_status.h @@ -0,0 +1,34 @@ +// examples/turn_based/game_types.h:75:0 + +link_internal counted_string +ToStringPrefixless(entity_status Type) +{ + counted_string Result = {}; + switch (Type) + { + case EntityStatus_None: { Result = CSz("None"); } break; + case EntityStatus_Carried: { Result = CSz("Carried"); } break; + case EntityStatus_Thrown: { Result = CSz("Thrown"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(entity_status Type) +{ + counted_string Result = {}; + switch (Type) + { + case EntityStatus_None: { Result = CSz("EntityStatus_None"); } break; + case EntityStatus_Carried: { Result = CSz("EntityStatus_Carried"); } break; + case EntityStatus_Thrown: { Result = CSz("EntityStatus_Thrown"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + diff --git a/generated/generate_string_table_entity_type.h b/generated/generate_string_table_entity_type.h new file mode 100644 index 000000000..81cf16e14 --- /dev/null +++ b/generated/generate_string_table_entity_type.h @@ -0,0 +1,40 @@ +// examples/turn_based/game_types.h:72:0 + +link_internal counted_string +ToStringPrefixless(entity_type Type) +{ + counted_string Result = {}; + switch (Type) + { + case EntityType_Default: { Result = CSz("Default"); } break; + case EntityType_Enemy: { Result = CSz("Enemy"); } break; + case EntityType_Player: { Result = CSz("Player"); } break; + case EntityType_Fireball: { Result = CSz("Fireball"); } break; + case EntityType_Loot: { Result = CSz("Loot"); } break; + case EntityType_ItemSpawn: { Result = CSz("ItemSpawn"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(entity_type Type) +{ + counted_string Result = {}; + switch (Type) + { + case EntityType_Default: { Result = CSz("EntityType_Default"); } break; + case EntityType_Enemy: { Result = CSz("EntityType_Enemy"); } break; + case EntityType_Player: { Result = CSz("EntityType_Player"); } break; + case EntityType_Fireball: { Result = CSz("EntityType_Fireball"); } break; + case EntityType_Loot: { Result = CSz("EntityType_Loot"); } break; + case EntityType_ItemSpawn: { Result = CSz("EntityType_ItemSpawn"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + diff --git a/generated/generate_string_table_player_action.h b/generated/generate_string_table_player_action.h new file mode 100644 index 000000000..1d9baf536 --- /dev/null +++ b/generated/generate_string_table_player_action.h @@ -0,0 +1,44 @@ +// examples/turn_based/game_types.h:141:0 + +link_internal counted_string +ToStringPrefixless(player_action Type) +{ + counted_string Result = {}; + switch (Type) + { + case PlayerAction_None: { Result = CSz("None"); } break; + case PlayerAction_Move: { Result = CSz("Move"); } break; + case PlayerAction_Shovel: { Result = CSz("Shovel"); } break; + case PlayerAction_Grab: { Result = CSz("Grab"); } break; + case PlayerAction_ChargeFireball: { Result = CSz("ChargeFireball"); } break; + case PlayerAction_IceBlock: { Result = CSz("IceBlock"); } break; + case PlayerAction_Throw: { Result = CSz("Throw"); } break; + case PlayerAction_Count: { Result = CSz("Count"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(player_action Type) +{ + counted_string Result = {}; + switch (Type) + { + case PlayerAction_None: { Result = CSz("PlayerAction_None"); } break; + case PlayerAction_Move: { Result = CSz("PlayerAction_Move"); } break; + case PlayerAction_Shovel: { Result = CSz("PlayerAction_Shovel"); } break; + case PlayerAction_Grab: { Result = CSz("PlayerAction_Grab"); } break; + case PlayerAction_ChargeFireball: { Result = CSz("PlayerAction_ChargeFireball"); } break; + case PlayerAction_IceBlock: { Result = CSz("PlayerAction_IceBlock"); } break; + case PlayerAction_Throw: { Result = CSz("PlayerAction_Throw"); } break; + case PlayerAction_Count: { Result = CSz("PlayerAction_Count"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + diff --git a/generated/generate_string_table_turn_mode.h b/generated/generate_string_table_turn_mode.h new file mode 100644 index 000000000..c75d6b0c8 --- /dev/null +++ b/generated/generate_string_table_turn_mode.h @@ -0,0 +1,32 @@ +// examples/turn_based/game_types.h:151:0 + +link_internal counted_string +ToStringPrefixless(turn_mode Type) +{ + counted_string Result = {}; + switch (Type) + { + case TurnMode_Default: { Result = CSz("Default"); } break; + case TurnMode_Transition: { Result = CSz("Transition"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(turn_mode Type) +{ + counted_string Result = {}; + switch (Type) + { + case TurnMode_Default: { Result = CSz("TurnMode_Default"); } break; + case TurnMode_Transition: { Result = CSz("TurnMode_Transition"); } break; + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + return Result; +} + diff --git a/generated/serdes_struct_entity_game_data.h b/generated/serdes_struct_entity_game_data.h new file mode 100644 index 000000000..8213092a8 --- /dev/null +++ b/generated/serdes_struct_entity_game_data.h @@ -0,0 +1,130 @@ +// examples/turn_based/game.cpp:1086:0 + +link_internal bonsai_type_info +TypeInfo(entity_game_data *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("entity_game_data"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, entity_game_data *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + entity_game_data *Element = BaseElement + ElementIndex; + Result &= Serialize(Bytes, &Element->FireballChargeLevel); // default + + + + + + + Result &= Serialize(Bytes, &Element->FireballCharges); // default + + + + + + + Result &= Serialize(Bytes, &Element->IceBlockCharges); // default + + + + + + + Result &= Serialize(Bytes, &Element->HoldingItem); // default + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, entity_game_data *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, entity_game_data *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, entity_game_data *Element, memory_arena *Memory) +{ + b32 Result = True; + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->FireballChargeLevel, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->FireballCharges, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->IceBlockCharges, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->HoldingItem, Memory); + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, entity_game_data *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/jesse.make.sh b/jesse.make.sh index 9169579d9..d46d83b5a 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -2,17 +2,17 @@ # OPT="-O2" -# ./make.sh RunPoof -# [ $? -ne 0 ] && exit 1 +./make.sh RunPoof +[ $? -ne 0 ] && exit 1 # ./make.sh $OPT BuildAll # ./make.sh RunTests ./make.sh $OPT \ - BuildSingleExample examples/terrain_gen \ - BuildExecutables \ - BuildSingleExample examples/project_and_level_picker \ + # BuildSingleExample examples/terrain_gen \ + # BuildExecutables \ + # BuildSingleExample examples/project_and_level_picker \ # BuildTests \ # BuildSingleExample examples/ui_test \ # BuildSingleExample examples/blank_project \ diff --git a/make.sh b/make.sh index 30883d33d..7f80d4c07 100755 --- a/make.sh +++ b/make.sh @@ -53,9 +53,9 @@ BUNDLED_EXAMPLES=" $EXAMPLES/the_wanderer $EXAMPLES/terrain_gen $EXAMPLES/transparency - $EXAMPLES/tools/voxel_synthesis_rule_baker $EXAMPLES/project_and_level_picker " + # $EXAMPLES/tools/voxel_synthesis_rule_baker EXECUTABLES_TO_BUILD=" $SRC/game_loader.cpp @@ -334,12 +334,12 @@ function RunPoof # RunPoofHelper src/game_loader.cpp && echo -e "$Success poofed src/game_loader.cpp" & # TrackPid "" $! - # RunPoofHelper examples/turn_based/game.cpp && echo -e "$Success poofed examples/turn_based/game.cpp" & - # TrackPid "" $! - - RunPoofHelper examples/terrain_gen/game.cpp && echo -e "$Success poofed examples/terrain_gen/game.cpp" & + RunPoofHelper examples/turn_based/game.cpp && echo -e "$Success poofed examples/turn_based/game.cpp" & TrackPid "" $! + # RunPoofHelper examples/terrain_gen/game.cpp && echo -e "$Success poofed examples/terrain_gen/game.cpp" & + # TrackPid "" $! + # RunPoofHelper examples/the_wanderer/game.cpp && echo -e "$Success poofed examples/the_wanderer/game.cpp" & # TrackPid "" $! From aebf95795e61caaf6dd97caab99344438a34576a Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 22 Sep 2025 08:39:59 -0700 Subject: [PATCH 334/421] Update stdlib --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 96406edf4..6cd0e3e59 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 96406edf4bd80062a447fc96bb66788d78b50947 +Subproject commit 6cd0e3e59e105b002793969b8ae3c56cc9e8c7cc From 20bacd11dec3cd3f273b627333065244e9a7e8fc Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 22 Sep 2025 10:04:00 -0700 Subject: [PATCH 335/421] Asyncify CompileShaderPair --- examples/terrain_gen/game.cpp | 3 +-- ...cify_render_function_c_CompileShaderPair.h | 20 +++++++++++++++++++ .../asyncify_render_function_c_DrawLod.h | 8 ++++---- ...yncify_render_function_c_RenderToTexture.h | 8 ++++---- ...cify_render_function_h_CompileShaderPair.h | 10 ++++++++++ .../asyncify_render_function_h_DrawLod.h | 3 ++- ...yncify_render_function_h_RenderToTexture.h | 3 ++- .../d_union_constructors_work_queue_entry.h | 2 +- generated/d_union_work_queue_entry.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 13 +++++++++++- generated/for_datatypes_Bxw4Q7AW.h | 1 + generated/for_datatypes_fkubhsYl.h | 4 +++- generated/for_datatypes_kv3WBTai.h | 4 +++- jesse.make.sh | 6 +++--- src/engine/work_queue.h | 17 ++++++++++++---- 15 files changed, 80 insertions(+), 24 deletions(-) create mode 100644 generated/asyncify_render_function_c_CompileShaderPair.h create mode 100644 generated/asyncify_render_function_h_CompileShaderPair.h diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index c06909eee..43a2b4a6c 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -44,8 +44,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() CameraGhost->P.WorldP = VisibleRegion/2; CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); - GameState->Shader = CompileShaderPair(CSz(STDLIB_SHADER_PATH "passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "cosine_interp_vis.fragmentshader")); - + CompileShaderPair_Async(RenderQ, CSz(STDLIB_SHADER_PATH "passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "cosine_interp_vis.fragmentshader"), True, &GameState->Shader); SpawnEntity(CameraGhost); return GameState; diff --git a/generated/asyncify_render_function_c_CompileShaderPair.h b/generated/asyncify_render_function_c_CompileShaderPair.h new file mode 100644 index 000000000..0b546c7b3 --- /dev/null +++ b/generated/asyncify_render_function_c_CompileShaderPair.h @@ -0,0 +1,20 @@ +// src/engine/work_queue.h:334:0 + +link_internal void +CompileShaderPair_Async(work_queue *Queue, cs VertShaderPath , cs FragShaderPath , b32 DumpErrors , shader* Dest ) +{ + compile_shader_pair_async_params Params = + { + Dest, VertShaderPath, FragShaderPath, DumpErrors, + }; + + work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); + PushWorkQueueEntry(Queue, &Entry); +} + +link_internal void +DoJob(compile_shader_pair_async_params *Params) +{ + *Params->Dest = CompileShaderPair( Params->VertShaderPath , Params->FragShaderPath , Params->DumpErrors ); +} + diff --git a/generated/asyncify_render_function_c_DrawLod.h b/generated/asyncify_render_function_c_DrawLod.h index ebd52a57e..519911f7c 100644 --- a/generated/asyncify_render_function_c_DrawLod.h +++ b/generated/asyncify_render_function_c_DrawLod.h @@ -1,11 +1,11 @@ -// src/engine/work_queue.h:329:0 +// src/engine/work_queue.h:331:0 link_internal void -DrawLod_Async(work_queue *Queue, engine_resources *Engine , shader *Shader , gpu_mapped_element_buffer *Meshes , v3 Basis , Quaternion Rotation , v3 Scale ) +DrawLod_Async(work_queue *Queue, engine_resources *Engine , shader *Shader , gpu_mapped_element_buffer *Meshes , v3 Basis , Quaternion Rotation , v3 Scale ) { draw_lod_async_params Params = { - Engine, Shader, Meshes, Basis, Rotation, Scale, + Engine, Shader, Meshes, Basis, Rotation, Scale, }; work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); @@ -15,6 +15,6 @@ DrawLod_Async(work_queue *Queue, engine_resources *Engine , shader *Shader , gp link_internal void DoJob(draw_lod_async_params *Params) { - DrawLod( Params->Engine , Params->Shader , Params->Meshes , Params->Basis , Params->Rotation , Params->Scale ); + DrawLod( Params->Engine , Params->Shader , Params->Meshes , Params->Basis , Params->Rotation , Params->Scale ); } diff --git a/generated/asyncify_render_function_c_RenderToTexture.h b/generated/asyncify_render_function_c_RenderToTexture.h index 949363ea0..c0699e468 100644 --- a/generated/asyncify_render_function_c_RenderToTexture.h +++ b/generated/asyncify_render_function_c_RenderToTexture.h @@ -1,11 +1,11 @@ -// src/engine/work_queue.h:326:0 +// src/engine/work_queue.h:328:0 link_internal void -RenderToTexture_Async(work_queue *Queue, engine_resources *Engine , asset_thumbnail *Thumb , gpu_mapped_element_buffer *Meshes , v3 Offset , camera *Camera ) +RenderToTexture_Async(work_queue *Queue, engine_resources *Engine , asset_thumbnail *Thumb , gpu_mapped_element_buffer *Meshes , v3 Offset , camera *Camera ) { render_to_texture_async_params Params = { - Engine, Thumb, Meshes, Offset, Camera, + Engine, Thumb, Meshes, Offset, Camera, }; work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); @@ -15,6 +15,6 @@ RenderToTexture_Async(work_queue *Queue, engine_resources *Engine , asset_thumb link_internal void DoJob(render_to_texture_async_params *Params) { - RenderToTexture( Params->Engine , Params->Thumb , Params->Meshes , Params->Offset , Params->Camera ); + RenderToTexture( Params->Engine , Params->Thumb , Params->Meshes , Params->Offset , Params->Camera ); } diff --git a/generated/asyncify_render_function_h_CompileShaderPair.h b/generated/asyncify_render_function_h_CompileShaderPair.h new file mode 100644 index 000000000..7fa3f46f6 --- /dev/null +++ b/generated/asyncify_render_function_h_CompileShaderPair.h @@ -0,0 +1,10 @@ +// src/engine/work_queue.h:186:0 + +struct compile_shader_pair_async_params poof(@async_function_params) +{ + shader* Dest; + cs VertShaderPath; + cs FragShaderPath; + b32 DumpErrors; +}; + diff --git a/generated/asyncify_render_function_h_DrawLod.h b/generated/asyncify_render_function_h_DrawLod.h index 53848c76a..4f1e1dc35 100644 --- a/generated/asyncify_render_function_h_DrawLod.h +++ b/generated/asyncify_render_function_h_DrawLod.h @@ -1,7 +1,8 @@ -// src/engine/work_queue.h:182:0 +// src/engine/work_queue.h:183:0 struct draw_lod_async_params poof(@async_function_params) { + engine_resources *Engine; shader *Shader; gpu_mapped_element_buffer *Meshes; diff --git a/generated/asyncify_render_function_h_RenderToTexture.h b/generated/asyncify_render_function_h_RenderToTexture.h index 456d45154..5f706d50c 100644 --- a/generated/asyncify_render_function_h_RenderToTexture.h +++ b/generated/asyncify_render_function_h_RenderToTexture.h @@ -1,7 +1,8 @@ -// src/engine/work_queue.h:176:0 +// src/engine/work_queue.h:177:0 struct render_to_texture_async_params poof(@async_function_params) { + engine_resources *Engine; asset_thumbnail *Thumb; gpu_mapped_element_buffer *Meshes; diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 3df350372..5ef05b3e1 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:270:0 +// src/engine/work_queue.h:272:0 link_internal work_queue_entry diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index efe4895b9..8570bc054 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:239:0 +// src/engine/work_queue.h:241:0 enum work_queue_entry_type { diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index b45195f22..2bdb2dd1a 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:302:0 +// src/engine/work_queue.h:304:0 @@ -702,6 +702,17 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) +struct compile_shader_pair_async_params; +link_internal work_queue_entry +WorkQueueEntryAsyncFunction( compile_shader_pair_async_params *Params ) +{ + work_queue_entry Result = {}; + Result.Type = type_work_queue_entry_async_function_call; + Result.work_queue_entry_async_function_call.Type = type_compile_shader_pair_async_params; + Result.work_queue_entry_async_function_call.compile_shader_pair_async_params = *Params; + return Result; +} + diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 669ec9083..c75c751d3 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1149,5 +1149,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 6399ec22b..177d3e6b9 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:222:0 +// src/engine/work_queue.h:224:0 @@ -692,6 +692,8 @@ render_to_texture_async_params render_to_texture_async_params; +compile_shader_pair_async_params compile_shader_pair_async_params; + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index d35e6424b..f166916c5 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:203:0 +// src/engine/work_queue.h:205:0 @@ -692,6 +692,8 @@ type_render_to_texture_async_params, +type_compile_shader_pair_async_params, + diff --git a/jesse.make.sh b/jesse.make.sh index d46d83b5a..107bda523 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -10,9 +10,9 @@ # ./make.sh RunTests ./make.sh $OPT \ - # BuildSingleExample examples/terrain_gen \ - # BuildExecutables \ - # BuildSingleExample examples/project_and_level_picker \ + BuildSingleExample examples/terrain_gen \ + BuildExecutables \ + BuildSingleExample examples/project_and_level_picker \ # BuildTests \ # BuildSingleExample examples/ui_test \ # BuildSingleExample examples/blank_project \ diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index d0c744b72..2a0dad1dd 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -140,6 +140,7 @@ poof( { struct (func_t.name.to_snake_case)_async_params poof(@async_function_params) { + func_t.value ? { func_t.value* Dest; } func_t.map(arg) { arg; @@ -153,11 +154,11 @@ poof( func asyncify_render_function_c(func_t) { link_internal void - (func_t.name)_Async(work_queue *Queue, func_t.map(arg).sep(,) { arg }) + (func_t.name)_Async(work_queue *Queue, func_t.map(arg).sep(,) { arg } func_t.value? { , func_t.value* Dest }) { (func_t.name.to_snake_case)_async_params Params = { - func_t.map(arg) { arg.name, } + func_t.value? { Dest, } func_t.map(arg) { arg.name, } }; work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); @@ -167,7 +168,7 @@ poof( link_internal void DoJob((func_t.name.to_snake_case)_async_params *Params) { - func_t.name((func_t.map(arg).sep(,) { Params->(arg.name) })); + func_t.value? { *Params->Dest = } func_t.name((func_t.map(arg).sep(,) { Params->(arg.name) })); } } ) @@ -182,7 +183,8 @@ DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Mes poof(asyncify_render_function_h(DrawLod)) #include - +poof(asyncify_render_function_h(CompileShaderPair)) +#include @@ -329,6 +331,8 @@ poof(asyncify_render_function_c(RenderToTexture)) poof(asyncify_render_function_c(DrawLod)) #include +poof(asyncify_render_function_c(CompileShaderPair)) +#include link_internal void DispatchAsyncFunctionCall(work_queue_entry_async_function_call *Job) @@ -344,6 +348,11 @@ DispatchAsyncFunctionCall(work_queue_entry_async_function_call *Job) tmatch(draw_lod_async_params, Job, DrawLodParams); DoJob(DrawLodParams); } break; + + { + tmatch(compile_shader_pair_async_params, Job, RenderToTexture); + DoJob(RenderToTexture); + } break; } } From bd05d70a5358964df66b5ae132ff0f39e97f7c31 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 22 Sep 2025 13:21:34 -0700 Subject: [PATCH 336/421] Update stdlib and draw untextured quad with custom cosine easing shader --- examples/terrain_gen/game.cpp | 8 +- external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- .../block_array_h_shader_ptr_688853971_0.h | 2 +- generated/buffer_h_struct_u32.h | 2 +- generated/d_union_ui_render_command.h | 2 +- .../shader_magic_bloom_downsample_shader.h | 21 ++- .../shader_magic_bloom_upsample_shader.h | 21 ++- .../shader_magic_lighting_render_group.h | 121 +++++++++--------- generated/shader_magic_shadow_map_shader.h | 33 +++-- ...r_magic_struct_terrain_decoration_shader.h | 33 +++-- ...gic_struct_terrain_derivs_render_context.h | 21 ++- ...c_struct_terrain_finalize_render_context.h | 21 ++- ...ader_magic_struct_terrain_shaping_shader.h | 29 +++-- .../shader_magic_struct_world_edit_shader.h | 33 +++-- .../shader_magic_textured_quad_render_pass.h | 33 +++-- 18 files changed, 227 insertions(+), 161 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 43a2b4a6c..cb8b7c899 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -64,12 +64,8 @@ BONSAI_API_MAIN_THREAD_CALLBACK() { window_layout *Window = GetOrCreateWindow(Ui, UiId("EasingWindow")); PushWindowStart(Ui, Window); - - /* PushSetCustomShader(Ui, ); */ - - PushUntexturedQuad(Ui, V2(0), V2(128), zDepth_Text); - - + /* PushUntexturedQuad(Ui, V2(0), V2(128), zDepth_Text, 0, {}, UiElementLayoutFlag_Default); */ + PushUntexturedQuad(Ui, V2(0), V2(128), zDepth_Text, 0, {}, UiElementLayoutFlag_Default, &GameState->Shader); PushWindowEnd(Ui, Window); } diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 6cd0e3e59..a0388f416 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 6cd0e3e59e105b002793969b8ae3c56cc9e8c7cc +Subproject commit a0388f41688b1acccaa2c1ca27e24be05107a556 diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index f96dd39a6..8e354d696 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2439:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2462:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index f08676fdc..f689321bd 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3432:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3483:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 533a684a0..22f528a15 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2392:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2415:0 case type_ui_render_command_window_start: { diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 97c499f2e..11e53146b 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:141:0 +// external/bonsai_stdlib/src/shader.h:148:0 diff --git a/generated/buffer_h_struct_u32.h b/generated/buffer_h_struct_u32.h index a19716750..594f724a8 100644 --- a/generated/buffer_h_struct_u32.h +++ b/generated/buffer_h_struct_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:122:0 +// external/bonsai_stdlib/src/shader.h:129:0 struct shader_uniform_buffer { diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 0cbcc66b8..4ea11a11d 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:881:0 +// external/bonsai_stdlib/src/ui/ui.h:878:0 enum ui_render_command_type { diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index 2d3089f60..a94336cde 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -32,18 +32,25 @@ InitializeBloomDownsampleShader( bloom_downsample_shader *Struct link_internal void UseShader( bloom_downsample_shader *Struct ) { - GetGL()->UseProgram(Struct->Program.ID); + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); - s32 TextureUnit = 0; - s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - if (UniformIndex != 1 ) + if (UniformIndex != 1 ) + { + Error("Shader (bloom_downsample_shader) had an incorrect number of uniform slots!"); + } + } + else { - Error("Shader (bloom_downsample_shader) had an incorrect number of uniform slots!"); + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/bloom_downsample.fragmentshader\")"); } } diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index 0f776a83b..4f7af184a 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -32,18 +32,25 @@ InitializeBloomUpsampleShader( bloom_upsample_shader *Struct link_internal void UseShader( bloom_upsample_shader *Struct ) { - GetGL()->UseProgram(Struct->Program.ID); + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); - s32 TextureUnit = 0; - s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - if (UniformIndex != 1 ) + if (UniformIndex != 1 ) + { + Error("Shader (bloom_upsample_shader) had an incorrect number of uniform slots!"); + } + } + else { - Error("Shader (bloom_upsample_shader) had an incorrect number of uniform slots!"); + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/bloom_upsample.fragmentshader\")"); } } diff --git a/generated/shader_magic_lighting_render_group.h b/generated/shader_magic_lighting_render_group.h index a10295ad2..f4e1f8d71 100644 --- a/generated/shader_magic_lighting_render_group.h +++ b/generated/shader_magic_lighting_render_group.h @@ -132,93 +132,100 @@ InitializeLightingRenderGroup( lighting_render_group *Struct link_internal void UseShader( lighting_render_group *Struct ) { - GetGL()->UseProgram(Struct->Program.ID); + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); - s32 TextureUnit = 0; - s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - if (UniformIndex != 26 ) + if (UniformIndex != 26 ) + { + Error("Shader (lighting_render_group) had an incorrect number of uniform slots!"); + } + } + else { - Error("Shader (lighting_render_group) had an incorrect number of uniform slots!"); + SoftError("Attempted to bind uncompiled Shader (BONSAI_SHADER_PATH \"Lighting.vertexshader\") | (BONSAI_SHADER_PATH \"Lighting.fragmentshader\")"); } } diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index 4dc59e75a..e7a22ba9e 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -41,25 +41,32 @@ InitializeShadowMapShader( shadow_map_shader *Struct link_internal void UseShader( shadow_map_shader *Struct ) { - GetGL()->UseProgram(Struct->Program.ID); + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); - s32 TextureUnit = 0; - s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - if (UniformIndex != 4 ) + if (UniformIndex != 4 ) + { + Error("Shader (shadow_map_shader) had an incorrect number of uniform slots!"); + } + } + else { - Error("Shader (shadow_map_shader) had an incorrect number of uniform slots!"); + SoftError("Attempted to bind uncompiled Shader (\"shaders/DepthRTT.vertexshader\") | (\"shaders/DepthRTT.fragmentshader\")"); } } diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index 3dbaa4caf..16ba53735 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -41,25 +41,32 @@ InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Str link_internal void UseShader( terrain_decoration_render_context *Struct ) { - GetGL()->UseProgram(Struct->Program.ID); + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); - s32 TextureUnit = 0; - s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - if (UniformIndex != 4 ) + if (UniformIndex != 4 ) + { + Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots!"); + } + } + else { - Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots!"); + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/decoration/default.fragmentshader\")"); } } diff --git a/generated/shader_magic_struct_terrain_derivs_render_context.h b/generated/shader_magic_struct_terrain_derivs_render_context.h index e3adef5ef..bfa32ee2f 100644 --- a/generated/shader_magic_struct_terrain_derivs_render_context.h +++ b/generated/shader_magic_struct_terrain_derivs_render_context.h @@ -32,18 +32,25 @@ InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct link_internal void UseShader( terrain_derivs_render_context *Struct ) { - GetGL()->UseProgram(Struct->Program.ID); + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); - s32 TextureUnit = 0; - s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - if (UniformIndex != 1 ) + if (UniformIndex != 1 ) + { + Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots!"); + } + } + else { - Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots!"); + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/derivs.fragmentshader\")"); } } diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index 388e9fa03..fcdfb5eac 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -32,18 +32,25 @@ InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct link_internal void UseShader( terrain_finalize_render_context *Struct ) { - GetGL()->UseProgram(Struct->Program.ID); + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); - s32 TextureUnit = 0; - s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - if (UniformIndex != 1 ) + if (UniformIndex != 1 ) + { + Error("Shader (terrain_finalize_render_context) had an incorrect number of uniform slots!"); + } + } + else { - Error("Shader (terrain_finalize_render_context) had an incorrect number of uniform slots!"); + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/TerrainFinalize.fragmentshader\")"); } } diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index e8676b4d9..227328f07 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -37,22 +37,29 @@ InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct link_internal void UseShader( terrain_shaping_render_context *Struct ) { - GetGL()->UseProgram(Struct->Program.ID); + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); - s32 TextureUnit = 0; - s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - if (UniformIndex != 3 ) + if (UniformIndex != 3 ) + { + Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots!"); + } + } + else { - Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots!"); + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/shaping/default.fragmentshader\")"); } } diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index c5c8c8c69..452e8d4e2 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -41,25 +41,32 @@ InitializeWorldEditRenderContext( world_edit_render_context *Struct link_internal void UseShader( world_edit_render_context *Struct ) { - GetGL()->UseProgram(Struct->Program.ID); + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); - s32 TextureUnit = 0; - s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - if (UniformIndex != 4 ) + if (UniformIndex != 4 ) + { + Error("Shader (world_edit_render_context) had an incorrect number of uniform slots!"); + } + } + else { - Error("Shader (world_edit_render_context) had an incorrect number of uniform slots!"); + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/world_edit.fragmentshader\")"); } } diff --git a/generated/shader_magic_textured_quad_render_pass.h b/generated/shader_magic_textured_quad_render_pass.h index 815d84510..22da7841f 100644 --- a/generated/shader_magic_textured_quad_render_pass.h +++ b/generated/shader_magic_textured_quad_render_pass.h @@ -41,25 +41,32 @@ InitializeTexturedQuadRenderPass( textured_quad_render_pass *Struct link_internal void UseShader( textured_quad_render_pass *Struct ) { - GetGL()->UseProgram(Struct->Program.ID); + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); - s32 TextureUnit = 0; - s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - if (UniformIndex != 4 ) + if (UniformIndex != 4 ) + { + Error("Shader (textured_quad_render_pass) had an incorrect number of uniform slots!"); + } + } + else { - Error("Shader (textured_quad_render_pass) had an incorrect number of uniform slots!"); + SoftError("Attempted to bind uncompiled Shader (STDLIB_SHADER_PATH \"FullPassthrough.vertexshader\") | (STDLIB_SHADER_PATH \"SimpleTexture.fragmentshader\")"); } } From 27207446ec76a23ab66c82cae3b021e73a5bbbba Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 22 Sep 2025 16:22:38 -0700 Subject: [PATCH 337/421] Minor tweaks getting custom shaders working --- examples/terrain_gen/game.cpp | 10 ++++++++++ external/bonsai_stdlib | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- shaders/cosine_interp_vis.fragmentshader | 11 +++++++---- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index cb8b7c899..1cb21d344 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -28,6 +28,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, VisibleRegionSize); GameState = Allocate(game_state, Resources->GameMemory, 1); + *GameState = {}; Camera->GhostId = GetFreeEntity(EntityTable); entity *CameraGhost = GetEntity(EntityTable, Camera->GhostId); @@ -51,6 +52,9 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() } +static b32 temp_ShaderRegistered; + + BONSAI_API_MAIN_THREAD_CALLBACK() { Assert(ThreadLocal_ThreadIndex == 0); @@ -58,6 +62,12 @@ BONSAI_API_MAIN_THREAD_CALLBACK() TIMED_FUNCTION(); UNPACK_ENGINE_RESOURCES(Resources); + if (GameState->Shader.ID != INVALID_SHADER && temp_ShaderRegistered == False) + { + temp_ShaderRegistered = True; + RegisterShaderForHotReload(&Resources->Stdlib, &GameState->Shader); + } + f32 dt = Plat->dt; f32 Speed = 80.f; diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index a0388f416..0f165228c 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit a0388f41688b1acccaa2c1ca27e24be05107a556 +Subproject commit 0f165228cb9e9698bb6ec2b124f0ada62cd5ae35 diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index f689321bd..033331e65 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3483:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3486:0 if (Input->Dot.Clicked) { diff --git a/shaders/cosine_interp_vis.fragmentshader b/shaders/cosine_interp_vis.fragmentshader index 06330e8b7..ebcf1f398 100644 --- a/shaders/cosine_interp_vis.fragmentshader +++ b/shaders/cosine_interp_vis.fragmentshader @@ -1,4 +1,4 @@ -out vec2 UV; +in vec2 UV; out v4 Output; @@ -199,8 +199,11 @@ f32 MapToFinal(f32 tx) void main() { + Output = V4(0,0,0,1); - Output.xy = UV; - Output.z = 0.f; - Output.w = 1.f + Output.xy = v2(1.f, 1.f); + /* Output.r = gl_FragCoord.r/512.f; */ + /* Output.g = gl_FragCoord.g/256.f; */ + /* Output.rg = gl_FragCoord.rg/128.f; */ + /* Output.rg = UV; */ } From 6d9b623bfe5dd949ea2fc3d13a874fd94e1bdb36 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 29 Sep 2025 12:04:37 -0700 Subject: [PATCH 338/421] Update stdlib --- external/bonsai_stdlib | 2 +- generated/anonymous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- generated/anonymous_ui_render_command_nKuoMe2B.h | 2 +- ...er_is_marked_for_growth_untextured_3d_geometry_buffer.h | 2 +- ...uffering_functions_h_untextured_3d_geometry_buffer_v3.h | 2 +- ...ering_functions_h_untextured_3d_geometry_buffer_v3_u8.h | 2 +- ...fering_functions_untextured_3d_geometry_buffer_v3_f32.h | 2 +- ...ffering_functions_untextured_3d_geometry_buffer_v3_u8.h | 2 +- generated/copy_normal_buffer_v3_u8_v3.h | 2 +- generated/copy_normal_buffer_v3_u8_v3_u8.h | 2 +- generated/copy_normal_buffer_v3_v3.h | 2 +- generated/copy_normal_buffer_v3_v3_u8.h | 2 +- generated/copy_vertex_buffer_v3_u8_v3.h | 2 +- generated/copy_vertex_buffer_v3_u8_v3_u8.h | 2 +- generated/copy_vertex_buffer_v3_v3.h | 2 +- generated/copy_vertex_buffer_v3_v3_u8_f32.h | 2 +- .../do_editor_ui_for_compound_type_render_buffers_2d.h | 2 +- generated/do_editor_ui_for_compound_type_renderer_2d.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 3 +-- generated/for_datatypes_Bxw4Q7AW.h | 1 - generated/for_datatypes_fkubhsYl.h | 3 +-- generated/for_datatypes_kv3WBTai.h | 3 +-- jesse.make.sh | 4 ++-- src/engine/mesh.h | 7 ------- 25 files changed, 24 insertions(+), 35 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 0f165228c..6a44a54dc 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 0f165228cb9e9698bb6ec2b124f0ada62cd5ae35 +Subproject commit 6a44a54dc632c09d605dcc9444c36380e61b2052 diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 8e354d696..0b6b008c0 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2462:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2488:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 033331e65..ae1b3a3c4 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3486:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3510:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 22f528a15..20af8e212 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2415:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2441:0 case type_ui_render_command_window_start: { diff --git a/generated/buffer_is_marked_for_growth_untextured_3d_geometry_buffer.h b/generated/buffer_is_marked_for_growth_untextured_3d_geometry_buffer.h index 29665dca7..bc5ceed27 100644 --- a/generated/buffer_is_marked_for_growth_untextured_3d_geometry_buffer.h +++ b/generated/buffer_is_marked_for_growth_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:87:0 +// src/engine/mesh.h:80:0 link_internal b32 BufferIsMarkedForGrowth(untextured_3d_geometry_buffer *Dest) diff --git a/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3.h b/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3.h index 82935ed23..718201347 100644 --- a/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3.h +++ b/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:611:0 +// src/engine/mesh.h:604:0 // // Rotate, Scale and Offset diff --git a/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3_u8.h b/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3_u8.h index f8f3aa9d0..72b6f8a6b 100644 --- a/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:613:0 +// src/engine/mesh.h:606:0 // // Rotate, Scale and Offset diff --git a/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_f32.h b/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_f32.h index 873bf5c64..ded2dcb25 100644 --- a/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_f32.h +++ b/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_f32.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:625:0 +// src/engine/mesh.h:618:0 // // Rotate, Scale and Offset diff --git a/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_u8.h index 6177fea27..4ca467207 100644 --- a/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:627:0 +// src/engine/mesh.h:620:0 // // Rotate, Scale and Offset diff --git a/generated/copy_normal_buffer_v3_u8_v3.h b/generated/copy_normal_buffer_v3_u8_v3.h index ac245c5d7..6a8be4f00 100644 --- a/generated/copy_normal_buffer_v3_u8_v3.h +++ b/generated/copy_normal_buffer_v3_u8_v3.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:326:0 +// src/engine/mesh.h:319:0 link_inline void CopyNormalBuffer( v3_u8 *Dest, v3 *Src, u32 NumVerts, Quaternion Rot) diff --git a/generated/copy_normal_buffer_v3_u8_v3_u8.h b/generated/copy_normal_buffer_v3_u8_v3_u8.h index b0a31ec6a..0e1948c09 100644 --- a/generated/copy_normal_buffer_v3_u8_v3_u8.h +++ b/generated/copy_normal_buffer_v3_u8_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:324:0 +// src/engine/mesh.h:317:0 link_inline void CopyNormalBuffer( v3_u8 *Dest, v3_u8 *Src, u32 NumVerts, Quaternion Rot) diff --git a/generated/copy_normal_buffer_v3_v3.h b/generated/copy_normal_buffer_v3_v3.h index a52692eee..d9504e249 100644 --- a/generated/copy_normal_buffer_v3_v3.h +++ b/generated/copy_normal_buffer_v3_v3.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:328:0 +// src/engine/mesh.h:321:0 link_inline void CopyNormalBuffer( v3 *Dest, v3 *Src, u32 NumVerts, Quaternion Rot) diff --git a/generated/copy_normal_buffer_v3_v3_u8.h b/generated/copy_normal_buffer_v3_v3_u8.h index 82c2b95fb..f8e7f56d4 100644 --- a/generated/copy_normal_buffer_v3_v3_u8.h +++ b/generated/copy_normal_buffer_v3_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:330:0 +// src/engine/mesh.h:323:0 link_inline void CopyNormalBuffer( v3 *Dest, v3_u8 *Src, u32 NumVerts, Quaternion Rot) diff --git a/generated/copy_vertex_buffer_v3_u8_v3.h b/generated/copy_vertex_buffer_v3_u8_v3.h index 7afc51c54..0958f09ff 100644 --- a/generated/copy_vertex_buffer_v3_u8_v3.h +++ b/generated/copy_vertex_buffer_v3_u8_v3.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:317:0 +// src/engine/mesh.h:310:0 // // Offset, Scale, Rotate diff --git a/generated/copy_vertex_buffer_v3_u8_v3_u8.h b/generated/copy_vertex_buffer_v3_u8_v3_u8.h index c4c7f35c8..ced6939d5 100644 --- a/generated/copy_vertex_buffer_v3_u8_v3_u8.h +++ b/generated/copy_vertex_buffer_v3_u8_v3_u8.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:315:0 +// src/engine/mesh.h:308:0 // // Offset, Scale, Rotate diff --git a/generated/copy_vertex_buffer_v3_v3.h b/generated/copy_vertex_buffer_v3_v3.h index f3cf67fe7..1a8e30ce0 100644 --- a/generated/copy_vertex_buffer_v3_v3.h +++ b/generated/copy_vertex_buffer_v3_v3.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:319:0 +// src/engine/mesh.h:312:0 // // Offset, Scale, Rotate diff --git a/generated/copy_vertex_buffer_v3_v3_u8_f32.h b/generated/copy_vertex_buffer_v3_v3_u8_f32.h index ca137f381..e3473faaf 100644 --- a/generated/copy_vertex_buffer_v3_v3_u8_f32.h +++ b/generated/copy_vertex_buffer_v3_v3_u8_f32.h @@ -1,4 +1,4 @@ -// src/engine/mesh.h:321:0 +// src/engine/mesh.h:314:0 // // Offset, Scale, Rotate diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index cbac88fc3..4b60d418a 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -209,7 +209,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(textured_2d_geometry_buffer*, &Element->Geo), + Cast(ui_geometry_buffer*, &Element->Geo), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 10b2d7c07..decba2055 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -424,7 +424,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(untextured_2d_geometry_buffer*, &Element->Geo), + Cast(ui_geometry_buffer*, &Element->Geo), MemberName, Params ); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 2bdb2dd1a..3ceeed8dc 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -697,8 +697,6 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) - - @@ -772,6 +770,7 @@ WorkQueueEntryAsyncFunction( compile_shader_pair_async_params *Params ) + struct draw_lod_async_params; diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index c75c751d3..669ec9083 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1149,6 +1149,5 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 177d3e6b9..09d0f5479 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -687,8 +687,6 @@ render_to_texture_async_params render_to_texture_async_params; - - @@ -753,6 +751,7 @@ compile_shader_pair_async_params compile_shader_pair_async_params; + draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index f166916c5..8cd682b99 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -687,8 +687,6 @@ type_render_to_texture_async_params, - - @@ -753,6 +751,7 @@ type_compile_shader_pair_async_params, + type_draw_lod_async_params, diff --git a/jesse.make.sh b/jesse.make.sh index 107bda523..2c5e1e7dc 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,8 +11,8 @@ ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ - BuildExecutables \ - BuildSingleExample examples/project_and_level_picker \ + # BuildExecutables \ + # BuildSingleExample examples/project_and_level_picker \ # BuildTests \ # BuildSingleExample examples/ui_test \ # BuildSingleExample examples/blank_project \ diff --git a/src/engine/mesh.h b/src/engine/mesh.h index 7d49a166b..b2e0c77db 100644 --- a/src/engine/mesh.h +++ b/src/engine/mesh.h @@ -52,13 +52,6 @@ TryGetTierForSize(tiered_mesh_freelist *TieredFreelist, u32 Size) return Result; } -link_internal void -MarkBufferForGrowth(untextured_2d_geometry_buffer *Dest, umm Grow) -{ - NotImplemented; -} - - poof( func grow_buffer(buffer_t) { From ea6a4bc33c4762165d1022cdf6c924045f85ffe5 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 2 Oct 2025 13:06:50 -0700 Subject: [PATCH 339/421] Update stdlib --- assets/white.bmp | Bin 0 -> 786486 bytes external/bonsai_stdlib | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- generated/block_array_bitmap_688853862.h | 2 +- generated/d_union_ui_render_command.h | 2 +- generated/for_datatypes_kh9dwrCf.h | 12 ++++++------ jesse.make.sh | 2 +- white.bmp | Bin 326 -> 1048630 bytes 8 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 assets/white.bmp diff --git a/assets/white.bmp b/assets/white.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8ae7e99658ae5b77d6f6620eda9dbc647363ebef GIT binary patch literal 786486 zcmeIuu?>JQ5CcF%ODZZxV1f)l&;H{;o=iZ0mMq!rU3X7QrH`I9*4ZUTy^)rE%h&mn zM+gugK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0zU;_ D!(+7H literal 0 HcmV?d00001 diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 6a44a54dc..ef6e26ae4 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 6a44a54dc632c09d605dcc9444c36380e61b2052 +Subproject commit ef6e26ae43d46a1b917ec56b8b12f62c0b07abee diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index ae1b3a3c4..0db0e615a 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3510:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3514:0 if (Input->Dot.Clicked) { diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index ce8f65b37..5240da973 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/bitmap.cpp:182:0 +// external/bonsai_stdlib/src/bitmap.cpp:189:0 diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 4ea11a11d..d728bee5c 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:878:0 +// external/bonsai_stdlib/src/ui/ui.h:877:0 enum ui_render_command_type { diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index ae682b349..1318330b5 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -399,6 +399,12 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_modification_mode * + + + + + + @@ -741,12 +747,6 @@ PushToolbar( renderer_2d *Ui, - - - - - - diff --git a/jesse.make.sh b/jesse.make.sh index 2c5e1e7dc..c4b277014 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -11,7 +11,7 @@ ./make.sh $OPT \ BuildSingleExample examples/terrain_gen \ - # BuildExecutables \ + BuildExecutables \ # BuildSingleExample examples/project_and_level_picker \ # BuildTests \ # BuildSingleExample examples/ui_test \ diff --git a/white.bmp b/white.bmp index 73bd55fc25d8bbf159c56357226895417842ff8f..763be1f7e9ecbb0bd980b9ddb31c9a58fe661ea8 100644 GIT binary patch literal 1048630 zcmeIuu?>JQ5CcF%OA|2xB@<)-diEa&@?-?svt-F`@49W#GQTfWYp zJVJl~0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U_$lxL DT2Jt^ literal 326 scmZ?rbz@`z12-UP0mK|o%*dd?zzmWB$_sNtFo+8R|4|8s|05g#08!Zk(f|Me From 5ea13df3c86e027afee5f8aa59a3be8f909080f6 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 4 Oct 2025 09:44:56 -0700 Subject: [PATCH 340/421] Use updated gpu_element_buffer_handles --- external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/are_equal_ui_toggle.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 78 +++---------- ...r_ui_for_compound_type_render_buffers_2d.h | 103 +----------------- generated/for_datatypes_0XxWqGSZ.h | 2 + generated/for_datatypes_Bxw4Q7AW.h | 2 + generated/for_datatypes_fkubhsYl.h | 2 + generated/for_datatypes_kh9dwrCf.h | 12 ++ generated/for_datatypes_kv3WBTai.h | 2 + generated/hashtable_struct_ui_toggle.h | 2 +- generated/hashtable_struct_window_layout.h | 2 +- generated/maybe_ui_toggle.h | 2 +- generated/maybe_ui_toggle_ptr.h | 2 +- generated/maybe_window_layout.h | 2 +- generated/maybe_window_layout_ptr.h | 2 +- .../take_release_sync_lod_element_buffer.h | 6 +- jesse.make.sh | 2 +- src/engine/gpu_mapped_buffer.cpp | 46 ++++---- src/engine/mesh.cpp | 8 +- src/engine/render.cpp | 20 ++-- src/engine/render_command.cpp | 2 +- src/engine/world_chunk.h | 8 +- 25 files changed, 95 insertions(+), 220 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index ef6e26ae4..ce4b56cd6 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit ef6e26ae43d46a1b917ec56b8b12f62c0b07abee +Subproject commit ce4b56cd6cbd1dd872394bf7f3ff73411aed89bc diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 0b6b008c0..fd8e5a8d9 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2488:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2491:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 0db0e615a..2d5737cb0 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3514:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3515:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 20af8e212..c18384abb 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2441:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2444:0 case type_ui_render_command_window_start: { diff --git a/generated/are_equal_ui_toggle.h b/generated/are_equal_ui_toggle.h index 8e73588da..6af818dfc 100644 --- a/generated/are_equal_ui_toggle.h +++ b/generated/are_equal_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:157:0 +// external/bonsai_stdlib/src/ui/ui.h:154:0 link_internal b32 AreEqual(ui_toggle *Thing1, ui_toggle *Thing2) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 96b705b9c..20dbe17e5 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -33,68 +33,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E - cs MemberName = CSz("VertexHandle"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->VertexHandle), - MemberName, - Params - ); - - - - - - - - - PushNewRow(Ui); - - } - - - { - - - - cs MemberName = CSz("NormalHandle"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->NormalHandle), - MemberName, - Params - ); - - - - - - - - - PushNewRow(Ui); - - } - - - { - - - - cs MemberName = CSz("MatHandle"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->MatHandle), - MemberName, - Params - ); - - - - + cs MemberName = CSz("Handles"); + + + if (ToggleButton(Ui, CSz("v Handles[3]"), CSz("> Handles[3]"), UiId(Window, "toggle gpu_element_buffer_handles u32 Handles", Element->Handles), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 3) + { + DoEditorUi(Ui, Window, Element->Handles+ArrayIndex, FSz("Handles[%d]", ArrayIndex), Params); + + PushNewRow(Ui); + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 4b60d418a..00a1056f9 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -29,81 +29,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - { - - - - cs MemberName = CSz("SolidUIVertexBuffer"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->SolidUIVertexBuffer), - MemberName, - Params - ); - - - - - - - - - PushNewRow(Ui); - - } - - - { - - - - cs MemberName = CSz("SolidUIUVBuffer"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->SolidUIUVBuffer), - MemberName, - Params - ); - - - - - - - - - PushNewRow(Ui); - - } - - - { - - - - cs MemberName = CSz("SolidUIColorBuffer"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->SolidUIColorBuffer), - MemberName, - Params - ); - - - - - - - - - PushNewRow(Ui); - - } - - { @@ -181,35 +106,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - cs MemberName = CSz("SolidUIShader"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->SolidUIShader), - MemberName, - Params - ); - - - - - - - - - - } - - - { - - - - cs MemberName = CSz("Geo"); + cs MemberName = CSz("Buf"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(ui_geometry_buffer*, &Element->Geo), + Cast(gpu_mapped_ui_buffer*, &Element->Buf), MemberName, Params ); diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 3ceeed8dc..848c8a70c 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -225,6 +225,8 @@ + + diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 669ec9083..37382952b 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -299,6 +299,8 @@ + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 09d0f5479..84718fedd 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -225,6 +225,8 @@ + + diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 1318330b5..cb2d11f43 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1375,6 +1375,18 @@ PushToolbar( renderer_2d *Ui, + + + + + + + + + + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 8cd682b99..408522edd 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -225,6 +225,8 @@ + + diff --git a/generated/hashtable_struct_ui_toggle.h b/generated/hashtable_struct_ui_toggle.h index b67d0185f..5980afba8 100644 --- a/generated/hashtable_struct_ui_toggle.h +++ b/generated/hashtable_struct_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:253:0 +// external/bonsai_stdlib/src/ui/ui.h:250:0 struct ui_toggle_linked_list_node { diff --git a/generated/hashtable_struct_window_layout.h b/generated/hashtable_struct_window_layout.h index 36e24976b..8eb12ade6 100644 --- a/generated/hashtable_struct_window_layout.h +++ b/generated/hashtable_struct_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:146:0 +// external/bonsai_stdlib/src/ui/ui.h:143:0 struct window_layout_linked_list_node { diff --git a/generated/maybe_ui_toggle.h b/generated/maybe_ui_toggle.h index 00193f02b..87349d85a 100644 --- a/generated/maybe_ui_toggle.h +++ b/generated/maybe_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:247:0 +// external/bonsai_stdlib/src/ui/ui.h:244:0 struct maybe_ui_toggle { diff --git a/generated/maybe_ui_toggle_ptr.h b/generated/maybe_ui_toggle_ptr.h index 022440e6e..e332aff4d 100644 --- a/generated/maybe_ui_toggle_ptr.h +++ b/generated/maybe_ui_toggle_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:250:0 +// external/bonsai_stdlib/src/ui/ui.h:247:0 struct maybe_ui_toggle_ptr { diff --git a/generated/maybe_window_layout.h b/generated/maybe_window_layout.h index 00545c037..d5d86658e 100644 --- a/generated/maybe_window_layout.h +++ b/generated/maybe_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:140:0 +// external/bonsai_stdlib/src/ui/ui.h:137:0 struct maybe_window_layout { diff --git a/generated/maybe_window_layout_ptr.h b/generated/maybe_window_layout_ptr.h index 93f048b73..48095e444 100644 --- a/generated/maybe_window_layout_ptr.h +++ b/generated/maybe_window_layout_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:143:0 +// external/bonsai_stdlib/src/ui/ui.h:140:0 struct maybe_window_layout_ptr { diff --git a/generated/take_release_sync_lod_element_buffer.h b/generated/take_release_sync_lod_element_buffer.h index 81cfbbf0b..f24077e0c 100644 --- a/generated/take_release_sync_lod_element_buffer.h +++ b/generated/take_release_sync_lod_element_buffer.h @@ -80,7 +80,7 @@ DeallocateMeshes(lod_element_buffer *Buf, tiered_mesh_freelist* MeshFreelist) link_internal b32 HasGpuMesh(lod_element_buffer *Buf, world_chunk_mesh_bitfield MeshBit) { - b32 Result = (Buf->GpuBufferHandles[ToIndex(MeshBit)].VertexHandle != 0); + b32 Result = (Buf->GpuBufferHandles[ToIndex(MeshBit)].Handles[mesh_VertexHandle] != 0); return Result; } @@ -91,7 +91,7 @@ HasGpuMesh(lod_element_buffer *Buf) b32 Result = False; RangeIterator(MeshIndex, MeshIndex_Count) { - Result |= (Buf->GpuBufferHandles[MeshIndex].VertexHandle != 0); + Result |= (Buf->GpuBufferHandles[MeshIndex].Handles[mesh_VertexHandle] != 0); } return Result; } @@ -110,7 +110,7 @@ HasCpuMesh(lod_element_buffer *Buf) link_internal b32 HasMesh(lod_element_buffer *Buf, world_chunk_mesh_bitfield MeshBit) { - b32 Result = (Buf->E[ToIndex(MeshBit)] != 0); + b32 Result = (Buf->GpuBufferHandles[ToIndex(MeshBit)].Handles[0] != 0); return Result; } diff --git a/jesse.make.sh b/jesse.make.sh index c4b277014..687048d17 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/gpu_mapped_buffer.cpp b/src/engine/gpu_mapped_buffer.cpp index 9c7ac85ad..845e7db7d 100644 --- a/src/engine/gpu_mapped_buffer.cpp +++ b/src/engine/gpu_mapped_buffer.cpp @@ -28,12 +28,12 @@ FlushBuffersToCard(gpu_mapped_element_buffer *Buffer) case DataType_v3: { - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); GetGL()->VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); BufferUnmapped = GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); GetGL()->VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); BufferUnmapped &= GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; @@ -41,12 +41,12 @@ FlushBuffersToCard(gpu_mapped_element_buffer *Buffer) case DataType_v3_u8: { - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); GetGL()->VertexAttribIPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, 0, (void*)0); BufferUnmapped = GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); GetGL()->VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); BufferUnmapped &= GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); AssertNoGlErrors; @@ -59,7 +59,7 @@ FlushBuffersToCard(gpu_mapped_element_buffer *Buffer) const u32 MtlFloatElements = sizeof(matl)/sizeof(u8); CAssert(MtlFloatElements == 4); - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_MatHandle]); GetGL()->VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf( ColorIndex, matl)) ); GetGL()->VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof BufferUnmapped &= GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); @@ -78,9 +78,9 @@ AllocateGpuElementBuffer(gpu_element_buffer_handles *Handles, data_type Type, u3 u32 matlSize = sizeof(matl)*ElementCount; - Assert(Handles->VertexHandle == 0); - Assert(Handles->NormalHandle == 0); - Assert(Handles->MatHandle == 0); + Assert(Handles->Handles[mesh_VertexHandle] == 0); + Assert(Handles->Handles[mesh_NormalHandle] == 0); + Assert(Handles->Handles[mesh_MatHandle] == 0); Handles->ElementType = Type; Handles->ElementCount = ElementCount; @@ -92,18 +92,18 @@ AllocateGpuElementBuffer(gpu_element_buffer_handles *Handles, data_type Type, u3 case DataType_v3: { u32 v3Size = sizeof(v3)*ElementCount; - GetGL()->GenBuffers(3, &Handles->VertexHandle); + GetGL()->GenBuffers(3, &Handles->Handles[mesh_VertexHandle]); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); GetGL()->BufferData(GL_ARRAY_BUFFER, v3Size, 0, GL_STATIC_DRAW); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); GetGL()->BufferData(GL_ARRAY_BUFFER, v3Size, 0, GL_STATIC_DRAW); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_MatHandle]); GetGL()->BufferData(GL_ARRAY_BUFFER, matlSize, 0, GL_STATIC_DRAW); AssertNoGlErrors; @@ -112,18 +112,18 @@ AllocateGpuElementBuffer(gpu_element_buffer_handles *Handles, data_type Type, u3 case DataType_v3_u8: { u32 v3u8Size = sizeof(v3_u8)*ElementCount; - GetGL()->GenBuffers(3, &Handles->VertexHandle); + GetGL()->GenBuffers(3, &Handles->Handles[mesh_VertexHandle]); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); GetGL()->BufferData(GL_ARRAY_BUFFER, v3u8Size, 0, GL_STATIC_DRAW); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); GetGL()->BufferData(GL_ARRAY_BUFFER, v3u8Size, 0, GL_STATIC_DRAW); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_MatHandle]); GetGL()->BufferData(GL_ARRAY_BUFFER, matlSize, 0, GL_STATIC_DRAW); AssertNoGlErrors; @@ -144,7 +144,7 @@ AllocateGpuElementBuffer(gpu_mapped_element_buffer *GpuMap, data_type Type, u32 link_internal void DeallocateGpuElementBuffer(gpu_element_buffer_handles *Handles) { - GetGL()->DeleteBuffers(3, &Handles->VertexHandle); + GetGL()->DeleteBuffers(3, &Handles->Handles[mesh_VertexHandle]); Clear(Handles); } @@ -178,18 +178,18 @@ MapGpuBuffer_untextured_3d_geometry_buffer(gpu_element_buffer_handles *Handles) { u32 BufferSize = sizeof(v3)*Handles->ElementCount; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); AssertNoGlErrors; Buffer.Verts = (v3*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); AssertNoGlErrors; Buffer.Normals = (v3*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; // Color data - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_MatHandle]); AssertNoGlErrors; Buffer.Mat = (matl*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, MaterialBufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; @@ -200,18 +200,18 @@ MapGpuBuffer_untextured_3d_geometry_buffer(gpu_element_buffer_handles *Handles) { u32 BufferSize = sizeof(v3_u8)*Handles->ElementCount; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); AssertNoGlErrors; Buffer.Verts = (v3_u8*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); AssertNoGlErrors; Buffer.Normals = (v3_u8*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; // Color data - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_MatHandle]); AssertNoGlErrors; Buffer.Mat = (matl*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, MaterialBufferSize, GL_MAP_WRITE_BIT); AssertNoGlErrors; diff --git a/src/engine/mesh.cpp b/src/engine/mesh.cpp index b8136b838..c3a904a6d 100644 --- a/src/engine/mesh.cpp +++ b/src/engine/mesh.cpp @@ -200,7 +200,7 @@ poof( link_internal b32 HasGpuMesh((container_t.name) *Buf, world_chunk_mesh_bitfield MeshBit) { - b32 Result = (Buf->GpuBufferHandles[ToIndex(MeshBit)].VertexHandle != 0); + b32 Result = (Buf->GpuBufferHandles[ToIndex(MeshBit)].Handles[mesh_VertexHandle] != 0); return Result; } @@ -211,7 +211,7 @@ poof( b32 Result = False; RangeIterator(MeshIndex, MeshIndex_Count) { - Result |= (Buf->GpuBufferHandles[MeshIndex].VertexHandle != 0); + Result |= (Buf->GpuBufferHandles[MeshIndex].Handles[mesh_VertexHandle] != 0); } return Result; } @@ -230,7 +230,7 @@ poof( link_internal b32 HasMesh((container_t.name) *Buf, world_chunk_mesh_bitfield MeshBit) { - b32 Result = (Buf->E[ToIndex(MeshBit)] != 0); + b32 Result = (Buf->GpuBufferHandles[ToIndex(MeshBit)].Handles[0] != 0); return Result; } } @@ -246,7 +246,7 @@ poof(threadsafe_mesh_container(lod_element_buffer, untextured_3d_geometry_buffer link_internal b32 HasGpuMesh(gpu_mapped_element_buffer *Buf) { - b32 Result = (Buf->Handles.VertexHandle != 0); + b32 Result = (Buf->Handles.Handles[0] != 0); return Result; } diff --git a/src/engine/render.cpp b/src/engine/render.cpp index a63665986..becda4b5b 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -840,11 +840,11 @@ SetupVertexAttribsFor_world_chunk_element_buffer(gpu_element_buffer_handles *Han GetGL()->EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); GetGL()->VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, GL_FALSE, 0, (void*)0); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); GetGL()->VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); AssertNoGlErrors; @@ -854,7 +854,7 @@ SetupVertexAttribsFor_world_chunk_element_buffer(gpu_element_buffer_handles *Han const u32 MtlFloatElements = sizeof(matl)/sizeof(u8); CAssert(MtlFloatElements == 4); - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_MatHandle]); /* GetGL()->VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_UNSIGNED_INT, 0, 0); */ GetGL()->VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf(ColorIndex, matl))); GetGL()->VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof @@ -877,22 +877,22 @@ SetupVertexAttribsFor_u3d_geo_element_buffer(gpu_element_buffer_handles *Handles InvalidCase(DataType_Undefinded); case DataType_v3: { - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); GetGL()->VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); GetGL()->VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); AssertNoGlErrors; } break; case DataType_v3_u8: { - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->VertexHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); GetGL()->VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, GL_FALSE, 0, (void*)0); AssertNoGlErrors; - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->NormalHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); GetGL()->VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); AssertNoGlErrors; } break; @@ -904,7 +904,7 @@ SetupVertexAttribsFor_u3d_geo_element_buffer(gpu_element_buffer_handles *Handles const u32 MtlFloatElements = sizeof(matl)/sizeof(u8); CAssert(MtlFloatElements == 4); - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->MatHandle); + GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_MatHandle]); /* GetGL()->VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_UNSIGNED_INT, 0, 0); */ GetGL()->VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf(ColorIndex, matl))); GetGL()->VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof @@ -1034,9 +1034,9 @@ poof(gpu_buffer(lod_element_buffer, untextured_3d_geometry_buffer)) link_internal void ReallocateGpuBuffers(gpu_element_buffer_handles *Handles, data_type Type, u32 ElementCount) { - if (Handles->VertexHandle) + if (Handles->Handles[mesh_VertexHandle]) { - GetGL()->DeleteBuffers(3, &Handles->VertexHandle); + GetGL()->DeleteBuffers(3, &Handles->Handles[mesh_VertexHandle]); } Clear(Handles); diff --git a/src/engine/render_command.cpp b/src/engine/render_command.cpp index 6aa384edc..705317212 100644 --- a/src/engine/render_command.cpp +++ b/src/engine/render_command.cpp @@ -31,7 +31,7 @@ link_internal void PushDeallocateBuffersCommand(work_queue *RenderQueue, gpu_element_buffer_handles *Handles) { // @vertex_handle_primal - if (Handles->VertexHandle) { PushBonsaiRenderCommandDeallocateBuffers(RenderQueue, &Handles->VertexHandle, 3); } + if (Handles->Handles[mesh_VertexHandle]) { PushBonsaiRenderCommandDeallocateBuffers(RenderQueue, &Handles->Handles[mesh_VertexHandle], 3); } Clear(Handles); } diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index b7e79752a..d28a006c1 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -556,14 +556,14 @@ BufferWorld(platform* Plat, untextured_3d_geometry_buffer*, untextured_3d_geomet link_internal untextured_3d_geometry_buffer* GetMeshForChunk(mesh_freelist* Freelist, u32 Mesh, memory_arena* PermMemory); -link_internal untextured_3d_geometry_buffer * -ReplaceMesh(lod_element_buffer *, world_chunk_mesh_bitfield , untextured_3d_geometry_buffer *, u64 ); +/* link_internal untextured_3d_geometry_buffer * */ +/* ReplaceMesh(lod_element_buffer *, world_chunk_mesh_bitfield , untextured_3d_geometry_buffer *, u64 ); */ /* link_internal untextured_3d_geometry_buffer * */ /* ReplaceMesh(threadsafe_geometry_buffer *, world_chunk_mesh_bitfield , untextured_3d_geometry_buffer *, u64 ); */ -link_internal untextured_3d_geometry_buffer * -AtomicReplaceMesh(lod_element_buffer *, world_chunk_mesh_bitfield , untextured_3d_geometry_buffer *, u64 ); +/* link_internal untextured_3d_geometry_buffer * */ +/* AtomicReplaceMesh(lod_element_buffer *, world_chunk_mesh_bitfield , untextured_3d_geometry_buffer *, u64 ); */ /* link_internal untextured_3d_geometry_buffer * */ /* AtomicReplaceMesh(threadsafe_geometry_buffer *, world_chunk_mesh_bitfield , untextured_3d_geometry_buffer *, u64 ); */ From 231205716003a088de1375e1794343f44611cf7a Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 11 Oct 2025 10:20:29 -0700 Subject: [PATCH 341/421] UI back to baseline functional state --- external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/are_equal_ui_toggle.h | 2 +- generated/buffer_ui_toggle_button_handle.h | 2 +- generated/d_union_ui_render_command.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 4 +- ..._editor_ui_for_compound_type_renderer_2d.h | 170 +++++------- generated/for_datatypes_kh9dwrCf.h | 6 + ...htable_get_ptr_ui_toggle_31501_688856534.h | 2 +- ...et_ptr_window_layout_705671517_599498827.h | 2 +- .../hashtable_get_ui_toggle_31501_688856534.h | 2 +- ...le_get_window_layout_705671517_599498827.h | 2 +- generated/hashtable_impl_ui_toggle.h | 2 +- generated/hashtable_impl_window_layout.h | 2 +- generated/hashtable_struct_ui_toggle.h | 2 +- generated/hashtable_struct_window_layout.h | 2 +- generated/maybe_ui_toggle.h | 2 +- generated/maybe_ui_toggle_ptr.h | 2 +- generated/maybe_window_layout.h | 2 +- generated/maybe_window_layout_ptr.h | 2 +- .../shader_magic_textured_quad_render_pass.h | 2 +- jesse.bonsai.rdbg | Bin 17281 -> 16929 bytes jesse.make.sh | 2 +- shaders/cosine_interp_vis.fragmentshader | 3 +- src/engine/engine.cpp | 1 - src/engine/gpu_mapped_buffer.cpp | 247 ------------------ src/engine/render.cpp | 12 +- src/engine/render.h | 6 - src/engine/render_loop.cpp | 25 +- 31 files changed, 123 insertions(+), 393 deletions(-) delete mode 100644 src/engine/gpu_mapped_buffer.cpp diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index ce4b56cd6..d7b636b52 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit ce4b56cd6cbd1dd872394bf7f3ff73411aed89bc +Subproject commit d7b636b52671cb780489a41731bd6644d9eeb291 diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index fd8e5a8d9..9705aeb13 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2491:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2507:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 2d5737cb0..587ef7f4e 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3515:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3604:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index c18384abb..705d1d0e9 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2444:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2460:0 case type_ui_render_command_window_start: { diff --git a/generated/are_equal_ui_toggle.h b/generated/are_equal_ui_toggle.h index 6af818dfc..53e555df1 100644 --- a/generated/are_equal_ui_toggle.h +++ b/generated/are_equal_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:154:0 +// external/bonsai_stdlib/src/ui/ui.h:151:0 link_internal b32 AreEqual(ui_toggle *Thing1, ui_toggle *Thing2) diff --git a/generated/buffer_ui_toggle_button_handle.h b/generated/buffer_ui_toggle_button_handle.h index 6b8cdda4c..b7187f560 100644 --- a/generated/buffer_ui_toggle_button_handle.h +++ b/generated/buffer_ui_toggle_button_handle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:7:0 +// external/bonsai_stdlib/src/ui/ui.cpp:16:0 struct ui_toggle_button_handle_buffer { diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index d728bee5c..ffa132869 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:877:0 +// external/bonsai_stdlib/src/ui/ui.h:872:0 enum ui_render_command_type { diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 00a1056f9..59109f24e 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -82,11 +82,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c - cs MemberName = CSz("Text2DShader"); + cs MemberName = CSz("UiShader"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(shader*, &Element->Text2DShader), + Cast(shader*, &Element->UiShader), MemberName, Params ); diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index decba2055..e03985e5b 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -50,6 +50,78 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + } + + + { + + + + cs MemberName = CSz("SolidQuadGeometryBuffer"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(gpu_mapped_ui_buffer*, &Element->SolidQuadGeometryBuffer), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("TexturedQuadRenderPass"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(textured_quad_render_pass*, &Element->TexturedQuadRenderPass), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("CustomQuadGeometryBuffer"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(gpu_mapped_ui_buffer*, &Element->CustomQuadGeometryBuffer), + MemberName, + Params + ); + + + + + + + + + } @@ -413,54 +485,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - - - { - - - - cs MemberName = CSz("Geo"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(ui_geometry_buffer*, &Element->Geo), - MemberName, - Params - ); - - - - - - - - - - } - - - { - - - - cs MemberName = CSz("TexturedQuadRenderPass"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(textured_quad_render_pass*, &Element->TexturedQuadRenderPass), - MemberName, - Params - ); - - - - - - - - - } @@ -585,56 +609,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - - - { - - - - cs MemberName = CSz("SolidGeoCountLastFrame"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->SolidGeoCountLastFrame), - MemberName, - Params - ); - - - - - - - - - PushNewRow(Ui); - - } - - - { - - - - cs MemberName = CSz("TextGeoCountLastFrame"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->TextGeoCountLastFrame), - MemberName, - Params - ); - - - - - - - - - PushNewRow(Ui); - } diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index cb2d11f43..19214e9c1 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -96,6 +96,12 @@ + + + + + + diff --git a/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h b/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h index ade7a6db9..376f68328 100644 --- a/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h +++ b/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:16:0 +// external/bonsai_stdlib/src/ui/ui.cpp:25:0 maybe_ui_toggle_ptr GetPtrById( ui_toggle_hashtable *Table, ui_id Query ) diff --git a/generated/hashtable_get_ptr_window_layout_705671517_599498827.h b/generated/hashtable_get_ptr_window_layout_705671517_599498827.h index 7744e96f5..a7637f0f6 100644 --- a/generated/hashtable_get_ptr_window_layout_705671517_599498827.h +++ b/generated/hashtable_get_ptr_window_layout_705671517_599498827.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:25:0 +// external/bonsai_stdlib/src/ui/ui.cpp:34:0 maybe_window_layout_ptr GetPtrByHashtableKey( window_layout_hashtable *Table, ui_id Query ) diff --git a/generated/hashtable_get_ui_toggle_31501_688856534.h b/generated/hashtable_get_ui_toggle_31501_688856534.h index c1ea843bc..bc5a2eac1 100644 --- a/generated/hashtable_get_ui_toggle_31501_688856534.h +++ b/generated/hashtable_get_ui_toggle_31501_688856534.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:13:0 +// external/bonsai_stdlib/src/ui/ui.cpp:22:0 ui_toggle_linked_list_node* GetBucketById( ui_toggle_hashtable *Table, ui_id Query ) diff --git a/generated/hashtable_get_window_layout_705671517_599498827.h b/generated/hashtable_get_window_layout_705671517_599498827.h index 3991999da..c537f2c16 100644 --- a/generated/hashtable_get_window_layout_705671517_599498827.h +++ b/generated/hashtable_get_window_layout_705671517_599498827.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:23:0 +// external/bonsai_stdlib/src/ui/ui.cpp:32:0 window_layout_linked_list_node* GetBucketByHashtableKey( window_layout_hashtable *Table, ui_id Query ) diff --git a/generated/hashtable_impl_ui_toggle.h b/generated/hashtable_impl_ui_toggle.h index 078dea688..2da6739d4 100644 --- a/generated/hashtable_impl_ui_toggle.h +++ b/generated/hashtable_impl_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:10:0 +// external/bonsai_stdlib/src/ui/ui.cpp:19:0 link_internal b32 AreEqual(ui_toggle_linked_list_node *Node1, ui_toggle_linked_list_node *Node2 ); diff --git a/generated/hashtable_impl_window_layout.h b/generated/hashtable_impl_window_layout.h index 7fc80f769..555f89c53 100644 --- a/generated/hashtable_impl_window_layout.h +++ b/generated/hashtable_impl_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:20:0 +// external/bonsai_stdlib/src/ui/ui.cpp:29:0 link_internal b32 AreEqual(window_layout_linked_list_node *Node1, window_layout_linked_list_node *Node2 ); diff --git a/generated/hashtable_struct_ui_toggle.h b/generated/hashtable_struct_ui_toggle.h index 5980afba8..ba997ef41 100644 --- a/generated/hashtable_struct_ui_toggle.h +++ b/generated/hashtable_struct_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:250:0 +// external/bonsai_stdlib/src/ui/ui.h:247:0 struct ui_toggle_linked_list_node { diff --git a/generated/hashtable_struct_window_layout.h b/generated/hashtable_struct_window_layout.h index 8eb12ade6..1906e25e8 100644 --- a/generated/hashtable_struct_window_layout.h +++ b/generated/hashtable_struct_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:143:0 +// external/bonsai_stdlib/src/ui/ui.h:140:0 struct window_layout_linked_list_node { diff --git a/generated/maybe_ui_toggle.h b/generated/maybe_ui_toggle.h index 87349d85a..bb52ed5eb 100644 --- a/generated/maybe_ui_toggle.h +++ b/generated/maybe_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:244:0 +// external/bonsai_stdlib/src/ui/ui.h:241:0 struct maybe_ui_toggle { diff --git a/generated/maybe_ui_toggle_ptr.h b/generated/maybe_ui_toggle_ptr.h index e332aff4d..e59f6ef1a 100644 --- a/generated/maybe_ui_toggle_ptr.h +++ b/generated/maybe_ui_toggle_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:247:0 +// external/bonsai_stdlib/src/ui/ui.h:244:0 struct maybe_ui_toggle_ptr { diff --git a/generated/maybe_window_layout.h b/generated/maybe_window_layout.h index d5d86658e..03d6bb456 100644 --- a/generated/maybe_window_layout.h +++ b/generated/maybe_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:137:0 +// external/bonsai_stdlib/src/ui/ui.h:134:0 struct maybe_window_layout { diff --git a/generated/maybe_window_layout_ptr.h b/generated/maybe_window_layout_ptr.h index 48095e444..831cb5f81 100644 --- a/generated/maybe_window_layout_ptr.h +++ b/generated/maybe_window_layout_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:140:0 +// external/bonsai_stdlib/src/ui/ui.h:137:0 struct maybe_window_layout_ptr { diff --git a/generated/shader_magic_textured_quad_render_pass.h b/generated/shader_magic_textured_quad_render_pass.h index 22da7841f..3b919bd38 100644 --- a/generated/shader_magic_textured_quad_render_pass.h +++ b/generated/shader_magic_textured_quad_render_pass.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:1:0 +// external/bonsai_stdlib/src/ui/ui.cpp:10:0 link_internal void InitializeTexturedQuadRenderPass( textured_quad_render_pass *Struct diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index ca0d9335583812e5aa0c8718939a982da1e5a8a2..9d6b2b64d1cba24dc62949ef979d2717d68fe9e4 100644 GIT binary patch delta 2480 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 // NOTE(Jesse): Functions acting as basis for ser/des #include -#include #include #include #include diff --git a/src/engine/gpu_mapped_buffer.cpp b/src/engine/gpu_mapped_buffer.cpp deleted file mode 100644 index 845e7db7d..000000000 --- a/src/engine/gpu_mapped_buffer.cpp +++ /dev/null @@ -1,247 +0,0 @@ - -// NOTE(Jesse): This hooks up the vertex attribs because in some cases -// (immediate geo buffer) we flush and draw immediately afterwards. -// -// Should probably move to using VAOs so we don't have to do this. -// -link_inline b32 -FlushBuffersToCard(gpu_mapped_element_buffer *Buffer) -{ - TIMED_FUNCTION(); - gpu_element_buffer_handles* Handles = &Buffer->Handles; - Assert(Handles->Mapped == True); - Handles->Mapped = False; - - AssertNoGlErrors; - - GetGL()->EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); - GetGL()->EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); - GetGL()->EnableVertexAttribArray(VERTEX_COLOR_LAYOUT_LOCATION); - GetGL()->EnableVertexAttribArray(VERTEX_TRANS_EMISS_LAYOUT_LOCATION); - - AssertNoGlErrors; - - u32 BufferUnmapped = 0; - switch (Handles->ElementType) - { - InvalidCase(DataType_Undefinded); - - case DataType_v3: - { - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); - GetGL()->VertexAttribPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); - BufferUnmapped = GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); - AssertNoGlErrors; - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); - GetGL()->VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); - BufferUnmapped &= GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); - AssertNoGlErrors; - } break; - - case DataType_v3_u8: - { - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); - GetGL()->VertexAttribIPointer(VERTEX_POSITION_LAYOUT_LOCATION, 3, GL_BYTE, 0, (void*)0); - BufferUnmapped = GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); - AssertNoGlErrors; - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); - GetGL()->VertexAttribPointer(VERTEX_NORMAL_LAYOUT_LOCATION, 3, GL_BYTE, GL_TRUE, 0, (void*)0); - BufferUnmapped &= GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); - AssertNoGlErrors; - - } break; - } - - // NOTE(Jesse): This is just here to break when the size of these changes, - // serving as a reminder to update this code. - const u32 MtlFloatElements = sizeof(matl)/sizeof(u8); - CAssert(MtlFloatElements == 4); - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_MatHandle]); - GetGL()->VertexAttribIPointer(VERTEX_COLOR_LAYOUT_LOCATION, 1, GL_SHORT, sizeof(matl), Cast(void*, OffsetOf( ColorIndex, matl)) ); - GetGL()->VertexAttribIPointer(VERTEX_TRANS_EMISS_LAYOUT_LOCATION, 2, GL_BYTE, sizeof(matl), Cast(void*, OffsetOf(Transparency, matl)) ); // @vertex_attrib_I_pointer_transparency_offsetof - BufferUnmapped &= GetGL()->UnmapBuffer(GL_ARRAY_BUFFER); - AssertNoGlErrors; - - if (BufferUnmapped == False) { Error("glUnmapBuffer Failed"); } - return BufferUnmapped; -} - -link_internal void -AllocateGpuElementBuffer(gpu_element_buffer_handles *Handles, data_type Type, u32 ElementCount) -{ - Assert(ElementCount); - Assert(Handles->Mapped == False); - Assert(Handles->ElementType == DataType_Undefinded); - - u32 matlSize = sizeof(matl)*ElementCount; - - Assert(Handles->Handles[mesh_VertexHandle] == 0); - Assert(Handles->Handles[mesh_NormalHandle] == 0); - Assert(Handles->Handles[mesh_MatHandle] == 0); - - Handles->ElementType = Type; - Handles->ElementCount = ElementCount; - - switch (Type) - { - InvalidCase(DataType_Undefinded); - - case DataType_v3: - { - u32 v3Size = sizeof(v3)*ElementCount; - GetGL()->GenBuffers(3, &Handles->Handles[mesh_VertexHandle]); - AssertNoGlErrors; - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); - GetGL()->BufferData(GL_ARRAY_BUFFER, v3Size, 0, GL_STATIC_DRAW); - AssertNoGlErrors; - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); - GetGL()->BufferData(GL_ARRAY_BUFFER, v3Size, 0, GL_STATIC_DRAW); - AssertNoGlErrors; - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_MatHandle]); - GetGL()->BufferData(GL_ARRAY_BUFFER, matlSize, 0, GL_STATIC_DRAW); - AssertNoGlErrors; - - } break; - - case DataType_v3_u8: - { - u32 v3u8Size = sizeof(v3_u8)*ElementCount; - GetGL()->GenBuffers(3, &Handles->Handles[mesh_VertexHandle]); - AssertNoGlErrors; - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); - GetGL()->BufferData(GL_ARRAY_BUFFER, v3u8Size, 0, GL_STATIC_DRAW); - AssertNoGlErrors; - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); - GetGL()->BufferData(GL_ARRAY_BUFFER, v3u8Size, 0, GL_STATIC_DRAW); - AssertNoGlErrors; - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_MatHandle]); - GetGL()->BufferData(GL_ARRAY_BUFFER, matlSize, 0, GL_STATIC_DRAW); - AssertNoGlErrors; - - } break; - } - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, 0); - AssertNoGlErrors; -} - -link_internal void -AllocateGpuElementBuffer(gpu_mapped_element_buffer *GpuMap, data_type Type, u32 ElementCount) -{ - AllocateGpuElementBuffer(&GpuMap->Handles, Type, ElementCount); - GpuMap->Buffer.End = ElementCount; -} - -link_internal void -DeallocateGpuElementBuffer(gpu_element_buffer_handles *Handles) -{ - GetGL()->DeleteBuffers(3, &Handles->Handles[mesh_VertexHandle]); - Clear(Handles); -} - -link_internal void -DeallocateGpuElementBuffer(gpu_mapped_element_buffer *Buf) -{ - DeallocateGpuElementBuffer(&Buf->Handles); - Clear(&Buf->Buffer); -} - -link_internal gpu_mapped_untextured_3d_geometry_buffer -MapGpuBuffer_untextured_3d_geometry_buffer(gpu_element_buffer_handles *Handles) -{ - TIMED_FUNCTION(); - AssertNoGlErrors; - - Assert(Handles->Mapped == False); - Handles->Mapped = True; - - untextured_3d_geometry_buffer Buffer = {}; - Buffer.End = Handles->ElementCount; - Buffer.Type = Handles->ElementType; - - u32 MaterialBufferSize = sizeof(matl)*Handles->ElementCount; - - switch (Handles->ElementType) - { - InvalidCase(DataType_Undefinded); - - case DataType_v3: - { - u32 BufferSize = sizeof(v3)*Handles->ElementCount; - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); - AssertNoGlErrors; - Buffer.Verts = (v3*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); - AssertNoGlErrors; - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); - AssertNoGlErrors; - Buffer.Normals = (v3*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); - AssertNoGlErrors; - - // Color data - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_MatHandle]); - AssertNoGlErrors; - Buffer.Mat = (matl*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, MaterialBufferSize, GL_MAP_WRITE_BIT); - AssertNoGlErrors; - - } break; - - case DataType_v3_u8: - { - u32 BufferSize = sizeof(v3_u8)*Handles->ElementCount; - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_VertexHandle]); - AssertNoGlErrors; - Buffer.Verts = (v3_u8*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); - AssertNoGlErrors; - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_NormalHandle]); - AssertNoGlErrors; - Buffer.Normals = (v3_u8*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, BufferSize, GL_MAP_WRITE_BIT); - AssertNoGlErrors; - - // Color data - GetGL()->BindBuffer(GL_ARRAY_BUFFER, Handles->Handles[mesh_MatHandle]); - AssertNoGlErrors; - Buffer.Mat = (matl*) GetGL()->MapBufferRange(GL_ARRAY_BUFFER, 0, MaterialBufferSize, GL_MAP_WRITE_BIT); - AssertNoGlErrors; - - } break; - - } - - if (!Buffer.Verts) { Error("Allocating gpu_mapped_element_buffer::Verts"); } - if (!Buffer.Normals) { Error("Allocating gpu_mapped_element_buffer::Normals"); } - if (!Buffer.Mat) { Error("Allocating gpu_mapped_element_buffer::Mat"); } - - GetGL()->BindBuffer(GL_ARRAY_BUFFER, 0); - - return {*Handles, Buffer}; -} - -link_internal void -MapGpuBuffer_untextured_3d_geometry_buffer(gpu_mapped_element_buffer *GpuMap) -{ - TIMED_FUNCTION(); - - Assert(GpuMap->Buffer.Parent == False); - if (GpuMap->Buffer.BufferNeedsToGrow) - { - GpuMap->Buffer.End += GpuMap->Buffer.BufferNeedsToGrow; - DeallocateGpuElementBuffer(GpuMap); - AllocateGpuElementBuffer(GpuMap, GpuMap->Handles.ElementType, GpuMap->Buffer.End); - GpuMap->Buffer.BufferNeedsToGrow = 0; - } - - GpuMap->Buffer = MapGpuBuffer_untextured_3d_geometry_buffer(&GpuMap->Handles).Buffer; -} diff --git a/src/engine/render.cpp b/src/engine/render.cpp index becda4b5b..ce9029892 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1050,20 +1050,12 @@ ReallocateAndSyncGpuBuffers(gpu_element_buffer_handles *Handles, untextured_3d_g CopyToGpuBuffer(Mesh, Handles); } -#if 0 -link_internal gpu_element_buffer_handles -MapGpuElementBuffer(gpu_element_buffer_handles *Handles) -{ - NotImplemented; -} -#endif - link_internal gpu_mapped_element_buffer AllocateAndMapGpuBuffer(data_type Type, u32 ElementCount) { gpu_mapped_element_buffer Buf = {}; AllocateGpuElementBuffer(&Buf, Type, ElementCount); - MapGpuBuffer_untextured_3d_geometry_buffer(&Buf); + MapGpuBuffer(&Buf); return Buf; } @@ -1255,7 +1247,7 @@ RenderToTexture(engine_resources *Engine, asset_thumbnail *Thumb, untextured_3d_ // Geometry stuff { - MapGpuBuffer_untextured_3d_geometry_buffer(&RTTGroup->GeoBuffer); + MapGpuBuffer(&RTTGroup->GeoBuffer); untextured_3d_geometry_buffer* Dest = &RTTGroup->GeoBuffer.Buffer; BufferVertsChecked(Src, Dest, Offset, V3(1.0f)); diff --git a/src/engine/render.h b/src/engine/render.h index c115b8335..a16c24c01 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -3,12 +3,6 @@ struct world_chunk; #define GLOBAL_RENDER_SCALE_FACTOR (1.00f) -// NOTE(Jesse): Must match defines in header.glsl -#define VERTEX_POSITION_LAYOUT_LOCATION 0 -#define VERTEX_NORMAL_LAYOUT_LOCATION 1 -#define VERTEX_COLOR_LAYOUT_LOCATION 2 -#define VERTEX_TRANS_EMISS_LAYOUT_LOCATION 3 - #define DEFAULT_LINE_THICKNESS (0.3f) diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 626057dc4..69867363f 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -87,7 +87,7 @@ DrainRenderQueue(engine_resources *Engine) TIMED_NAMED_BLOCK(bonsai_render_command_allocate_and_map_gpu_element_buffer); ReallocateGpuBuffers(&Command->Dest->Handles, Command->Type, Command->ElementCount); - MapGpuBuffer_untextured_3d_geometry_buffer(Command->Dest); + MapGpuBuffer(Command->Dest); Assert(HasGpuMesh(Command->Dest) == 1); @@ -650,6 +650,7 @@ DrainRenderQueue(engine_resources *Engine) ao_render_group *AoGroup = Graphics->AoGroup; +#if 0 EngineDebug->Render.BytesSolidGeoLastFrame = GpuMap->Buffer.At; EngineDebug->Render.BytesTransGeoLastFrame = Graphics->Transparency.GpuBuffer.Buffer.At; @@ -664,7 +665,7 @@ DrainRenderQueue(engine_resources *Engine) Graphics->ColorPaletteTexture = MakeTexture_RGB( V2i(ColorCount, 1), Graphics->ColorPalette.Start, CSz("ColorPalette")); } - +#endif #if 0 // @@ -738,9 +739,14 @@ DrainRenderQueue(engine_resources *Engine) /* GpuMap = GetNextGpuMap(Graphics); */ - // Map immediate GPU buffers for next frame - MapGpuBuffer_untextured_3d_geometry_buffer(GpuMap); - MapGpuBuffer_untextured_3d_geometry_buffer(&Graphics->Transparency.GpuBuffer); + // Map GPU buffers for next frame + MapGpuBuffer(GpuMap); + MapGpuBuffer(&Graphics->Transparency.GpuBuffer); + + MapGpuBuffer(&Ui->SolidQuadGeometryBuffer); + MapGpuBuffer(&Ui->TextGroup->Buf); + MapGpuBuffer(&Ui->CustomQuadGeometryBuffer); + Assert(GpuMap->Buffer.At == 0); Graphics->RenderGate = False; @@ -897,8 +903,13 @@ RenderThread_Main(void *ThreadStartupParams) } // Map immediate GPU buffers for first frame - MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.GpuBuffers[0]); - MapGpuBuffer_untextured_3d_geometry_buffer(&Engine->Graphics.Transparency.GpuBuffer); + MapGpuBuffer(&Engine->Graphics.GpuBuffers[0]); + MapGpuBuffer(&Engine->Graphics.Transparency.GpuBuffer); + + auto Ui = &Engine->Ui; + MapGpuBuffer(&Ui->SolidQuadGeometryBuffer); + MapGpuBuffer(&Ui->TextGroup->Buf); + MapGpuBuffer(&Ui->CustomQuadGeometryBuffer); FullBarrier; Engine->Graphics.Initialized = True; From aff0cccadeb47d437ac9928ac7a2e344e766fcb2 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 11 Oct 2025 12:01:00 -0700 Subject: [PATCH 342/421] Automatically register shaders for hot-reload --- examples/terrain_gen/game.cpp | 10 +- examples/terrain_gen/game_types.h | 1 + external/bonsai_stdlib | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- ...cify_render_function_c_CompileShaderPair.h | 6 +- ...cify_render_function_h_CompileShaderPair.h | 6 +- .../block_array_h_shader_ptr_688853971_0.h | 2 +- generated/buffer_h_struct_u32.h | 2 +- generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- .../shader_magic_bloom_downsample_shader.h | 30 +- .../shader_magic_bloom_upsample_shader.h | 30 +- .../shader_magic_lighting_render_group.h | 130 +++++---- generated/shader_magic_shadow_map_shader.h | 42 +-- ...r_magic_struct_terrain_decoration_shader.h | 42 +-- ...gic_struct_terrain_derivs_render_context.h | 30 +- ...c_struct_terrain_finalize_render_context.h | 30 +- ...ader_magic_struct_terrain_shaping_shader.h | 38 +-- .../shader_magic_struct_world_edit_shader.h | 42 +-- .../shader_magic_textured_quad_render_pass.h | 42 +-- src/engine/render/render_init.cpp | 272 ++++++++---------- src/engine/render_loop.cpp | 2 - src/engine/work_queue.h | 8 +- 28 files changed, 395 insertions(+), 388 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 1cb21d344..0a5d3855e 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -45,15 +45,13 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() CameraGhost->P.WorldP = VisibleRegion/2; CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); - CompileShaderPair_Async(RenderQ, CSz(STDLIB_SHADER_PATH "passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "cosine_interp_vis.fragmentshader"), True, &GameState->Shader); + CompileShaderPair_Async(RenderQ, &GameState->Shader, CSz(STDLIB_SHADER_PATH "passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "cosine_interp_vis.fragmentshader"), True, True, &GameState->ShaderCompileSuccess); SpawnEntity(CameraGhost); return GameState; } -static b32 temp_ShaderRegistered; - BONSAI_API_MAIN_THREAD_CALLBACK() { @@ -62,12 +60,6 @@ BONSAI_API_MAIN_THREAD_CALLBACK() TIMED_FUNCTION(); UNPACK_ENGINE_RESOURCES(Resources); - if (GameState->Shader.ID != INVALID_SHADER && temp_ShaderRegistered == False) - { - temp_ShaderRegistered = True; - RegisterShaderForHotReload(&Resources->Stdlib, &GameState->Shader); - } - f32 dt = Plat->dt; f32 Speed = 80.f; diff --git a/examples/terrain_gen/game_types.h b/examples/terrain_gen/game_types.h index 5c8b82bfe..40cb78ba0 100644 --- a/examples/terrain_gen/game_types.h +++ b/examples/terrain_gen/game_types.h @@ -33,5 +33,6 @@ struct game_state terrain_gen_type TerrainGenType; shader Shader; + b32 ShaderCompileSuccess; }; diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index d7b636b52..0bed598b5 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit d7b636b52671cb780489a41731bd6644d9eeb291 +Subproject commit 0bed598b55279d5cb9922863f69244a33c31194e diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 587ef7f4e..5ce843d34 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3604:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3605:0 if (Input->Dot.Clicked) { diff --git a/generated/asyncify_render_function_c_CompileShaderPair.h b/generated/asyncify_render_function_c_CompileShaderPair.h index 0b546c7b3..f47a216a6 100644 --- a/generated/asyncify_render_function_c_CompileShaderPair.h +++ b/generated/asyncify_render_function_c_CompileShaderPair.h @@ -1,11 +1,11 @@ // src/engine/work_queue.h:334:0 link_internal void -CompileShaderPair_Async(work_queue *Queue, cs VertShaderPath , cs FragShaderPath , b32 DumpErrors , shader* Dest ) +CompileShaderPair_Async(work_queue *Queue, shader *Shader , cs VertShaderPath , cs FragShaderPath , b32 DumpErrors , b32 RegisterForHotReload , b32* Result ) { compile_shader_pair_async_params Params = { - Dest, VertShaderPath, FragShaderPath, DumpErrors, + Result, Shader, VertShaderPath, FragShaderPath, DumpErrors, RegisterForHotReload, }; work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); @@ -15,6 +15,6 @@ CompileShaderPair_Async(work_queue *Queue, cs VertShaderPath , cs FragShaderPat link_internal void DoJob(compile_shader_pair_async_params *Params) { - *Params->Dest = CompileShaderPair( Params->VertShaderPath , Params->FragShaderPath , Params->DumpErrors ); + *Params->Result = CompileShaderPair( Params->Shader , Params->VertShaderPath , Params->FragShaderPath , Params->DumpErrors , Params->RegisterForHotReload ); } diff --git a/generated/asyncify_render_function_h_CompileShaderPair.h b/generated/asyncify_render_function_h_CompileShaderPair.h index 7fa3f46f6..043426b58 100644 --- a/generated/asyncify_render_function_h_CompileShaderPair.h +++ b/generated/asyncify_render_function_h_CompileShaderPair.h @@ -2,9 +2,11 @@ struct compile_shader_pair_async_params poof(@async_function_params) { - shader* Dest; - cs VertShaderPath; + b32* Result; + shader *Shader; + cs VertShaderPath; cs FragShaderPath; b32 DumpErrors; + b32 RegisterForHotReload; }; diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 11e53146b..13f44865d 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:148:0 +// external/bonsai_stdlib/src/shader.h:152:0 diff --git a/generated/buffer_h_struct_u32.h b/generated/buffer_h_struct_u32.h index 594f724a8..5bfe06e0d 100644 --- a/generated/buffer_h_struct_u32.h +++ b/generated/buffer_h_struct_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:129:0 +// external/bonsai_stdlib/src/shader.h:133:0 struct shader_uniform_buffer { diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 793f70bf1..38e81c73b 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:324:0 +// external/bonsai_stdlib/src/shader.cpp:346:0 b32 SetShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 86ed8069b..3e76ad75a 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:339:0 +// external/bonsai_stdlib/src/shader.cpp:361:0 b32 SetShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index 4ceee9be5..47f26a376 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:336:0 +// external/bonsai_stdlib/src/shader.cpp:358:0 b32 SetShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index eee94cea8..7d1e0b107 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:321:0 +// external/bonsai_stdlib/src/shader.cpp:343:0 b32 SetShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 4e479a440..7a1c16156 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:333:0 +// external/bonsai_stdlib/src/shader.cpp:355:0 b32 SetShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index 1e1d82f07..c27c41d4b 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:327:0 +// external/bonsai_stdlib/src/shader.cpp:349:0 b32 SetShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index d05070cd0..bd944ab0f 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:330:0 +// external/bonsai_stdlib/src/shader.cpp:352:0 b32 SetShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) diff --git a/generated/shader_magic_bloom_downsample_shader.h b/generated/shader_magic_bloom_downsample_shader.h index a94336cde..b3f807d8d 100644 --- a/generated/shader_magic_bloom_downsample_shader.h +++ b/generated/shader_magic_bloom_downsample_shader.h @@ -1,32 +1,36 @@ // src/engine/bloom.h:11:0 -link_internal void -InitializeBloomDownsampleShader( bloom_downsample_shader *Struct +link_internal b32 +InitializeBloomDownsampleShader( + bloom_downsample_shader *Struct , v2 *SrcResolution ) { - Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_downsample.fragmentshader")); - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_downsample.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); - u32 UniformIndex = 0; + u32 UniformIndex = 0; - Struct->SrcResolution = SrcResolution; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SrcResolution, "SrcResolution"); + Struct->SrcResolution = SrcResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SrcResolution, "SrcResolution"); - u32 Expected = 1 ; - if (UniformIndex != Expected ) - { - Error("Shader (bloom_downsample_shader) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + u32 Expected = 1 ; + if (UniformIndex != Expected ) + { + Error("Shader (bloom_downsample_shader) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } } AssertNoGlErrors; - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); + return Result; } link_internal void diff --git a/generated/shader_magic_bloom_upsample_shader.h b/generated/shader_magic_bloom_upsample_shader.h index 4f7af184a..f9a37ec20 100644 --- a/generated/shader_magic_bloom_upsample_shader.h +++ b/generated/shader_magic_bloom_upsample_shader.h @@ -1,32 +1,36 @@ // src/engine/bloom.h:25:0 -link_internal void -InitializeBloomUpsampleShader( bloom_upsample_shader *Struct +link_internal b32 +InitializeBloomUpsampleShader( + bloom_upsample_shader *Struct , f32 *FilterRadius ) { - Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_upsample.fragmentshader")); - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_upsample.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); - u32 UniformIndex = 0; + u32 UniformIndex = 0; - Struct->FilterRadius = FilterRadius; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FilterRadius, "FilterRadius"); + Struct->FilterRadius = FilterRadius; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FilterRadius, "FilterRadius"); - u32 Expected = 1 ; - if (UniformIndex != Expected ) - { - Error("Shader (bloom_upsample_shader) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + u32 Expected = 1 ; + if (UniformIndex != Expected ) + { + Error("Shader (bloom_upsample_shader) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } } AssertNoGlErrors; - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); + return Result; } link_internal void diff --git a/generated/shader_magic_lighting_render_group.h b/generated/shader_magic_lighting_render_group.h index f4e1f8d71..1ab3127d8 100644 --- a/generated/shader_magic_lighting_render_group.h +++ b/generated/shader_magic_lighting_render_group.h @@ -1,7 +1,8 @@ // src/engine/light.h:74:0 -link_internal void -InitializeLightingRenderGroup( lighting_render_group *Struct +link_internal b32 +InitializeLightingRenderGroup( + lighting_render_group *Struct , texture *gColor , texture *gNormal , texture *gDepth @@ -31,102 +32,105 @@ InitializeLightingRenderGroup( lighting_render_group *Struct ) { - Struct->Program = CompileShaderPair(CSz(BONSAI_SHADER_PATH "Lighting.vertexshader"), CSz(BONSAI_SHADER_PATH "Lighting.fragmentshader")); - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + b32 Result = CompileShaderPair(&Struct->Program, CSz(BONSAI_SHADER_PATH "Lighting.vertexshader"), CSz(BONSAI_SHADER_PATH "Lighting.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); - u32 UniformIndex = 0; + u32 UniformIndex = 0; - Struct->gColor = gColor; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gColor, "gColor"); + Struct->gColor = gColor; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gColor, "gColor"); - Struct->gNormal = gNormal; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gNormal, "gNormal"); + Struct->gNormal = gNormal; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gNormal, "gNormal"); - Struct->gDepth = gDepth; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gDepth, "gDepth"); + Struct->gDepth = gDepth; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gDepth, "gDepth"); - Struct->shadowMap = shadowMap; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->shadowMap, "shadowMap"); + Struct->shadowMap = shadowMap; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->shadowMap, "shadowMap"); - Struct->Ssao = Ssao; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->Ssao, "Ssao"); + Struct->Ssao = Ssao; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->Ssao, "Ssao"); - Struct->TransparencyAccumTex = TransparencyAccumTex; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->TransparencyAccumTex, "TransparencyAccumTex"); + Struct->TransparencyAccumTex = TransparencyAccumTex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->TransparencyAccumTex, "TransparencyAccumTex"); - Struct->TransparencyCountTex = TransparencyCountTex; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->TransparencyCountTex, "TransparencyCountTex"); + Struct->TransparencyCountTex = TransparencyCountTex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->TransparencyCountTex, "TransparencyCountTex"); - Struct->BravoilMyersOIT = BravoilMyersOIT; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->BravoilMyersOIT, "BravoilMyersOIT"); + Struct->BravoilMyersOIT = BravoilMyersOIT; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->BravoilMyersOIT, "BravoilMyersOIT"); - Struct->BravoilMcGuireOIT = BravoilMcGuireOIT; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->BravoilMcGuireOIT, "BravoilMcGuireOIT"); + Struct->BravoilMcGuireOIT = BravoilMcGuireOIT; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->BravoilMcGuireOIT, "BravoilMcGuireOIT"); - Struct->InverseViewMatrix = InverseViewMatrix; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InverseViewMatrix, "InverseViewMatrix"); + Struct->InverseViewMatrix = InverseViewMatrix; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InverseViewMatrix, "InverseViewMatrix"); - Struct->InverseProjectionMatrix = InverseProjectionMatrix; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InverseProjectionMatrix, "InverseProjectionMatrix"); + Struct->InverseProjectionMatrix = InverseProjectionMatrix; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InverseProjectionMatrix, "InverseProjectionMatrix"); - Struct->ShadowMVP = ShadowMVP; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ShadowMVP, "ShadowMVP"); + Struct->ShadowMVP = ShadowMVP; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ShadowMVP, "ShadowMVP"); - Struct->LightColors = LightColors; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightColors, "LightColors"); + Struct->LightColors = LightColors; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightColors, "LightColors"); - Struct->LightPositions = LightPositions; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightPositions, "LightPositions"); + Struct->LightPositions = LightPositions; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightPositions, "LightPositions"); - Struct->LightIndexToUV = LightIndexToUV; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightIndexToUV, "LightIndexToUV"); + Struct->LightIndexToUV = LightIndexToUV; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightIndexToUV, "LightIndexToUV"); - Struct->LightCount = LightCount; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightCount, "LightCount"); + Struct->LightCount = LightCount; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightCount, "LightCount"); - Struct->Camera = Camera; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->Camera, "Camera"); + Struct->Camera = Camera; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->Camera, "Camera"); - Struct->SunPosition = SunPosition; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SunPosition, "SunPosition"); + Struct->SunPosition = SunPosition; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SunPosition, "SunPosition"); - Struct->SunColor = SunColor; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SunColor, "SunColor"); + Struct->SunColor = SunColor; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SunColor, "SunColor"); - Struct->FogColor = FogColor; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FogColor, "FogColor"); + Struct->FogColor = FogColor; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FogColor, "FogColor"); - Struct->FogPower = FogPower; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FogPower, "FogPower"); + Struct->FogPower = FogPower; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FogPower, "FogPower"); - Struct->UseSsao = UseSsao; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseSsao, "UseSsao"); + Struct->UseSsao = UseSsao; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseSsao, "UseSsao"); - Struct->UseShadowMapping = UseShadowMapping; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseShadowMapping, "UseShadowMapping"); + Struct->UseShadowMapping = UseShadowMapping; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseShadowMapping, "UseShadowMapping"); - Struct->UseLightingBloom = UseLightingBloom; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseLightingBloom, "UseLightingBloom"); + Struct->UseLightingBloom = UseLightingBloom; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseLightingBloom, "UseLightingBloom"); - Struct->ApplicationResolution = ApplicationResolution; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ApplicationResolution, "ApplicationResolution"); + Struct->ApplicationResolution = ApplicationResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ApplicationResolution, "ApplicationResolution"); - Struct->ShadowMapResolution = ShadowMapResolution; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ShadowMapResolution, "ShadowMapResolution"); + Struct->ShadowMapResolution = ShadowMapResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ShadowMapResolution, "ShadowMapResolution"); - u32 Expected = 26 ; - if (UniformIndex != Expected ) - { - Error("Shader (lighting_render_group) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + u32 Expected = 26 ; + if (UniformIndex != Expected ) + { + Error("Shader (lighting_render_group) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } } AssertNoGlErrors; - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); + return Result; } link_internal void diff --git a/generated/shader_magic_shadow_map_shader.h b/generated/shader_magic_shadow_map_shader.h index e7a22ba9e..4a5c2aa9d 100644 --- a/generated/shader_magic_shadow_map_shader.h +++ b/generated/shader_magic_shadow_map_shader.h @@ -1,41 +1,45 @@ // src/engine/render/shadow_map.h:19:0 -link_internal void -InitializeShadowMapShader( shadow_map_shader *Struct +link_internal b32 +InitializeShadowMapShader( + shadow_map_shader *Struct , m4 ModelMatrix , m4 ViewProjection , v3 *MinClipP_worldspace , v3 *MaxClipP_worldspace ) { - Struct->Program = CompileShaderPair(CSz("shaders/DepthRTT.vertexshader"), CSz("shaders/DepthRTT.fragmentshader")); - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + b32 Result = CompileShaderPair(&Struct->Program, CSz("shaders/DepthRTT.vertexshader"), CSz("shaders/DepthRTT.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); - u32 UniformIndex = 0; + u32 UniformIndex = 0; - Struct->ModelMatrix = ModelMatrix; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ModelMatrix, "ModelMatrix"); + Struct->ModelMatrix = ModelMatrix; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ModelMatrix, "ModelMatrix"); - Struct->ViewProjection = ViewProjection; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ViewProjection, "ViewProjection"); + Struct->ViewProjection = ViewProjection; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ViewProjection, "ViewProjection"); - Struct->MinClipP_worldspace = MinClipP_worldspace; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->MinClipP_worldspace, "MinClipP_worldspace"); + Struct->MinClipP_worldspace = MinClipP_worldspace; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->MinClipP_worldspace, "MinClipP_worldspace"); - Struct->MaxClipP_worldspace = MaxClipP_worldspace; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->MaxClipP_worldspace, "MaxClipP_worldspace"); + Struct->MaxClipP_worldspace = MaxClipP_worldspace; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->MaxClipP_worldspace, "MaxClipP_worldspace"); - u32 Expected = 4 ; - if (UniformIndex != Expected ) - { - Error("Shader (shadow_map_shader) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + u32 Expected = 4 ; + if (UniformIndex != Expected ) + { + Error("Shader (shadow_map_shader) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } } AssertNoGlErrors; - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); + return Result; } link_internal void diff --git a/generated/shader_magic_struct_terrain_decoration_shader.h b/generated/shader_magic_struct_terrain_decoration_shader.h index 16ba53735..5bf248725 100644 --- a/generated/shader_magic_struct_terrain_decoration_shader.h +++ b/generated/shader_magic_struct_terrain_decoration_shader.h @@ -1,41 +1,45 @@ // src/engine/graphics.h:49:0 -link_internal void -InitializeTerrainDecorationRenderContext( terrain_decoration_render_context *Struct +link_internal b32 +InitializeTerrainDecorationRenderContext( + terrain_decoration_render_context *Struct , texture *DerivsTex , v3 ChunkDim , v3 WorldspaceChunkBasis , v3 ChunkResolution ) { - Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/default.fragmentshader")); - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/default.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); - u32 UniformIndex = 0; + u32 UniformIndex = 0; - Struct->DerivsTex = DerivsTex; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->DerivsTex, "DerivsTex"); + Struct->DerivsTex = DerivsTex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->DerivsTex, "DerivsTex"); - Struct->ChunkDim = ChunkDim; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); + Struct->ChunkDim = ChunkDim; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); - Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); + Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); - Struct->ChunkResolution = ChunkResolution; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); + Struct->ChunkResolution = ChunkResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); - u32 Expected = 4 ; - if (UniformIndex != Expected ) - { - Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + u32 Expected = 4 ; + if (UniformIndex != Expected ) + { + Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } } AssertNoGlErrors; - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); + return Result; } link_internal void diff --git a/generated/shader_magic_struct_terrain_derivs_render_context.h b/generated/shader_magic_struct_terrain_derivs_render_context.h index bfa32ee2f..fd1748485 100644 --- a/generated/shader_magic_struct_terrain_derivs_render_context.h +++ b/generated/shader_magic_struct_terrain_derivs_render_context.h @@ -1,32 +1,36 @@ // src/engine/graphics.h:52:0 -link_internal void -InitializeTerrainDerivsRenderContext( terrain_derivs_render_context *Struct +link_internal b32 +InitializeTerrainDerivsRenderContext( + terrain_derivs_render_context *Struct , v3 Ignored ) { - Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/derivs.fragmentshader")); - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/derivs.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); - u32 UniformIndex = 0; + u32 UniformIndex = 0; - Struct->Ignored = Ignored; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); + Struct->Ignored = Ignored; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); - u32 Expected = 1 ; - if (UniformIndex != Expected ) - { - Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + u32 Expected = 1 ; + if (UniformIndex != Expected ) + { + Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } } AssertNoGlErrors; - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); + return Result; } link_internal void diff --git a/generated/shader_magic_struct_terrain_finalize_render_context.h b/generated/shader_magic_struct_terrain_finalize_render_context.h index fcdfb5eac..c2fe828de 100644 --- a/generated/shader_magic_struct_terrain_finalize_render_context.h +++ b/generated/shader_magic_struct_terrain_finalize_render_context.h @@ -1,32 +1,36 @@ // src/engine/graphics.h:87:0 -link_internal void -InitializeTerrainFinalizeRenderContext( terrain_finalize_render_context *Struct +link_internal b32 +InitializeTerrainFinalizeRenderContext( + terrain_finalize_render_context *Struct , u32 Ignored ) { - Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/TerrainFinalize.fragmentshader")); - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/TerrainFinalize.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); - u32 UniformIndex = 0; + u32 UniformIndex = 0; - Struct->Ignored = Ignored; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); + Struct->Ignored = Ignored; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); - u32 Expected = 1 ; - if (UniformIndex != Expected ) - { - Error("Shader (terrain_finalize_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + u32 Expected = 1 ; + if (UniformIndex != Expected ) + { + Error("Shader (terrain_finalize_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } } AssertNoGlErrors; - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); + return Result; } link_internal void diff --git a/generated/shader_magic_struct_terrain_shaping_shader.h b/generated/shader_magic_struct_terrain_shaping_shader.h index 227328f07..08180d12c 100644 --- a/generated/shader_magic_struct_terrain_shaping_shader.h +++ b/generated/shader_magic_struct_terrain_shaping_shader.h @@ -1,37 +1,41 @@ // src/engine/graphics.h:46:0 -link_internal void -InitializeTerrainShapingRenderContext( terrain_shaping_render_context *Struct +link_internal b32 +InitializeTerrainShapingRenderContext( + terrain_shaping_render_context *Struct , v3 ChunkDim , v3 WorldspaceChunkBasis , v3 ChunkResolution ) { - Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/default.fragmentshader")); - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/default.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); - u32 UniformIndex = 0; + u32 UniformIndex = 0; - Struct->ChunkDim = ChunkDim; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); + Struct->ChunkDim = ChunkDim; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); - Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); + Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); - Struct->ChunkResolution = ChunkResolution; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); + Struct->ChunkResolution = ChunkResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); - u32 Expected = 3 ; - if (UniformIndex != Expected ) - { - Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + u32 Expected = 3 ; + if (UniformIndex != Expected ) + { + Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } } AssertNoGlErrors; - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); + return Result; } link_internal void diff --git a/generated/shader_magic_struct_world_edit_shader.h b/generated/shader_magic_struct_world_edit_shader.h index 452e8d4e2..a4d429086 100644 --- a/generated/shader_magic_struct_world_edit_shader.h +++ b/generated/shader_magic_struct_world_edit_shader.h @@ -1,41 +1,45 @@ // src/engine/graphics.h:71:0 -link_internal void -InitializeWorldEditRenderContext( world_edit_render_context *Struct +link_internal b32 +InitializeWorldEditRenderContext( + world_edit_render_context *Struct , v3 *ChunkDim , v3 *WorldspaceChunkBasis , v3 *ChunkResolution , s32 Type ) { - Struct->Program = CompileShaderPair(CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); - u32 UniformIndex = 0; + u32 UniformIndex = 0; - Struct->ChunkDim = ChunkDim; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkDim, "ChunkDim"); + Struct->ChunkDim = ChunkDim; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkDim, "ChunkDim"); - Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); + Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); - Struct->ChunkResolution = ChunkResolution; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkResolution, "ChunkResolution"); + Struct->ChunkResolution = ChunkResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkResolution, "ChunkResolution"); - Struct->Type = Type; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Type, "Type"); + Struct->Type = Type; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Type, "Type"); - u32 Expected = 4 ; - if (UniformIndex != Expected ) - { - Error("Shader (world_edit_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + u32 Expected = 4 ; + if (UniformIndex != Expected ) + { + Error("Shader (world_edit_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } } AssertNoGlErrors; - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); + return Result; } link_internal void diff --git a/generated/shader_magic_textured_quad_render_pass.h b/generated/shader_magic_textured_quad_render_pass.h index 3b919bd38..ef20c7a3c 100644 --- a/generated/shader_magic_textured_quad_render_pass.h +++ b/generated/shader_magic_textured_quad_render_pass.h @@ -1,41 +1,45 @@ // external/bonsai_stdlib/src/ui/ui.cpp:10:0 -link_internal void -InitializeTexturedQuadRenderPass( textured_quad_render_pass *Struct +link_internal b32 +InitializeTexturedQuadRenderPass( + textured_quad_render_pass *Struct , b32 IsDepthTexture , b32 HasAlphaChannel , s32 TextureSlice , v3 Tint ) { - Struct->Program = CompileShaderPair(CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(STDLIB_SHADER_PATH "SimpleTexture.fragmentshader")); - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + b32 Result = CompileShaderPair(&Struct->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(STDLIB_SHADER_PATH "SimpleTexture.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); - u32 UniformIndex = 0; + u32 UniformIndex = 0; - Struct->IsDepthTexture = IsDepthTexture; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->IsDepthTexture, "IsDepthTexture"); + Struct->IsDepthTexture = IsDepthTexture; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->IsDepthTexture, "IsDepthTexture"); - Struct->HasAlphaChannel = HasAlphaChannel; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->HasAlphaChannel, "HasAlphaChannel"); + Struct->HasAlphaChannel = HasAlphaChannel; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->HasAlphaChannel, "HasAlphaChannel"); - Struct->TextureSlice = TextureSlice; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->TextureSlice, "TextureSlice"); + Struct->TextureSlice = TextureSlice; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->TextureSlice, "TextureSlice"); - Struct->Tint = Tint; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Tint, "Tint"); + Struct->Tint = Tint; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Tint, "Tint"); - u32 Expected = 4 ; - if (UniformIndex != Expected ) - { - Error("Shader (textured_quad_render_pass) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + u32 Expected = 4 ; + if (UniformIndex != Expected ) + { + Error("Shader (textured_quad_render_pass) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } } AssertNoGlErrors; - - RegisterShaderForHotReload(GetStdlib(), &Struct->Program); + return Result; } link_internal void diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 573c160fc..b51d122b8 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -49,8 +49,10 @@ AllocateAndInitSsaoNoise(v2i ApplicationResolution, ao_render_group *AoGroup, me return SsaoNoiseTexture; } -shader -MakeCompositeShader( memory_arena *GraphicsMemory, +link_internal b32 +MakeCompositeShader( + shader *Shader, + memory_arena *GraphicsMemory, v2 *ApplicationResolution, g_buffer_textures *gTextures, texture *ShadowMap, @@ -71,52 +73,44 @@ MakeCompositeShader( memory_arena *GraphicsMemory, tone_mapping_type *ToneMappingType ) { - shader Shader = CompileShaderPair( CSz(BONSAI_SHADER_PATH "composite.vertexshader"), CSz(BONSAI_SHADER_PATH "composite.fragmentshader") ); - Shader.Uniforms = ShaderUniformBuffer(11, GraphicsMemory); - - /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Color, "gColor"); */ - /* Current = &(*Current)->Next; */ - - /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); */ - /* Current = &(*Current)->Next; */ - - /* *Current = GetUniform(GraphicsMemory, &Shader, ShadowMap, "shadowMap"); */ - /* Current = &(*Current)->Next; */ - - /* *Current = GetUniform(GraphicsMemory, &Shader, Ssao, "Ssao"); */ - /* Current = &(*Current)->Next; */ - - /* SetShaderUniform(&Shader, 8, ShadowMVP, "ShadowMVP"); *1/ */ - - /* SetShaderUniform(&Shader, 9, Camera, "CameraP"); *1/ */ - - - SetShaderUniform(&Shader, 0, &gTextures->Normal, "gNormal"); - - SetShaderUniform(&Shader, 1, BloomTex, "BloomTex"); - - SetShaderUniform(&Shader, 2, TransparencyAccum, "TransparencyAccum"); - - SetShaderUniform(&Shader, 3, TransparencyCount, "TransparencyCount"); + b32 Result = CompileShaderPair( Shader, CSz(BONSAI_SHADER_PATH "composite.vertexshader"), CSz(BONSAI_SHADER_PATH "composite.fragmentshader") ); + if (Result) + { + Shader->Uniforms = ShaderUniformBuffer(11, GraphicsMemory); - SetShaderUniform(&Shader, 4, (u32*)UseLightingBloom, "UseLightingBloom"); + /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Color, "gColor"); */ + /* Current = &(*Current)->Next; */ - SetShaderUniform(&Shader, 5, (u32*)BravoilMyersOIT, "BravoilMyersOIT"); + /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); */ + /* Current = &(*Current)->Next; */ - SetShaderUniform(&Shader, 6, (u32*)BravoilMcGuireOIT, "BravoilMcGuireOIT"); + /* *Current = GetUniform(GraphicsMemory, &Shader, ShadowMap, "shadowMap"); */ + /* Current = &(*Current)->Next; */ - SetShaderUniform(&Shader, 7, LuminanceTex, "LuminanceTex"); + /* *Current = GetUniform(GraphicsMemory, &Shader, Ssao, "Ssao"); */ + /* Current = &(*Current)->Next; */ - SetShaderUniform(&Shader, 8, Exposure, "Exposure"); + /* SetShaderUniform(&Shader, 8, ShadowMVP, "ShadowMVP"); *1/ */ - SetShaderUniform(&Shader, 9, (int*)ToneMappingType, "ToneMappingType"); + /* SetShaderUniform(&Shader, 9, Camera, "CameraP"); *1/ */ - SetShaderUniform(&Shader, 10, ApplicationResolution, "ApplicationResolution"); + SetShaderUniform(Shader, 0, &gTextures->Normal, "gNormal"); + SetShaderUniform(Shader, 1, BloomTex, "BloomTex"); + SetShaderUniform(Shader, 2, TransparencyAccum, "TransparencyAccum"); + SetShaderUniform(Shader, 3, TransparencyCount, "TransparencyCount"); + SetShaderUniform(Shader, 4, (u32*)UseLightingBloom, "UseLightingBloom"); + SetShaderUniform(Shader, 5, (u32*)BravoilMyersOIT, "BravoilMyersOIT"); + SetShaderUniform(Shader, 6, (u32*)BravoilMcGuireOIT, "BravoilMcGuireOIT"); + SetShaderUniform(Shader, 7, LuminanceTex, "LuminanceTex"); + SetShaderUniform(Shader, 8, Exposure, "Exposure"); + SetShaderUniform(Shader, 9, (int*)ToneMappingType, "ToneMappingType"); + SetShaderUniform(Shader, 10, ApplicationResolution, "ApplicationResolution"); + } AssertNoGlErrors; - return Shader; + return Result; } link_internal void @@ -228,45 +222,41 @@ CreateAoRenderGroup(memory_arena *Mem) return Result; } -link_internal gaussian_render_group -MakeGaussianBlurRenderGroup(v2 *ApplicationResolution, memory_arena *GraphicsMemory) +link_internal void +InitGaussianBlurRenderGroup(gaussian_render_group *Result, v2 *ApplicationResolution, memory_arena *GraphicsMemory) { - gaussian_render_group Result = {}; - - Result.Shader = CompileShaderPair(CSz(STDLIB_SHADER_PATH "Passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "Gaussian.fragmentshader")); + Ensure(CompileShaderPair(&Result->Shader, CSz(STDLIB_SHADER_PATH "Passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "Gaussian.fragmentshader"))); { - Result.Shader.Uniforms = ShaderUniformBuffer(1, GraphicsMemory); - SetShaderUniform(&Result.Shader, 0, ApplicationResolution, "ApplicationResolution"); + Result->Shader.Uniforms = ShaderUniformBuffer(1, GraphicsMemory); + SetShaderUniform(&Result->Shader, 0, ApplicationResolution, "ApplicationResolution"); } - Result.FBOs[0] = GenFramebuffer(); - Result.FBOs[1] = GenFramebuffer(); + Result->FBOs[0] = GenFramebuffer(); + Result->FBOs[1] = GenFramebuffer(); // TODO(Jesse)(make_texture_rgba): Can we use MakeTexture_RGBA for (s32 Index = 0; Index < 2; ++Index) { - GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Result.FBOs[Index].ID); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, Result->FBOs[Index].ID); AssertNoGlErrors; u32 Channels = 4; u32 Slices = 1; texture_storage_format StorageFormat = TextureStorageFormat_RGBA32F; - Result.Textures[Index] = GenTexture(V2i(*ApplicationResolution), CSz("GaussianBlur"), StorageFormat, Channels, Slices); + Result->Textures[Index] = GenTexture(V2i(*ApplicationResolution), CSz("GaussianBlur"), StorageFormat, Channels, Slices); GetGL()->TexImage2D( GL_TEXTURE_2D, 0, GL_RGBA32F, s32(ApplicationResolution->x), s32(ApplicationResolution->y), 0, GL_RGBA, GL_FLOAT, 0); AssertNoGlErrors; - FramebufferTexture(&Result.FBOs[Index], Result.Textures+Index); + FramebufferTexture(&Result->FBOs[Index], Result->Textures+Index); AssertNoGlErrors; - SetDrawBuffers(&Result.FBOs[Index]); + SetDrawBuffers(&Result->FBOs[Index]); AssertNoGlErrors; Ensure(CheckAndClearFramebuffer()); } - - return Result; } g_buffer_render_group * @@ -278,43 +268,34 @@ CreateGbuffer(memory_arena *Memory) } -shader -CreateGbufferShader(graphics *Graphics, memory_arena *GraphicsMemory, v3 *MinClipP_worldspace, v3 *MaxClipP_worldspace, m4 *ViewProjection, camera *Camera, texture *ColorPaletteTexture) +link_internal b32 +CreateGbufferShader(shader *Shader, graphics *Graphics, memory_arena *GraphicsMemory, v3 *MinClipP_worldspace, v3 *MaxClipP_worldspace, m4 *ViewProjection, camera *Camera, texture *ColorPaletteTexture) { - shader Shader = CompileShaderPair( CSz(BONSAI_SHADER_PATH "gBuffer.vertexshader"), CSz(BONSAI_SHADER_PATH "gBuffer.fragmentshader") ); + b32 Result = CompileShaderPair(Shader, CSz(BONSAI_SHADER_PATH "gBuffer.vertexshader"), CSz(BONSAI_SHADER_PATH "gBuffer.fragmentshader") ); - Shader.Uniforms = ShaderUniformBuffer(12, GraphicsMemory); - - SetShaderUniform(&Shader, 0, MinClipP_worldspace, "MinClipP_worldspace"); - - SetShaderUniform(&Shader, 1, MaxClipP_worldspace, "MaxClipP_worldspace"); - - SetShaderUniform(&Shader, 2, ViewProjection, "ViewProjection"); + Shader->Uniforms = ShaderUniformBuffer(12, GraphicsMemory); + SetShaderUniform(Shader, 0, MinClipP_worldspace, "MinClipP_worldspace"); + SetShaderUniform(Shader, 1, MaxClipP_worldspace, "MaxClipP_worldspace"); + SetShaderUniform(Shader, 2, ViewProjection, "ViewProjection"); // @janky_model_matrix_bs - SetShaderUniform(&Shader, 3, &IdentityMatrix, "ModelMatrix"); - - SetShaderUniform(&Shader, 4, ColorPaletteTexture, "ColorPalette"); - - SetShaderUniform(&Shader, 5, &Camera->Frust.farClip, "FarClip"); - - SetShaderUniform(&Shader, 6, &Camera->Frust.nearClip, "NearClip"); + SetShaderUniform(Shader, 3, &IdentityMatrix, "ModelMatrix"); + SetShaderUniform(Shader, 4, ColorPaletteTexture, "ColorPalette"); + SetShaderUniform(Shader, 5, &Camera->Frust.farClip, "FarClip"); + SetShaderUniform(Shader, 6, &Camera->Frust.nearClip, "NearClip"); + SetShaderUniform(Shader, 7, &Camera->RenderSpacePosition, "CameraToWorld"); + SetShaderUniform(Shader, 8, &Graphics->OffsetOfWorldCenterToGrid, "OffsetOfWorldCenterToGrid"); + SetShaderUniform(Shader, 9, &Graphics->Settings.MajorGridDim, "MajorGridDim"); + SetShaderUniform(Shader, 10, &Graphics->Settings.DrawMajorGrid, "DrawMajorGrid"); + SetShaderUniform(Shader, 11, &Graphics->Settings.DrawMinorGrid, "DrawMinorGrid"); - SetShaderUniform(&Shader, 7, &Camera->RenderSpacePosition, "CameraToWorld"); - - SetShaderUniform(&Shader, 8, &Graphics->OffsetOfWorldCenterToGrid, "OffsetOfWorldCenterToGrid"); - - SetShaderUniform(&Shader, 9, &Graphics->Settings.MajorGridDim, "MajorGridDim"); - - SetShaderUniform(&Shader, 10, &Graphics->Settings.DrawMajorGrid, "DrawMajorGrid"); - - SetShaderUniform(&Shader, 11, &Graphics->Settings.DrawMinorGrid, "DrawMinorGrid"); - - return Shader; + return Result; } -shader -MakeSsaoShader( memory_arena *GraphicsMemory, +link_internal b32 +MakeSsaoShader( + shader *Shader, + memory_arena *GraphicsMemory, g_buffer_textures *gTextures, texture *SsaoNoiseTexture, v3 *SsaoNoiseTile, @@ -322,33 +303,30 @@ MakeSsaoShader( memory_arena *GraphicsMemory, m4 *InverseProjectionMatrix, m4 *ViewProjection ) { - shader Shader = CompileShaderPair( CSz(STDLIB_SHADER_PATH "Passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "Ao.fragmentshader") ); - - Shader.Uniforms = ShaderUniformBuffer(7, GraphicsMemory); - - /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Color, "gColor"); */ - /* Current = &(*Current)->Next; */ - - /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); */ - /* Current = &(*Current)->Next; */ - - SetShaderUniform(&Shader, 0, &gTextures->Normal, "gNormal"); - - SetShaderUniform(&Shader, 1, &gTextures->Depth, "gDepth"); - - SetShaderUniform(&Shader, 2, SsaoNoiseTexture, "SsaoNoiseTexture"); + b32 Result = CompileShaderPair(Shader, CSz(STDLIB_SHADER_PATH "Passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "Ao.fragmentshader") ); - SetShaderUniform(&Shader, 3, SsaoNoiseTile, "SsaoNoiseTile"); + if (Result) + { + Shader->Uniforms = ShaderUniformBuffer(7, GraphicsMemory); - SetShaderUniform(&Shader, 4, InverseViewMatrix, "InverseViewMatrix"); + /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Color, "gColor"); */ + /* Current = &(*Current)->Next; */ - SetShaderUniform(&Shader, 5, InverseProjectionMatrix, "InverseProjectionMatrix"); + /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); */ + /* Current = &(*Current)->Next; */ - SetShaderUniform(&Shader, 6, ViewProjection, "ViewProjection"); + SetShaderUniform(Shader, 0, &gTextures->Normal, "gNormal"); + SetShaderUniform(Shader, 1, &gTextures->Depth, "gDepth"); + SetShaderUniform(Shader, 2, SsaoNoiseTexture, "SsaoNoiseTexture"); + SetShaderUniform(Shader, 3, SsaoNoiseTile, "SsaoNoiseTile"); + SetShaderUniform(Shader, 4, InverseViewMatrix, "InverseViewMatrix"); + SetShaderUniform(Shader, 5, InverseProjectionMatrix, "InverseProjectionMatrix"); + SetShaderUniform(Shader, 6, ViewProjection, "ViewProjection"); + } AssertNoGlErrors; - return Shader; + return Result; } link_internal bool @@ -414,34 +392,28 @@ InitRenderToTextureGroup(render_entity_to_texture_group *Group, texture *ColorPa texture DepthTexture = MakeDepthTexture( V2i(1024), CSz("RenderToTexture Depth")); FramebufferDepthTexture(&DepthTexture); - Group->Shader = MakeRenderToTextureShader(Memory, &Group->ViewProjection, ColorPalette); + Ensure( MakeRenderToTextureShader(&Group->Shader, Memory, &Group->ViewProjection, ColorPalette) ); Ensure(CheckAndClearFramebuffer()); } -link_internal shader -MakeTransparencyShader(v2 *ApplicationResolution, b32 *BravoilMyersOIT, b32 *BravoilMcGuireOIT, m4 *ViewProjection, texture *gBufferDepthTexture, texture *ColorPaletteTexture, memory_arena *Memory) +link_internal b32 +MakeTransparencyShader(shader *Shader, v2 *ApplicationResolution, b32 *BravoilMyersOIT, b32 *BravoilMcGuireOIT, m4 *ViewProjection, texture *gBufferDepthTexture, texture *ColorPaletteTexture, memory_arena *Memory) { - shader Shader = CompileShaderPair( CSz(BONSAI_SHADER_PATH "gBuffer.vertexshader"), CSz(BONSAI_SHADER_PATH "3DTransparency.fragmentshader") ); - - Shader.Uniforms = ShaderUniformBuffer(7, Memory); + b32 Result = CompileShaderPair(Shader, CSz(BONSAI_SHADER_PATH "gBuffer.vertexshader"), CSz(BONSAI_SHADER_PATH "3DTransparency.fragmentshader") ); - SetShaderUniform(&Shader, 0, ViewProjection, "ViewProjection"); + Shader->Uniforms = ShaderUniformBuffer(7, Memory); + SetShaderUniform(Shader, 0, ViewProjection, "ViewProjection"); // @janky_model_matrix_bs - SetShaderUniform(&Shader, 1, &IdentityMatrix, "ModelMatrix"); - - SetShaderUniform(&Shader, 2, gBufferDepthTexture, "gBufferDepthTexture"); + SetShaderUniform(Shader, 1, &IdentityMatrix, "ModelMatrix"); + SetShaderUniform(Shader, 2, gBufferDepthTexture, "gBufferDepthTexture"); + SetShaderUniform(Shader, 3, BravoilMyersOIT, "BravoilMyersOIT"); + SetShaderUniform(Shader, 4, BravoilMcGuireOIT, "BravoilMcGuireOIT"); + SetShaderUniform(Shader, 5, ApplicationResolution, "ApplicationResolution"); + SetShaderUniform(Shader, 6, ColorPaletteTexture, "ColorPalette"); - SetShaderUniform(&Shader, 3, BravoilMyersOIT, "BravoilMyersOIT"); - - SetShaderUniform(&Shader, 4, BravoilMcGuireOIT, "BravoilMcGuireOIT"); - - SetShaderUniform(&Shader, 5, ApplicationResolution, "ApplicationResolution"); - - SetShaderUniform(&Shader, 6, ColorPaletteTexture, "ColorPalette"); - - return Shader; + return Result; } link_internal void @@ -475,7 +447,7 @@ InitTransparencyRenderGroup(render_settings *Settings, transparency_render_group FramebufferTexture(&Group->FBO, &Group->RevealTex); SetDrawBuffers(&Group->FBO); - Group->Shader = MakeTransparencyShader(&Settings->ApplicationResolution, &Settings->BravoilMyersOIT, &Settings->BravoilMcGuireOIT, ViewProjection, gBufferDepthTexture, ColorPaletteTexture, Memory); + MakeTransparencyShader(&Group->Shader, &Settings->ApplicationResolution, &Settings->BravoilMyersOIT, &Settings->BravoilMcGuireOIT, ViewProjection, gBufferDepthTexture, ColorPaletteTexture, Memory); Ensure( CheckAndClearFramebuffer() ); } @@ -667,7 +639,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr // TODO(Jesse): Move RTTGroup onto graphics? InitRenderToTextureGroup(&Resources->RTTGroup, &Result->ColorPaletteTexture, GraphicsMemory); - Result->Gaussian = MakeGaussianBlurRenderGroup(&Result->Settings.ApplicationResolution, GraphicsMemory); + InitGaussianBlurRenderGroup(&Result->Gaussian, &Result->Settings.ApplicationResolution, GraphicsMemory); AoGroup->NoiseTexture = AllocateAndInitSsaoNoise(Result->Settings.iApplicationResolution, AoGroup, GraphicsMemory); @@ -678,38 +650,40 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Push(&Result->ColorPalette, MAGICAVOXEL_DEFAULT_PALETTE[ColorIndex]/255.f); } - gBuffer->gBufferShader = - CreateGbufferShader(Result, GraphicsMemory, &Result->MinClipP_worldspace, &Result->MaxClipP_worldspace, &gBuffer->ViewProjection, Result->Camera, &Result->ColorPaletteTexture); - AoGroup->Shader = MakeSsaoShader( GraphicsMemory, - &gBuffer->Textures, - &AoGroup->NoiseTexture, - &AoGroup->NoiseTile, - &gBuffer->InverseViewMatrix, - &gBuffer->InverseProjectionMatrix, - &gBuffer->ViewProjection ); + Ensure(CreateGbufferShader(&gBuffer->gBufferShader, Result, GraphicsMemory, &Result->MinClipP_worldspace, &Result->MaxClipP_worldspace, &gBuffer->ViewProjection, Result->Camera, &Result->ColorPaletteTexture)); + + MakeSsaoShader(&AoGroup->Shader, + GraphicsMemory, + &gBuffer->Textures, + &AoGroup->NoiseTexture, + &AoGroup->NoiseTile, + &gBuffer->InverseViewMatrix, + &gBuffer->InverseProjectionMatrix, + &gBuffer->ViewProjection ); AoGroup->SsaoKernelUniform = GetShaderUniform(&AoGroup->Shader, "SsaoKernel"); // Initialize the composite group { - Result->CompositeGroup.Shader = MakeCompositeShader( GraphicsMemory, - &Result->Settings.ApplicationResolution, - &gBuffer->Textures, - &SG->ShadowMap, - &AoGroup->Texture, - &Result->Lighting.LuminanceTex, - &Result->Bloom.Tex, - &Result->Transparency.AccumTex, - &Result->Transparency.RevealTex, - &SG->Shader.ViewProjection, - Result->Camera, - &Result->Exposure, - &Result->Settings.UseLightingBloom, - &Result->Settings.BravoilMyersOIT, - &Result->Settings.BravoilMcGuireOIT, - &Result->Settings.ToneMappingType - ); + Ensure(MakeCompositeShader(&Result->CompositeGroup.Shader, + GraphicsMemory, + &Result->Settings.ApplicationResolution, + &gBuffer->Textures, + &SG->ShadowMap, + &AoGroup->Texture, + &Result->Lighting.LuminanceTex, + &Result->Bloom.Tex, + &Result->Transparency.AccumTex, + &Result->Transparency.RevealTex, + &SG->Shader.ViewProjection, + Result->Camera, + &Result->Exposure, + &Result->Settings.UseLightingBloom, + &Result->Settings.BravoilMyersOIT, + &Result->Settings.BravoilMcGuireOIT, + &Result->Settings.ToneMappingType + )); } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 69867363f..267dbfec6 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -745,7 +745,6 @@ DrainRenderQueue(engine_resources *Engine) MapGpuBuffer(&Ui->SolidQuadGeometryBuffer); MapGpuBuffer(&Ui->TextGroup->Buf); - MapGpuBuffer(&Ui->CustomQuadGeometryBuffer); Assert(GpuMap->Buffer.At == 0); @@ -909,7 +908,6 @@ RenderThread_Main(void *ThreadStartupParams) auto Ui = &Engine->Ui; MapGpuBuffer(&Ui->SolidQuadGeometryBuffer); MapGpuBuffer(&Ui->TextGroup->Buf); - MapGpuBuffer(&Ui->CustomQuadGeometryBuffer); FullBarrier; Engine->Graphics.Initialized = True; diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index 2a0dad1dd..78f059b88 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -140,7 +140,7 @@ poof( { struct (func_t.name.to_snake_case)_async_params poof(@async_function_params) { - func_t.value ? { func_t.value* Dest; } + func_t.value ? { func_t.value* Result; } func_t.map(arg) { arg; @@ -154,11 +154,11 @@ poof( func asyncify_render_function_c(func_t) { link_internal void - (func_t.name)_Async(work_queue *Queue, func_t.map(arg).sep(,) { arg } func_t.value? { , func_t.value* Dest }) + (func_t.name)_Async(work_queue *Queue, func_t.map(arg).sep(,) { arg } func_t.value? { , func_t.value* Result }) { (func_t.name.to_snake_case)_async_params Params = { - func_t.value? { Dest, } func_t.map(arg) { arg.name, } + func_t.value? { Result, } func_t.map(arg) { arg.name, } }; work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); @@ -168,7 +168,7 @@ poof( link_internal void DoJob((func_t.name.to_snake_case)_async_params *Params) { - func_t.value? { *Params->Dest = } func_t.name((func_t.map(arg).sep(,) { Params->(arg.name) })); + func_t.value? { *Params->Result = } func_t.name((func_t.map(arg).sep(,) { Params->(arg.name) })); } } ) From 026167a80a04d459e70814bf3395b3f96253e936 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 11 Oct 2025 13:48:33 -0700 Subject: [PATCH 343/421] Fix bugs in MapToFinal --- examples/terrain_gen/game.cpp | 2 +- shaders/cosine_interp_vis.fragmentshader | 134 ++++++++++------------- 2 files changed, 56 insertions(+), 80 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 0a5d3855e..c345e5578 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -45,7 +45,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() CameraGhost->P.WorldP = VisibleRegion/2; CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); - CompileShaderPair_Async(RenderQ, &GameState->Shader, CSz(STDLIB_SHADER_PATH "passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "cosine_interp_vis.fragmentshader"), True, True, &GameState->ShaderCompileSuccess); + CompileShaderPair_Async(RenderQ, &GameState->Shader, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "cosine_interp_vis.fragmentshader"), True, True, &GameState->ShaderCompileSuccess); SpawnEntity(CameraGhost); return GameState; diff --git a/shaders/cosine_interp_vis.fragmentshader b/shaders/cosine_interp_vis.fragmentshader index 0388b3d61..d2e6e7ea1 100644 --- a/shaders/cosine_interp_vis.fragmentshader +++ b/shaders/cosine_interp_vis.fragmentshader @@ -104,107 +104,83 @@ RoundToNearestMultiple(f32 NumToRound, f32 Multiple) } -f32 MapToFinal(f32 tx) +f32 MapToFinal(f32 SampleX) { - /* Assert(Value <= 1.f); */ - /* Assert(Value >= 0.f); */ - - // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about - - /* v2 Points[] = */ - /* { */ - /* {{1.0f, 1.0f }}, */ - /* {{0.7f, 0.85f }}, */ - /* {{0.6f, 0.5f }}, */ - /* {{0.3f, 0.4f }}, */ - /* {{0.2f, 0.1f }}, */ - /* {{0.0f, 0.0f }}, */ - /* }; */ - - /* v2 Points[] = */ - /* { */ - /* {{1.0f, 1.0f }}, */ - /* {{0.5f, 0.7f }}, */ - /* {{0.35f, 0.43f }}, */ - /* {{0.3f, 0.4f }}, */ - /* {{0.2f, 0.1f }}, */ - /* {{0.0f, 0.0f }}, */ - /* }; */ - /* const s32 PointCount = 2; */ /* v2 Points[PointCount]; */ /* Points[0] = v2(0.f, 0.0f); */ /* Points[1] = v2(1.0f, 1.0f); */ - const s32 PointCount = 3; + const s32 PointCount = 5; v2 Points[PointCount]; Points[0] = v2(0.0f, 0.0f); - Points[1] = v2(0.2f, 1.0f); - Points[2] = v2(1.0f, 1.0f); - - // Pretty nice - - /* s32 PointCount = 6; */ - /* v2 Points[6]; */ - /* Points[0] = v2(1.0f, 1.0f); */ - /* Points[1] = v2(0.7f, 0.7f); */ - /* Points[2] = v2(0.65f, 0.43f); */ - /* Points[3] = v2(0.6f, 0.4f); */ - /* Points[4] = v2(0.5f, 0.2f); */ - /* Points[5] = v2(0.0f, 0.1f); */ - - // Pillar-y - /* v2 Points[] = */ - /* { */ - /* {{2.0f, 0.5f }}, */ - /* {{0.6f, 0.3f }}, */ - /* {{0.1f, 0.2f }}, */ - /* {{0.05f, 0.45f }}, */ - /* {{0.0f , 0.5f }}, */ - /* }; */ - -/* v2 Points[] = */ -/* { */ -/* {{1.0f, 0.0f }}, */ -/* {{0.9f, 1.0f }}, */ -/* {{0.6f, 0.3f }}, */ -/* {{0.1f, 0.1f }}, */ -/* {{0.05f, 0.45f }}, */ -/* {{0.0f , 0.5f }}, */ -/* }; */ - + Points[1] = v2(0.25f, 0.25f); + Points[2] = v2(0.5f, 0.5f); + Points[3] = v2(0.75f, 0.75f); + Points[4] = v2(1.0f, 1.0f); - r32 Result = Points[0].x; - for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) + /* const s32 PointCount = 5; */ + /* v2 Points[PointCount]; */ + /* Points[0] = v2(0.0f, 0.0f); */ + /* Points[1] = v2(0.2f, 0.5f); */ + /* Points[2] = v2(0.22f,0.46f); */ + /* Points[3] = v2(0.4f, 0.8f); */ + /* Points[4] = v2(1.0f, 1.0f); */ + + f32 Result = -1.f; + v2 PrevP = Points[0]; + for (int PointIndex = 1; PointIndex < PointCount; ++PointIndex) { - v2 P = Points[PointIndex]; + v2 NextP = Points[PointIndex]; - if (tx >= P.x) + if (SampleX >= PrevP.x && SampleX < NextP.x) { - v2 PNext = Points[PointIndex + 1]; - v2 Tmp = P; +#if 0 + Result = NextP.y; + /* Result = PrevP.y; */ +#else + r32 Range = PrevP.x - NextP.x; + r32 t = Clamp01((SampleX-NextP.x) / Range); + Result = CosineInterpolate(t, NextP.y, PrevP.y); + /* Result = mix(NextP.y, Next.y, t); */ +#endif - r32 Range = PNext.x - P.x; - r32 t = Clamp01((tx-P.x) / Range); - Result = CosineInterpolate(t, P.y, PNext.y); - /* Result = mix(P.y, PNext.y, t); */ break; } + + PrevP = NextP; } /* Result = abs(max(Result, 1.0)); */ return Result; } +b32 +WithinTolerance(f32 Epsilon, f32 A, f32 B) +{ + b32 Result = (A+Epsilon > B && A-Epsilon < B); + return Result; +} + + void main() { - Output = V4(0,0,0,1); - - /* Output.rg = v2(1.f, 1.f); */ - Output.xy = UV; - /* Output.r = gl_FragCoord.r/512.f; */ - /* Output.g = gl_FragCoord.g/256.f; */ - /* Output.rg = gl_FragCoord.rg/128.f; */ - /* Output.rg = UV; */ + Output = V4(1,1,1,1); + + + f32 Mapped = MapToFinal(UV.x); + + if (Mapped == -1.f) + { + Output.rgb = v3(1.0f, 0.f, 1.0f); + } + else + { + if (WithinTolerance(0.01f, Mapped, UV.y)) + { + Output.rgb = v3(0.2f, 0.2f, 0.2f); + } + } + } From a374281aac00d2bc0a14a3c6b3a2e11879763fc1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 11 Oct 2025 14:13:40 -0700 Subject: [PATCH 344/421] Hacking on steep_ravines --- jesse.make.sh | 2 +- shaders/cosine_interp_vis.fragmentshader | 26 +- .../shaping/7_steep_ravines.fragmentshader | 226 +++++------------- 3 files changed, 75 insertions(+), 179 deletions(-) diff --git a/jesse.make.sh b/jesse.make.sh index c4b277014..687048d17 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/cosine_interp_vis.fragmentshader b/shaders/cosine_interp_vis.fragmentshader index d2e6e7ea1..aedf25326 100644 --- a/shaders/cosine_interp_vis.fragmentshader +++ b/shaders/cosine_interp_vis.fragmentshader @@ -111,13 +111,13 @@ f32 MapToFinal(f32 SampleX) /* Points[0] = v2(0.f, 0.0f); */ /* Points[1] = v2(1.0f, 1.0f); */ - const s32 PointCount = 5; - v2 Points[PointCount]; - Points[0] = v2(0.0f, 0.0f); - Points[1] = v2(0.25f, 0.25f); - Points[2] = v2(0.5f, 0.5f); - Points[3] = v2(0.75f, 0.75f); - Points[4] = v2(1.0f, 1.0f); + /* const s32 PointCount = 5; */ + /* v2 Points[PointCount]; */ + /* Points[0] = v2(0.0f, 0.0f); */ + /* Points[1] = v2(0.25f, 0.25f); */ + /* Points[2] = v2(0.5f, 0.5f); */ + /* Points[3] = v2(0.75f, 0.75f); */ + /* Points[4] = v2(1.0f, 1.0f); */ /* const s32 PointCount = 5; */ @@ -128,6 +128,18 @@ f32 MapToFinal(f32 SampleX) /* Points[3] = v2(0.4f, 0.8f); */ /* Points[4] = v2(1.0f, 1.0f); */ + + const s32 PointCount = 7; + v2 Points[PointCount]; + Points[0] = v2(0.0f, 0.0f); + Points[1] = v2(0.2f, 0.5f); + Points[2] = v2(0.22f,0.46f); + Points[3] = v2(0.4f, 0.8f); + Points[4] = v2(0.8f, 1.0f); + Points[5] = v2(0.9f, 0.0f); + Points[6] = v2(1.0f, 1.0f); + + f32 Result = -1.f; v2 PrevP = Points[0]; for (int PointIndex = 1; PointIndex < PointCount; ++PointIndex) diff --git a/shaders/terrain/shaping/7_steep_ravines.fragmentshader b/shaders/terrain/shaping/7_steep_ravines.fragmentshader index 6d4fcb04b..37a84dabc 100644 --- a/shaders/terrain/shaping/7_steep_ravines.fragmentshader +++ b/shaders/terrain/shaping/7_steep_ravines.fragmentshader @@ -4,99 +4,6 @@ uniform v3 ChunkResolution; in vec2 UV; out v4 Output; - - - -f32 -MapNoiseValueToFinal(f32 Value) -{ - // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about - /* v2 Points[] = */ - /* { */ - /* {{1.0f, 1.0f }}, */ - /* {{0.7f, 0.85f }}, */ - /* {{0.6f, 0.5f }}, */ - /* {{0.3f, 0.4f }}, */ - /* {{0.2f, 0.1f }}, */ - /* {{0.0f, 0.0f }}, */ - /* }; */ - - /* v2 Points[] = */ - /* { */ - /* {{1.0f, 1.0f }}, */ - /* {{0.5f, 0.7f }}, */ - /* {{0.35f, 0.43f }}, */ - /* {{0.3f, 0.4f }}, */ - /* {{0.2f, 0.1f }}, */ - /* {{0.0f, 0.0f }}, */ - /* }; */ - - const s32 PointCount = 3; - v2 Points[PointCount]; - - /* Points[0] = v2(1.0f, 1.0f); */ - /* Points[1] = v2(0.f, 0.0f); */ - - - // Steep - - Points[0] = v2(1.0f, 1.0f); - Points[1] = v2(0.5f, 0.85f); - Points[2] = v2(0.0f, 0.0f); - - // Pretty nice - - /* Points[0] = v2(1.0f, 1.0f); */ - /* Points[1] = v2(0.7f, 0.7f); */ - /* Points[2] = v2(0.65f, 0.43f); */ - /* Points[3] = v2(0.6f, 0.4f); */ - /* Points[4] = v2(0.5f, 0.2f); */ - /* Points[5] = v2(0.0f, 0.1f); */ - - // Pillar-y - - /* Points[0] = v2(2.0f, 0.5f); */ - /* Points[1] = v2(0.6f, 0.3f); */ - /* Points[2] = v2(0.1f, 0.2f); */ - /* Points[3] = v2(0.05f, 0.45f); */ - /* Points[4] = v2(0.0f , 0.5f); */ - -/* v2 Points[] = */ -/* { */ -/* {{1.0f, 0.0f }}, */ -/* {{0.9f, 1.0f }}, */ -/* {{0.6f, 0.3f }}, */ -/* {{0.1f, 0.1f }}, */ -/* {{0.05f, 0.45f }}, */ -/* {{0.0f , 0.5f }}, */ -/* }; */ - - - - r32 Result = Value; - for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) - { - v2 P = Points[PointIndex]; - - // This is sort of a hack to fix the degenerate case when the value is 0 or 1. - // TODO(Jesse): Make this branchless - if (Value == P.x) return P.y; - - if (Value > P.x) - { - v2 PNext = Points[PointIndex + 1]; - - r32 Range = PNext.x - P.x; - r32 t = (Value-P.x) / Range; - Result = mix(t, P.y, PNext.y); - break; - } - } - - Result = abs(max(Result, 1.0)); - return Result; -} - f32 RoundToNearestMultiple(f32 NumToRound, f32 Multiple) { @@ -108,98 +15,71 @@ RoundToNearestMultiple(f32 NumToRound, f32 Multiple) } -f32 MapToFinal(f32 tx) +f32 MapToFinal(f32 SampleX) { - /* Assert(Value <= 1.f); */ - /* Assert(Value >= 0.f); */ - - // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about - - /* v2 Points[] = */ - /* { */ - /* {{1.0f, 1.0f }}, */ - /* {{0.7f, 0.85f }}, */ - /* {{0.6f, 0.5f }}, */ - /* {{0.3f, 0.4f }}, */ - /* {{0.2f, 0.1f }}, */ - /* {{0.0f, 0.0f }}, */ - /* }; */ - - /* v2 Points[] = */ - /* { */ - /* {{1.0f, 1.0f }}, */ - /* {{0.5f, 0.7f }}, */ - /* {{0.35f, 0.43f }}, */ - /* {{0.3f, 0.4f }}, */ - /* {{0.2f, 0.1f }}, */ - /* {{0.0f, 0.0f }}, */ - /* }; */ /* const s32 PointCount = 2; */ /* v2 Points[PointCount]; */ /* Points[0] = v2(0.f, 0.0f); */ /* Points[1] = v2(1.0f, 1.0f); */ - const s32 PointCount = 3; - v2 Points[PointCount]; - Points[0] = v2(0.0f, 0.0f); - Points[1] = v2(0.2f, 1.0f); - Points[2] = v2(1.0f, 1.0f); - - // Pretty nice - - /* s32 PointCount = 6; */ - /* v2 Points[6]; */ - /* Points[0] = v2(1.0f, 1.0f); */ - /* Points[1] = v2(0.7f, 0.7f); */ - /* Points[2] = v2(0.65f, 0.43f); */ - /* Points[3] = v2(0.6f, 0.4f); */ - /* Points[4] = v2(0.5f, 0.2f); */ - /* Points[5] = v2(0.0f, 0.1f); */ - - // Pillar-y - /* v2 Points[] = */ - /* { */ - /* {{2.0f, 0.5f }}, */ - /* {{0.6f, 0.3f }}, */ - /* {{0.1f, 0.2f }}, */ - /* {{0.05f, 0.45f }}, */ - /* {{0.0f , 0.5f }}, */ - /* }; */ - -/* v2 Points[] = */ -/* { */ -/* {{1.0f, 0.0f }}, */ -/* {{0.9f, 1.0f }}, */ -/* {{0.6f, 0.3f }}, */ -/* {{0.1f, 0.1f }}, */ -/* {{0.05f, 0.45f }}, */ -/* {{0.0f , 0.5f }}, */ -/* }; */ - + /* const s32 PointCount = 5; */ + /* v2 Points[PointCount]; */ + /* Points[0] = v2(0.0f, 0.0f); */ + /* Points[1] = v2(0.25f, 0.25f); */ + /* Points[2] = v2(0.5f, 0.5f); */ + /* Points[3] = v2(0.75f, 0.75f); */ + /* Points[4] = v2(1.0f, 1.0f); */ - r32 Result = Points[0].x; - for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) + /* const s32 PointCount = 5; */ + /* v2 Points[PointCount]; */ + /* Points[0] = v2(0.0f, 0.0f); */ + /* Points[1] = v2(0.2f, 0.5f); */ + /* Points[2] = v2(0.22f,0.46f); */ + /* Points[3] = v2(0.4f, 0.8f); */ + /* Points[4] = v2(0.8f, 1.0f); */ + /* /1* Points[5] = v2(1.0f, 0.0f); *1/ */ + + const s32 PointCount = 7; + v2 Points[PointCount]; + Points[0] = v2(0.0f, 0.0f); + Points[1] = v2(0.2f, 0.5f); + Points[2] = v2(0.22f,0.46f); + Points[3] = v2(0.4f, 0.8f); + Points[4] = v2(0.8f, 1.0f); + Points[5] = v2(0.9f, 0.0f); + Points[6] = v2(1.0f, 1.0f); + + f32 Result = -1.f; + v2 PrevP = Points[0]; + for (int PointIndex = 1; PointIndex < PointCount; ++PointIndex) { - v2 P = Points[PointIndex]; + v2 NextP = Points[PointIndex]; - if (tx >= P.x) + if (SampleX >= PrevP.x && SampleX < NextP.x) { - v2 PNext = Points[PointIndex + 1]; - v2 Tmp = P; +#if 0 + Result = NextP.y; + /* Result = PrevP.y; */ +#else + r32 Range = PrevP.x - NextP.x; + r32 t = Clamp01((SampleX-NextP.x) / Range); + Result = CosineInterpolate(t, NextP.y, PrevP.y); + /* Result = mix(NextP.y, Next.y, t); */ +#endif - r32 Range = PNext.x - P.x; - r32 t = Clamp01((tx-P.x) / Range); - Result = CosineInterpolate(t, P.y, PNext.y); - /* Result = mix(P.y, PNext.y, t); */ break; } + + PrevP = NextP; } /* Result = abs(max(Result, 1.0)); */ return Result; } + + void main() { f32 x = floor(gl_FragCoord.x); @@ -218,23 +98,27 @@ void main() // { v3 Period = V3(1200.f); - float Amplitude = 400.f; + float Amplitude = 1800.f; /* f32 StartingZDepth = 10000; */ - f32 StartingZDepth = 2500; + f32 StartingZDepth = 2000; /* f32 StartingZDepth = 0; */ - s32 Octaves = 1; + s32 Octaves = 3; NoiseValue = StartingZDepth; v3 Deriv = v3(0.f); - f32 warp = 0.f; + /* f32 warp = 0.f; */ + + v3 warp = v3(gradient_noise_derivs(Basis).x); + /* NoiseValue += gn.x*Amplitude; */ + /* NoiseValue += MapToFinal((gn.x+1.f)/2.f)*Amplitude; */ + for (s32 Octave = 1; Octave <= Octaves; ++Octave) { v3 xyz = Basis / (Period/Octave); - v4 gn = gradient_noise_derivs(xyz+warp); /* NoiseValue += gn.x*(Amplitude/Octave); */ - NoiseValue += MapToFinal(gn.x)*(Amplitude/Octave); + NoiseValue += MapToFinal((gn.x+1.f)/2.f)*(Amplitude/Octave); } v3 Up = V3(0, 0, 1); From b60bdbc5c464c759ed901ec5257bfbb94c7951c6 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 11 Oct 2025 16:10:12 -0700 Subject: [PATCH 345/421] Random fafing on shader code --- external/bonsai_stdlib | 2 +- generated/are_equal_file_traversal_node.h | 2 +- ...lock_array_file_traversal_node_688853862.h | 2 +- generated/buffer_file_traversal_node.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 48 +++++++++++ .../flatten_block_array_file_traversal_node.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_Bxw4Q7AW.h | 1 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kv3WBTai.h | 1 + ...ead_primitive_from_native_file_803324607.h | 2 +- ...e_from_u8_cursor_little_endian_851742148.h | 58 ++++++------- generated/gen_read_primitive_u32.h | 2 +- generated/gen_read_primitive_u64.h | 2 +- generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- ...write_primitive_from_u8_stream_803324607.h | 2 +- generated/maybe_file_traversal_node.h | 2 +- shaders/cosine_interp_vis.fragmentshader | 65 -------------- .../shaping/7_steep_ravines.fragmentshader | 84 +------------------ src/engine/render/shadow_map.h | 2 +- 26 files changed, 102 insertions(+), 193 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 0bed598b5..bcb0adf24 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 0bed598b55279d5cb9922863f69244a33c31194e +Subproject commit bcb0adf24e6df9bfce6dcbb2564ca63589efb1c0 diff --git a/generated/are_equal_file_traversal_node.h b/generated/are_equal_file_traversal_node.h index fe3fa42c4..6f22dc1d3 100644 --- a/generated/are_equal_file_traversal_node.h +++ b/generated/are_equal_file_traversal_node.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/file.h:57:0 +// external/bonsai_stdlib/src/file.h:28:0 link_internal b32 AreEqual(file_traversal_node *Thing1, file_traversal_node *Thing2) diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index dc389f070..e27ae7bc9 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/file.cpp:6:0 +// external/bonsai_stdlib/src/file.cpp:8:0 diff --git a/generated/buffer_file_traversal_node.h b/generated/buffer_file_traversal_node.h index 687b1454f..b1a80e173 100644 --- a/generated/buffer_file_traversal_node.h +++ b/generated/buffer_file_traversal_node.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/file.cpp:3:0 +// external/bonsai_stdlib/src/file.cpp:5:0 struct file_traversal_node_buffer { diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 8ea802b26..eb5f34f04 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -146,6 +146,54 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + } + + + { + + + + cs MemberName = CSz("ShaderHeaderFile"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(hot_reloadable_file*, &Element->ShaderHeaderFile), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("ShaderHeaderCode"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(ansi_stream*, &Element->ShaderHeaderCode), + MemberName, + Params + ); + + + + + + + + + } diff --git a/generated/flatten_block_array_file_traversal_node.h b/generated/flatten_block_array_file_traversal_node.h index 933b131e0..b27ed38de 100644 --- a/generated/flatten_block_array_file_traversal_node.h +++ b/generated/flatten_block_array_file_traversal_node.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/file.cpp:9:0 +// external/bonsai_stdlib/src/file.cpp:11:0 link_internal file_traversal_node_buffer Flatten(file_traversal_node_block_array *Array, memory_arena *Memory) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 848c8a70c..83bfca94a 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -228,6 +228,7 @@ + struct render_to_texture_async_params; diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 37382952b..bd7ee0f8a 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -302,6 +302,7 @@ + link_internal void diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 84718fedd..50e66ef8c 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -228,6 +228,7 @@ + render_to_texture_async_params render_to_texture_async_params; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 408522edd..e2c842e40 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -228,6 +228,7 @@ + type_render_to_texture_async_params, diff --git a/generated/gen_read_primitive_from_native_file_803324607.h b/generated/gen_read_primitive_from_native_file_803324607.h index 8d2883a39..f02e7a2d7 100644 --- a/generated/gen_read_primitive_from_native_file_803324607.h +++ b/generated/gen_read_primitive_from_native_file_803324607.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:431:0 +// external/bonsai_stdlib/src/binary_parser.cpp:441:0 link_internal s8 Read_s8(native_file *File) diff --git a/generated/gen_read_primitive_from_u8_cursor_little_endian_851742148.h b/generated/gen_read_primitive_from_u8_cursor_little_endian_851742148.h index 52f45d8c6..e7aaf63d5 100644 --- a/generated/gen_read_primitive_from_u8_cursor_little_endian_851742148.h +++ b/generated/gen_read_primitive_from_u8_cursor_little_endian_851742148.h @@ -1,20 +1,20 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:503:0 +// external/bonsai_stdlib/src/binary_parser.cpp:513:0 -inline s8 +link_internal s8 Read_s8(u8 *Source) { s8 Result = *(s8*)Source; return Result; } -inline s8 +link_internal s8 Read_s8(s8 *Source) { s8 Result = *Source; return Result; } -inline s8 +link_internal s8 Read_s8(u8_stream *Source) { s8 Result = Read_s8(Source->At); @@ -23,7 +23,7 @@ Read_s8(u8_stream *Source) return Result; } -inline s8* +link_internal s8* ReadArray_s8(u8_stream *Source, u32 Count) { s8 *Result = (s8*)Source->At; @@ -31,21 +31,21 @@ ReadArray_s8(u8_stream *Source, u32 Count) Assert(Source->At <= Source->End); return Result; } -inline s16 +link_internal s16 Read_s16(u8 *Source) { s16 Result = *(s16*)Source; return Result; } -inline s16 +link_internal s16 Read_s16(s16 *Source) { s16 Result = *Source; return Result; } -inline s16 +link_internal s16 Read_s16(u8_stream *Source) { s16 Result = Read_s16(Source->At); @@ -54,7 +54,7 @@ Read_s16(u8_stream *Source) return Result; } -inline s16* +link_internal s16* ReadArray_s16(u8_stream *Source, u32 Count) { s16 *Result = (s16*)Source->At; @@ -62,21 +62,21 @@ ReadArray_s16(u8_stream *Source, u32 Count) Assert(Source->At <= Source->End); return Result; } -inline u16 +link_internal u16 Read_u16(u8 *Source) { u16 Result = *(u16*)Source; return Result; } -inline u16 +link_internal u16 Read_u16(u16 *Source) { u16 Result = *Source; return Result; } -inline u16 +link_internal u16 Read_u16(u8_stream *Source) { u16 Result = Read_u16(Source->At); @@ -85,7 +85,7 @@ Read_u16(u8_stream *Source) return Result; } -inline u16* +link_internal u16* ReadArray_u16(u8_stream *Source, u32 Count) { u16 *Result = (u16*)Source->At; @@ -93,21 +93,21 @@ ReadArray_u16(u8_stream *Source, u32 Count) Assert(Source->At <= Source->End); return Result; } -inline s32 +link_internal s32 Read_s32(u8 *Source) { s32 Result = *(s32*)Source; return Result; } -inline s32 +link_internal s32 Read_s32(s32 *Source) { s32 Result = *Source; return Result; } -inline s32 +link_internal s32 Read_s32(u8_stream *Source) { s32 Result = Read_s32(Source->At); @@ -116,7 +116,7 @@ Read_s32(u8_stream *Source) return Result; } -inline s32* +link_internal s32* ReadArray_s32(u8_stream *Source, u32 Count) { s32 *Result = (s32*)Source->At; @@ -124,21 +124,21 @@ ReadArray_s32(u8_stream *Source, u32 Count) Assert(Source->At <= Source->End); return Result; } -inline u32 +link_internal u32 Read_u32(u8 *Source) { u32 Result = *(u32*)Source; return Result; } -inline u32 +link_internal u32 Read_u32(u32 *Source) { u32 Result = *Source; return Result; } -inline u32 +link_internal u32 Read_u32(u8_stream *Source) { u32 Result = Read_u32(Source->At); @@ -147,7 +147,7 @@ Read_u32(u8_stream *Source) return Result; } -inline u32* +link_internal u32* ReadArray_u32(u8_stream *Source, u32 Count) { u32 *Result = (u32*)Source->At; @@ -155,21 +155,21 @@ ReadArray_u32(u8_stream *Source, u32 Count) Assert(Source->At <= Source->End); return Result; } -inline s64 +link_internal s64 Read_s64(u8 *Source) { s64 Result = *(s64*)Source; return Result; } -inline s64 +link_internal s64 Read_s64(s64 *Source) { s64 Result = *Source; return Result; } -inline s64 +link_internal s64 Read_s64(u8_stream *Source) { s64 Result = Read_s64(Source->At); @@ -178,7 +178,7 @@ Read_s64(u8_stream *Source) return Result; } -inline s64* +link_internal s64* ReadArray_s64(u8_stream *Source, u32 Count) { s64 *Result = (s64*)Source->At; @@ -186,21 +186,21 @@ ReadArray_s64(u8_stream *Source, u32 Count) Assert(Source->At <= Source->End); return Result; } -inline u64 +link_internal u64 Read_u64(u8 *Source) { u64 Result = *(u64*)Source; return Result; } -inline u64 +link_internal u64 Read_u64(u64 *Source) { u64 Result = *Source; return Result; } -inline u64 +link_internal u64 Read_u64(u8_stream *Source) { u64 Result = Read_u64(Source->At); @@ -209,7 +209,7 @@ Read_u64(u8_stream *Source) return Result; } -inline u64* +link_internal u64* ReadArray_u64(u8_stream *Source, u32 Count) { u64 *Result = (u64*)Source->At; diff --git a/generated/gen_read_primitive_u32.h b/generated/gen_read_primitive_u32.h index 851e75fd8..63ec89947 100644 --- a/generated/gen_read_primitive_u32.h +++ b/generated/gen_read_primitive_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:562:0 +// external/bonsai_stdlib/src/binary_parser.cpp:572:0 link_internal bool Read_u32(u8_cursor *Cursor, u32 *Dest) diff --git a/generated/gen_read_primitive_u64.h b/generated/gen_read_primitive_u64.h index 485d68bd1..d83fcf2c5 100644 --- a/generated/gen_read_primitive_u64.h +++ b/generated/gen_read_primitive_u64.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:565:0 +// external/bonsai_stdlib/src/binary_parser.cpp:575:0 link_internal bool Read_u64(u8_cursor *Cursor, u64 *Dest) diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 38e81c73b..03f032df5 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:346:0 +// external/bonsai_stdlib/src/shader.cpp:355:0 b32 SetShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 3e76ad75a..8a2e63702 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:361:0 +// external/bonsai_stdlib/src/shader.cpp:370:0 b32 SetShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index 47f26a376..3af76ffa3 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:358:0 +// external/bonsai_stdlib/src/shader.cpp:367:0 b32 SetShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index 7d1e0b107..d224083d9 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:343:0 +// external/bonsai_stdlib/src/shader.cpp:352:0 b32 SetShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 7a1c16156..2e4d19a3e 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:355:0 +// external/bonsai_stdlib/src/shader.cpp:364:0 b32 SetShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index c27c41d4b..f08a02a8d 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:349:0 +// external/bonsai_stdlib/src/shader.cpp:358:0 b32 SetShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index bd944ab0f..898af2ffa 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:352:0 +// external/bonsai_stdlib/src/shader.cpp:361:0 b32 SetShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) diff --git a/generated/gen_write_primitive_from_u8_stream_803324607.h b/generated/gen_write_primitive_from_u8_stream_803324607.h index 8115f20b1..7bd10db1b 100644 --- a/generated/gen_write_primitive_from_u8_stream_803324607.h +++ b/generated/gen_write_primitive_from_u8_stream_803324607.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:654:0 +// external/bonsai_stdlib/src/binary_parser.cpp:664:0 link_internal b32 Write(u8_stream *Dest, s8 *Src) diff --git a/generated/maybe_file_traversal_node.h b/generated/maybe_file_traversal_node.h index 432f93e21..2bb6c507b 100644 --- a/generated/maybe_file_traversal_node.h +++ b/generated/maybe_file_traversal_node.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/file.h:60:0 +// external/bonsai_stdlib/src/file.h:31:0 struct maybe_file_traversal_node { diff --git a/shaders/cosine_interp_vis.fragmentshader b/shaders/cosine_interp_vis.fragmentshader index aedf25326..456d6aa46 100644 --- a/shaders/cosine_interp_vis.fragmentshader +++ b/shaders/cosine_interp_vis.fragmentshader @@ -103,71 +103,6 @@ RoundToNearestMultiple(f32 NumToRound, f32 Multiple) return NumToRound + Multiple - Remainder; } - -f32 MapToFinal(f32 SampleX) -{ - /* const s32 PointCount = 2; */ - /* v2 Points[PointCount]; */ - /* Points[0] = v2(0.f, 0.0f); */ - /* Points[1] = v2(1.0f, 1.0f); */ - - /* const s32 PointCount = 5; */ - /* v2 Points[PointCount]; */ - /* Points[0] = v2(0.0f, 0.0f); */ - /* Points[1] = v2(0.25f, 0.25f); */ - /* Points[2] = v2(0.5f, 0.5f); */ - /* Points[3] = v2(0.75f, 0.75f); */ - /* Points[4] = v2(1.0f, 1.0f); */ - - - /* const s32 PointCount = 5; */ - /* v2 Points[PointCount]; */ - /* Points[0] = v2(0.0f, 0.0f); */ - /* Points[1] = v2(0.2f, 0.5f); */ - /* Points[2] = v2(0.22f,0.46f); */ - /* Points[3] = v2(0.4f, 0.8f); */ - /* Points[4] = v2(1.0f, 1.0f); */ - - - const s32 PointCount = 7; - v2 Points[PointCount]; - Points[0] = v2(0.0f, 0.0f); - Points[1] = v2(0.2f, 0.5f); - Points[2] = v2(0.22f,0.46f); - Points[3] = v2(0.4f, 0.8f); - Points[4] = v2(0.8f, 1.0f); - Points[5] = v2(0.9f, 0.0f); - Points[6] = v2(1.0f, 1.0f); - - - f32 Result = -1.f; - v2 PrevP = Points[0]; - for (int PointIndex = 1; PointIndex < PointCount; ++PointIndex) - { - v2 NextP = Points[PointIndex]; - - if (SampleX >= PrevP.x && SampleX < NextP.x) - { -#if 0 - Result = NextP.y; - /* Result = PrevP.y; */ -#else - r32 Range = PrevP.x - NextP.x; - r32 t = Clamp01((SampleX-NextP.x) / Range); - Result = CosineInterpolate(t, NextP.y, PrevP.y); - /* Result = mix(NextP.y, Next.y, t); */ -#endif - - break; - } - - PrevP = NextP; - } - - /* Result = abs(max(Result, 1.0)); */ - return Result; -} - b32 WithinTolerance(f32 Epsilon, f32 A, f32 B) { diff --git a/shaders/terrain/shaping/7_steep_ravines.fragmentshader b/shaders/terrain/shaping/7_steep_ravines.fragmentshader index 37a84dabc..1a8ff626d 100644 --- a/shaders/terrain/shaping/7_steep_ravines.fragmentshader +++ b/shaders/terrain/shaping/7_steep_ravines.fragmentshader @@ -4,82 +4,6 @@ uniform v3 ChunkResolution; in vec2 UV; out v4 Output; -f32 -RoundToNearestMultiple(f32 NumToRound, f32 Multiple) -{ - f32 Remainder = mod(NumToRound, Multiple); - if (Remainder == 0) - return NumToRound; - - return NumToRound + Multiple - Remainder; -} - - -f32 MapToFinal(f32 SampleX) -{ - - /* const s32 PointCount = 2; */ - /* v2 Points[PointCount]; */ - /* Points[0] = v2(0.f, 0.0f); */ - /* Points[1] = v2(1.0f, 1.0f); */ - - /* const s32 PointCount = 5; */ - /* v2 Points[PointCount]; */ - /* Points[0] = v2(0.0f, 0.0f); */ - /* Points[1] = v2(0.25f, 0.25f); */ - /* Points[2] = v2(0.5f, 0.5f); */ - /* Points[3] = v2(0.75f, 0.75f); */ - /* Points[4] = v2(1.0f, 1.0f); */ - - - /* const s32 PointCount = 5; */ - /* v2 Points[PointCount]; */ - /* Points[0] = v2(0.0f, 0.0f); */ - /* Points[1] = v2(0.2f, 0.5f); */ - /* Points[2] = v2(0.22f,0.46f); */ - /* Points[3] = v2(0.4f, 0.8f); */ - /* Points[4] = v2(0.8f, 1.0f); */ - /* /1* Points[5] = v2(1.0f, 0.0f); *1/ */ - - const s32 PointCount = 7; - v2 Points[PointCount]; - Points[0] = v2(0.0f, 0.0f); - Points[1] = v2(0.2f, 0.5f); - Points[2] = v2(0.22f,0.46f); - Points[3] = v2(0.4f, 0.8f); - Points[4] = v2(0.8f, 1.0f); - Points[5] = v2(0.9f, 0.0f); - Points[6] = v2(1.0f, 1.0f); - - f32 Result = -1.f; - v2 PrevP = Points[0]; - for (int PointIndex = 1; PointIndex < PointCount; ++PointIndex) - { - v2 NextP = Points[PointIndex]; - - if (SampleX >= PrevP.x && SampleX < NextP.x) - { -#if 0 - Result = NextP.y; - /* Result = PrevP.y; */ -#else - r32 Range = PrevP.x - NextP.x; - r32 t = Clamp01((SampleX-NextP.x) / Range); - Result = CosineInterpolate(t, NextP.y, PrevP.y); - /* Result = mix(NextP.y, Next.y, t); */ -#endif - - break; - } - - PrevP = NextP; - } - - /* Result = abs(max(Result, 1.0)); */ - return Result; -} - - void main() { f32 x = floor(gl_FragCoord.x); @@ -102,22 +26,20 @@ void main() /* f32 StartingZDepth = 10000; */ f32 StartingZDepth = 2000; /* f32 StartingZDepth = 0; */ - s32 Octaves = 3; + s32 Octaves = 1; NoiseValue = StartingZDepth; v3 Deriv = v3(0.f); /* f32 warp = 0.f; */ - v3 warp = v3(gradient_noise_derivs(Basis).x); - /* NoiseValue += gn.x*Amplitude; */ - /* NoiseValue += MapToFinal((gn.x+1.f)/2.f)*Amplitude; */ + /* v3 warp = v3(gradient_noise_derivs(Basis).x); */ + v3 warp = v3(0.f); for (s32 Octave = 1; Octave <= Octaves; ++Octave) { v3 xyz = Basis / (Period/Octave); v4 gn = gradient_noise_derivs(xyz+warp); - /* NoiseValue += gn.x*(Amplitude/Octave); */ NoiseValue += MapToFinal((gn.x+1.f)/2.f)*(Amplitude/Octave); } diff --git a/src/engine/render/shadow_map.h b/src/engine/render/shadow_map.h index 660d129b2..0704a4f5d 100644 --- a/src/engine/render/shadow_map.h +++ b/src/engine/render/shadow_map.h @@ -56,7 +56,7 @@ InitializeShadowRenderGroup(graphics *Graphics, shadow_render_group *SG, v2i Sha GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); GetGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); - InitializeShadowMapShader( &SG->Shader , IdentityMatrix, IdentityMatrix, &Graphics->MinClipP_worldspace, &Graphics->MaxClipP_worldspace ); + Ensure(InitializeShadowMapShader( &SG->Shader , IdentityMatrix, IdentityMatrix, &Graphics->MinClipP_worldspace, &Graphics->MaxClipP_worldspace )); AssertNoGlErrors; return true; From af86b77e7fc950ad323d8ab4a8f687b17f2fc1de Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 12 Oct 2025 13:27:07 -0700 Subject: [PATCH 346/421] Draw nicer line in the easing window --- examples/terrain_gen/game.cpp | 3 +-- shaders/cosine_interp_vis.fragmentshader | 13 ++++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index c345e5578..a1a7eba5f 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -66,8 +66,7 @@ BONSAI_API_MAIN_THREAD_CALLBACK() { window_layout *Window = GetOrCreateWindow(Ui, UiId("EasingWindow")); PushWindowStart(Ui, Window); - /* PushUntexturedQuad(Ui, V2(0), V2(128), zDepth_Text, 0, {}, UiElementLayoutFlag_Default); */ - PushUntexturedQuad(Ui, V2(0), V2(128), zDepth_Text, 0, {}, UiElementLayoutFlag_Default, &GameState->Shader); + PushUntexturedQuad(Ui, V2(0), V2(256), zDepth_Text, 0, {}, UiElementLayoutFlag_Default, &GameState->Shader); PushWindowEnd(Ui, Window); } diff --git a/shaders/cosine_interp_vis.fragmentshader b/shaders/cosine_interp_vis.fragmentshader index 456d6aa46..d8617a7e9 100644 --- a/shaders/cosine_interp_vis.fragmentshader +++ b/shaders/cosine_interp_vis.fragmentshader @@ -124,10 +124,21 @@ void main() } else { + r32 ThicknessInUVCoordinates = 0.01f; +#if 0 + if (Mapped > UV.y) + { + Output.rgb = V3(0.2); + } +#else if (WithinTolerance(0.01f, Mapped, UV.y)) { - Output.rgb = v3(0.2f, 0.2f, 0.2f); + r32 Dist = abs(UV.y - Mapped); + + r32 t = Dist/ThicknessInUVCoordinates; + Output.rgb = mix(v3(0), V3(1), t); } +#endif } } From 6fc4abef2c5531050dfb9fcd4f5cea54e5003cf8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 13 Oct 2025 09:32:09 -0700 Subject: [PATCH 347/421] Fafing on shaders, add Discord link to readme --- examples/terrain_gen/game.cpp | 16 +- external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- jesse.bonsai.rdbg | Bin 16929 -> 17132 bytes readme.md | 4 + shaders/cosine_interp_vis.fragmentshader | 144 ------------------ shaders/curve_remap_visualizer.fragmentshader | 43 ++++++ .../decoration/cliffy_hills.fragmentshader | 60 +++++++- .../shaping/1_FBM_large.fragmentshader | 51 +++++++ .../shaping/3_cliffy_hills.fragmentshader | 96 +----------- .../shaping/7_steep_ravines.fragmentshader | 2 +- 13 files changed, 172 insertions(+), 252 deletions(-) delete mode 100644 shaders/cosine_interp_vis.fragmentshader create mode 100644 shaders/curve_remap_visualizer.fragmentshader create mode 100644 shaders/terrain/shaping/1_FBM_large.fragmentshader diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index a1a7eba5f..ded4c6894 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -45,13 +45,25 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() CameraGhost->P.WorldP = VisibleRegion/2; CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); - CompileShaderPair_Async(RenderQ, &GameState->Shader, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "cosine_interp_vis.fragmentshader"), True, True, &GameState->ShaderCompileSuccess); + CompileShaderPair_Async( RenderQ, + &GameState->Shader, + CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), + CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader"), + True, True, &GameState->ShaderCompileSuccess); SpawnEntity(CameraGhost); return GameState; } +#define MAX_EASING_POINTS 8 + +struct easing_function +{ + cs Name; + v2 Points[MAX_EASING_POINTS]; + u32 PointCount; +}; BONSAI_API_MAIN_THREAD_CALLBACK() { @@ -64,7 +76,7 @@ BONSAI_API_MAIN_THREAD_CALLBACK() f32 Speed = 80.f; { - window_layout *Window = GetOrCreateWindow(Ui, UiId("EasingWindow")); + window_layout *Window = GetOrCreateWindow(Ui, "Easing Window"); PushWindowStart(Ui, Window); PushUntexturedQuad(Ui, V2(0), V2(256), zDepth_Text, 0, {}, UiElementLayoutFlag_Default, &GameState->Shader); PushWindowEnd(Ui, Window); diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index bcb0adf24..7168610fa 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit bcb0adf24e6df9bfce6dcbb2564ca63589efb1c0 +Subproject commit 7168610fae5efa6dadb56632b50a827d928cdee2 diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 9705aeb13..79402e2fd 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2507:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2520:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 5ce843d34..16ff3d103 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3605:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3618:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 705d1d0e9..f81b942b1 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2460:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2473:0 case type_ui_render_command_window_start: { diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 9d6b2b64d1cba24dc62949ef979d2717d68fe9e4..9f60aeb9b45991e2d5821194a9286c58158f4d1f 100644 GIT binary patch delta 2526 zcmZWrYiOI-8Q!rjpY-WsT`eoVNs$s;axB}5FS2}z;@EML#!HiIw9T?;viv!p7G1pW zlhV3mV}TXA!NBqZ`?q25$LL_Jp@C8;?Ho23>wYX5-57(V4(pFmRu(AqU+TT*e6lw- zfzUbcIp;m^dEV!JUhRC3{qr@pd67+l^(OFXNOI|FVYT*hzEW6EsRf*l4P$?H9J>?q zwsK)Z(NgLx87FXORz{mGfgevew@eNU%=TcRvk%*yGTLPsk7s0djW*JTwk~YVgxT|W zAP+R31u!uaV#|DTaP}Y5Ui>=LhmnCUvtHBcco2#TN0+BVxYEs?I>?P5!D&B`U1Vnw zO%7rt8^jN?&#^R`*)v;NGrN3v-M|c&ZkAK(6)|d*uHP(UX6!n<%I6NcoRTO~Yoz_HjG=dTS=*U;ZF_ zfo2zRqr;8YA_8K&UaG9-3%6fM;}6maoQhabutqufSRRqF=udK+S-kj>l(ZCUWqKCh zTJu}c91ml6x(9{f9y~E6(L3yB&tWINgilivQv^EuL(|w!S@7qfHMS@$Zx2OSMT{yZ z7VyWRA$)XVmQ`Dp^YlDUhyB4t6s?o^-Jpw|Axj$H8Jxw)U>A0hYiyV^)V@O5sEF7i z$uF~lIQMa421ol0?u`tZ@$-ZavBXPkUaVRZJ%?Q2t9w01q;7Zn!0EWm9-7(#a--Ff<|_s zP^2_dg^mn#!xOPkA#myVO`n&FW{P(4+2dXZ_Dm`1R{mQJrJ;a({Y9@$z|ty|FM86r z-?J=$o((zS2@k^EBk^BzMbTC4b!YI??s?oLSutYfjJEn(WvOrIbwyBtBcHJr)=Mpb zZQV|`zyaRva^vIfB<^&{Z1Nzvxh@|b9$BJ5NknYBBep5<4C9wP`9Kzjjn(B{}wj9o2w_mcZ)T(-+B!GF^8Er9clysFqlk@sUwXQ09 zNymO@k;E=XsQu5vrGY4_aT$$}AN~-X>qrZ(ttu;xn;bxUUDcGrDybBI8&$NyqR+kU zOvPsK0?q`NiOo6O4~s*g|QIL3=xrdgxJD`!*`lBVdjhE`Pc!|LZcbAdxCbR$cb z2-y;KN40NfOZ?t3zn4=C@B5@SbwnileV>f^Nq%QHejjvV#Twx^I$H74mFM`$&%Hjv zjI-knZvcPl%bGQk%tNu~Fb{hDMA!#`8HzonUK0Sn?ipuAp)fg5-(e-+Gkft3=El=@ z8_9VBt+}mITUAJFMWO9>Ia(o_h%-1H7?tXZrWHz6!N=th=^#{Myo?X~4GHnM1H9s= z@E2D*yCQDhbh+6niY85c&5AjfjIHrb+%tKp*SYbDvkT^|z#Kmub8yPZx}vQrx)3Tt z%ifx{dgm7onfh1)53Lg3as=4|@oE%hM+XzR!LY+YYMl^`^fTEn!pUf_@7J>-HAi>I~#yK0z%_@&Lp zUJ~XRTMUn+QStIA%-9^*mAq`0HrlGSlCGpwLyV3|K~iZhOOLG{3UPsM+KDGHPtD|s zWs;gSpZ!esIm^mzrJPrZyNZTU%Nn`n?`^ll@i#M1-4HW~^lh`;(i?}_g_ZsxILz)= z3wdCQh(v3q|${oXAPWIW! U#tuF-v2yxd=YPBVH`hcFB>(^b delta 2402 zcmY*bYiuJ|74Eg;=lC_T9cN=ZPBsr`>}2BDdDxD3y-9bw+3hYQyta|5dL3tyacjq3 zKbFFxYF8?M+jKu6q?Sh))IU6=tXioc5CkD1QSqnH3L#LN3M3Gsh^YS&=iYI$CDO!q z?&I8ZzVn^$%)h?Q9=yo*udxd_cIWVp(`k&Pa=WdyI%=ia{0wfH3i!skAp0ynN?peF za}v8sqa2P40es$~V80N@ug)m=g*kx#EIaYJLJ)5*KgBN7$tiqn3Q3FE>{4bSn@y`a z9)uDoEj!qgw5q_jJi#uBeZR?%;C^hzRogCgo7?4%rs|8B8&L3a-VJwJb?D`7t;IdU zgWQ+sQP9cFu$%ZOIE_GVi9JD1DfmaGAAibvSO#)>TB??7)vs#&&}FfDDLaamU%8(R zV}I!~Tf-|$i@38Cgn4O&Oy;qTaWlU}qUkJMH;eBKIan3N`AwMSi`*OhJrl+! zQ3a(rCw@f!vqS=W8Hrt_*pisaM8xV*Izn#7@Vd{5o6LhBr=1v!(9X0SzVtj>!MpLi zq&?s1wuC!8aZ`rPxfm<<-iAb&hpG>WITt}sY4_<`xml`f^+xL}9IBkS_D+C|rEv#Y|b-_A-bMR3gaiA>C$$)hyuqGWPv4A0sGA&v?%4%Gox5wp8$4E>bqf6gqB z|9MNd`gFI7^E0dWXD+b3Nb!F|ev`f?Ks%W3CknnBzrdlpD5gG`a+`F1se+@V6E7yy zL@iF&c2X8}N+lh5!!?Mb#3WJk*sa1Hb>gl&D9D`0?<5B~zd#t=n<;X;d{98lX~laX zp2M(hx5neSBFs)Hej*dU;Dae&Z*(y2McOvP_u|@=hw#YTJ9SDc z-^LOsj@y`^GCVX&i_L!?bFjzB(FJ^aOeQB!T>j!%zsR$K>k*ropuxe}HBh?U%~rKu z?No1TZGL?ZY;(C;#fD{+@bUG)w<3I2<~W_!hmpelQJ%sCo*A`^-~CaWNzaI=U(Q?Y z6}`LnoT^_T@1C$#OSdzsKFt@cb*-(7pz`+HTBXxy886m$hq6$|ek_mHZ~{M%NnpVd z9C#&px7jV#%gv^?UE1pI>}V~haTV8NUXhKI)NHgVlE$7&>7aDmj4RS78L*dj%9Rrt zl6T8>t)!8aN~g`avLf&s86G5@S2+zWl}4@6!iTO1_L&S`1iR4?m4<=Q$Z4hn$k-IT z5Q$ML)A)UOgKh9akqq4t0ATjas8Q(QXiufihJ&XW{lm~8g6Kw45dkfpElU) zsSrIHHI0I=v>I(Pwsv~7IUY1~8GabeJL=_5tNOgE-w<{B>Y$&>kvlu#_EKS7prA5% z%f^j6a5ppxEuX;E5SN9yfh1-Uc3w-=2YNJre;{yDPkr_B&JNUp^Ee8w6KxFD`gJgh zl_2R}u*k}W=m!eCnUKoe37q91I<{(!MqOyjJ)eRP{pUy_FA_x!E%Tz{&%);qvuDN3 z_xdlfJ@5(w-@-0%eIaz@$$8gWL!!)t;2fk%%shd@GAypRM-#SE^Y5dIV zVTM$GY;vLFjrM9Jm9&}+<+q8%5@w=xd8|BYqhG%6arSnXJT?+(p(RLoBNa-?Zh;rW4n;HhX_XA zxQ6{!r|5-St!`V#C_(my%}c$BFFtFNg(z(CUfHTvo+D8xo*c9BV;pe9Xb7)az4*kU zJ#ha5?8lhn*H?IV7Ik(5|O=K{Kb6LRG-IjbQU-I0+!pvR%-1eY&ZH!M7<45 zlD;(JB#7MX3+51wj@@~zn=Moc3Vm-(p=tU8wVY>It{0up!liZd)RCXC=%-rg;G;;9 zWG=1P=()1j>~qM35P3oX2!#nB#u^OF;Z#N M2W9nbzVWgD0SK%Ai~s-t diff --git a/readme.md b/readme.md index d4a5037a5..e9d4c3e44 100644 --- a/readme.md +++ b/readme.md @@ -32,6 +32,10 @@ for your platform of your choice (as long as your platform of choice is Windows ### [Controls](docs/controls.md) +### Discord Server + +https://discord.gg/kmRpgXBh75 + ![banner](screenshots/orks.png) diff --git a/shaders/cosine_interp_vis.fragmentshader b/shaders/cosine_interp_vis.fragmentshader deleted file mode 100644 index d8617a7e9..000000000 --- a/shaders/cosine_interp_vis.fragmentshader +++ /dev/null @@ -1,144 +0,0 @@ -in vec2 UV; -out v4 Output; - - - -f32 -MapNoiseValueToFinal(f32 Value) -{ - // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about - /* v2 Points[] = */ - /* { */ - /* {{1.0f, 1.0f }}, */ - /* {{0.7f, 0.85f }}, */ - /* {{0.6f, 0.5f }}, */ - /* {{0.3f, 0.4f }}, */ - /* {{0.2f, 0.1f }}, */ - /* {{0.0f, 0.0f }}, */ - /* }; */ - - /* v2 Points[] = */ - /* { */ - /* {{1.0f, 1.0f }}, */ - /* {{0.5f, 0.7f }}, */ - /* {{0.35f, 0.43f }}, */ - /* {{0.3f, 0.4f }}, */ - /* {{0.2f, 0.1f }}, */ - /* {{0.0f, 0.0f }}, */ - /* }; */ - - const s32 PointCount = 3; - v2 Points[PointCount]; - - /* Points[0] = v2(1.0f, 1.0f); */ - /* Points[1] = v2(0.f, 0.0f); */ - - - // Steep - - Points[0] = v2(1.0f, 1.0f); - Points[1] = v2(0.5f, 0.85f); - Points[2] = v2(0.0f, 0.0f); - - // Pretty nice - - /* Points[0] = v2(1.0f, 1.0f); */ - /* Points[1] = v2(0.7f, 0.7f); */ - /* Points[2] = v2(0.65f, 0.43f); */ - /* Points[3] = v2(0.6f, 0.4f); */ - /* Points[4] = v2(0.5f, 0.2f); */ - /* Points[5] = v2(0.0f, 0.1f); */ - - // Pillar-y - - /* Points[0] = v2(2.0f, 0.5f); */ - /* Points[1] = v2(0.6f, 0.3f); */ - /* Points[2] = v2(0.1f, 0.2f); */ - /* Points[3] = v2(0.05f, 0.45f); */ - /* Points[4] = v2(0.0f , 0.5f); */ - -/* v2 Points[] = */ -/* { */ -/* {{1.0f, 0.0f }}, */ -/* {{0.9f, 1.0f }}, */ -/* {{0.6f, 0.3f }}, */ -/* {{0.1f, 0.1f }}, */ -/* {{0.05f, 0.45f }}, */ -/* {{0.0f , 0.5f }}, */ -/* }; */ - - - - r32 Result = Value; - for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) - { - v2 P = Points[PointIndex]; - - // This is sort of a hack to fix the degenerate case when the value is 0 or 1. - // TODO(Jesse): Make this branchless - if (Value == P.x) return P.y; - - if (Value > P.x) - { - v2 PNext = Points[PointIndex + 1]; - - r32 Range = PNext.x - P.x; - r32 t = (Value-P.x) / Range; - Result = mix(t, P.y, PNext.y); - break; - } - } - - Result = abs(max(Result, 1.0)); - return Result; -} - -f32 -RoundToNearestMultiple(f32 NumToRound, f32 Multiple) -{ - f32 Remainder = mod(NumToRound, Multiple); - if (Remainder == 0) - return NumToRound; - - return NumToRound + Multiple - Remainder; -} - -b32 -WithinTolerance(f32 Epsilon, f32 A, f32 B) -{ - b32 Result = (A+Epsilon > B && A-Epsilon < B); - return Result; -} - - -void main() -{ - Output = V4(1,1,1,1); - - - f32 Mapped = MapToFinal(UV.x); - - if (Mapped == -1.f) - { - Output.rgb = v3(1.0f, 0.f, 1.0f); - } - else - { - r32 ThicknessInUVCoordinates = 0.01f; -#if 0 - if (Mapped > UV.y) - { - Output.rgb = V3(0.2); - } -#else - if (WithinTolerance(0.01f, Mapped, UV.y)) - { - r32 Dist = abs(UV.y - Mapped); - - r32 t = Dist/ThicknessInUVCoordinates; - Output.rgb = mix(v3(0), V3(1), t); - } -#endif - } - -} diff --git a/shaders/curve_remap_visualizer.fragmentshader b/shaders/curve_remap_visualizer.fragmentshader new file mode 100644 index 000000000..23ba6840c --- /dev/null +++ b/shaders/curve_remap_visualizer.fragmentshader @@ -0,0 +1,43 @@ +in vec2 UV; +out v4 Output; + + +b32 +WithinTolerance(f32 Epsilon, f32 A, f32 B) +{ + b32 Result = (A+Epsilon > B && A-Epsilon < B); + return Result; +} + + +void main() +{ + Output = V4(1,1,1,1); + + + f32 Mapped = RemapSample(UV.x); + + if (Mapped == -1.f) + { + Output.rgb = v3(1.0f, 0.f, 1.0f); + } + else + { + r32 ThicknessInUVCoordinates = 0.01f; +#if 0 + if (Mapped > UV.y) + { + Output.rgb = V3(0.2); + } +#else + if (WithinTolerance(0.01f, Mapped, UV.y)) + { + r32 Dist = abs(UV.y - Mapped); + + r32 t = Dist/ThicknessInUVCoordinates; + Output.rgb = mix(v3(0), V3(1), t); + } +#endif + } + +} diff --git a/shaders/terrain/decoration/cliffy_hills.fragmentshader b/shaders/terrain/decoration/cliffy_hills.fragmentshader index 310482079..c1adbe418 100644 --- a/shaders/terrain/decoration/cliffy_hills.fragmentshader +++ b/shaders/terrain/decoration/cliffy_hills.fragmentshader @@ -26,7 +26,7 @@ v4 DoCliffs(v3 Basis, v3 Deriv) /* ColorValue = Cliffness > 0.15f ? V3(0.3f) : v3(.1,.8,.2); */ // Grassy ripples -#if 1 +#if 0 { v4 gWobble = gradient_noise_derivs(Basis/v3(30, 30, 80)); NoiseValue += gWobble.x*Grassness*50; @@ -41,13 +41,15 @@ v4 DoCliffs(v3 Basis, v3 Deriv) v3 BaseCliffColor = V3(0.08f); v3 CliffColor = BaseCliffColor; f32 CliffValue = 0.f; + // Main cliffs { v3 v = voronoi_noise(Basis/v3(200,200,1800)); - CliffValue += (v.x*200)*Cliffness; - CliffValue += (v.y*50)*Cliffness; - CliffColor = mix(CliffColor, BaseCliffColor, clamp(10*Cliffness*v.x,0,1)); + CliffValue += (v.x*100)*Cliffness; + CliffValue += (v.y*20)*Cliffness; + CliffColor = mix(CliffColor, BaseCliffColor, clamp(10.f*Cliffness*v.x,0,1)); } + #if 0 { v3 v = voronoi_noise(Basis/v3(100,100,600)); @@ -79,13 +81,13 @@ v4 DoCliffs(v3 Basis, v3 Deriv) } #endif - if (CliffValue > 12.f) + /* if (CliffValue > 12.f) */ { NoiseValue += CliffValue; ColorValue = CliffColor; } -#if 1 +#if 0 f32 gravel_patch_stregth = value_noise_derivs(150+(Basis/300)).x; gravel_patch_stregth += value_noise_derivs(150+(Basis/160)).x; @@ -97,6 +99,7 @@ v4 DoCliffs(v3 Basis, v3 Deriv) // Grass & Flowers +#if 0 { f32 n = clamp(rng2d-0.7f, 0.f, 1.f); @@ -132,6 +135,7 @@ v4 DoCliffs(v3 Basis, v3 Deriv) /* ColorValue = V3(tFlower); */ /* ColorValue = V3(GrassValue/1.f); */ } +#endif // Rocky edges /* { */ @@ -161,6 +165,45 @@ v4 DoCliffs(v3 Basis, v3 Deriv) return V4(ColorValue, NoiseValue); } +v4 DoCliffs_v2(v3 Basis, v3 Deriv) +{ + v3 Down = V3(0, 0, -1); + + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + + /* NoiseValue = 100.f+MapNoiseValueToFinal(NoiseValue); */ + + /* Deriv = normalize(Deriv); */ + /* Deriv.xy = abs(Deriv.xy); */ + f32 Cliffness = Clamp01(0.8f+dot(Down, Deriv)); + f32 Grassness = Clamp01(.15f-Cliffness); + + ColorValue = mix(v3(.1,.8,.2), v3(.3), Cliffness); + /* ColorValue = mix(v3(.1,.8,.2), v3(.3), pow(Cliffness, .2)); */ + /* ColorValue = Cliffness > 0.15f ? V3(0.3f) : v3(.1,.8,.2); */ + + /* f32 rng2d = white_noise(Basis.xy); */ + /* f32 rng3d = white_noise(Basis); */ + + v3 BaseCliffColor = V3(0.08f); + v3 CliffColor = BaseCliffColor; + f32 CliffValue = 0.f; + + /* CliffColor = mix(V3(1,0,0), BaseCliffColor, Cliffness); */ + + /* // Main cliffs */ + /* { */ + /* v3 v = voronoi_noise(Basis/v3(200,200,1800)); */ + /* CliffValue += (v.x*100)*Cliffness; */ + /* CliffValue += (v.y*20)*Cliffness; */ + /* CliffColor = mix(CliffColor, BaseCliffColor, clamp(10.f*Cliffness*v.x,0,1)); */ + /* } */ + + + return V4(CliffColor, CliffValue); +} + void main() { f32 x = floor(gl_FragCoord.x); @@ -187,8 +230,9 @@ void main() // Put random junk here f32 CosTheta = Dot(Derivs, Normalize(V3(0,0,1))); - v4 Cliffs = DoCliffs(ColorValue, Derivs); - ColorValue = V3(0.1f, 0.8f, 0.1f); + v4 Cliffs = DoCliffs_v2(Basis, Derivs); + /* ColorValue = V3(0.1f, 0.8f, 0.1f); */ + ColorValue = Cliffs.rgb; NoiseValue += Cliffs.w; } diff --git a/shaders/terrain/shaping/1_FBM_large.fragmentshader b/shaders/terrain/shaping/1_FBM_large.fragmentshader new file mode 100644 index 000000000..89a1f104a --- /dev/null +++ b/shaders/terrain/shaping/1_FBM_large.fragmentshader @@ -0,0 +1,51 @@ +uniform v3 WorldspaceChunkBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out v4 Output; + + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); + + v3 Basis = WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + + v3 Period = V3(1800.f); + float Amplitude = 1000.f; + f32 StartingZDepth = 1000; + s32 Octaves = 3; + NoiseValue = StartingZDepth; + + f32 warp = 0.f; + + for (s32 Octave = 1; Octave <= Octaves; ++Octave) + { + v3 xyz = Basis / (Period/Octave); + + f32 gn = gradient_noise_derivs(xyz+warp).x; + NoiseValue += gn*(Amplitude/Octave); + } + + NoiseValue -= Basis.z; + ColorValue = V3(0.2f, 0.8f, 0.15f); + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; +} diff --git a/shaders/terrain/shaping/3_cliffy_hills.fragmentshader b/shaders/terrain/shaping/3_cliffy_hills.fragmentshader index 91d3eb9d8..0ceec0f98 100644 --- a/shaders/terrain/shaping/3_cliffy_hills.fragmentshader +++ b/shaders/terrain/shaping/3_cliffy_hills.fragmentshader @@ -7,96 +7,6 @@ out v4 Output; -f32 -MapNoiseValueToFinal(f32 Value) -{ - /* Assert(Value <= 1.f); */ - /* Assert(Value >= 0.f); */ - - // NOTE(Jesse): Descending order so we can scan from the front and find the interval we care about - - /* v2 Points[] = */ - /* { */ - /* {{1.0f, 1.0f }}, */ - /* {{0.7f, 0.85f }}, */ - /* {{0.6f, 0.5f }}, */ - /* {{0.3f, 0.4f }}, */ - /* {{0.2f, 0.1f }}, */ - /* {{0.0f, 0.0f }}, */ - /* }; */ - - /* v2 Points[] = */ - /* { */ - /* {{1.0f, 1.0f }}, */ - /* {{0.5f, 0.7f }}, */ - /* {{0.35f, 0.43f }}, */ - /* {{0.3f, 0.4f }}, */ - /* {{0.2f, 0.1f }}, */ - /* {{0.0f, 0.0f }}, */ - /* }; */ - - const s32 PointCount = 2; - v2 Points[PointCount]; - Points[0] = v2(1.0f, 1.0f); - Points[1] = v2(0.f, 0.0f); - - // Pretty nice - -/* s32 PointCount = 6; */ -/* v2 Points[6]; */ -/* Points[0] = v2(1.0f, 1.0f); */ -/* Points[1] = v2(0.7f, 0.7f); */ -/* Points[2] = v2(0.65f, 0.43f); */ -/* Points[3] = v2(0.6f, 0.4f); */ -/* Points[4] = v2(0.5f, 0.2f); */ -/* Points[5] = v2(0.0f, 0.1f); */ - - // Pillar-y - /* v2 Points[] = */ - /* { */ - /* {{2.0f, 0.5f }}, */ - /* {{0.6f, 0.3f }}, */ - /* {{0.1f, 0.2f }}, */ - /* {{0.05f, 0.45f }}, */ - /* {{0.0f , 0.5f }}, */ - /* }; */ - -/* v2 Points[] = */ -/* { */ -/* {{1.0f, 0.0f }}, */ -/* {{0.9f, 1.0f }}, */ -/* {{0.6f, 0.3f }}, */ -/* {{0.1f, 0.1f }}, */ -/* {{0.05f, 0.45f }}, */ -/* {{0.0f , 0.5f }}, */ -/* }; */ - - - - r32 Result = Value; - for (int PointIndex = 0; PointIndex < PointCount-1; ++PointIndex) - { - v2 P = Points[PointIndex]; - - // This is sort of a hack to fix the degenerate case when the value is 0 or 1. - // TODO(Jesse): Make this branchless - if (Value == P.x) return P.y; - - if (Value > P.x) - { - v2 PNext = Points[PointIndex + 1]; - - r32 Range = PNext.x - P.x; - r32 t = (Value-P.x) / Range; - Result = mix(t, P.y, PNext.y); - break; - } - } - - Result = abs(max(Result, 1.0)); - return Result; -} - f32 RoundToNearestMultiple(f32 NumToRound, f32 Multiple) { @@ -146,8 +56,8 @@ void main() v3 Period = V3(1500.f); float Amplitude = 100.f; /* f32 StartingZDepth = 10000; */ - /* f32 StartingZDepth = 5000; */ - f32 StartingZDepth = 0; + f32 StartingZDepth = 5000; + /* f32 StartingZDepth = 0; */ s32 Octaves = 6; NoiseValue = StartingZDepth; @@ -190,7 +100,7 @@ void main() v3 Up = V3(0, 0, 1); - /* NoiseValue = 100.f+MapNoiseValueToFinal(NoiseValue); */ + /* NoiseValue = 100.f+RempaSample(NoiseValue); */ Deriv = normalize(Deriv); /* Deriv.xy = abs(Deriv.xy); */ diff --git a/shaders/terrain/shaping/7_steep_ravines.fragmentshader b/shaders/terrain/shaping/7_steep_ravines.fragmentshader index 1a8ff626d..27fb3e3c5 100644 --- a/shaders/terrain/shaping/7_steep_ravines.fragmentshader +++ b/shaders/terrain/shaping/7_steep_ravines.fragmentshader @@ -40,7 +40,7 @@ void main() { v3 xyz = Basis / (Period/Octave); v4 gn = gradient_noise_derivs(xyz+warp); - NoiseValue += MapToFinal((gn.x+1.f)/2.f)*(Amplitude/Octave); + NoiseValue += RemapSample((gn.x+1.f)/2.f)*(Amplitude/Octave); } v3 Up = V3(0, 0, 1); From 8d2681e7de3ae9ff2420e2c92031f84169cff361 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 14 Oct 2025 11:15:45 -0700 Subject: [PATCH 348/421] Update stdlib; move towards async_render_pass --- examples/terrain_gen/game.cpp | 22 +- external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- ...cify_render_function_c_CompileShaderPair.h | 2 +- .../asyncify_render_function_c_DrawLod.h | 2 +- ...yncify_render_function_c_RenderToTexture.h | 2 +- .../asyncify_render_function_c_UseShader.h | 20 + ...cify_render_function_h_CompileShaderPair.h | 2 +- .../asyncify_render_function_h_DrawLod.h | 2 +- ...yncify_render_function_h_RenderToTexture.h | 2 +- .../asyncify_render_function_h_UseShader.h | 9 + ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../d_union_constructors_work_queue_entry.h | 2 +- generated/d_union_ui_render_command.h | 2 +- generated/d_union_work_queue_entry.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 16 +- generated/for_datatypes_Bxw4Q7AW.h | 2 + generated/for_datatypes_IXWy6K9V.h | 821 ++++++++++++++++++ generated/for_datatypes_fkubhsYl.h | 7 +- generated/for_datatypes_kh9dwrCf.h | 18 - generated/for_datatypes_kv3WBTai.h | 7 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- generated/static_cursor_v2_0_986190493.h | 54 ++ make.sh | 8 +- .../shaping/7_steep_ravines.fragmentshader | 7 +- src/engine/graphics.h | 30 + src/engine/work_queue.h | 78 +- 30 files changed, 1028 insertions(+), 103 deletions(-) create mode 100644 generated/asyncify_render_function_c_UseShader.h create mode 100644 generated/asyncify_render_function_h_UseShader.h create mode 100644 generated/for_datatypes_IXWy6K9V.h create mode 100644 generated/static_cursor_v2_0_986190493.h diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index ded4c6894..086cfb560 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -4,6 +4,8 @@ #include "game_types.h" + + BONSAI_API_WORKER_THREAD_INIT_CALLBACK() { SetThreadLocal_ThreadIndex(Thread->Index); @@ -56,15 +58,14 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() } -#define MAX_EASING_POINTS 8 - struct easing_function { cs Name; - v2 Points[MAX_EASING_POINTS]; - u32 PointCount; + v2_static_cursor_16 Points; }; + + BONSAI_API_MAIN_THREAD_CALLBACK() { Assert(ThreadLocal_ThreadIndex == 0); @@ -78,10 +79,21 @@ BONSAI_API_MAIN_THREAD_CALLBACK() { window_layout *Window = GetOrCreateWindow(Ui, "Easing Window"); PushWindowStart(Ui, Window); - PushUntexturedQuad(Ui, V2(0), V2(256), zDepth_Text, 0, {}, UiElementLayoutFlag_Default, &GameState->Shader); + PushUntexturedQuad(Ui, V2(0), V2(256), zDepth_Text, 0, {}, UiElementLayoutFlag_Default, UseShader, &GameState->Shader); PushWindowEnd(Ui, Window); } + easing_function Test = { + .Name = CSz("Test"), + .Points = { + .Start = { + V2(0,0), + V2(1,1), + }, + .At = 2, + }, + }; + { global_variable window_layout Window = WindowLayout("Terrain Shaping Shader", WindowLayoutFlag_Align_Right); PushWindowStart(Ui, &Window); diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 7168610fa..0dc029ffa 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 7168610fae5efa6dadb56632b50a827d928cdee2 +Subproject commit 0dc029ffa04a58799fcb0ca4ae3989d5f36c509c diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 79402e2fd..f046ceba3 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2520:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2522:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 16ff3d103..a03e1da2e 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3618:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3620:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index f81b942b1..992815217 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2473:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2475:0 case type_ui_render_command_window_start: { diff --git a/generated/asyncify_render_function_c_CompileShaderPair.h b/generated/asyncify_render_function_c_CompileShaderPair.h index f47a216a6..0015229a5 100644 --- a/generated/asyncify_render_function_c_CompileShaderPair.h +++ b/generated/asyncify_render_function_c_CompileShaderPair.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:334:0 +// src/engine/work_queue.h:299:0 link_internal void CompileShaderPair_Async(work_queue *Queue, shader *Shader , cs VertShaderPath , cs FragShaderPath , b32 DumpErrors , b32 RegisterForHotReload , b32* Result ) diff --git a/generated/asyncify_render_function_c_DrawLod.h b/generated/asyncify_render_function_c_DrawLod.h index 519911f7c..73e964a79 100644 --- a/generated/asyncify_render_function_c_DrawLod.h +++ b/generated/asyncify_render_function_c_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:331:0 +// src/engine/work_queue.h:296:0 link_internal void DrawLod_Async(work_queue *Queue, engine_resources *Engine , shader *Shader , gpu_mapped_element_buffer *Meshes , v3 Basis , Quaternion Rotation , v3 Scale ) diff --git a/generated/asyncify_render_function_c_RenderToTexture.h b/generated/asyncify_render_function_c_RenderToTexture.h index c0699e468..6b865df6f 100644 --- a/generated/asyncify_render_function_c_RenderToTexture.h +++ b/generated/asyncify_render_function_c_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:328:0 +// src/engine/work_queue.h:293:0 link_internal void RenderToTexture_Async(work_queue *Queue, engine_resources *Engine , asset_thumbnail *Thumb , gpu_mapped_element_buffer *Meshes , v3 Offset , camera *Camera ) diff --git a/generated/asyncify_render_function_c_UseShader.h b/generated/asyncify_render_function_c_UseShader.h new file mode 100644 index 000000000..4aacae2bc --- /dev/null +++ b/generated/asyncify_render_function_c_UseShader.h @@ -0,0 +1,20 @@ +// src/engine/work_queue.h:302:0 + +link_internal void +UseShader_Async(work_queue *Queue, shader *Shader ) +{ + use_shader_async_params Params = + { + Shader, + }; + + work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); + PushWorkQueueEntry(Queue, &Entry); +} + +link_internal void +DoJob(use_shader_async_params *Params) +{ + UseShader( Params->Shader ); +} + diff --git a/generated/asyncify_render_function_h_CompileShaderPair.h b/generated/asyncify_render_function_h_CompileShaderPair.h index 043426b58..1174a7461 100644 --- a/generated/asyncify_render_function_h_CompileShaderPair.h +++ b/generated/asyncify_render_function_h_CompileShaderPair.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:186:0 +// src/engine/work_queue.h:159:0 struct compile_shader_pair_async_params poof(@async_function_params) { diff --git a/generated/asyncify_render_function_h_DrawLod.h b/generated/asyncify_render_function_h_DrawLod.h index 4f1e1dc35..c27bff3c1 100644 --- a/generated/asyncify_render_function_h_DrawLod.h +++ b/generated/asyncify_render_function_h_DrawLod.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:183:0 +// src/engine/work_queue.h:156:0 struct draw_lod_async_params poof(@async_function_params) { diff --git a/generated/asyncify_render_function_h_RenderToTexture.h b/generated/asyncify_render_function_h_RenderToTexture.h index 5f706d50c..d8ce5f0dc 100644 --- a/generated/asyncify_render_function_h_RenderToTexture.h +++ b/generated/asyncify_render_function_h_RenderToTexture.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:177:0 +// src/engine/work_queue.h:149:0 struct render_to_texture_async_params poof(@async_function_params) { diff --git a/generated/asyncify_render_function_h_UseShader.h b/generated/asyncify_render_function_h_UseShader.h new file mode 100644 index 000000000..5fbff8542 --- /dev/null +++ b/generated/asyncify_render_function_h_UseShader.h @@ -0,0 +1,9 @@ +// src/engine/work_queue.h:162:0 + +struct use_shader_async_params poof(@async_function_params) +{ + + shader *Shader; + +}; + diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 1bef572d9..bb388e86b 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:131:0 +// src/engine/graphics.h:161:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index b0bccd0ea..4aab34200 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:120:0 +// src/engine/graphics.h:150:0 diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 5ef05b3e1..066578fb0 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:272:0 +// src/engine/work_queue.h:237:0 link_internal work_queue_entry diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index ffa132869..669ae1397 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:872:0 +// external/bonsai_stdlib/src/ui/ui.h:876:0 enum ui_render_command_type { diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index 8570bc054..4a388d3eb 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:241:0 +// src/engine/work_queue.h:206:0 enum work_queue_entry_type { diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 83bfca94a..5e01b9b0f 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:304:0 +// src/engine/work_queue.h:269:0 @@ -42,6 +42,17 @@ +struct use_shader_async_params; +link_internal work_queue_entry +WorkQueueEntryAsyncFunction( use_shader_async_params *Params ) +{ + work_queue_entry Result = {}; + Result.Type = type_work_queue_entry_async_function_call; + Result.work_queue_entry_async_function_call.Type = type_use_shader_async_params; + Result.work_queue_entry_async_function_call.use_shader_async_params = *Params; + return Result; +} + @@ -700,7 +711,6 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) - struct compile_shader_pair_async_params; @@ -773,6 +783,8 @@ WorkQueueEntryAsyncFunction( compile_shader_pair_async_params *Params ) + + diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index bd7ee0f8a..5d347e283 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -526,6 +526,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, + link_internal void @@ -1152,5 +1153,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs + diff --git a/generated/for_datatypes_IXWy6K9V.h b/generated/for_datatypes_IXWy6K9V.h new file mode 100644 index 000000000..4f749f688 --- /dev/null +++ b/generated/for_datatypes_IXWy6K9V.h @@ -0,0 +1,821 @@ +// src/engine/graphics.h:105:0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +link_internal b32 +InitializeEasingFunctionVisualizerRenderPass( + easing_function_visualizer_render_pass *Struct + , b32 Ignored + +) +{ + b32 Result = CompileShaderPair(&Struct->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + + u32 UniformIndex = 0; + + Struct->Ignored = Ignored; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); + + + + u32 Expected = 1 ; + if (UniformIndex != Expected ) + { + Error("Shader (easing_function_visualizer_render_pass) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } + } + + + + AssertNoGlErrors; + return Result; +} + +link_internal void +UseShader( easing_function_visualizer_render_pass *Struct ) +{ + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + + + if (UniformIndex != 1 ) + { + Error("Shader (easing_function_visualizer_render_pass) had an incorrect number of uniform slots!"); + } + } + else + { + SoftError("Attempted to bind uncompiled Shader (STDLIB_SHADER_PATH \"FullPassthrough.vertexshader\") | (BONSAI_SHADER_PATH \"curve_remap_visualizer.fragmentshader\")"); + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 50e66ef8c..fd12d328e 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:224:0 +// src/engine/work_queue.h:189:0 @@ -42,6 +42,7 @@ +use_shader_async_params use_shader_async_params; @@ -231,8 +232,8 @@ -render_to_texture_async_params render_to_texture_async_params; +render_to_texture_async_params render_to_texture_async_params; @@ -754,6 +755,8 @@ compile_shader_pair_async_params compile_shader_pair_async_params; + + diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 19214e9c1..46bd52e29 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -96,12 +96,6 @@ - - - - - - @@ -287,12 +281,6 @@ PushToolbar( renderer_2d *Ui, - - - - - - link_internal counted_string ToStringPrefixless(selection_modification_mode Type) @@ -1393,12 +1381,6 @@ PushToolbar( renderer_2d *Ui, - - - - - - diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index e2c842e40..fdc93e0fc 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:205:0 +// src/engine/work_queue.h:170:0 @@ -42,6 +42,7 @@ +type_use_shader_async_params, @@ -231,8 +232,8 @@ -type_render_to_texture_async_params, +type_render_to_texture_async_params, @@ -754,6 +755,8 @@ type_compile_shader_pair_async_params, + + diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index b9796175d..fc5209135 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:117:0 +// src/engine/graphics.h:147:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/static_cursor_v2_0_986190493.h b/generated/static_cursor_v2_0_986190493.h new file mode 100644 index 000000000..209a169a9 --- /dev/null +++ b/generated/static_cursor_v2_0_986190493.h @@ -0,0 +1,54 @@ +// external/bonsai_stdlib/src/vector.h:1173:0 + + +struct v2_static_cursor_16 +{ + v2 Start[16]; + u32 At; +}; + +link_inline v2* +GetPtr( v2_static_cursor_16 *Buf, umm Index) +{ + v2 *Result = {}; + if ( Index < umm(16) ) + { + Result = Buf->Start+Index; + } + return Result; +} + +link_inline v2* +TryGetPtr( v2_static_cursor_16 *Buf, umm Index) +{ + return GetPtr(Buf, Index); +} + +link_inline v2 +Get( v2_static_cursor_16 *Buf, umm Index) +{ + Assert(Index < umm(16)); + Assert(Index < umm((Buf->At))); + v2 Result = Buf->Start[Index]; + return Result; +} + +link_internal umm +AtElements( v2_static_cursor_16 *Buf) +{ + return Buf->At; +} + +link_internal umm +TotalElements( v2_static_cursor_16 *Buf) +{ + return 16; +} + +link_inline void +Push( v2_static_cursor_16 *Buf, v2 *E ) +{ + Assert(AtElements(Buf) < TotalElements(Buf)); + Buf->Start[Buf->At++] = *E; +} + diff --git a/make.sh b/make.sh index 7f80d4c07..4f0998753 100755 --- a/make.sh +++ b/make.sh @@ -334,12 +334,12 @@ function RunPoof # RunPoofHelper src/game_loader.cpp && echo -e "$Success poofed src/game_loader.cpp" & # TrackPid "" $! - RunPoofHelper examples/turn_based/game.cpp && echo -e "$Success poofed examples/turn_based/game.cpp" & - TrackPid "" $! - - # RunPoofHelper examples/terrain_gen/game.cpp && echo -e "$Success poofed examples/terrain_gen/game.cpp" & + # RunPoofHelper examples/turn_based/game.cpp && echo -e "$Success poofed examples/turn_based/game.cpp" & # TrackPid "" $! + RunPoofHelper examples/terrain_gen/game.cpp && echo -e "$Success poofed examples/terrain_gen/game.cpp" & + TrackPid "" $! + # RunPoofHelper examples/the_wanderer/game.cpp && echo -e "$Success poofed examples/the_wanderer/game.cpp" & # TrackPid "" $! diff --git a/shaders/terrain/shaping/7_steep_ravines.fragmentshader b/shaders/terrain/shaping/7_steep_ravines.fragmentshader index 27fb3e3c5..691c93079 100644 --- a/shaders/terrain/shaping/7_steep_ravines.fragmentshader +++ b/shaders/terrain/shaping/7_steep_ravines.fragmentshader @@ -14,7 +14,7 @@ void main() v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); // NOTE(Jesse): Set these in the -- user code -- section - v3 ColorValue = V3(0.f); + v3 ColorValue = V3(0.1f, 0.7f, 0.1f); f32 NoiseValue = 0.f; // @@ -57,10 +57,5 @@ void main() Output.rgb = ColorValue; Output.a = NoiseValue; - /* uint SolidBit = NoiseValue > 0.f ? 1u : 0u; */ - /* ColorValue = min(ColorValue, v3(1.f)); */ - /* uint PackedColor = PackRGB(ColorValue); */ - /* /1* uint PackedColor = 3543u; *1/ */ - /* Output = (SolidBit << 15) | PackedColor; */ } diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 58ffdf4aa..841be69ea 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -88,6 +88,36 @@ poof(shader_magic(terrain_finalize_render_context)) #include +struct easing_function_visualizer_render_pass +poof( + @render_pass + @vert_source_file(STDLIB_SHADER_PATH "FullPassthrough.vertexshader") + @frag_source_file(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader") + ) +{ + shader Program; + shader_uniform Uniforms[1]; + + b32 Ignored; poof(@uniform) +}; + +poof( + for_datatypes(all) @code_fragment + func (struct_t) + { + struct_t.has_tag(render_pass)? + { + shader_magic(struct_t) + } + } + func (enum_t) {} +) +#include + +/* poof(asyncify_render_function_h(InitializeEasingFunctionVisualizerRenderPass)) */ +/* #include */ + + struct composite_render_group { shader Shader; diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index 78f059b88..99a72e0f1 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -55,9 +55,9 @@ struct work_queue_entry_copy_buffer_set }; struct world_chunk; -struct work_queue_entry_init_world_chunk { +struct work_queue_entry_init_world_chunk +{ world_chunk *Chunk; - /* world_chunk_mesh_bitfield MeshBit; */ }; struct work_queue_entry_finalize_noise_values @@ -76,36 +76,16 @@ struct work_queue_entry_build_chunk_mesh octree_node *DestNode; }; -#if 1 struct work_queue_entry_rebuild_mesh { world_chunk *Chunk; chunk_init_flags Flags; }; -#endif - - - -#if 0 -struct work_queue_entry_update_world_region -{ - world_edit_brush_constraints Brush; - - // TODO(Jesse): These feel like part of the brush? - v3 HSVColor; - u8 Transparency; - b32 PersistWhitespace; - cp MinP; - cp MaxP; - world_chunk **DestChunkBuffer; - u32 ChunkCount; -}; -#endif struct asset; struct work_queue_entry_init_asset @@ -127,14 +107,6 @@ CAssert( (sizeof(work_queue_entry__align_to_cache_line_helper)+8) % CACHE_LINE_S - -global_variable voxel Global_UnsetVoxel = { 0xff, 0xffff }; - - - - - - poof( func asyncify_render_function_h(func_t) @code_fragment { @@ -180,22 +152,15 @@ poof(asyncify_render_function_h(RenderToTexture)) link_internal void DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Meshes, v3 Basis, Quaternion Rotation = Quaternion(), v3 Scale = V3(1.f)); + poof(asyncify_render_function_h(DrawLod)) #include poof(asyncify_render_function_h(CompileShaderPair)) #include - - - - - - - - - - +poof(asyncify_render_function_h(UseShader)) +#include @@ -334,25 +299,42 @@ poof(asyncify_render_function_c(DrawLod)) poof(asyncify_render_function_c(CompileShaderPair)) #include +poof(asyncify_render_function_c(UseShader)) +#include + +/* poof(asyncify_render_function_c(InitializeEasingFunctionVisualizerRenderPass)) */ +/* #include */ + link_internal void -DispatchAsyncFunctionCall(work_queue_entry_async_function_call *Job) +DispatchAsyncFunctionCall(work_queue_entry_async_function_call *Task) { - tswitch(Job) + tswitch(Task) { { - tmatch(render_to_texture_async_params, Job, RenderToTexture); - DoJob(RenderToTexture); + tmatch(render_to_texture_async_params, Task, Job); + DoJob(Job); + } break; + + { + tmatch(draw_lod_async_params, Task, Job); + DoJob(Job); } break; { - tmatch(draw_lod_async_params, Job, DrawLodParams); - DoJob(DrawLodParams); + tmatch(compile_shader_pair_async_params, Task, Job); + DoJob(Job); } break; { - tmatch(compile_shader_pair_async_params, Job, RenderToTexture); - DoJob(RenderToTexture); + tmatch(use_shader_async_params, Task, Job); + DoJob(Job); } break; + + /* { */ + /* tmatch(easing_function_visualizer_render_pass_async_params, Task, Job); */ + /* DoJob(Job); */ + /* } break; */ + } } From 3823f8bcd440ab1432b40a5f2723a4520435b300 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 16 Oct 2025 09:34:20 -0700 Subject: [PATCH 349/421] Drive shader_magic and asyncify_render_function from struct defs --- examples/terrain_gen/game.cpp | 15 +- examples/terrain_gen/game_types.h | 5 +- ...nymous_async_function_call_type_rQAZtEUA.h | 15 + ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../block_array_h_shader_ptr_688853971_0.h | 2 +- generated/buffer_h_struct_u32.h | 2 +- .../d_union_constructors_work_queue_entry.h | 2 +- generated/d_union_work_queue_entry.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 29 +- generated/for_datatypes_Bxw4Q7AW.h | 1 - generated/for_datatypes_IXWy6K9V.h | 1015 ++- generated/for_datatypes_cx51CcgQ.h | 7331 +++++++++++++++++ generated/for_datatypes_fkubhsYl.h | 6 +- generated/for_datatypes_khY6kwEk.h | 7291 ++++++++++++++++ generated/for_datatypes_kv3WBTai.h | 6 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- .../shader_magic_textured_quad_render_pass.h | 27 +- jesse.make.sh | 2 +- src/engine/bloom.h | 10 +- src/engine/debug.cpp | 6 + src/engine/engine.cpp | 1 + src/engine/engine.h | 2 +- src/engine/graphics.h | 41 +- src/engine/light.h | 6 +- src/engine/render.cpp | 1 + src/engine/render.h | 3 + src/engine/render/shadow_map.cpp | 34 + src/engine/render/shadow_map.h | 39 +- src/engine/work_queue.h | 151 +- 37 files changed, 15848 insertions(+), 217 deletions(-) create mode 100644 generated/anonymous_async_function_call_type_rQAZtEUA.h create mode 100644 generated/for_datatypes_cx51CcgQ.h create mode 100644 generated/for_datatypes_khY6kwEk.h create mode 100644 src/engine/render/shadow_map.cpp diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 086cfb560..f436e3ed1 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -5,7 +5,6 @@ #include "game_types.h" - BONSAI_API_WORKER_THREAD_INIT_CALLBACK() { SetThreadLocal_ThreadIndex(Thread->Index); @@ -47,11 +46,13 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() CameraGhost->P.WorldP = VisibleRegion/2; CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); - CompileShaderPair_Async( RenderQ, - &GameState->Shader, - CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), - CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader"), - True, True, &GameState->ShaderCompileSuccess); + InitializeEasingFunctionVisualizerRenderPass_Async( RenderQ, &GameState->EasingFunctionVisRP, False, 0); + + /* CompileShaderPair_Async( RenderQ, */ + /* &GameState->Shader, */ + /* CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), */ + /* CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader"), */ + /* True, True, &GameState->ShaderCompileSuccess); */ SpawnEntity(CameraGhost); return GameState; @@ -79,7 +80,7 @@ BONSAI_API_MAIN_THREAD_CALLBACK() { window_layout *Window = GetOrCreateWindow(Ui, "Easing Window"); PushWindowStart(Ui, Window); - PushUntexturedQuad(Ui, V2(0), V2(256), zDepth_Text, 0, {}, UiElementLayoutFlag_Default, UseShader, &GameState->Shader); + PushUntexturedQuad(Ui, V2(0), V2(256), zDepth_Text, 0, {}, UiElementLayoutFlag_Default, UseRenderPass_easing_function_visualizer_render_pass, &GameState->EasingFunctionVisRP); PushWindowEnd(Ui, Window); } diff --git a/examples/terrain_gen/game_types.h b/examples/terrain_gen/game_types.h index 40cb78ba0..fef665105 100644 --- a/examples/terrain_gen/game_types.h +++ b/examples/terrain_gen/game_types.h @@ -32,7 +32,8 @@ struct game_state { terrain_gen_type TerrainGenType; - shader Shader; - b32 ShaderCompileSuccess; + easing_function_visualizer_render_pass EasingFunctionVisRP; + /* shader Shader; */ + /* b32 ShaderCompileSuccess; */ }; diff --git a/generated/anonymous_async_function_call_type_rQAZtEUA.h b/generated/anonymous_async_function_call_type_rQAZtEUA.h new file mode 100644 index 000000000..3a7ad61df --- /dev/null +++ b/generated/anonymous_async_function_call_type_rQAZtEUA.h @@ -0,0 +1,15 @@ +// src/engine/work_queue.h:291:0 + +{ + tmatch( initialize_easing_function_visualizer_render_pass_async_params, Task, Job ); + DoJob(Job); +} break; +{ + tmatch( compile_shader_pair_async_params, Task, Job ); + DoJob(Job); +} break; +{ + tmatch( draw_lod_async_params, Task, Job ); + DoJob(Job); +} break; + diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index bb388e86b..121ea8eb5 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:161:0 +// src/engine/graphics.h:160:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 4aab34200..d3803baa7 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:150:0 +// src/engine/graphics.h:149:0 diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 13f44865d..f187d1484 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:152:0 +// external/bonsai_stdlib/src/shader.h:175:0 diff --git a/generated/buffer_h_struct_u32.h b/generated/buffer_h_struct_u32.h index 5bfe06e0d..c69188be1 100644 --- a/generated/buffer_h_struct_u32.h +++ b/generated/buffer_h_struct_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:133:0 +// external/bonsai_stdlib/src/shader.h:156:0 struct shader_uniform_buffer { diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 066578fb0..7a410cd98 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:237:0 +// src/engine/work_queue.h:239:0 link_internal work_queue_entry diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index 4a388d3eb..c7e5be3b0 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:206:0 +// src/engine/work_queue.h:208:0 enum work_queue_entry_type { diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 5e01b9b0f..c75b48bbe 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:269:0 +// src/engine/work_queue.h:245:0 @@ -42,18 +42,6 @@ -struct use_shader_async_params; -link_internal work_queue_entry -WorkQueueEntryAsyncFunction( use_shader_async_params *Params ) -{ - work_queue_entry Result = {}; - Result.Type = type_work_queue_entry_async_function_call; - Result.work_queue_entry_async_function_call.Type = type_use_shader_async_params; - Result.work_queue_entry_async_function_call.use_shader_async_params = *Params; - return Result; -} - - @@ -239,17 +227,14 @@ WorkQueueEntryAsyncFunction( use_shader_async_params *Params ) - - - -struct render_to_texture_async_params; +struct initialize_easing_function_visualizer_render_pass_async_params; link_internal work_queue_entry -WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) +WorkQueueEntryAsyncFunction( initialize_easing_function_visualizer_render_pass_async_params *Params ) { work_queue_entry Result = {}; Result.Type = type_work_queue_entry_async_function_call; - Result.work_queue_entry_async_function_call.Type = type_render_to_texture_async_params; - Result.work_queue_entry_async_function_call.render_to_texture_async_params = *Params; + Result.work_queue_entry_async_function_call.Type = type_initialize_easing_function_visualizer_render_pass_async_params; + Result.work_queue_entry_async_function_call.initialize_easing_function_visualizer_render_pass_async_params = *Params; return Result; } @@ -708,6 +693,10 @@ WorkQueueEntryAsyncFunction( render_to_texture_async_params *Params ) + + + + diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 5d347e283..2e5879009 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -302,7 +302,6 @@ - link_internal void diff --git a/generated/for_datatypes_IXWy6K9V.h b/generated/for_datatypes_IXWy6K9V.h index 4f749f688..8aecda2d2 100644 --- a/generated/for_datatypes_IXWy6K9V.h +++ b/generated/for_datatypes_IXWy6K9V.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:105:0 +// src/engine/graphics.h:98:0 @@ -8,36 +8,261 @@ +link_internal b32 +poof() +InitializeLightingRenderGroup +( + lighting_render_group *Struct + , texture *gColor + , texture *gNormal + , texture *gDepth + , texture *shadowMap + , texture *Ssao + , texture *TransparencyAccumTex + , texture *TransparencyCountTex + , b32 *BravoilMyersOIT + , b32 *BravoilMcGuireOIT + , m4 *InverseViewMatrix + , m4 *InverseProjectionMatrix + , m4 *ShadowMVP + , texture *LightColors + , texture *LightPositions + , f32 *LightIndexToUV + , s32 *LightCount + , camera *Camera + , v3 *SunPosition + , v3 *SunColor + , v3 *FogColor + , f32 *FogPower + , b32 *UseSsao + , b32 *UseShadowMapping + , b32 *UseLightingBloom + , v2 *ApplicationResolution + , v2 *ShadowMapResolution + +) +{ + b32 Result = CompileShaderPair(&Struct->Program, CSz(BONSAI_SHADER_PATH "Lighting.vertexshader"), CSz(BONSAI_SHADER_PATH "Lighting.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + + u32 UniformIndex = 0; + + Struct->gColor = gColor; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gColor, "gColor"); + + Struct->gNormal = gNormal; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gNormal, "gNormal"); + + Struct->gDepth = gDepth; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gDepth, "gDepth"); + + Struct->shadowMap = shadowMap; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->shadowMap, "shadowMap"); + + Struct->Ssao = Ssao; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->Ssao, "Ssao"); + + Struct->TransparencyAccumTex = TransparencyAccumTex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->TransparencyAccumTex, "TransparencyAccumTex"); + + Struct->TransparencyCountTex = TransparencyCountTex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->TransparencyCountTex, "TransparencyCountTex"); + + Struct->BravoilMyersOIT = BravoilMyersOIT; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->BravoilMyersOIT, "BravoilMyersOIT"); + + Struct->BravoilMcGuireOIT = BravoilMcGuireOIT; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->BravoilMcGuireOIT, "BravoilMcGuireOIT"); + + Struct->InverseViewMatrix = InverseViewMatrix; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InverseViewMatrix, "InverseViewMatrix"); + + Struct->InverseProjectionMatrix = InverseProjectionMatrix; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InverseProjectionMatrix, "InverseProjectionMatrix"); + + Struct->ShadowMVP = ShadowMVP; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ShadowMVP, "ShadowMVP"); + + Struct->LightColors = LightColors; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightColors, "LightColors"); + + Struct->LightPositions = LightPositions; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightPositions, "LightPositions"); + + Struct->LightIndexToUV = LightIndexToUV; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightIndexToUV, "LightIndexToUV"); + + Struct->LightCount = LightCount; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightCount, "LightCount"); + + Struct->Camera = Camera; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->Camera, "Camera"); + + Struct->SunPosition = SunPosition; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SunPosition, "SunPosition"); + + Struct->SunColor = SunColor; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SunColor, "SunColor"); + + Struct->FogColor = FogColor; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FogColor, "FogColor"); + + Struct->FogPower = FogPower; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FogPower, "FogPower"); + + Struct->UseSsao = UseSsao; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseSsao, "UseSsao"); + + Struct->UseShadowMapping = UseShadowMapping; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseShadowMapping, "UseShadowMapping"); + + Struct->UseLightingBloom = UseLightingBloom; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseLightingBloom, "UseLightingBloom"); + + Struct->ApplicationResolution = ApplicationResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ApplicationResolution, "ApplicationResolution"); + + Struct->ShadowMapResolution = ShadowMapResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ShadowMapResolution, "ShadowMapResolution"); + + + + u32 Expected = 26 ; + if (UniformIndex != Expected ) + { + Error("Shader (lighting_render_group) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } + } + + + + AssertNoGlErrors; + return Result; +} + +link_internal void +UseRenderPass_lighting_render_group +( lighting_render_group *Struct ) +{ + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + if (UniformIndex != 26 ) + { + Error("Shader (lighting_render_group) had an incorrect number of uniform slots!"); + } + } + else + { + SoftError("Attempted to bind uncompiled Shader (BONSAI_SHADER_PATH \"Lighting.vertexshader\") | (BONSAI_SHADER_PATH \"Lighting.fragmentshader\")"); + } +} + +// NOTE(Jesse): This is for binding when passing a custom RP through the UI +link_internal void +UseRenderPass_lighting_render_group( void *Struct ) +{ + UseRenderPass_lighting_render_group( Cast(lighting_render_group *, Struct) ); +} + +link_internal void +UseRenderPass( lighting_render_group *Struct ) +{ + UseRenderPass_lighting_render_group(Struct); +} +// TODO(Jesse): Remove in favor of UseRenderPass +link_internal void +UseShader( lighting_render_group *Struct ) +{ + UseRenderPass_lighting_render_group(Struct); +} @@ -117,6 +342,416 @@ + + + + + + + + + + + + + + + + + + + + + +link_internal b32 +poof() +InitializeTerrainDecorationRenderContext +( + terrain_decoration_render_context *Struct + , texture *DerivsTex + , v3 ChunkDim + , v3 WorldspaceChunkBasis + , v3 ChunkResolution +) +{ + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/default.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + + u32 UniformIndex = 0; + + Struct->DerivsTex = DerivsTex; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->DerivsTex, "DerivsTex"); + + Struct->ChunkDim = ChunkDim; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); + + Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); + + Struct->ChunkResolution = ChunkResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); + + u32 Expected = 4 ; + if (UniformIndex != Expected ) + { + Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } + } + + + + AssertNoGlErrors; + return Result; +} + +link_internal void +UseRenderPass_terrain_decoration_render_context +( terrain_decoration_render_context *Struct ) +{ + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + if (UniformIndex != 4 ) + { + Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots!"); + } + } + else + { + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/decoration/default.fragmentshader\")"); + } +} + +// NOTE(Jesse): This is for binding when passing a custom RP through the UI +link_internal void +UseRenderPass_terrain_decoration_render_context( void *Struct ) +{ + UseRenderPass_terrain_decoration_render_context( Cast(terrain_decoration_render_context *, Struct) ); +} + +link_internal void +UseRenderPass( terrain_decoration_render_context *Struct ) +{ + UseRenderPass_terrain_decoration_render_context(Struct); +} + +// TODO(Jesse): Remove in favor of UseRenderPass +link_internal void +UseShader( terrain_decoration_render_context *Struct ) +{ + UseRenderPass_terrain_decoration_render_context(Struct); +} + + + + + + + + + + + + + + + + + + +link_internal b32 +poof() +InitializeTerrainFinalizeRenderContext +( + terrain_finalize_render_context *Struct + , u32 Ignored + +) +{ + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/TerrainFinalize.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + + u32 UniformIndex = 0; + + Struct->Ignored = Ignored; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); + + + + u32 Expected = 1 ; + if (UniformIndex != Expected ) + { + Error("Shader (terrain_finalize_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } + } + + + + AssertNoGlErrors; + return Result; +} + +link_internal void +UseRenderPass_terrain_finalize_render_context +( terrain_finalize_render_context *Struct ) +{ + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + + + if (UniformIndex != 1 ) + { + Error("Shader (terrain_finalize_render_context) had an incorrect number of uniform slots!"); + } + } + else + { + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/TerrainFinalize.fragmentshader\")"); + } +} + +// NOTE(Jesse): This is for binding when passing a custom RP through the UI +link_internal void +UseRenderPass_terrain_finalize_render_context( void *Struct ) +{ + UseRenderPass_terrain_finalize_render_context( Cast(terrain_finalize_render_context *, Struct) ); +} + +link_internal void +UseRenderPass( terrain_finalize_render_context *Struct ) +{ + UseRenderPass_terrain_finalize_render_context(Struct); +} + +// TODO(Jesse): Remove in favor of UseRenderPass +link_internal void +UseShader( terrain_finalize_render_context *Struct ) +{ + UseRenderPass_terrain_finalize_render_context(Struct); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +link_internal b32 +poof() +InitializeWorldEditRenderContext +( + world_edit_render_context *Struct + , v3 *ChunkDim + , v3 *WorldspaceChunkBasis + , v3 *ChunkResolution + , s32 Type +) +{ + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); + + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + + u32 UniformIndex = 0; + + Struct->ChunkDim = ChunkDim; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkDim, "ChunkDim"); + + Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); + + Struct->ChunkResolution = ChunkResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkResolution, "ChunkResolution"); + + Struct->Type = Type; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Type, "Type"); + + u32 Expected = 4 ; + if (UniformIndex != Expected ) + { + Error("Shader (world_edit_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } + } + + + + AssertNoGlErrors; + return Result; +} + +link_internal void +UseRenderPass_world_edit_render_context +( world_edit_render_context *Struct ) +{ + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); + + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + + if (UniformIndex != 4 ) + { + Error("Shader (world_edit_render_context) had an incorrect number of uniform slots!"); + } + } + else + { + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/world_edit.fragmentshader\")"); + } +} + +// NOTE(Jesse): This is for binding when passing a custom RP through the UI +link_internal void +UseRenderPass_world_edit_render_context( void *Struct ) +{ + UseRenderPass_world_edit_render_context( Cast(world_edit_render_context *, Struct) ); +} + +link_internal void +UseRenderPass( world_edit_render_context *Struct ) +{ + UseRenderPass_world_edit_render_context(Struct); +} + +// TODO(Jesse): Remove in favor of UseRenderPass +link_internal void +UseShader( world_edit_render_context *Struct ) +{ + UseRenderPass_world_edit_render_context(Struct); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -208,24 +843,86 @@ +link_internal b32 +poof(@async @render) +InitializeEasingFunctionVisualizerRenderPass +( + easing_function_visualizer_render_pass *Struct + , b32 Ignored +) +{ + b32 Result = CompileShaderPair(&Struct->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader")); + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + u32 UniformIndex = 0; + Struct->Ignored = Ignored; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); + u32 Expected = 1 ; + if (UniformIndex != Expected ) + { + Error("Shader (easing_function_visualizer_render_pass) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } + } + AssertNoGlErrors; + return Result; +} +link_internal void +UseRenderPass_easing_function_visualizer_render_pass +( easing_function_visualizer_render_pass *Struct ) +{ + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + if (UniformIndex != 1 ) + { + Error("Shader (easing_function_visualizer_render_pass) had an incorrect number of uniform slots!"); + } + } + else + { + SoftError("Attempted to bind uncompiled Shader (STDLIB_SHADER_PATH \"FullPassthrough.vertexshader\") | (BONSAI_SHADER_PATH \"curve_remap_visualizer.fragmentshader\")"); + } +} +// NOTE(Jesse): This is for binding when passing a custom RP through the UI +link_internal void +UseRenderPass_easing_function_visualizer_render_pass( void *Struct ) +{ + UseRenderPass_easing_function_visualizer_render_pass( Cast(easing_function_visualizer_render_pass *, Struct) ); +} +link_internal void +UseRenderPass( easing_function_visualizer_render_pass *Struct ) +{ + UseRenderPass_easing_function_visualizer_render_pass(Struct); +} +// TODO(Jesse): Remove in favor of UseRenderPass +link_internal void +UseShader( easing_function_visualizer_render_pass *Struct ) +{ + UseRenderPass_easing_function_visualizer_render_pass(Struct); +} @@ -287,36 +984,115 @@ +link_internal b32 +poof() +InitializeShadowMapShader +( + shadow_map_shader *Struct + , m4 ModelMatrix + , m4 ViewProjection + , v3 *MinClipP_worldspace + , v3 *MaxClipP_worldspace +) +{ + b32 Result = CompileShaderPair(&Struct->Program, CSz("shaders/DepthRTT.vertexshader"), CSz("shaders/DepthRTT.fragmentshader")); + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + u32 UniformIndex = 0; + Struct->ModelMatrix = ModelMatrix; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ModelMatrix, "ModelMatrix"); + Struct->ViewProjection = ViewProjection; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ViewProjection, "ViewProjection"); + Struct->MinClipP_worldspace = MinClipP_worldspace; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->MinClipP_worldspace, "MinClipP_worldspace"); + Struct->MaxClipP_worldspace = MaxClipP_worldspace; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->MaxClipP_worldspace, "MaxClipP_worldspace"); + u32 Expected = 4 ; + if (UniformIndex != Expected ) + { + Error("Shader (shadow_map_shader) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } + } + AssertNoGlErrors; + return Result; +} +link_internal void +UseRenderPass_shadow_map_shader +( shadow_map_shader *Struct ) +{ + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + if (UniformIndex != 4 ) + { + Error("Shader (shadow_map_shader) had an incorrect number of uniform slots!"); + } + } + else + { + SoftError("Attempted to bind uncompiled Shader (\"shaders/DepthRTT.vertexshader\") | (\"shaders/DepthRTT.fragmentshader\")"); + } +} +// NOTE(Jesse): This is for binding when passing a custom RP through the UI +link_internal void +UseRenderPass_shadow_map_shader( void *Struct ) +{ + UseRenderPass_shadow_map_shader( Cast(shadow_map_shader *, Struct) ); +} +link_internal void +UseRenderPass( shadow_map_shader *Struct ) +{ + UseRenderPass_shadow_map_shader(Struct); +} +// TODO(Jesse): Remove in favor of UseRenderPass +link_internal void +UseShader( shadow_map_shader *Struct ) +{ + UseRenderPass_shadow_map_shader(Struct); +} link_internal b32 -InitializeEasingFunctionVisualizerRenderPass( - easing_function_visualizer_render_pass *Struct - , b32 Ignored +poof() +InitializeBloomUpsampleShader +( + bloom_upsample_shader *Struct + , f32 *FilterRadius ) { - b32 Result = CompileShaderPair(&Struct->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader")); + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_upsample.fragmentshader")); if (Result) { @@ -324,15 +1100,15 @@ InitializeEasingFunctionVisualizerRenderPass( u32 UniformIndex = 0; - Struct->Ignored = Ignored; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); + Struct->FilterRadius = FilterRadius; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FilterRadius, "FilterRadius"); u32 Expected = 1 ; if (UniformIndex != Expected ) { - Error("Shader (easing_function_visualizer_render_pass) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + Error("Shader (bloom_upsample_shader) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); } } @@ -343,7 +1119,8 @@ InitializeEasingFunctionVisualizerRenderPass( } link_internal void -UseShader( easing_function_visualizer_render_pass *Struct ) +UseRenderPass_bloom_upsample_shader +( bloom_upsample_shader *Struct ) { if (Struct->Program.ID != INVALID_SHADER) { @@ -358,15 +1135,35 @@ UseShader( easing_function_visualizer_render_pass *Struct ) if (UniformIndex != 1 ) { - Error("Shader (easing_function_visualizer_render_pass) had an incorrect number of uniform slots!"); + Error("Shader (bloom_upsample_shader) had an incorrect number of uniform slots!"); } } else { - SoftError("Attempted to bind uncompiled Shader (STDLIB_SHADER_PATH \"FullPassthrough.vertexshader\") | (BONSAI_SHADER_PATH \"curve_remap_visualizer.fragmentshader\")"); + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/bloom_upsample.fragmentshader\")"); } } +// NOTE(Jesse): This is for binding when passing a custom RP through the UI +link_internal void +UseRenderPass_bloom_upsample_shader( void *Struct ) +{ + UseRenderPass_bloom_upsample_shader( Cast(bloom_upsample_shader *, Struct) ); +} + +link_internal void +UseRenderPass( bloom_upsample_shader *Struct ) +{ + UseRenderPass_bloom_upsample_shader(Struct); +} + +// TODO(Jesse): Remove in favor of UseRenderPass +link_internal void +UseShader( bloom_upsample_shader *Struct ) +{ + UseRenderPass_bloom_upsample_shader(Struct); +} + @@ -578,24 +1375,86 @@ UseShader( easing_function_visualizer_render_pass *Struct ) +link_internal b32 +poof() +InitializeTerrainDerivsRenderContext +( + terrain_derivs_render_context *Struct + , v3 Ignored +) +{ + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/derivs.fragmentshader")); + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + u32 UniformIndex = 0; + Struct->Ignored = Ignored; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); + u32 Expected = 1 ; + if (UniformIndex != Expected ) + { + Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } + } + AssertNoGlErrors; + return Result; +} +link_internal void +UseRenderPass_terrain_derivs_render_context +( terrain_derivs_render_context *Struct ) +{ + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + if (UniformIndex != 1 ) + { + Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots!"); + } + } + else + { + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/derivs.fragmentshader\")"); + } +} +// NOTE(Jesse): This is for binding when passing a custom RP through the UI +link_internal void +UseRenderPass_terrain_derivs_render_context( void *Struct ) +{ + UseRenderPass_terrain_derivs_render_context( Cast(terrain_derivs_render_context *, Struct) ); +} +link_internal void +UseRenderPass( terrain_derivs_render_context *Struct ) +{ + UseRenderPass_terrain_derivs_render_context(Struct); +} +// TODO(Jesse): Remove in favor of UseRenderPass +link_internal void +UseShader( terrain_derivs_render_context *Struct ) +{ + UseRenderPass_terrain_derivs_render_context(Struct); +} @@ -625,24 +1484,86 @@ UseShader( easing_function_visualizer_render_pass *Struct ) +link_internal b32 +poof() +InitializeBloomDownsampleShader +( + bloom_downsample_shader *Struct + , v2 *SrcResolution +) +{ + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_downsample.fragmentshader")); + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + u32 UniformIndex = 0; + Struct->SrcResolution = SrcResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SrcResolution, "SrcResolution"); + u32 Expected = 1 ; + if (UniformIndex != Expected ) + { + Error("Shader (bloom_downsample_shader) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } + } + AssertNoGlErrors; + return Result; +} +link_internal void +UseRenderPass_bloom_downsample_shader +( bloom_downsample_shader *Struct ) +{ + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + if (UniformIndex != 1 ) + { + Error("Shader (bloom_downsample_shader) had an incorrect number of uniform slots!"); + } + } + else + { + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/bloom_downsample.fragmentshader\")"); + } +} +// NOTE(Jesse): This is for binding when passing a custom RP through the UI +link_internal void +UseRenderPass_bloom_downsample_shader( void *Struct ) +{ + UseRenderPass_bloom_downsample_shader( Cast(bloom_downsample_shader *, Struct) ); +} +link_internal void +UseRenderPass( bloom_downsample_shader *Struct ) +{ + UseRenderPass_bloom_downsample_shader(Struct); +} +// TODO(Jesse): Remove in favor of UseRenderPass +link_internal void +UseShader( bloom_downsample_shader *Struct ) +{ + UseRenderPass_bloom_downsample_shader(Struct); +} @@ -742,23 +1663,95 @@ UseShader( easing_function_visualizer_render_pass *Struct ) +link_internal b32 +poof() +InitializeTerrainShapingRenderContext +( + terrain_shaping_render_context *Struct + , v3 ChunkDim + , v3 WorldspaceChunkBasis + , v3 ChunkResolution +) +{ + b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/default.fragmentshader")); + if (Result) + { + Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + u32 UniformIndex = 0; + Struct->ChunkDim = ChunkDim; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); + Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); + Struct->ChunkResolution = ChunkResolution; + SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); + u32 Expected = 3 ; + if (UniformIndex != Expected ) + { + Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); + } + } + AssertNoGlErrors; + return Result; +} +link_internal void +UseRenderPass_terrain_shaping_render_context +( terrain_shaping_render_context *Struct ) +{ + if (Struct->Program.ID != INVALID_SHADER) + { + GetGL()->UseProgram(Struct->Program.ID); + s32 TextureUnit = 0; + s32 UniformIndex = 0; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; + if (UniformIndex != 3 ) + { + Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots!"); + } + } + else + { + SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/shaping/default.fragmentshader\")"); + } +} +// NOTE(Jesse): This is for binding when passing a custom RP through the UI +link_internal void +UseRenderPass_terrain_shaping_render_context( void *Struct ) +{ + UseRenderPass_terrain_shaping_render_context( Cast(terrain_shaping_render_context *, Struct) ); +} +link_internal void +UseRenderPass( terrain_shaping_render_context *Struct ) +{ + UseRenderPass_terrain_shaping_render_context(Struct); +} +// TODO(Jesse): Remove in favor of UseRenderPass +link_internal void +UseShader( terrain_shaping_render_context *Struct ) +{ + UseRenderPass_terrain_shaping_render_context(Struct); +} diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h new file mode 100644 index 000000000..4a05e6c88 --- /dev/null +++ b/generated/for_datatypes_cx51CcgQ.h @@ -0,0 +1,7331 @@ +// src/engine/work_queue.h:269:0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +link_internal void +CompileShaderPair_Async(work_queue *Queue, shader *Shader , cs VertShaderPath , cs FragShaderPath , b32 DumpErrors , b32 RegisterForHotReload , b32* Result ) +{ + compile_shader_pair_async_params Params = + { + Result, Shader, VertShaderPath, FragShaderPath, DumpErrors, RegisterForHotReload, + }; + + work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); + PushWorkQueueEntry(Queue, &Entry); +} + +link_internal void +DoJob(compile_shader_pair_async_params *Params) +{ + auto Result = CompileShaderPair( Params->Shader , Params->VertShaderPath , Params->FragShaderPath , Params->DumpErrors , Params->RegisterForHotReload ); + if (Params->Result) { *Params->Result = Result; } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +link_internal void +InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_function_visualizer_render_pass *Struct , b32 Ignored , b32* Result ) +{ + initialize_easing_function_visualizer_render_pass_async_params Params = + { + Result, Struct, Ignored, + }; + + work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); + PushWorkQueueEntry(Queue, &Entry); +} + +link_internal void +DoJob(initialize_easing_function_visualizer_render_pass_async_params *Params) +{ + auto Result = InitializeEasingFunctionVisualizerRenderPass( Params->Struct , Params->Ignored ); + if (Params->Result) { *Params->Result = Result; } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +link_internal void +DrawLod_Async(work_queue *Queue, engine_resources *Engine , shader *Shader , gpu_mapped_element_buffer *Mesh , v3 Basis , Quaternion Rotation , v3 Scale ) +{ + draw_lod_async_params Params = + { + Engine, Shader, Mesh, Basis, Rotation, Scale, + }; + + work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); + PushWorkQueueEntry(Queue, &Entry); +} + +link_internal void +DoJob(draw_lod_async_params *Params) +{ + DrawLod( Params->Engine , Params->Shader , Params->Mesh , Params->Basis , Params->Rotation , Params->Scale ); + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index fd12d328e..70ccc2b16 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:189:0 +// src/engine/work_queue.h:191:0 @@ -42,7 +42,6 @@ -use_shader_async_params use_shader_async_params; @@ -228,13 +227,12 @@ use_shader_async_params use_shader_async_params; +initialize_easing_function_visualizer_render_pass_async_params initialize_easing_function_visualizer_render_pass_async_params; -render_to_texture_async_params render_to_texture_async_params; - diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h new file mode 100644 index 000000000..05b8d62fe --- /dev/null +++ b/generated/for_datatypes_khY6kwEk.h @@ -0,0 +1,7291 @@ +// src/engine/work_queue.h:150:0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +struct compile_shader_pair_async_params poof(@async_function_params) +{ + b32* Result; + shader *Shader; + cs VertShaderPath; + cs FragShaderPath; + b32 DumpErrors; + b32 RegisterForHotReload; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +struct initialize_easing_function_visualizer_render_pass_async_params poof(@async_function_params) +{ + b32* Result; + easing_function_visualizer_render_pass *Struct; + b32 Ignored; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +struct draw_lod_async_params poof(@async_function_params) +{ + + engine_resources *Engine; + shader *Shader; + gpu_mapped_element_buffer *Mesh; + v3 Basis; + Quaternion Rotation; + v3 Scale; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index fdc93e0fc..ca17f1d22 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:170:0 +// src/engine/work_queue.h:172:0 @@ -42,7 +42,6 @@ -type_use_shader_async_params, @@ -228,13 +227,12 @@ type_use_shader_async_params, +type_initialize_easing_function_visualizer_render_pass_async_params, -type_render_to_texture_async_params, - diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index fc5209135..e9956d3d7 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:147:0 +// src/engine/graphics.h:146:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 03f032df5..cae033f22 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:355:0 +// external/bonsai_stdlib/src/shader.cpp:356:0 b32 SetShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 8a2e63702..a684e6d8b 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:370:0 +// external/bonsai_stdlib/src/shader.cpp:371:0 b32 SetShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index 3af76ffa3..3c87805d3 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:367:0 +// external/bonsai_stdlib/src/shader.cpp:368:0 b32 SetShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index d224083d9..92ffee5d5 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:352:0 +// external/bonsai_stdlib/src/shader.cpp:353:0 b32 SetShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 2e4d19a3e..8160ddd83 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:364:0 +// external/bonsai_stdlib/src/shader.cpp:365:0 b32 SetShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index f08a02a8d..467c02082 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:358:0 +// external/bonsai_stdlib/src/shader.cpp:359:0 b32 SetShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index 898af2ffa..ab54c068e 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:361:0 +// external/bonsai_stdlib/src/shader.cpp:362:0 b32 SetShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) diff --git a/generated/shader_magic_textured_quad_render_pass.h b/generated/shader_magic_textured_quad_render_pass.h index ef20c7a3c..3ce4bb32a 100644 --- a/generated/shader_magic_textured_quad_render_pass.h +++ b/generated/shader_magic_textured_quad_render_pass.h @@ -1,7 +1,9 @@ // external/bonsai_stdlib/src/ui/ui.cpp:10:0 link_internal b32 -InitializeTexturedQuadRenderPass( +poof() +InitializeTexturedQuadRenderPass +( textured_quad_render_pass *Struct , b32 IsDepthTexture , b32 HasAlphaChannel @@ -43,7 +45,8 @@ InitializeTexturedQuadRenderPass( } link_internal void -UseShader( textured_quad_render_pass *Struct ) +UseRenderPass_textured_quad_render_pass +( textured_quad_render_pass *Struct ) { if (Struct->Program.ID != INVALID_SHADER) { @@ -74,3 +77,23 @@ UseShader( textured_quad_render_pass *Struct ) } } +// NOTE(Jesse): This is for binding when passing a custom RP through the UI +link_internal void +UseRenderPass_textured_quad_render_pass( void *Struct ) +{ + UseRenderPass_textured_quad_render_pass( Cast(textured_quad_render_pass *, Struct) ); +} + +link_internal void +UseRenderPass( textured_quad_render_pass *Struct ) +{ + UseRenderPass_textured_quad_render_pass(Struct); +} + +// TODO(Jesse): Remove in favor of UseRenderPass +link_internal void +UseShader( textured_quad_render_pass *Struct ) +{ + UseRenderPass_textured_quad_render_pass(Struct); +} + diff --git a/jesse.make.sh b/jesse.make.sh index 687048d17..c4b277014 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/src/engine/bloom.h b/src/engine/bloom.h index 61f508e88..e15a5b7e3 100644 --- a/src/engine/bloom.h +++ b/src/engine/bloom.h @@ -1,6 +1,7 @@ struct bloom_downsample_shader -poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") +poof( @render_pass + @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") @frag_source_file("shaders/bloom_downsample.fragmentshader") ) { shader Program; @@ -8,11 +9,10 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader v2 *SrcResolution; poof(@uniform) }; -poof(shader_magic(bloom_downsample_shader)) -#include struct bloom_upsample_shader -poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") +poof( @render_pass + @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") @frag_source_file("shaders/bloom_upsample.fragmentshader") ) { shader Program; @@ -22,8 +22,6 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader }; -poof(shader_magic(bloom_upsample_shader)) -#include #define BLOOM_MIP_CHAIN_COUNT (3) diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index ed4b8c9ae..75bf5db33 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -166,6 +166,10 @@ RenderMeshPreviewToTextureAndInteractWithThumb(engine_resources *Engine, window_ { UNPACK_ENGINE_RESOURCES(Engine); +#if 1 + NotImplemented; + return {}; +#else // TODO(Jesse): Do we still do this here? NotImplemented; /* SyncGpuBuffersAsync(Engine, Mesh); */ @@ -205,6 +209,8 @@ RenderMeshPreviewToTextureAndInteractWithThumb(engine_resources *Engine, window_ } return B; + +#endif } link_internal void diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 918be66fc..ca036cf9b 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -31,6 +31,7 @@ #include #include +#include #include #include #include diff --git a/src/engine/engine.h b/src/engine/engine.h index 4713ca6fa..db4c4ad70 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -48,8 +48,8 @@ link_internal engine_resources *GetEngineResources(); #include #include -#include #include +#include #include #include diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 841be69ea..645f6c80c 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -1,7 +1,8 @@ struct terrain_shaping_render_context -poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") +poof( @render_pass + @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") @frag_source_file("shaders/terrain/shaping/default.fragmentshader") ) { shader Program; @@ -15,7 +16,8 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader }; struct terrain_derivs_render_context -poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") +poof( @render_pass + @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") @frag_source_file("shaders/terrain/derivs.fragmentshader") ) { shader Program; @@ -27,7 +29,8 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader }; struct terrain_decoration_render_context -poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") +poof( @render_pass + @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") @frag_source_file("shaders/terrain/decoration/default.fragmentshader") ) { shader Program; @@ -43,17 +46,9 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader -poof(shader_magic(terrain_shaping_render_context)) -#include - -poof(shader_magic(terrain_decoration_render_context)) -#include - -poof(shader_magic(terrain_derivs_render_context)) -#include - struct world_edit_render_context -poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") +poof( @render_pass + @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") @frag_source_file("shaders/terrain/world_edit.fragmentshader") ) { shader Program; @@ -68,11 +63,9 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader s32 Type; poof(@uniform) }; -poof(shader_magic(world_edit_render_context)) -#include - struct terrain_finalize_render_context -poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") +poof( @render_pass + @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader") @frag_source_file("shaders/terrain/TerrainFinalize.fragmentshader") ) { shader Program; @@ -84,13 +77,11 @@ poof( @vert_source_file("external/bonsai_stdlib/shaders/Passthrough.vertexshader /* texture *InputTex; poof(@uniform) */ }; -poof(shader_magic(terrain_finalize_render_context)) -#include - struct easing_function_visualizer_render_pass poof( @render_pass + @async @vert_source_file(STDLIB_SHADER_PATH "FullPassthrough.vertexshader") @frag_source_file(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader") ) @@ -101,13 +92,21 @@ poof( b32 Ignored; poof(@uniform) }; + + poof( for_datatypes(all) @code_fragment func (struct_t) { struct_t.has_tag(render_pass)? { - shader_magic(struct_t) + struct_t.has_tag(async)? + { + shader_magic(struct_t, {@async @render}) + } + { + shader_magic(struct_t, {}) + } } } func (enum_t) {} diff --git a/src/engine/light.h b/src/engine/light.h index 240e22f5e..5e7f1e228 100644 --- a/src/engine/light.h +++ b/src/engine/light.h @@ -19,7 +19,8 @@ struct game_lights struct lighting_render_group -poof( @vert_source_file(BONSAI_SHADER_PATH "Lighting.vertexshader") +poof( @render_pass + @vert_source_file(BONSAI_SHADER_PATH "Lighting.vertexshader") @frag_source_file(BONSAI_SHADER_PATH "Lighting.fragmentshader") ) { @@ -71,9 +72,6 @@ poof( @vert_source_file(BONSAI_SHADER_PATH "Lighting.vertexshader") game_lights Lights; }; -poof(shader_magic(lighting_render_group)) -#include - link_internal void DoLight(game_lights *Lights, v3 RenderPosition, v3 Color) { diff --git a/src/engine/render.cpp b/src/engine/render.cpp index ce9029892..2473ec1ff 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1139,6 +1139,7 @@ DrawLod_world_chunk(engine_resources *Engine, shader *Shader, world_chunk_lod_el #if 1 link_internal void +poof(@async @render) DrawLod( engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Mesh, diff --git a/src/engine/render.h b/src/engine/render.h index a16c24c01..7907bdadf 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -226,3 +226,6 @@ DeallocateGpuElementBuffer(gpu_mapped_element_buffer *Buf); link_internal b32 SyncGpuBuffersAsync(engine_resources *Engine, lod_element_buffer *Meshes); + +link_internal void +DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Meshes, v3 Basis, Quaternion Rotation = Quaternion(), v3 Scale = V3(1.f)); diff --git a/src/engine/render/shadow_map.cpp b/src/engine/render/shadow_map.cpp new file mode 100644 index 000000000..e2fbc58c2 --- /dev/null +++ b/src/engine/render/shadow_map.cpp @@ -0,0 +1,34 @@ +link_internal b32 +InitializeShadowRenderGroup(graphics *Graphics, shadow_render_group *SG, v2i ShadowMapResolution) +{ + // The framebuffer, which regroups 0, 1, or more textures, and 0 or 1 depth buffer. + GetGL()->GenFramebuffers(1, &SG->FramebufferName); + Assert(SG->FramebufferName); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); + + + SG->ShadowMap = MakeDepthTexture(ShadowMapResolution, CSz("ShadowDepth")); + FramebufferDepthTexture(&SG->ShadowMap); + + // TODO(Jesse, id: 119, tags: opengl, es2): Not present on ES2 .. should we use them? + // No color output in the bound framebuffer, only depth. + /* glDrawBuffer(GL_NONE); */ + /* glReadBuffer(GL_NONE); */ + + /* SG->DepthShader = LoadShaders( CSz(BONSAI_SHADER_PATH "DepthRTT.vertexshader"), CSz(BONSAI_SHADER_PATH "DepthRTT.fragmentshader") ); */ + /* SG->MVP_ID = GetShaderUniform(&SG->DepthShader, "depthMVP"); */ + + AssertNoGlErrors; + + + if( GetGL()->CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + return false; + + GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GetGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); + + Ensure(InitializeShadowMapShader( &SG->Shader , IdentityMatrix, IdentityMatrix, &Graphics->MinClipP_worldspace, &Graphics->MaxClipP_worldspace )); + + AssertNoGlErrors; + return true; +} diff --git a/src/engine/render/shadow_map.h b/src/engine/render/shadow_map.h index 0704a4f5d..284de73fe 100644 --- a/src/engine/render/shadow_map.h +++ b/src/engine/render/shadow_map.h @@ -1,5 +1,6 @@ struct shadow_map_shader -poof( @vert_source_file("shaders/DepthRTT.vertexshader") +poof( @render_pass + @vert_source_file("shaders/DepthRTT.vertexshader") @frag_source_file("shaders/DepthRTT.fragmentshader") ) { shader Program; @@ -16,8 +17,6 @@ poof( @vert_source_file("shaders/DepthRTT.vertexshader") v3 *MinClipP_worldspace; poof(@uniform) v3 *MaxClipP_worldspace; poof(@uniform) }; -poof(shader_magic(shadow_map_shader)) -#include struct shadow_render_group { @@ -27,37 +26,3 @@ struct shadow_render_group shadow_map_shader Shader; }; -link_internal b32 -InitializeShadowRenderGroup(graphics *Graphics, shadow_render_group *SG, v2i ShadowMapResolution) -{ - // The framebuffer, which regroups 0, 1, or more textures, and 0 or 1 depth buffer. - GetGL()->GenFramebuffers(1, &SG->FramebufferName); - Assert(SG->FramebufferName); - GetGL()->BindFramebuffer(GL_FRAMEBUFFER, SG->FramebufferName); - - - SG->ShadowMap = MakeDepthTexture(ShadowMapResolution, CSz("ShadowDepth")); - FramebufferDepthTexture(&SG->ShadowMap); - - // TODO(Jesse, id: 119, tags: opengl, es2): Not present on ES2 .. should we use them? - // No color output in the bound framebuffer, only depth. - /* glDrawBuffer(GL_NONE); */ - /* glReadBuffer(GL_NONE); */ - - /* SG->DepthShader = LoadShaders( CSz(BONSAI_SHADER_PATH "DepthRTT.vertexshader"), CSz(BONSAI_SHADER_PATH "DepthRTT.fragmentshader") ); */ - /* SG->MVP_ID = GetShaderUniform(&SG->DepthShader, "depthMVP"); */ - - AssertNoGlErrors; - - - if( GetGL()->CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - return false; - - GetGL()->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - GetGL()->BindFramebuffer(GL_FRAMEBUFFER, 0); - - Ensure(InitializeShadowMapShader( &SG->Shader , IdentityMatrix, IdentityMatrix, &Graphics->MinClipP_worldspace, &Graphics->MaxClipP_worldspace )); - - AssertNoGlErrors; - return true; -} diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index 99a72e0f1..8396eb4bb 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -140,29 +140,31 @@ poof( link_internal void DoJob((func_t.name.to_snake_case)_async_params *Params) { - func_t.value? { *Params->Result = } func_t.name((func_t.map(arg).sep(,) { Params->(arg.name) })); + func_t.value? { auto Result = } func_t.name((func_t.map(arg).sep(,) { Params->(arg.name) })); + func_t.value? { if (Params->Result) { *Params->Result = Result; } } } } ) - -poof(asyncify_render_function_h(RenderToTexture)) -#include - -link_internal void -DrawLod(engine_resources *Engine, shader *Shader, gpu_mapped_element_buffer *Meshes, v3 Basis, Quaternion Rotation = Quaternion(), v3 Scale = V3(1.f)); - - -poof(asyncify_render_function_h(DrawLod)) -#include - -poof(asyncify_render_function_h(CompileShaderPair)) -#include - -poof(asyncify_render_function_h(UseShader)) -#include +poof( + for_datatypes(all) @code_fragment + func (struct_t) {} + func (enum_t) {} + func (func_t) + { + func_t.has_tag(async)? + { + func_t.has_tag(render)? + { + asyncify_render_function_h(func_t) + } + } + } +) +#include +// Genereate tagged_union for async functions enum async_function_call_type { @@ -239,32 +241,6 @@ poof(d_union_constructors(work_queue_entry)) - - -link_internal s32 -EventsCurrentlyInQueue(work_queue *Queue) -{ - u32 Enqueue = Queue->EnqueueIndex; - u32 Dequeue = Queue->DequeueIndex; - - s32 Result = 0; - if (Dequeue < Enqueue) - { - Result = s32(Enqueue - Dequeue); - } - - if (Enqueue < Dequeue) - { - Result = s32((WORK_QUEUE_SIZE - Dequeue) + Enqueue); - } - - Assert(Result >= 0); - return Result; -} - - - - poof( for_datatypes(all) @code_fragment func (struct_t) @@ -287,56 +263,50 @@ poof( ) #include -link_internal void -RenderToTexture(engine_resources *Engine, asset_thumbnail *Thumb, gpu_mapped_element_buffer *Meshes, v3 Offset, camera *Camera); - -poof(asyncify_render_function_c(RenderToTexture)) -#include - -poof(asyncify_render_function_c(DrawLod)) -#include -poof(asyncify_render_function_c(CompileShaderPair)) -#include -poof(asyncify_render_function_c(UseShader)) -#include - -/* poof(asyncify_render_function_c(InitializeEasingFunctionVisualizerRenderPass)) */ -/* #include */ +poof( + for_datatypes(all) @code_fragment + func (struct_t) {} + func (enum_t) {} + func (func_t) + { + func_t.has_tag(async)? + { + func_t.has_tag(render)? + { + asyncify_render_function_c(func_t) + } + } + } +) +#include link_internal void DispatchAsyncFunctionCall(work_queue_entry_async_function_call *Task) { tswitch(Task) { - { - tmatch(render_to_texture_async_params, Task, Job); - DoJob(Job); - } break; + poof( + func (async_function_call_type tag_t) + { + tag_t.map(tag_v) + { + { + tmatch( tag_v.name.strip_single_prefix, Task, Job ); + DoJob(Job); + } break; + } + } + ) +#include + } +} - { - tmatch(draw_lod_async_params, Task, Job); - DoJob(Job); - } break; - { - tmatch(compile_shader_pair_async_params, Task, Job); - DoJob(Job); - } break; - { - tmatch(use_shader_async_params, Task, Job); - DoJob(Job); - } break; - /* { */ - /* tmatch(easing_function_visualizer_render_pass_async_params, Task, Job); */ - /* DoJob(Job); */ - /* } break; */ - } -} @@ -345,7 +315,26 @@ DispatchAsyncFunctionCall(work_queue_entry_async_function_call *Task) +link_internal s32 +EventsCurrentlyInQueue(work_queue *Queue) +{ + u32 Enqueue = Queue->EnqueueIndex; + u32 Dequeue = Queue->DequeueIndex; + s32 Result = 0; + if (Dequeue < Enqueue) + { + Result = s32(Enqueue - Dequeue); + } + + if (Enqueue < Dequeue) + { + Result = s32((WORK_QUEUE_SIZE - Dequeue) + Enqueue); + } + + Assert(Result >= 0); + return Result; +} // TODO(Jesse): Gen this from the constructors generator link_internal work_queue_entry @@ -378,5 +367,3 @@ TakeOwnershipSync(lod_element_buffer *Buf, world_chunk_mesh_bitfield MeshBit); link_internal void ReleaseOwnership(lod_element_buffer *Src, world_chunk_mesh_bitfield MeshBit, untextured_3d_geometry_buffer *Buf); - - From 4fd2187b830795029b6a53ed72eadc8ff35a156f Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 16 Oct 2025 10:29:24 -0700 Subject: [PATCH 350/421] Setup to drive array uniforms --- examples/terrain_gen/game.cpp | 22 +- examples/terrain_gen/game_types.h | 3 +- external/bonsai_stdlib | 2 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../block_array_h_shader_ptr_688853971_0.h | 2 +- generated/buffer_h_struct_u32.h | 2 +- generated/for_datatypes_IXWy6K9V.h | 532 +++++++++--------- generated/for_datatypes_cx51CcgQ.h | 23 +- generated/for_datatypes_khY6kwEk.h | 22 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- generated/gen_shader_uniform_push_camera.h | 11 +- generated/gen_shader_uniform_push_light.h | 11 +- generated/gen_shader_uniform_push_m4.h | 11 +- generated/gen_shader_uniform_push_r32.h | 11 +- generated/gen_shader_uniform_push_s32.h | 11 +- generated/gen_shader_uniform_push_texture.h | 11 +- generated/gen_shader_uniform_push_u32.h | 11 +- generated/gen_shader_uniform_push_v2.h | 11 +- generated/gen_shader_uniform_push_v3.h | 11 +- .../shader_magic_textured_quad_render_pass.h | 48 +- src/engine/graphics.h | 14 +- src/engine/render/render_init.cpp | 86 +-- src/engine/shader.h | 3 +- 24 files changed, 490 insertions(+), 374 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index f436e3ed1..cad1b1c8c 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -46,27 +46,19 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() CameraGhost->P.WorldP = VisibleRegion/2; CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); - InitializeEasingFunctionVisualizerRenderPass_Async( RenderQ, &GameState->EasingFunctionVisRP, False, 0); - - /* CompileShaderPair_Async( RenderQ, */ - /* &GameState->Shader, */ - /* CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), */ - /* CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader"), */ - /* True, True, &GameState->ShaderCompileSuccess); */ + auto *EasingFunction = &GameState->EasingFunction; + InitializeEasingFunctionVisualizerRenderPass_Async( + RenderQ, + &GameState->EasingFunctionVisRP, + EasingFunction->Points.Start, + EasingFunction->Points.At, + 0); SpawnEntity(CameraGhost); return GameState; } -struct easing_function -{ - cs Name; - v2_static_cursor_16 Points; -}; - - - BONSAI_API_MAIN_THREAD_CALLBACK() { Assert(ThreadLocal_ThreadIndex == 0); diff --git a/examples/terrain_gen/game_types.h b/examples/terrain_gen/game_types.h index fef665105..c954548b3 100644 --- a/examples/terrain_gen/game_types.h +++ b/examples/terrain_gen/game_types.h @@ -32,8 +32,7 @@ struct game_state { terrain_gen_type TerrainGenType; + easing_function EasingFunction; easing_function_visualizer_render_pass EasingFunctionVisRP; - /* shader Shader; */ - /* b32 ShaderCompileSuccess; */ }; diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 0dc029ffa..d77ba3641 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 0dc029ffa04a58799fcb0ca4ae3989d5f36c509c +Subproject commit d77ba364182a6bbb1d0a35bfdec16e23d2520b71 diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 121ea8eb5..441211edc 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:160:0 +// src/engine/graphics.h:166:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index d3803baa7..450a46dbf 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:149:0 +// src/engine/graphics.h:155:0 diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index f187d1484..6bfb44a71 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:175:0 +// external/bonsai_stdlib/src/shader.h:180:0 diff --git a/generated/buffer_h_struct_u32.h b/generated/buffer_h_struct_u32.h index c69188be1..d7d6ead9a 100644 --- a/generated/buffer_h_struct_u32.h +++ b/generated/buffer_h_struct_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:156:0 +// external/bonsai_stdlib/src/shader.h:161:0 struct shader_uniform_buffer { diff --git a/generated/for_datatypes_IXWy6K9V.h b/generated/for_datatypes_IXWy6K9V.h index 8aecda2d2..927452228 100644 --- a/generated/for_datatypes_IXWy6K9V.h +++ b/generated/for_datatypes_IXWy6K9V.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:98:0 +// src/engine/graphics.h:104:0 @@ -12,7 +12,7 @@ link_internal b32 poof() InitializeLightingRenderGroup ( - lighting_render_group *Struct + lighting_render_group *Element , texture *gColor , texture *gNormal , texture *gDepth @@ -42,91 +42,91 @@ InitializeLightingRenderGroup ) { - b32 Result = CompileShaderPair(&Struct->Program, CSz(BONSAI_SHADER_PATH "Lighting.vertexshader"), CSz(BONSAI_SHADER_PATH "Lighting.fragmentshader")); + b32 Result = CompileShaderPair(&Element->Program, CSz(BONSAI_SHADER_PATH "Lighting.vertexshader"), CSz(BONSAI_SHADER_PATH "Lighting.fragmentshader")); if (Result) { - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + Element->Program.Uniforms = ShaderUniformBuffer(Element->Uniforms, ArrayCount(Element->Uniforms)); u32 UniformIndex = 0; - Struct->gColor = gColor; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gColor, "gColor"); + Element->gColor = gColor; + InitShaderUniform(&Element->Program, UniformIndex++, Element->gColor, "gColor" ); - Struct->gNormal = gNormal; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gNormal, "gNormal"); + Element->gNormal = gNormal; + InitShaderUniform(&Element->Program, UniformIndex++, Element->gNormal, "gNormal" ); - Struct->gDepth = gDepth; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->gDepth, "gDepth"); + Element->gDepth = gDepth; + InitShaderUniform(&Element->Program, UniformIndex++, Element->gDepth, "gDepth" ); - Struct->shadowMap = shadowMap; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->shadowMap, "shadowMap"); + Element->shadowMap = shadowMap; + InitShaderUniform(&Element->Program, UniformIndex++, Element->shadowMap, "shadowMap" ); - Struct->Ssao = Ssao; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->Ssao, "Ssao"); + Element->Ssao = Ssao; + InitShaderUniform(&Element->Program, UniformIndex++, Element->Ssao, "Ssao" ); - Struct->TransparencyAccumTex = TransparencyAccumTex; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->TransparencyAccumTex, "TransparencyAccumTex"); + Element->TransparencyAccumTex = TransparencyAccumTex; + InitShaderUniform(&Element->Program, UniformIndex++, Element->TransparencyAccumTex, "TransparencyAccumTex" ); - Struct->TransparencyCountTex = TransparencyCountTex; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->TransparencyCountTex, "TransparencyCountTex"); + Element->TransparencyCountTex = TransparencyCountTex; + InitShaderUniform(&Element->Program, UniformIndex++, Element->TransparencyCountTex, "TransparencyCountTex" ); - Struct->BravoilMyersOIT = BravoilMyersOIT; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->BravoilMyersOIT, "BravoilMyersOIT"); + Element->BravoilMyersOIT = BravoilMyersOIT; + InitShaderUniform(&Element->Program, UniformIndex++, Element->BravoilMyersOIT, "BravoilMyersOIT" ); - Struct->BravoilMcGuireOIT = BravoilMcGuireOIT; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->BravoilMcGuireOIT, "BravoilMcGuireOIT"); + Element->BravoilMcGuireOIT = BravoilMcGuireOIT; + InitShaderUniform(&Element->Program, UniformIndex++, Element->BravoilMcGuireOIT, "BravoilMcGuireOIT" ); - Struct->InverseViewMatrix = InverseViewMatrix; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InverseViewMatrix, "InverseViewMatrix"); + Element->InverseViewMatrix = InverseViewMatrix; + InitShaderUniform(&Element->Program, UniformIndex++, Element->InverseViewMatrix, "InverseViewMatrix" ); - Struct->InverseProjectionMatrix = InverseProjectionMatrix; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->InverseProjectionMatrix, "InverseProjectionMatrix"); + Element->InverseProjectionMatrix = InverseProjectionMatrix; + InitShaderUniform(&Element->Program, UniformIndex++, Element->InverseProjectionMatrix, "InverseProjectionMatrix" ); - Struct->ShadowMVP = ShadowMVP; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ShadowMVP, "ShadowMVP"); + Element->ShadowMVP = ShadowMVP; + InitShaderUniform(&Element->Program, UniformIndex++, Element->ShadowMVP, "ShadowMVP" ); - Struct->LightColors = LightColors; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightColors, "LightColors"); + Element->LightColors = LightColors; + InitShaderUniform(&Element->Program, UniformIndex++, Element->LightColors, "LightColors" ); - Struct->LightPositions = LightPositions; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightPositions, "LightPositions"); + Element->LightPositions = LightPositions; + InitShaderUniform(&Element->Program, UniformIndex++, Element->LightPositions, "LightPositions" ); - Struct->LightIndexToUV = LightIndexToUV; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightIndexToUV, "LightIndexToUV"); + Element->LightIndexToUV = LightIndexToUV; + InitShaderUniform(&Element->Program, UniformIndex++, Element->LightIndexToUV, "LightIndexToUV" ); - Struct->LightCount = LightCount; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->LightCount, "LightCount"); + Element->LightCount = LightCount; + InitShaderUniform(&Element->Program, UniformIndex++, Element->LightCount, "LightCount" ); - Struct->Camera = Camera; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->Camera, "Camera"); + Element->Camera = Camera; + InitShaderUniform(&Element->Program, UniformIndex++, Element->Camera, "Camera" ); - Struct->SunPosition = SunPosition; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SunPosition, "SunPosition"); + Element->SunPosition = SunPosition; + InitShaderUniform(&Element->Program, UniformIndex++, Element->SunPosition, "SunPosition" ); - Struct->SunColor = SunColor; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SunColor, "SunColor"); + Element->SunColor = SunColor; + InitShaderUniform(&Element->Program, UniformIndex++, Element->SunColor, "SunColor" ); - Struct->FogColor = FogColor; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FogColor, "FogColor"); + Element->FogColor = FogColor; + InitShaderUniform(&Element->Program, UniformIndex++, Element->FogColor, "FogColor" ); - Struct->FogPower = FogPower; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FogPower, "FogPower"); + Element->FogPower = FogPower; + InitShaderUniform(&Element->Program, UniformIndex++, Element->FogPower, "FogPower" ); - Struct->UseSsao = UseSsao; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseSsao, "UseSsao"); + Element->UseSsao = UseSsao; + InitShaderUniform(&Element->Program, UniformIndex++, Element->UseSsao, "UseSsao" ); - Struct->UseShadowMapping = UseShadowMapping; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseShadowMapping, "UseShadowMapping"); + Element->UseShadowMapping = UseShadowMapping; + InitShaderUniform(&Element->Program, UniformIndex++, Element->UseShadowMapping, "UseShadowMapping" ); - Struct->UseLightingBloom = UseLightingBloom; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->UseLightingBloom, "UseLightingBloom"); + Element->UseLightingBloom = UseLightingBloom; + InitShaderUniform(&Element->Program, UniformIndex++, Element->UseLightingBloom, "UseLightingBloom" ); - Struct->ApplicationResolution = ApplicationResolution; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ApplicationResolution, "ApplicationResolution"); + Element->ApplicationResolution = ApplicationResolution; + InitShaderUniform(&Element->Program, UniformIndex++, Element->ApplicationResolution, "ApplicationResolution" ); - Struct->ShadowMapResolution = ShadowMapResolution; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ShadowMapResolution, "ShadowMapResolution"); + Element->ShadowMapResolution = ShadowMapResolution; + InitShaderUniform(&Element->Program, UniformIndex++, Element->ShadowMapResolution, "ShadowMapResolution" ); @@ -145,90 +145,90 @@ InitializeLightingRenderGroup link_internal void UseRenderPass_lighting_render_group -( lighting_render_group *Struct ) +( lighting_render_group *Element ) { - if (Struct->Program.ID != INVALID_SHADER) + if (Element->Program.ID != INVALID_SHADER) { - GetGL()->UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Element->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; @@ -246,22 +246,22 @@ UseRenderPass_lighting_render_group // NOTE(Jesse): This is for binding when passing a custom RP through the UI link_internal void -UseRenderPass_lighting_render_group( void *Struct ) +UseRenderPass_lighting_render_group( void *Element ) { - UseRenderPass_lighting_render_group( Cast(lighting_render_group *, Struct) ); + UseRenderPass_lighting_render_group( Cast(lighting_render_group *, Element) ); } link_internal void -UseRenderPass( lighting_render_group *Struct ) +UseRenderPass( lighting_render_group *Element ) { - UseRenderPass_lighting_render_group(Struct); + UseRenderPass_lighting_render_group(Element); } // TODO(Jesse): Remove in favor of UseRenderPass link_internal void -UseShader( lighting_render_group *Struct ) +UseShader( lighting_render_group *Element ) { - UseRenderPass_lighting_render_group(Struct); + UseRenderPass_lighting_render_group(Element); } @@ -367,32 +367,32 @@ link_internal b32 poof() InitializeTerrainDecorationRenderContext ( - terrain_decoration_render_context *Struct + terrain_decoration_render_context *Element , texture *DerivsTex , v3 ChunkDim , v3 WorldspaceChunkBasis , v3 ChunkResolution ) { - b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/default.fragmentshader")); + b32 Result = CompileShaderPair(&Element->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/default.fragmentshader")); if (Result) { - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + Element->Program.Uniforms = ShaderUniformBuffer(Element->Uniforms, ArrayCount(Element->Uniforms)); u32 UniformIndex = 0; - Struct->DerivsTex = DerivsTex; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->DerivsTex, "DerivsTex"); + Element->DerivsTex = DerivsTex; + InitShaderUniform(&Element->Program, UniformIndex++, Element->DerivsTex, "DerivsTex" ); - Struct->ChunkDim = ChunkDim; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); + Element->ChunkDim = ChunkDim; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->ChunkDim, "ChunkDim" ); - Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); + Element->WorldspaceChunkBasis = WorldspaceChunkBasis; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->WorldspaceChunkBasis, "WorldspaceChunkBasis" ); - Struct->ChunkResolution = ChunkResolution; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); + Element->ChunkResolution = ChunkResolution; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->ChunkResolution, "ChunkResolution" ); u32 Expected = 4 ; if (UniformIndex != Expected ) @@ -409,24 +409,24 @@ InitializeTerrainDecorationRenderContext link_internal void UseRenderPass_terrain_decoration_render_context -( terrain_decoration_render_context *Struct ) +( terrain_decoration_render_context *Element ) { - if (Struct->Program.ID != INVALID_SHADER) + if (Element->Program.ID != INVALID_SHADER) { - GetGL()->UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Element->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; if (UniformIndex != 4 ) @@ -442,22 +442,22 @@ UseRenderPass_terrain_decoration_render_context // NOTE(Jesse): This is for binding when passing a custom RP through the UI link_internal void -UseRenderPass_terrain_decoration_render_context( void *Struct ) +UseRenderPass_terrain_decoration_render_context( void *Element ) { - UseRenderPass_terrain_decoration_render_context( Cast(terrain_decoration_render_context *, Struct) ); + UseRenderPass_terrain_decoration_render_context( Cast(terrain_decoration_render_context *, Element) ); } link_internal void -UseRenderPass( terrain_decoration_render_context *Struct ) +UseRenderPass( terrain_decoration_render_context *Element ) { - UseRenderPass_terrain_decoration_render_context(Struct); + UseRenderPass_terrain_decoration_render_context(Element); } // TODO(Jesse): Remove in favor of UseRenderPass link_internal void -UseShader( terrain_decoration_render_context *Struct ) +UseShader( terrain_decoration_render_context *Element ) { - UseRenderPass_terrain_decoration_render_context(Struct); + UseRenderPass_terrain_decoration_render_context(Element); } @@ -481,21 +481,21 @@ link_internal b32 poof() InitializeTerrainFinalizeRenderContext ( - terrain_finalize_render_context *Struct + terrain_finalize_render_context *Element , u32 Ignored ) { - b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/TerrainFinalize.fragmentshader")); + b32 Result = CompileShaderPair(&Element->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/TerrainFinalize.fragmentshader")); if (Result) { - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + Element->Program.Uniforms = ShaderUniformBuffer(Element->Uniforms, ArrayCount(Element->Uniforms)); u32 UniformIndex = 0; - Struct->Ignored = Ignored; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); + Element->Ignored = Ignored; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->Ignored, "Ignored" ); @@ -514,15 +514,15 @@ InitializeTerrainFinalizeRenderContext link_internal void UseRenderPass_terrain_finalize_render_context -( terrain_finalize_render_context *Struct ) +( terrain_finalize_render_context *Element ) { - if (Struct->Program.ID != INVALID_SHADER) + if (Element->Program.ID != INVALID_SHADER) { - GetGL()->UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Element->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; @@ -540,22 +540,22 @@ UseRenderPass_terrain_finalize_render_context // NOTE(Jesse): This is for binding when passing a custom RP through the UI link_internal void -UseRenderPass_terrain_finalize_render_context( void *Struct ) +UseRenderPass_terrain_finalize_render_context( void *Element ) { - UseRenderPass_terrain_finalize_render_context( Cast(terrain_finalize_render_context *, Struct) ); + UseRenderPass_terrain_finalize_render_context( Cast(terrain_finalize_render_context *, Element) ); } link_internal void -UseRenderPass( terrain_finalize_render_context *Struct ) +UseRenderPass( terrain_finalize_render_context *Element ) { - UseRenderPass_terrain_finalize_render_context(Struct); + UseRenderPass_terrain_finalize_render_context(Element); } // TODO(Jesse): Remove in favor of UseRenderPass link_internal void -UseShader( terrain_finalize_render_context *Struct ) +UseShader( terrain_finalize_render_context *Element ) { - UseRenderPass_terrain_finalize_render_context(Struct); + UseRenderPass_terrain_finalize_render_context(Element); } @@ -629,32 +629,32 @@ link_internal b32 poof() InitializeWorldEditRenderContext ( - world_edit_render_context *Struct + world_edit_render_context *Element , v3 *ChunkDim , v3 *WorldspaceChunkBasis , v3 *ChunkResolution , s32 Type ) { - b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); + b32 Result = CompileShaderPair(&Element->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); if (Result) { - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + Element->Program.Uniforms = ShaderUniformBuffer(Element->Uniforms, ArrayCount(Element->Uniforms)); u32 UniformIndex = 0; - Struct->ChunkDim = ChunkDim; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkDim, "ChunkDim"); + Element->ChunkDim = ChunkDim; + InitShaderUniform(&Element->Program, UniformIndex++, Element->ChunkDim, "ChunkDim" ); - Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); + Element->WorldspaceChunkBasis = WorldspaceChunkBasis; + InitShaderUniform(&Element->Program, UniformIndex++, Element->WorldspaceChunkBasis, "WorldspaceChunkBasis" ); - Struct->ChunkResolution = ChunkResolution; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->ChunkResolution, "ChunkResolution"); + Element->ChunkResolution = ChunkResolution; + InitShaderUniform(&Element->Program, UniformIndex++, Element->ChunkResolution, "ChunkResolution" ); - Struct->Type = Type; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Type, "Type"); + Element->Type = Type; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->Type, "Type" ); u32 Expected = 4 ; if (UniformIndex != Expected ) @@ -671,24 +671,24 @@ InitializeWorldEditRenderContext link_internal void UseRenderPass_world_edit_render_context -( world_edit_render_context *Struct ) +( world_edit_render_context *Element ) { - if (Struct->Program.ID != INVALID_SHADER) + if (Element->Program.ID != INVALID_SHADER) { - GetGL()->UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Element->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; if (UniformIndex != 4 ) @@ -704,22 +704,22 @@ UseRenderPass_world_edit_render_context // NOTE(Jesse): This is for binding when passing a custom RP through the UI link_internal void -UseRenderPass_world_edit_render_context( void *Struct ) +UseRenderPass_world_edit_render_context( void *Element ) { - UseRenderPass_world_edit_render_context( Cast(world_edit_render_context *, Struct) ); + UseRenderPass_world_edit_render_context( Cast(world_edit_render_context *, Element) ); } link_internal void -UseRenderPass( world_edit_render_context *Struct ) +UseRenderPass( world_edit_render_context *Element ) { - UseRenderPass_world_edit_render_context(Struct); + UseRenderPass_world_edit_render_context(Element); } // TODO(Jesse): Remove in favor of UseRenderPass link_internal void -UseShader( world_edit_render_context *Struct ) +UseShader( world_edit_render_context *Element ) { - UseRenderPass_world_edit_render_context(Struct); + UseRenderPass_world_edit_render_context(Element); } @@ -847,25 +847,26 @@ link_internal b32 poof(@async @render) InitializeEasingFunctionVisualizerRenderPass ( - easing_function_visualizer_render_pass *Struct - , b32 Ignored - + easing_function_visualizer_render_pass *Element + , v2 *Points + , u32 Count ) { - b32 Result = CompileShaderPair(&Struct->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader")); + b32 Result = CompileShaderPair(&Element->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader")); if (Result) { - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + Element->Program.Uniforms = ShaderUniformBuffer(Element->Uniforms, ArrayCount(Element->Uniforms)); u32 UniformIndex = 0; - Struct->Ignored = Ignored; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); - + Element->Points = Points; + InitShaderUniform(&Element->Program, UniformIndex++, Element->Points, "Points" , Cast(u16, Count)); + Element->Count = Count; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->Count, "Count" ); - u32 Expected = 1 ; + u32 Expected = 2 ; if (UniformIndex != Expected ) { Error("Shader (easing_function_visualizer_render_pass) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); @@ -880,20 +881,21 @@ InitializeEasingFunctionVisualizerRenderPass link_internal void UseRenderPass_easing_function_visualizer_render_pass -( easing_function_visualizer_render_pass *Struct ) +( easing_function_visualizer_render_pass *Element ) { - if (Struct->Program.ID != INVALID_SHADER) + if (Element->Program.ID != INVALID_SHADER) { - GetGL()->UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Element->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); + ++UniformIndex; - - if (UniformIndex != 1 ) + if (UniformIndex != 2 ) { Error("Shader (easing_function_visualizer_render_pass) had an incorrect number of uniform slots!"); } @@ -906,22 +908,22 @@ UseRenderPass_easing_function_visualizer_render_pass // NOTE(Jesse): This is for binding when passing a custom RP through the UI link_internal void -UseRenderPass_easing_function_visualizer_render_pass( void *Struct ) +UseRenderPass_easing_function_visualizer_render_pass( void *Element ) { - UseRenderPass_easing_function_visualizer_render_pass( Cast(easing_function_visualizer_render_pass *, Struct) ); + UseRenderPass_easing_function_visualizer_render_pass( Cast(easing_function_visualizer_render_pass *, Element) ); } link_internal void -UseRenderPass( easing_function_visualizer_render_pass *Struct ) +UseRenderPass( easing_function_visualizer_render_pass *Element ) { - UseRenderPass_easing_function_visualizer_render_pass(Struct); + UseRenderPass_easing_function_visualizer_render_pass(Element); } // TODO(Jesse): Remove in favor of UseRenderPass link_internal void -UseShader( easing_function_visualizer_render_pass *Struct ) +UseShader( easing_function_visualizer_render_pass *Element ) { - UseRenderPass_easing_function_visualizer_render_pass(Struct); + UseRenderPass_easing_function_visualizer_render_pass(Element); } @@ -988,32 +990,32 @@ link_internal b32 poof() InitializeShadowMapShader ( - shadow_map_shader *Struct + shadow_map_shader *Element , m4 ModelMatrix , m4 ViewProjection , v3 *MinClipP_worldspace , v3 *MaxClipP_worldspace ) { - b32 Result = CompileShaderPair(&Struct->Program, CSz("shaders/DepthRTT.vertexshader"), CSz("shaders/DepthRTT.fragmentshader")); + b32 Result = CompileShaderPair(&Element->Program, CSz("shaders/DepthRTT.vertexshader"), CSz("shaders/DepthRTT.fragmentshader")); if (Result) { - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + Element->Program.Uniforms = ShaderUniformBuffer(Element->Uniforms, ArrayCount(Element->Uniforms)); u32 UniformIndex = 0; - Struct->ModelMatrix = ModelMatrix; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ModelMatrix, "ModelMatrix"); + Element->ModelMatrix = ModelMatrix; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->ModelMatrix, "ModelMatrix" ); - Struct->ViewProjection = ViewProjection; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ViewProjection, "ViewProjection"); + Element->ViewProjection = ViewProjection; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->ViewProjection, "ViewProjection" ); - Struct->MinClipP_worldspace = MinClipP_worldspace; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->MinClipP_worldspace, "MinClipP_worldspace"); + Element->MinClipP_worldspace = MinClipP_worldspace; + InitShaderUniform(&Element->Program, UniformIndex++, Element->MinClipP_worldspace, "MinClipP_worldspace" ); - Struct->MaxClipP_worldspace = MaxClipP_worldspace; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->MaxClipP_worldspace, "MaxClipP_worldspace"); + Element->MaxClipP_worldspace = MaxClipP_worldspace; + InitShaderUniform(&Element->Program, UniformIndex++, Element->MaxClipP_worldspace, "MaxClipP_worldspace" ); u32 Expected = 4 ; if (UniformIndex != Expected ) @@ -1030,24 +1032,24 @@ InitializeShadowMapShader link_internal void UseRenderPass_shadow_map_shader -( shadow_map_shader *Struct ) +( shadow_map_shader *Element ) { - if (Struct->Program.ID != INVALID_SHADER) + if (Element->Program.ID != INVALID_SHADER) { - GetGL()->UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Element->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; if (UniformIndex != 4 ) @@ -1063,22 +1065,22 @@ UseRenderPass_shadow_map_shader // NOTE(Jesse): This is for binding when passing a custom RP through the UI link_internal void -UseRenderPass_shadow_map_shader( void *Struct ) +UseRenderPass_shadow_map_shader( void *Element ) { - UseRenderPass_shadow_map_shader( Cast(shadow_map_shader *, Struct) ); + UseRenderPass_shadow_map_shader( Cast(shadow_map_shader *, Element) ); } link_internal void -UseRenderPass( shadow_map_shader *Struct ) +UseRenderPass( shadow_map_shader *Element ) { - UseRenderPass_shadow_map_shader(Struct); + UseRenderPass_shadow_map_shader(Element); } // TODO(Jesse): Remove in favor of UseRenderPass link_internal void -UseShader( shadow_map_shader *Struct ) +UseShader( shadow_map_shader *Element ) { - UseRenderPass_shadow_map_shader(Struct); + UseRenderPass_shadow_map_shader(Element); } @@ -1087,21 +1089,21 @@ link_internal b32 poof() InitializeBloomUpsampleShader ( - bloom_upsample_shader *Struct + bloom_upsample_shader *Element , f32 *FilterRadius ) { - b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_upsample.fragmentshader")); + b32 Result = CompileShaderPair(&Element->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_upsample.fragmentshader")); if (Result) { - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + Element->Program.Uniforms = ShaderUniformBuffer(Element->Uniforms, ArrayCount(Element->Uniforms)); u32 UniformIndex = 0; - Struct->FilterRadius = FilterRadius; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->FilterRadius, "FilterRadius"); + Element->FilterRadius = FilterRadius; + InitShaderUniform(&Element->Program, UniformIndex++, Element->FilterRadius, "FilterRadius" ); @@ -1120,15 +1122,15 @@ InitializeBloomUpsampleShader link_internal void UseRenderPass_bloom_upsample_shader -( bloom_upsample_shader *Struct ) +( bloom_upsample_shader *Element ) { - if (Struct->Program.ID != INVALID_SHADER) + if (Element->Program.ID != INVALID_SHADER) { - GetGL()->UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Element->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; @@ -1146,22 +1148,22 @@ UseRenderPass_bloom_upsample_shader // NOTE(Jesse): This is for binding when passing a custom RP through the UI link_internal void -UseRenderPass_bloom_upsample_shader( void *Struct ) +UseRenderPass_bloom_upsample_shader( void *Element ) { - UseRenderPass_bloom_upsample_shader( Cast(bloom_upsample_shader *, Struct) ); + UseRenderPass_bloom_upsample_shader( Cast(bloom_upsample_shader *, Element) ); } link_internal void -UseRenderPass( bloom_upsample_shader *Struct ) +UseRenderPass( bloom_upsample_shader *Element ) { - UseRenderPass_bloom_upsample_shader(Struct); + UseRenderPass_bloom_upsample_shader(Element); } // TODO(Jesse): Remove in favor of UseRenderPass link_internal void -UseShader( bloom_upsample_shader *Struct ) +UseShader( bloom_upsample_shader *Element ) { - UseRenderPass_bloom_upsample_shader(Struct); + UseRenderPass_bloom_upsample_shader(Element); } @@ -1379,21 +1381,21 @@ link_internal b32 poof() InitializeTerrainDerivsRenderContext ( - terrain_derivs_render_context *Struct + terrain_derivs_render_context *Element , v3 Ignored ) { - b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/derivs.fragmentshader")); + b32 Result = CompileShaderPair(&Element->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/derivs.fragmentshader")); if (Result) { - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + Element->Program.Uniforms = ShaderUniformBuffer(Element->Uniforms, ArrayCount(Element->Uniforms)); u32 UniformIndex = 0; - Struct->Ignored = Ignored; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Ignored, "Ignored"); + Element->Ignored = Ignored; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->Ignored, "Ignored" ); @@ -1412,15 +1414,15 @@ InitializeTerrainDerivsRenderContext link_internal void UseRenderPass_terrain_derivs_render_context -( terrain_derivs_render_context *Struct ) +( terrain_derivs_render_context *Element ) { - if (Struct->Program.ID != INVALID_SHADER) + if (Element->Program.ID != INVALID_SHADER) { - GetGL()->UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Element->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; @@ -1438,22 +1440,22 @@ UseRenderPass_terrain_derivs_render_context // NOTE(Jesse): This is for binding when passing a custom RP through the UI link_internal void -UseRenderPass_terrain_derivs_render_context( void *Struct ) +UseRenderPass_terrain_derivs_render_context( void *Element ) { - UseRenderPass_terrain_derivs_render_context( Cast(terrain_derivs_render_context *, Struct) ); + UseRenderPass_terrain_derivs_render_context( Cast(terrain_derivs_render_context *, Element) ); } link_internal void -UseRenderPass( terrain_derivs_render_context *Struct ) +UseRenderPass( terrain_derivs_render_context *Element ) { - UseRenderPass_terrain_derivs_render_context(Struct); + UseRenderPass_terrain_derivs_render_context(Element); } // TODO(Jesse): Remove in favor of UseRenderPass link_internal void -UseShader( terrain_derivs_render_context *Struct ) +UseShader( terrain_derivs_render_context *Element ) { - UseRenderPass_terrain_derivs_render_context(Struct); + UseRenderPass_terrain_derivs_render_context(Element); } @@ -1488,21 +1490,21 @@ link_internal b32 poof() InitializeBloomDownsampleShader ( - bloom_downsample_shader *Struct + bloom_downsample_shader *Element , v2 *SrcResolution ) { - b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_downsample.fragmentshader")); + b32 Result = CompileShaderPair(&Element->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/bloom_downsample.fragmentshader")); if (Result) { - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + Element->Program.Uniforms = ShaderUniformBuffer(Element->Uniforms, ArrayCount(Element->Uniforms)); u32 UniformIndex = 0; - Struct->SrcResolution = SrcResolution; - SetShaderUniform(&Struct->Program, UniformIndex++, Struct->SrcResolution, "SrcResolution"); + Element->SrcResolution = SrcResolution; + InitShaderUniform(&Element->Program, UniformIndex++, Element->SrcResolution, "SrcResolution" ); @@ -1521,15 +1523,15 @@ InitializeBloomDownsampleShader link_internal void UseRenderPass_bloom_downsample_shader -( bloom_downsample_shader *Struct ) +( bloom_downsample_shader *Element ) { - if (Struct->Program.ID != INVALID_SHADER) + if (Element->Program.ID != INVALID_SHADER) { - GetGL()->UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Element->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; @@ -1547,22 +1549,22 @@ UseRenderPass_bloom_downsample_shader // NOTE(Jesse): This is for binding when passing a custom RP through the UI link_internal void -UseRenderPass_bloom_downsample_shader( void *Struct ) +UseRenderPass_bloom_downsample_shader( void *Element ) { - UseRenderPass_bloom_downsample_shader( Cast(bloom_downsample_shader *, Struct) ); + UseRenderPass_bloom_downsample_shader( Cast(bloom_downsample_shader *, Element) ); } link_internal void -UseRenderPass( bloom_downsample_shader *Struct ) +UseRenderPass( bloom_downsample_shader *Element ) { - UseRenderPass_bloom_downsample_shader(Struct); + UseRenderPass_bloom_downsample_shader(Element); } // TODO(Jesse): Remove in favor of UseRenderPass link_internal void -UseShader( bloom_downsample_shader *Struct ) +UseShader( bloom_downsample_shader *Element ) { - UseRenderPass_bloom_downsample_shader(Struct); + UseRenderPass_bloom_downsample_shader(Element); } @@ -1667,28 +1669,28 @@ link_internal b32 poof() InitializeTerrainShapingRenderContext ( - terrain_shaping_render_context *Struct + terrain_shaping_render_context *Element , v3 ChunkDim , v3 WorldspaceChunkBasis , v3 ChunkResolution ) { - b32 Result = CompileShaderPair(&Struct->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/default.fragmentshader")); + b32 Result = CompileShaderPair(&Element->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/default.fragmentshader")); if (Result) { - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + Element->Program.Uniforms = ShaderUniformBuffer(Element->Uniforms, ArrayCount(Element->Uniforms)); u32 UniformIndex = 0; - Struct->ChunkDim = ChunkDim; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkDim, "ChunkDim"); + Element->ChunkDim = ChunkDim; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->ChunkDim, "ChunkDim" ); - Struct->WorldspaceChunkBasis = WorldspaceChunkBasis; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->WorldspaceChunkBasis, "WorldspaceChunkBasis"); + Element->WorldspaceChunkBasis = WorldspaceChunkBasis; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->WorldspaceChunkBasis, "WorldspaceChunkBasis" ); - Struct->ChunkResolution = ChunkResolution; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->ChunkResolution, "ChunkResolution"); + Element->ChunkResolution = ChunkResolution; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->ChunkResolution, "ChunkResolution" ); u32 Expected = 3 ; if (UniformIndex != Expected ) @@ -1705,21 +1707,21 @@ InitializeTerrainShapingRenderContext link_internal void UseRenderPass_terrain_shaping_render_context -( terrain_shaping_render_context *Struct ) +( terrain_shaping_render_context *Element ) { - if (Struct->Program.ID != INVALID_SHADER) + if (Element->Program.ID != INVALID_SHADER) { - GetGL()->UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Element->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; if (UniformIndex != 3 ) @@ -1735,22 +1737,22 @@ UseRenderPass_terrain_shaping_render_context // NOTE(Jesse): This is for binding when passing a custom RP through the UI link_internal void -UseRenderPass_terrain_shaping_render_context( void *Struct ) +UseRenderPass_terrain_shaping_render_context( void *Element ) { - UseRenderPass_terrain_shaping_render_context( Cast(terrain_shaping_render_context *, Struct) ); + UseRenderPass_terrain_shaping_render_context( Cast(terrain_shaping_render_context *, Element) ); } link_internal void -UseRenderPass( terrain_shaping_render_context *Struct ) +UseRenderPass( terrain_shaping_render_context *Element ) { - UseRenderPass_terrain_shaping_render_context(Struct); + UseRenderPass_terrain_shaping_render_context(Element); } // TODO(Jesse): Remove in favor of UseRenderPass link_internal void -UseShader( terrain_shaping_render_context *Struct ) +UseShader( terrain_shaping_render_context *Element ) { - UseRenderPass_terrain_shaping_render_context(Struct); + UseRenderPass_terrain_shaping_render_context(Element); } diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h index 4a05e6c88..f65fe9769 100644 --- a/generated/for_datatypes_cx51CcgQ.h +++ b/generated/for_datatypes_cx51CcgQ.h @@ -2891,11 +2891,11 @@ DoJob(compile_shader_pair_async_params *Params) link_internal void -InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_function_visualizer_render_pass *Struct , b32 Ignored , b32* Result ) +InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_function_visualizer_render_pass *Element , v2 *Points , u32 Count , b32* Result ) { initialize_easing_function_visualizer_render_pass_async_params Params = { - Result, Struct, Ignored, + Result, Element, Points, Count, }; work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); @@ -2905,7 +2905,7 @@ InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_fu link_internal void DoJob(initialize_easing_function_visualizer_render_pass_async_params *Params) { - auto Result = InitializeEasingFunctionVisualizerRenderPass( Params->Struct , Params->Ignored ); + auto Result = InitializeEasingFunctionVisualizerRenderPass( Params->Element , Params->Points , Params->Count ); if (Params->Result) { *Params->Result = Result; } } @@ -5271,6 +5271,23 @@ DoJob(initialize_easing_function_visualizer_render_pass_async_params *Params) + + + + + + + + + + + + + + + + + diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h index 05b8d62fe..a35f603aa 100644 --- a/generated/for_datatypes_khY6kwEk.h +++ b/generated/for_datatypes_khY6kwEk.h @@ -2884,8 +2884,9 @@ struct compile_shader_pair_async_params poof(@async_function_params) struct initialize_easing_function_visualizer_render_pass_async_params poof(@async_function_params) { b32* Result; - easing_function_visualizer_render_pass *Struct; - b32 Ignored; + easing_function_visualizer_render_pass *Element; + v2 *Points; + u32 Count; }; @@ -5239,6 +5240,23 @@ struct initialize_easing_function_visualizer_render_pass_async_params poof(@asyn + + + + + + + + + + + + + + + + + diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index e9956d3d7..655430458 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:146:0 +// src/engine/graphics.h:152:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/gen_shader_uniform_push_camera.h b/generated/gen_shader_uniform_push_camera.h index 5cd9043d1..c872e3a7b 100644 --- a/generated/gen_shader_uniform_push_camera.h +++ b/generated/gen_shader_uniform_push_camera.h @@ -1,8 +1,10 @@ // src/engine/shader.cpp:1:0 + b32 -SetShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name) +InitShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name, u16 Count) { + /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); shader_uniform *Uniform = Shader->Uniforms.Start + Index; @@ -10,9 +12,16 @@ SetShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name) Uniform->Type = ShaderUniform_Camera; Uniform->Camera = Value; Uniform->Name = Name; + Uniform->Count = Count; Uniform->ID = GetShaderUniform(Shader, Name); return Uniform->ID != INVALID_SHADER_UNIFORM; } +b32 +InitShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name) +{ + return InitShaderUniform(Shader, Index, Value, Name, 1); +} + diff --git a/generated/gen_shader_uniform_push_light.h b/generated/gen_shader_uniform_push_light.h index 0a69d4bd1..1299740c6 100644 --- a/generated/gen_shader_uniform_push_light.h +++ b/generated/gen_shader_uniform_push_light.h @@ -1,8 +1,10 @@ // src/engine/shader.cpp:4:0 + b32 -SetShaderUniform(shader *Shader, u32 Index, light *Value, const char *Name) +InitShaderUniform(shader *Shader, u32 Index, light *Value, const char *Name, u16 Count) { + /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); shader_uniform *Uniform = Shader->Uniforms.Start + Index; @@ -10,9 +12,16 @@ SetShaderUniform(shader *Shader, u32 Index, light *Value, const char *Name) Uniform->Type = ShaderUniform_Light; Uniform->Light = Value; Uniform->Name = Name; + Uniform->Count = Count; Uniform->ID = GetShaderUniform(Shader, Name); return Uniform->ID != INVALID_SHADER_UNIFORM; } +b32 +InitShaderUniform(shader *Shader, u32 Index, light *Value, const char *Name) +{ + return InitShaderUniform(Shader, Index, Value, Name, 1); +} + diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index cae033f22..9a0e202c5 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,8 +1,10 @@ // external/bonsai_stdlib/src/shader.cpp:356:0 + b32 -SetShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) +InitShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name, u16 Count) { + /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); shader_uniform *Uniform = Shader->Uniforms.Start + Index; @@ -10,9 +12,16 @@ SetShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) Uniform->Type = ShaderUniform_M4; Uniform->M4 = Value; Uniform->Name = Name; + Uniform->Count = Count; Uniform->ID = GetShaderUniform(Shader, Name); return Uniform->ID != INVALID_SHADER_UNIFORM; } +b32 +InitShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) +{ + return InitShaderUniform(Shader, Index, Value, Name, 1); +} + diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index a684e6d8b..fda7ddfbc 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,8 +1,10 @@ // external/bonsai_stdlib/src/shader.cpp:371:0 + b32 -SetShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) +InitShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name, u16 Count) { + /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); shader_uniform *Uniform = Shader->Uniforms.Start + Index; @@ -10,9 +12,16 @@ SetShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) Uniform->Type = ShaderUniform_R32; Uniform->R32 = Value; Uniform->Name = Name; + Uniform->Count = Count; Uniform->ID = GetShaderUniform(Shader, Name); return Uniform->ID != INVALID_SHADER_UNIFORM; } +b32 +InitShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) +{ + return InitShaderUniform(Shader, Index, Value, Name, 1); +} + diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index 3c87805d3..aca1f110a 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,8 +1,10 @@ // external/bonsai_stdlib/src/shader.cpp:368:0 + b32 -SetShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) +InitShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name, u16 Count) { + /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); shader_uniform *Uniform = Shader->Uniforms.Start + Index; @@ -10,9 +12,16 @@ SetShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) Uniform->Type = ShaderUniform_S32; Uniform->S32 = Value; Uniform->Name = Name; + Uniform->Count = Count; Uniform->ID = GetShaderUniform(Shader, Name); return Uniform->ID != INVALID_SHADER_UNIFORM; } +b32 +InitShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) +{ + return InitShaderUniform(Shader, Index, Value, Name, 1); +} + diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index 92ffee5d5..d66c02d6c 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,8 +1,10 @@ // external/bonsai_stdlib/src/shader.cpp:353:0 + b32 -SetShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) +InitShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name, u16 Count) { + /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); shader_uniform *Uniform = Shader->Uniforms.Start + Index; @@ -10,9 +12,16 @@ SetShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) Uniform->Type = ShaderUniform_Texture; Uniform->Texture = Value; Uniform->Name = Name; + Uniform->Count = Count; Uniform->ID = GetShaderUniform(Shader, Name); return Uniform->ID != INVALID_SHADER_UNIFORM; } +b32 +InitShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) +{ + return InitShaderUniform(Shader, Index, Value, Name, 1); +} + diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 8160ddd83..9c31458b0 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,8 +1,10 @@ // external/bonsai_stdlib/src/shader.cpp:365:0 + b32 -SetShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) +InitShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name, u16 Count) { + /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); shader_uniform *Uniform = Shader->Uniforms.Start + Index; @@ -10,9 +12,16 @@ SetShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) Uniform->Type = ShaderUniform_U32; Uniform->U32 = Value; Uniform->Name = Name; + Uniform->Count = Count; Uniform->ID = GetShaderUniform(Shader, Name); return Uniform->ID != INVALID_SHADER_UNIFORM; } +b32 +InitShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) +{ + return InitShaderUniform(Shader, Index, Value, Name, 1); +} + diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index 467c02082..25ae5d22d 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,8 +1,10 @@ // external/bonsai_stdlib/src/shader.cpp:359:0 + b32 -SetShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) +InitShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name, u16 Count) { + /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); shader_uniform *Uniform = Shader->Uniforms.Start + Index; @@ -10,9 +12,16 @@ SetShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) Uniform->Type = ShaderUniform_V2; Uniform->V2 = Value; Uniform->Name = Name; + Uniform->Count = Count; Uniform->ID = GetShaderUniform(Shader, Name); return Uniform->ID != INVALID_SHADER_UNIFORM; } +b32 +InitShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) +{ + return InitShaderUniform(Shader, Index, Value, Name, 1); +} + diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index ab54c068e..609d6f719 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,8 +1,10 @@ // external/bonsai_stdlib/src/shader.cpp:362:0 + b32 -SetShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) +InitShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name, u16 Count) { + /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); shader_uniform *Uniform = Shader->Uniforms.Start + Index; @@ -10,9 +12,16 @@ SetShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) Uniform->Type = ShaderUniform_V3; Uniform->V3 = Value; Uniform->Name = Name; + Uniform->Count = Count; Uniform->ID = GetShaderUniform(Shader, Name); return Uniform->ID != INVALID_SHADER_UNIFORM; } +b32 +InitShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) +{ + return InitShaderUniform(Shader, Index, Value, Name, 1); +} + diff --git a/generated/shader_magic_textured_quad_render_pass.h b/generated/shader_magic_textured_quad_render_pass.h index 3ce4bb32a..18186a17a 100644 --- a/generated/shader_magic_textured_quad_render_pass.h +++ b/generated/shader_magic_textured_quad_render_pass.h @@ -4,32 +4,32 @@ link_internal b32 poof() InitializeTexturedQuadRenderPass ( - textured_quad_render_pass *Struct + textured_quad_render_pass *Element , b32 IsDepthTexture , b32 HasAlphaChannel , s32 TextureSlice , v3 Tint ) { - b32 Result = CompileShaderPair(&Struct->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(STDLIB_SHADER_PATH "SimpleTexture.fragmentshader")); + b32 Result = CompileShaderPair(&Element->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(STDLIB_SHADER_PATH "SimpleTexture.fragmentshader")); if (Result) { - Struct->Program.Uniforms = ShaderUniformBuffer(Struct->Uniforms, ArrayCount(Struct->Uniforms)); + Element->Program.Uniforms = ShaderUniformBuffer(Element->Uniforms, ArrayCount(Element->Uniforms)); u32 UniformIndex = 0; - Struct->IsDepthTexture = IsDepthTexture; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->IsDepthTexture, "IsDepthTexture"); + Element->IsDepthTexture = IsDepthTexture; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->IsDepthTexture, "IsDepthTexture" ); - Struct->HasAlphaChannel = HasAlphaChannel; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->HasAlphaChannel, "HasAlphaChannel"); + Element->HasAlphaChannel = HasAlphaChannel; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->HasAlphaChannel, "HasAlphaChannel" ); - Struct->TextureSlice = TextureSlice; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->TextureSlice, "TextureSlice"); + Element->TextureSlice = TextureSlice; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->TextureSlice, "TextureSlice" ); - Struct->Tint = Tint; - SetShaderUniform(&Struct->Program, UniformIndex++, &Struct->Tint, "Tint"); + Element->Tint = Tint; + InitShaderUniform(&Element->Program, UniformIndex++, &Element->Tint, "Tint" ); u32 Expected = 4 ; if (UniformIndex != Expected ) @@ -46,24 +46,24 @@ InitializeTexturedQuadRenderPass link_internal void UseRenderPass_textured_quad_render_pass -( textured_quad_render_pass *Struct ) +( textured_quad_render_pass *Element ) { - if (Struct->Program.ID != INVALID_SHADER) + if (Element->Program.ID != INVALID_SHADER) { - GetGL()->UseProgram(Struct->Program.ID); + GetGL()->UseProgram(Element->Program.ID); s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; - BindUniformById(Struct->Uniforms+UniformIndex, &TextureUnit); + BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); ++UniformIndex; if (UniformIndex != 4 ) @@ -79,21 +79,21 @@ UseRenderPass_textured_quad_render_pass // NOTE(Jesse): This is for binding when passing a custom RP through the UI link_internal void -UseRenderPass_textured_quad_render_pass( void *Struct ) +UseRenderPass_textured_quad_render_pass( void *Element ) { - UseRenderPass_textured_quad_render_pass( Cast(textured_quad_render_pass *, Struct) ); + UseRenderPass_textured_quad_render_pass( Cast(textured_quad_render_pass *, Element) ); } link_internal void -UseRenderPass( textured_quad_render_pass *Struct ) +UseRenderPass( textured_quad_render_pass *Element ) { - UseRenderPass_textured_quad_render_pass(Struct); + UseRenderPass_textured_quad_render_pass(Element); } // TODO(Jesse): Remove in favor of UseRenderPass link_internal void -UseShader( textured_quad_render_pass *Struct ) +UseShader( textured_quad_render_pass *Element ) { - UseRenderPass_textured_quad_render_pass(Struct); + UseRenderPass_textured_quad_render_pass(Element); } diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 645f6c80c..fd2b91e6f 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -78,18 +78,24 @@ poof( @render_pass }; +struct easing_function +{ + cs Name; + v2_static_cursor_16 Points; +}; + struct easing_function_visualizer_render_pass poof( - @render_pass - @async + @render_pass @async @vert_source_file(STDLIB_SHADER_PATH "FullPassthrough.vertexshader") @frag_source_file(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader") ) { shader Program; - shader_uniform Uniforms[1]; + shader_uniform Uniforms[2]; - b32 Ignored; poof(@uniform) + v2 *Points; poof(@uniform @array_length(Cast(u16, Count))) + u32 Count; poof(@uniform) }; diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index b51d122b8..6ddd1e6da 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -90,22 +90,22 @@ MakeCompositeShader( /* *Current = GetUniform(GraphicsMemory, &Shader, Ssao, "Ssao"); */ /* Current = &(*Current)->Next; */ - /* SetShaderUniform(&Shader, 8, ShadowMVP, "ShadowMVP"); *1/ */ - - /* SetShaderUniform(&Shader, 9, Camera, "CameraP"); *1/ */ - - - SetShaderUniform(Shader, 0, &gTextures->Normal, "gNormal"); - SetShaderUniform(Shader, 1, BloomTex, "BloomTex"); - SetShaderUniform(Shader, 2, TransparencyAccum, "TransparencyAccum"); - SetShaderUniform(Shader, 3, TransparencyCount, "TransparencyCount"); - SetShaderUniform(Shader, 4, (u32*)UseLightingBloom, "UseLightingBloom"); - SetShaderUniform(Shader, 5, (u32*)BravoilMyersOIT, "BravoilMyersOIT"); - SetShaderUniform(Shader, 6, (u32*)BravoilMcGuireOIT, "BravoilMcGuireOIT"); - SetShaderUniform(Shader, 7, LuminanceTex, "LuminanceTex"); - SetShaderUniform(Shader, 8, Exposure, "Exposure"); - SetShaderUniform(Shader, 9, (int*)ToneMappingType, "ToneMappingType"); - SetShaderUniform(Shader, 10, ApplicationResolution, "ApplicationResolution"); + /* InitShaderUniform(&Shader, 8, ShadowMVP, "ShadowMVP"); *1/ */ + + /* InitShaderUniform(&Shader, 9, Camera, "CameraP"); *1/ */ + + + InitShaderUniform(Shader, 0, &gTextures->Normal, "gNormal"); + InitShaderUniform(Shader, 1, BloomTex, "BloomTex"); + InitShaderUniform(Shader, 2, TransparencyAccum, "TransparencyAccum"); + InitShaderUniform(Shader, 3, TransparencyCount, "TransparencyCount"); + InitShaderUniform(Shader, 4, (u32*)UseLightingBloom, "UseLightingBloom"); + InitShaderUniform(Shader, 5, (u32*)BravoilMyersOIT, "BravoilMyersOIT"); + InitShaderUniform(Shader, 6, (u32*)BravoilMcGuireOIT, "BravoilMcGuireOIT"); + InitShaderUniform(Shader, 7, LuminanceTex, "LuminanceTex"); + InitShaderUniform(Shader, 8, Exposure, "Exposure"); + InitShaderUniform(Shader, 9, (int*)ToneMappingType, "ToneMappingType"); + InitShaderUniform(Shader, 10, ApplicationResolution, "ApplicationResolution"); } AssertNoGlErrors; @@ -229,7 +229,7 @@ InitGaussianBlurRenderGroup(gaussian_render_group *Result, v2 *ApplicationResolu { Result->Shader.Uniforms = ShaderUniformBuffer(1, GraphicsMemory); - SetShaderUniform(&Result->Shader, 0, ApplicationResolution, "ApplicationResolution"); + InitShaderUniform(&Result->Shader, 0, ApplicationResolution, "ApplicationResolution"); } @@ -275,19 +275,19 @@ CreateGbufferShader(shader *Shader, graphics *Graphics, memory_arena *GraphicsMe Shader->Uniforms = ShaderUniformBuffer(12, GraphicsMemory); - SetShaderUniform(Shader, 0, MinClipP_worldspace, "MinClipP_worldspace"); - SetShaderUniform(Shader, 1, MaxClipP_worldspace, "MaxClipP_worldspace"); - SetShaderUniform(Shader, 2, ViewProjection, "ViewProjection"); + InitShaderUniform(Shader, 0, MinClipP_worldspace, "MinClipP_worldspace"); + InitShaderUniform(Shader, 1, MaxClipP_worldspace, "MaxClipP_worldspace"); + InitShaderUniform(Shader, 2, ViewProjection, "ViewProjection"); // @janky_model_matrix_bs - SetShaderUniform(Shader, 3, &IdentityMatrix, "ModelMatrix"); - SetShaderUniform(Shader, 4, ColorPaletteTexture, "ColorPalette"); - SetShaderUniform(Shader, 5, &Camera->Frust.farClip, "FarClip"); - SetShaderUniform(Shader, 6, &Camera->Frust.nearClip, "NearClip"); - SetShaderUniform(Shader, 7, &Camera->RenderSpacePosition, "CameraToWorld"); - SetShaderUniform(Shader, 8, &Graphics->OffsetOfWorldCenterToGrid, "OffsetOfWorldCenterToGrid"); - SetShaderUniform(Shader, 9, &Graphics->Settings.MajorGridDim, "MajorGridDim"); - SetShaderUniform(Shader, 10, &Graphics->Settings.DrawMajorGrid, "DrawMajorGrid"); - SetShaderUniform(Shader, 11, &Graphics->Settings.DrawMinorGrid, "DrawMinorGrid"); + InitShaderUniform(Shader, 3, &IdentityMatrix, "ModelMatrix"); + InitShaderUniform(Shader, 4, ColorPaletteTexture, "ColorPalette"); + InitShaderUniform(Shader, 5, &Camera->Frust.farClip, "FarClip"); + InitShaderUniform(Shader, 6, &Camera->Frust.nearClip, "NearClip"); + InitShaderUniform(Shader, 7, &Camera->RenderSpacePosition, "CameraToWorld"); + InitShaderUniform(Shader, 8, &Graphics->OffsetOfWorldCenterToGrid, "OffsetOfWorldCenterToGrid"); + InitShaderUniform(Shader, 9, &Graphics->Settings.MajorGridDim, "MajorGridDim"); + InitShaderUniform(Shader, 10, &Graphics->Settings.DrawMajorGrid, "DrawMajorGrid"); + InitShaderUniform(Shader, 11, &Graphics->Settings.DrawMinorGrid, "DrawMinorGrid"); return Result; } @@ -315,13 +315,13 @@ MakeSsaoShader( /* *Current = GetUniform(GraphicsMemory, &Shader, &gTextures->Position, "gPosition"); */ /* Current = &(*Current)->Next; */ - SetShaderUniform(Shader, 0, &gTextures->Normal, "gNormal"); - SetShaderUniform(Shader, 1, &gTextures->Depth, "gDepth"); - SetShaderUniform(Shader, 2, SsaoNoiseTexture, "SsaoNoiseTexture"); - SetShaderUniform(Shader, 3, SsaoNoiseTile, "SsaoNoiseTile"); - SetShaderUniform(Shader, 4, InverseViewMatrix, "InverseViewMatrix"); - SetShaderUniform(Shader, 5, InverseProjectionMatrix, "InverseProjectionMatrix"); - SetShaderUniform(Shader, 6, ViewProjection, "ViewProjection"); + InitShaderUniform(Shader, 0, &gTextures->Normal, "gNormal"); + InitShaderUniform(Shader, 1, &gTextures->Depth, "gDepth"); + InitShaderUniform(Shader, 2, SsaoNoiseTexture, "SsaoNoiseTexture"); + InitShaderUniform(Shader, 3, SsaoNoiseTile, "SsaoNoiseTile"); + InitShaderUniform(Shader, 4, InverseViewMatrix, "InverseViewMatrix"); + InitShaderUniform(Shader, 5, InverseProjectionMatrix, "InverseProjectionMatrix"); + InitShaderUniform(Shader, 6, ViewProjection, "ViewProjection"); } AssertNoGlErrors; @@ -404,14 +404,14 @@ MakeTransparencyShader(shader *Shader, v2 *ApplicationResolution, b32 *BravoilMy Shader->Uniforms = ShaderUniformBuffer(7, Memory); - SetShaderUniform(Shader, 0, ViewProjection, "ViewProjection"); + InitShaderUniform(Shader, 0, ViewProjection, "ViewProjection"); // @janky_model_matrix_bs - SetShaderUniform(Shader, 1, &IdentityMatrix, "ModelMatrix"); - SetShaderUniform(Shader, 2, gBufferDepthTexture, "gBufferDepthTexture"); - SetShaderUniform(Shader, 3, BravoilMyersOIT, "BravoilMyersOIT"); - SetShaderUniform(Shader, 4, BravoilMcGuireOIT, "BravoilMcGuireOIT"); - SetShaderUniform(Shader, 5, ApplicationResolution, "ApplicationResolution"); - SetShaderUniform(Shader, 6, ColorPaletteTexture, "ColorPalette"); + InitShaderUniform(Shader, 1, &IdentityMatrix, "ModelMatrix"); + InitShaderUniform(Shader, 2, gBufferDepthTexture, "gBufferDepthTexture"); + InitShaderUniform(Shader, 3, BravoilMyersOIT, "BravoilMyersOIT"); + InitShaderUniform(Shader, 4, BravoilMcGuireOIT, "BravoilMcGuireOIT"); + InitShaderUniform(Shader, 5, ApplicationResolution, "ApplicationResolution"); + InitShaderUniform(Shader, 6, ColorPaletteTexture, "ColorPalette"); return Result; } diff --git a/src/engine/shader.h b/src/engine/shader.h index 5d063bfdd..7587cb0e1 100644 --- a/src/engine/shader.h +++ b/src/engine/shader.h @@ -1 +1,2 @@ -b32 SetShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name); +b32 InitShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name); +b32 InitShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name, u16 Count); From 158a0dd7eb93f24e9b8ca6f107c10f166a600124 Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 16 Oct 2025 19:47:46 -0700 Subject: [PATCH 351/421] Plumbing dynamic easing functions to GPU nominally working --- examples/terrain_gen/game.cpp | 24 +- examples/terrain_gen/game.h | 8 + examples/terrain_gen/game_types.h | 38 - external/bonsai_stdlib | 2 +- .../block_array_h_shader_ptr_688853971_0.h | 2 +- generated/buffer_h_struct_u32.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 2 +- ...editor_ui_for_compound_type_bonsai_futex.h | 2 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...itor_ui_for_compound_type_brush_settings.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 2 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- .../do_editor_ui_for_compound_type_frustum.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...o_editor_ui_for_compound_type_game_state.h | 95 +++ ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- .../do_editor_ui_for_compound_type_input.h | 2 +- ..._editor_ui_for_compound_type_input_event.h | 2 +- .../do_editor_ui_for_compound_type_keyframe.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ...r_ui_for_compound_type_lighting_settings.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_noise_layer.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- .../do_editor_ui_for_compound_type_particle.h | 2 +- ...tor_ui_for_compound_type_particle_system.h | 2 +- ...ui_for_compound_type_perlin_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_physics.h | 2 +- .../do_editor_ui_for_compound_type_plane.h | 2 +- .../do_editor_ui_for_compound_type_platform.h | 2 +- ...ditor_ui_for_compound_type_random_series.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ...tor_ui_for_compound_type_render_settings.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- .../do_editor_ui_for_compound_type_shader.h | 2 +- ..._editor_ui_for_compound_type_shape_layer.h | 2 +- ...ompound_type_shape_layer_advanced_params.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_texture.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_ui_id.h | 2 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 2 +- ...pound_type_untextured_3d_geometry_buffer.h | 2 +- ...ui_for_compound_type_v2_static_cursor_16.h | 100 +++ ...tor_ui_for_compound_type_vertex_material.h | 2 +- ...i_for_compound_type_voronoi_noise_params.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- ..._ui_for_compound_type_white_noise_params.h | 2 +- ...o_editor_ui_for_compound_type_work_queue.h | 2 +- ...or_ui_for_compound_type_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 2 +- ...pe_world_update_op_shape_params_cylinder.h | 2 +- ..._type_world_update_op_shape_params_plane.h | 2 +- ...d_type_world_update_op_shape_params_rect.h | 2 +- ...type_world_update_op_shape_params_sphere.h | 2 +- ..._type_world_update_op_shape_params_torus.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 2 +- generated/for_datatypes_Bxw4Q7AW.h | 242 +++++- generated/for_datatypes_IXWy6K9V.h | 727 ++++++++++++++---- generated/for_datatypes_cx51CcgQ.h | 13 +- generated/for_datatypes_kh9dwrCf.h | 8 +- generated/for_datatypes_khY6kwEk.h | 13 +- generated/gen_shader_uniform_push_m4.h | 2 +- generated/gen_shader_uniform_push_r32.h | 2 +- generated/gen_shader_uniform_push_s32.h | 2 +- generated/gen_shader_uniform_push_texture.h | 2 +- generated/gen_shader_uniform_push_u32.h | 2 +- generated/gen_shader_uniform_push_v2.h | 2 +- generated/gen_shader_uniform_push_v3.h | 2 +- .../shader_magic_textured_quad_render_pass.h | 62 +- generated/static_cursor_v2_0_986190493.h | 7 + .../string_and_value_tables_asset_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- ...ing_and_value_tables_visible_region_size.h | 2 +- shaders/curve_remap_visualizer.fragmentshader | 43 +- src/engine/editor.cpp | 16 +- src/engine/graphics.h | 8 +- src/engine/render_loop.cpp | 2 +- src/game_loader.cpp | 1 - 130 files changed, 1293 insertions(+), 340 deletions(-) create mode 100644 examples/terrain_gen/game.h delete mode 100644 examples/terrain_gen/game_types.h create mode 100644 generated/do_editor_ui_for_compound_type_game_state.h create mode 100644 generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index cad1b1c8c..3b3afeeb7 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -2,7 +2,7 @@ #include -#include "game_types.h" +#include "game.h" BONSAI_API_WORKER_THREAD_INIT_CALLBACK() @@ -46,12 +46,18 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() CameraGhost->P.WorldP = VisibleRegion/2; CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); - auto *EasingFunction = &GameState->EasingFunction; + + easing_function *EasingFunction = &GameState->EasingFunction; + + Push(&EasingFunction->Points, V2(0,0)); + Push(&EasingFunction->Points, V2(0.5f)); + Push(&EasingFunction->Points, V2(1,1)); + InitializeEasingFunctionVisualizerRenderPass_Async( RenderQ, &GameState->EasingFunctionVisRP, EasingFunction->Points.Start, - EasingFunction->Points.At, + &EasingFunction->Points.At, 0); SpawnEntity(CameraGhost); @@ -59,6 +65,9 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() } +poof(do_editor_ui_for_compound_type(game_state)) +#include + BONSAI_API_MAIN_THREAD_CALLBACK() { Assert(ThreadLocal_ThreadIndex == 0); @@ -69,6 +78,15 @@ BONSAI_API_MAIN_THREAD_CALLBACK() f32 dt = Plat->dt; f32 Speed = 80.f; + { + window_layout *Window = GetOrCreateWindow(Ui, "GameState"); + PushWindowStart(Ui, Window); + DoEditorUi(Ui, Window, GameState, CSz("Game State")); + PushWindowEnd(Ui, Window); + } + + /* GameState->EasingFunctionVisRP.Count = GameState->EasingFunction.Points.At; */ + { window_layout *Window = GetOrCreateWindow(Ui, "Easing Window"); PushWindowStart(Ui, Window); diff --git a/examples/terrain_gen/game.h b/examples/terrain_gen/game.h new file mode 100644 index 000000000..5279bbd4a --- /dev/null +++ b/examples/terrain_gen/game.h @@ -0,0 +1,8 @@ + + +struct game_state +{ + easing_function EasingFunction; + easing_function_visualizer_render_pass EasingFunctionVisRP; +}; + diff --git a/examples/terrain_gen/game_types.h b/examples/terrain_gen/game_types.h deleted file mode 100644 index c954548b3..000000000 --- a/examples/terrain_gen/game_types.h +++ /dev/null @@ -1,38 +0,0 @@ - -enum terrain_gen_type -{ - /* TerrainGenType_Undefined = (0), */ - TerrainGenType_Flat = (1 << 0), - TerrainGenType_Checkerboard = (1 << 1), - TerrainGenType_SinCos = (1 << 2), - TerrainGenType_Voronoi = (1 << 3), - TerrainGenType_Perlin2D = (1 << 4), - TerrainGenType_Perlin3D = (1 << 5), - TerrainGenType_FBM2D = (1 << 6), - TerrainGenType_TerracedTerrain = (1 << 7), - TerrainGenType_GrassyTerracedTerrain = (1 << 8), - TerrainGenType_GrassyLargeTerracedTerrain = (1 << 9), - TerrainGenType_GrassyTerracedTerrain2 = (1 << 10), - TerrainGenType_GrassyTerracedTerrain3 = (1 << 11), - TerrainGenType_GrassyTerracedTerrain4 = (1 << 12), - TerrainGenType_GrassyIsland = (1 << 13), - TerrainGenType_Hoodoo = (1 << 14), - TerrainGenType_Warped = (1 << 15), - - TerrainGenType_Debug = (1 << 16), -}; - -poof(radio_button_group_for_enum(terrain_gen_type)) -#include - -poof(string_and_value_tables(terrain_gen_type)) -#include - -struct game_state -{ - terrain_gen_type TerrainGenType; - - easing_function EasingFunction; - easing_function_visualizer_render_pass EasingFunctionVisRP; -}; - diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index d77ba3641..3b6d8dfff 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit d77ba364182a6bbb1d0a35bfdec16e23d2520b71 +Subproject commit 3b6d8dfffe5f8b827f84d693cc48e5929d68a10e diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 6bfb44a71..3bafdfeee 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:180:0 +// external/bonsai_stdlib/src/shader.h:191:0 diff --git a/generated/buffer_h_struct_u32.h b/generated/buffer_h_struct_u32.h index d7d6ead9a..c4f196bc5 100644 --- a/generated/buffer_h_struct_u32.h +++ b/generated/buffer_h_struct_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:161:0 +// external/bonsai_stdlib/src/shader.h:172:0 struct shader_uniform_buffer { diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index b04351525..ee450aff5 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:330:0 +// src/engine/editor.cpp:336:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 2efafab65..45caf0353 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:502:0 +// src/engine/editor.cpp:508:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 4792b1780..bad8c3d69 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:494:0 +// src/engine/editor.cpp:500:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 0aa46af95..692fdf0e0 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:369:0 +// src/engine/editor.cpp:375:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 115de9ae2..51ac47d3c 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:336:0 +// src/engine/editor.cpp:342:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index eb5f34f04..2013b72ff 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:269:0 +// src/engine/editor.cpp:275:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index cfec61236..cbca9f11d 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:405:0 +// src/engine/editor.cpp:411:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index fd6cd7387..9c2da8edb 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:175:0 +// src/engine/editor.cpp:177:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 165b1bc44..1d418e237 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:363:0 +// src/engine/editor.cpp:369:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index b0ded6063..683e27167 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:435:0 +// src/engine/editor.cpp:441:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index aa2d5c434..3642a3178 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:372:0 +// src/engine/editor.cpp:378:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 7fc4ada9d..247708893 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:505:0 +// src/engine/editor.cpp:511:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 2f9ee28ef..57fca60a8 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:265:0 +// src/engine/editor.cpp:271:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index e33378716..fa2daf8e7 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:566:0 +// src/engine/editor.cpp:572:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 8d2f35c75..4035b7fb2 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:587:0 +// src/engine/editor.cpp:593:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 8007f2330..283f62433 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:584:0 +// src/engine/editor.cpp:590:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 96b3ab400..2fe9fc980 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:474:0 +// src/engine/editor.cpp:480:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index d93956fc6..edb177591 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:471:0 +// src/engine/editor.cpp:477:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 93024d9ad..391d53679 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:508:0 +// src/engine/editor.cpp:514:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 8bacab26c..773b1dcc2 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:459:0 +// src/engine/editor.cpp:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 5db08a4fd..5ed3686c8 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:360:0 +// src/engine/editor.cpp:366:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index be770213b..b0d62f9d8 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:542:0 +// src/engine/editor.cpp:548:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index e9c0fa298..e1294c7cd 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:536:0 +// src/engine/editor.cpp:542:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_state.h b/generated/do_editor_ui_for_compound_type_game_state.h new file mode 100644 index 000000000..054f8748c --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_game_state.h @@ -0,0 +1,95 @@ +// examples/terrain_gen/game.cpp:68:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, game_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle game_state", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("EasingFunction"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(easing_function*, &Element->EasingFunction), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("EasingFunctionVisRP"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(easing_function_visualizer_render_pass*, &Element->EasingFunctionVisRP), + MemberName, + Params + ); + + + + + + + + + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 20dbe17e5..b3a7d26bf 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:447:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index ee5f3ab0d..1b84673fa 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:444:0 +// src/engine/editor.cpp:450:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index dadb06f9c..5ba11b547 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:557:0 +// src/engine/editor.cpp:563:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 560047210..7a5ea0b23 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:581:0 +// src/engine/editor.cpp:587:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 632b0b087..37a4205cf 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:258:0 +// src/engine/editor.cpp:264:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 005d0e4e6..7de77796b 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:255:0 +// src/engine/editor.cpp:261:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 9cf967dca..e55f30c4f 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:327:0 +// src/engine/editor.cpp:333:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index f34bb4168..6de126b36 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:408:0 +// src/engine/editor.cpp:414:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index d3963045f..9acb051c4 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:572:0 +// src/engine/editor.cpp:578:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 0df00c63d..5ae2d1368 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:539:0 +// src/engine/editor.cpp:545:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index efea86e8f..3fc65ea84 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:306:0 +// src/engine/editor.cpp:312:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index ef4ed6175..380e2f404 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:453:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 71796eb29..45cd95e71 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:456:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 807f4686c..2fceb9c15 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:152:0 +// src/engine/editor.cpp:154:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 01e7f0836..8fbc86c17 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:484:0 +// src/engine/editor.cpp:490:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index d44078f18..a076f4a64 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:321:0 +// src/engine/editor.cpp:327:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 6341bca54..8cd014376 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:324:0 +// src/engine/editor.cpp:330:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 75e2876a1..3ad35050b 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:148:0 +// src/engine/editor.cpp:150:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index d7b7d76b6..b2b3be2c4 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:312:0 +// src/engine/editor.cpp:318:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 6f72288e1..332a39075 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:357:0 +// src/engine/editor.cpp:363:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 27898ea92..8cb24cc3e 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:261:0 +// src/engine/editor.cpp:267:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 88285733c..663ddf095 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:315:0 +// src/engine/editor.cpp:321:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 59109f24e..9b6a78ae2 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:530:0 +// src/engine/editor.cpp:536:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 1fc70f3df..a39674e99 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:560:0 +// src/engine/editor.cpp:566:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index a20951b55..4f7d8e089 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:309:0 +// src/engine/editor.cpp:315:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index e03985e5b..54be55a3c 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:533:0 +// src/engine/editor.cpp:539:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 35fc817be..5a9547956 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:241:0 +// src/engine/editor.cpp:247:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index 65c00f084..f44a43e00 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:173:0 +// src/engine/editor.cpp:175:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h b/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h index 293be0fbf..7d2a5566c 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:171:0 +// src/engine/editor.cpp:173:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer_advanced_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 9d3206646..17041ad6c 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:548:0 +// src/engine/editor.cpp:554:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 0b1b30cef..63b38a54a 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:551:0 +// src/engine/editor.cpp:557:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 371dc8263..ca21fa8bc 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:545:0 +// src/engine/editor.cpp:551:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index f9a0d0b47..958489579 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:411:0 +// src/engine/editor.cpp:417:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index b3f7c74dc..8e7c371f7 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:554:0 +// src/engine/editor.cpp:560:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index a37286ade..281d2a7fd 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:366:0 +// src/engine/editor.cpp:372:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 8f6712d6c..0e2b08c3f 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:563:0 +// src/engine/editor.cpp:569:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index c34a2b442..61cbe4ae8 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:181:0 +// src/engine/editor.cpp:183:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 0f8a298c0..4ca992b19 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:184:0 +// src/engine/editor.cpp:186:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index ce6296e56..a5eae075d 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:339:0 +// src/engine/editor.cpp:345:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h b/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h new file mode 100644 index 000000000..aa4f8a09c --- /dev/null +++ b/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h @@ -0,0 +1,100 @@ +// src/engine/editor.cpp:139:0 + +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, v2_static_cursor_16 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle v2_static_cursor_16", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("Start"); + + + if (ToggleButton(Ui, CSz("v Start[16]"), CSz("> Start[16]"), UiId(Window, "toggle v2_static_cursor_16 v2 Start", Element->Start), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 16) + { + DoEditorUi(Ui, Window, Element->Start+ArrayIndex, FSz("Start[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + + } + + + { + + + + cs MemberName = CSz("At"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, &Element->At), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 4fe6a763a..cd1f11a19 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:333:0 +// src/engine/editor.cpp:339:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index db01c02ca..d510532ff 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:150:0 +// src/engine/editor.cpp:152:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 894d0a6cb..708bdafc0 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:438:0 +// src/engine/editor.cpp:444:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index d81778980..2953d9dc5 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:429:0 +// src/engine/editor.cpp:435:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 72735c360..3fd0c3bfc 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:432:0 +// src/engine/editor.cpp:438:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 86fb7bc5c..f95e01297 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:146:0 +// src/engine/editor.cpp:148:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 259fa8eb1..1ebed8f59 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:252:0 +// src/engine/editor.cpp:258:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index c698d4cc1..243210c9a 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:249:0 +// src/engine/editor.cpp:255:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 66b771e1d..a9c524bc9 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:487:0 +// src/engine/editor.cpp:493:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 88452b6aa..23246e9c3 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:481:0 +// src/engine/editor.cpp:487:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index 7d91a16c3..08b02b615 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:420:0 +// src/engine/editor.cpp:426:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index e933b0e6b..78d9fc6c7 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:160:0 +// src/engine/editor.cpp:162:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h index e6da6a457..9870193d0 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:162:0 +// src/engine/editor.cpp:164:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index f70160b0b..f8f20fef3 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:156:0 +// src/engine/editor.cpp:158:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index d35d44094..053e7bd1a 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:158:0 +// src/engine/editor.cpp:160:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h index 2ab849aa9..9541eb48a 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:164:0 +// src/engine/editor.cpp:166:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_torus *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 64d11e239..23a3275f9 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:478:0 +// src/engine/editor.cpp:484:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 7f194b1c7..08cf85ac8 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:459:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index 8be9445a6..7ecfbcb00 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:244:0 +// src/engine/editor.cpp:250:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 51063ea44..372f11662 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:238:0 +// src/engine/editor.cpp:244:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index c1d87358c..4ae257035 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:193:0 +// src/engine/editor.cpp:195:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index f9fd8c188..d5aca1a1a 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:178:0 +// src/engine/editor.cpp:180:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index fb32c30af..b2315c35e 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:423:0 +// src/engine/editor.cpp:429:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 0b6c78e8b..e41b4412c 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:499:0 +// src/engine/editor.cpp:505:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 39d86f0a5..087fa5a18 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:426:0 +// src/engine/editor.cpp:432:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index d8b309607..48d739d51 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:569:0 +// src/engine/editor.cpp:575:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 0faa627c6..8b2a5d438 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:297:0 +// src/engine/editor.cpp:303:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 875fa1514..fe94eac45 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:294:0 +// src/engine/editor.cpp:300:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index f056991dd..80ba906f0 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:462:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index fc59957b7..a44093b2c 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:324:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 6dbc467bb..f5da153e1 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:575:0 +// src/engine/editor.cpp:581:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 788c1a3e9..6722af70e 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:578:0 +// src/engine/editor.cpp:584:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 4c3e7e8e8..9d02cbed8 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:169:0 +// src/engine/editor.cpp:171:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 3e3869012..c87f3cc8b 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:300:0 +// src/engine/editor.cpp:306:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index f7c8efb89..2396b5292 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:142:0 +// src/engine/editor.cpp:144:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 2e5879009..1c727d3d4 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:516:0 +// src/engine/editor.cpp:522:0 @@ -6,6 +6,100 @@ +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle easing_function", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("Name"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(cs*, &Element->Name), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("Points"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2_static_cursor_16*, &Element->Points), + MemberName, + Params + ); + + + + + + + + + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + @@ -479,6 +573,152 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, +link_internal void +DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_render_pass *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +{ + if (Element) + { + // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support + // not drawing the toggl-y thing if we just want to dump the members. + b32 DrawChildren = True; + b32 DidToggle = False; + if (Name.Count) + { + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle easing_function_visualizer_render_pass", Element), Params)) + { + DidToggle = True; + PushNewRow(Ui); + } + else + { + DrawChildren = False; + } + } + + if (DrawChildren) + { + if (Name.Count) { PushTableStart(Ui); } + + if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + + + { + + + + cs MemberName = CSz("Program"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(shader*, &Element->Program), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("Uniforms"); + + + if (ToggleButton(Ui, CSz("v Uniforms[2]"), CSz("> Uniforms[2]"), UiId(Window, "toggle easing_function_visualizer_render_pass shader_uniform Uniforms", Element->Uniforms), Params )) + { + OPEN_INDENT_FOR_TOGGLEABLE_REGION(); + PushNewRow(Ui); + RangeIterator(ArrayIndex, 2) + { + DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + + + } + CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); + } + PushNewRow(Ui); + + + + + + } + + + { + + + + cs MemberName = CSz("Points"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(v2*, Element->Points), + MemberName, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("Count"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u32*, Element->Count), + MemberName, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } + if (Name.Count) { PushTableEnd(Ui); } + } + else + { + PushNewRow(Ui); + } + + } + else + { + PushColumn(Ui, Name, Params); + PushColumn(Ui, CSz("(null)"), Params); + PushNewRow(Ui); + } + +} + diff --git a/generated/for_datatypes_IXWy6K9V.h b/generated/for_datatypes_IXWy6K9V.h index 927452228..0abe36458 100644 --- a/generated/for_datatypes_IXWy6K9V.h +++ b/generated/for_datatypes_IXWy6K9V.h @@ -51,82 +51,212 @@ InitializeLightingRenderGroup u32 UniformIndex = 0; Element->gColor = gColor; - InitShaderUniform(&Element->Program, UniformIndex++, Element->gColor, "gColor" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->gColor, + "gColor" + ); Element->gNormal = gNormal; - InitShaderUniform(&Element->Program, UniformIndex++, Element->gNormal, "gNormal" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->gNormal, + "gNormal" + ); Element->gDepth = gDepth; - InitShaderUniform(&Element->Program, UniformIndex++, Element->gDepth, "gDepth" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->gDepth, + "gDepth" + ); Element->shadowMap = shadowMap; - InitShaderUniform(&Element->Program, UniformIndex++, Element->shadowMap, "shadowMap" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->shadowMap, + "shadowMap" + ); Element->Ssao = Ssao; - InitShaderUniform(&Element->Program, UniformIndex++, Element->Ssao, "Ssao" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->Ssao, + "Ssao" + ); Element->TransparencyAccumTex = TransparencyAccumTex; - InitShaderUniform(&Element->Program, UniformIndex++, Element->TransparencyAccumTex, "TransparencyAccumTex" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->TransparencyAccumTex, + "TransparencyAccumTex" + ); Element->TransparencyCountTex = TransparencyCountTex; - InitShaderUniform(&Element->Program, UniformIndex++, Element->TransparencyCountTex, "TransparencyCountTex" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->TransparencyCountTex, + "TransparencyCountTex" + ); Element->BravoilMyersOIT = BravoilMyersOIT; - InitShaderUniform(&Element->Program, UniformIndex++, Element->BravoilMyersOIT, "BravoilMyersOIT" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->BravoilMyersOIT, + "BravoilMyersOIT" + ); Element->BravoilMcGuireOIT = BravoilMcGuireOIT; - InitShaderUniform(&Element->Program, UniformIndex++, Element->BravoilMcGuireOIT, "BravoilMcGuireOIT" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->BravoilMcGuireOIT, + "BravoilMcGuireOIT" + ); Element->InverseViewMatrix = InverseViewMatrix; - InitShaderUniform(&Element->Program, UniformIndex++, Element->InverseViewMatrix, "InverseViewMatrix" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->InverseViewMatrix, + "InverseViewMatrix" + ); Element->InverseProjectionMatrix = InverseProjectionMatrix; - InitShaderUniform(&Element->Program, UniformIndex++, Element->InverseProjectionMatrix, "InverseProjectionMatrix" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->InverseProjectionMatrix, + "InverseProjectionMatrix" + ); Element->ShadowMVP = ShadowMVP; - InitShaderUniform(&Element->Program, UniformIndex++, Element->ShadowMVP, "ShadowMVP" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->ShadowMVP, + "ShadowMVP" + ); Element->LightColors = LightColors; - InitShaderUniform(&Element->Program, UniformIndex++, Element->LightColors, "LightColors" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->LightColors, + "LightColors" + ); Element->LightPositions = LightPositions; - InitShaderUniform(&Element->Program, UniformIndex++, Element->LightPositions, "LightPositions" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->LightPositions, + "LightPositions" + ); Element->LightIndexToUV = LightIndexToUV; - InitShaderUniform(&Element->Program, UniformIndex++, Element->LightIndexToUV, "LightIndexToUV" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->LightIndexToUV, + "LightIndexToUV" + ); Element->LightCount = LightCount; - InitShaderUniform(&Element->Program, UniformIndex++, Element->LightCount, "LightCount" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->LightCount, + "LightCount" + ); Element->Camera = Camera; - InitShaderUniform(&Element->Program, UniformIndex++, Element->Camera, "Camera" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->Camera, + "Camera" + ); Element->SunPosition = SunPosition; - InitShaderUniform(&Element->Program, UniformIndex++, Element->SunPosition, "SunPosition" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->SunPosition, + "SunPosition" + ); Element->SunColor = SunColor; - InitShaderUniform(&Element->Program, UniformIndex++, Element->SunColor, "SunColor" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->SunColor, + "SunColor" + ); Element->FogColor = FogColor; - InitShaderUniform(&Element->Program, UniformIndex++, Element->FogColor, "FogColor" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->FogColor, + "FogColor" + ); Element->FogPower = FogPower; - InitShaderUniform(&Element->Program, UniformIndex++, Element->FogPower, "FogPower" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->FogPower, + "FogPower" + ); Element->UseSsao = UseSsao; - InitShaderUniform(&Element->Program, UniformIndex++, Element->UseSsao, "UseSsao" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->UseSsao, + "UseSsao" + ); Element->UseShadowMapping = UseShadowMapping; - InitShaderUniform(&Element->Program, UniformIndex++, Element->UseShadowMapping, "UseShadowMapping" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->UseShadowMapping, + "UseShadowMapping" + ); Element->UseLightingBloom = UseLightingBloom; - InitShaderUniform(&Element->Program, UniformIndex++, Element->UseLightingBloom, "UseLightingBloom" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->UseLightingBloom, + "UseLightingBloom" + ); Element->ApplicationResolution = ApplicationResolution; - InitShaderUniform(&Element->Program, UniformIndex++, Element->ApplicationResolution, "ApplicationResolution" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->ApplicationResolution, + "ApplicationResolution" + ); Element->ShadowMapResolution = ShadowMapResolution; - InitShaderUniform(&Element->Program, UniformIndex++, Element->ShadowMapResolution, "ShadowMapResolution" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->ShadowMapResolution, + "ShadowMapResolution" + ); @@ -153,83 +283,187 @@ UseRenderPass_lighting_render_group s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } @@ -242,6 +476,8 @@ UseRenderPass_lighting_render_group { SoftError("Attempted to bind uncompiled Shader (BONSAI_SHADER_PATH \"Lighting.vertexshader\") | (BONSAI_SHADER_PATH \"Lighting.fragmentshader\")"); } + + AssertNoGlErrors; } // NOTE(Jesse): This is for binding when passing a custom RP through the UI @@ -383,16 +619,36 @@ InitializeTerrainDecorationRenderContext u32 UniformIndex = 0; Element->DerivsTex = DerivsTex; - InitShaderUniform(&Element->Program, UniformIndex++, Element->DerivsTex, "DerivsTex" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->DerivsTex, + "DerivsTex" + ); Element->ChunkDim = ChunkDim; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->ChunkDim, "ChunkDim" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->ChunkDim, + "ChunkDim" + ); Element->WorldspaceChunkBasis = WorldspaceChunkBasis; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->WorldspaceChunkBasis, "WorldspaceChunkBasis" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->WorldspaceChunkBasis, + "WorldspaceChunkBasis" + ); Element->ChunkResolution = ChunkResolution; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->ChunkResolution, "ChunkResolution" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->ChunkResolution, + "ChunkResolution" + ); u32 Expected = 4 ; if (UniformIndex != Expected ) @@ -417,17 +673,33 @@ UseRenderPass_terrain_decoration_render_context s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } if (UniformIndex != 4 ) { @@ -438,6 +710,8 @@ UseRenderPass_terrain_decoration_render_context { SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/decoration/default.fragmentshader\")"); } + + AssertNoGlErrors; } // NOTE(Jesse): This is for binding when passing a custom RP through the UI @@ -495,7 +769,12 @@ InitializeTerrainFinalizeRenderContext u32 UniformIndex = 0; Element->Ignored = Ignored; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->Ignored, "Ignored" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->Ignored, + "Ignored" + ); @@ -522,8 +801,12 @@ UseRenderPass_terrain_finalize_render_context s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } @@ -536,6 +819,8 @@ UseRenderPass_terrain_finalize_render_context { SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/TerrainFinalize.fragmentshader\")"); } + + AssertNoGlErrors; } // NOTE(Jesse): This is for binding when passing a custom RP through the UI @@ -645,16 +930,36 @@ InitializeWorldEditRenderContext u32 UniformIndex = 0; Element->ChunkDim = ChunkDim; - InitShaderUniform(&Element->Program, UniformIndex++, Element->ChunkDim, "ChunkDim" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->ChunkDim, + "ChunkDim" + ); Element->WorldspaceChunkBasis = WorldspaceChunkBasis; - InitShaderUniform(&Element->Program, UniformIndex++, Element->WorldspaceChunkBasis, "WorldspaceChunkBasis" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->WorldspaceChunkBasis, + "WorldspaceChunkBasis" + ); Element->ChunkResolution = ChunkResolution; - InitShaderUniform(&Element->Program, UniformIndex++, Element->ChunkResolution, "ChunkResolution" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->ChunkResolution, + "ChunkResolution" + ); Element->Type = Type; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->Type, "Type" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->Type, + "Type" + ); u32 Expected = 4 ; if (UniformIndex != Expected ) @@ -679,17 +984,33 @@ UseRenderPass_world_edit_render_context s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } if (UniformIndex != 4 ) { @@ -700,6 +1021,8 @@ UseRenderPass_world_edit_render_context { SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/world_edit.fragmentshader\")"); } + + AssertNoGlErrors; } // NOTE(Jesse): This is for binding when passing a custom RP through the UI @@ -849,7 +1172,7 @@ InitializeEasingFunctionVisualizerRenderPass ( easing_function_visualizer_render_pass *Element , v2 *Points - , u32 Count + , u32 *Count ) { b32 Result = CompileShaderPair(&Element->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader")); @@ -861,10 +1184,20 @@ InitializeEasingFunctionVisualizerRenderPass u32 UniformIndex = 0; Element->Points = Points; - InitShaderUniform(&Element->Program, UniformIndex++, Element->Points, "Points" , Cast(u16, Count)); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->Points, + "Points" + , Cast(u16, *Count)); Element->Count = Count; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->Count, "Count" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->Count, + "Count" + ); u32 Expected = 2 ; if (UniformIndex != Expected ) @@ -889,11 +1222,19 @@ UseRenderPass_easing_function_visualizer_render_pass s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } if (UniformIndex != 2 ) { @@ -904,6 +1245,8 @@ UseRenderPass_easing_function_visualizer_render_pass { SoftError("Attempted to bind uncompiled Shader (STDLIB_SHADER_PATH \"FullPassthrough.vertexshader\") | (BONSAI_SHADER_PATH \"curve_remap_visualizer.fragmentshader\")"); } + + AssertNoGlErrors; } // NOTE(Jesse): This is for binding when passing a custom RP through the UI @@ -1006,16 +1349,36 @@ InitializeShadowMapShader u32 UniformIndex = 0; Element->ModelMatrix = ModelMatrix; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->ModelMatrix, "ModelMatrix" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->ModelMatrix, + "ModelMatrix" + ); Element->ViewProjection = ViewProjection; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->ViewProjection, "ViewProjection" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->ViewProjection, + "ViewProjection" + ); Element->MinClipP_worldspace = MinClipP_worldspace; - InitShaderUniform(&Element->Program, UniformIndex++, Element->MinClipP_worldspace, "MinClipP_worldspace" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->MinClipP_worldspace, + "MinClipP_worldspace" + ); Element->MaxClipP_worldspace = MaxClipP_worldspace; - InitShaderUniform(&Element->Program, UniformIndex++, Element->MaxClipP_worldspace, "MaxClipP_worldspace" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->MaxClipP_worldspace, + "MaxClipP_worldspace" + ); u32 Expected = 4 ; if (UniformIndex != Expected ) @@ -1040,17 +1403,33 @@ UseRenderPass_shadow_map_shader s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } if (UniformIndex != 4 ) { @@ -1061,6 +1440,8 @@ UseRenderPass_shadow_map_shader { SoftError("Attempted to bind uncompiled Shader (\"shaders/DepthRTT.vertexshader\") | (\"shaders/DepthRTT.fragmentshader\")"); } + + AssertNoGlErrors; } // NOTE(Jesse): This is for binding when passing a custom RP through the UI @@ -1103,7 +1484,12 @@ InitializeBloomUpsampleShader u32 UniformIndex = 0; Element->FilterRadius = FilterRadius; - InitShaderUniform(&Element->Program, UniformIndex++, Element->FilterRadius, "FilterRadius" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->FilterRadius, + "FilterRadius" + ); @@ -1130,8 +1516,12 @@ UseRenderPass_bloom_upsample_shader s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } @@ -1144,6 +1534,8 @@ UseRenderPass_bloom_upsample_shader { SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/bloom_upsample.fragmentshader\")"); } + + AssertNoGlErrors; } // NOTE(Jesse): This is for binding when passing a custom RP through the UI @@ -1395,7 +1787,12 @@ InitializeTerrainDerivsRenderContext u32 UniformIndex = 0; Element->Ignored = Ignored; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->Ignored, "Ignored" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->Ignored, + "Ignored" + ); @@ -1422,8 +1819,12 @@ UseRenderPass_terrain_derivs_render_context s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } @@ -1436,6 +1837,8 @@ UseRenderPass_terrain_derivs_render_context { SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/derivs.fragmentshader\")"); } + + AssertNoGlErrors; } // NOTE(Jesse): This is for binding when passing a custom RP through the UI @@ -1504,7 +1907,12 @@ InitializeBloomDownsampleShader u32 UniformIndex = 0; Element->SrcResolution = SrcResolution; - InitShaderUniform(&Element->Program, UniformIndex++, Element->SrcResolution, "SrcResolution" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + Element->SrcResolution, + "SrcResolution" + ); @@ -1531,8 +1939,12 @@ UseRenderPass_bloom_downsample_shader s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } @@ -1545,6 +1957,8 @@ UseRenderPass_bloom_downsample_shader { SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/bloom_downsample.fragmentshader\")"); } + + AssertNoGlErrors; } // NOTE(Jesse): This is for binding when passing a custom RP through the UI @@ -1684,13 +2098,28 @@ InitializeTerrainShapingRenderContext u32 UniformIndex = 0; Element->ChunkDim = ChunkDim; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->ChunkDim, "ChunkDim" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->ChunkDim, + "ChunkDim" + ); Element->WorldspaceChunkBasis = WorldspaceChunkBasis; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->WorldspaceChunkBasis, "WorldspaceChunkBasis" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->WorldspaceChunkBasis, + "WorldspaceChunkBasis" + ); Element->ChunkResolution = ChunkResolution; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->ChunkResolution, "ChunkResolution" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->ChunkResolution, + "ChunkResolution" + ); u32 Expected = 3 ; if (UniformIndex != Expected ) @@ -1715,14 +2144,26 @@ UseRenderPass_terrain_shaping_render_context s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } if (UniformIndex != 3 ) { @@ -1733,6 +2174,8 @@ UseRenderPass_terrain_shaping_render_context { SoftError("Attempted to bind uncompiled Shader (\"external/bonsai_stdlib/shaders/Passthrough.vertexshader\") | (\"shaders/terrain/shaping/default.fragmentshader\")"); } + + AssertNoGlErrors; } // NOTE(Jesse): This is for binding when passing a custom RP through the UI diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h index f65fe9769..43e1451da 100644 --- a/generated/for_datatypes_cx51CcgQ.h +++ b/generated/for_datatypes_cx51CcgQ.h @@ -2301,7 +2301,6 @@ - link_internal void @@ -2887,11 +2886,10 @@ DoJob(compile_shader_pair_async_params *Params) - link_internal void -InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_function_visualizer_render_pass *Element , v2 *Points , u32 Count , b32* Result ) +InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_function_visualizer_render_pass *Element , v2 *Points , u32 *Count , b32* Result ) { initialize_easing_function_visualizer_render_pass_async_params Params = { @@ -5299,6 +5297,12 @@ DoJob(initialize_easing_function_visualizer_render_pass_async_params *Params) + + + + + + @@ -7339,9 +7343,6 @@ DoJob(draw_lod_async_params *Params) - - - diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 46bd52e29..03ee65e84 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:379:0 +// src/engine/editor.cpp:385:0 @@ -1375,12 +1375,6 @@ PushToolbar( renderer_2d *Ui, - - - - - - diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h index a35f603aa..02abf5fa7 100644 --- a/generated/for_datatypes_khY6kwEk.h +++ b/generated/for_datatypes_khY6kwEk.h @@ -2301,7 +2301,6 @@ - struct compile_shader_pair_async_params poof(@async_function_params) @@ -2878,7 +2877,6 @@ struct compile_shader_pair_async_params poof(@async_function_params) - struct initialize_easing_function_visualizer_render_pass_async_params poof(@async_function_params) @@ -2886,7 +2884,7 @@ struct initialize_easing_function_visualizer_render_pass_async_params poof(@asyn b32* Result; easing_function_visualizer_render_pass *Element; v2 *Points; - u32 Count; + u32 *Count; }; @@ -5268,6 +5266,12 @@ struct initialize_easing_function_visualizer_render_pass_async_params poof(@asyn + + + + + + @@ -7300,9 +7304,6 @@ struct draw_lod_async_params poof(@async_function_params) - - - diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 9a0e202c5..5a2c18d82 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:356:0 +// external/bonsai_stdlib/src/shader.cpp:366:0 b32 diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index fda7ddfbc..031eb803c 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:371:0 +// external/bonsai_stdlib/src/shader.cpp:381:0 b32 diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index aca1f110a..bc4087115 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:368:0 +// external/bonsai_stdlib/src/shader.cpp:378:0 b32 diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index d66c02d6c..8d1eaa2f7 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:353:0 +// external/bonsai_stdlib/src/shader.cpp:363:0 b32 diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 9c31458b0..f06fdab49 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:365:0 +// external/bonsai_stdlib/src/shader.cpp:375:0 b32 diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index 25ae5d22d..812ef59a2 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:359:0 +// external/bonsai_stdlib/src/shader.cpp:369:0 b32 diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index 609d6f719..74d4680f7 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:362:0 +// external/bonsai_stdlib/src/shader.cpp:372:0 b32 diff --git a/generated/shader_magic_textured_quad_render_pass.h b/generated/shader_magic_textured_quad_render_pass.h index 18186a17a..3127b6b42 100644 --- a/generated/shader_magic_textured_quad_render_pass.h +++ b/generated/shader_magic_textured_quad_render_pass.h @@ -20,16 +20,36 @@ InitializeTexturedQuadRenderPass u32 UniformIndex = 0; Element->IsDepthTexture = IsDepthTexture; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->IsDepthTexture, "IsDepthTexture" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->IsDepthTexture, + "IsDepthTexture" + ); Element->HasAlphaChannel = HasAlphaChannel; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->HasAlphaChannel, "HasAlphaChannel" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->HasAlphaChannel, + "HasAlphaChannel" + ); Element->TextureSlice = TextureSlice; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->TextureSlice, "TextureSlice" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->TextureSlice, + "TextureSlice" + ); Element->Tint = Tint; - InitShaderUniform(&Element->Program, UniformIndex++, &Element->Tint, "Tint" ); + InitShaderUniform( + &Element->Program, + UniformIndex++, + &Element->Tint, + "Tint" + ); u32 Expected = 4 ; if (UniformIndex != Expected ) @@ -54,17 +74,33 @@ UseRenderPass_textured_quad_render_pass s32 TextureUnit = 0; s32 UniformIndex = 0; - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } - BindUniformById(Element->Uniforms+UniformIndex, &TextureUnit); - ++UniformIndex; + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit, Uniform->Count); + ++UniformIndex; + AssertNoGlErrors; + } if (UniformIndex != 4 ) { @@ -75,6 +111,8 @@ UseRenderPass_textured_quad_render_pass { SoftError("Attempted to bind uncompiled Shader (STDLIB_SHADER_PATH \"FullPassthrough.vertexshader\") | (STDLIB_SHADER_PATH \"SimpleTexture.fragmentshader\")"); } + + AssertNoGlErrors; } // NOTE(Jesse): This is for binding when passing a custom RP through the UI diff --git a/generated/static_cursor_v2_0_986190493.h b/generated/static_cursor_v2_0_986190493.h index 209a169a9..a48b0d95d 100644 --- a/generated/static_cursor_v2_0_986190493.h +++ b/generated/static_cursor_v2_0_986190493.h @@ -52,3 +52,10 @@ Push( v2_static_cursor_16 *Buf, v2 *E ) Buf->Start[Buf->At++] = *E; } +link_inline void +Push( v2_static_cursor_16 *Buf, v2 E ) +{ + Assert(AtElements(Buf) < TotalElements(Buf)); + Buf->Start[Buf->At++] = E; +} + diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index 38b958be4..c1d9bd34e 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:497:0 +// src/engine/editor.cpp:503:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 573233725..8a45fa9f9 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:290:0 +// src/engine/editor.cpp:296:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index 55183a43a..a3a022364 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:284:0 +// src/engine/editor.cpp:290:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 06db42759..a84296f11 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:281:0 +// src/engine/editor.cpp:287:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index df8f9b3eb..7b84f9443 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:287:0 +// src/engine/editor.cpp:293:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index 6124d210a..b76202c6d 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:140:0 +// src/engine/editor.cpp:142:0 link_internal counted_string ToStringPrefixless(visible_region_size Type) diff --git a/shaders/curve_remap_visualizer.fragmentshader b/shaders/curve_remap_visualizer.fragmentshader index 23ba6840c..5c2d883f6 100644 --- a/shaders/curve_remap_visualizer.fragmentshader +++ b/shaders/curve_remap_visualizer.fragmentshader @@ -1,3 +1,8 @@ +/* #extension GL_NV_shader_buffer_load : enable */ + +uniform v2 Points[16]; +uniform u32 Count; + in vec2 UV; out v4 Output; @@ -10,12 +15,48 @@ WithinTolerance(f32 Epsilon, f32 A, f32 B) } +f32 Remap(f32 SampleX, v2 Points[16], u32 PointCount ) +{ + + f32 Result = -1.f; + v2 PrevP = Points[0]; + for (u32 PointIndex = 1u; PointIndex < PointCount; ++PointIndex) + { + v2 NextP = Points[PointIndex]; + + if (SampleX >= PrevP.x && SampleX < NextP.x) + { + + + r32 Range = PrevP.x - NextP.x; + r32 t = Clamp01((SampleX-NextP.x) / Range); + + Result = CosineInterpolate(t, NextP.y, PrevP.y); + + /* Result = mix(NextP.y, PrevP.y, t); */ + + /* Result = QuinticInterpolate(Result); */ + /* Result = QuinticInterpolate(Result); */ + + /* Result = CubicInterpolate(Result); */ + /* Result = Smoothstep(Result); */ + /* Result = Smoothstep(Result); */ + + break; + } + + PrevP = NextP; + } + + /* Result = abs(max(Result, 1.0)); */ + return Result; +} void main() { Output = V4(1,1,1,1); - f32 Mapped = RemapSample(UV.x); + f32 Mapped = Remap(UV.x, Points, Count); if (Mapped == -1.f) { diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index bb2b9deb9..881660497 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -136,6 +136,8 @@ GetUiDebug() return &GetEngineResources()->EngineDebug.UiDebug; } +poof(do_editor_ui_for_compound_type(v2_static_cursor_16)) +#include poof(string_and_value_tables(visible_region_size)) #include @@ -213,27 +215,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs N case ShaderUniform_M4: { DoEditorUi(Ui, Window, Element->M4, CSz("M4"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; case ShaderUniform_V2: { DoEditorUi(Ui, Window, Element->V2, CSz("V2"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; case ShaderUniform_V3: { DoEditorUi(Ui, Window, Element->V3, CSz("V3"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; - case ShaderUniform_S32: { DoEditorUi(Ui, Window, Element->S32, CSz("S32"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; - case ShaderUniform_U32: { DoEditorUi(Ui, Window, Element->U32, CSz("U32"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; - case ShaderUniform_R32: { DoEditorUi(Ui, Window, Element->R32, CSz("R32"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; + case ShaderUniform_S32: { DoEditorUi(Ui, Window, Element->S32, CSz("S32"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); } break; + case ShaderUniform_U32: { DoEditorUi(Ui, Window, Element->U32, CSz("U32"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); } break; + case ShaderUniform_R32: { DoEditorUi(Ui, Window, Element->R32, CSz("R32"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); } break; case ShaderUniform_Texture: { DoEditorUi(Ui, Window, Element->Texture, CSz("Texture"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; case ShaderUniform_Light: { DoEditorUi(Ui, Window, Element->Light, CSz("Light"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; case ShaderUniform_Camera: { DoEditorUi(Ui, Window, Element->Camera, CSz("Camera"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); } break; } DoEditorUi(Ui, Window, &Element->ID, CSz("s32 ID"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); - PushTableEnd(Ui); + PushNewRow(Ui); + DoEditorUi(Ui, Window, &Element->Count, CSz("u32 Count"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); + PushTableEnd(Ui); /* DoEditorUi(Ui, Window, Element->Next, CSz("shader_uniform Next"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); */ } + } else { PushColumn(Ui, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushColumn(Ui, CSz("(null)"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); - PushNewRow(Ui); } + + PushNewRow(Ui); } poof(do_editor_ui_for_container(shader_uniform_buffer)) #include diff --git a/src/engine/graphics.h b/src/engine/graphics.h index fd2b91e6f..d24ae8895 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -78,7 +78,7 @@ poof( @render_pass }; -struct easing_function +struct easing_function poof(@do_editor_ui) { cs Name; v2_static_cursor_16 Points; @@ -86,7 +86,7 @@ struct easing_function struct easing_function_visualizer_render_pass poof( - @render_pass @async + @render_pass @async @do_editor_ui @vert_source_file(STDLIB_SHADER_PATH "FullPassthrough.vertexshader") @frag_source_file(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader") ) @@ -94,8 +94,8 @@ poof( shader Program; shader_uniform Uniforms[2]; - v2 *Points; poof(@uniform @array_length(Cast(u16, Count))) - u32 Count; poof(@uniform) + v2 *Points; poof(@uniform @array_length(*Count)) + u32 *Count; poof(@uniform) }; diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 267dbfec6..4e30bdd52 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -238,7 +238,7 @@ DrainRenderQueue(engine_resources *Engine) shader_uniform *Uniform = &Command->Uniform; if (Uniform->ID >= 0) { - BindUniformById(Uniform, &Command->TextureUnit); + BindUniformById(Uniform, &Command->TextureUnit, Uniform->Count); } else { diff --git a/src/game_loader.cpp b/src/game_loader.cpp index d026fccdd..270d8d31d 100644 --- a/src/game_loader.cpp +++ b/src/game_loader.cpp @@ -83,7 +83,6 @@ PrintFiles(file_traversal_node *Node) global_variable const char * Global_ProjectSwitcherGameLibName = "./bin/game_libs/project_and_level_picker_loadable" PLATFORM_RUNTIME_LIB_EXTENSION; - s32 main( s32 ArgCount, const char ** Args ) { From 461ab47065b21b3c9308c7e785e9e9b269b1f5ec Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 16 Oct 2025 19:58:54 -0700 Subject: [PATCH 352/421] Respect shader_uniform::Count in BindEngineUniform --- external/bonsai_stdlib | 2 +- src/engine/api.cpp | 2 ++ src/engine/shader.cpp | 6 ++++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 3b6d8dfff..812d8acdd 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 3b6d8dfffe5f8b827f84d693cc48e5929d68a10e +Subproject commit 812d8acddb02a04a98278625cb441a92c41bb19f diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 6615936da..8f5e01e22 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -515,6 +515,7 @@ Bonsai_Render(engine_resources *Engine) .U32 = &Global_False, .ID = INVALID_SHADER_UNIFORM, .Name = "DrawMinorGrid", + .Count = 1, }; shader_uniform MajorGridUniform = @@ -523,6 +524,7 @@ Bonsai_Render(engine_resources *Engine) .U32 = &Global_False, .ID = INVALID_SHADER_UNIFORM, .Name = "DrawMajorGrid", + .Count = 1, }; diff --git a/src/engine/shader.cpp b/src/engine/shader.cpp index 92a3b25df..658d5c89d 100644 --- a/src/engine/shader.cpp +++ b/src/engine/shader.cpp @@ -17,14 +17,16 @@ BindEngineUniform(shader_uniform *Uniform) case ShaderUniform_Light: { TIMED_BLOCK("ShaderUniform_Light"); - GetGL()->Uniform3fv(Uniform->ID, 1, &Uniform->Light->Position.E[0]); + Assert(Uniform->Count); + GetGL()->Uniform3fv(Uniform->ID, Uniform->Count, &Uniform->Light->Position.E[0]); END_BLOCK(); } break; case ShaderUniform_Camera: { TIMED_BLOCK("ShaderUniform_Camera"); - GetGL()->Uniform3fv(Uniform->ID, 1, &Uniform->Camera->RenderSpacePosition.E[0]); + Assert(Uniform->Count); + GetGL()->Uniform3fv(Uniform->ID, Uniform->Count, &Uniform->Camera->RenderSpacePosition.E[0]); END_BLOCK(); } break; From e809bea1c10e4771d6b2ad1b9413914fb39786dc Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 16 Oct 2025 20:09:49 -0700 Subject: [PATCH 353/421] Update stdlib --- external/bonsai_stdlib | 2 +- generated/for_datatypes_IXWy6K9V.h | 94 +++++++++--------- .../shader_magic_textured_quad_render_pass.h | 8 +- jesse.bonsai.rdbg | Bin 17132 -> 17313 bytes src/engine/render_loop.cpp | 2 +- 5 files changed, 53 insertions(+), 53 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 812d8acdd..5b26e5a7b 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 812d8acddb02a04a98278625cb441a92c41bb19f +Subproject commit 5b26e5a7baf847b0c405e7434ac7701f2ae8fc70 diff --git a/generated/for_datatypes_IXWy6K9V.h b/generated/for_datatypes_IXWy6K9V.h index 0abe36458..f30afa3d1 100644 --- a/generated/for_datatypes_IXWy6K9V.h +++ b/generated/for_datatypes_IXWy6K9V.h @@ -285,182 +285,182 @@ UseRenderPass_lighting_render_group s32 UniformIndex = 0; { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } @@ -675,28 +675,28 @@ UseRenderPass_terrain_decoration_render_context s32 UniformIndex = 0; { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } @@ -803,7 +803,7 @@ UseRenderPass_terrain_finalize_render_context s32 UniformIndex = 0; { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } @@ -986,28 +986,28 @@ UseRenderPass_world_edit_render_context s32 UniformIndex = 0; { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } @@ -1224,14 +1224,14 @@ UseRenderPass_easing_function_visualizer_render_pass s32 UniformIndex = 0; { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } @@ -1405,28 +1405,28 @@ UseRenderPass_shadow_map_shader s32 UniformIndex = 0; { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } @@ -1518,7 +1518,7 @@ UseRenderPass_bloom_upsample_shader s32 UniformIndex = 0; { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } @@ -1821,7 +1821,7 @@ UseRenderPass_terrain_derivs_render_context s32 UniformIndex = 0; { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } @@ -1941,7 +1941,7 @@ UseRenderPass_bloom_downsample_shader s32 UniformIndex = 0; { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } @@ -2146,21 +2146,21 @@ UseRenderPass_terrain_shaping_render_context s32 UniformIndex = 0; { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } diff --git a/generated/shader_magic_textured_quad_render_pass.h b/generated/shader_magic_textured_quad_render_pass.h index 3127b6b42..e5e2a247e 100644 --- a/generated/shader_magic_textured_quad_render_pass.h +++ b/generated/shader_magic_textured_quad_render_pass.h @@ -76,28 +76,28 @@ UseRenderPass_textured_quad_render_pass s32 UniformIndex = 0; { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } { shader_uniform *Uniform = Element->Uniforms+UniformIndex; - BindUniformById(Uniform, &TextureUnit, Uniform->Count); + BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 9f60aeb9b45991e2d5821194a9286c58158f4d1f..d74406d00f15fc044f18d36e5a3e5031cd819f0a 100644 GIT binary patch delta 2583 zcmbtWTWn)j70t2Z=Z#;n9cSV=&O5Q4II*3F?KtB}Iy1>kJCGDgCQ{Wqj&q&sHh#>t z9cGxSbR-IYG&4&T5~!sE>JJZTM&$zpf(U!P4`MLtxO2nZS*+JD;<{lH|1xxW zi*i%B(QIjoypT?(=NIM@3Cx_yS&MSLpfwZ?)q%L9p){N2>RuyGq02n9r&QDA-9od_ zyjfQo@};X=Hy57Fd=9fyIlN=HvvW9hWTZla5;S?xrzj|g*OvY4)A(R^4Of;Wc9}*Q z9Or!aj46V{+ys7pCW4W(RRMJl(awE4S)|Pl>AwNc2STYSsZqGHz1~yNbpU;U2-gmx-X6nP%7U zfqx3V%p$u;pd$ENsvCbyJ6Q^z0!jA6|ein_Q znv&RgI$I2rseUnglDo_R?-!5Qn*PyXCln< zf@C?-Cyx0r?nX4xMbr~ex2hECaz&}sw3|FIBeuQe<0NubY|Ps6?#!xy^{W|)%@Q3m zouU$nGg-(pT~tgije!}95X4c=gNN}RRuo_N;$d`CssBDbPx!N@R{7ah8E2b z#Zh#eq@;C&Tr#LR&LO@#?qb?fz?J&UojN6D}0JX}G;X_PqG= zt?mn~iiBt1SV|@FO^=FM&vmkv#=@3@!Daw{EIh2NNXlWJ1sr|@H! zlkr9+8Y7ynP+RD;F|$FpZ;PlM(IWbf)68u^v^u=$w6|BwP767$Fa$)M65055LjZZH z5BF{QwV!ho@L|^`xy@NT(Y1r$OI2zEz4{tytUbB7T>ldlv~c$0DnAv+Fp8MJhh+3PZ_svf4;JaG?({EOtt6%s9+K7o(a2le zfY)pn4Q)qjHB<}{Wp7zr)L{7J^A?Y|**m=9Y31SzbhGm(VHO_73D=Vb@C~yIADdKs z+q6Muzd?|=Mg7d^rQUC~G*ohe>K^`Vylkk<;W#vdtxlimfCNeXncQisQzoTtnqu@^ zm>^fj!hrN$aiWuu6 zY0~An^P_nRC#SvhqT`DOdQ+YJ&C%eQhVryhr8mU}=}1-z4ZPx# delta 2507 zcmZ8jYiyfW8SZgxf4)18<2i{F-;y-3oj6V$=kDCrl9set3QW;ZR`*N%CH^+w`q{|} zbhH(!K$Aw3Jc1va#FB0N*pO%uh)D=BE~@xJE1Due0%;V4#6^<^;<6tDh4&mMQAMOr zvCld0`@QFRpXYhK_eJ*pO}2GL|GN_>PT+DnuzjZu*P~I~9+q%-GKF?Sgg!Up%aam5 zVIQ{2m5Nf$sM&b#8T@{941Y<7DJ%_l`XXE0-tWerCt~cp*m`T?34}sp`btTwA`lAU zfzAT&gcnIy1QY2-{C3=pn`1M&%_M?S4Bs4U!s7UR-9S8t{ZKC^#v65oLBz+FM8q|H z1AJp1JQ_{m?x>GtxAzC}>}ZnBi?=n7HnJ(moqh0|B;4vT>Xoco#a<+YM4JyUjo9F7 z3y2zS4?8e5;$kW6b;t10u$`TLJkY`eGb`FgC5HzcF>_2EK`d2RJb1idx8Kr#%4-!UQ zZWMN_opb-937yC-Vbb5?VjB4;b| zni5|vmrv76f*o?9oL4H#Wv%oaQ6NKsnY^;8UwmPkpychGG9z5(ghc_Zz#*TW83M~~f6-85(3X!;0Ob``|*b z!wcA>c(2`bte3B}2T1!7ywmJ9R(P-G>78*wyYHl$aNX#lYFxM*_EKkJ*i9JlH)k4) zVH2_JG#la^sV7L4jIy>yXjM3jkV8Xc57Q(oYEQjrPq|c4t7@qj&!u<_ejRkuu_)A_ zRhJV~qmK^!!#QRo87kDIYd#_GV;%PJIH{mia`D_*ey6Juzoce1lkr?qq|9_1aKA~y zjy;A0ze(KnzTd5RWlb$mwVNDA zg6hm+iuc+j)HjDYrSP-X2Do~73%#xtYN4!VD%EUWT{#3GfL)(MpI5Xpe&8eHYUK*+ zr~C1Zb~eQ?@V3v(RBYQj(dTng9km{R*fO%yCK+oCt=j6W7=tUlNoZvYw%d`OMg3VH93*$jv9oz@qu#^_uUfX zcO4TBqIf?p2s#~V!;;s*&QiKjn7nS{yr8YLp63^x66@bcnaQ8&gkeKn-ca##&nQWq zM|_mDV8*jRcbgQ-E+&lFl?2Fmx6wtlMDb$dQHx$|l<;F)m}JvtFO;;;WMoY#%JD6u#hEC+}Ef z^EFKb424ow$sg+Sq%N1>gk?qC^YkNAZ>4t49^PazETQC_rlBeFT62nA&J+}0CLG2| z_+1Y8oDOU`o@5Jrn&7e{aOA|c!(qT7<7|xKUAqAf{k{0WF5!ZGmJV_eOGw*2LYuoj zJHF;L;zQdL*s`U>{wr1sK5uJa)4ceE%}2f{l#c_eiN?ngHC^r;(W~*?+_BGwtc^f_ z6D~D`@p3Xmwz@z^#TDqg$IR8ht9qsehzrwZD;}Dgh^)~=aP}P&wAy-vC=O@_KkOLB z9g~MFeD2uP8`&IBa!(2~uE&_9sd8TZtOD8FPP5sHb5f99;z#~u9LFyl+~3W3#n^$I zF(O>%oUv6XEo#ZhWY)YcVKAJ!w#-I3D_2FaHM`(^e$`;6j-16G>m&HD{v>fMi8rJO z&Gj&i;r_8xcvA1i>vhXwVtlTyivXCiuc*~ERmo>FN^zrr+q$Ru(CfyRbdg%KjeNq< z51U)=Nj|piI{E>{{}?^TytZEzYyY=8_*Yuh(_^6LY_YsiYntEHu^tdtGj;&c6-kfzEf2+rDW`FuWk)$pK diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 4e30bdd52..267dbfec6 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -238,7 +238,7 @@ DrainRenderQueue(engine_resources *Engine) shader_uniform *Uniform = &Command->Uniform; if (Uniform->ID >= 0) { - BindUniformById(Uniform, &Command->TextureUnit, Uniform->Count); + BindUniformById(Uniform, &Command->TextureUnit); } else { From b8b202a30ea53908dceb42fd1f98d2e71e4d0fad Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 17 Oct 2025 10:15:52 -0700 Subject: [PATCH 354/421] Add parent hashing to DoEditorUi interface --- examples/terrain_gen/game.cpp | 4 +- examples/turn_based/game.cpp | 4 +- external/bonsai_stdlib | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_ui_toggle.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/block_array_world_edit_688735882.h | 7 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/d_union_ui_render_command.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_animation.h | 16 ++- .../do_editor_ui_for_compound_type_asset.h | 12 ++- .../do_editor_ui_for_compound_type_asset_id.h | 10 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 10 +- ...editor_ui_for_compound_type_bonsai_futex.h | 10 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 18 +++- ..._editor_ui_for_compound_type_brush_layer.h | 9 +- ...itor_ui_for_compound_type_brush_settings.h | 18 +++- .../do_editor_ui_for_compound_type_camera.h | 25 ++++- ...o_editor_ui_for_compound_type_chunk_data.h | 14 ++- ...tor_ui_for_compound_type_chunk_thumbnail.h | 10 +- ...tor_ui_for_compound_type_collision_event.h | 12 ++- ..._editor_ui_for_compound_type_debug_state.h | 70 ++++++++++-- ...editor_ui_for_compound_type_engine_debug.h | 36 ++++++- ...or_ui_for_compound_type_engine_resources.h | 34 +++++- ...tor_ui_for_compound_type_engine_settings.h | 9 +- .../do_editor_ui_for_compound_type_entity.h | 29 +++-- ...do_editor_ui_for_compound_type_entity_id.h | 10 +- ...i_for_compound_type_entity_position_info.h | 12 ++- ...ui_for_compound_type_file_traversal_node.h | 11 +- .../do_editor_ui_for_compound_type_frustum.h | 16 ++- ..._for_compound_type_g_buffer_render_group.h | 15 ++- ..._editor_ui_for_compound_type_game_lights.h | 13 ++- ...o_editor_ui_for_compound_type_game_state.h | 8 +- ...compound_type_gpu_element_buffer_handles.h | 26 ++++- ..._compound_type_gpu_mapped_element_buffer.h | 10 +- .../do_editor_ui_for_compound_type_graphics.h | 56 +++++++++- ...r_ui_for_compound_type_graphics_settings.h | 13 ++- .../do_editor_ui_for_compound_type_input.h | 72 ++++++++++++- ..._editor_ui_for_compound_type_input_event.h | 10 +- .../do_editor_ui_for_compound_type_keyframe.h | 10 +- ...ditor_ui_for_compound_type_layered_brush.h | 23 +++- ...editor_ui_for_compound_type_level_editor.h | 20 +++- ..._for_compound_type_lighting_render_group.h | 51 ++++++++- ...r_ui_for_compound_type_lighting_settings.h | 25 +++-- ..._ui_for_compound_type_lod_element_buffer.h | 48 +++++++-- ...do_editor_ui_for_compound_type_maybe_ray.h | 10 +- .../do_editor_ui_for_compound_type_model.h | 14 ++- ..._editor_ui_for_compound_type_noise_layer.h | 10 +- ..._editor_ui_for_compound_type_octree_node.h | 25 ++++- .../do_editor_ui_for_compound_type_particle.h | 13 ++- ...tor_ui_for_compound_type_particle_system.h | 55 ++++++++-- ...ui_for_compound_type_perlin_noise_params.h | 7 +- .../do_editor_ui_for_compound_type_physics.h | 13 ++- .../do_editor_ui_for_compound_type_plane.h | 11 +- .../do_editor_ui_for_compound_type_platform.h | 24 ++++- ...ditor_ui_for_compound_type_random_series.h | 9 +- .../do_editor_ui_for_compound_type_ray.h | 10 +- .../do_editor_ui_for_compound_type_rect3.h | 10 +- .../do_editor_ui_for_compound_type_rect3cp.h | 10 +- .../do_editor_ui_for_compound_type_rect3i.h | 10 +- ...r_ui_for_compound_type_render_buffers_2d.h | 12 ++- ...editor_ui_for_compound_type_render_debug.h | 12 ++- ...tor_ui_for_compound_type_render_settings.h | 27 ++++- ..._editor_ui_for_compound_type_renderer_2d.h | 57 ++++++++-- .../do_editor_ui_for_compound_type_shader.h | 15 ++- ..._editor_ui_for_compound_type_shape_layer.h | 14 ++- ...ompound_type_shape_layer_advanced_params.h | 10 +- ...struct_terrain_decoration_render_context.h | 28 ++++- ...e_struct_terrain_finalize_render_context.h | 25 ++++- ...pe_struct_terrain_shaping_render_context.h | 27 ++++- ...or_compound_type_struct_world_edit_brush.h | 13 ++- ...nd_type_struct_world_edit_render_context.h | 52 +++++++-- .../do_editor_ui_for_compound_type_texture.h | 16 ++- .../do_editor_ui_for_compound_type_ui_debug.h | 15 ++- .../do_editor_ui_for_compound_type_ui_id.h | 10 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 8 +- ...pound_type_untextured_3d_geometry_buffer.h | 17 ++- ...ui_for_compound_type_v2_static_cursor_16.h | 20 +++- ...tor_ui_for_compound_type_vertex_material.h | 11 +- ...i_for_compound_type_voronoi_noise_params.h | 9 +- .../do_editor_ui_for_compound_type_vox_data.h | 9 +- .../do_editor_ui_for_compound_type_voxel.h | 10 +- ...itor_ui_for_compound_type_voxel_lighting.h | 9 +- ..._ui_for_compound_type_white_noise_params.h | 6 +- ...o_editor_ui_for_compound_type_work_queue.h | 12 ++- ...or_ui_for_compound_type_work_queue_entry.h | 9 +- .../do_editor_ui_for_compound_type_world.h | 16 ++- ..._editor_ui_for_compound_type_world_chunk.h | 22 +++- ...mpound_type_world_edit_block_array_index.h | 9 +- ...pe_world_update_op_shape_params_cylinder.h | 8 +- ..._type_world_update_op_shape_params_plane.h | 8 +- ...d_type_world_update_op_shape_params_rect.h | 7 +- ...type_world_update_op_shape_params_sphere.h | 7 +- ..._type_world_update_op_shape_params_torus.h | 8 +- ..._ui_for_container_entity_ptr_block_array.h | 10 +- .../do_editor_ui_for_container_model_buffer.h | 10 +- ..._ui_for_container_shader_ptr_block_array.h | 10 +- generated/do_editor_ui_for_container_struct.h | 10 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 8 +- .../do_editor_ui_for_container_v3_cursor.h | 8 +- ...world_edit_block_array_index_block_array.h | 10 +- generated/do_editor_ui_for_enum_asset_type.h | 14 +-- generated/do_editor_ui_for_enum_chunk_flag.h | 20 ++-- generated/do_editor_ui_for_enum_data_type.h | 14 +-- ...ditor_ui_for_enum_engine_debug_view_mode.h | 24 +++-- ...editor_ui_for_enum_entity_behavior_flags.h | 26 ++--- .../do_editor_ui_for_enum_entity_state.h | 16 +-- ...o_editor_ui_for_enum_file_traversal_type.h | 14 +-- generated/do_editor_ui_for_enum_maybe_tag.h | 12 ++- ...o_editor_ui_for_enum_particle_spawn_type.h | 16 +-- ...do_editor_ui_for_enum_resolution_setting.h | 14 +-- ...itor_ui_for_enum_shader_language_setting.h | 12 ++- generated/do_editor_ui_for_enum_shape_axis.h | 24 +++-- generated/do_editor_ui_for_enum_shape_type.h | 18 ++-- .../do_editor_ui_for_enum_tone_mapping_type.h | 20 ++-- .../do_editor_ui_for_enum_ui_noise_type.h | 14 +-- ...o_editor_ui_for_enum_visible_region_size.h | 40 +++---- ..._editor_ui_for_enum_voxel_rule_direction.h | 22 ++-- ...ui_for_radio_enum_asset_window_view_mode.h | 3 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 3 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 3 +- ...adio_enum_world_edit_blend_mode_modifier.h | 18 ++-- ..._ui_for_radio_enum_world_edit_brush_type.h | 3 +- ...r_radio_enum_world_edit_color_blend_mode.h | 16 +-- ...editor_ui_for_radio_enum_world_edit_tool.h | 3 +- .../do_editor_ui_for_scalar_type_688724926.h | 100 ++++++------------ .../do_editor_ui_for_vector_type_688873645.h | 86 +++++++++------ generated/for_datatypes_Bxw4Q7AW.h | 56 ++++++++-- generated/for_datatypes_cx51CcgQ.h | 20 +--- generated/for_datatypes_kh9dwrCf.h | 14 +-- generated/for_datatypes_khY6kwEk.h | 20 +--- generated/hashtable_struct_ui_toggle.h | 2 +- generated/hashtable_struct_window_layout.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- generated/maybe_ui_toggle.h | 2 +- generated/maybe_ui_toggle_ptr.h | 2 +- generated/maybe_window_layout.h | 2 +- generated/maybe_window_layout_ptr.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- src/engine/debug.cpp | 58 +++++----- src/engine/editor.cpp | 54 ++++++---- src/engine/editor.h | 94 ++++++++++------ src/engine/entity.h | 14 +-- src/engine/render_settings.h | 8 +- src/engine/world.h | 2 +- 165 files changed, 1831 insertions(+), 773 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 3b3afeeb7..45365dcd1 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -81,12 +81,10 @@ BONSAI_API_MAIN_THREAD_CALLBACK() { window_layout *Window = GetOrCreateWindow(Ui, "GameState"); PushWindowStart(Ui, Window); - DoEditorUi(Ui, Window, GameState, CSz("Game State")); + DoEditorUi(Ui, Window, GameState, CSz("Game State"), u32(Hash(Window))); PushWindowEnd(Ui, Window); } - /* GameState->EasingFunctionVisRP.Count = GameState->EasingFunction.Points.At; */ - { window_layout *Window = GetOrCreateWindow(Ui, "Easing Window"); PushWindowStart(Ui, Window); diff --git a/examples/turn_based/game.cpp b/examples/turn_based/game.cpp index 7bd733b95..0fe2f4da3 100644 --- a/examples/turn_based/game.cpp +++ b/examples/turn_based/game.cpp @@ -24,10 +24,10 @@ MoveToStandingSpot(world *World, canonical_position P) } link_weak void -EntityUserDataEditorUi(renderer_2d *Ui, window_layout *Window, u64 *UserType, u64 *UserData, cs Name, EDITOR_UI_FUNCTION_PROTO_ARGUMENTS) +EntityUserDataEditorUi(renderer_2d *Ui, window_layout *Window, u64 *UserType, u64 *UserData, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_ARGUMENTS) { entity_aggregate_type *AType = UserTypeToAggregateTypePtr(UserType); - DoEditorUi(Ui, Window, AType, CSz("entity_aggregate_type UserType"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi(Ui, Window, AType, CSz("entity_aggregate_type UserType"), ParentHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); switch (AType->Type) { diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 5b26e5a7b..eb3c89a5d 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 5b26e5a7baf847b0c405e7434ac7701f2ae8fc70 +Subproject commit eb3c89a5d1ca62e68b4abfd9442faa7eb02d204e diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 93963bb47..c70e08768 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:867:0 +// src/engine/editor.h:891:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 7f934356a..6eaa115f8 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1159:0 +// src/engine/editor.h:1183:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_ui_toggle.h b/generated/are_equal_ui_toggle.h index 53e555df1..d11b8aedb 100644 --- a/generated/are_equal_ui_toggle.h +++ b/generated/are_equal_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:151:0 +// external/bonsai_stdlib/src/ui/ui.h:153:0 link_internal b32 AreEqual(ui_toggle *Thing1, ui_toggle *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 9c42c5fd3..452093479 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1246:0 +// src/engine/editor.h:1270:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 2ddab88fd..5cabcf466 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:702:0 +// src/engine/editor.h:726:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 12314af42..674e118ed 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -343,16 +343,17 @@ Shift( world_edit_block_array *Array, world_edit *Element ) } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash); if (Container) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container, ThisHash), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) { PushNewRow(Ui); IterateOver(Container, Element, ElementIndex) { - DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi(Ui, Window, Element, CS(ElementIndex), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); } } diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index 6e8a06e66..e215fceb7 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1282:0 +// src/engine/editor.h:1306:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index ee7a90b25..0dfd3ccc8 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1293:0 +// src/engine/editor.h:1317:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 5caac5374..699e265ca 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1278:0 +// src/engine/editor.h:1302:0 diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 669ae1397..15559dfd0 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:876:0 +// external/bonsai_stdlib/src/ui/ui.h:892:0 enum ui_render_command_type { diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index ef62bcf3d..301561cf6 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1101:0 +// src/engine/editor.h:1125:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index ee450aff5..3e8412c86 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:336:0 +// src/engine/editor.cpp:340:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x34AA15E5); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle animation", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle animation", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->t), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->tEnd), MemberName, + ThisHash, Params ); @@ -89,6 +93,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->xKeyframeCount), MemberName, + ThisHash, Params ); @@ -114,6 +119,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(keyframe*, Element->xKeyframes), MemberName, + ThisHash, Params ); @@ -138,6 +144,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->yKeyframeCount), MemberName, + ThisHash, Params ); @@ -163,6 +170,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(keyframe*, Element->yKeyframes), MemberName, + ThisHash, Params ); @@ -187,6 +195,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->zKeyframeCount), MemberName, + ThisHash, Params ); @@ -212,6 +221,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(keyframe*, Element->zKeyframes), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 45caf0353..fbabd0e21 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:508:0 +// src/engine/editor.cpp:514:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x318DDBAB); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle asset", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle asset", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(asset_load_state*, &Element->LoadState), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(asset_id*, &Element->Id), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->LRUFrameIndex), MemberName, + ThisHash, Params ); @@ -112,6 +117,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(asset_type*, &Element->Type), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index bad8c3d69..117b8e93b 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:500:0 +// src/engine/editor.cpp:506:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x31F98252); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle asset_id", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle asset_id", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(u16*, &Element->Index), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(file_traversal_node*, &Element->FileNode), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 692fdf0e0..321d7ffe4 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:375:0 +// src/engine/editor.cpp:381:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x26039060); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle asset_thumbnail", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle asset_thumbnail", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->Texture), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs // Cast to remove const/volatile keywords if they're there Cast(camera*, &Element->Camera), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 51ac47d3c..308ca3fed 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:342:0 +// src/engine/editor.cpp:346:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1CACA02D); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle bonsai_futex", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle bonsai_futex", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->SignalValue), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ThreadsWaiting), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index 2013b72ff..bc2064421 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:275:0 +// src/engine/editor.cpp:279:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1311052E); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle bonsai_stdlib", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle bonsai_stdlib", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(os*, &Element->Os), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(platform*, &Element->Plat), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(application_api*, &Element->AppApi), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(thread_local_state*, Element->ThreadStates), MemberName, + ThisHash, Params ); @@ -135,6 +141,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(opengl*, &Element->GL), MemberName, + ThisHash, Params ); @@ -159,6 +166,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(hot_reloadable_file*, &Element->ShaderHeaderFile), MemberName, + ThisHash, Params ); @@ -183,6 +191,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(ansi_stream*, &Element->ShaderHeaderCode), MemberName, + ThisHash, Params ); @@ -207,6 +216,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(texture_block_array*, &Element->AllTextures), MemberName, + ThisHash, Params ); @@ -231,6 +241,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(shader_ptr_block_array*, &Element->AllShaders), MemberName, + ThisHash, Params ); @@ -255,6 +266,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(debug_state*, &Element->DebugState), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index cbca9f11d..4562695ef 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:411:0 +// src/engine/editor.cpp:417:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x133E0EA1); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle brush_layer", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle brush_layer", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(brush_settings*, &Element->Settings), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 9c2da8edb..90ac4bd40 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:177:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x2B34AC41); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle brush_settings", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle brush_settings", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N // Cast to remove const/volatile keywords if they're there Cast(brush_layer_type*, &Element->Type), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N // Cast to remove const/volatile keywords if they're there Cast(noise_layer*, &Element->Noise), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N // Cast to remove const/volatile keywords if they're there Cast(shape_layer*, &Element->Shape), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->Power), MemberName, + ThisHash, Params ); @@ -136,6 +142,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ValueBias), MemberName, + ThisHash, Params , -1.f, 1.f ); @@ -161,6 +168,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->Threshold), MemberName, + ThisHash, Params , 0.f, 1.f ); @@ -186,6 +194,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N // Cast to remove const/volatile keywords if they're there Cast(world_edit_blend_mode_modifier*, &Element->ValueModifier), MemberName, + ThisHash, Params ); @@ -210,6 +219,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N // Cast to remove const/volatile keywords if they're there Cast(world_edit_blend_mode*, &Element->BlendMode), MemberName, + ThisHash, Params ); @@ -234,6 +244,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N // Cast to remove const/volatile keywords if they're there Cast(world_edit_color_blend_mode*, &Element->ColorMode), MemberName, + ThisHash, Params ); @@ -258,6 +269,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->Invert), MemberName, + ThisHash, Params ); @@ -312,7 +324,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N cs MemberName = CSz("HSVColor"); - PushColumn(Ui, CSz("HSVColor")); DoColorPickerToggle(Ui, Window, &Element->HSVColor, False); + PushColumn(Ui, CSz("HSVColor")); DoColorPickerToggle(Ui, Window, &Element->HSVColor, False, ThisHash); diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 1d418e237..4a6e4402b 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:369:0 +// src/engine/editor.cpp:375:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x17AFA196); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle camera", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle camera", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(frustum*, &Element->Frust), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->CurrentP), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->RenderSpacePosition), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Pitch), MemberName, + ThisHash, Params ); @@ -136,6 +142,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Roll), MemberName, + ThisHash, Params ); @@ -161,6 +168,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Yaw), MemberName, + ThisHash, Params ); @@ -186,6 +194,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->DistanceFromTarget), MemberName, + ThisHash, Params ); @@ -211,6 +220,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->TargetPitch), MemberName, + ThisHash, Params ); @@ -236,6 +246,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->TargetRoll), MemberName, + ThisHash, Params ); @@ -261,6 +272,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->TargetYaw), MemberName, + ThisHash, Params ); @@ -286,6 +298,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->TargetDistanceFromTarget), MemberName, + ThisHash, Params ); @@ -311,6 +324,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Blend), MemberName, + ThisHash, Params ); @@ -336,6 +350,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Speed), MemberName, + ThisHash, Params ); @@ -361,6 +376,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Front), MemberName, + ThisHash, Params ); @@ -385,6 +401,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Right), MemberName, + ThisHash, Params ); @@ -409,6 +426,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Up), MemberName, + ThisHash, Params ); @@ -433,6 +451,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(entity_id*, &Element->GhostId), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 683e27167..77920fee4 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:447:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x27DCE418); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle chunk_data", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle chunk_data", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Dim), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->Occupancy), MemberName, + ThisHash, Params ); @@ -88,6 +92,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->xOccupancyBorder), MemberName, + ThisHash, Params ); @@ -113,6 +118,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->FaceMasks), MemberName, + ThisHash, Params ); @@ -138,6 +144,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(voxel*, Element->Voxels), MemberName, + ThisHash, Params ); @@ -162,6 +169,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(voxel_lighting*, Element->VoxelLighting), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 3642a3178..90f65ae9b 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:378:0 +// src/engine/editor.cpp:384:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0xB590D48); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle chunk_thumbnail", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle chunk_thumbnail", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs // Cast to remove const/volatile keywords if they're there Cast(world_chunk*, &Element->Chunk), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs // Cast to remove const/volatile keywords if they're there Cast(asset_thumbnail*, &Element->Thumbnail), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 247708893..25de58b54 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:511:0 +// src/engine/editor.cpp:517:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x29EED98A); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle collision_event", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle collision_event", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->FrameIndex), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Count), MemberName, + ThisHash, Params ); @@ -89,6 +93,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->MinP), MemberName, + ThisHash, Params ); @@ -113,6 +118,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->MaxP), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 57fca60a8..a1cab7f45 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:271:0 +// src/engine/editor.cpp:275:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x2186A9AB); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle debug_state", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle debug_state", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -38,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name Window, Cast(b8*, &Element->Initialized), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -61,6 +64,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->UIType), MemberName, + ThisHash, Params ); @@ -86,6 +90,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->BytesBufferedToCard), MemberName, + ThisHash, Params ); @@ -110,6 +115,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name Window, Cast(b8*, &Element->DebugDoScopeProfiling), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -133,6 +139,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->NumScopes), MemberName, + ThisHash, Params ); @@ -158,6 +165,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->DrawCallCountLastFrame), MemberName, + ThisHash, Params ); @@ -183,6 +191,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->VertexCountLastFrame), MemberName, + ThisHash, Params ); @@ -505,6 +514,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(picked_world_chunk*, Element->PickedChunk), MemberName, + ThisHash, Params ); @@ -529,6 +539,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(picked_world_chunk*, Element->HoverChunk), MemberName, + ThisHash, Params ); @@ -553,6 +564,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(debug_thread_state*, Element->ThreadStates), MemberName, + ThisHash, Params ); @@ -577,6 +589,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->MetaTableNameStringsArena), MemberName, + ThisHash, Params ); @@ -601,6 +614,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(renderer_2d*, Element->UiGroup), MemberName, + ThisHash, Params ); @@ -625,6 +639,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(untextured_3d_geometry_buffer*, &Element->LineMesh), MemberName, + ThisHash, Params ); @@ -649,6 +664,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(selected_arenas*, Element->SelectedArenas), MemberName, + ThisHash, Params ); @@ -672,6 +688,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name Window, Cast(b8*, &Element->DisplayDebugMenu), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -695,6 +712,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(debug_profile_scope*, Element->HotFunction), MemberName, + ThisHash, Params ); @@ -719,6 +737,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(u64_cursor*, &Element->HistogramSamples), MemberName, + ThisHash, Params ); @@ -743,6 +762,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(bonsai_futex*, &Element->HistogramFutex), MemberName, + ThisHash, Params ); @@ -767,6 +787,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(debug_profile_scope*, &Element->FreeScopeSentinel), MemberName, + ThisHash, Params ); @@ -791,6 +812,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(umm*, &Element->MinCycles), MemberName, + ThisHash, Params ); @@ -816,6 +838,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(umm*, &Element->MaxCycles), MemberName, + ThisHash, Params ); @@ -838,13 +861,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("Frames"); - if (ToggleButton(Ui, CSz("v Frames[(128)]"), CSz("> Frames[(128)]"), UiId(Window, "toggle debug_state frame_stats Frames", Element->Frames), Params )) + if (ToggleButton(Ui, + CSz("v Frames[(128)]"), + CSz("> Frames[(128)]"), + UiId(Window, "toggle debug_state frame_stats Frames", Element->Frames, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, (128)) { - DoEditorUi(Ui, Window, Element->Frames+ArrayIndex, FSz("Frames[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->Frames+ArrayIndex, + FSz("Frames[%d]", ArrayIndex), + ThisHash, + Params); } @@ -869,6 +901,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ReadScopeIndex), MemberName, + ThisHash, Params ); @@ -894,6 +927,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->FreeScopeCount), MemberName, + ThisHash, Params ); @@ -916,13 +950,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("RegisteredMemoryArenas"); - if (ToggleButton(Ui, CSz("v RegisteredMemoryArenas[(1024)]"), CSz("> RegisteredMemoryArenas[(1024)]"), UiId(Window, "toggle debug_state registered_memory_arena RegisteredMemoryArenas", Element->RegisteredMemoryArenas), Params )) + if (ToggleButton(Ui, + CSz("v RegisteredMemoryArenas[(1024)]"), + CSz("> RegisteredMemoryArenas[(1024)]"), + UiId(Window, "toggle debug_state registered_memory_arena RegisteredMemoryArenas", Element->RegisteredMemoryArenas, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, (1024)) { - DoEditorUi(Ui, Window, Element->RegisteredMemoryArenas+ArrayIndex, FSz("RegisteredMemoryArenas[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->RegisteredMemoryArenas+ArrayIndex, + FSz("RegisteredMemoryArenas[%d]", ArrayIndex), + ThisHash, + Params); } @@ -944,13 +987,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("TrackedDrawCalls"); - if (ToggleButton(Ui, CSz("v TrackedDrawCalls[(4096)]"), CSz("> TrackedDrawCalls[(4096)]"), UiId(Window, "toggle debug_state debug_draw_call TrackedDrawCalls", Element->TrackedDrawCalls), Params )) + if (ToggleButton(Ui, + CSz("v TrackedDrawCalls[(4096)]"), + CSz("> TrackedDrawCalls[(4096)]"), + UiId(Window, "toggle debug_state debug_draw_call TrackedDrawCalls", Element->TrackedDrawCalls, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, (4096)) { - DoEditorUi(Ui, Window, Element->TrackedDrawCalls+ArrayIndex, FSz("TrackedDrawCalls[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->TrackedDrawCalls+ArrayIndex, + FSz("TrackedDrawCalls[%d]", ArrayIndex), + ThisHash, + Params); } diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index fa2daf8e7..ae24f6fc6 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:572:0 +// src/engine/editor.cpp:578:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x318BDE5D); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle engine_debug", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle engine_debug", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->Memory), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(engine_debug_view_mode*, &Element->ViewMode), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(picked_world_chunk_static_buffer*, &Element->PickedChunks), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(texture_ptr_block_array*, &Element->Textures), MemberName, + ThisHash, Params ); @@ -135,6 +141,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(ui_debug*, &Element->UiDebug), MemberName, + ThisHash, Params ); @@ -159,6 +166,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(render_debug*, &Element->Render), MemberName, + ThisHash, Params ); @@ -183,6 +191,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawEntityCollisionVolumes), MemberName, + ThisHash, Params ); @@ -208,6 +217,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawWorldAxies), MemberName, + ThisHash, Params ); @@ -233,6 +243,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->TriggerRuntimeBreak), MemberName, + ThisHash, Params ); @@ -258,6 +269,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->ResetAssetNodeView), MemberName, + ThisHash, Params ); @@ -283,6 +295,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawBranchNodesWithMeshes), MemberName, + ThisHash, Params ); @@ -308,6 +321,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawBranchNodes), MemberName, + ThisHash, Params ); @@ -333,6 +347,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawLeafNodes), MemberName, + ThisHash, Params ); @@ -358,6 +373,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawNodesWithChunks), MemberName, + ThisHash, Params ); @@ -383,6 +399,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawQueuedNodes), MemberName, + ThisHash, Params ); @@ -408,6 +425,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->MarkChunkBorderVoxels), MemberName, + ThisHash, Params ); @@ -433,6 +451,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DrawGameCameraLocation), MemberName, + ThisHash, Params ); @@ -458,6 +477,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(r64*, &Element->ChunkGenTimeElapsedMS), MemberName, + ThisHash, Params ); @@ -483,6 +503,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->CellsGenerated), MemberName, + ThisHash, Params ); @@ -508,6 +529,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(r64*, &Element->ChunkGenCyclesElapsed), MemberName, + ThisHash, Params ); @@ -533,6 +555,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(u8*, &Element->PickedChunkState), MemberName, + ThisHash, Params ); @@ -558,6 +581,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(octree_node*, Element->PickedNode), MemberName, + ThisHash, Params ); @@ -582,6 +606,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(asset_window_view_mode*, &Element->AssetWindowViewMode), MemberName, + ThisHash, Params ); @@ -606,6 +631,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(asset_id*, &Element->SelectedAsset), MemberName, + ThisHash, Params ); @@ -630,6 +656,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->ModelIndex), MemberName, + ThisHash, Params ); @@ -655,6 +682,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(entity_id*, &Element->SelectedEntity), MemberName, + ThisHash, Params ); @@ -679,6 +707,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->OctreeDrawDepth), MemberName, + ThisHash, Params ); @@ -704,6 +733,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(octree_node*, Element->SelectedNode), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 4035b7fb2..dc6c4fd30 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:593:0 +// src/engine/editor.cpp:599:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x2FE376DA); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle engine_resources", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle engine_resources", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(bonsai_stdlib*, &Element->Stdlib), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(engine_api*, &Element->EngineApi), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(engine_settings*, &Element->Settings), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(renderer_2d*, &Element->Ui), MemberName, + ThisHash, Params ); @@ -135,6 +141,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(hotkeys*, &Element->Hotkeys), MemberName, + ThisHash, Params ); @@ -159,6 +166,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(maybe_ray*, &Element->MaybeMouseRay), MemberName, + ThisHash, Params ); @@ -183,6 +191,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(world*, Element->World), MemberName, + ThisHash, Params ); @@ -207,6 +216,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(game_state*, Element->GameState), MemberName, + ThisHash, Params ); @@ -231,6 +241,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(graphics*, &Element->Graphics), MemberName, + ThisHash, Params ); @@ -255,6 +266,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(file_traversal_node*, &Element->RequestedGameLibReloadNode), MemberName, + ThisHash, Params ); @@ -279,6 +291,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(game_lib_reload_behavior*, &Element->RequestedGameLibReloadBehavior), MemberName, + ThisHash, Params ); @@ -303,6 +316,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(heap_allocator*, &Element->Heap), MemberName, + ThisHash, Params ); @@ -327,6 +341,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->GameMemory), MemberName, + ThisHash, Params ); @@ -351,6 +366,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->WorldUpdateMemory), MemberName, + ThisHash, Params ); @@ -375,6 +391,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(entity*, Element->EntityTable), MemberName, + ThisHash, Params ); @@ -399,6 +416,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(asset_system*, &Element->AssetSystem), MemberName, + ThisHash, Params ); @@ -423,6 +441,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->FrameIndex), MemberName, + ThisHash, Params ); @@ -448,6 +467,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(tiered_mesh_freelist*, &Element->geo_u3d_MeshFreelist), MemberName, + ThisHash, Params ); @@ -472,6 +492,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(tiered_mesh_freelist*, &Element->world_chunk_MeshFreelist), MemberName, + ThisHash, Params ); @@ -496,6 +517,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(engine_debug*, &Element->EngineDebug), MemberName, + ThisHash, Params ); @@ -520,6 +542,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(level_editor*, &Element->Editor), MemberName, + ThisHash, Params ); @@ -544,6 +567,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(maybe_picked_voxel*, &Element->MousedOverVoxel), MemberName, + ThisHash, Params ); @@ -568,6 +592,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(maybe_standing_spot*, &Element->ClosestStandingSpotToCursor), MemberName, + ThisHash, Params ); @@ -592,6 +617,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(maybe_entity_ptr*, &Element->HoverEntity), MemberName, + ThisHash, Params ); @@ -616,6 +642,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(render_entity_to_texture_group*, &Element->RTTGroup), MemberName, + ThisHash, Params ); @@ -640,6 +667,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs // Cast to remove const/volatile keywords if they're there Cast(world_chunk_freelist*, &Element->SynChunkFreelist), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 283f62433..4dcb86980 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:590:0 +// src/engine/editor.cpp:596:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x11FDB034); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle engine_settings", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle engine_settings", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs // Cast to remove const/volatile keywords if they're there Cast(graphics_settings*, &Element->Graphics), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 2fe9fc980..765943f06 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:480:0 +// src/engine/editor.cpp:486:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x2D655F50); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle entity", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle entity", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(entity_id*, &Element->Id), MemberName, + ThisHash, Params ); @@ -58,7 +61,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ cs MemberName = CSz("P"); - DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); @@ -78,6 +81,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->EulerAngles), MemberName, + ThisHash, Params , -PI32, PI32 ); @@ -102,6 +106,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Scale), MemberName, + ThisHash, Params ); @@ -127,6 +132,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->_CollisionVolumeRadius), MemberName, + ThisHash, Params ); @@ -151,6 +157,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(physics*, &Element->Physics), MemberName, + ThisHash, Params ); @@ -175,6 +182,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(asset_id*, &Element->AssetId), MemberName, + ThisHash, Params ); @@ -199,6 +207,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->ModelIndex), MemberName, + ThisHash, Params ); @@ -224,6 +233,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(collision_event*, &Element->LastResolvedCollision), MemberName, + ThisHash, Params ); @@ -248,6 +258,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(entity_position_info*, &Element->LastResolvedPosInfo), MemberName, + ThisHash, Params ); @@ -272,6 +283,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(particle_system*, Element->Emitter), MemberName, + ThisHash, Params ); @@ -296,6 +308,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(entity_state*, &Element->State), MemberName, + ThisHash, Params ); @@ -320,6 +333,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(entity_behavior_flags*, &Element->Behavior), MemberName, + ThisHash, Params ); @@ -344,6 +358,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(entity_id*, &Element->Carrying), MemberName, + ThisHash, Params ); @@ -363,8 +378,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ cs MemberName = CSz("UserType"); - if (EntityUserDataEditorUi) {EntityUserDataEditorUi(Ui, Window, &Element->UserType, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES);} - else {DoEditorUi(Ui, Window, &Element->UserType, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } + if (EntityUserDataEditorUi) {EntityUserDataEditorUi(Ui, Window, &Element->UserType, &Element->UserData, Name, ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES);} + else {DoEditorUi(Ui, Window, &Element->UserType, Name, ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } ; @@ -382,7 +397,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_ cs MemberName = CSz("UserData"); if (EntityUserDataEditorUi) { /* User took control, skip this because it's intended */ } - else {DoEditorUi(Ui, Window, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } + else {DoEditorUi(Ui, Window, &Element->UserData, Name, ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } ; diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index edb177591..9ea1c3b8d 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:477:0 +// src/engine/editor.cpp:483:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x25522C9E); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle entity_id", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle entity_id", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Index), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Generation), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 391d53679..4606105f6 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:514:0 +// src/engine/editor.cpp:520:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x35BC40CA); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle entity_position_info", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle entity_position_info", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->P), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->_CollisionVolumeRadius), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Scale), MemberName, + ThisHash, Params ); @@ -112,6 +117,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->EulerAngles), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 773b1dcc2..69cde0606 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:465:0 +// src/engine/editor.cpp:471:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x26008A1B); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle file_traversal_node", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle file_traversal_node", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, // Cast to remove const/volatile keywords if they're there Cast(file_traversal_type*, &Element->Type), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, // Cast to remove const/volatile keywords if they're there Cast(cs*, &Element->Dir), MemberName, + ThisHash, Params ); @@ -88,6 +92,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, // Cast to remove const/volatile keywords if they're there Cast(cs*, &Element->Name), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 5ed3686c8..7d53709bb 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:366:0 +// src/engine/editor.cpp:372:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x358AF1CD); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle frustum", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle frustum", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->farClip), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->nearClip), MemberName, + ThisHash, Params ); @@ -89,6 +93,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->width), MemberName, + ThisHash, Params ); @@ -114,6 +119,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->FOV), MemberName, + ThisHash, Params ); @@ -139,6 +145,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(plane*, &Element->Top), MemberName, + ThisHash, Params ); @@ -163,6 +170,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(plane*, &Element->Bot), MemberName, + ThisHash, Params ); @@ -187,6 +195,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(plane*, &Element->Left), MemberName, + ThisHash, Params ); @@ -211,6 +220,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(plane*, &Element->Right), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index b0d62f9d8..6f17522fd 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:548:0 +// src/engine/editor.cpp:554:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x576CF56); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle g_buffer_render_group", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle g_buffer_render_group", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(framebuffer*, &Element->FBO), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(g_buffer_textures*, &Element->Textures), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->gBufferShader), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(m4*, &Element->InverseViewMatrix), MemberName, + ThisHash, Params ); @@ -135,6 +141,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(m4*, &Element->InverseProjectionMatrix), MemberName, + ThisHash, Params ); @@ -159,6 +166,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(m4*, &Element->ViewProjection), MemberName, + ThisHash, Params ); @@ -183,6 +191,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->GlTimerObject), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index e1294c7cd..a3175826d 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:542:0 +// src/engine/editor.cpp:548:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0xFE5B45E); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle game_lights", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle game_lights", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->ColorTex), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->PositionTex), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->IndexToUV), MemberName, + ThisHash, Params ); @@ -112,6 +117,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->Count), MemberName, + ThisHash, Params ); @@ -137,6 +143,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(light*, Element->Lights), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_game_state.h b/generated/do_editor_ui_for_compound_type_game_state.h index 054f8748c..61148c349 100644 --- a/generated/do_editor_ui_for_compound_type_game_state.h +++ b/generated/do_editor_ui_for_compound_type_game_state.h @@ -1,8 +1,10 @@ // examples/terrain_gen/game.cpp:68:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, game_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, game_state *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x7825EE2); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_state *Element, cs Name, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle game_state", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle game_state", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_state *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(easing_function*, &Element->EasingFunction), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_state *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(easing_function_visualizer_render_pass*, &Element->EasingFunctionVisRP), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index b3a7d26bf..7727a1f0e 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:453:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0xA286F82); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle gpu_element_buffer_handles", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle gpu_element_buffer_handles", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -36,13 +38,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E cs MemberName = CSz("Handles"); - if (ToggleButton(Ui, CSz("v Handles[3]"), CSz("> Handles[3]"), UiId(Window, "toggle gpu_element_buffer_handles u32 Handles", Element->Handles), Params )) + if (ToggleButton(Ui, + CSz("v Handles[3]"), + CSz("> Handles[3]"), + UiId(Window, "toggle gpu_element_buffer_handles u32 Handles", Element->Handles, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 3) { - DoEditorUi(Ui, Window, Element->Handles+ArrayIndex, FSz("Handles[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->Handles+ArrayIndex, + FSz("Handles[%d]", ArrayIndex), + ThisHash, + Params); PushNewRow(Ui); } @@ -68,6 +79,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ElementCount), MemberName, + ThisHash, Params ); @@ -93,6 +105,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E // Cast to remove const/volatile keywords if they're there Cast(data_type*, &Element->ElementType), MemberName, + ThisHash, Params ); @@ -117,6 +130,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->Mapped), MemberName, + ThisHash, Params ); @@ -142,6 +156,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->Pad), MemberName, + ThisHash, Params ); @@ -167,6 +182,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E // Cast to remove const/volatile keywords if they're there Cast(u16*, &Element->Flags), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 1b84673fa..4ea230913 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:456:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1EA242B7); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle gpu_mapped_element_buffer", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle gpu_mapped_element_buffer", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El // Cast to remove const/volatile keywords if they're there Cast(gpu_element_buffer_handles*, &Element->Handles), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El // Cast to remove const/volatile keywords if they're there Cast(untextured_3d_geometry_buffer*, &Element->Buffer), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 5ba11b547..fc35f6814 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:563:0 +// src/engine/editor.cpp:569:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x36CA0243); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle graphics", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle graphics", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -38,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u Window, Cast(b8*, &Element->Initialized), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -60,6 +63,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u Window, Cast(b8*, &Element->RenderGate), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -83,6 +87,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(render_settings*, &Element->Settings), MemberName, + ThisHash, Params ); @@ -107,6 +112,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(render_settings*, &Element->PrevSettings), MemberName, + ThisHash, Params ); @@ -131,6 +137,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->OffsetOfWorldCenterToGrid), MemberName, + ThisHash, Params ); @@ -155,6 +162,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->SunBasis), MemberName, + ThisHash, Params ); @@ -179,6 +187,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->FogPower), MemberName, + ThisHash, Params ); @@ -204,6 +213,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->FogColor), MemberName, + ThisHash, Params ); @@ -228,6 +238,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->SkyColor), MemberName, + ThisHash, Params ); @@ -252,6 +263,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(camera*, &Element->GameCamera), MemberName, + ThisHash, Params ); @@ -276,6 +288,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(camera*, &Element->DebugCamera), MemberName, + ThisHash, Params ); @@ -311,6 +324,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Exposure), MemberName, + ThisHash, Params ); @@ -336,6 +350,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(world_chunk_ptr_paged_list*, &Element->MainDrawList), MemberName, + ThisHash, Params ); @@ -360,6 +375,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(world_chunk_ptr_paged_list*, &Element->ShadowMapDrawList), MemberName, + ThisHash, Params ); @@ -384,6 +400,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->MinClipP_worldspace), MemberName, + ThisHash, Params ); @@ -408,6 +425,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->MaxClipP_worldspace), MemberName, + ThisHash, Params ); @@ -432,6 +450,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(g_buffer_render_group*, Element->gBuffer), MemberName, + ThisHash, Params ); @@ -456,6 +475,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(ao_render_group*, Element->AoGroup), MemberName, + ThisHash, Params ); @@ -480,6 +500,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(shadow_render_group*, Element->SG), MemberName, + ThisHash, Params ); @@ -515,6 +536,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->ColorPaletteTexture), MemberName, + ThisHash, Params ); @@ -539,6 +561,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(transparency_render_group*, &Element->Transparency), MemberName, + ThisHash, Params ); @@ -563,6 +586,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(lighting_render_group*, &Element->Lighting), MemberName, + ThisHash, Params ); @@ -587,6 +611,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(bloom_render_group*, &Element->Bloom), MemberName, + ThisHash, Params ); @@ -611,6 +636,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(gaussian_render_group*, &Element->Gaussian), MemberName, + ThisHash, Params ); @@ -635,6 +661,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(composite_render_group*, &Element->CompositeGroup), MemberName, + ThisHash, Params ); @@ -659,6 +686,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(terrain_shaping_render_context*, &Element->TerrainShapingRC), MemberName, + ThisHash, Params ); @@ -683,6 +711,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(terrain_decoration_render_context*, &Element->TerrainDecorationRC), MemberName, + ThisHash, Params ); @@ -707,6 +736,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(terrain_derivs_render_context*, &Element->TerrainDerivsRC), MemberName, + ThisHash, Params ); @@ -731,6 +761,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(terrain_finalize_render_context*, &Element->TerrainFinalizeRC), MemberName, + ThisHash, Params ); @@ -755,6 +786,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(world_edit_render_context*, &Element->WorldEditRC), MemberName, + ThisHash, Params ); @@ -779,6 +811,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->NoiseFinalizeJobsPending), MemberName, + ThisHash, Params ); @@ -804,6 +837,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(dummy_work_queue_entry_build_chunk_mesh_block_array*, &Element->NoiseReadbackJobs), MemberName, + ThisHash, Params ); @@ -825,13 +859,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u cs MemberName = CSz("GpuBuffers"); - if (ToggleButton(Ui, CSz("v GpuBuffers[2]"), CSz("> GpuBuffers[2]"), UiId(Window, "toggle graphics gpu_mapped_element_buffer GpuBuffers", Element->GpuBuffers), Params )) + if (ToggleButton(Ui, + CSz("v GpuBuffers[2]"), + CSz("> GpuBuffers[2]"), + UiId(Window, "toggle graphics gpu_mapped_element_buffer GpuBuffers", Element->GpuBuffers, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 2) { - DoEditorUi(Ui, Window, Element->GpuBuffers+ArrayIndex, FSz("GpuBuffers[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->GpuBuffers+ArrayIndex, + FSz("GpuBuffers[%d]", ArrayIndex), + ThisHash, + Params); } @@ -856,6 +899,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->GpuBufferWriteIndex), MemberName, + ThisHash, Params ); @@ -881,6 +925,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(gpu_timer_block_array*, &Element->GpuTimers), MemberName, + ThisHash, Params ); @@ -905,6 +950,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->Memory), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 7a5ea0b23..d30bd1176 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:587:0 +// src/engine/editor.cpp:593:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x17D77224); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle graphics_settings", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle graphics_settings", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(resolution_setting*, &Element->Resolution), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(shadow_quality_setting*, &Element->ShadowQuality), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(lighting_quality_setting*, &Element->LightingQuality), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(shader_language_setting*, &Element->ShaderLanguage), MemberName, + ThisHash, Params ); @@ -135,6 +141,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(resolution_setting*, &Element->WindowStartingSize), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index 37a4205cf..fbc2056a1 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:264:0 +// src/engine/editor.cpp:268:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x8A2F50A); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle input", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle input", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Enter), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Escape), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Alt), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Ctrl), MemberName, + ThisHash, Params ); @@ -135,6 +141,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Shift), MemberName, + ThisHash, Params ); @@ -159,6 +166,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Backspace), MemberName, + ThisHash, Params ); @@ -183,6 +191,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Delete), MemberName, + ThisHash, Params ); @@ -207,6 +216,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F12), MemberName, + ThisHash, Params ); @@ -231,6 +241,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F11), MemberName, + ThisHash, Params ); @@ -255,6 +266,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F10), MemberName, + ThisHash, Params ); @@ -279,6 +291,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F9), MemberName, + ThisHash, Params ); @@ -303,6 +316,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F8), MemberName, + ThisHash, Params ); @@ -327,6 +341,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F7), MemberName, + ThisHash, Params ); @@ -351,6 +366,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F6), MemberName, + ThisHash, Params ); @@ -375,6 +391,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F5), MemberName, + ThisHash, Params ); @@ -399,6 +416,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F4), MemberName, + ThisHash, Params ); @@ -423,6 +441,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F3), MemberName, + ThisHash, Params ); @@ -447,6 +466,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F2), MemberName, + ThisHash, Params ); @@ -471,6 +491,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F1), MemberName, + ThisHash, Params ); @@ -495,6 +516,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Dot), MemberName, + ThisHash, Params ); @@ -519,6 +541,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Minus), MemberName, + ThisHash, Params ); @@ -543,6 +566,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->FSlash), MemberName, + ThisHash, Params ); @@ -567,6 +591,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Space), MemberName, + ThisHash, Params ); @@ -591,6 +616,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Underscore), MemberName, + ThisHash, Params ); @@ -615,6 +641,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N0), MemberName, + ThisHash, Params ); @@ -639,6 +666,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N1), MemberName, + ThisHash, Params ); @@ -663,6 +691,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N2), MemberName, + ThisHash, Params ); @@ -687,6 +716,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N3), MemberName, + ThisHash, Params ); @@ -711,6 +741,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N4), MemberName, + ThisHash, Params ); @@ -735,6 +766,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N5), MemberName, + ThisHash, Params ); @@ -759,6 +791,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N6), MemberName, + ThisHash, Params ); @@ -783,6 +816,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N7), MemberName, + ThisHash, Params ); @@ -807,6 +841,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N8), MemberName, + ThisHash, Params ); @@ -831,6 +866,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N9), MemberName, + ThisHash, Params ); @@ -855,6 +891,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->A), MemberName, + ThisHash, Params ); @@ -879,6 +916,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->B), MemberName, + ThisHash, Params ); @@ -903,6 +941,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->C), MemberName, + ThisHash, Params ); @@ -927,6 +966,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->D), MemberName, + ThisHash, Params ); @@ -951,6 +991,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->E), MemberName, + ThisHash, Params ); @@ -975,6 +1016,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->F), MemberName, + ThisHash, Params ); @@ -999,6 +1041,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->G), MemberName, + ThisHash, Params ); @@ -1023,6 +1066,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->H), MemberName, + ThisHash, Params ); @@ -1047,6 +1091,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->I), MemberName, + ThisHash, Params ); @@ -1071,6 +1116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->J), MemberName, + ThisHash, Params ); @@ -1095,6 +1141,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->K), MemberName, + ThisHash, Params ); @@ -1119,6 +1166,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->L), MemberName, + ThisHash, Params ); @@ -1143,6 +1191,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->M), MemberName, + ThisHash, Params ); @@ -1167,6 +1216,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->N), MemberName, + ThisHash, Params ); @@ -1191,6 +1241,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->O), MemberName, + ThisHash, Params ); @@ -1215,6 +1266,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->P), MemberName, + ThisHash, Params ); @@ -1239,6 +1291,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Q), MemberName, + ThisHash, Params ); @@ -1263,6 +1316,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->R), MemberName, + ThisHash, Params ); @@ -1287,6 +1341,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->S), MemberName, + ThisHash, Params ); @@ -1311,6 +1366,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->T), MemberName, + ThisHash, Params ); @@ -1335,6 +1391,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->U), MemberName, + ThisHash, Params ); @@ -1359,6 +1416,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->V), MemberName, + ThisHash, Params ); @@ -1383,6 +1441,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->W), MemberName, + ThisHash, Params ); @@ -1407,6 +1466,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->X), MemberName, + ThisHash, Params ); @@ -1431,6 +1491,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Y), MemberName, + ThisHash, Params ); @@ -1455,6 +1516,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->Z), MemberName, + ThisHash, Params ); @@ -1479,6 +1541,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->RMB), MemberName, + ThisHash, Params ); @@ -1503,6 +1566,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->LMB), MemberName, + ThisHash, Params ); @@ -1527,6 +1591,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(input_event*, &Element->MMB), MemberName, + ThisHash, Params ); @@ -1551,6 +1616,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->MouseWheelDelta), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 7de77796b..674d48407 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:261:0 +// src/engine/editor.cpp:265:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1548FB6C); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle input_event", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle input_event", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -38,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name Window, Cast(b8*, &Element->Clicked), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -60,6 +63,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name Window, Cast(b8*, &Element->Pressed), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index e55f30c4f..635b774e1 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:333:0 +// src/engine/editor.cpp:337:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x14339D6D); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle keyframe", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle keyframe", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->tEnd), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Value), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 6de126b36..6c4f37dac 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:414:0 +// src/engine/editor.cpp:420:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1F7B17CD); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle layered_brush", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle layered_brush", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->LayerCount), MemberName, + ThisHash, Params ); @@ -61,13 +64,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na cs MemberName = CSz("Layers"); - if (ToggleButton(Ui, CSz("v Layers[16]"), CSz("> Layers[16]"), UiId(Window, "toggle layered_brush brush_layer Layers", Element->Layers), Params )) + if (ToggleButton(Ui, + CSz("v Layers[16]"), + CSz("> Layers[16]"), + UiId(Window, "toggle layered_brush brush_layer Layers", Element->Layers, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 16) { - DoEditorUi(Ui, Window, Element->Layers+ArrayIndex, FSz("Layers[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->Layers+ArrayIndex, + FSz("Layers[%d]", ArrayIndex), + ThisHash, + Params); } @@ -92,6 +104,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->AffectExisting), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 9acb051c4..65f7e34c7 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:578:0 +// src/engine/editor.cpp:584:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x346D8421); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle level_editor", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle level_editor", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->Memory), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(selection_region*, &Element->Selection), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(asset_thumbnail_block_array*, &Element->AssetThumbnails), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->NextLayerIndex), MemberName, + ThisHash, Params ); @@ -136,6 +142,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(world_edit_layer_block_array*, &Element->Layers), MemberName, + ThisHash, Params ); @@ -160,6 +167,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(world_edit_layer_block_array_index*, &Element->SelectedLayerIndex), MemberName, + ThisHash, Params ); @@ -184,6 +192,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(world_edit_block_array*, &Element->Edits), MemberName, + ThisHash, Params ); @@ -208,6 +217,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(world_edit_block_array_index_block_array*, &Element->SelectedEditIndices), MemberName, + ThisHash, Params ); @@ -232,6 +242,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(world_edit*, Element->HotEdit), MemberName, + ThisHash, Params ); @@ -256,6 +267,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(world_edit_block_array_index*, &Element->HotEditIndex), MemberName, + ThisHash, Params ); @@ -280,6 +292,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(world_edit_brush_hashtable*, &Element->LoadedBrushes), MemberName, + ThisHash, Params ); @@ -304,6 +317,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(world_edit_brush*, Element->CurrentBrush), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 5ae2d1368..3192e02da 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:545:0 +// src/engine/editor.cpp:551:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1933080D); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle lighting_render_group", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle lighting_render_group", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->Program), MemberName, + ThisHash, Params ); @@ -60,13 +63,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen cs MemberName = CSz("Uniforms"); - if (ToggleButton(Ui, CSz("v Uniforms[26]"), CSz("> Uniforms[26]"), UiId(Window, "toggle lighting_render_group shader_uniform Uniforms", Element->Uniforms), Params )) + if (ToggleButton(Ui, + CSz("v Uniforms[26]"), + CSz("> Uniforms[26]"), + UiId(Window, "toggle lighting_render_group shader_uniform Uniforms", Element->Uniforms, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 26) { - DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->Uniforms+ArrayIndex, + FSz("Uniforms[%d]", ArrayIndex), + ThisHash, + Params); } @@ -91,6 +103,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(framebuffer*, &Element->FBO), MemberName, + ThisHash, Params ); @@ -115,6 +128,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(texture*, Element->gColor), MemberName, + ThisHash, Params ); @@ -139,6 +153,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(texture*, Element->gNormal), MemberName, + ThisHash, Params ); @@ -163,6 +178,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(texture*, Element->gDepth), MemberName, + ThisHash, Params ); @@ -187,6 +203,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(texture*, Element->shadowMap), MemberName, + ThisHash, Params ); @@ -211,6 +228,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(texture*, Element->Ssao), MemberName, + ThisHash, Params ); @@ -235,6 +253,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(texture*, Element->TransparencyAccumTex), MemberName, + ThisHash, Params ); @@ -259,6 +278,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(texture*, Element->TransparencyCountTex), MemberName, + ThisHash, Params ); @@ -282,6 +302,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen Window, Cast(b8*, Element->BravoilMyersOIT), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -304,6 +325,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen Window, Cast(b8*, Element->BravoilMcGuireOIT), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -327,6 +349,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(m4*, Element->InverseViewMatrix), MemberName, + ThisHash, Params ); @@ -351,6 +374,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(m4*, Element->InverseProjectionMatrix), MemberName, + ThisHash, Params ); @@ -375,6 +399,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(m4*, Element->ShadowMVP), MemberName, + ThisHash, Params ); @@ -399,6 +424,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(texture*, Element->LightColors), MemberName, + ThisHash, Params ); @@ -423,6 +449,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(texture*, Element->LightPositions), MemberName, + ThisHash, Params ); @@ -447,6 +474,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(f32*, Element->LightIndexToUV), MemberName, + ThisHash, Params ); @@ -472,6 +500,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(s32*, Element->LightCount), MemberName, + ThisHash, Params ); @@ -497,6 +526,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(camera*, Element->Camera), MemberName, + ThisHash, Params ); @@ -521,6 +551,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(v3*, Element->SunPosition), MemberName, + ThisHash, Params ); @@ -545,6 +576,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(v3*, Element->SunColor), MemberName, + ThisHash, Params ); @@ -569,6 +601,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(v3*, Element->FogColor), MemberName, + ThisHash, Params ); @@ -593,6 +626,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(f32*, Element->FogPower), MemberName, + ThisHash, Params ); @@ -617,6 +651,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen Window, Cast(b8*, Element->UseSsao), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -639,6 +674,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen Window, Cast(b8*, Element->UseShadowMapping), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -661,6 +697,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen Window, Cast(b8*, Element->UseLightingBloom), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -684,6 +721,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(v2*, Element->ApplicationResolution), MemberName, + ThisHash, Params ); @@ -708,6 +746,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(v2*, Element->ShadowMapResolution), MemberName, + ThisHash, Params ); @@ -732,6 +771,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->LuminanceTex), MemberName, + ThisHash, Params ); @@ -756,6 +796,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen // Cast to remove const/volatile keywords if they're there Cast(game_lights*, &Element->Lights), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 3fc65ea84..5e2f23c26 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:312:0 +// src/engine/editor.cpp:316:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x4B67FED); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle lighting_settings", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle lighting_settings", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->AutoDayNightCycle), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->tDaySpeed), MemberName, + ThisHash, Params , 1.f, 30.f ); @@ -89,6 +93,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->tDay), MemberName, + ThisHash, Params , -PI32, PI32 ); @@ -125,6 +130,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->DawnIntensity), MemberName, + ThisHash, Params , 0.f, 3.f ); @@ -145,7 +151,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c cs MemberName = CSz("DawnHSV"); - PushColumn(Ui, CSz("DawnColor")); DoColorPickerToggle(Ui, Window, &Element->DawnHSV, False); + PushColumn(Ui, CSz("DawnColor")); DoColorPickerToggle(Ui, Window, &Element->DawnHSV, False, ThisHash); @@ -165,6 +171,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->SunIntensity), MemberName, + ThisHash, Params , 0.f, 3.f ); @@ -185,7 +192,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c cs MemberName = CSz("SunHSV"); - PushColumn(Ui, CSz("SunColor")); DoColorPickerToggle(Ui, Window, &Element->SunHSV, False); + PushColumn(Ui, CSz("SunColor")); DoColorPickerToggle(Ui, Window, &Element->SunHSV, False, ThisHash); @@ -205,6 +212,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->DuskIntensity), MemberName, + ThisHash, Params , 0.f, 3.f ); @@ -230,6 +238,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->DuskColor), MemberName, + ThisHash, Params ); @@ -249,7 +258,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c cs MemberName = CSz("DuskHSV"); - PushColumn(Ui, CSz("DuskColor")); DoColorPickerToggle(Ui, Window, &Element->DuskHSV, False); + PushColumn(Ui, CSz("DuskColor")); DoColorPickerToggle(Ui, Window, &Element->DuskHSV, False, ThisHash); @@ -269,6 +278,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->MoonIntensity), MemberName, + ThisHash, Params , 0.f, 3.f ); @@ -289,7 +299,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c cs MemberName = CSz("MoonHSV"); - PushColumn(Ui, CSz("MoonColor")); DoColorPickerToggle(Ui, Window, &Element->MoonHSV, False); + PushColumn(Ui, CSz("MoonColor")); DoColorPickerToggle(Ui, Window, &Element->MoonHSV, False, ThisHash); @@ -309,6 +319,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->CurrentSunColor), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 380e2f404..2ddc0a40c 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:459:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x229F06E8); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle lod_element_buffer", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle lod_element_buffer", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->MeshMask), MemberName, + ThisHash, Params ); @@ -61,13 +64,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs MemberName = CSz("GpuBufferHandles"); - if (ToggleButton(Ui, CSz("v GpuBufferHandles[MeshIndex_Count]"), CSz("> GpuBufferHandles[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer gpu_element_buffer_handles GpuBufferHandles", Element->GpuBufferHandles), Params )) + if (ToggleButton(Ui, + CSz("v GpuBufferHandles[MeshIndex_Count]"), + CSz("> GpuBufferHandles[MeshIndex_Count]"), + UiId(Window, "toggle lod_element_buffer gpu_element_buffer_handles GpuBufferHandles", Element->GpuBufferHandles, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, MeshIndex_Count) { - DoEditorUi(Ui, Window, Element->GpuBufferHandles+ArrayIndex, FSz("GpuBufferHandles[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->GpuBufferHandles+ArrayIndex, + FSz("GpuBufferHandles[%d]", ArrayIndex), + ThisHash, + Params); } @@ -89,13 +101,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs MemberName = CSz("E"); - if (ToggleButton(Ui, CSz("v E[MeshIndex_Count]"), CSz("> E[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer geo_u3d_ptr E", Element->E), Params )) + if (ToggleButton(Ui, + CSz("v E[MeshIndex_Count]"), + CSz("> E[MeshIndex_Count]"), + UiId(Window, "toggle lod_element_buffer geo_u3d_ptr E", Element->E, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, MeshIndex_Count) { - DoEditorUi(Ui, Window, Element->E+ArrayIndex, FSz("E[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->E+ArrayIndex, + FSz("E[%d]", ArrayIndex), + ThisHash, + Params); } @@ -117,13 +138,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs MemberName = CSz("Locks"); - if (ToggleButton(Ui, CSz("v Locks[MeshIndex_Count]"), CSz("> Locks[MeshIndex_Count]"), UiId(Window, "toggle lod_element_buffer bonsai_futex Locks", Element->Locks), Params )) + if (ToggleButton(Ui, + CSz("v Locks[MeshIndex_Count]"), + CSz("> Locks[MeshIndex_Count]"), + UiId(Window, "toggle lod_element_buffer bonsai_futex Locks", Element->Locks, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, MeshIndex_Count) { - DoEditorUi(Ui, Window, Element->Locks+ArrayIndex, FSz("Locks[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->Locks+ArrayIndex, + FSz("Locks[%d]", ArrayIndex), + ThisHash, + Params); } diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index 84be1409c..7999abe1c 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,8 +1,10 @@ -// src/engine/editor.h:708:0 +// src/engine/editor.h:732:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x378E6FBD); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle maybe_ray", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle maybe_ray", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(maybe_tag*, &Element->Tag), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(ray*, &Element->Ray), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 45cd95e71..5595a8cb9 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:462:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x4BAE73F); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle model", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle model", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(vox_data*, &Element->Vox), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(lod_element_buffer*, &Element->Meshes), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(gpu_mapped_element_buffer*, &Element->Mesh), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(untextured_3d_geometry_buffer*, &Element->TransparentMesh), MemberName, + ThisHash, Params ); @@ -135,6 +141,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(animation*, &Element->Animation), MemberName, + ThisHash, Params ); @@ -159,6 +166,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Dim), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index 2fceb9c15..a010bca8b 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:154:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x11D457CF); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle noise_layer", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle noise_layer", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(ui_noise_type*, &Element->Type), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(white_noise_params*, &Element->White), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(perlin_noise_params*, &Element->Perlin), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(voronoi_noise_params*, &Element->Voronoi), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 8fbc86c17..cd1835952 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:490:0 +// src/engine/editor.cpp:496:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1C6C60D9); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle octree_node", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle octree_node", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(chunk_flag*, &Element->Flags), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(octree_node_type*, &Element->Type), MemberName, + ThisHash, Params ); @@ -86,6 +90,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name Window, Cast(b8*, &Element->Dirty), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -109,6 +114,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->WorldP), MemberName, + ThisHash, Params ); @@ -133,6 +139,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Resolution), MemberName, + ThisHash, Params ); @@ -157,6 +164,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(world_chunk*, Element->Chunk), MemberName, + ThisHash, Params ); @@ -178,13 +186,17 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name cs MemberName = CSz("Children"); - if (ToggleButton(Ui, CSz("v Children[8]"), CSz("> Children[8]"), UiId(Window, "toggle octree_node octree_node Children", Element->Children), Params )) + if (ToggleButton(Ui, + CSz("v Children[8]"), + CSz("> Children[8]"), + UiId(Window, "toggle octree_node octree_node Children", Element->Children, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 8) { - if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[ArrayIndex], CSz("Child"), Params);}; + if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[ArrayIndex], CSz("Child"), ThisHash, Params);}; } @@ -209,6 +221,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(octree_node*, Element->Next), MemberName, + ThisHash, Params ); @@ -233,6 +246,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(world_edit_ptr_block_array*, &Element->Edits), MemberName, + ThisHash, Params ); @@ -257,6 +271,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(bonsai_futex*, &Element->Lock), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index a076f4a64..50d63f5cb 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:327:0 +// src/engine/editor.cpp:331:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x3825E333); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle particle", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle particle", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Velocity), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Offset), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(u8*, &Element->Color), MemberName, + ThisHash, Params ); @@ -112,6 +117,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->IsLight), MemberName, + ThisHash, Params ); @@ -137,6 +143,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->RemainingLifespan), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 8cd014376..94bde9c42 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:330:0 +// src/engine/editor.cpp:334:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x137DC8CC); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle particle_system", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle particle_system", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(random_series*, &Element->Entropy), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(particle_spawn_type*, &Element->SpawnType), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Drag), MemberName, + ThisHash, Params ); @@ -112,6 +117,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Lifetime), MemberName, + ThisHash, Params ); @@ -137,6 +143,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->EmissionDelay), MemberName, + ThisHash, Params ); @@ -162,6 +169,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->EmissionLifespan), MemberName, + ThisHash, Params ); @@ -187,6 +195,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ActiveParticles), MemberName, + ThisHash, Params ); @@ -212,6 +221,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->LifespanMod), MemberName, + ThisHash, Params ); @@ -237,6 +247,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ParticleLifespan), MemberName, + ThisHash, Params ); @@ -262,6 +273,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ParticlesPerSecond), MemberName, + ThisHash, Params ); @@ -287,6 +299,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ParticleLightEmission), MemberName, + ThisHash, Params ); @@ -312,6 +325,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ParticleLightEmissionChance), MemberName, + ThisHash, Params ); @@ -337,6 +351,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ParticleStartingTransparency), MemberName, + ThisHash, Params ); @@ -362,6 +377,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ParticleEndingTransparency), MemberName, + ThisHash, Params ); @@ -387,6 +403,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->ParticleStartingDim), MemberName, + ThisHash, Params ); @@ -411,6 +428,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->ParticleEndingDim), MemberName, + ThisHash, Params ); @@ -436,6 +454,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->ParticleTurbMin), MemberName, + ThisHash, Params ); @@ -460,6 +479,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->ParticleTurbMax), MemberName, + ThisHash, Params ); @@ -484,6 +504,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(aabb*, &Element->SpawnRegion), MemberName, + ThisHash, Params ); @@ -508,6 +529,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->SystemMovementCoefficient), MemberName, + ThisHash, Params ); @@ -533,6 +555,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->ElapsedSinceLastEmission), MemberName, + ThisHash, Params ); @@ -555,13 +578,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs cs MemberName = CSz("PackedHSVColors"); - if (ToggleButton(Ui, CSz("v PackedHSVColors[6]"), CSz("> PackedHSVColors[6]"), UiId(Window, "toggle particle_system u16 PackedHSVColors", Element->PackedHSVColors), Params )) + if (ToggleButton(Ui, + CSz("v PackedHSVColors[6]"), + CSz("> PackedHSVColors[6]"), + UiId(Window, "toggle particle_system u16 PackedHSVColors", Element->PackedHSVColors, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 6) { - DoEditorUi(Ui, Window, Element->PackedHSVColors+ArrayIndex, FSz("PackedHSVColors[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->PackedHSVColors+ArrayIndex, + FSz("PackedHSVColors[%d]", ArrayIndex), + ThisHash, + Params); PushNewRow(Ui); } @@ -584,13 +616,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs cs MemberName = CSz("Particles"); - if (ToggleButton(Ui, CSz("v Particles[(4096)]"), CSz("> Particles[(4096)]"), UiId(Window, "toggle particle_system particle Particles", Element->Particles), Params )) + if (ToggleButton(Ui, + CSz("v Particles[(4096)]"), + CSz("> Particles[(4096)]"), + UiId(Window, "toggle particle_system particle Particles", Element->Particles, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, (4096)) { - DoEditorUi(Ui, Window, Element->Particles+ArrayIndex, FSz("Particles[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->Particles+ArrayIndex, + FSz("Particles[%d]", ArrayIndex), + ThisHash, + Params); } diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 3ad35050b..6771cde6d 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:150:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x3926BA4A); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle perlin_noise_params", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle perlin_noise_params", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Period), MemberName, + ThisHash, Params , 0.1f, 20.f ); diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index b2b3be2c4..e627e5744 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:318:0 +// src/engine/editor.cpp:322:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x101A527C); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle physics", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle physics", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Velocity), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Force), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Delta), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Mass), MemberName, + ThisHash, Params ); @@ -136,6 +142,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Speed), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 332a39075..6f7322684 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:363:0 +// src/engine/editor.cpp:369:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x2A9389DB); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle plane", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle plane", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->P), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Normal), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->d), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index 8cb24cc3e..d840254f4 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:267:0 +// src/engine/editor.cpp:271:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x2477D8B8); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle platform", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle platform", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(work_queue*, &Element->LowPriority), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(work_queue*, &Element->HighPriority), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(work_queue*, &Element->RenderQ), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(work_queue*, &Element->WorldUpdateQ), MemberName, + ThisHash, Params ); @@ -135,6 +141,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->HighPriorityWorkerCount), MemberName, + ThisHash, Params ); @@ -160,6 +167,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(bonsai_futex*, &Element->HighPriorityModeFutex), MemberName, + ThisHash, Params ); @@ -184,6 +192,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(bonsai_futex*, &Element->WorkerThreadsSuspendFutex), MemberName, + ThisHash, Params ); @@ -208,6 +217,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(bonsai_futex*, &Element->WorkerThreadsExitFutex), MemberName, + ThisHash, Params ); @@ -232,6 +242,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(v2*, &Element->MouseP), MemberName, + ThisHash, Params ); @@ -256,6 +267,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(v2*, &Element->MouseDP), MemberName, + ThisHash, Params ); @@ -280,6 +292,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->Memory), MemberName, + ThisHash, Params ); @@ -304,6 +317,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->GameTime), MemberName, + ThisHash, Params ); @@ -329,6 +343,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->dt), MemberName, + ThisHash, Params ); @@ -354,6 +369,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(v2*, &Element->ScreenDim), MemberName, + ThisHash, Params ); @@ -378,6 +394,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(input*, &Element->Input), MemberName, + ThisHash, Params ); @@ -402,6 +419,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(server_state*, Element->ServerState), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index 663ddf095..b310ffec8 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:321:0 +// src/engine/editor.cpp:325:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x33A36ED5); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Na b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle random_series", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle random_series", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Na // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->Seed), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index 9a5d79e47..ee2249817 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,8 +1,10 @@ -// src/engine/editor.h:705:0 +// src/engine/editor.h:729:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x291019BF); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle ray", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle ray", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Origin), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_ren // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Dir), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index 27f2aed8e..b68cedfef 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,8 +1,10 @@ -// src/engine/editor.h:693:0 +// src/engine/editor.h:717:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x131D4A18); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle rect3", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle rect3", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Min), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Max), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index 6c3c49573..0211b7f9f 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,8 +1,10 @@ -// src/engine/editor.h:699:0 +// src/engine/editor.h:723:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x2615C8C); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle rect3cp", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle rect3cp", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->Min), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->Max), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 79f706848..e612da817 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,8 +1,10 @@ -// src/engine/editor.h:696:0 +// src/engine/editor.h:720:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0xEC90500); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle rect3i", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle rect3i", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Min), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Max), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index 9b6a78ae2..dc62dce90 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:536:0 +// src/engine/editor.cpp:542:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x83E1CFD); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle render_buffers_2d", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle render_buffers_2d", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->DebugTextureArray), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->TextTextureUniform), MemberName, + ThisHash, Params ); @@ -88,6 +92,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->UiShader), MemberName, + ThisHash, Params ); @@ -112,6 +117,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c // Cast to remove const/volatile keywords if they're there Cast(gpu_mapped_ui_buffer*, &Element->Buf), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index a39674e99..4f5541c43 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:566:0 +// src/engine/editor.cpp:572:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1E3B3011); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle render_debug", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle render_debug", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->BytesSolidGeoLastFrame), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->BytesTransGeoLastFrame), MemberName, + ThisHash, Params ); @@ -89,6 +93,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->VertsDrawnLastFrame), MemberName, + ThisHash, Params ); @@ -114,6 +119,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->DrawCallsLastFrame), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index 4f7d8e089..a4d996608 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:315:0 +// src/engine/editor.cpp:319:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x3A47CBF1); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle render_settings", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle render_settings", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -38,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Window, Cast(b8*, &Element->UseSsao), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -60,6 +63,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Window, Cast(b8*, &Element->UseShadowMapping), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -82,6 +86,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Window, Cast(b8*, &Element->UseLightingBloom), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -104,6 +109,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Window, Cast(b8*, &Element->BravoilMyersOIT), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -126,6 +132,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Window, Cast(b8*, &Element->BravoilMcGuireOIT), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -148,6 +155,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Window, Cast(b8*, &Element->DrawMajorGrid), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -170,6 +178,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Window, Cast(b8*, &Element->DrawMinorGrid), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -193,6 +202,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->MajorGridDim), MemberName, + ThisHash, Params , 0, 32 ); @@ -217,6 +227,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Window, Cast(b8*, &Element->DrawCameraGhost), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -240,6 +251,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->CameraGhostSize), MemberName, + ThisHash, Params , 1, 100 ); @@ -288,6 +300,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs // Cast to remove const/volatile keywords if they're there Cast(tone_mapping_type*, &Element->ToneMappingType), MemberName, + ThisHash, Params ); @@ -312,6 +325,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->GameCameraFOV), MemberName, + ThisHash, Params , 5, 250 ); @@ -337,6 +351,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs // Cast to remove const/volatile keywords if they're there Cast(lighting_settings*, &Element->Lighting), MemberName, + ThisHash, Params ); @@ -361,6 +376,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs // Cast to remove const/volatile keywords if they're there Cast(v2*, &Element->ApplicationResolution), MemberName, + ThisHash, Params ); @@ -385,6 +401,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs // Cast to remove const/volatile keywords if they're there Cast(v2*, &Element->ShadowMapResolution), MemberName, + ThisHash, Params ); @@ -409,6 +426,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs // Cast to remove const/volatile keywords if they're there Cast(v2*, &Element->LuminanceMapResolution), MemberName, + ThisHash, Params ); @@ -433,6 +451,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs // Cast to remove const/volatile keywords if they're there Cast(v2i*, &Element->iApplicationResolution), MemberName, + ThisHash, Params ); @@ -457,6 +476,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs // Cast to remove const/volatile keywords if they're there Cast(v2i*, &Element->iShadowMapResolution), MemberName, + ThisHash, Params ); @@ -481,6 +501,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs // Cast to remove const/volatile keywords if they're there Cast(v2i*, &Element->iLuminanceMapResolution), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 54be55a3c..8dc09be2f 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:539:0 +// src/engine/editor.cpp:545:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1D97D1BB); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle renderer_2d", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle renderer_2d", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(render_buffers_2d*, Element->TextGroup), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(gpu_mapped_ui_buffer*, &Element->SolidQuadGeometryBuffer), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(textured_quad_render_pass*, &Element->TexturedQuadRenderPass), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(gpu_mapped_ui_buffer*, &Element->CustomQuadGeometryBuffer), MemberName, + ThisHash, Params ); @@ -135,6 +141,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->SpriteTextureArray), MemberName, + ThisHash, Params ); @@ -159,6 +166,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->InteractionStackTop), MemberName, + ThisHash, Params ); @@ -184,6 +192,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(v2*, Element->MouseP), MemberName, + ThisHash, Params ); @@ -208,6 +217,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(v2*, Element->MouseDP), MemberName, + ThisHash, Params ); @@ -232,6 +242,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(v2*, Element->ScreenDim), MemberName, + ThisHash, Params ); @@ -256,6 +267,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(input*, Element->Input), MemberName, + ThisHash, Params ); @@ -280,6 +292,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(ui_toggle_hashtable*, &Element->ToggleTable), MemberName, + ThisHash, Params ); @@ -304,6 +317,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(window_layout_hashtable*, &Element->WindowTable), MemberName, + ThisHash, Params ); @@ -325,13 +339,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name cs MemberName = CSz("MinimizedWindowBuffer"); - if (ToggleButton(Ui, CSz("v MinimizedWindowBuffer[64]"), CSz("> MinimizedWindowBuffer[64]"), UiId(Window, "toggle renderer_2d window_layout MinimizedWindowBuffer", Element->MinimizedWindowBuffer), Params )) + if (ToggleButton(Ui, + CSz("v MinimizedWindowBuffer[64]"), + CSz("> MinimizedWindowBuffer[64]"), + UiId(Window, "toggle renderer_2d window_layout MinimizedWindowBuffer", Element->MinimizedWindowBuffer, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 64) { - DoEditorUi(Ui, Window, Element->MinimizedWindowBuffer+ArrayIndex, FSz("MinimizedWindowBuffer[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->MinimizedWindowBuffer+ArrayIndex, + FSz("MinimizedWindowBuffer[%d]", ArrayIndex), + ThisHash, + Params); } @@ -356,6 +379,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(window_layout*, Element->HighestWindow), MemberName, + ThisHash, Params ); @@ -380,6 +404,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(interactable*, &Element->Hover), MemberName, + ThisHash, Params ); @@ -404,6 +429,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(interactable*, &Element->Clicked), MemberName, + ThisHash, Params ); @@ -428,6 +454,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(interactable*, &Element->Pressed), MemberName, + ThisHash, Params ); @@ -451,6 +478,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name Window, Cast(b8*, &Element->RequestedForceCapture), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -474,6 +502,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(text_box_edit_state*, &Element->TextEdit), MemberName, + ThisHash, Params ); @@ -498,6 +527,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(ui_render_command_buffer*, Element->CommandBuffer), MemberName, + ThisHash, Params ); @@ -522,6 +552,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, &Element->RenderCommandArena), MemberName, + ThisHash, Params ); @@ -546,6 +577,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, &Element->UiToggleArena), MemberName, + ThisHash, Params ); @@ -570,6 +602,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, &Element->WindowTableArena), MemberName, + ThisHash, Params ); @@ -591,13 +624,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name cs MemberName = CSz("DebugColors"); - if (ToggleButton(Ui, CSz("v DebugColors[128]"), CSz("> DebugColors[128]"), UiId(Window, "toggle renderer_2d v3 DebugColors", Element->DebugColors), Params )) + if (ToggleButton(Ui, + CSz("v DebugColors[128]"), + CSz("> DebugColors[128]"), + UiId(Window, "toggle renderer_2d v3 DebugColors", Element->DebugColors, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 128) { - DoEditorUi(Ui, Window, Element->DebugColors+ArrayIndex, FSz("DebugColors[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->DebugColors+ArrayIndex, + FSz("DebugColors[%d]", ArrayIndex), + ThisHash, + Params); } @@ -622,6 +664,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(v3_cursor*, Element->ColorPalette), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 5a9547956..70492429c 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:247:0 +// src/engine/editor.cpp:251:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1813CD99); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle shader", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle shader", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ID), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(shader_uniform_buffer*, &Element->Uniforms), MemberName, + ThisHash, Params ); @@ -88,6 +92,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(cs*, &Element->VertexSourceFilename), MemberName, + ThisHash, Params ); @@ -113,6 +118,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(cs*, &Element->FragSourceFilename), MemberName, + ThisHash, Params ); @@ -138,6 +144,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(s64*, &Element->VertexTimeModifiedWhenLoaded), MemberName, + ThisHash, Params ); @@ -163,6 +170,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ // Cast to remove const/volatile keywords if they're there Cast(s64*, &Element->FragmentTimeModifiedWhenLoaded), MemberName, + ThisHash, Params ); @@ -187,6 +195,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, ui_ Window, Cast(b8*, &Element->HotReloaded), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index f44a43e00..c7b9a8f06 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:175:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x11CD2DF2); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle shape_layer", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle shape_layer", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(shape_type*, &Element->Type), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(world_update_op_shape_params_rect*, &Element->Rect), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(world_update_op_shape_params_sphere*, &Element->Sphere), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(world_update_op_shape_params_sphere*, &Element->Line), MemberName, + ThisHash, Params ); @@ -135,6 +141,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(world_update_op_shape_params_cylinder*, &Element->Cylinder), MemberName, + ThisHash, Params ); @@ -159,6 +166,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(world_update_op_shape_params_plane*, &Element->Plane), MemberName, + ThisHash, Params ); @@ -183,6 +191,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(world_update_op_shape_params_torus*, &Element->Torus), MemberName, + ThisHash, Params ); @@ -207,6 +216,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(shape_layer_advanced_params*, &Element->Advanced), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h b/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h index 7d2a5566c..01658d91f 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:173:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer_advanced_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer_advanced_params *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x31853A01); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer_advanced_params * b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle shape_layer_advanced_params", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle shape_layer_advanced_params", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer_advanced_params * // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Rounding), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer_advanced_params * // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Stretch), MemberName, + ThisHash, Params ); @@ -88,6 +92,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer_advanced_params * // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Repeat), MemberName, + ThisHash, Params ); @@ -112,6 +117,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer_advanced_params * // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Axis), MemberName, + ThisHash, Params , -1.f, 1.f ); diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 17041ad6c..c910b61eb 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:554:0 +// src/engine/editor.cpp:560:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x231A7121); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_decoration_render_context", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_decoration_render_context", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->Program), MemberName, + ThisHash, Params ); @@ -60,13 +63,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con cs MemberName = CSz("Uniforms"); - if (ToggleButton(Ui, CSz("v Uniforms[4]"), CSz("> Uniforms[4]"), UiId(Window, "toggle terrain_decoration_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + if (ToggleButton(Ui, + CSz("v Uniforms[4]"), + CSz("> Uniforms[4]"), + UiId(Window, "toggle terrain_decoration_render_context shader_uniform Uniforms", Element->Uniforms, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 4) { - DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->Uniforms+ArrayIndex, + FSz("Uniforms[%d]", ArrayIndex), + ThisHash, + Params); } @@ -91,6 +103,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con // Cast to remove const/volatile keywords if they're there Cast(texture*, Element->DestTex), MemberName, + ThisHash, Params ); @@ -115,6 +128,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con // Cast to remove const/volatile keywords if they're there Cast(framebuffer*, Element->DestFBO), MemberName, + ThisHash, Params ); @@ -139,6 +153,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con // Cast to remove const/volatile keywords if they're there Cast(texture*, Element->DerivsTex), MemberName, + ThisHash, Params ); @@ -163,6 +178,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->ChunkDim), MemberName, + ThisHash, Params ); @@ -187,6 +203,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->WorldspaceChunkBasis), MemberName, + ThisHash, Params ); @@ -211,6 +228,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->ChunkResolution), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 63b38a54a..5b4d14097 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:557:0 +// src/engine/editor.cpp:563:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1AC2947); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_finalize_render_context", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_finalize_render_context", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->Program), MemberName, + ThisHash, Params ); @@ -60,13 +63,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte cs MemberName = CSz("Uniforms"); - if (ToggleButton(Ui, CSz("v Uniforms[1]"), CSz("> Uniforms[1]"), UiId(Window, "toggle terrain_finalize_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + if (ToggleButton(Ui, + CSz("v Uniforms[1]"), + CSz("> Uniforms[1]"), + UiId(Window, "toggle terrain_finalize_render_context shader_uniform Uniforms", Element->Uniforms, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 1) { - DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->Uniforms+ArrayIndex, + FSz("Uniforms[%d]", ArrayIndex), + ThisHash, + Params); } @@ -91,6 +103,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->DestTex), MemberName, + ThisHash, Params ); @@ -115,6 +128,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte // Cast to remove const/volatile keywords if they're there Cast(framebuffer*, &Element->FBO), MemberName, + ThisHash, Params ); @@ -139,6 +153,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Ignored), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index ca21fa8bc..0420b8da6 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:551:0 +// src/engine/editor.cpp:557:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1818B763); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_shaping_render_context", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle terrain_shaping_render_context", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->Program), MemberName, + ThisHash, Params ); @@ -60,13 +63,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex cs MemberName = CSz("Uniforms"); - if (ToggleButton(Ui, CSz("v Uniforms[3]"), CSz("> Uniforms[3]"), UiId(Window, "toggle terrain_shaping_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + if (ToggleButton(Ui, + CSz("v Uniforms[3]"), + CSz("> Uniforms[3]"), + UiId(Window, "toggle terrain_shaping_render_context shader_uniform Uniforms", Element->Uniforms, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 3) { - DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->Uniforms+ArrayIndex, + FSz("Uniforms[%d]", ArrayIndex), + ThisHash, + Params); } @@ -91,6 +103,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex // Cast to remove const/volatile keywords if they're there Cast(texture*, &Element->DestTex), MemberName, + ThisHash, Params ); @@ -115,6 +128,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex // Cast to remove const/volatile keywords if they're there Cast(framebuffer*, &Element->DestFBO), MemberName, + ThisHash, Params ); @@ -139,6 +153,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->ChunkDim), MemberName, + ThisHash, Params ); @@ -163,6 +178,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->WorldspaceChunkBasis), MemberName, + ThisHash, Params ); @@ -187,6 +203,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->ChunkResolution), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 958489579..6d6bdef92 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:417:0 +// src/engine/editor.cpp:423:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x2083C45D); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_brush", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_brush", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -35,7 +37,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs cs MemberName = CSz("NameBuf"); auto Value = CS(Element->NameBuf); - DoEditorUi(Ui, Window, &Value, MemberName, Params); + DoEditorUi(Ui, Window, &Value, MemberName, ThisHash, Params); @@ -54,6 +56,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs // Cast to remove const/volatile keywords if they're there Cast(world_edit_blend_mode*, &Element->Mode), MemberName, + ThisHash, Params ); @@ -78,6 +81,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs // Cast to remove const/volatile keywords if they're there Cast(world_edit_blend_mode_modifier*, &Element->Modifier), MemberName, + ThisHash, Params ); @@ -102,6 +106,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs // Cast to remove const/volatile keywords if they're there Cast(layered_brush*, &Element->Layered), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 8e7c371f7..4ca15e3e5 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:560:0 +// src/engine/editor.cpp:566:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x21E7B9F7); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_render_context", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_render_context", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->Program), MemberName, + ThisHash, Params ); @@ -60,13 +63,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El cs MemberName = CSz("Uniforms"); - if (ToggleButton(Ui, CSz("v Uniforms[4]"), CSz("> Uniforms[4]"), UiId(Window, "toggle world_edit_render_context shader_uniform Uniforms", Element->Uniforms), Params )) + if (ToggleButton(Ui, + CSz("v Uniforms[4]"), + CSz("> Uniforms[4]"), + UiId(Window, "toggle world_edit_render_context shader_uniform Uniforms", Element->Uniforms, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 4) { - DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->Uniforms+ArrayIndex, + FSz("Uniforms[%d]", ArrayIndex), + ThisHash, + Params); } @@ -88,13 +100,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El cs MemberName = CSz("PingPongFBOs"); - if (ToggleButton(Ui, CSz("v PingPongFBOs[3]"), CSz("> PingPongFBOs[3]"), UiId(Window, "toggle world_edit_render_context framebuffer PingPongFBOs", Element->PingPongFBOs), Params )) + if (ToggleButton(Ui, + CSz("v PingPongFBOs[3]"), + CSz("> PingPongFBOs[3]"), + UiId(Window, "toggle world_edit_render_context framebuffer PingPongFBOs", Element->PingPongFBOs, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 3) { - DoEditorUi(Ui, Window, Element->PingPongFBOs+ArrayIndex, FSz("PingPongFBOs[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->PingPongFBOs+ArrayIndex, + FSz("PingPongFBOs[%d]", ArrayIndex), + ThisHash, + Params); } @@ -116,13 +137,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El cs MemberName = CSz("PingPongTextures"); - if (ToggleButton(Ui, CSz("v PingPongTextures[3]"), CSz("> PingPongTextures[3]"), UiId(Window, "toggle world_edit_render_context texture PingPongTextures", Element->PingPongTextures), Params )) + if (ToggleButton(Ui, + CSz("v PingPongTextures[3]"), + CSz("> PingPongTextures[3]"), + UiId(Window, "toggle world_edit_render_context texture PingPongTextures", Element->PingPongTextures, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 3) { - DoEditorUi(Ui, Window, Element->PingPongTextures+ArrayIndex, FSz("PingPongTextures[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->PingPongTextures+ArrayIndex, + FSz("PingPongTextures[%d]", ArrayIndex), + ThisHash, + Params); } @@ -147,6 +177,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El // Cast to remove const/volatile keywords if they're there Cast(v3*, Element->ChunkDim), MemberName, + ThisHash, Params ); @@ -171,6 +202,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El // Cast to remove const/volatile keywords if they're there Cast(v3*, Element->WorldspaceChunkBasis), MemberName, + ThisHash, Params ); @@ -195,6 +227,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El // Cast to remove const/volatile keywords if they're there Cast(v3*, Element->ChunkResolution), MemberName, + ThisHash, Params ); @@ -219,6 +252,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->Type), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 281d2a7fd..4cc2758f7 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:372:0 +// src/engine/editor.cpp:378:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1414405E); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle texture", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle texture", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ID), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(v2i*, &Element->Dim), MemberName, + ThisHash, Params ); @@ -88,6 +92,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Slices), MemberName, + ThisHash, Params ); @@ -113,6 +118,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Channels), MemberName, + ThisHash, Params ); @@ -137,6 +143,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui Window, Cast(b8*, &Element->IsDepthTexture), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -160,6 +167,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(texture_storage_format*, &Element->Format), MemberName, + ThisHash, Params ); @@ -184,6 +192,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui // Cast to remove const/volatile keywords if they're there Cast(cs*, &Element->DebugName), MemberName, + ThisHash, Params ); @@ -208,6 +217,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, ui Window, Cast(b8*, &Element->Queued), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index 0e2b08c3f..f87174d95 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:569:0 +// src/engine/editor.cpp:575:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x175317FA); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle ui_debug", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle ui_debug", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->OutlineUiValues), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->OutlineUiButtons), MemberName, + ThisHash, Params ); @@ -89,6 +93,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->OutlineUiTables), MemberName, + ThisHash, Params ); @@ -114,6 +119,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->OutlineUiTableColumns), MemberName, + ThisHash, Params ); @@ -139,6 +145,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DebugBreakOnElementClick), MemberName, + ThisHash, Params ); @@ -164,6 +171,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->DebugBreakUiCommand), MemberName, + ThisHash, Params ); @@ -189,6 +197,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(b8*, &Element->LogClickEvents), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index 61cbe4ae8..dcff3a10e 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:183:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x2A0FB15D); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle ui_id", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle ui_id", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->_Reserved), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->WindowBits), MemberName, + ThisHash, Params ); @@ -89,6 +93,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->InteractionBits), MemberName, + ThisHash, Params ); @@ -114,6 +119,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->ElementBits), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index 4ca992b19..bc4fdafb2 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:186:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x34E9B82B); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle ui_toggle", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle ui_toggle", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(ui_id*, &Element->Id), MemberName, + ThisHash, Params ); @@ -62,6 +65,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, Window, Cast(b8*, &Element->ToggledOn), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index a5eae075d..7ead332b4 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:345:0 +// src/engine/editor.cpp:349:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x7A74DF9); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle untextured_3d_geometry_buffer", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle untextured_3d_geometry_buffer", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer // Cast to remove const/volatile keywords if they're there Cast(data_type*, &Element->Type), MemberName, + ThisHash, Params ); @@ -75,6 +78,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer // Cast to remove const/volatile keywords if they're there Cast(void *, Element->Verts), MemberName, + ThisHash, Params ); @@ -100,6 +104,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer // Cast to remove const/volatile keywords if they're there Cast(void *, Element->Normals), MemberName, + ThisHash, Params ); @@ -125,6 +130,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer // Cast to remove const/volatile keywords if they're there Cast(vertex_material*, Element->Mat), MemberName, + ThisHash, Params ); @@ -149,6 +155,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->End), MemberName, + ThisHash, Params ); @@ -174,6 +181,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->At), MemberName, + ThisHash, Params ); @@ -199,6 +207,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer // Cast to remove const/volatile keywords if they're there Cast(untextured_3d_geometry_buffer*, Element->Parent), MemberName, + ThisHash, Params ); @@ -223,6 +232,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->BufferNeedsToGrow), MemberName, + ThisHash, Params ); @@ -248,6 +258,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer // Cast to remove const/volatile keywords if they're there Cast(u64*, &Element->Timestamp), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h b/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h index aa4f8a09c..821e1ed90 100644 --- a/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h +++ b/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:139:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, v2_static_cursor_16 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, v2_static_cursor_16 *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1498EFCB); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2_static_cursor_16 *Element, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle v2_static_cursor_16", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle v2_static_cursor_16", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -36,13 +38,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2_static_cursor_16 *Element, cs MemberName = CSz("Start"); - if (ToggleButton(Ui, CSz("v Start[16]"), CSz("> Start[16]"), UiId(Window, "toggle v2_static_cursor_16 v2 Start", Element->Start), Params )) + if (ToggleButton(Ui, + CSz("v Start[16]"), + CSz("> Start[16]"), + UiId(Window, "toggle v2_static_cursor_16 v2 Start", Element->Start, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 16) { - DoEditorUi(Ui, Window, Element->Start+ArrayIndex, FSz("Start[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->Start+ArrayIndex, + FSz("Start[%d]", ArrayIndex), + ThisHash, + Params); } @@ -67,6 +78,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2_static_cursor_16 *Element, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->At), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index cd1f11a19..8b2c31af7 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:339:0 +// src/engine/editor.cpp:343:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x25F8008E); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle vertex_material", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle vertex_material", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs // Cast to remove const/volatile keywords if they're there Cast(u16*, &Element->ColorIndex), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs // Cast to remove const/volatile keywords if they're there Cast(u8*, &Element->Transparency), MemberName, + ThisHash, Params ); @@ -89,6 +93,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs // Cast to remove const/volatile keywords if they're there Cast(u8*, &Element->Emission), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index d510532ff..34c57a032 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:152:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x38DB8E3); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle voronoi_noise_params", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle voronoi_noise_params", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Period), MemberName, + ThisHash, Params , 0.1f, 20.f ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Squareness), MemberName, + ThisHash, Params ); @@ -88,6 +92,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->MaskChance), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 708bdafc0..0e5499e06 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:444:0 +// src/engine/editor.cpp:450:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0xD3FBFEF); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle vox_data", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle vox_data", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u // Cast to remove const/volatile keywords if they're there Cast(chunk_data*, Element->ChunkData), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 2953d9dc5..f61da2b1f 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:435:0 +// src/engine/editor.cpp:441:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x4BBC2BC); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle voxel", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle voxel", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(u8*, &Element->Transparency), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(u16*, &Element->Color), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 3fd0c3bfc..71f7d5319 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:438:0 +// src/engine/editor.cpp:444:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x21DD9FD4); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs N b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle voxel_lighting", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle voxel_lighting", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs N // Cast to remove const/volatile keywords if they're there Cast(u8*, &Element->Emission), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index f95e01297..40dad62c3 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:148:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1F5D090); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle white_noise_params", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle white_noise_params", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index 1ebed8f59..e92b993f6 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:258:0 +// src/engine/editor.cpp:262:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x3AF675FC); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle work_queue", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle work_queue", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(bonsai_futex*, &Element->EnqueueFutex), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->EnqueueIndex), MemberName, + ThisHash, Params ); @@ -88,6 +92,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->DequeueIndex), MemberName, + ThisHash, Params ); @@ -113,6 +118,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(work_queue_entry*, Element->Entries), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 243210c9a..220866474 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:255:0 +// src/engine/editor.cpp:259:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x3A80B56C); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle work_queue_entry", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle work_queue_entry", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs // Cast to remove const/volatile keywords if they're there Cast(work_queue_entry_type*, &Element->Type), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index a9c524bc9..6ae061eeb 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:493:0 +// src/engine/editor.cpp:499:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x108363A); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Center), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(visible_region_size*, &Element->VisibleRegionSize), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(octree_node*, &Element->Root), MemberName, + ThisHash, Params ); @@ -111,6 +116,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(memory_arena*, Element->OctreeMemory), MemberName, + ThisHash, Params ); @@ -135,6 +141,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(octree_node_freelist*, &Element->OctreeNodeFreelist), MemberName, + ThisHash, Params ); @@ -159,6 +166,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(octree_node_freelist*, &Element->OctreeNodeDeferFreelist), MemberName, + ThisHash, Params ); @@ -183,6 +191,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->MaxOctreeNodesToQueuePerFrame), MemberName, + ThisHash, Params ); @@ -230,6 +239,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, ui_r // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->FreeChunkCount), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 23246e9c3..effde782e 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:487:0 +// src/engine/editor.cpp:493:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x3331643E); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_chunk", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_chunk", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(world_chunk*, Element->Next), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->Dim), MemberName, + ThisHash, Params ); @@ -87,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->Occupancy), MemberName, + ThisHash, Params ); @@ -112,6 +117,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->xOccupancyBorder), MemberName, + ThisHash, Params ); @@ -137,6 +143,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(u64*, Element->FaceMasks), MemberName, + ThisHash, Params ); @@ -162,6 +169,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(voxel*, Element->Voxels), MemberName, + ThisHash, Params ); @@ -186,6 +194,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(voxel_lighting*, Element->VoxelLighting), MemberName, + ThisHash, Params ); @@ -209,6 +218,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name Window, Cast(b8*, &Element->IsOnFreelist), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -232,6 +242,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(gpu_mapped_element_buffer*, &Element->Mesh), MemberName, + ThisHash, Params ); @@ -256,6 +267,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(voxel_position_cursor*, &Element->StandingSpots), MemberName, + ThisHash, Params ); @@ -280,6 +292,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->DimInChunks), MemberName, + ThisHash, Params ); @@ -304,6 +317,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(v3i*, &Element->WorldP), MemberName, + ThisHash, Params ); @@ -328,6 +342,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(s32*, &Element->FilledCount), MemberName, + ThisHash, Params ); @@ -353,6 +368,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name // Cast to remove const/volatile keywords if they're there Cast(entity_ptr_block_array*, &Element->Entities), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index 08b02b615..55e6c8cc8 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,8 +1,10 @@ -// src/engine/editor.cpp:426:0 +// src/engine/editor.cpp:432:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x24CF6D11); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_block_array_index", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit_block_array_index", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index // Cast to remove const/volatile keywords if they're there Cast(umm*, &Element->Index), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 78d9fc6c7..205379e2e 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:162:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x21B74063); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_cylinder", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_cylinder", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Radius), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ // Cast to remove const/volatile keywords if they're there Cast(r32*, &Element->Height), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h index 9870193d0..4adaccf13 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:164:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_plane *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_plane *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x2BB91B80); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_plane", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_plane", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ // Cast to remove const/volatile keywords if they're there Cast(shape_axis*, &Element->Orientation), MemberName, + ThisHash, Params ); @@ -63,6 +66,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->Thickness), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index f8f20fef3..66582f1a2 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:158:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1D0F48B7); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_rect", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_rect", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Dim), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 053e7bd1a..0f533dee4 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:160:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0xD209A19); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_sphere", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_sphere", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -50,6 +52,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->Radius), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h index 9541eb48a..3e79c767b 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h @@ -1,8 +1,10 @@ // src/engine/editor.cpp:166:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_torus *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_torus *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x39AD558C); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -11,7 +13,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_torus", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_update_op_shape_params_torus", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -39,6 +41,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->MajorRadius), MemberName, + ThisHash, Params ); @@ -64,6 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ // Cast to remove const/volatile keywords if they're there Cast(f32*, &Element->MinorRadius), MemberName, + ThisHash, Params ); diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 23a3275f9..39a46066a 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,16 +1,18 @@ -// src/engine/editor.cpp:484:0 +// src/engine/editor.cpp:490:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x10C521DD); + if (Container) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container, ThisHash), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) { PushNewRow(Ui); IterateOver(Container, Element, ElementIndex) { - DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi(Ui, Window, Element, CS(ElementIndex), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); } } diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index 08cf85ac8..d0fde10c7 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,16 +1,18 @@ -// src/engine/editor.cpp:459:0 +// src/engine/editor.cpp:465:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x25099996); + if (Container) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container, ThisHash), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) { PushNewRow(Ui); IterateOver(Container, Element, ElementIndex) { - DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi(Ui, Window, Element, CS(ElementIndex), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); } } diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index 7ecfbcb00..d99f0c205 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,16 +1,18 @@ -// src/engine/editor.cpp:250:0 +// src/engine/editor.cpp:254:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x11F70127); + if (Container) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container, ThisHash), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) { PushNewRow(Ui); IterateOver(Container, Element, ElementIndex) { - DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi(Ui, Window, Element, CS(ElementIndex), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); } } diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 372f11662..9f98fac29 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,16 +1,18 @@ -// src/engine/editor.cpp:244:0 +// src/engine/editor.cpp:248:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1E4DB918); + if (Container) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container, ThisHash), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) { PushNewRow(Ui); IterateOver(Container, Element, ElementIndex) { - DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi(Ui, Window, Element, CS(ElementIndex), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); } } diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 4ae257035..1ffdb1bc7 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,16 +1,18 @@ // src/engine/editor.cpp:195:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x11C9E45C); + if (Container) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container, ThisHash), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) { PushNewRow(Ui); IterateOver(Container, Element, ElementIndex) { - DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi(Ui, Window, Element, CS(ElementIndex), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); } } diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index d5aca1a1a..bb1d1445f 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,16 +1,18 @@ // src/engine/editor.cpp:180:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x24260F23); + if (Container) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container, ThisHash), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) { PushNewRow(Ui); IterateOver(Container, Element, ElementIndex) { - DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi(Ui, Window, Element, CS(ElementIndex), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); } } diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index b2315c35e..9c33b624c 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,16 +1,18 @@ -// src/engine/editor.cpp:429:0 +// src/engine/editor.cpp:435:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1E05D30D); + if (Container) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container, ThisHash), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) { PushNewRow(Ui); IterateOver(Container, Element, ElementIndex) { - DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi(Ui, Window, Element, CS(ElementIndex), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); } } diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index e41b4412c..048194513 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,17 +1,19 @@ -// src/engine/editor.cpp:505:0 +// src/engine/editor.cpp:511:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x37186BAC); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle asset_type", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Undefined"), UiId(Window, "enum AssetType_Undefined", Element), Params)) + if (Button(Ui, CSz("Undefined"), UiId(Window, "enum AssetType_Undefined", Element, ThisHash), Params)) { *Element = AssetType_Undefined; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Models"), UiId(Window, "enum AssetType_Models", Element), Params)) + if (Button(Ui, CSz("Models"), UiId(Window, "enum AssetType_Models", Element, ThisHash), Params)) { *Element = AssetType_Models; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("WorldChunk"), UiId(Window, "enum AssetType_WorldChunk", Element), Params)) + if (Button(Ui, CSz("WorldChunk"), UiId(Window, "enum AssetType_WorldChunk", Element, ThisHash), Params)) { *Element = AssetType_WorldChunk; diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 087fa5a18..ffbcd83c9 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,17 +1,19 @@ -// src/engine/editor.cpp:432:0 +// src/engine/editor.cpp:438:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x516E95E); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle chunk_flag", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Uninitialized"), UiId(Window, "enum Chunk_Uninitialized", Element), Params)) + if (Button(Ui, CSz("Uninitialized"), UiId(Window, "enum Chunk_Uninitialized", Element, ThisHash), Params)) { if (Chunk_Uninitialized == chunk_flag(0)) { @@ -34,7 +36,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Queued"), UiId(Window, "enum Chunk_Queued", Element), Params)) + if (Button(Ui, CSz("Queued"), UiId(Window, "enum Chunk_Queued", Element, ThisHash), Params)) { if (Chunk_Queued == chunk_flag(0)) { @@ -57,7 +59,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("VoxelsInitialized"), UiId(Window, "enum Chunk_VoxelsInitialized", Element), Params)) + if (Button(Ui, CSz("VoxelsInitialized"), UiId(Window, "enum Chunk_VoxelsInitialized", Element, ThisHash), Params)) { if (Chunk_VoxelsInitialized == chunk_flag(0)) { @@ -80,7 +82,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Garbage"), UiId(Window, "enum Chunk_Garbage", Element), Params)) + if (Button(Ui, CSz("Garbage"), UiId(Window, "enum Chunk_Garbage", Element, ThisHash), Params)) { if (Chunk_Garbage == chunk_flag(0)) { @@ -103,7 +105,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Deallocate"), UiId(Window, "enum Chunk_Deallocate", Element), Params)) + if (Button(Ui, CSz("Deallocate"), UiId(Window, "enum Chunk_Deallocate", Element, ThisHash), Params)) { if (Chunk_Deallocate == chunk_flag(0)) { @@ -126,7 +128,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Freelist"), UiId(Window, "enum Chunk_Freelist", Element), Params)) + if (Button(Ui, CSz("Freelist"), UiId(Window, "enum Chunk_Freelist", Element, ThisHash), Params)) { if (Chunk_Freelist == chunk_flag(0)) { diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 0d805e5ff..7cf07d521 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,17 +1,19 @@ -// src/engine/editor.h:684:0 +// src/engine/editor.h:708:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x3B8062A8); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle data_type", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Undefinded"), UiId(Window, "enum DataType_Undefinded", Element), Params)) + if (Button(Ui, CSz("Undefinded"), UiId(Window, "enum DataType_Undefinded", Element, ThisHash), Params)) { *Element = DataType_Undefinded; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("v3"), UiId(Window, "enum DataType_v3", Element), Params)) + if (Button(Ui, CSz("v3"), UiId(Window, "enum DataType_v3", Element, ThisHash), Params)) { *Element = DataType_v3; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("u8"), UiId(Window, "enum DataType_v3_u8", Element), Params)) + if (Button(Ui, CSz("u8"), UiId(Window, "enum DataType_v3_u8", Element, ThisHash), Params)) { *Element = DataType_v3_u8; diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 48d739d51..e361ce9e7 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,17 +1,19 @@ -// src/engine/editor.cpp:575:0 +// src/engine/editor.cpp:581:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x2D5EDA); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle engine_debug_view_mode", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Level"), UiId(Window, "enum EngineDebugViewMode_Level", Element), Params)) + if (Button(Ui, CSz("Level"), UiId(Window, "enum EngineDebugViewMode_Level", Element, ThisHash), Params)) { if (EngineDebugViewMode_Level == engine_debug_view_mode(0)) { @@ -34,7 +36,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("WorldEdit"), UiId(Window, "enum EngineDebugViewMode_WorldEdit", Element), Params)) + if (Button(Ui, CSz("WorldEdit"), UiId(Window, "enum EngineDebugViewMode_WorldEdit", Element, ThisHash), Params)) { if (EngineDebugViewMode_WorldEdit == engine_debug_view_mode(0)) { @@ -57,7 +59,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Entities"), UiId(Window, "enum EngineDebugViewMode_Entities", Element), Params)) + if (Button(Ui, CSz("Entities"), UiId(Window, "enum EngineDebugViewMode_Entities", Element, ThisHash), Params)) { if (EngineDebugViewMode_Entities == engine_debug_view_mode(0)) { @@ -80,7 +82,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Assets"), UiId(Window, "enum EngineDebugViewMode_Assets", Element), Params)) + if (Button(Ui, CSz("Assets"), UiId(Window, "enum EngineDebugViewMode_Assets", Element, ThisHash), Params)) { if (EngineDebugViewMode_Assets == engine_debug_view_mode(0)) { @@ -103,7 +105,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("WorldChunks"), UiId(Window, "enum EngineDebugViewMode_WorldChunks", Element), Params)) + if (Button(Ui, CSz("WorldChunks"), UiId(Window, "enum EngineDebugViewMode_WorldChunks", Element, ThisHash), Params)) { if (EngineDebugViewMode_WorldChunks == engine_debug_view_mode(0)) { @@ -126,7 +128,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Textures"), UiId(Window, "enum EngineDebugViewMode_Textures", Element), Params)) + if (Button(Ui, CSz("Textures"), UiId(Window, "enum EngineDebugViewMode_Textures", Element, ThisHash), Params)) { if (EngineDebugViewMode_Textures == engine_debug_view_mode(0)) { @@ -149,7 +151,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("RenderSettings"), UiId(Window, "enum EngineDebugViewMode_RenderSettings", Element), Params)) + if (Button(Ui, CSz("RenderSettings"), UiId(Window, "enum EngineDebugViewMode_RenderSettings", Element, ThisHash), Params)) { if (EngineDebugViewMode_RenderSettings == engine_debug_view_mode(0)) { @@ -172,7 +174,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("EngineDebug"), UiId(Window, "enum EngineDebugViewMode_EngineDebug", Element), Params)) + if (Button(Ui, CSz("EngineDebug"), UiId(Window, "enum EngineDebugViewMode_EngineDebug", Element, ThisHash), Params)) { if (EngineDebugViewMode_EngineDebug == engine_debug_view_mode(0)) { diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 8b2a5d438..58a83a170 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,17 +1,19 @@ -// src/engine/editor.cpp:303:0 +// src/engine/editor.cpp:307:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1CF5460C); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle entity_behavior_flags", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("None"), UiId(Window, "enum EntityBehaviorFlags_None", Element), Params)) + if (Button(Ui, CSz("None"), UiId(Window, "enum EntityBehaviorFlags_None", Element, ThisHash), Params)) { if (EntityBehaviorFlags_None == entity_behavior_flags(0)) { @@ -34,7 +36,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Gravity"), UiId(Window, "enum EntityBehaviorFlags_Gravity", Element), Params)) + if (Button(Ui, CSz("Gravity"), UiId(Window, "enum EntityBehaviorFlags_Gravity", Element, ThisHash), Params)) { if (EntityBehaviorFlags_Gravity == entity_behavior_flags(0)) { @@ -57,7 +59,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("WorldCollision"), UiId(Window, "enum EntityBehaviorFlags_WorldCollision", Element), Params)) + if (Button(Ui, CSz("WorldCollision"), UiId(Window, "enum EntityBehaviorFlags_WorldCollision", Element, ThisHash), Params)) { if (EntityBehaviorFlags_WorldCollision == entity_behavior_flags(0)) { @@ -80,7 +82,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("EntityCollision"), UiId(Window, "enum EntityBehaviorFlags_EntityCollision", Element), Params)) + if (Button(Ui, CSz("EntityCollision"), UiId(Window, "enum EntityBehaviorFlags_EntityCollision", Element, ThisHash), Params)) { if (EntityBehaviorFlags_EntityCollision == entity_behavior_flags(0)) { @@ -103,7 +105,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("UnspawnOnParticleSystemTerminate"), UiId(Window, "enum EntityBehaviorFlags_UnspawnOnParticleSystemTerminate", Element), Params)) + if (Button(Ui, CSz("UnspawnOnParticleSystemTerminate"), UiId(Window, "enum EntityBehaviorFlags_UnspawnOnParticleSystemTerminate", Element, ThisHash), Params)) { if (EntityBehaviorFlags_UnspawnOnParticleSystemTerminate == entity_behavior_flags(0)) { @@ -126,7 +128,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("FitCollisionVolumeToModel"), UiId(Window, "enum EntityBehaviorFlags_FitCollisionVolumeToModel", Element), Params)) + if (Button(Ui, CSz("FitCollisionVolumeToModel"), UiId(Window, "enum EntityBehaviorFlags_FitCollisionVolumeToModel", Element, ThisHash), Params)) { if (EntityBehaviorFlags_FitCollisionVolumeToModel == entity_behavior_flags(0)) { @@ -149,7 +151,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("DefatulCameraGhostBehavior"), UiId(Window, "enum EntityBehaviorFlags_DefatulCameraGhostBehavior", Element), Params)) + if (Button(Ui, CSz("DefatulCameraGhostBehavior"), UiId(Window, "enum EntityBehaviorFlags_DefatulCameraGhostBehavior", Element, ThisHash), Params)) { if (EntityBehaviorFlags_DefatulCameraGhostBehavior == entity_behavior_flags(0)) { @@ -172,7 +174,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("WorldCenter"), UiId(Window, "enum EntityBehaviorFlags_WorldCenter", Element), Params)) + if (Button(Ui, CSz("WorldCenter"), UiId(Window, "enum EntityBehaviorFlags_WorldCenter", Element, ThisHash), Params)) { if (EntityBehaviorFlags_WorldCenter == entity_behavior_flags(0)) { @@ -195,7 +197,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Default"), UiId(Window, "enum EntityBehaviorFlags_Default", Element), Params)) + if (Button(Ui, CSz("Default"), UiId(Window, "enum EntityBehaviorFlags_Default", Element, ThisHash), Params)) { if (EntityBehaviorFlags_Default == entity_behavior_flags(0)) { diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index fe94eac45..42815ae25 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,17 +1,19 @@ -// src/engine/editor.cpp:300:0 +// src/engine/editor.cpp:304:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x12A84A89); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle entity_state", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Free"), UiId(Window, "enum EntityState_Free", Element), Params)) + if (Button(Ui, CSz("Free"), UiId(Window, "enum EntityState_Free", Element, ThisHash), Params)) { *Element = EntityState_Free; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Nam } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Spawned"), UiId(Window, "enum EntityState_Spawned", Element), Params)) + if (Button(Ui, CSz("Spawned"), UiId(Window, "enum EntityState_Spawned", Element, ThisHash), Params)) { *Element = EntityState_Spawned; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Nam } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Destroyed"), UiId(Window, "enum EntityState_Destroyed", Element), Params)) + if (Button(Ui, CSz("Destroyed"), UiId(Window, "enum EntityState_Destroyed", Element, ThisHash), Params)) { *Element = EntityState_Destroyed; @@ -38,7 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Nam } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Reserved"), UiId(Window, "enum EntityState_Reserved", Element), Params)) + if (Button(Ui, CSz("Reserved"), UiId(Window, "enum EntityState_Reserved", Element, ThisHash), Params)) { *Element = EntityState_Reserved; diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 80ba906f0..3997687b0 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,17 +1,19 @@ -// src/engine/editor.cpp:462:0 +// src/engine/editor.cpp:468:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x8811EEF); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle file_traversal_type", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("None"), UiId(Window, "enum FileTraversalType_None", Element), Params)) + if (Button(Ui, CSz("None"), UiId(Window, "enum FileTraversalType_None", Element, ThisHash), Params)) { *Element = FileTraversalType_None; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Dir"), UiId(Window, "enum FileTraversalType_Dir", Element), Params)) + if (Button(Ui, CSz("Dir"), UiId(Window, "enum FileTraversalType_Dir", Element, ThisHash), Params)) { *Element = FileTraversalType_Dir; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("File"), UiId(Window, "enum FileTraversalType_File", Element), Params)) + if (Button(Ui, CSz("File"), UiId(Window, "enum FileTraversalType_File", Element, ThisHash), Params)) { *Element = FileTraversalType_File; diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 6ee36169c..286be4a64 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,17 +1,19 @@ -// src/engine/editor.h:679:0 +// src/engine/editor.h:703:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1FBAE2DF); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle maybe_tag", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("No"), UiId(Window, "enum Maybe_No", Element), Params)) + if (Button(Ui, CSz("No"), UiId(Window, "enum Maybe_No", Element, ThisHash), Params)) { *Element = Maybe_No; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Yes"), UiId(Window, "enum Maybe_Yes", Element), Params)) + if (Button(Ui, CSz("Yes"), UiId(Window, "enum Maybe_Yes", Element, ThisHash), Params)) { *Element = Maybe_Yes; diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index a44093b2c..8c9c04940 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,17 +1,19 @@ -// src/engine/editor.cpp:324:0 +// src/engine/editor.cpp:328:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x14DBD6B7); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle particle_spawn_type", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("None"), UiId(Window, "enum ParticleSpawnType_None", Element), Params)) + if (Button(Ui, CSz("None"), UiId(Window, "enum ParticleSpawnType_None", Element, ThisHash), Params)) { *Element = ParticleSpawnType_None; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Random"), UiId(Window, "enum ParticleSpawnType_Random", Element), Params)) + if (Button(Ui, CSz("Random"), UiId(Window, "enum ParticleSpawnType_Random", Element, ThisHash), Params)) { *Element = ParticleSpawnType_Random; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Expanding"), UiId(Window, "enum ParticleSpawnType_Expanding", Element), Params)) + if (Button(Ui, CSz("Expanding"), UiId(Window, "enum ParticleSpawnType_Expanding", Element, ThisHash), Params)) { *Element = ParticleSpawnType_Expanding; @@ -38,7 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Contracting"), UiId(Window, "enum ParticleSpawnType_Contracting", Element), Params)) + if (Button(Ui, CSz("Contracting"), UiId(Window, "enum ParticleSpawnType_Contracting", Element, ThisHash), Params)) { *Element = ParticleSpawnType_Contracting; diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index f5da153e1..af2170ad2 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,17 +1,19 @@ -// src/engine/editor.cpp:581:0 +// src/engine/editor.cpp:587:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x299CF761); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle resolution_setting", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("4096x2160"), UiId(Window, "enum ResolutionSetting_4096x2160", Element), Params)) + if (Button(Ui, CSz("4096x2160"), UiId(Window, "enum ResolutionSetting_4096x2160", Element, ThisHash), Params)) { *Element = ResolutionSetting_4096x2160; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("1920x1080"), UiId(Window, "enum ResolutionSetting_1920x1080", Element), Params)) + if (Button(Ui, CSz("1920x1080"), UiId(Window, "enum ResolutionSetting_1920x1080", Element, ThisHash), Params)) { *Element = ResolutionSetting_1920x1080; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("1280x720"), UiId(Window, "enum ResolutionSetting_1280x720", Element), Params)) + if (Button(Ui, CSz("1280x720"), UiId(Window, "enum ResolutionSetting_1280x720", Element, ThisHash), Params)) { *Element = ResolutionSetting_1280x720; diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 6722af70e..9d40cf8c1 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,17 +1,19 @@ -// src/engine/editor.cpp:584:0 +// src/engine/editor.cpp:590:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1C155A0B); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle shader_language_setting", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("330core"), UiId(Window, "enum ShaderLanguageSetting_330core", Element), Params)) + if (Button(Ui, CSz("330core"), UiId(Window, "enum ShaderLanguageSetting_330core", Element, ThisHash), Params)) { *Element = ShaderLanguageSetting_330core; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Elem } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("310es"), UiId(Window, "enum ShaderLanguageSetting_310es", Element), Params)) + if (Button(Ui, CSz("310es"), UiId(Window, "enum ShaderLanguageSetting_310es", Element, ThisHash), Params)) { *Element = ShaderLanguageSetting_310es; diff --git a/generated/do_editor_ui_for_enum_shape_axis.h b/generated/do_editor_ui_for_enum_shape_axis.h index 59c1abff1..380a42a8f 100644 --- a/generated/do_editor_ui_for_enum_shape_axis.h +++ b/generated/do_editor_ui_for_enum_shape_axis.h @@ -1,17 +1,19 @@ -// src/engine/editor.h:687:0 +// src/engine/editor.h:711:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x29E6250C); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle shape_axis", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("InferFromMajorAxis"), UiId(Window, "enum ShapeAxis_InferFromMajorAxis", Element), Params)) + if (Button(Ui, CSz("InferFromMajorAxis"), UiId(Window, "enum ShapeAxis_InferFromMajorAxis", Element, ThisHash), Params)) { *Element = ShapeAxis_InferFromMajorAxis; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("PosX"), UiId(Window, "enum ShapeAxis_PosX", Element), Params)) + if (Button(Ui, CSz("PosX"), UiId(Window, "enum ShapeAxis_PosX", Element, ThisHash), Params)) { *Element = ShapeAxis_PosX; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("NegX"), UiId(Window, "enum ShapeAxis_NegX", Element), Params)) + if (Button(Ui, CSz("NegX"), UiId(Window, "enum ShapeAxis_NegX", Element, ThisHash), Params)) { *Element = ShapeAxis_NegX; @@ -38,7 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("PosY"), UiId(Window, "enum ShapeAxis_PosY", Element), Params)) + if (Button(Ui, CSz("PosY"), UiId(Window, "enum ShapeAxis_PosY", Element, ThisHash), Params)) { *Element = ShapeAxis_PosY; @@ -47,7 +49,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("NegY"), UiId(Window, "enum ShapeAxis_NegY", Element), Params)) + if (Button(Ui, CSz("NegY"), UiId(Window, "enum ShapeAxis_NegY", Element, ThisHash), Params)) { *Element = ShapeAxis_NegY; @@ -56,7 +58,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("PosZ"), UiId(Window, "enum ShapeAxis_PosZ", Element), Params)) + if (Button(Ui, CSz("PosZ"), UiId(Window, "enum ShapeAxis_PosZ", Element, ThisHash), Params)) { *Element = ShapeAxis_PosZ; @@ -65,7 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("NegZ"), UiId(Window, "enum ShapeAxis_NegZ", Element), Params)) + if (Button(Ui, CSz("NegZ"), UiId(Window, "enum ShapeAxis_NegZ", Element, ThisHash), Params)) { *Element = ShapeAxis_NegZ; @@ -74,7 +76,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Count"), UiId(Window, "enum ShapeAxis_Count", Element), Params)) + if (Button(Ui, CSz("Count"), UiId(Window, "enum ShapeAxis_Count", Element, ThisHash), Params)) { *Element = ShapeAxis_Count; diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 9d02cbed8..9628fd19c 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,17 +1,19 @@ // src/engine/editor.cpp:171:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x3022A425); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle shape_type", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Rect"), UiId(Window, "enum ShapeType_Rect", Element), Params)) + if (Button(Ui, CSz("Rect"), UiId(Window, "enum ShapeType_Rect", Element, ThisHash), Params)) { *Element = ShapeType_Rect; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Sphere"), UiId(Window, "enum ShapeType_Sphere", Element), Params)) + if (Button(Ui, CSz("Sphere"), UiId(Window, "enum ShapeType_Sphere", Element, ThisHash), Params)) { *Element = ShapeType_Sphere; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Line"), UiId(Window, "enum ShapeType_Line", Element), Params)) + if (Button(Ui, CSz("Line"), UiId(Window, "enum ShapeType_Line", Element, ThisHash), Params)) { *Element = ShapeType_Line; @@ -38,7 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Cylinder"), UiId(Window, "enum ShapeType_Cylinder", Element), Params)) + if (Button(Ui, CSz("Cylinder"), UiId(Window, "enum ShapeType_Cylinder", Element, ThisHash), Params)) { *Element = ShapeType_Cylinder; @@ -47,7 +49,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Plane"), UiId(Window, "enum ShapeType_Plane", Element), Params)) + if (Button(Ui, CSz("Plane"), UiId(Window, "enum ShapeType_Plane", Element, ThisHash), Params)) { *Element = ShapeType_Plane; @@ -56,7 +58,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Torus"), UiId(Window, "enum ShapeType_Torus", Element), Params)) + if (Button(Ui, CSz("Torus"), UiId(Window, "enum ShapeType_Torus", Element, ThisHash), Params)) { *Element = ShapeType_Torus; diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index c87f3cc8b..3b48b5019 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,17 +1,19 @@ -// src/engine/editor.cpp:306:0 +// src/engine/editor.cpp:310:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0xD9E6A84); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle tone_mapping_type", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("None"), UiId(Window, "enum ToneMappingType_None", Element), Params)) + if (Button(Ui, CSz("None"), UiId(Window, "enum ToneMappingType_None", Element, ThisHash), Params)) { *Element = ToneMappingType_None; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Reinhard"), UiId(Window, "enum ToneMappingType_Reinhard", Element), Params)) + if (Button(Ui, CSz("Reinhard"), UiId(Window, "enum ToneMappingType_Reinhard", Element, ThisHash), Params)) { *Element = ToneMappingType_Reinhard; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Exposure"), UiId(Window, "enum ToneMappingType_Exposure", Element), Params)) + if (Button(Ui, CSz("Exposure"), UiId(Window, "enum ToneMappingType_Exposure", Element, ThisHash), Params)) { *Element = ToneMappingType_Exposure; @@ -38,7 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("AGX"), UiId(Window, "enum ToneMappingType_AGX", Element), Params)) + if (Button(Ui, CSz("AGX"), UiId(Window, "enum ToneMappingType_AGX", Element, ThisHash), Params)) { *Element = ToneMappingType_AGX; @@ -47,7 +49,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Sepia"), UiId(Window, "enum ToneMappingType_AGX_Sepia", Element), Params)) + if (Button(Ui, CSz("Sepia"), UiId(Window, "enum ToneMappingType_AGX_Sepia", Element, ThisHash), Params)) { *Element = ToneMappingType_AGX_Sepia; @@ -56,7 +58,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Punchy"), UiId(Window, "enum ToneMappingType_AGX_Punchy", Element), Params)) + if (Button(Ui, CSz("Punchy"), UiId(Window, "enum ToneMappingType_AGX_Punchy", Element, ThisHash), Params)) { *Element = ToneMappingType_AGX_Punchy; diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index 4e125a377..f53fcb85f 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,17 +1,19 @@ -// src/engine/editor.h:736:0 +// src/engine/editor.h:760:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x56825CE); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle ui_noise_type", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Perlin"), UiId(Window, "enum NoiseType_Perlin", Element), Params)) + if (Button(Ui, CSz("Perlin"), UiId(Window, "enum NoiseType_Perlin", Element, ThisHash), Params)) { *Element = NoiseType_Perlin; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Na } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Voronoi"), UiId(Window, "enum NoiseType_Voronoi", Element), Params)) + if (Button(Ui, CSz("Voronoi"), UiId(Window, "enum NoiseType_Voronoi", Element, ThisHash), Params)) { *Element = NoiseType_Voronoi; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Na } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("White"), UiId(Window, "enum NoiseType_White", Element), Params)) + if (Button(Ui, CSz("White"), UiId(Window, "enum NoiseType_White", Element, ThisHash), Params)) { *Element = NoiseType_White; diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index 2396b5292..d395e7d06 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,17 +1,19 @@ // src/engine/editor.cpp:144:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x3B8559F7); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle visible_region_size", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("1"), UiId(Window, "enum VisibleRegionSize_1", Element), Params)) + if (Button(Ui, CSz("1"), UiId(Window, "enum VisibleRegionSize_1", Element, ThisHash), Params)) { *Element = VisibleRegionSize_1; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("2"), UiId(Window, "enum VisibleRegionSize_2", Element), Params)) + if (Button(Ui, CSz("2"), UiId(Window, "enum VisibleRegionSize_2", Element, ThisHash), Params)) { *Element = VisibleRegionSize_2; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("4"), UiId(Window, "enum VisibleRegionSize_4", Element), Params)) + if (Button(Ui, CSz("4"), UiId(Window, "enum VisibleRegionSize_4", Element, ThisHash), Params)) { *Element = VisibleRegionSize_4; @@ -38,7 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("8"), UiId(Window, "enum VisibleRegionSize_8", Element), Params)) + if (Button(Ui, CSz("8"), UiId(Window, "enum VisibleRegionSize_8", Element, ThisHash), Params)) { *Element = VisibleRegionSize_8; @@ -47,7 +49,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("16"), UiId(Window, "enum VisibleRegionSize_16", Element), Params)) + if (Button(Ui, CSz("16"), UiId(Window, "enum VisibleRegionSize_16", Element, ThisHash), Params)) { *Element = VisibleRegionSize_16; @@ -56,7 +58,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("32"), UiId(Window, "enum VisibleRegionSize_32", Element), Params)) + if (Button(Ui, CSz("32"), UiId(Window, "enum VisibleRegionSize_32", Element, ThisHash), Params)) { *Element = VisibleRegionSize_32; @@ -65,7 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("64"), UiId(Window, "enum VisibleRegionSize_64", Element), Params)) + if (Button(Ui, CSz("64"), UiId(Window, "enum VisibleRegionSize_64", Element, ThisHash), Params)) { *Element = VisibleRegionSize_64; @@ -74,7 +76,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("128"), UiId(Window, "enum VisibleRegionSize_128", Element), Params)) + if (Button(Ui, CSz("128"), UiId(Window, "enum VisibleRegionSize_128", Element, ThisHash), Params)) { *Element = VisibleRegionSize_128; @@ -83,7 +85,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("256"), UiId(Window, "enum VisibleRegionSize_256", Element), Params)) + if (Button(Ui, CSz("256"), UiId(Window, "enum VisibleRegionSize_256", Element, ThisHash), Params)) { *Element = VisibleRegionSize_256; @@ -92,7 +94,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("512"), UiId(Window, "enum VisibleRegionSize_512", Element), Params)) + if (Button(Ui, CSz("512"), UiId(Window, "enum VisibleRegionSize_512", Element, ThisHash), Params)) { *Element = VisibleRegionSize_512; @@ -101,7 +103,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("1024"), UiId(Window, "enum VisibleRegionSize_1024", Element), Params)) + if (Button(Ui, CSz("1024"), UiId(Window, "enum VisibleRegionSize_1024", Element, ThisHash), Params)) { *Element = VisibleRegionSize_1024; @@ -110,7 +112,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("2048"), UiId(Window, "enum VisibleRegionSize_2048", Element), Params)) + if (Button(Ui, CSz("2048"), UiId(Window, "enum VisibleRegionSize_2048", Element, ThisHash), Params)) { *Element = VisibleRegionSize_2048; @@ -119,7 +121,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("4096"), UiId(Window, "enum VisibleRegionSize_4096", Element), Params)) + if (Button(Ui, CSz("4096"), UiId(Window, "enum VisibleRegionSize_4096", Element, ThisHash), Params)) { *Element = VisibleRegionSize_4096; @@ -128,7 +130,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("8192"), UiId(Window, "enum VisibleRegionSize_8192", Element), Params)) + if (Button(Ui, CSz("8192"), UiId(Window, "enum VisibleRegionSize_8192", Element, ThisHash), Params)) { *Element = VisibleRegionSize_8192; @@ -137,7 +139,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("16k"), UiId(Window, "enum VisibleRegionSize_16k", Element), Params)) + if (Button(Ui, CSz("16k"), UiId(Window, "enum VisibleRegionSize_16k", Element, ThisHash), Params)) { *Element = VisibleRegionSize_16k; @@ -146,7 +148,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("32k"), UiId(Window, "enum VisibleRegionSize_32k", Element), Params)) + if (Button(Ui, CSz("32k"), UiId(Window, "enum VisibleRegionSize_32k", Element, ThisHash), Params)) { *Element = VisibleRegionSize_32k; @@ -155,7 +157,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("64k"), UiId(Window, "enum VisibleRegionSize_64k", Element), Params)) + if (Button(Ui, CSz("64k"), UiId(Window, "enum VisibleRegionSize_64k", Element, ThisHash), Params)) { *Element = VisibleRegionSize_64k; diff --git a/generated/do_editor_ui_for_enum_voxel_rule_direction.h b/generated/do_editor_ui_for_enum_voxel_rule_direction.h index 96b7ba13a..f89d72ea5 100644 --- a/generated/do_editor_ui_for_enum_voxel_rule_direction.h +++ b/generated/do_editor_ui_for_enum_voxel_rule_direction.h @@ -1,17 +1,19 @@ -// src/engine/editor.h:690:0 +// src/engine/editor.h:714:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x77DD4C3); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle voxel_rule_direction", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("PosX"), UiId(Window, "enum VoxelRuleDir_PosX", Element), Params)) + if (Button(Ui, CSz("PosX"), UiId(Window, "enum VoxelRuleDir_PosX", Element, ThisHash), Params)) { *Element = VoxelRuleDir_PosX; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("NegX"), UiId(Window, "enum VoxelRuleDir_NegX", Element), Params)) + if (Button(Ui, CSz("NegX"), UiId(Window, "enum VoxelRuleDir_NegX", Element, ThisHash), Params)) { *Element = VoxelRuleDir_NegX; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("PosY"), UiId(Window, "enum VoxelRuleDir_PosY", Element), Params)) + if (Button(Ui, CSz("PosY"), UiId(Window, "enum VoxelRuleDir_PosY", Element, ThisHash), Params)) { *Element = VoxelRuleDir_PosY; @@ -38,7 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("NegY"), UiId(Window, "enum VoxelRuleDir_NegY", Element), Params)) + if (Button(Ui, CSz("NegY"), UiId(Window, "enum VoxelRuleDir_NegY", Element, ThisHash), Params)) { *Element = VoxelRuleDir_NegY; @@ -47,7 +49,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("PosZ"), UiId(Window, "enum VoxelRuleDir_PosZ", Element), Params)) + if (Button(Ui, CSz("PosZ"), UiId(Window, "enum VoxelRuleDir_PosZ", Element, ThisHash), Params)) { *Element = VoxelRuleDir_PosZ; @@ -56,7 +58,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("NegZ"), UiId(Window, "enum VoxelRuleDir_NegZ", Element), Params)) + if (Button(Ui, CSz("NegZ"), UiId(Window, "enum VoxelRuleDir_NegZ", Element, ThisHash), Params)) { *Element = VoxelRuleDir_NegZ; @@ -65,7 +67,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Count"), UiId(Window, "enum VoxelRuleDir_Count", Element), Params)) + if (Button(Ui, CSz("Count"), UiId(Window, "enum VoxelRuleDir_Count", Element, ThisHash), Params)) { *Element = VoxelRuleDir_Count; diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 038ed8a41..b2c28197a 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:892:0 +// src/engine/editor.h:916:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) @@ -39,6 +39,7 @@ DoEditorUi( renderer_2d *Ui, window_layout *Window, asset_window_view_mode *Element, cs GroupName, + u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) { diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 4f80bbcb4..6208a1135 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1117:0 +// src/engine/editor.h:1141:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) @@ -39,6 +39,7 @@ DoEditorUi( renderer_2d *Ui, window_layout *Window, brush_layer_type *Element, cs GroupName, + u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index f1e6d5160..6c07b098b 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:898:0 +// src/engine/editor.h:922:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) @@ -42,6 +42,7 @@ DoEditorUi( renderer_2d *Ui, window_layout *Window, world_edit_blend_mode *Element, cs GroupName, + u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 33c196eba..96d1004a9 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,17 +1,19 @@ -// src/engine/editor.h:881:0 +// src/engine/editor.h:905:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1AAA4276); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle world_edit_blend_mode_modifier", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("None"), UiId(Window, "enum WorldEdit_Modifier_None", Element), Params)) + if (Button(Ui, CSz("None"), UiId(Window, "enum WorldEdit_Modifier_None", Element, ThisHash), Params)) { if (WorldEdit_Modifier_None == world_edit_blend_mode_modifier(0)) { @@ -34,7 +36,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifie } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("ClampPos"), UiId(Window, "enum WorldEdit_ValueModifier_ClampPos", Element), Params)) + if (Button(Ui, CSz("ClampPos"), UiId(Window, "enum WorldEdit_ValueModifier_ClampPos", Element, ThisHash), Params)) { if (WorldEdit_ValueModifier_ClampPos == world_edit_blend_mode_modifier(0)) { @@ -57,7 +59,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifie } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("ClampNeg"), UiId(Window, "enum WorldEdit_ValueModifier_ClampNeg", Element), Params)) + if (Button(Ui, CSz("ClampNeg"), UiId(Window, "enum WorldEdit_ValueModifier_ClampNeg", Element, ThisHash), Params)) { if (WorldEdit_ValueModifier_ClampNeg == world_edit_blend_mode_modifier(0)) { @@ -80,7 +82,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifie } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Threshold"), UiId(Window, "enum WorldEdit_ValueModifier_Threshold", Element), Params)) + if (Button(Ui, CSz("Threshold"), UiId(Window, "enum WorldEdit_ValueModifier_Threshold", Element, ThisHash), Params)) { if (WorldEdit_ValueModifier_Threshold == world_edit_blend_mode_modifier(0)) { @@ -103,7 +105,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifie } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Discard"), UiId(Window, "enum WorldEdit_ColorModifier_Discard", Element), Params)) + if (Button(Ui, CSz("Discard"), UiId(Window, "enum WorldEdit_ColorModifier_Discard", Element, ThisHash), Params)) { if (WorldEdit_ColorModifier_Discard == world_edit_blend_mode_modifier(0)) { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 5487ab44e..dfd4ab516 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:910:0 +// src/engine/editor.h:934:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) @@ -42,6 +42,7 @@ DoEditorUi( renderer_2d *Ui, window_layout *Window, world_edit_brush_type *Element, cs GroupName, + u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 7675dcf4c..5ddeab098 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,17 +1,19 @@ -// src/engine/editor.h:903:0 +// src/engine/editor.h:927:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x1E3E2BDD); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle world_edit_color_blend_mode", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("ValuePositive"), UiId(Window, "enum WorldEdit_ColorBlendMode_ValuePositive", Element), Params)) + if (Button(Ui, CSz("ValuePositive"), UiId(Window, "enum WorldEdit_ColorBlendMode_ValuePositive", Element, ThisHash), Params)) { *Element = WorldEdit_ColorBlendMode_ValuePositive; @@ -20,7 +22,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode * } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("ValueNegative"), UiId(Window, "enum WorldEdit_ColorBlendMode_ValueNegative", Element), Params)) + if (Button(Ui, CSz("ValueNegative"), UiId(Window, "enum WorldEdit_ColorBlendMode_ValueNegative", Element, ThisHash), Params)) { *Element = WorldEdit_ColorBlendMode_ValueNegative; @@ -29,7 +31,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode * } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Surface"), UiId(Window, "enum WorldEdit_ColorBlendMode_Surface", Element), Params)) + if (Button(Ui, CSz("Surface"), UiId(Window, "enum WorldEdit_ColorBlendMode_Surface", Element, ThisHash), Params)) { *Element = WorldEdit_ColorBlendMode_Surface; @@ -38,7 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode * } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Disabled"), UiId(Window, "enum WorldEdit_ColorBlendMode_Disabled", Element), Params)) + if (Button(Ui, CSz("Disabled"), UiId(Window, "enum WorldEdit_ColorBlendMode_Disabled", Element, ThisHash), Params)) { *Element = WorldEdit_ColorBlendMode_Disabled; diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index f480c54b6..6f31f1cfe 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:907:0 +// src/engine/editor.h:931:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) @@ -41,6 +41,7 @@ DoEditorUi( renderer_2d *Ui, window_layout *Window, world_edit_tool *Element, cs GroupName, + u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) { diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index 7ec90c182..86fe7bfb0 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,8 +1,10 @@ -// src/engine/editor.h:554:0 +// src/engine/editor.h:571:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290D1BBC); + Params = Params ? Params : &DefaultUiRenderParams_Blank; if (Name.Count) { PushColumn(Ui, Name, &DefaultUiRenderParams_Column); } @@ -11,9 +13,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_rende { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } + if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } PushColumn(Ui, CS(*Value), &DefaultUiRenderParams_Generic); - if (Button(Ui, CSz("+"), UiId(Window, "increment", Value), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } + if (Button(Ui, CSz("+"), UiId(Window, "increment", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } PushTableEnd(Ui); EndColumn(Ui, Start); } @@ -26,14 +28,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_rende } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, volatile s64 *Value, cs Name, ui_render_params *Params) +DoEditorUi(renderer_2d *Ui, window_layout *Window, u64 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - DoEditorUi(Ui, Window, (s64*) Value, Name, Params); -} + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290D1BBE); -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, u64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) -{ Params = Params ? Params : &DefaultUiRenderParams_Blank; if (Name.Count) { PushColumn(Ui, Name, &DefaultUiRenderParams_Column); } @@ -42,9 +40,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, u64 *Value, cs Name, ui_rende { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } + if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } PushColumn(Ui, CS(*Value), &DefaultUiRenderParams_Generic); - if (Button(Ui, CSz("+"), UiId(Window, "increment", Value), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } + if (Button(Ui, CSz("+"), UiId(Window, "increment", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } PushTableEnd(Ui); EndColumn(Ui, Start); } @@ -57,14 +55,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, u64 *Value, cs Name, ui_rende } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, volatile u64 *Value, cs Name, ui_render_params *Params) +DoEditorUi(renderer_2d *Ui, window_layout *Window, s32 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - DoEditorUi(Ui, Window, (u64*) Value, Name, Params); -} + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290D052B); -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, s32 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) -{ Params = Params ? Params : &DefaultUiRenderParams_Blank; if (Name.Count) { PushColumn(Ui, Name, &DefaultUiRenderParams_Column); } @@ -73,9 +67,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, s32 *Value, cs Name, ui_rende { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } + if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } PushColumn(Ui, CS(*Value), &DefaultUiRenderParams_Generic); - if (Button(Ui, CSz("+"), UiId(Window, "increment", Value), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } + if (Button(Ui, CSz("+"), UiId(Window, "increment", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } PushTableEnd(Ui); EndColumn(Ui, Start); } @@ -88,14 +82,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, s32 *Value, cs Name, ui_rende } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, volatile s32 *Value, cs Name, ui_render_params *Params) +DoEditorUi(renderer_2d *Ui, window_layout *Window, u32 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - DoEditorUi(Ui, Window, (s32*) Value, Name, Params); -} + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290D052D); -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, u32 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) -{ Params = Params ? Params : &DefaultUiRenderParams_Blank; if (Name.Count) { PushColumn(Ui, Name, &DefaultUiRenderParams_Column); } @@ -104,9 +94,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, u32 *Value, cs Name, ui_rende { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } + if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } PushColumn(Ui, CS(*Value), &DefaultUiRenderParams_Generic); - if (Button(Ui, CSz("+"), UiId(Window, "increment", Value), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } + if (Button(Ui, CSz("+"), UiId(Window, "increment", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } PushTableEnd(Ui); EndColumn(Ui, Start); } @@ -119,14 +109,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, u32 *Value, cs Name, ui_rende } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, volatile u32 *Value, cs Name, ui_render_params *Params) +DoEditorUi(renderer_2d *Ui, window_layout *Window, s16 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - DoEditorUi(Ui, Window, (u32*) Value, Name, Params); -} + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290D30A5); -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, s16 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) -{ Params = Params ? Params : &DefaultUiRenderParams_Blank; if (Name.Count) { PushColumn(Ui, Name, &DefaultUiRenderParams_Column); } @@ -135,9 +121,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, s16 *Value, cs Name, ui_rende { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } + if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } PushColumn(Ui, CS(*Value), &DefaultUiRenderParams_Generic); - if (Button(Ui, CSz("+"), UiId(Window, "increment", Value), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } + if (Button(Ui, CSz("+"), UiId(Window, "increment", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } PushTableEnd(Ui); EndColumn(Ui, Start); } @@ -150,14 +136,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, s16 *Value, cs Name, ui_rende } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, volatile s16 *Value, cs Name, ui_render_params *Params) +DoEditorUi(renderer_2d *Ui, window_layout *Window, u16 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - DoEditorUi(Ui, Window, (s16*) Value, Name, Params); -} + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290D30A7); -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, u16 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) -{ Params = Params ? Params : &DefaultUiRenderParams_Blank; if (Name.Count) { PushColumn(Ui, Name, &DefaultUiRenderParams_Column); } @@ -166,9 +148,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, u16 *Value, cs Name, ui_rende { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } + if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } PushColumn(Ui, CS(*Value), &DefaultUiRenderParams_Generic); - if (Button(Ui, CSz("+"), UiId(Window, "increment", Value), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } + if (Button(Ui, CSz("+"), UiId(Window, "increment", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } PushTableEnd(Ui); EndColumn(Ui, Start); } @@ -181,14 +163,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, u16 *Value, cs Name, ui_rende } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, volatile u16 *Value, cs Name, ui_render_params *Params) +DoEditorUi(renderer_2d *Ui, window_layout *Window, s8 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - DoEditorUi(Ui, Window, (u16*) Value, Name, Params); -} + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290F14E4); -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, s8 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) -{ Params = Params ? Params : &DefaultUiRenderParams_Blank; if (Name.Count) { PushColumn(Ui, Name, &DefaultUiRenderParams_Column); } @@ -197,9 +175,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, s8 *Value, cs Name, ui_render { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } + if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } PushColumn(Ui, CS(*Value), &DefaultUiRenderParams_Generic); - if (Button(Ui, CSz("+"), UiId(Window, "increment", Value), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } + if (Button(Ui, CSz("+"), UiId(Window, "increment", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } PushTableEnd(Ui); EndColumn(Ui, Start); } @@ -212,14 +190,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, s8 *Value, cs Name, ui_render } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, volatile s8 *Value, cs Name, ui_render_params *Params) +DoEditorUi(renderer_2d *Ui, window_layout *Window, u8 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { - DoEditorUi(Ui, Window, (s8*) Value, Name, Params); -} + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290F14E6); -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, u8 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) -{ Params = Params ? Params : &DefaultUiRenderParams_Blank; if (Name.Count) { PushColumn(Ui, Name, &DefaultUiRenderParams_Column); } @@ -228,9 +202,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, u8 *Value, cs Name, ui_render { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } + if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } PushColumn(Ui, CS(*Value), &DefaultUiRenderParams_Generic); - if (Button(Ui, CSz("+"), UiId(Window, "increment", Value), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } + if (Button(Ui, CSz("+"), UiId(Window, "increment", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } PushTableEnd(Ui); EndColumn(Ui, Start); } @@ -242,9 +216,3 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, u8 *Value, cs Name, ui_render } -link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, volatile u8 *Value, cs Name, ui_render_params *Params) -{ - DoEditorUi(Ui, Window, (u8*) Value, Name, Params); -} - diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index bb41f62c9..04e225816 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,8 +1,10 @@ -// src/engine/editor.h:666:0 +// src/engine/editor.h:688:0 link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290F60E2); + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } @@ -10,10 +12,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_rende { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[2], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[3], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[2], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[3], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -23,8 +25,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_rende PushNewRow(Ui); } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, v4 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, v4 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290F1413); + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } @@ -32,10 +36,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v4 *Value, cs Name, ui_render { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[2], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[3], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[2], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[3], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -45,8 +49,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v4 *Value, cs Name, ui_render PushNewRow(Ui); } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, v3i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, v3i *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290F60AD); + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } @@ -54,9 +60,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v3i *Value, cs Name, ui_rende { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[2], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[2], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -66,8 +72,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v3i *Value, cs Name, ui_rende PushNewRow(Ui); } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, v3 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, v3 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290F13DE); + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } @@ -75,9 +83,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v3 *Value, cs Name, ui_render { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[2], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[2], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -87,8 +95,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v3 *Value, cs Name, ui_render PushNewRow(Ui); } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, v2i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, v2i *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290F6078); + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } @@ -96,8 +106,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2i *Value, cs Name, ui_rende { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -107,8 +117,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2i *Value, cs Name, ui_rende PushNewRow(Ui); } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, v2 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, v2 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290F13A9); + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } @@ -116,8 +128,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2 *Value, cs Name, ui_render { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -127,8 +139,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2 *Value, cs Name, ui_render PushNewRow(Ui); } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, Quaternion *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, Quaternion *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x42A58E4); + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } @@ -136,10 +150,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, Quaternion *Value, cs Name, u { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[2], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[3], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[2], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[3], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -149,8 +163,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, Quaternion *Value, cs Name, u PushNewRow(Ui); } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, m4 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, m4 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x290F140A); + /* PushTableStart(Ui); */ if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Blank); } @@ -158,10 +174,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, m4 *Value, cs Name, ui_render { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - DoEditorUi(Ui, Window, &Value->E[0], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[1], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[2], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); - DoEditorUi(Ui, Window, &Value->E[3], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[0], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[2], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->E[3], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 1c727d3d4..7b2d72dfa 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:522:0 +// src/engine/editor.cpp:528:0 @@ -7,8 +7,10 @@ link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x35BB500A); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -17,7 +19,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle easing_function", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle easing_function", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -45,6 +47,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function *Element, cs // Cast to remove const/volatile keywords if they're there Cast(cs*, &Element->Name), MemberName, + ThisHash, Params ); @@ -70,6 +73,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function *Element, cs // Cast to remove const/volatile keywords if they're there Cast(v2_static_cursor_16*, &Element->Points), MemberName, + ThisHash, Params ); @@ -399,8 +403,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function *Element, cs link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x12B39B25); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -409,7 +415,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle world_edit", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -437,6 +443,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(rect3cp*, &Element->Region), MemberName, + ThisHash, Params ); @@ -461,6 +468,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(world_edit_brush*, Element->Brush), MemberName, + ThisHash, Params ); @@ -484,6 +492,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, Window, Cast(b8*, &Element->Tombstone), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -506,6 +515,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, Window, Cast(b8*, &Element->Selected), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -529,6 +539,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Ordinal), MemberName, + ThisHash, Params ); @@ -574,8 +585,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_render_pass *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_render_pass *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x8D1934E); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -584,7 +597,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle easing_function_visualizer_render_pass", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle easing_function_visualizer_render_pass", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -612,6 +625,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re // Cast to remove const/volatile keywords if they're there Cast(shader*, &Element->Program), MemberName, + ThisHash, Params ); @@ -633,13 +647,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re cs MemberName = CSz("Uniforms"); - if (ToggleButton(Ui, CSz("v Uniforms[2]"), CSz("> Uniforms[2]"), UiId(Window, "toggle easing_function_visualizer_render_pass shader_uniform Uniforms", Element->Uniforms), Params )) + if (ToggleButton(Ui, + CSz("v Uniforms[2]"), + CSz("> Uniforms[2]"), + UiId(Window, "toggle easing_function_visualizer_render_pass shader_uniform Uniforms", Element->Uniforms, ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); RangeIterator(ArrayIndex, 2) { - DoEditorUi(Ui, Window, Element->Uniforms+ArrayIndex, FSz("Uniforms[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->Uniforms+ArrayIndex, + FSz("Uniforms[%d]", ArrayIndex), + ThisHash, + Params); } @@ -664,6 +687,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re // Cast to remove const/volatile keywords if they're there Cast(v2*, Element->Points), MemberName, + ThisHash, Params ); @@ -688,6 +712,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re // Cast to remove const/volatile keywords if they're there Cast(u32*, Element->Count), MemberName, + ThisHash, Params ); @@ -769,8 +794,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) +DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0xBA6A3C1); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -779,7 +806,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle selection_region", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle selection_region", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -807,6 +834,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs // Cast to remove const/volatile keywords if they're there Cast(u32*, &Element->Clicks), MemberName, + ThisHash, Params ); @@ -832,6 +860,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs // Cast to remove const/volatile keywords if they're there Cast(cp*, &Element->Base), MemberName, + ThisHash, Params ); @@ -856,6 +885,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs // Cast to remove const/volatile keywords if they're there Cast(rect3cp*, &Element->Region), MemberName, + ThisHash, Params ); @@ -880,6 +910,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs // Cast to remove const/volatile keywords if they're there Cast(v3*, &Element->Diff), MemberName, + ThisHash, Params ); @@ -903,6 +934,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs Window, Cast(b8*, &Element->InitialSelect), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox ); @@ -926,6 +958,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs // Cast to remove const/volatile keywords if they're there Cast(selection_modification_mode*, &Element->ModMode), MemberName, + ThisHash, Params ); @@ -950,6 +983,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs // Cast to remove const/volatile keywords if they're there Cast(selection_modification_state*, &Element->ModState), MemberName, + ThisHash, Params ); diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h index 43e1451da..90887b5bf 100644 --- a/generated/for_datatypes_cx51CcgQ.h +++ b/generated/for_datatypes_cx51CcgQ.h @@ -2300,7 +2300,6 @@ - link_internal void @@ -5275,23 +5274,6 @@ DoJob(initialize_easing_function_visualizer_render_pass_async_params *Params) - - - - - - - - - - - - - - - - - @@ -7344,6 +7326,8 @@ DoJob(draw_lod_async_params *Params) + + diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 03ee65e84..972abcd11 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:385:0 +// src/engine/editor.cpp:391:0 @@ -330,17 +330,19 @@ SelectionModificationMode(counted_string S) link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_modification_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) +DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_modification_mode *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x48A2A15); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle selection_modification_mode", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("None"), UiId(Window, "enum SelectionModificationMode_None", Element), Params)) + if (Button(Ui, CSz("None"), UiId(Window, "enum SelectionModificationMode_None", Element, ThisHash), Params)) { *Element = SelectionModificationMode_None; @@ -349,7 +351,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_modification_mode * } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Initialize"), UiId(Window, "enum SelectionModificationMode_Initialize", Element), Params)) + if (Button(Ui, CSz("Initialize"), UiId(Window, "enum SelectionModificationMode_Initialize", Element, ThisHash), Params)) { *Element = SelectionModificationMode_Initialize; @@ -358,7 +360,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_modification_mode * } PushNewRow(Ui); if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("Modify"), UiId(Window, "enum SelectionModificationMode_Modify", Element), Params)) + if (Button(Ui, CSz("Modify"), UiId(Window, "enum SelectionModificationMode_Modify", Element, ThisHash), Params)) { *Element = SelectionModificationMode_Modify; diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h index 02abf5fa7..87959365f 100644 --- a/generated/for_datatypes_khY6kwEk.h +++ b/generated/for_datatypes_khY6kwEk.h @@ -2300,7 +2300,6 @@ - struct compile_shader_pair_async_params poof(@async_function_params) @@ -5244,23 +5243,6 @@ struct initialize_easing_function_visualizer_render_pass_async_params poof(@asyn - - - - - - - - - - - - - - - - - @@ -7305,6 +7287,8 @@ struct draw_lod_async_params poof(@async_function_params) + + diff --git a/generated/hashtable_struct_ui_toggle.h b/generated/hashtable_struct_ui_toggle.h index ba997ef41..1502e21c1 100644 --- a/generated/hashtable_struct_ui_toggle.h +++ b/generated/hashtable_struct_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:247:0 +// external/bonsai_stdlib/src/ui/ui.h:263:0 struct ui_toggle_linked_list_node { diff --git a/generated/hashtable_struct_window_layout.h b/generated/hashtable_struct_window_layout.h index 1906e25e8..a38504bf7 100644 --- a/generated/hashtable_struct_window_layout.h +++ b/generated/hashtable_struct_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:140:0 +// external/bonsai_stdlib/src/ui/ui.h:142:0 struct window_layout_linked_list_node { diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 3d1ac81e3..c1b4b5ad0 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1249:0 +// src/engine/editor.h:1273:0 struct world_edit_brush_linked_list_node { diff --git a/generated/maybe_ui_toggle.h b/generated/maybe_ui_toggle.h index bb52ed5eb..68fe32842 100644 --- a/generated/maybe_ui_toggle.h +++ b/generated/maybe_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:241:0 +// external/bonsai_stdlib/src/ui/ui.h:257:0 struct maybe_ui_toggle { diff --git a/generated/maybe_ui_toggle_ptr.h b/generated/maybe_ui_toggle_ptr.h index e59f6ef1a..6c9c5e79f 100644 --- a/generated/maybe_ui_toggle_ptr.h +++ b/generated/maybe_ui_toggle_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:244:0 +// external/bonsai_stdlib/src/ui/ui.h:260:0 struct maybe_ui_toggle_ptr { diff --git a/generated/maybe_window_layout.h b/generated/maybe_window_layout.h index 03d6bb456..3ac9d65e6 100644 --- a/generated/maybe_window_layout.h +++ b/generated/maybe_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:134:0 +// external/bonsai_stdlib/src/ui/ui.h:136:0 struct maybe_window_layout { diff --git a/generated/maybe_window_layout_ptr.h b/generated/maybe_window_layout_ptr.h index 831cb5f81..35e65dfc8 100644 --- a/generated/maybe_window_layout_ptr.h +++ b/generated/maybe_window_layout_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:137:0 +// external/bonsai_stdlib/src/ui/ui.h:139:0 struct maybe_window_layout_ptr { diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index dfce49c2a..f01d810f4 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:734:0 +// src/engine/editor.h:758:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index c1d9bd34e..a0a757380 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:503:0 +// src/engine/editor.cpp:509:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index e90308bd0..2f7f565e4 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:682:0 +// src/engine/editor.h:706:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 8a45fa9f9..4cfa78a11 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:296:0 +// src/engine/editor.cpp:300:0 link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 7052b78ff..abed0bcd3 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1115:0 +// src/engine/editor.h:1139:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index a3a022364..befd63793 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:290:0 +// src/engine/editor.cpp:294:0 link_internal counted_string ToStringPrefixless(file_traversal_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index 566eecaf3..15cb03a51 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:677:0 +// src/engine/editor.h:701:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index a84296f11..4e4b532f2 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:287:0 +// src/engine/editor.cpp:291:0 link_internal counted_string ToStringPrefixless(particle_spawn_type Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index d21041525..3ccd6300c 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1046:0 +// src/engine/editor.h:1070:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 7b84f9443..c7d52b105 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:293:0 +// src/engine/editor.cpp:297:0 link_internal counted_string ToStringPrefixless(tone_mapping_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index ca54f4763..b2f03c79f 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:732:0 +// src/engine/editor.h:756:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 4ed7bae0c..392c13b38 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:895:0 +// src/engine/editor.h:919:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 964b092d4..2aaebb39b 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:878:0 +// src/engine/editor.h:902:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 9e32af293..0284bb438 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:901:0 +// src/engine/editor.h:925:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 8ba0b181e..6f354e897 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:766:0 +// src/engine/editor.h:790:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 148595a02..893ca4284 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:887:0 +// src/engine/editor.h:911:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index 75bf5db33..d17b6b5df 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -6,19 +6,20 @@ DoEntityWindow(engine_resources *Engine) #if 1 { - local_persist window_layout EntityWindow = WindowLayout("All Entities"); + window_layout *EntityWindow = GetOrCreateWindow(Ui, "All Entities"); - PushWindowStart(Ui, &EntityWindow); + PushWindowStart(Ui, EntityWindow); PushTableStart(Ui); RangeIterator(EntityIndex, TOTAL_ENTITY_COUNT) { entity *Entity = EntityTable[EntityIndex]; - DoEditorUi(Ui, &EntityWindow, Entity, FSz("(%d) (%S) (%S)", EntityIndex, ToString(Entity->State), Entity->AssetId.FileNode.Name) ); + cs Label = FSz("(%d) (%S) (%S)", EntityIndex, ToString(Entity->State), Entity->AssetId.FileNode.Name); + DoEditorUi(Ui, EntityWindow, Entity, Label, u32(Hash(EntityWindow)) ); } PushTableEnd(Ui); - PushWindowEnd(Ui, &EntityWindow); + PushWindowEnd(Ui, EntityWindow); } #endif @@ -46,14 +47,14 @@ DoEntityWindow(engine_resources *Engine) { DrawEntityCollisionVolume(SelectedEntity, &GpuMap->Buffer, Graphics, World->ChunkDim, RGB_WHITE); - local_persist window_layout EntityWindow = WindowLayout("Entity", WindowLayoutFlag_Align_Right); + window_layout *EntityWindow = GetOrCreateWindow(Ui, "Entity Details", WindowLayoutFlag_Align_Right); - PushWindowStart(Ui, &EntityWindow); + PushWindowStart(Ui, EntityWindow); PushTableStart(Ui); - DoEditorUi(Ui, &EntityWindow, SelectedEntity, FSz("SelectedEntity (%d)", SelectedEntity->Id.Index)); + DoEditorUi(Ui, EntityWindow, SelectedEntity, FSz("SelectedEntity (%d)", SelectedEntity->Id.Index), u32(Hash(EntityWindow)) ); PushNewRow(Ui); PushTableEnd(Ui); - PushWindowEnd(Ui, &EntityWindow); + PushWindowEnd(Ui, EntityWindow); #if 0 @@ -254,7 +255,9 @@ link_internal void DoAssetWindow(engine_resources *Engine) { UNPACK_ENGINE_RESOURCES(Engine); + NotImplemented; +#if 0 { local_persist window_layout Window = WindowLayout("Assets"); @@ -460,6 +463,7 @@ DoAssetWindow(engine_resources *Engine) PushWindowEnd(Ui, &AssetViewWindow); } +#endif } #if 0 @@ -537,23 +541,23 @@ DoEngineDebug(engine_resources *Engine) if (ViewMode & EngineDebugViewMode_WorldChunks) { - local_persist window_layout WorldChunkWindow = WindowLayout("World Chunks"); + window_layout *WorldChunkWindow = GetOrCreateWindow(Ui, "World Chunks"); auto *PickedNode = EngineDebug->PickedNode; auto *PickedChunk = PickedNode ? PickedNode->Chunk : 0; - WorldChunkWindow.Title = PickedChunk ? + WorldChunkWindow->Title = PickedChunk ? FSz("World Chunk : (%p)", PickedChunk) : CSz("World Chunk"); - PushWindowStart(Ui, &WorldChunkWindow); + PushWindowStart(Ui, WorldChunkWindow); if ( Clicked(&EditorButtonGroup, CSz("WorldChunks")) || - Button(Ui, CSz("PickNewChunk"), UiId(&WorldChunkWindow, "PickWorldChunkButton", 0ull) ) ) + Button(Ui, CSz("PickNewChunk"), UiId(WorldChunkWindow, "PickWorldChunkButton", 0ull) ) ) { EngineDebug->PickedChunkState = PickedChunkState_Hover; } - /* if (Button(Ui, CSz("RebuildMesh"), UiId(&WorldChunkWindow, "RebuildMesh WorldChunkWindow", 0ull)) ) */ + /* if (Button(Ui, CSz("RebuildMesh"), UiId(WorldChunkWindow, "RebuildMesh WorldChunkWindow", 0ull)) ) */ /* { */ /* MakeFaceMasks_NoExteriorFaces(PickedChunk->Occupancy, PickedChunk->xOccupancyBorder, PickedChunk->FaceMasks, PickedChunk->Voxels, PickedChunk->Dim, {}, PickedChunk->Dim); */ /* QueueChunkForMeshRebuild(&Plat->LowPriority, PickedChunk); */ @@ -571,10 +575,10 @@ DoEngineDebug(engine_resources *Engine) if (EngineDebug->PickedNode) { - DoEditorUi(Ui, &WorldChunkWindow, EngineDebug->PickedNode, {}); + DoEditorUi(Ui, WorldChunkWindow, EngineDebug->PickedNode, {}, u32(Hash(WorldChunkWindow))); } - PushWindowEnd(Ui, &WorldChunkWindow); + PushWindowEnd(Ui, WorldChunkWindow); } #if 1 @@ -657,12 +661,12 @@ DoEngineDebug(engine_resources *Engine) if (ViewMode & EngineDebugViewMode_RenderSettings) { v2 WindowDim = {{1200.f, 250.f}}; - local_persist window_layout RenderSettingsWindow = WindowLayout("Graphics Settings", WindowLayoutFlag_Align_Right); + window_layout *RenderSettingsWindow = GetOrCreateWindow(Ui, "Graphics Settings", WindowLayoutFlag_Align_Right); render_settings *Settings = &Graphics->Settings; - PushWindowStart(Ui, &RenderSettingsWindow); - DoEditorUi(Ui, &RenderSettingsWindow, Settings, {}); - PushWindowEnd(Ui, &RenderSettingsWindow); + PushWindowStart(Ui, RenderSettingsWindow); + DoEditorUi(Ui, RenderSettingsWindow, Settings, {}, u32(Hash(RenderSettingsWindow))); + PushWindowEnd(Ui, RenderSettingsWindow); } if (ViewMode & EngineDebugViewMode_EngineDebug) @@ -670,16 +674,16 @@ DoEngineDebug(engine_resources *Engine) v2 WindowDim = {{1200.f, 250.f}}; { - local_persist window_layout Window = WindowLayout("Engine Debug", WindowLayoutFlag_Align_Right); - PushWindowStart(Ui, &Window); - DoEditorUi(Ui, &Window, EngineDebug, {}); - PushWindowEnd(Ui, &Window); + window_layout *Window = GetOrCreateWindow(Ui, "Engine Debug", WindowLayoutFlag_Align_Right); + PushWindowStart(Ui, Window); + DoEditorUi(Ui, Window, EngineDebug, {}, u32(Hash(Window)) ); + PushWindowEnd(Ui, Window); } { - local_persist window_layout Window = WindowLayout("Engine"); - PushWindowStart(Ui, &Window); - DoEditorUi(Ui, &Window, Engine, {}); - PushWindowEnd(Ui, &Window); + window_layout *Window = GetOrCreateWindow(Ui, "Engine"); + PushWindowStart(Ui, Window); + DoEditorUi(Ui, Window, Engine, {}, u32(Hash(Window))); + PushWindowEnd(Ui, Window); } DoGraphicsDebugWindow(Engine); diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 881660497..00dd4dcd3 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -198,8 +198,9 @@ poof(do_editor_ui_for_container(ui_toggle_hashtable)) link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { +#if 0 if (Element) { if (ToggleButton(Ui, FSz("v %s", Element->Name), FSz("> %s", Element->Name), UiId(Window, "toggle shader_uniform", Element), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) @@ -240,6 +241,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform *Element, cs N } PushNewRow(Ui); +#else + NotImplemented; +#endif } poof(do_editor_ui_for_container(shader_uniform_buffer)) #include @@ -345,6 +349,7 @@ poof(do_editor_ui_for_compound_type(bonsai_futex)) poof(do_editor_ui_for_compound_type(untextured_3d_geometry_buffer)) #include +#if 0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, geo_u3d **ElementP, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { @@ -359,6 +364,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, geo_u3d **ElementP, cs Name, PushNewRow(Ui); } } +#endif poof(do_editor_ui_for_compound_type(plane)) #include @@ -468,10 +474,10 @@ poof(do_editor_ui_for_compound_type(file_traversal_node)) // @dirty_entity_P_format_hack // link_internal void -DoEditorUi_entity_P(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Column) +DoEditorUi_entity_P(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Column) { - DoEditorUi(Ui, Window, &Element->P.WorldP, CSz("WorldP"), Params); - DoEditorUi(Ui, Window, &Element->P.Offset, CSz("Offset"), Params, 0.f, 32.f); + DoEditorUi(Ui, Window, &Element->P.WorldP, CSz("WorldP"), ParentHash, Params); + DoEditorUi(Ui, Window, &Element->P.Offset, CSz("Offset"), ParentHash, Params, 0.f, 32.f); } poof(do_editor_ui_for_compound_type(entity_id)) @@ -882,6 +888,7 @@ GetHotVoxelForEditMode(engine_resources *Engine, world_edit_blend_mode WorldEdit return Result; } +#if 0 link_internal void BrushSettingsForNoiseBrush(engine_resources *Engine, window_layout *Window, noise_layer *Layer) { @@ -918,6 +925,7 @@ BrushSettingsForNoiseBrush(engine_resources *Engine, window_layout *Window, nois } PushTableEnd(Ui); } +#endif link_internal cs GetFilenameForBrush(cs Name, s32 Version = 0) @@ -1016,6 +1024,8 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ { UNPACK_ENGINE_RESOURCES(Engine); + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(u32(u64(BrushSettingsWindow))); + PushWindowStart(Ui, BrushSettingsWindow); Assert(Brush); { @@ -1125,7 +1135,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ TextBox(Ui, CSz("BrushName"), NameBuf, NameBuf_Len, TextBoxId); PushNewRow(Ui); - DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->LayerCount, CSz("Layer Count"), &DefaultUiRenderParams_Generic); + DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->LayerCount, CSz("Layer Count"), ThisHash, &DefaultUiRenderParams_Generic); // Clamp LayerCount to (1,MAX_BRUSH_LAYERS) once it's set LayeredBrush->LayerCount = Max(LayeredBrush->LayerCount, 1); LayeredBrush->LayerCount = Min(LayeredBrush->LayerCount, MAX_BRUSH_LAYERS); @@ -1140,7 +1150,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } { - DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->AffectExisting, CSz("AffectExisting"), &DefaultUiRenderParams_Checkbox); + DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->AffectExisting, CSz("AffectExisting"), ThisHash, &DefaultUiRenderParams_Checkbox); PushNewRow(Ui); /* DoEditorUi(Ui, BrushSettingsWindow, &LayeredBrush->BrushFollowsCursor, CSz("BrushFollowsCursor"), &DefaultUiRenderParams_Checkbox); */ @@ -1161,7 +1171,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ { brush_layer *BrushLayer = BrushLayers + LayerIndex; - ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", u32(LayerIndex)); + ui_id ToggleId = UiId(BrushSettingsWindow, "brush_layer toggle interaction", u32(LayerIndex), ThisHash); cs LayerDetails = GetLayerUiText(BrushLayer, GetTranArena()); if (ToggleButton(Ui, FSz("v %d %S", LayerIndex, LayerDetails), FSz("> %d %S", LayerIndex, LayerDetails), ToggleId)) @@ -1198,7 +1208,7 @@ DoBrushSettingsWindow(engine_resources *Engine, world_edit_brush *Brush, window_ } OPEN_INDENT_FOR_TOGGLEABLE_REGION(); - DoEditorUi(Ui, BrushSettingsWindow, BrushLayer, {}); + DoEditorUi(Ui, BrushSettingsWindow, BrushLayer, {}, ThisHash); CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } else @@ -1457,7 +1467,7 @@ ColorIndexToV3(u16 ColorIndex) link_internal void -DoColorPickerSection(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, u32 HSVElementIndex, u32 Slices, v2 WidgetDim) +DoColorPickerSection(renderer_2d *Ui, window_layout *Window, u32 ThisHash, v3 *HSVDest, u32 HSVElementIndex, u32 Slices, v2 WidgetDim) { v2 QuadDim = V2(WidgetDim.x/r32(Slices), WidgetDim.y); v4 Padding = V4(0); @@ -1475,7 +1485,7 @@ DoColorPickerSection(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, u32 HS b32 Selected = Value == CurrentValue; ui_style Style = FlatUiStyle(RGB); - ui_id Id = UiId(Window, Cast(void*, "ColorPicker value button"), Cast(void*, HSVDest), Cast(void*, u64(ColorIndex) | u64(HSVElementIndex<<16))); + ui_id Id = UiId( Window, "ColorPicker value button", u32(u64(HSVDest)), ThisHash ^ u32(u64(Cast(void*, u64(ColorIndex) | u64(HSVElementIndex<<16)))) ); interactable_handle ColorPickerButton = PushButtonStart(Ui, Id); PushUntexturedQuad(Ui, {}, QuadDim, zDepth_Text, &Style, Padding ); @@ -1504,12 +1514,12 @@ DoColorPickerSection(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, u32 HS } link_internal void -DoColorPicker(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch) +DoColorPicker(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch, u32 ParentHash) { - /* u8 FourBits = 0b1111; */ + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ u32(u64(HSVDest))); + u8 FiveBits = 0b11111; u8 SixBits = 0b111111; - /* u8 EightBits = 0b11111111; */ u16 HueSlices = SixBits; u16 SaturationSlices = FiveBits; @@ -1517,9 +1527,9 @@ DoColorPicker(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColor v2 ColorPickerSectionDim = V2(256, 30); - DoColorPickerSection(Ui, Window, HSVDest, 0, HueSlices, ColorPickerSectionDim); - DoColorPickerSection(Ui, Window, HSVDest, 1, SaturationSlices, ColorPickerSectionDim); - DoColorPickerSection(Ui, Window, HSVDest, 2, ValueSlices, ColorPickerSectionDim); + DoColorPickerSection(Ui, Window, ThisHash, HSVDest, 0, HueSlices, ColorPickerSectionDim); + DoColorPickerSection(Ui, Window, ThisHash, HSVDest, 1, SaturationSlices, ColorPickerSectionDim); + DoColorPickerSection(Ui, Window, ThisHash, HSVDest, 2, ValueSlices, ColorPickerSectionDim); PushNewRow(Ui); @@ -1541,22 +1551,24 @@ DoColorPicker(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColor } link_internal void -DoColorPickerToggle(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch) +DoColorPickerToggle(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch, u32 ParentHash) { - ui_id InteractionId = UiId(Window, "ColorPicker toggle button", HSVDest); + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ u32(u64(HSVDest))); + + ui_id InteractionId = UiId(Window, "ColorPicker toggle button", HSVDest, ThisHash); u32 ColumnIndex = StartColumn(Ui); if (ToggledOn(Ui, InteractionId)) { // NOTE(Jesse): Gotta use a discrete button id for this - if (Button(Ui, CSz("Done"), UiId(Window, "ColorPicker toggle close", HSVDest))) { SetToggleButton(Ui, InteractionId, False); } + if (Button(Ui, CSz("Done"), UiId(Window, "ColorPicker toggle close", HSVDest, ThisHash))) { SetToggleButton(Ui, InteractionId, False); } PushNewRow(Ui); - DoColorPicker(Ui, Window, HSVDest, ShowColorSwatch); + DoColorPicker(Ui, Window, HSVDest, ShowColorSwatch, ParentHash); } else { ui_style BStyle = UiStyleFromLightestColor(HSVtoRGB(*HSVDest)); - interactable_handle Handle = ToggleButtonStart(Ui, InteractionId, &BStyle); //, Padding, AlignFlags); + ToggleButtonStart(Ui, InteractionId, &BStyle); //, Padding, AlignFlags); v2 Dim = V2(25); PushUntexturedQuad(Ui, V2(0), Dim, zDepth_Text, &BStyle); ToggleButtonEnd(Ui); diff --git a/src/engine/editor.h b/src/engine/editor.h index 20df6b71a..5243a323b 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -226,8 +226,10 @@ poof( type_list.map(type) { link_internal void - DoEditorUi(renderer_2d *Ui, window_layout *Window, type.name *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) + DoEditorUi(renderer_2d *Ui, window_layout *Window, type.name *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x(type.hash)); + type.member(0, (E) { /* PushTableStart(Ui); */ @@ -239,7 +241,7 @@ poof( PushTableStart(Ui); E.map_array(e_index) { - DoEditorUi(Ui, Window, &Value->(E.name)[e_index], {}, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + DoEditorUi(Ui, Window, &Value->(E.name)[e_index], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); } PushTableEnd(Ui); /* PushNewRow(Ui); */ @@ -259,8 +261,10 @@ poof( type_list.map(type) { link_internal void - DoEditorUi(renderer_2d *Ui, window_layout *Window, type.name *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) + DoEditorUi(renderer_2d *Ui, window_layout *Window, type.name *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x(type.hash)); + Params = Params ? Params : &DefaultUiRenderParams_Blank; if (Name.Count) { PushColumn(Ui, Name, &DefaultUiRenderParams_Column); } @@ -269,9 +273,9 @@ poof( { u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); - if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } + if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value - 1; } PushColumn(Ui, CS(*Value), &DefaultUiRenderParams_Generic); - if (Button(Ui, CSz("+"), UiId(Window, "increment", Value), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } + if (Button(Ui, CSz("+"), UiId(Window, "increment", Value, ThisHash), &DefaultUiRenderParams_Button)) { *Value = *Value + 1; } PushTableEnd(Ui); EndColumn(Ui, Start); } @@ -283,12 +287,6 @@ poof( } - link_internal void - DoEditorUi(renderer_2d *Ui, window_layout *Window, volatile type.name *Value, cs Name, ui_render_params *Params) - { - DoEditorUi(Ui, Window, ((type.name)*) Value, Name, Params); - } - } } ) @@ -297,8 +295,10 @@ poof( func do_editor_ui_for_compound_type(type) { link_internal void - DoEditorUi(renderer_2d *Ui, window_layout *Window, type.name *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) + DoEditorUi(renderer_2d *Ui, window_layout *Window, type.name *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x(type.hash)); + if (Element) { // NOTE(Jesse): This is wacky as fuck, but it's a pretty easy way to support @@ -307,7 +307,7 @@ poof( b32 DidToggle = False; if (Name.Count) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle type.name", Element), Params)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, "toggle type.name", Element, ThisHash), Params)) { DidToggle = True; PushNewRow(Ui); @@ -339,14 +339,18 @@ poof( member.has_tag(ui_construct_as)? { auto Value = member.tag_value(ui_construct_as)(Element->member.name); - DoEditorUi(Ui, Window, &Value, MemberName, Params); + DoEditorUi(Ui, Window, &Value, MemberName, ThisHash, Params); } { member.is_array? { member.has_tag(ui_display_name)? {poof_error(ui_display_name tag is incompatible with array members )} - if (ToggleButton(Ui, CSz("v member.name[member.array]"), CSz("> member.name[member.array]"), UiId(Window, "toggle type.name member.type member.name", Element->(member.name)), Params )) + if (ToggleButton(Ui, + CSz("v member.name[member.array]"), + CSz("> member.name[member.array]"), + UiId(Window, "toggle type.name member.type member.name", Element->(member.name), ThisHash), + Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); @@ -357,7 +361,12 @@ poof( member.tag_value(custom_ui); } { - DoEditorUi(Ui, Window, Element->(member.name)+ArrayIndex, FSz("member.name[%d]", ArrayIndex), Params); + DoEditorUi(Ui, + Window, + Element->(member.name)+ArrayIndex, + FSz("member.name[%d]", ArrayIndex), + ThisHash, + Params); } member.is_primitive? { PushNewRow(Ui); } } @@ -377,6 +386,7 @@ poof( Window, Cast(b8*, member.is_pointer?{}{&}Element->(member.name)), MemberName, + ThisHash, &DefaultUiRenderParams_Checkbox member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); } @@ -390,6 +400,7 @@ poof( // Cast to remove const/volatile keywords if they're there Cast((member.type)*, member.is_pointer?{}{&}Element->(member.name)), MemberName, + ThisHash, Params member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); } @@ -406,6 +417,7 @@ poof( // Cast to remove const/volatile keywords if they're there Cast((member.type)*, member.is_pointer?{}{&}Element->(member.name)), MemberName, + ThisHash, Params member.has_tag(ui_value_range)?{, member.tag_value(ui_value_range) }); } @@ -451,19 +463,21 @@ poof( } { link_internal void - DoEditorUi(renderer_2d *Ui, window_layout *Window, enum_t.name *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) + DoEditorUi(renderer_2d *Ui, window_layout *Window, enum_t.name *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x(enum_t.hash)); + if (Name.Count) { PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Column); } cs ElementName = ToStringPrefixless(*Element); - ui_id ToggleButtonId = UiId(Window, "enum value.type value.name", Element); + ui_id ToggleButtonId = UiId(Window, "toggle enum_t.name", Element, ThisHash); if (ToggleButton(Ui, ElementName, ElementName, ToggleButtonId, Params)) { PushNewRow(Ui); enum_t.map(value) { if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column - if (Button(Ui, CSz("value.name.strip_all_prefix"), UiId(Window, "enum value.name", Element), Params)) + if (Button(Ui, CSz("value.name.strip_all_prefix"), UiId(Window, "enum value.name", Element, ThisHash), Params)) { enum_t.has_tag(bitfield)? { @@ -505,16 +519,18 @@ poof( func do_editor_ui_for_container(type) { link_internal void - DoEditorUi(renderer_2d *Ui, window_layout *Window, type.name *Container, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) + DoEditorUi(renderer_2d *Ui, window_layout *Window, type.name *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ 0x(type.hash)); + if (Container) { - if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) + if (ToggleButton(Ui, FSz("v %S", Name), FSz("> %S", Name), UiId(Window, Name.Start, Container, ThisHash), EDITOR_UI_FUNCTION_INSTANCE_NAMES)) { PushNewRow(Ui); IterateOver(Container, Element, ElementIndex) { - DoEditorUi(Ui, Window, Element, CS(ElementIndex), EDITOR_UI_FUNCTION_INSTANCE_NAMES); + DoEditorUi(Ui, Window, Element, CS(ElementIndex), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); PushNewRow(Ui); } } @@ -541,6 +557,7 @@ poof( window_layout *Window, enum_t.name *Element, cs GroupName, + u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) { @@ -592,17 +609,19 @@ DebugSlider(renderer_2d *Ui, window_layout *Window, r32 *Value, cs Name, r32 Min } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, r32 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, r32 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ u32(u64(Name.Start))); + if (Name.Count) { PushColumn(Ui, Name, &DefaultUiRenderParams_Blank); } u32 Start = StartColumn(Ui, &DefaultUiRenderParams_Blank); PushTableStart(Ui); if (Value) { - if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value))) { *Value = *Value - 1.f; } + if (Button(Ui, CSz("-"), UiId(Window, "decrement", Value, ThisHash))) { *Value = *Value - 1.f; } DebugSlider(Ui, Window, Value, {}, MinValue, MaxValue); - if (Button(Ui, CSz("+"), UiId(Window, "increment", Value))) { *Value = *Value + 1.f; } + if (Button(Ui, CSz("+"), UiId(Window, "increment", Value, ThisHash))) { *Value = *Value + 1.f; } } else { @@ -613,11 +632,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, r32 *Value, cs Name, ui_rende } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, b8 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Checkbox) +DoEditorUi(renderer_2d *Ui, window_layout *Window, b8 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Checkbox) { UNPACK_UI_RENDER_PARAMS(Params); - interactable_handle ButtonHandle = PushButtonStart(Ui, UiId(Window, "toggle", Value), BStyle); + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ u32(u64(Name.Start))); + + interactable_handle ButtonHandle = PushButtonStart(Ui, UiId(Window, "toggle", Value, ThisHash), BStyle); PushColumn(Ui, CS(Name), &DefaultUiRenderParams_Generic); @@ -644,7 +665,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, b8 *Value, cs Name, ui_render } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, cs *Value, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, cs *Value, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { PushColumn(Ui, CS(Name), EDITOR_UI_FUNCTION_INSTANCE_NAMES); Value ? @@ -653,8 +674,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, cs *Value, cs Name, EDITOR_UI } link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, void *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Column) +DoEditorUi(renderer_2d *Ui, window_layout *Window, void *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Column) { + /* u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ u32(Name.Start)); */ if (Name.Count) { PushColumn(Ui, CS(Name), Params); } Value ? PushColumn(Ui, FSz("0x%x",umm(Value)), &DefaultUiRenderParams_Column) : @@ -668,10 +690,12 @@ poof(do_editor_ui_for_vector_type({v4i v4 v3i v3 v2i v2 Quaternion m4})); link_internal void -DoEditorUi(renderer_2d *Ui, window_layout *Window, cp *Value, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) +DoEditorUi(renderer_2d *Ui, window_layout *Window, cp *Value, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { - DoEditorUi(Ui, Window, &Value->WorldP, CSz("WorldP")); - DoEditorUi(Ui, Window, &Value->Offset, CSz("Offset")); + u32 ThisHash = ChrisWellonsIntegerHash_lowbias32(ParentHash ^ u32(u64(Name.Start))); + + DoEditorUi(Ui, Window, &Value->WorldP, CSz("WorldP"), ThisHash, Params); + DoEditorUi(Ui, Window, &Value->Offset, CSz("Offset"), ThisHash, Params); } poof(string_and_value_tables(maybe_tag)) @@ -1153,7 +1177,7 @@ struct brush_settings v3i NoiseBasisOffset; poof(@ui_skip) // NOTE(Jesse): The color picker operates in HSV, so we need this to be HSV for now - v3 HSVColor = DEFAULT_HSV_COLOR; poof(@custom_ui(PushColumn(Ui, CSz("HSVColor")); DoColorPickerToggle(Ui, Window, &Element->HSVColor, False))) + v3 HSVColor = DEFAULT_HSV_COLOR; poof(@custom_ui(PushColumn(Ui, CSz("HSVColor")); DoColorPickerToggle(Ui, Window, &Element->HSVColor, False, ThisHash))) }; poof(are_equal(brush_settings)) @@ -1538,10 +1562,10 @@ link_internal void ColorPickerModal(engine_resources *Engine, ui_id ModalId, v3 *HSVDest, b32 ShowColorSwatch = True); link_internal void -DoColorPicker(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch); +DoColorPicker(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch, u32 ParentHash); link_internal void -DoColorPickerToggle(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch); +DoColorPickerToggle(renderer_2d *Ui, window_layout *Window, v3 *HSVDest, b32 ShowColorSwatch, u32 ParentHash); link_internal sort_key_buffer GetEditsSortedByOrdianl(world_edit_block_array *Edits, memory_arena *TempMem); diff --git a/src/engine/entity.h b/src/engine/entity.h index f78e69ac1..9bc11c8d0 100644 --- a/src/engine/entity.h +++ b/src/engine/entity.h @@ -59,7 +59,7 @@ struct entity_position_info link_weak b32 EntityUserDataSerialize(u8_cursor_block_array *, u64 UserType, u64 UserData); link_weak b32 EntityUserDataDeserialize(u8_cursor *, u64 *UserType, u64 *UserData, memory_arena*); -link_weak void EntityUserDataEditorUi(renderer_2d *Ui, window_layout *Window, u64 *UserType, u64 *UserData, cs Name, EDITOR_UI_FUNCTION_PROTO_DEFAULTS); +link_weak void EntityUserDataEditorUi(renderer_2d *Ui, window_layout *Window, u64 *UserType, u64 *UserData, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS); struct entity poof(@version(2)) { @@ -74,7 +74,7 @@ struct entity poof(@version(2)) // // @dirty_entity_P_format_hack // - cp P; poof(@custom_ui(DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANCE_NAMES))) + cp P; poof(@custom_ui(DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES))) v3 EulerAngles; poof(@ui_value_range(-PI32, PI32)) r32 Scale; @@ -103,8 +103,8 @@ struct entity poof(@version(2)) u64 UserType; poof( - @custom_ui( if (EntityUserDataEditorUi) {EntityUserDataEditorUi(Ui, Window, &Element->UserType, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES);} - else {DoEditorUi(Ui, Window, &Element->UserType, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } + @custom_ui( if (EntityUserDataEditorUi) {EntityUserDataEditorUi(Ui, Window, &Element->UserType, &Element->UserData, Name, ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES);} + else {DoEditorUi(Ui, Window, &Element->UserType, Name, ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } ) ) @@ -114,7 +114,7 @@ struct entity poof(@version(2)) @custom_deserialize(if (EntityUserDataDeserialize) {Result &= EntityUserDataDeserialize(Bytes, &Element->UserType, &Element->UserData, Memory);}) @custom_ui( if (EntityUserDataEditorUi) { /* User took control, skip this because it's intended */ } - else {DoEditorUi(Ui, Window, &Element->UserData, Name, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } + else {DoEditorUi(Ui, Window, &Element->UserData, Name, ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES); } ) ) }; @@ -132,7 +132,7 @@ struct entity_1 // // @dirty_entity_P_format_hack // - cp P; poof(@custom_ui(DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANCE_NAMES))) + cp P; poof(@custom_ui(DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES))) v3 EulerAngles; poof(@ui_value_range(-180.f, 180.f)) r32 Scale; @@ -179,7 +179,7 @@ struct entity_0 // // @dirty_entity_P_format_hack // - cp P; poof(@custom_ui(DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), EDITOR_UI_FUNCTION_INSTANCE_NAMES))) + cp P; poof(@custom_ui(DoEditorUi_entity_P(Ui, Window, Element, CSz("cp P"), ThisHash, EDITOR_UI_FUNCTION_INSTANCE_NAMES))) v3 EulerAngles; poof(@ui_value_range(-180.f, 180.f)) r32 Scale; diff --git a/src/engine/render_settings.h b/src/engine/render_settings.h index cc3d6c4cc..2451422e5 100644 --- a/src/engine/render_settings.h +++ b/src/engine/render_settings.h @@ -18,17 +18,17 @@ struct lighting_settings v3 SunP; poof(@ui_skip) f32 DawnIntensity; poof(@ui_value_range(0.f, 3.f)) - v3 DawnHSV; poof(@custom_ui(PushColumn(Ui, CSz("DawnColor")); DoColorPickerToggle(Ui, Window, &Element->DawnHSV, False))) + v3 DawnHSV; poof(@custom_ui(PushColumn(Ui, CSz("DawnColor")); DoColorPickerToggle(Ui, Window, &Element->DawnHSV, False, ThisHash))) f32 SunIntensity; poof(@ui_value_range(0.f, 3.f)) - v3 SunHSV; poof(@custom_ui(PushColumn(Ui, CSz("SunColor")); DoColorPickerToggle(Ui, Window, &Element->SunHSV, False))) + v3 SunHSV; poof(@custom_ui(PushColumn(Ui, CSz("SunColor")); DoColorPickerToggle(Ui, Window, &Element->SunHSV, False, ThisHash))) f32 DuskIntensity; poof(@ui_value_range(0.f, 3.f)) v3 DuskColor; - v3 DuskHSV; poof(@custom_ui(PushColumn(Ui, CSz("DuskColor")); DoColorPickerToggle(Ui, Window, &Element->DuskHSV, False))) + v3 DuskHSV; poof(@custom_ui(PushColumn(Ui, CSz("DuskColor")); DoColorPickerToggle(Ui, Window, &Element->DuskHSV, False, ThisHash))) f32 MoonIntensity; poof(@ui_value_range(0.f, 3.f)) - v3 MoonHSV; poof(@custom_ui(PushColumn(Ui, CSz("MoonColor")); DoColorPickerToggle(Ui, Window, &Element->MoonHSV, False))) + v3 MoonHSV; poof(@custom_ui(PushColumn(Ui, CSz("MoonColor")); DoColorPickerToggle(Ui, Window, &Element->MoonHSV, False, ThisHash))) // Computed from the above parameters and passed to the shader v3 CurrentSunColor; diff --git a/src/engine/world.h b/src/engine/world.h index 527df9c19..925ffce49 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -48,7 +48,7 @@ struct octree_node // NOTE(Jesse): Took the union out because the UI doesn't know how to deal.. /* union { */ - octree_node *Children[8]; poof(@custom_ui(if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[ArrayIndex], CSz("Child"), Params);})) + octree_node *Children[8]; poof(@custom_ui(if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[ArrayIndex], CSz("Child"), ThisHash, Params);})) octree_node *Next; // NOTE(Jesse): Freelist Next /* }; */ From ceb7aac298ac304abcc3caed55714ea8399508da Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 17 Oct 2025 10:27:33 -0700 Subject: [PATCH 355/421] Add runtime check for Queue in asyncify_render_function --- examples/terrain_gen/game.cpp | 11 ----------- .../anonymous_async_function_call_type_rQAZtEUA.h | 2 +- generated/d_union_constructors_work_queue_entry.h | 2 +- generated/d_union_work_queue_entry.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 2 +- generated/for_datatypes_cx51CcgQ.h | 11 ++++++++++- generated/for_datatypes_fkubhsYl.h | 2 +- generated/for_datatypes_khY6kwEk.h | 2 +- generated/for_datatypes_kv3WBTai.h | 2 +- src/engine/work_queue.h | 3 +++ 10 files changed, 20 insertions(+), 19 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 45365dcd1..0bc8ce025 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -92,17 +92,6 @@ BONSAI_API_MAIN_THREAD_CALLBACK() PushWindowEnd(Ui, Window); } - easing_function Test = { - .Name = CSz("Test"), - .Points = { - .Start = { - V2(0,0), - V2(1,1), - }, - .At = 2, - }, - }; - { global_variable window_layout Window = WindowLayout("Terrain Shaping Shader", WindowLayoutFlag_Align_Right); PushWindowStart(Ui, &Window); diff --git a/generated/anonymous_async_function_call_type_rQAZtEUA.h b/generated/anonymous_async_function_call_type_rQAZtEUA.h index 3a7ad61df..2d3a08e93 100644 --- a/generated/anonymous_async_function_call_type_rQAZtEUA.h +++ b/generated/anonymous_async_function_call_type_rQAZtEUA.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:291:0 +// src/engine/work_queue.h:294:0 { tmatch( initialize_easing_function_visualizer_render_pass_async_params, Task, Job ); diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 7a410cd98..40622a62e 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:239:0 +// src/engine/work_queue.h:242:0 link_internal work_queue_entry diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index c7e5be3b0..9bef40fc5 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:208:0 +// src/engine/work_queue.h:211:0 enum work_queue_entry_type { diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index c75b48bbe..6a27f3976 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:245:0 +// src/engine/work_queue.h:248:0 diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h index 90887b5bf..d71f79238 100644 --- a/generated/for_datatypes_cx51CcgQ.h +++ b/generated/for_datatypes_cx51CcgQ.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:269:0 +// src/engine/work_queue.h:272:0 @@ -2305,6 +2305,9 @@ link_internal void CompileShaderPair_Async(work_queue *Queue, shader *Shader , cs VertShaderPath , cs FragShaderPath , b32 DumpErrors , b32 RegisterForHotReload , b32* Result ) { + // Make sure we don't accidentally pass something that's not the render queue + Assert(Queue == &GetStdlib()->Plat.RenderQ); + compile_shader_pair_async_params Params = { Result, Shader, VertShaderPath, FragShaderPath, DumpErrors, RegisterForHotReload, @@ -2890,6 +2893,9 @@ DoJob(compile_shader_pair_async_params *Params) link_internal void InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_function_visualizer_render_pass *Element , v2 *Points , u32 *Count , b32* Result ) { + // Make sure we don't accidentally pass something that's not the render queue + Assert(Queue == &GetStdlib()->Plat.RenderQ); + initialize_easing_function_visualizer_render_pass_async_params Params = { Result, Element, Points, Count, @@ -5295,6 +5301,9 @@ DoJob(initialize_easing_function_visualizer_render_pass_async_params *Params) link_internal void DrawLod_Async(work_queue *Queue, engine_resources *Engine , shader *Shader , gpu_mapped_element_buffer *Mesh , v3 Basis , Quaternion Rotation , v3 Scale ) { + // Make sure we don't accidentally pass something that's not the render queue + Assert(Queue == &GetStdlib()->Plat.RenderQ); + draw_lod_async_params Params = { Engine, Shader, Mesh, Basis, Rotation, Scale, diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 70ccc2b16..4d2fdb9ac 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:191:0 +// src/engine/work_queue.h:194:0 diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h index 87959365f..a7589621a 100644 --- a/generated/for_datatypes_khY6kwEk.h +++ b/generated/for_datatypes_khY6kwEk.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:150:0 +// src/engine/work_queue.h:153:0 diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index ca17f1d22..718c14104 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:172:0 +// src/engine/work_queue.h:175:0 diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index 8396eb4bb..31b7b14d4 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -128,6 +128,9 @@ poof( link_internal void (func_t.name)_Async(work_queue *Queue, func_t.map(arg).sep(,) { arg } func_t.value? { , func_t.value* Result }) { + // Make sure we don't accidentally pass something that's not the render queue + Assert(Queue == &GetStdlib()->Plat.RenderQ); + (func_t.name.to_snake_case)_async_params Params = { func_t.value? { Result, } func_t.map(arg) { arg.name, } From bc919586dbea462091ea3ed01c020e99e786e474 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sat, 18 Oct 2025 09:23:56 -0700 Subject: [PATCH 356/421] Add ctags.sh --- ctags.sh | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 ctags.sh diff --git a/ctags.sh b/ctags.sh new file mode 100644 index 000000000..55389060e --- /dev/null +++ b/ctags.sh @@ -0,0 +1,4 @@ +#! /usr/bin/env bash + +# This tells ctags abouit the poof macro, which frequently confuses its parser +ctags -R -I poof+ . From 1c0e433a586dbf387be0592f304e4b340e902702 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 22 Oct 2025 12:42:53 -0700 Subject: [PATCH 357/421] Update poof; for_datatypes changes --- examples/terrain_gen/game.cpp | 10 +- external/bonsai_stdlib | 2 +- ...nymous_async_function_call_type_rQAZtEUA.h | 6 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../d_union_constructors_work_queue_entry.h | 2 +- generated/d_union_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_asset.h | 2 +- .../do_editor_ui_for_compound_type_asset_id.h | 2 +- ..._editor_ui_for_compound_type_brush_layer.h | 2 +- ...o_editor_ui_for_compound_type_chunk_data.h | 2 +- ...tor_ui_for_compound_type_collision_event.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 6 +- ...editor_ui_for_compound_type_engine_debug.h | 2 +- ...or_ui_for_compound_type_engine_resources.h | 2 +- ...tor_ui_for_compound_type_engine_settings.h | 2 +- .../do_editor_ui_for_compound_type_entity.h | 2 +- ...do_editor_ui_for_compound_type_entity_id.h | 2 +- ...i_for_compound_type_entity_position_info.h | 2 +- ...ui_for_compound_type_file_traversal_node.h | 2 +- ..._for_compound_type_g_buffer_render_group.h | 2 +- ..._editor_ui_for_compound_type_game_lights.h | 2 +- ...compound_type_gpu_element_buffer_handles.h | 2 +- ..._compound_type_gpu_mapped_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 2 +- ...r_ui_for_compound_type_graphics_settings.h | 2 +- ...ditor_ui_for_compound_type_layered_brush.h | 2 +- ...editor_ui_for_compound_type_level_editor.h | 2 +- ..._for_compound_type_lighting_render_group.h | 2 +- ..._ui_for_compound_type_lod_element_buffer.h | 2 +- .../do_editor_ui_for_compound_type_model.h | 2 +- ..._editor_ui_for_compound_type_octree_node.h | 2 +- ...r_ui_for_compound_type_render_buffers_2d.h | 2 +- ...editor_ui_for_compound_type_render_debug.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 2 +- ...struct_terrain_decoration_render_context.h | 2 +- ...e_struct_terrain_finalize_render_context.h | 2 +- ...pe_struct_terrain_shaping_render_context.h | 2 +- ...or_compound_type_struct_world_edit_brush.h | 2 +- ...nd_type_struct_world_edit_render_context.h | 2 +- .../do_editor_ui_for_compound_type_ui_debug.h | 2 +- .../do_editor_ui_for_compound_type_vox_data.h | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 2 +- ...itor_ui_for_compound_type_voxel_lighting.h | 2 +- .../do_editor_ui_for_compound_type_world.h | 2 +- ..._editor_ui_for_compound_type_world_chunk.h | 2 +- ...mpound_type_world_edit_block_array_index.h | 2 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 220 +- generated/for_datatypes_Bxw4Q7AW.h | 232 +- generated/for_datatypes_IXWy6K9V.h | 218 +- generated/for_datatypes_cx51CcgQ.h | 5352 +---------------- generated/for_datatypes_fkubhsYl.h | 210 +- generated/for_datatypes_kh9dwrCf.h | 18 - generated/for_datatypes_khY6kwEk.h | 5288 +--------------- generated/for_datatypes_kv3WBTai.h | 210 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- make.sh | 21 +- src/engine/debug.cpp | 3 +- src/engine/editor.cpp | 6 +- src/engine/entity.h | 2 +- src/engine/graphics.h | 20 +- src/engine/work_queue.h | 21 +- src/poof_ctags_stub.cpp | 18 + 73 files changed, 196 insertions(+), 11775 deletions(-) create mode 100644 src/poof_ctags_stub.cpp diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 0bc8ce025..547b8d170 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -56,10 +56,16 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() InitializeEasingFunctionVisualizerRenderPass_Async( RenderQ, &GameState->EasingFunctionVisRP, - EasingFunction->Points.Start, - &EasingFunction->Points.At, + 0,0, 0); + /* InitializeEasingFunctionVisualizerRenderPass_Async( */ + /* RenderQ, */ + /* &GameState->EasingFunctionVisRP, */ + /* /1* EasingFunction->Points.Start, *1/ */ + /* /1* &EasingFunction->Points.At, *1/ */ + /* 0); */ + SpawnEntity(CameraGhost); return GameState; } diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index eb3c89a5d..b0dcaa944 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit eb3c89a5d1ca62e68b4abfd9442faa7eb02d204e +Subproject commit b0dcaa9440af2ebdc37657da3546a1c45f230ef7 diff --git a/generated/anonymous_async_function_call_type_rQAZtEUA.h b/generated/anonymous_async_function_call_type_rQAZtEUA.h index 2d3a08e93..ce3db6b98 100644 --- a/generated/anonymous_async_function_call_type_rQAZtEUA.h +++ b/generated/anonymous_async_function_call_type_rQAZtEUA.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:294:0 +// src/engine/work_queue.h:287:0 { tmatch( initialize_easing_function_visualizer_render_pass_async_params, Task, Job ); @@ -8,8 +8,4 @@ tmatch( compile_shader_pair_async_params, Task, Job ); DoJob(Job); } break; -{ - tmatch( draw_lod_async_params, Task, Job ); - DoJob(Job); -} break; diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 441211edc..b31b0ac2c 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:166:0 +// src/engine/graphics.h:174:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 450a46dbf..74dbbe223 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:155:0 +// src/engine/graphics.h:163:0 diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 40622a62e..1755ba679 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:242:0 +// src/engine/work_queue.h:238:0 link_internal work_queue_entry diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index 9bef40fc5..3bef84c95 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:211:0 +// src/engine/work_queue.h:207:0 enum work_queue_entry_type { diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index fbabd0e21..2f497e147 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:514:0 +// src/engine/editor.cpp:513:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 117b8e93b..372a3f9c5 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:506:0 +// src/engine/editor.cpp:505:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 4562695ef..0e9fde1dc 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:417:0 +// src/engine/editor.cpp:416:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index 77920fee4..bccfd8acd 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:447:0 +// src/engine/editor.cpp:446:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index 25de58b54..e47303c7e 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:517:0 +// src/engine/editor.cpp:516:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index a1cab7f45..987dc351a 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -453,7 +453,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - cs MemberName = CSz(""); + cs MemberName = CSz("(anonymous)"); @@ -464,7 +464,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - cs MemberName = CSz(""); + cs MemberName = CSz("(anonymous)"); @@ -475,7 +475,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name - cs MemberName = CSz(""); + cs MemberName = CSz("(anonymous)"); diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index ae24f6fc6..8d875b116 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:578:0 +// src/engine/editor.cpp:576:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index dc6c4fd30..617ba6e5b 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:599:0 +// src/engine/editor.cpp:597:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 4dcb86980..576995002 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:596:0 +// src/engine/editor.cpp:594:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index 765943f06..e72f9fb14 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:486:0 +// src/engine/editor.cpp:485:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 9ea1c3b8d..7b4427bf6 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:483:0 +// src/engine/editor.cpp:482:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index 4606105f6..d1c0b8286 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:520:0 +// src/engine/editor.cpp:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 69cde0606..9a551d5cc 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:471:0 +// src/engine/editor.cpp:470:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 6f17522fd..18b1f2a1e 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:554:0 +// src/engine/editor.cpp:552:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index a3175826d..1e6d67ba7 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:548:0 +// src/engine/editor.cpp:546:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 7727a1f0e..0eb244e47 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:453:0 +// src/engine/editor.cpp:452:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 4ea230913..8ea676795 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:456:0 +// src/engine/editor.cpp:455:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index fc35f6814..7a2c7585d 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:569:0 +// src/engine/editor.cpp:567:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index d30bd1176..51cb88f6f 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:593:0 +// src/engine/editor.cpp:591:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 6c4f37dac..884e64765 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:420:0 +// src/engine/editor.cpp:419:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 65f7e34c7..1e71b5c14 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:584:0 +// src/engine/editor.cpp:582:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 3192e02da..e448c5f98 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:551:0 +// src/engine/editor.cpp:549:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index 2ddc0a40c..bb51d0b3a 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:459:0 +// src/engine/editor.cpp:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index 5595a8cb9..e86807e8c 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:462:0 +// src/engine/editor.cpp:461:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index cd1835952..6bff6dca4 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:496:0 +// src/engine/editor.cpp:495:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index dc62dce90..c340e81dc 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:542:0 +// src/engine/editor.cpp:540:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index 4f5541c43..a9f13e8ba 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:572:0 +// src/engine/editor.cpp:570:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 8dc09be2f..798157bd7 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:545:0 +// src/engine/editor.cpp:543:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index c910b61eb..972b1f5cf 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:560:0 +// src/engine/editor.cpp:558:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 5b4d14097..ef2862e8d 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:563:0 +// src/engine/editor.cpp:561:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 0420b8da6..edda121d2 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:557:0 +// src/engine/editor.cpp:555:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 6d6bdef92..31dc3875e 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:423:0 +// src/engine/editor.cpp:422:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 4ca15e3e5..5587100ea 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:566:0 +// src/engine/editor.cpp:564:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index f87174d95..cd5bcb3bd 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:575:0 +// src/engine/editor.cpp:573:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index 0e5499e06..e4e510cbe 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:450:0 +// src/engine/editor.cpp:449:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index f61da2b1f..f46b048de 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:441:0 +// src/engine/editor.cpp:440:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 71f7d5319..26431a7b8 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:444:0 +// src/engine/editor.cpp:443:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 6ae061eeb..6372ae83a 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:499:0 +// src/engine/editor.cpp:498:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index effde782e..6e4294b23 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:493:0 +// src/engine/editor.cpp:492:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index 55e6c8cc8..53353eb7d 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:432:0 +// src/engine/editor.cpp:431:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 39a46066a..9b75653a0 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:490:0 +// src/engine/editor.cpp:489:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index d0fde10c7..e6f216259 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:465:0 +// src/engine/editor.cpp:464:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index 9c33b624c..2abfb0d08 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:435:0 +// src/engine/editor.cpp:434:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 048194513..9c937b917 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:511:0 +// src/engine/editor.cpp:510:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index ffbcd83c9..a9472f481 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:438:0 +// src/engine/editor.cpp:437:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index e361ce9e7..5f6a59e24 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:581:0 +// src/engine/editor.cpp:579:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 3997687b0..1b3d1430a 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:468:0 +// src/engine/editor.cpp:467:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index af2170ad2..11343268f 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:587:0 +// src/engine/editor.cpp:585:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 9d40cf8c1..259794dc7 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:590:0 +// src/engine/editor.cpp:588:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 6a27f3976..c00fda2ae 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,59 +1,4 @@ -// src/engine/work_queue.h:248:0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// src/engine/work_queue.h:244:0 @@ -548,139 +493,6 @@ WorkQueueEntryAsyncFunction( initialize_easing_function_visualizer_render_pass_a - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -757,36 +569,6 @@ WorkQueueEntryAsyncFunction( compile_shader_pair_async_params *Params ) - - - - - - - - - - - - - - - - - - - - -struct draw_lod_async_params; -link_internal work_queue_entry -WorkQueueEntryAsyncFunction( draw_lod_async_params *Params ) -{ - work_queue_entry Result = {}; - Result.Type = type_work_queue_entry_async_function_call; - Result.work_queue_entry_async_function_call.Type = type_draw_lod_async_params; - Result.work_queue_entry_async_function_call.draw_lod_async_params = *Params; - return Result; -} diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 7b2d72dfa..4ff48d1e6 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -1,6 +1,4 @@ -// src/engine/editor.cpp:528:0 - - +// src/engine/editor.cpp:527:0 @@ -301,86 +299,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function *Element, cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -580,10 +498,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, - - - - link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_render_pass *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -681,11 +595,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re - cs MemberName = CSz("Points"); + cs MemberName = CSz("Foo"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v2*, Element->Points), + Cast(u32*, &Element->Foo), MemberName, ThisHash, Params @@ -698,7 +612,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re - + PushNewRow(Ui); + } @@ -706,11 +621,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re - cs MemberName = CSz("Count"); + cs MemberName = CSz("Bar"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*, Element->Count), + Cast(u32*, &Element->Bar), MemberName, ThisHash, Params @@ -764,20 +679,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re - - - - - - - - - - - - - - @@ -1290,125 +1191,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/generated/for_datatypes_IXWy6K9V.h b/generated/for_datatypes_IXWy6K9V.h index f30afa3d1..a6254305d 100644 --- a/generated/for_datatypes_IXWy6K9V.h +++ b/generated/for_datatypes_IXWy6K9V.h @@ -1,6 +1,4 @@ -// src/engine/graphics.h:104:0 - - +// src/engine/graphics.h:113:0 @@ -553,31 +551,6 @@ UseShader( lighting_render_group *Element ) - - - - - - - - - - - - - - - - - - - - - - - - - @@ -747,10 +720,6 @@ UseShader( terrain_decoration_render_context *Element ) - - - - link_internal b32 poof() InitializeTerrainFinalizeRenderContext @@ -877,22 +846,6 @@ UseShader( terrain_finalize_render_context *Element ) - - - - - - - - - - - - - - - - @@ -1115,36 +1068,6 @@ UseShader( world_edit_render_context *Element ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1171,8 +1094,8 @@ poof(@async @render) InitializeEasingFunctionVisualizerRenderPass ( easing_function_visualizer_render_pass *Element - , v2 *Points - , u32 *Count + , u32 Foo + , u32 Bar ) { b32 Result = CompileShaderPair(&Element->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader")); @@ -1183,20 +1106,20 @@ InitializeEasingFunctionVisualizerRenderPass u32 UniformIndex = 0; - Element->Points = Points; + Element->Foo = Foo; InitShaderUniform( &Element->Program, UniformIndex++, - Element->Points, - "Points" - , Cast(u16, *Count)); + &Element->Foo, + "Foo" + ); - Element->Count = Count; + Element->Bar = Bar; InitShaderUniform( &Element->Program, UniformIndex++, - Element->Count, - "Count" + &Element->Bar, + "Bar" ); u32 Expected = 2 ; @@ -1296,22 +1219,6 @@ UseShader( easing_function_visualizer_render_pass *Element ) - - - - - - - - - - - - - - - - @@ -1694,60 +1601,6 @@ UseShader( bloom_upsample_shader *Element ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1871,15 +1724,6 @@ UseShader( terrain_derivs_render_context *Element ) - - - - - - - - - @@ -2030,34 +1874,6 @@ UseShader( bloom_downsample_shader *Element ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2228,20 +2044,6 @@ UseShader( terrain_shaping_render_context *Element ) - - - - - - - - - - - - - - diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h index d71f79238..c10ce22d7 100644 --- a/generated/for_datatypes_cx51CcgQ.h +++ b/generated/for_datatypes_cx51CcgQ.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:272:0 +// src/engine/work_queue.h:267:0 @@ -681,9 +681,27 @@ +link_internal void +CompileShaderPair_Async(work_queue *Queue, shader *Shader , cs VertShaderPath , cs FragShaderPath , b32 DumpErrors , b32 RegisterForHotReload , b32* Result ) +{ + // Make sure we don't accidentally pass something that's not the render queue + Assert(Queue == &GetStdlib()->Plat.RenderQ); + compile_shader_pair_async_params Params = + { + Result, Shader, VertShaderPath, FragShaderPath, DumpErrors, RegisterForHotReload, + }; + work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); + PushWorkQueueEntry(Queue, &Entry); +} +link_internal void +DoJob(compile_shader_pair_async_params *Params) +{ + auto Result = CompileShaderPair( Params->Shader , Params->VertShaderPath , Params->FragShaderPath , Params->DumpErrors , Params->RegisterForHotReload ); + if (Params->Result) { *Params->Result = Result; } +} @@ -877,5323 +895,27 @@ +link_internal void +InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_function_visualizer_render_pass *Element , u32 Foo , u32 Bar , b32* Result ) +{ + // Make sure we don't accidentally pass something that's not the render queue + Assert(Queue == &GetStdlib()->Plat.RenderQ); + initialize_easing_function_visualizer_render_pass_async_params Params = + { + Result, Element, Foo, Bar, + }; + work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); + PushWorkQueueEntry(Queue, &Entry); +} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -link_internal void -CompileShaderPair_Async(work_queue *Queue, shader *Shader , cs VertShaderPath , cs FragShaderPath , b32 DumpErrors , b32 RegisterForHotReload , b32* Result ) -{ - // Make sure we don't accidentally pass something that's not the render queue - Assert(Queue == &GetStdlib()->Plat.RenderQ); - - compile_shader_pair_async_params Params = - { - Result, Shader, VertShaderPath, FragShaderPath, DumpErrors, RegisterForHotReload, - }; - - work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); - PushWorkQueueEntry(Queue, &Entry); -} - -link_internal void -DoJob(compile_shader_pair_async_params *Params) -{ - auto Result = CompileShaderPair( Params->Shader , Params->VertShaderPath , Params->FragShaderPath , Params->DumpErrors , Params->RegisterForHotReload ); - if (Params->Result) { *Params->Result = Result; } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -link_internal void -InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_function_visualizer_render_pass *Element , v2 *Points , u32 *Count , b32* Result ) -{ - // Make sure we don't accidentally pass something that's not the render queue - Assert(Queue == &GetStdlib()->Plat.RenderQ); - - initialize_easing_function_visualizer_render_pass_async_params Params = - { - Result, Element, Points, Count, - }; - - work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); - PushWorkQueueEntry(Queue, &Entry); -} - -link_internal void -DoJob(initialize_easing_function_visualizer_render_pass_async_params *Params) -{ - auto Result = InitializeEasingFunctionVisualizerRenderPass( Params->Element , Params->Points , Params->Count ); - if (Params->Result) { *Params->Result = Result; } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -link_internal void -DrawLod_Async(work_queue *Queue, engine_resources *Engine , shader *Shader , gpu_mapped_element_buffer *Mesh , v3 Basis , Quaternion Rotation , v3 Scale ) -{ - // Make sure we don't accidentally pass something that's not the render queue - Assert(Queue == &GetStdlib()->Plat.RenderQ); - - draw_lod_async_params Params = - { - Engine, Shader, Mesh, Basis, Rotation, Scale, - }; - - work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); - PushWorkQueueEntry(Queue, &Entry); -} - -link_internal void -DoJob(draw_lod_async_params *Params) -{ - DrawLod( Params->Engine , Params->Shader , Params->Mesh , Params->Basis , Params->Rotation , Params->Scale ); - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +link_internal void +DoJob(initialize_easing_function_visualizer_render_pass_async_params *Params) +{ + auto Result = InitializeEasingFunctionVisualizerRenderPass( Params->Element , Params->Foo , Params->Bar ); + if (Params->Result) { *Params->Result = Result; } +} diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 4d2fdb9ac..108795535 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -1,59 +1,4 @@ -// src/engine/work_queue.h:194:0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// src/engine/work_queue.h:191:0 @@ -539,138 +484,6 @@ initialize_easing_function_visualizer_render_pass_async_params initialize_easing - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -738,27 +551,6 @@ compile_shader_pair_async_params compile_shader_pair_async_params; - - - - - - - - - - - - - - - - - - - - -draw_lod_async_params draw_lod_async_params; diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index 972abcd11..b10a83ff1 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -1347,24 +1347,6 @@ PushToolbar( renderer_2d *Ui, - - - - - - - - - - - - - - - - - - diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h index a7589621a..ea50603f7 100644 --- a/generated/for_datatypes_khY6kwEk.h +++ b/generated/for_datatypes_khY6kwEk.h @@ -681,6 +681,15 @@ +struct compile_shader_pair_async_params poof(@async_function_params) +{ + b32* Result; + shader *Shader; + cs VertShaderPath; + cs FragShaderPath; + b32 DumpErrors; + b32 RegisterForHotReload; +}; @@ -874,5278 +883,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -struct compile_shader_pair_async_params poof(@async_function_params) -{ - b32* Result; - shader *Shader; - cs VertShaderPath; - cs FragShaderPath; - b32 DumpErrors; - b32 RegisterForHotReload; -}; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -struct initialize_easing_function_visualizer_render_pass_async_params poof(@async_function_params) -{ - b32* Result; - easing_function_visualizer_render_pass *Element; - v2 *Points; - u32 *Count; -}; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -struct draw_lod_async_params poof(@async_function_params) -{ - - engine_resources *Engine; - shader *Shader; - gpu_mapped_element_buffer *Mesh; - v3 Basis; - Quaternion Rotation; - v3 Scale; -}; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +struct initialize_easing_function_visualizer_render_pass_async_params poof(@async_function_params) +{ + b32* Result; + easing_function_visualizer_render_pass *Element; + u32 Foo; + u32 Bar; +}; diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 718c14104..bb0e121c3 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -1,59 +1,4 @@ -// src/engine/work_queue.h:175:0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// src/engine/work_queue.h:173:0 @@ -539,138 +484,6 @@ type_initialize_easing_function_visualizer_render_pass_async_params, - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -738,27 +551,6 @@ type_compile_shader_pair_async_params, - - - - - - - - - - - - - - - - - - - - -type_draw_lod_async_params, diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index 655430458..bb13d6d27 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:152:0 +// src/engine/graphics.h:160:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index a0a757380..edd94bd23 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.cpp:509:0 +// src/engine/editor.cpp:508:0 link_internal counted_string ToStringPrefixless(asset_type Type) diff --git a/make.sh b/make.sh index 4f0998753..ff9c1689e 100755 --- a/make.sh +++ b/make.sh @@ -305,7 +305,7 @@ function RunPoofHelper { which poof > /dev/null 2>&1 if [ $? -eq 0 ]; then - cmd="poof $COLOR_FLAG -D POOF_PREPROCESSOR -D BONSAI_PREPROCESSOR -I src/ -I external/ $PLATFORM_DEFINES $BONSAI_INTERNAL -o generated $1 " + cmd="poof $COLOR_FLAG -D POOF_PREPROCESSOR -D BONSAI_PREPROCESSOR -I src/ -I external/ $PLATFORM_DEFINES $BONSAI_INTERNAL $@" echo "$cmd" $cmd @@ -328,25 +328,28 @@ function RunPoof # [ -d src/generated ] && rm -Rf src/generated # [ -d generated ] && rm -Rf generated - # RunPoofHelper examples/ui_test/game.cpp && echo -e "$Success poofed examples/ui_test/game.cpp" & + RunPoofHelper -o ./ src/poof_ctags_stub.cpp && echo -e "$Success poofed src/poof_ctags_stub.cpp" & + TrackPid "" $! + + # RunPoofHelper -o generated examples/ui_test/game.cpp && echo -e "$Success poofed examples/ui_test/game.cpp" & # TrackPid "" $! - # RunPoofHelper src/game_loader.cpp && echo -e "$Success poofed src/game_loader.cpp" & + # RunPoofHelper -o generated src/game_loader.cpp && echo -e "$Success poofed src/game_loader.cpp" & # TrackPid "" $! - # RunPoofHelper examples/turn_based/game.cpp && echo -e "$Success poofed examples/turn_based/game.cpp" & + # RunPoofHelper -o generated examples/turn_based/game.cpp && echo -e "$Success poofed examples/turn_based/game.cpp" & # TrackPid "" $! - RunPoofHelper examples/terrain_gen/game.cpp && echo -e "$Success poofed examples/terrain_gen/game.cpp" & - TrackPid "" $! + # RunPoofHelper -o generated examples/terrain_gen/game.cpp && echo -e "$Success poofed examples/terrain_gen/game.cpp" & + # TrackPid "" $! - # RunPoofHelper examples/the_wanderer/game.cpp && echo -e "$Success poofed examples/the_wanderer/game.cpp" & + # RunPoofHelper -o generated examples/the_wanderer/game.cpp && echo -e "$Success poofed examples/the_wanderer/game.cpp" & # TrackPid "" $! - # RunPoofHelper examples/tools/voxel_synthesis_rule_baker/game.cpp && echo -e "$Success poofed examples/tools/voxel_synthesis_rule_baker/game.cpp" & + # RunPoofHelper -o generated examples/tools/voxel_synthesis_rule_baker/game.cpp && echo -e "$Success poofed examples/tools/voxel_synthesis_rule_baker/game.cpp" & # TrackPid "" $! - # RunPoofHelper src/tools/asset_packer.cpp && echo -e "$Success poofed src/tools/asset_packer.cpp" & + # RunPoofHelper -o generated src/tools/asset_packer.cpp && echo -e "$Success poofed src/tools/asset_packer.cpp" & # TrackPid "" $! WaitForTrackedPids diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index d17b6b5df..c402f6297 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -242,7 +242,8 @@ RenderMeshPreviewIntoWorld(engine_resources *Engine, gpu_mapped_element_buffer * v3 AssetHalfDim = Dim/2.f; v3 Basis = GetRenderP(Engine, EntityOrigin) + V3(0.f, 0.f, AssetHalfDim.z); - DrawLod_Async(RenderQ, GetEngineResources(), &Graphics->gBuffer->gBufferShader, Mesh, Basis, Quaternion(), V3(1)); + NotImplemented; + /* DrawLod_Async(RenderQ, GetEngineResources(), &Graphics->gBuffer->gBufferShader, Mesh, Basis, Quaternion(), V3(1)); */ PushBonsaiRenderCommandTeardownShader(RenderQ, BonsaiRenderCommand_ShaderId_gBuffer); } diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 00dd4dcd3..78307f697 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -388,8 +388,7 @@ poof(do_editor_ui_for_compound_type(chunk_thumbnail)) poof( - for_datatypes(all) - func (struct_t) {} + for_datatypes(enum) func (enum_t) { enum_t.has_tag(gen_ui_toolbar)? @@ -525,14 +524,13 @@ poof(do_editor_ui_for_compound_type(entity_position_info)) poof( - for_datatypes(all) + for_datatypes(struct) func (struct_t) { struct_t.has_tag(do_editor_ui)? { do_editor_ui_for_compound_type(struct_t) } } - func (enum_t) {} ) #include diff --git a/src/engine/entity.h b/src/engine/entity.h index 9bc11c8d0..9f8798e70 100644 --- a/src/engine/entity.h +++ b/src/engine/entity.h @@ -214,7 +214,7 @@ link_internal void FinalizeEntityUpdate(entity *Entity) { Assert(IsCanonical(GetWorld(), Entity->P)); - poof( func (entity_position_info Info) + poof( func (entity_position_info Info) @code_fragment { Info.map(member) { diff --git a/src/engine/graphics.h b/src/engine/graphics.h index d24ae8895..24df00076 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -78,7 +78,8 @@ poof( @render_pass }; -struct easing_function poof(@do_editor_ui) +struct easing_function +poof(@do_editor_ui) { cs Name; v2_static_cursor_16 Points; @@ -86,7 +87,9 @@ struct easing_function poof(@do_editor_ui) struct easing_function_visualizer_render_pass poof( - @render_pass @async @do_editor_ui + @render_pass + @async + @do_editor_ui @vert_source_file(STDLIB_SHADER_PATH "FullPassthrough.vertexshader") @frag_source_file(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader") ) @@ -94,14 +97,20 @@ poof( shader Program; shader_uniform Uniforms[2]; - v2 *Points; poof(@uniform @array_length(*Count)) - u32 *Count; poof(@uniform) + u32 Foo; poof(@uniform) + u32 Bar; poof(@uniform) + /* easing_function *Func; */ + /* poof(@uniform(v2 *Points, Element->Func->Points.Start)) */ + /* poof(@uniform(u32 Count, Element->Func->Points.At)) */ + + /* v2 *Points; poof(@uniform @array_length(*Count)) */ + /* u32 *Count; poof(@uniform) */ }; poof( - for_datatypes(all) @code_fragment + for_datatypes(struct) @code_fragment func (struct_t) { struct_t.has_tag(render_pass)? @@ -115,7 +124,6 @@ poof( } } } - func (enum_t) {} ) #include diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index 31b7b14d4..8a80cb663 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -108,7 +108,7 @@ CAssert( (sizeof(work_queue_entry__align_to_cache_line_helper)+8) % CACHE_LINE_S poof( - func asyncify_render_function_h(func_t) @code_fragment + func asyncify_render_function_h(func_t) { struct (func_t.name.to_snake_case)_async_params poof(@async_function_params) { @@ -150,9 +150,7 @@ poof( ) poof( - for_datatypes(all) @code_fragment - func (struct_t) {} - func (enum_t) {} + for_datatypes(func) func (func_t) { func_t.has_tag(async)? @@ -172,7 +170,7 @@ poof( enum async_function_call_type { poof( - for_datatypes(all) @code_fragment + for_datatypes(struct) @code_fragment func (struct_t) { struct_t.has_tag(async_function_params)? @@ -180,7 +178,6 @@ enum async_function_call_type type_(struct_t.name), } } - func (enum_t) {} ) #include }; @@ -191,7 +188,7 @@ struct work_queue_entry_async_function_call union { poof( - for_datatypes(all) @code_fragment + for_datatypes(struct) @code_fragment func (struct_t) { struct_t.has_tag(async_function_params)? @@ -199,7 +196,6 @@ struct work_queue_entry_async_function_call struct_t.name struct_t.name; } } - func (enum_t) {} ) #include }; @@ -245,7 +241,7 @@ poof(d_union_constructors(work_queue_entry)) poof( - for_datatypes(all) @code_fragment + for_datatypes(struct) @code_fragment func (struct_t) { struct_t.has_tag(async_function_params)? @@ -262,16 +258,13 @@ poof( } } } - func (enum_t) {} ) #include poof( - for_datatypes(all) @code_fragment - func (struct_t) {} - func (enum_t) {} + for_datatypes(func) @code_fragment func (func_t) { func_t.has_tag(async)? @@ -291,7 +284,7 @@ DispatchAsyncFunctionCall(work_queue_entry_async_function_call *Task) tswitch(Task) { poof( - func (async_function_call_type tag_t) + func (async_function_call_type tag_t) @code_fragment { tag_t.map(tag_v) { diff --git a/src/poof_ctags_stub.cpp b/src/poof_ctags_stub.cpp new file mode 100644 index 000000000..efcccca48 --- /dev/null +++ b/src/poof_ctags_stub.cpp @@ -0,0 +1,18 @@ +#define PLATFORM_WINDOW_IMPLEMENTATIONS 1 +#define BONSAI_STDLIB_WORK_QUEUE_IMPLEMENTATION 1 + +#define BONSAI_DEBUG_SYSTEM_API 1 +#define BONSAI_DEBUG_SYSTEM_LOADER_API 1 + +#include "bonsai_types.h" + +poof( + for_datatypes(all) + @omit_include + @origin_comment_format(!_TAG_FILE_GENERATED_FROM (%S:%d)) + func (type) + { + type.name type.file type.line + } +) +// tags From 9ea1807da0e17e4f19a0c62889422859ea3fdc24 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 22 Oct 2025 12:48:13 -0700 Subject: [PATCH 358/421] Update stdlib --- external/bonsai_stdlib | 2 +- ..._array_dummy_work_queue_entry_build_chunk_mesh_688853862.h | 2 +- generated/block_array_gpu_readback_buffer_688853862.h | 2 +- generated/gen_constructor_gpu_readback_buffer.h | 2 +- generated/hashtable_bonsai_type_info.h | 3 ++- generated/hashtable_counted_string.h | 3 ++- generated/hashtable_impl_u32.h | 3 ++- generated/hashtable_impl_ui_toggle.h | 3 ++- generated/hashtable_impl_window_layout.h | 3 ++- generated/hashtable_impl_xml_tag.h | 3 ++- generated/hashtable_parser.h | 3 ++- generated/hashtable_voxel_synth_tile.h | 3 ++- generated/hashtable_world_edit_brush.h | 3 ++- src/engine/graphics.h | 4 ---- src/engine/voxel_synthesis.h | 4 ++-- 15 files changed, 24 insertions(+), 19 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index b0dcaa944..93150bc94 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit b0dcaa9440af2ebdc37657da3546a1c45f230ef7 +Subproject commit 93150bc9405881d02e7eeedad9c6737c6fa7cc52 diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index b31b0ac2c..84c6eb02d 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:174:0 +// src/engine/graphics.h:170:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 74dbbe223..45b93beee 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:163:0 +// src/engine/graphics.h:159:0 diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index bb13d6d27..c0dfc729d 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:160:0 +// src/engine/graphics.h:156:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) diff --git a/generated/hashtable_bonsai_type_info.h b/generated/hashtable_bonsai_type_info.h index d1f2d17c0..0298863d3 100644 --- a/generated/hashtable_bonsai_type_info.h +++ b/generated/hashtable_bonsai_type_info.h @@ -14,6 +14,7 @@ struct bonsai_type_info_hashtable /* OWNED_BY_THREAD_MEMBER() */ }; link_internal b32 AreEqual(bonsai_type_info_linked_list_node *Node1, bonsai_type_info_linked_list_node *Node2 ); +link_internal b32 AreEqual(bonsai_type_info *Element1, bonsai_type_info *Element2 ); link_internal bonsai_type_info_linked_list_node * Allocate_bonsai_type_info_linked_list_node(memory_arena *Memory) @@ -76,7 +77,7 @@ Insert(bonsai_type_info_linked_list_node *Node, bonsai_type_info_hashtable *Tabl bonsai_type_info_linked_list_node **Bucket = Table->Elements + HashValue; while (*Bucket) { - /* Assert(!AreEqual(*Bucket, Node)); */ + /* Assert(!AreEqual(&Bucket[0]->Element, &Node->Element)); */ Bucket = &(*Bucket)->Next; } *Bucket = Node; diff --git a/generated/hashtable_counted_string.h b/generated/hashtable_counted_string.h index 3c9b8c41b..c7c661622 100644 --- a/generated/hashtable_counted_string.h +++ b/generated/hashtable_counted_string.h @@ -14,6 +14,7 @@ struct counted_string_hashtable /* OWNED_BY_THREAD_MEMBER() */ }; link_internal b32 AreEqual(counted_string_linked_list_node *Node1, counted_string_linked_list_node *Node2 ); +link_internal b32 AreEqual(counted_string *Element1, counted_string *Element2 ); link_internal counted_string_linked_list_node * Allocate_counted_string_linked_list_node(memory_arena *Memory) @@ -76,7 +77,7 @@ Insert(counted_string_linked_list_node *Node, counted_string_hashtable *Table) counted_string_linked_list_node **Bucket = Table->Elements + HashValue; while (*Bucket) { - /* Assert(!AreEqual(*Bucket, Node)); */ + /* Assert(!AreEqual(&Bucket[0]->Element, &Node->Element)); */ Bucket = &(*Bucket)->Next; } *Bucket = Node; diff --git a/generated/hashtable_impl_u32.h b/generated/hashtable_impl_u32.h index 86b1eb8a5..4ebce5e0b 100644 --- a/generated/hashtable_impl_u32.h +++ b/generated/hashtable_impl_u32.h @@ -1,6 +1,7 @@ // external/bonsai_stdlib/src/primitive_containers.cpp:5:0 link_internal b32 AreEqual(u32_linked_list_node *Node1, u32_linked_list_node *Node2 ); +link_internal b32 AreEqual(u32 *Element1, u32 *Element2 ); link_internal u32_linked_list_node * Allocate_u32_linked_list_node(memory_arena *Memory) @@ -63,7 +64,7 @@ Insert(u32_linked_list_node *Node, u32_hashtable *Table) u32_linked_list_node **Bucket = Table->Elements + HashValue; while (*Bucket) { - /* Assert(!AreEqual(*Bucket, Node)); */ + /* Assert(!AreEqual(&Bucket[0]->Element, &Node->Element)); */ Bucket = &(*Bucket)->Next; } *Bucket = Node; diff --git a/generated/hashtable_impl_ui_toggle.h b/generated/hashtable_impl_ui_toggle.h index 2da6739d4..c48074759 100644 --- a/generated/hashtable_impl_ui_toggle.h +++ b/generated/hashtable_impl_ui_toggle.h @@ -1,6 +1,7 @@ // external/bonsai_stdlib/src/ui/ui.cpp:19:0 link_internal b32 AreEqual(ui_toggle_linked_list_node *Node1, ui_toggle_linked_list_node *Node2 ); +link_internal b32 AreEqual(ui_toggle *Element1, ui_toggle *Element2 ); link_internal ui_toggle_linked_list_node * Allocate_ui_toggle_linked_list_node(memory_arena *Memory) @@ -63,7 +64,7 @@ Insert(ui_toggle_linked_list_node *Node, ui_toggle_hashtable *Table) ui_toggle_linked_list_node **Bucket = Table->Elements + HashValue; while (*Bucket) { - /* Assert(!AreEqual(*Bucket, Node)); */ + /* Assert(!AreEqual(&Bucket[0]->Element, &Node->Element)); */ Bucket = &(*Bucket)->Next; } *Bucket = Node; diff --git a/generated/hashtable_impl_window_layout.h b/generated/hashtable_impl_window_layout.h index 555f89c53..f0d9c1fb7 100644 --- a/generated/hashtable_impl_window_layout.h +++ b/generated/hashtable_impl_window_layout.h @@ -1,6 +1,7 @@ // external/bonsai_stdlib/src/ui/ui.cpp:29:0 link_internal b32 AreEqual(window_layout_linked_list_node *Node1, window_layout_linked_list_node *Node2 ); +link_internal b32 AreEqual(window_layout *Element1, window_layout *Element2 ); link_internal window_layout_linked_list_node * Allocate_window_layout_linked_list_node(memory_arena *Memory) @@ -63,7 +64,7 @@ Insert(window_layout_linked_list_node *Node, window_layout_hashtable *Table) window_layout_linked_list_node **Bucket = Table->Elements + HashValue; while (*Bucket) { - /* Assert(!AreEqual(*Bucket, Node)); */ + /* Assert(!AreEqual(&Bucket[0]->Element, &Node->Element)); */ Bucket = &(*Bucket)->Next; } *Bucket = Node; diff --git a/generated/hashtable_impl_xml_tag.h b/generated/hashtable_impl_xml_tag.h index 9a8ae79d6..f02eb17c9 100644 --- a/generated/hashtable_impl_xml_tag.h +++ b/generated/hashtable_impl_xml_tag.h @@ -1,6 +1,7 @@ // external/bonsai_stdlib/src/xml.cpp:10:0 link_internal b32 AreEqual(xml_tag_linked_list_node *Node1, xml_tag_linked_list_node *Node2 ); +link_internal b32 AreEqual(xml_tag *Element1, xml_tag *Element2 ); link_internal xml_tag_linked_list_node * Allocate_xml_tag_linked_list_node(memory_arena *Memory) @@ -63,7 +64,7 @@ Insert(xml_tag_linked_list_node *Node, xml_tag_hashtable *Table) xml_tag_linked_list_node **Bucket = Table->Elements + HashValue; while (*Bucket) { - /* Assert(!AreEqual(*Bucket, Node)); */ + /* Assert(!AreEqual(&Bucket[0]->Element, &Node->Element)); */ Bucket = &(*Bucket)->Next; } *Bucket = Node; diff --git a/generated/hashtable_parser.h b/generated/hashtable_parser.h index 5a75f81a8..7418cd18b 100644 --- a/generated/hashtable_parser.h +++ b/generated/hashtable_parser.h @@ -14,6 +14,7 @@ struct parser_hashtable /* OWNED_BY_THREAD_MEMBER() */ }; link_internal b32 AreEqual(parser_linked_list_node *Node1, parser_linked_list_node *Node2 ); +link_internal b32 AreEqual(parser *Element1, parser *Element2 ); link_internal parser_linked_list_node * Allocate_parser_linked_list_node(memory_arena *Memory) @@ -76,7 +77,7 @@ Insert(parser_linked_list_node *Node, parser_hashtable *Table) parser_linked_list_node **Bucket = Table->Elements + HashValue; while (*Bucket) { - /* Assert(!AreEqual(*Bucket, Node)); */ + /* Assert(!AreEqual(&Bucket[0]->Element, &Node->Element)); */ Bucket = &(*Bucket)->Next; } *Bucket = Node; diff --git a/generated/hashtable_voxel_synth_tile.h b/generated/hashtable_voxel_synth_tile.h index d4f7d0f80..01b73d5a2 100644 --- a/generated/hashtable_voxel_synth_tile.h +++ b/generated/hashtable_voxel_synth_tile.h @@ -14,6 +14,7 @@ struct voxel_synth_tile_hashtable /* OWNED_BY_THREAD_MEMBER() */ }; link_internal b32 AreEqual(voxel_synth_tile_linked_list_node *Node1, voxel_synth_tile_linked_list_node *Node2 ); +link_internal b32 AreEqual(voxel_synth_tile *Element1, voxel_synth_tile *Element2 ); link_internal voxel_synth_tile_linked_list_node * Allocate_voxel_synth_tile_linked_list_node(memory_arena *Memory) @@ -76,7 +77,7 @@ Insert(voxel_synth_tile_linked_list_node *Node, voxel_synth_tile_hashtable *Tabl voxel_synth_tile_linked_list_node **Bucket = Table->Elements + HashValue; while (*Bucket) { - /* Assert(!AreEqual(*Bucket, Node)); */ + /* Assert(!AreEqual(&Bucket[0]->Element, &Node->Element)); */ Bucket = &(*Bucket)->Next; } *Bucket = Node; diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index c1b4b5ad0..18c08b316 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -14,6 +14,7 @@ struct world_edit_brush_hashtable /* OWNED_BY_THREAD_MEMBER() */ }; link_internal b32 AreEqual(world_edit_brush_linked_list_node *Node1, world_edit_brush_linked_list_node *Node2 ); +link_internal b32 AreEqual(world_edit_brush *Element1, world_edit_brush *Element2 ); link_internal world_edit_brush_linked_list_node * Allocate_world_edit_brush_linked_list_node(memory_arena *Memory) @@ -76,7 +77,7 @@ Insert(world_edit_brush_linked_list_node *Node, world_edit_brush_hashtable *Tabl world_edit_brush_linked_list_node **Bucket = Table->Elements + HashValue; while (*Bucket) { - /* Assert(!AreEqual(*Bucket, Node)); */ + /* Assert(!AreEqual(&Bucket[0]->Element, &Node->Element)); */ Bucket = &(*Bucket)->Next; } *Bucket = Node; diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 24df00076..66feb553a 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -127,10 +127,6 @@ poof( ) #include -/* poof(asyncify_render_function_h(InitializeEasingFunctionVisualizerRenderPass)) */ -/* #include */ - - struct composite_render_group { shader Shader; diff --git a/src/engine/voxel_synthesis.h b/src/engine/voxel_synthesis.h index e150a5102..c22957023 100644 --- a/src/engine/voxel_synthesis.h +++ b/src/engine/voxel_synthesis.h @@ -104,10 +104,10 @@ VoxelSynthTile( tile_rule_id RuleId, u32 VoxelIndex, u64 HashValue, chunk_data * } -link_internal u64 +link_internal b32 AreEqual(voxel_synth_tile *T0, voxel_synth_tile *T1) { - u64 Result = T0->HashValue == T1->HashValue; + b32 Result = T0->HashValue == T1->HashValue; if (Result) { /* umm TempVoxelsSizeInBytes = sizeof(voxel)*umm(Volume(Global_TileDim)); */ From 53e21dbc0563ff173e8af8b8fe494d9c4c3ff23e Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 24 Oct 2025 08:42:02 -0700 Subject: [PATCH 359/421] WIP --- generated/for_datatypes_Bxw4Q7AW.h | 11 +++++------ generated/for_datatypes_IXWy6K9V.h | 18 +++++++++--------- generated/for_datatypes_cx51CcgQ.h | 6 +++--- generated/for_datatypes_khY6kwEk.h | 4 ++-- jesse.bonsai.rdbg | Bin 17313 -> 17188 bytes src/engine/graphics.h | 8 ++++---- 6 files changed, 23 insertions(+), 24 deletions(-) diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 4ff48d1e6..ddd942371 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -595,11 +595,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re - cs MemberName = CSz("Foo"); + cs MemberName = CSz("Points"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->Foo), + Cast(v2*, Element->Points), MemberName, ThisHash, Params @@ -612,8 +612,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re - PushNewRow(Ui); - + } @@ -621,11 +620,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re - cs MemberName = CSz("Bar"); + cs MemberName = CSz("Count"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(u32*, &Element->Bar), + Cast(u32*, Element->Count), MemberName, ThisHash, Params diff --git a/generated/for_datatypes_IXWy6K9V.h b/generated/for_datatypes_IXWy6K9V.h index a6254305d..1907ebde7 100644 --- a/generated/for_datatypes_IXWy6K9V.h +++ b/generated/for_datatypes_IXWy6K9V.h @@ -1094,8 +1094,8 @@ poof(@async @render) InitializeEasingFunctionVisualizerRenderPass ( easing_function_visualizer_render_pass *Element - , u32 Foo - , u32 Bar + , v2 *Points + , u32 *Count ) { b32 Result = CompileShaderPair(&Element->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader")); @@ -1106,20 +1106,20 @@ InitializeEasingFunctionVisualizerRenderPass u32 UniformIndex = 0; - Element->Foo = Foo; + Element->Points = Points; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->Foo, - "Foo" - ); + Element->Points, + "Points" + , Cast(u16, *Count)); - Element->Bar = Bar; + Element->Count = Count; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->Bar, - "Bar" + Element->Count, + "Count" ); u32 Expected = 2 ; diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h index c10ce22d7..564b03371 100644 --- a/generated/for_datatypes_cx51CcgQ.h +++ b/generated/for_datatypes_cx51CcgQ.h @@ -896,14 +896,14 @@ DoJob(compile_shader_pair_async_params *Params) link_internal void -InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_function_visualizer_render_pass *Element , u32 Foo , u32 Bar , b32* Result ) +InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_function_visualizer_render_pass *Element , v2 *Points , u32 *Count , b32* Result ) { // Make sure we don't accidentally pass something that's not the render queue Assert(Queue == &GetStdlib()->Plat.RenderQ); initialize_easing_function_visualizer_render_pass_async_params Params = { - Result, Element, Foo, Bar, + Result, Element, Points, Count, }; work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); @@ -913,7 +913,7 @@ InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_fu link_internal void DoJob(initialize_easing_function_visualizer_render_pass_async_params *Params) { - auto Result = InitializeEasingFunctionVisualizerRenderPass( Params->Element , Params->Foo , Params->Bar ); + auto Result = InitializeEasingFunctionVisualizerRenderPass( Params->Element , Params->Points , Params->Count ); if (Params->Result) { *Params->Result = Result; } } diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h index ea50603f7..285aa380a 100644 --- a/generated/for_datatypes_khY6kwEk.h +++ b/generated/for_datatypes_khY6kwEk.h @@ -887,8 +887,8 @@ struct initialize_easing_function_visualizer_render_pass_async_params poof(@asyn { b32* Result; easing_function_visualizer_render_pass *Element; - u32 Foo; - u32 Bar; + v2 *Points; + u32 *Count; }; diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index d74406d00f15fc044f18d36e5a3e5031cd819f0a..092933627a36ae163811a43421f859c14dd57521 100644 GIT binary patch delta 2455 zcmY*bYfM|`8O~>HAK#6!T>}Q+fPif<2IBw*gP~1n2B9#mLY2}u2YkS1! zn%Yf~x&V*1ADz@f+x^HYE!jn@G)>Dc%C99_$TaOor7D{yZIdQ-(=PqdP3-+X8PF#ybaC=n3y{RO+bYXgK!`G)IeA+r{maA2z zmQ{1H{EPVgcnW_>hv-@w&h$mLw0qcxKTk&4d9ihC@+ky^DQ&e>slgu%;-SU_&!h(l zM;Mc77e1J9;?>lQW;=m^6vcN_tyr3vZyJu}aTpxH}w|h8(m&OxpUVP0p?qbuBdj{b%NVwUr*D5)+hJ$br@lG#pj9K95^otyBkJ>Oj z=3q%2^hNQ>sFj_4@}h}f%&u0ps(C!@j^e7;g3_pmjbhg}Y^>HQTWhsgei<`~1>?4| zRx4Fv`9&NI58=j{0KTVbMfprS9w)p~L0(^v<{|8=fDr;m(BD+XYW)MgO(Bu|7hH7Q)LP1uG zxRZPqWw#!G?KQHO#Ids5&sO+n@p#Ba2>UrO#;RJ#W##QF!}z(k9}nYtO+JI=v2hGE zOBn7Opd};z>5bs6xP)JNqbSAoY>{K%8}DQzkXhK2Q&zV&vbl=k7bNF}E zTfeyzP2)ft!NsT%Go~=?(H>lnD42~*vlm3-uP1zXJ3J>y^K!VCjqx^HiaDi{T`Ls| zaxsU$_jVx@?9hq+V83s)QAjOcQRG}zURN;GH;RAtW(e596C77~j#M4q?RDb1*I$oO ztEg9S)jPw6PuO<qPcyY^_{|96UqP&X6Ps+GYW5xl~naYN;5@C;1)xE?}o)5vT#PCNF40k2d_n zp3;+q6uCf<32B~asGr}H3Q9E}%b(*ly&U#QYIZvj%O^z0Y@ZGfS|#jRqd4*zM6C~e z1{N2)M?Q(Cu3c9*6+9pA!X~+gC>n!#(p@&NpC4v)BmVhh-IjV`OU19<<0MmV5}zbYm~k&s zZBs&(#kd~(k^mWZT@K16f>&I}EqcWz;TM(=$)?j3)gL*EQkS6-qf} zv!Tn=ntYrSmKAZ|J%nttnc6kmsAMT5p=8g{z!P!Jc||T~3kpvYHvJTQ4ja678+L3@ zvqe4$aM|WRc2P^i$T?)3jZxgS>hQ=nfRC&amaVgNkc(JC+UgeC-1l1Xrd^MZEl**` zk`()Im`(VyrG;g9@^OooJWVJcM`iIKDv6aXgX@GNRo21o_V?=R8^Yc;nDDD{CWWRGKhU{W< zJji`1#JC=#Qbm=HlnC;bF|W8>az#2fl<|UG7I_+p|pr8 zFOwbfyoAAU>RPf}<(ym-$=2HHV+p(?g=r>-XoL=>p25>v zC*E$lAl&{-O}zxbv~^Xjt*gprE~^x`3b?I#fe)-cd`%OsH(SrA6a6W<>73#tm!jtx6X)I+}%a-K|9cz?l68{5q%uQV(B?cO;_gMeW9FUy;J~Ln@)BXcZW{;s~ v#)GceK^;4F>Xd}*vwm#P#!pNI{Crudmf2ix72J+sn#^~c>Mbxv^XCO delta 2449 zcmY*bZETxY72b9H{Sn)794B^?*G?SAAIa<3j$=DP^_>I+yOF3S@Z zyS1zGdZU5W>5FhrXt6F#2XV_8$NL2b?hGX8zYEQwINm5&*|T(e0beZiBT$Ipt+XBg z$%jzRZ{WCB!gA4uwM>`2s_ZG%lB$$9lqUY1E8uQi+x%rNL@CCw$~y6loC8Ng5*oQd zTT2lzv}E-Q6!;V#OnKQXjvWPatzKyOc;0PB))H4FK;W&G8&!)7V;jW zQfpV**O5#oz%3)0E|%hVni}f$R%N|~)xiHl1YI~rj$O7&sa@aNs-7hGly$38Q%W1k+U^#d6X)<@ za#pax)i;3OCCzw3n#S!;lTOuwX)DcUxl%)INQN_M#qiuT{wUkAEMF9K2nHmJmWiyc zbIRaoTtb&FhK=#8hOJ?@^5SjWFzyA+=8a0b-jvm|q7Wa)-MAUg;CuF7+>8$CwyMO| z5JBR?ous)he;MtK8Zgo&}z%$ZK#pW!$A2zdT>dYu^hx1UwPCST80?cH%2gCkx zB*UH#SsllIJZ@@Kc&iEinyZy9l@KNg@QzukO0!Yg%g8GA!&zh_5?+m1@%~U3wcR8( z61=iD1m|WkIAo^_j~yfyAt%+D=gz@&;q{Ok-JvDXsMe4u$br+O-&R`WH8OhOG@Av@ zWi@kxgo6-0@;-_ApplL7-!$WpUx1H$l9@8lzv4`80qWuf&2D; zEN8kfn04W(-^b30Y+vaQQeBE2tql1!CGhWn#7mHfn?II<%F9&?=k|6thfV9j1 zB-7;NTYfLyxP&z-^9O#neUIo}ZwkmSU?&pAy}l@kC-0K4^>ve!JuQTqIB4D3EmN!2 zD)kyd{v_42i*)-0Bg=NV-K<=b)fI8HyVrA4oS*xgL|Khe*L*!pkP-Eu0rz`~j29qb z)VPkr=)8WrytxV2WJu7F!?@aG$I*<2mZN7Fe+_BM^(*fH7QL5+a`Bc;db?Oz@bA6u zB2q=J$QJB(_iHy=)~faTw$S%|7qQjD73B#bx_l-*WKOJm@^E%dKLmJjT<#$DU7Ji1wm)#q7)!f(Sv|*-HmVGcE#oBTC#k}DF-PCPwM zC2##KE3`Fv>xKil`9o&G;)4IKZsC9lAr%#NuT^RFunc->Points.Start)) */ /* poof(@uniform(u32 Count, Element->Func->Points.At)) */ - /* v2 *Points; poof(@uniform @array_length(*Count)) */ - /* u32 *Count; poof(@uniform) */ + v2 *Points; poof(@uniform @array_length(*Count)) + u32 *Count; poof(@uniform) }; From 90d69ec9fbf03cf75a4238edb52bbe005073ce53 Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 24 Oct 2025 11:22:23 -0700 Subject: [PATCH 360/421] Update poof --- external/bonsai_stdlib | 2 +- ...nymous_async_function_call_type_rQAZtEUA.h | 2 +- .../anonymous_entity_position_info_ynGg9Dhj.h | 2 +- generated/anonymous_function_input_HLGbqwh0.h | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 12 +- generated/anonymous_input_5Nt8cwGP.h | 6 +- generated/anonymous_input_Lwen2qoF.h | 24 +- generated/anonymous_input_nPw6miGy.h | 6 +- .../anonymous_ui_render_command_nKuoMe2B.h | 12 +- generated/are_equal_bonsai_type_info.h | 7 +- generated/are_equal_debug_profile_scope.h | 3 +- generated/are_equal_file_traversal_node.h | 7 +- generated/are_equal_memory_arena_stats.h | 3 +- generated/are_equal_octree_node.h | 3 +- generated/are_equal_perlin_noise_params.h | 3 +- generated/are_equal_rect3cp.h | 3 +- generated/are_equal_render_settings.h | 3 +- generated/are_equal_struct.h | 3 +- generated/are_equal_texture.h | 7 +- generated/are_equal_ui_toggle.h | 3 +- ..._voxel_synthesis_change_propagation_info.h | 3 +- generated/are_equal_world_edit_brush.h | 3 +- generated/are_equal_xml_property.h | 3 +- generated/are_equal_xml_tag.h | 3 +- generated/are_equal_xml_token.h | 3 +- generated/block_array_bitmap_688853862.h | 30 ++- .../block_array_c_asset_thumbnail_688856411.h | 30 ++- ...g_block_counted_string_block_array_index.h | 176 ++++++++++++++ ...ntity_ptr_688856411_struct_struct_struct.h | 30 ++- generated/block_array_c_gpu_timer_688735882.h | 30 ++- .../block_array_c_shader_ptr_688853971.h | 30 ++- generated/block_array_c_texture_688856411.h | 30 ++- generated/block_array_c_u32_688856411.h | 30 ++- generated/block_array_c_u8_cursor_688856411.h | 30 ++- ...k_queue_entry_build_chunk_mesh_688853862.h | 30 ++- generated/block_array_entity_688856407.h | 30 ++- .../block_array_entity_ptr_688856411_h.h | 3 +- ...lock_array_file_traversal_node_688853862.h | 30 ++- ...lock_array_gpu_readback_buffer_688853862.h | 30 ++- .../block_array_h_asset_thumbnail_688856411.h | 3 +- ...88853862_0_889429130_894106509_562163350.h | 183 +++++++++++++++ .../block_array_h_gpu_timer_688735882_0.h | 3 +- .../block_array_h_shader_ptr_688853971_0.h | 3 +- generated/block_array_h_texture_688856411.h | 3 +- generated/block_array_h_texture_688856411_0.h | 3 +- generated/block_array_h_u32_688856411.h | 3 +- generated/block_array_h_u8_cursor_688856411.h | 3 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 3 +- generated/block_array_member_info_688856411.h | 30 ++- generated/block_array_model_688856411.h | 30 ++- .../block_array_octree_node_ptr_688853862.h | 30 ++- ...block_array_picked_octree_node_688853862.h | 30 ++- .../block_array_standing_spot_688853862.h | 30 ++- generated/block_array_texture_ptr_688856411.h | 30 ++- generated/block_array_vox_data_688856411.h | 30 ++- ...lock_array_voxel_stack_element_688853862.h | 30 ++- .../block_array_world_chunk_ptr_688853862.h | 30 ++- ...y_world_edit_block_array_index_688735882.h | 30 ++- .../block_array_world_edit_layer_688735882.h | 30 ++- .../block_array_world_edit_ptr_688735882.h | 30 ++- generated/bubble_sort_686708022.h | 4 +- generated/buffer_asset.h | 3 +- generated/buffer_bitmap.h | 3 +- generated/buffer_bonsai_type_info.h | 3 +- generated/buffer_builder_tuple_cs_cs.h | 3 +- generated/buffer_c_struct_u32.h | 3 +- generated/buffer_c_struct_u64.h | 3 +- generated/buffer_c_token.h | 3 +- generated/buffer_c_token_buffer.h | 3 +- generated/buffer_counted_string.h | 3 +- generated/buffer_file_traversal_node.h | 3 +- generated/buffer_h_struct_u32.h | 3 +- ...for_growth_untextured_3d_geometry_buffer.h | 3 +- generated/buffer_model.h | 3 +- generated/buffer_octree_node_ptr.h | 3 +- generated/buffer_rect3i.h | 3 +- generated/buffer_sort_key.h | 3 +- generated/buffer_standing_spot.h | 3 +- generated/buffer_thread_main_callback_type.h | 3 +- generated/buffer_tile_ruleset.h | 3 +- generated/buffer_u32.h | 3 +- generated/buffer_u64.h | 3 +- generated/buffer_ui_toggle_button_handle.h | 3 +- generated/buffer_v3i.h | 3 +- generated/buffer_voxel_synth_tile.h | 3 +- generated/buffer_world_chunk_ptr.h | 3 +- ...tions_h_untextured_3d_geometry_buffer_v3.h | 3 +- ...ns_h_untextured_3d_geometry_buffer_v3_u8.h | 3 +- ...ons_untextured_3d_geometry_buffer_v3_f32.h | 3 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 3 +- generated/copy_normal_buffer_v3_u8_v3.h | 3 +- generated/copy_normal_buffer_v3_u8_v3_u8.h | 3 +- generated/copy_normal_buffer_v3_v3.h | 3 +- generated/copy_normal_buffer_v3_v3_u8.h | 3 +- generated/copy_vertex_buffer_v3_u8_v3.h | 3 +- generated/copy_vertex_buffer_v3_u8_v3_u8.h | 3 +- generated/copy_vertex_buffer_v3_v3.h | 3 +- generated/copy_vertex_buffer_v3_v3_u8_f32.h | 3 +- generated/cursor_v3i.h | 14 +- ..._work_queue_entry__bonsai_render_command.h | 191 +++++++++------ .../d_union_constructors_work_queue_entry.h | 48 ++-- generated/d_union_ui_render_command.h | 1 - generated/d_union_work_queue_entry.h | 1 - ..._work_queue_entry__bonsai_render_command.h | 1 - generated/deep_copy_u32_stream.h | 3 +- generated/default_marshal_noise_layer_0.h | 7 +- generated/default_marshal_particle_system_0.h | 4 +- generated/default_marshal_world_chunk_0.h | 13 +- generated/deserialize_struct_camera_0.h | 20 +- generated/deserialize_struct_camera_1.h | 24 +- generated/deserialize_struct_entity.h | 25 +- generated/deserialize_struct_level_header.h | 19 +- ...do_editor_ui_for_compound_type_animation.h | 4 +- .../do_editor_ui_for_compound_type_asset.h | 12 +- .../do_editor_ui_for_compound_type_asset_id.h | 4 +- ...tor_ui_for_compound_type_asset_thumbnail.h | 4 +- ...editor_ui_for_compound_type_bonsai_futex.h | 4 +- ...ditor_ui_for_compound_type_bonsai_stdlib.h | 33 ++- ..._editor_ui_for_compound_type_brush_layer.h | 6 +- ...itor_ui_for_compound_type_brush_settings.h | 10 +- .../do_editor_ui_for_compound_type_camera.h | 4 +- ...o_editor_ui_for_compound_type_chunk_data.h | 4 +- ...tor_ui_for_compound_type_chunk_thumbnail.h | 4 +- ...tor_ui_for_compound_type_collision_event.h | 4 +- ..._editor_ui_for_compound_type_debug_state.h | 220 +++++++++++++++--- ...editor_ui_for_compound_type_engine_debug.h | 4 +- ...or_ui_for_compound_type_engine_resources.h | 4 +- ...tor_ui_for_compound_type_engine_settings.h | 3 +- .../do_editor_ui_for_compound_type_entity.h | 4 +- ...do_editor_ui_for_compound_type_entity_id.h | 4 +- ...i_for_compound_type_entity_position_info.h | 4 +- ...ui_for_compound_type_file_traversal_node.h | 4 +- .../do_editor_ui_for_compound_type_frustum.h | 4 +- ..._for_compound_type_g_buffer_render_group.h | 4 +- ..._editor_ui_for_compound_type_game_lights.h | 4 +- ...compound_type_gpu_element_buffer_handles.h | 4 +- ..._compound_type_gpu_mapped_element_buffer.h | 4 +- .../do_editor_ui_for_compound_type_graphics.h | 8 +- ...r_ui_for_compound_type_graphics_settings.h | 4 +- .../do_editor_ui_for_compound_type_input.h | 4 +- ..._editor_ui_for_compound_type_input_event.h | 4 +- .../do_editor_ui_for_compound_type_keyframe.h | 4 +- ...ditor_ui_for_compound_type_layered_brush.h | 4 +- ...editor_ui_for_compound_type_level_editor.h | 4 +- ..._for_compound_type_lighting_render_group.h | 4 +- ...r_ui_for_compound_type_lighting_settings.h | 6 +- ..._ui_for_compound_type_lod_element_buffer.h | 4 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 4 +- .../do_editor_ui_for_compound_type_model.h | 4 +- ..._editor_ui_for_compound_type_noise_layer.h | 4 +- ..._editor_ui_for_compound_type_octree_node.h | 4 +- .../do_editor_ui_for_compound_type_particle.h | 4 +- ...tor_ui_for_compound_type_particle_system.h | 4 +- ...ui_for_compound_type_perlin_noise_params.h | 3 +- .../do_editor_ui_for_compound_type_physics.h | 4 +- .../do_editor_ui_for_compound_type_plane.h | 3 +- .../do_editor_ui_for_compound_type_platform.h | 4 +- ...ditor_ui_for_compound_type_random_series.h | 3 +- .../do_editor_ui_for_compound_type_ray.h | 4 +- .../do_editor_ui_for_compound_type_rect3.h | 4 +- .../do_editor_ui_for_compound_type_rect3cp.h | 4 +- .../do_editor_ui_for_compound_type_rect3i.h | 4 +- ...r_ui_for_compound_type_render_buffers_2d.h | 4 +- ...editor_ui_for_compound_type_render_debug.h | 4 +- ...tor_ui_for_compound_type_render_settings.h | 8 +- ..._editor_ui_for_compound_type_renderer_2d.h | 4 +- .../do_editor_ui_for_compound_type_shader.h | 4 +- ..._editor_ui_for_compound_type_shape_layer.h | 4 +- ...ompound_type_shape_layer_advanced_params.h | 4 +- ...struct_terrain_decoration_render_context.h | 4 +- ...e_struct_terrain_finalize_render_context.h | 4 +- ...pe_struct_terrain_shaping_render_context.h | 4 +- ...or_compound_type_struct_world_edit_brush.h | 4 +- ...nd_type_struct_world_edit_render_context.h | 4 +- .../do_editor_ui_for_compound_type_texture.h | 4 +- .../do_editor_ui_for_compound_type_ui_debug.h | 4 +- .../do_editor_ui_for_compound_type_ui_id.h | 4 +- ...do_editor_ui_for_compound_type_ui_toggle.h | 4 +- ...pound_type_untextured_3d_geometry_buffer.h | 6 +- ...ui_for_compound_type_v2_static_cursor_16.h | 4 +- ...tor_ui_for_compound_type_vertex_material.h | 4 +- ...i_for_compound_type_voronoi_noise_params.h | 4 +- .../do_editor_ui_for_compound_type_vox_data.h | 3 +- .../do_editor_ui_for_compound_type_voxel.h | 4 +- ...itor_ui_for_compound_type_voxel_lighting.h | 3 +- ..._ui_for_compound_type_white_noise_params.h | 3 +- ...o_editor_ui_for_compound_type_work_queue.h | 4 +- ...or_ui_for_compound_type_work_queue_entry.h | 12 +- .../do_editor_ui_for_compound_type_world.h | 12 +- ..._editor_ui_for_compound_type_world_chunk.h | 4 +- ...mpound_type_world_edit_block_array_index.h | 3 +- ...pe_world_update_op_shape_params_cylinder.h | 4 +- ..._type_world_update_op_shape_params_plane.h | 4 +- ...d_type_world_update_op_shape_params_rect.h | 3 +- ...type_world_update_op_shape_params_sphere.h | 6 +- ..._type_world_update_op_shape_params_torus.h | 4 +- ..._ui_for_container_entity_ptr_block_array.h | 3 +- .../do_editor_ui_for_container_model_buffer.h | 3 +- ..._ui_for_container_shader_ptr_block_array.h | 3 +- generated/do_editor_ui_for_container_struct.h | 3 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 3 +- .../do_editor_ui_for_container_v3_cursor.h | 3 +- ...world_edit_block_array_index_block_array.h | 3 +- generated/do_editor_ui_for_enum_asset_type.h | 4 +- generated/do_editor_ui_for_enum_chunk_flag.h | 4 +- generated/do_editor_ui_for_enum_data_type.h | 4 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 4 +- ...editor_ui_for_enum_entity_behavior_flags.h | 4 +- .../do_editor_ui_for_enum_entity_state.h | 4 +- ...o_editor_ui_for_enum_file_traversal_type.h | 4 +- generated/do_editor_ui_for_enum_maybe_tag.h | 4 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 4 +- ...do_editor_ui_for_enum_resolution_setting.h | 4 +- ...itor_ui_for_enum_shader_language_setting.h | 4 +- generated/do_editor_ui_for_enum_shape_axis.h | 4 +- generated/do_editor_ui_for_enum_shape_type.h | 4 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 4 +- .../do_editor_ui_for_enum_ui_noise_type.h | 4 +- ...o_editor_ui_for_enum_visible_region_size.h | 4 +- ..._editor_ui_for_enum_voxel_rule_direction.h | 4 +- ...ui_for_radio_enum_asset_window_view_mode.h | 4 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 4 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 4 +- ...adio_enum_world_edit_blend_mode_modifier.h | 4 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 4 +- ...r_radio_enum_world_edit_color_blend_mode.h | 4 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 4 +- .../do_editor_ui_for_scalar_type_688724926.h | 5 +- .../do_editor_ui_for_vector_type_688873645.h | 12 +- .../flatten_block_array_file_traversal_node.h | 3 +- ...on_pattern_199741702_161749140_632272777.h | 3 +- generated/for_datatypes_0XxWqGSZ.h | 5 +- generated/for_datatypes_Bxw4Q7AW.h | 9 +- generated/for_datatypes_IXWy6K9V.h | 189 ++++++++++++--- generated/for_datatypes_cx51CcgQ.h | 1 + generated/for_datatypes_fkubhsYl.h | 5 +- generated/for_datatypes_kh9dwrCf.h | 215 +++++++++++++++-- generated/for_datatypes_khY6kwEk.h | 3 + generated/for_datatypes_kv3WBTai.h | 5 +- generated/freelist_allocator_octree_node.h | 3 +- generated/freelist_allocator_world_chunk.h | 3 +- generated/gen_are_equal_665365505.h | 4 +- generated/gen_bit_operators_u32.h | 3 +- generated/gen_bit_operators_u64.h | 3 +- generated/gen_common_vector_v2.h | 11 +- generated/gen_common_vector_v3.h | 11 +- generated/gen_common_vector_v3i.h | 11 +- .../gen_constructor_gpu_readback_buffer.h | 7 +- generated/gen_constructor_perlin_params.h | 22 +- generated/gen_constructor_vertex_material.h | 12 +- generated/gen_constructor_voxel_lighting.h | 6 +- .../gen_constructor_voxel_stack_element.h | 7 +- ..._voxel_synthesis_change_propagation_info.h | 12 +- ...n_default_equality_operator_tile_rule_id.h | 3 +- .../gen_default_equality_operator_ui_id.h | 3 +- .../gen_hetero_vector_operators_v2_v2i.h | 7 +- .../gen_hetero_vector_operators_v2i_v2.h | 7 +- .../gen_hetero_vector_operators_v3_u8_v3.h | 7 +- .../gen_hetero_vector_operators_v3_u8_v3i.h | 7 +- .../gen_hetero_vector_operators_v3_v3i.h | 7 +- .../gen_hetero_vector_operators_v3i_v3.h | 7 +- generated/gen_lerp_f32.h | 3 +- generated/gen_lerp_v2.h | 3 +- generated/gen_lerp_v3.h | 3 +- generated/gen_map_value_to_range_r32.h | 3 +- generated/gen_map_value_to_range_s32.h | 3 +- generated/gen_map_value_to_range_u32.h | 3 +- generated/gen_primitive_deep_copy_715421923.h | 4 +- generated/gen_random_between_r32.h | 3 +- generated/gen_random_between_s32.h | 3 +- generated/gen_random_between_u32.h | 3 +- ...ead_primitive_from_native_file_803324607.h | 4 +- ...e_from_u8_cursor_little_endian_851742148.h | 4 +- generated/gen_read_primitive_u32.h | 3 +- generated/gen_read_primitive_u64.h | 3 +- generated/gen_rect_helpers_rect2_v2.h | 3 +- generated/gen_rect_helpers_rect3_v3.h | 3 +- generated/gen_rect_helpers_rect3i_v3i.h | 3 +- generated/gen_shader_uniform_push_camera.h | 3 +- generated/gen_shader_uniform_push_light.h | 3 +- generated/gen_shader_uniform_push_m4.h | 3 +- generated/gen_shader_uniform_push_r32.h | 3 +- generated/gen_shader_uniform_push_s32.h | 3 +- generated/gen_shader_uniform_push_texture.h | 3 +- generated/gen_shader_uniform_push_u32.h | 3 +- generated/gen_shader_uniform_push_v2.h | 3 +- generated/gen_shader_uniform_push_v3.h | 3 +- generated/gen_vector_area_v2.h | 3 +- generated/gen_vector_area_v2i.h | 3 +- .../gen_vector_infix_operator_v3i_688856393.h | 4 +- .../gen_vector_infix_operator_v3i_688856449.h | 4 +- generated/gen_vector_normalize_funcs_v2.h | 3 +- generated/gen_vector_normalize_funcs_v3.h | 3 +- generated/gen_vector_operators_v2.h | 26 ++- generated/gen_vector_operators_v2i.h | 26 ++- generated/gen_vector_operators_v3.h | 26 ++- generated/gen_vector_operators_v3_u8.h | 26 ++- generated/gen_vector_operators_v3i.h | 26 ++- generated/gen_vector_operators_v4.h | 26 ++- ..._wide_vector_operator_688856397_31875099.h | 3 +- ...wide_vector_operator_688856398_962878887.h | 3 +- ...wide_vector_operator_688856400_677608083.h | 3 +- ...wide_vector_operator_688856402_974542050.h | 3 +- ...write_primitive_from_u8_stream_803324607.h | 4 +- .../generate_cursor_debug_profile_scope.h | 14 +- ...generate_cursor_functions_c_token_cursor.h | 14 +- generated/generate_cursor_functions_u64.h | 14 +- generated/generate_cursor_octree_node.h | 14 +- generated/generate_cursor_parser.h | 14 +- generated/generate_cursor_struct_u64.h | 3 +- generated/generate_cursor_texture.h | 14 +- generated/generate_cursor_u8.h | 14 +- generated/generate_cursor_v3.h | 14 +- .../generate_cursor_voxel_stack_element.h | 14 +- generated/generate_stack_octree_node_ptr_0.h | 3 +- ...thesis_change_propagation_info_803395170.h | 3 +- generated/generate_stream_c_token_buffer.h | 3 +- .../generate_stream_compact_standing_spot.h | 3 +- generated/generate_stream_compact_u32.h | 3 +- generated/generate_stream_compact_u64.h | 3 +- generated/generate_stream_compact_v3i.h | 3 +- generated/generate_stream_parser.h | 3 +- generated/generate_stream_standing_spot.h | 3 +- ...rate_stream_tagged_counted_string_stream.h | 3 +- generated/generate_stream_tuple_cs_cs.h | 3 +- generated/generate_stream_u64.h | 3 +- generated/generate_stream_v3i.h | 3 +- generated/generate_string_table_Chunk_ID.h | 43 +++- .../generate_string_table_asset_load_state.h | 32 ++- .../generate_string_table_c_token_type.h | 200 +++++++++++++++- ...erate_string_table_entity_behavior_flags.h | 36 ++- .../generate_string_table_entity_state.h | 31 ++- .../generate_string_table_parse_error_code.h | 53 ++++- .../generate_string_table_text_encoding.h | 39 +++- ...enerate_string_table_token_cursor_source.h | 38 ++- ...e_string_table_world_chunk_mesh_bitfield.h | 34 ++- ...rate_string_table_world_chunk_mesh_index.h | 33 ++- ...ent_buffer_untextured_3d_geometry_buffer.h | 3 +- generated/hashtable_bonsai_type_info.h | 3 +- generated/hashtable_counted_string.h | 3 +- ...table_get_bonsai_type_info_902_689333910.h | 3 +- ...htable_get_ptr_ui_toggle_31501_688856534.h | 3 +- ...et_ptr_window_layout_705671517_599498827.h | 3 +- ...32_hashtable_wrapper_688719149_688856424.h | 3 +- .../hashtable_get_ui_toggle_31501_688856534.h | 3 +- ...le_get_window_layout_705671517_599498827.h | 3 +- generated/hashtable_impl_u32.h | 3 +- generated/hashtable_impl_ui_toggle.h | 3 +- generated/hashtable_impl_window_layout.h | 3 +- generated/hashtable_impl_xml_tag.h | 3 +- generated/hashtable_parser.h | 3 +- generated/hashtable_struct_u32.h | 3 +- generated/hashtable_struct_ui_toggle.h | 3 +- generated/hashtable_struct_window_layout.h | 3 +- generated/hashtable_struct_xml_tag.h | 3 +- .../hashtable_to_buffer_bonsai_type_info.h | 3 +- generated/hashtable_voxel_synth_tile.h | 3 +- generated/hashtable_world_edit_brush.h | 3 +- generated/index_of_counted_string.h | 3 +- generated/maybe_asset_id.h | 3 +- generated/maybe_asset_ptr.h | 3 +- generated/maybe_bonsai_type_info.h | 3 +- generated/maybe_chunk_data.h | 3 +- generated/maybe_entity_ptr.h | 3 +- generated/maybe_file_traversal_node.h | 3 +- generated/maybe_model_buffer.h | 3 +- generated/maybe_standing_spot.h | 3 +- generated/maybe_u32.h | 3 +- generated/maybe_ui_toggle.h | 3 +- generated/maybe_ui_toggle_ptr.h | 3 +- generated/maybe_v3.h | 3 +- generated/maybe_v3i.h | 3 +- generated/maybe_window_layout.h | 3 +- generated/maybe_window_layout_ptr.h | 3 +- ...geometry_buffer_heap_allocator_190647831.h | 3 +- ...d_geometry_buffer_memory_arena_372399955.h | 3 +- generated/parse_integer_136174807.h | 4 +- ..._work_queue_entry__bonsai_render_command.h | 4 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 4 +- .../rectalinear_iteration_pattern_812652930.h | 3 +- generated/scalar_math_fuctions_451039071.h | 4 +- ...world_edit_block_array_index_block_array.h | 3 +- generated/serdes_cursor_v3.h | 3 +- generated/serdes_primitive_592771169.h | 4 +- generated/serdes_primitive_85387614.h | 3 +- generated/serdes_struct_bonsai_type_info.h | 27 ++- .../serdes_struct_bonsai_type_info_buffer.h | 18 +- generated/serdes_struct_brush_layer.h | 12 +- generated/serdes_struct_brush_settings.h | 60 ++++- generated/serdes_struct_camera.h | 73 +++++- generated/serdes_struct_canonical_position.h | 24 +- generated/serdes_struct_entity_0.h | 57 ++++- generated/serdes_struct_entity_1.h | 60 ++++- generated/serdes_struct_entity_id.h | 24 +- generated/serdes_struct_file_traversal_node.h | 27 ++- generated/serdes_struct_frustum.h | 42 +++- generated/serdes_struct_keyframe.h | 24 +- generated/serdes_struct_layered_brush.h | 27 ++- generated/serdes_struct_lighting_settings.h | 60 ++++- generated/serdes_struct_model.h | 38 ++- generated/serdes_struct_noise_layer.h | 30 ++- generated/serdes_struct_noise_layer_0.h | 27 ++- generated/serdes_struct_particle_system.h | 75 +++++- generated/serdes_struct_particle_system_0.h | 75 +++++- generated/serdes_struct_perlin_noise_params.h | 10 +- generated/serdes_struct_physics.h | 33 ++- generated/serdes_struct_plane.h | 14 +- generated/serdes_struct_random_series.h | 10 +- generated/serdes_struct_rect3.h | 24 +- generated/serdes_struct_rect3cp.h | 24 +- generated/serdes_struct_rect3i.h | 24 +- generated/serdes_struct_render_settings.h | 81 ++++++- generated/serdes_struct_shape_layer.h | 42 +++- ...erdes_struct_shape_layer_advanced_params.h | 30 ++- generated/serdes_struct_vertex_material.h | 27 ++- .../serdes_struct_voronoi_noise_params.h | 27 ++- generated/serdes_struct_vox_data.h | 3 +- generated/serdes_struct_voxel.h | 24 +- generated/serdes_struct_voxel_lighting.h | 10 +- generated/serdes_struct_white_noise_params.h | 3 +- generated/serdes_struct_world_chunk.h | 44 +++- generated/serdes_struct_world_chunk_0.h | 66 +++++- generated/serdes_struct_world_edit.h | 32 ++- ...rdes_struct_world_edit_block_array_index.h | 10 +- generated/serdes_struct_world_edit_brush.h | 30 ++- generated/serdes_struct_world_edit_layer.h | 24 +- ...truct_world_update_op_shape_params_asset.h | 27 ++- ..._world_update_op_shape_params_chunk_data.h | 24 +- ...ct_world_update_op_shape_params_cylinder.h | 24 +- ...struct_world_update_op_shape_params_line.h | 27 ++- ...truct_world_update_op_shape_params_plane.h | 24 +- ...struct_world_update_op_shape_params_rect.h | 10 +- ...ruct_world_update_op_shape_params_sphere.h | 24 +- ...truct_world_update_op_shape_params_torus.h | 24 +- generated/serdes_vector_Quaternion.h | 3 +- generated/serdes_vector_v2.h | 3 +- generated/serdes_vector_v2i.h | 3 +- generated/serdes_vector_v3.h | 3 +- generated/serdes_vector_v3i.h | 3 +- generated/serdes_vector_v4.h | 3 +- generated/serialize_struct_entity.h | 38 ++- generated/serialize_struct_level_header.h | 31 ++- .../shader_magic_textured_quad_render_pass.h | 20 +- generated/static_cursor_v2_0_986190493.h | 3 +- .../staticbuffer_u32_cursor_ptr_961996651.h | 3 +- generated/stream_and_cursor_counted_string.h | 14 +- generated/stream_and_cursor_s32.h | 14 +- generated/stream_and_cursor_u32.h | 14 +- .../string_and_value_tables_asset_type.h | 31 ++- ...and_value_tables_bitmap_compression_type.h | 38 ++- .../string_and_value_tables_chunk_flag.h | 34 ++- generated/string_and_value_tables_data_type.h | 31 ++- ..._and_value_tables_engine_debug_view_mode.h | 36 ++- ...g_and_value_tables_enum_brush_layer_type.h | 30 ++- ...ing_and_value_tables_file_traversal_node.h | 31 ++- ...nd_value_tables_lighting_quality_setting.h | 32 ++- generated/string_and_value_tables_log_level.h | 34 ++- generated/string_and_value_tables_maybe_tag.h | 30 ++- .../string_and_value_tables_model_index.h | 67 +++++- ...ing_and_value_tables_particle_spawn_type.h | 32 ++- ...ring_and_value_tables_resolution_setting.h | 31 ++- ...and_value_tables_shader_language_setting.h | 30 ++- ..._and_value_tables_shadow_quality_setting.h | 32 ++- .../string_and_value_tables_shape_axis.h | 36 ++- .../string_and_value_tables_shape_type.h | 34 ++- ..._and_value_tables_texture_storage_format.h | 40 +++- ...tring_and_value_tables_tone_mapping_type.h | 34 ++- .../string_and_value_tables_ui_noise_type.h | 31 ++- ...ing_and_value_tables_visible_region_size.h | 45 +++- ...ng_and_value_tables_voxel_rule_direction.h | 35 ++- ...g_and_value_tables_world_edit_blend_mode.h | 33 ++- ...ue_tables_world_edit_blend_mode_modifier.h | 33 ++- ...value_tables_world_edit_color_blend_mode.h | 32 ++- ...d_value_tables_world_edit_selection_mode.h | 34 ++- generated/string_concat_10.h | 3 +- generated/string_concat_2.h | 3 +- generated/string_concat_3.h | 3 +- generated/string_concat_4.h | 3 +- generated/string_concat_5.h | 3 +- generated/string_concat_6.h | 3 +- generated/string_concat_7.h | 3 +- generated/string_concat_8.h | 3 +- generated/string_concat_9.h | 3 +- .../take_release_sync_lod_element_buffer.h | 3 +- generated/tiered_mesh_freelist.h | 3 +- generated/to_hex_64_272205387.h | 4 +- generated/to_string_primitive_803324607.h | 4 +- generated/to_string_texture.h | 18 +- generated/to_string_vector_240271411.h | 4 +- ...on_group_for_enum_engine_debug_view_mode.h | 4 +- generated/tuple_822959015.h | 5 +- generated/vertex_data_functions_v3.h | 3 +- generated/vertex_data_functions_v3_u8.h | 3 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 3 +- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 3 +- jesse.bonsai.rdbg | Bin 17188 -> 17188 bytes src/engine/work_queue.h | 2 +- 497 files changed, 5402 insertions(+), 1503 deletions(-) create mode 100644 generated/block_array_c_counted_string_688853862_counted_string_block_array_counted_string_block_counted_string_block_array_index.h create mode 100644 generated/block_array_h_counted_string_688853862_0_889429130_894106509_562163350.h diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 93150bc94..6f8de62ef 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 93150bc9405881d02e7eeedad9c6737c6fa7cc52 +Subproject commit 6f8de62ef523b74ba600e0ed63295558c93a7295 diff --git a/generated/anonymous_async_function_call_type_rQAZtEUA.h b/generated/anonymous_async_function_call_type_rQAZtEUA.h index ce3db6b98..56131ed1c 100644 --- a/generated/anonymous_async_function_call_type_rQAZtEUA.h +++ b/generated/anonymous_async_function_call_type_rQAZtEUA.h @@ -1,5 +1,4 @@ // src/engine/work_queue.h:287:0 - { tmatch( initialize_easing_function_visualizer_render_pass_async_params, Task, Job ); DoJob(Job); @@ -9,3 +8,4 @@ DoJob(Job); } break; + diff --git a/generated/anonymous_entity_position_info_ynGg9Dhj.h b/generated/anonymous_entity_position_info_ynGg9Dhj.h index dd4b6af7d..c25c3f14c 100644 --- a/generated/anonymous_entity_position_info_ynGg9Dhj.h +++ b/generated/anonymous_entity_position_info_ynGg9Dhj.h @@ -1,7 +1,7 @@ // src/engine/entity.h:217:0 - Entity->LastResolvedPosInfo.P = Entity->P; Entity->LastResolvedPosInfo._CollisionVolumeRadius = Entity->_CollisionVolumeRadius; Entity->LastResolvedPosInfo.Scale = Entity->Scale; Entity->LastResolvedPosInfo.EulerAngles = Entity->EulerAngles; + diff --git a/generated/anonymous_function_input_HLGbqwh0.h b/generated/anonymous_function_input_HLGbqwh0.h index 8e5bafb0d..53e2c0e07 100644 --- a/generated/anonymous_function_input_HLGbqwh0.h +++ b/generated/anonymous_function_input_HLGbqwh0.h @@ -1,5 +1,4 @@ // external/bonsai_stdlib/src/input.h:162:0 - Input->Enter.Clicked = False; @@ -191,3 +190,4 @@ Input->MMB.Clicked = False; + diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index f046ceba3..bad9c1727 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2522:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2524:0 case type_ui_render_command_window_start: { @@ -6,24 +6,30 @@ case type_ui_render_command_window_start: Result.Min = Min(Result.Min, GetAbsoluteDrawBoundsMin(&Command->ui_render_command_window_start.Layout)); } break; + + + case type_ui_render_command_table_start: { Result.Max = Max(Result.Max, GetAbsoluteDrawBoundsMax(&Command->ui_render_command_table_start.Layout)); Result.Min = Min(Result.Min, GetAbsoluteDrawBoundsMin(&Command->ui_render_command_table_start.Layout)); } break; + case type_ui_render_command_column_start: { Result.Max = Max(Result.Max, GetAbsoluteDrawBoundsMax(&Command->ui_render_command_column_start.Layout)); Result.Min = Min(Result.Min, GetAbsoluteDrawBoundsMin(&Command->ui_render_command_column_start.Layout)); } break; + case type_ui_render_command_text: { Result.Max = Max(Result.Max, GetAbsoluteDrawBoundsMax(&Command->ui_render_command_text.Layout)); Result.Min = Min(Result.Min, GetAbsoluteDrawBoundsMin(&Command->ui_render_command_text.Layout)); } break; + case type_ui_render_command_textured_quad: { Result.Max = Max(Result.Max, GetAbsoluteDrawBoundsMax(&Command->ui_render_command_textured_quad.Layout)); @@ -46,3 +52,7 @@ case type_ui_render_command_untextured_quad_at: + + + + diff --git a/generated/anonymous_input_5Nt8cwGP.h b/generated/anonymous_input_5Nt8cwGP.h index 47e0d9a34..ce6cb33be 100644 --- a/generated/anonymous_input_5Nt8cwGP.h +++ b/generated/anonymous_input_5Nt8cwGP.h @@ -1,5 +1,4 @@ // external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:412:0 - BindKeyupToInput( VK_RETURN, Enter); BindKeyupToInput( VK_ESCAPE, Escape); @@ -46,6 +45,7 @@ BindKeyupToInput( VK_OEM_2, FSlash); BindKeyupToInput( VK_SPACE, Space); + BindKeyupToInput( 0x30, N0); BindKeyupToInput( 0x31, N1); @@ -120,3 +120,7 @@ BindKeyupToInput( 0x5A, Z); + + + + diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index a03e1da2e..36c6680ed 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,22 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3620:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3622:0 + + + + + + + + + + + + + + + + + + if (Input->Dot.Clicked) { @@ -535,3 +553,7 @@ if (Input->Z.Clicked) + + + + diff --git a/generated/anonymous_input_nPw6miGy.h b/generated/anonymous_input_nPw6miGy.h index 019fe6fe8..a264c418a 100644 --- a/generated/anonymous_input_nPw6miGy.h +++ b/generated/anonymous_input_nPw6miGy.h @@ -1,5 +1,4 @@ // external/bonsai_stdlib/src/platform/win32/win32_platform.cpp:440:0 - BindKeydownToInput( VK_RETURN, Enter); BindKeydownToInput( VK_ESCAPE, Escape); @@ -46,6 +45,7 @@ BindKeydownToInput( VK_OEM_2, FSlash); BindKeydownToInput( VK_SPACE, Space); + BindKeydownToInput( 0x30, N0); BindKeydownToInput( 0x31, N1); @@ -120,3 +120,7 @@ BindKeydownToInput( 0x5A, Z); + + + + diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 992815217..c396fe79f 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2475:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2477:0 case type_ui_render_command_window_start: { @@ -6,24 +6,30 @@ case type_ui_render_command_window_start: Command->ui_render_command_window_start.Layout.DrawBounds = InvertedInfinityRectangle(); } break; + + + case type_ui_render_command_table_start: { Command->ui_render_command_table_start.Layout.At = {}; Command->ui_render_command_table_start.Layout.DrawBounds = InvertedInfinityRectangle(); } break; + case type_ui_render_command_column_start: { Command->ui_render_command_column_start.Layout.At = {}; Command->ui_render_command_column_start.Layout.DrawBounds = InvertedInfinityRectangle(); } break; + case type_ui_render_command_text: { Command->ui_render_command_text.Layout.At = {}; Command->ui_render_command_text.Layout.DrawBounds = InvertedInfinityRectangle(); } break; + case type_ui_render_command_textured_quad: { Command->ui_render_command_textured_quad.Layout.At = {}; @@ -46,3 +52,7 @@ case type_ui_render_command_untextured_quad_at: + + + + diff --git a/generated/are_equal_bonsai_type_info.h b/generated/are_equal_bonsai_type_info.h index 8e5948f58..eaae82322 100644 --- a/generated/are_equal_bonsai_type_info.h +++ b/generated/are_equal_bonsai_type_info.h @@ -1,5 +1,4 @@ -// src/engine/bonsai_type_info.h:24:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(bonsai_type_info *Thing1, bonsai_type_info *Thing2) { @@ -12,6 +11,8 @@ AreEqual(bonsai_type_info *Thing1, bonsai_type_info *Thing2) Result &= AreEqual(Thing1->SizeOfInBytes, Thing2->SizeOfInBytes); + + return Result; } else @@ -30,6 +31,8 @@ AreEqual(bonsai_type_info Thing1, bonsai_type_info Thing2) Result &= AreEqual(Thing1.SizeOfInBytes, Thing2.SizeOfInBytes); + + return Result; } diff --git a/generated/are_equal_debug_profile_scope.h b/generated/are_equal_debug_profile_scope.h index 77253a0b9..94baeb23a 100644 --- a/generated/are_equal_debug_profile_scope.h +++ b/generated/are_equal_debug_profile_scope.h @@ -1,5 +1,4 @@ -// external/bonsai_debug/src/api.h:104:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(debug_profile_scope *Thing1, debug_profile_scope *Thing2) { diff --git a/generated/are_equal_file_traversal_node.h b/generated/are_equal_file_traversal_node.h index 6f22dc1d3..7596bc873 100644 --- a/generated/are_equal_file_traversal_node.h +++ b/generated/are_equal_file_traversal_node.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/file.h:28:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(file_traversal_node *Thing1, file_traversal_node *Thing2) { @@ -12,6 +11,8 @@ AreEqual(file_traversal_node *Thing1, file_traversal_node *Thing2) Result &= AreEqual(Thing1->Name, Thing2->Name); + + return Result; } else @@ -30,6 +31,8 @@ AreEqual(file_traversal_node Thing1, file_traversal_node Thing2) Result &= AreEqual(Thing1.Name, Thing2.Name); + + return Result; } diff --git a/generated/are_equal_memory_arena_stats.h b/generated/are_equal_memory_arena_stats.h index f1cabfc23..59f86f545 100644 --- a/generated/are_equal_memory_arena_stats.h +++ b/generated/are_equal_memory_arena_stats.h @@ -1,5 +1,4 @@ -// external/bonsai_debug/debug.h:76:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(memory_arena_stats *Thing1, memory_arena_stats *Thing2) { diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index 23c35d599..6a71a01b5 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,5 +1,4 @@ -// src/engine/world.h:71:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) { diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index c70e08768..59ce6dc7a 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:891:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) { diff --git a/generated/are_equal_rect3cp.h b/generated/are_equal_rect3cp.h index af193f0a7..635bca7a0 100644 --- a/generated/are_equal_rect3cp.h +++ b/generated/are_equal_rect3cp.h @@ -1,5 +1,4 @@ -// src/engine/canonical_position.h:264:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(rect3cp *Thing1, rect3cp *Thing2) { diff --git a/generated/are_equal_render_settings.h b/generated/are_equal_render_settings.h index e2563699a..d92034119 100644 --- a/generated/are_equal_render_settings.h +++ b/generated/are_equal_render_settings.h @@ -1,5 +1,4 @@ -// src/engine/render_settings.h:74:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(render_settings *Thing1, render_settings *Thing2) { diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index 6eaa115f8..a48029a01 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:1183:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) { diff --git a/generated/are_equal_texture.h b/generated/are_equal_texture.h index b6f323ebf..b55db6bf5 100644 --- a/generated/are_equal_texture.h +++ b/generated/are_equal_texture.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/texture_cursor.cpp:1:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(texture *Thing1, texture *Thing2) { @@ -22,6 +21,8 @@ AreEqual(texture *Thing1, texture *Thing2) Result &= AreEqual(Thing1->Queued, Thing2->Queued); + + return Result; } else @@ -50,6 +51,8 @@ AreEqual(texture Thing1, texture Thing2) Result &= AreEqual(Thing1.Queued, Thing2.Queued); + + return Result; } diff --git a/generated/are_equal_ui_toggle.h b/generated/are_equal_ui_toggle.h index d11b8aedb..bf8940eb1 100644 --- a/generated/are_equal_ui_toggle.h +++ b/generated/are_equal_ui_toggle.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:153:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(ui_toggle *Thing1, ui_toggle *Thing2) { diff --git a/generated/are_equal_voxel_synthesis_change_propagation_info.h b/generated/are_equal_voxel_synthesis_change_propagation_info.h index c37931792..24d7aafb4 100644 --- a/generated/are_equal_voxel_synthesis_change_propagation_info.h +++ b/generated/are_equal_voxel_synthesis_change_propagation_info.h @@ -1,5 +1,4 @@ -// src/engine/voxel_synthesis.h:312:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(voxel_synthesis_change_propagation_info *Thing1, voxel_synthesis_change_propagation_info *Thing2) { diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 452093479..4addc41a6 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:1270:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) { diff --git a/generated/are_equal_xml_property.h b/generated/are_equal_xml_property.h index 70758fdf6..fe96925e8 100644 --- a/generated/are_equal_xml_property.h +++ b/generated/are_equal_xml_property.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/xml.cpp:4:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(xml_property *Thing1, xml_property *Thing2) { diff --git a/generated/are_equal_xml_tag.h b/generated/are_equal_xml_tag.h index 895ccc11b..5e39e2ad4 100644 --- a/generated/are_equal_xml_tag.h +++ b/generated/are_equal_xml_tag.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/xml.cpp:7:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(xml_tag *Thing1, xml_tag *Thing2) { diff --git a/generated/are_equal_xml_token.h b/generated/are_equal_xml_token.h index 40a5aeb5c..4265ff348 100644 --- a/generated/are_equal_xml_token.h +++ b/generated/are_equal_xml_token.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/xml.cpp:1:0 - +// external/bonsai_stdlib/src/poof_functions.h:624:0 link_internal b32 AreEqual(xml_token *Thing1, xml_token *Thing2) { diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index 5240da973..13293436e 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/bitmap.cpp:189:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( bitmap_block_array *Array ) } link_internal void -Shift( bitmap_block_array *Array, bitmap *Element ) +Insert( bitmap_block_array *Array, bitmap_block_array_index Index, bitmap *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - bitmap *Prev = {}; // Alocate a new thingy - Push(Array); + bitmap *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( bitmap_block_array *Array, u32 Index, bitmap *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( bitmap_block_array *Array, bitmap *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 330e3ca9d..6fab3b976 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:130:0 - +// external/bonsai_stdlib/src/poof_functions.h:2375:0 @@ -141,24 +140,37 @@ Push( asset_thumbnail_block_array *Array ) } link_internal void -Shift( asset_thumbnail_block_array *Array, asset_thumbnail *Element ) +Insert( asset_thumbnail_block_array *Array, asset_thumbnail_block_array_index Index, asset_thumbnail *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - asset_thumbnail *Prev = {}; // Alocate a new thingy - Push(Array); + asset_thumbnail *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( asset_thumbnail_block_array *Array, u32 Index, asset_thumbnail *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( asset_thumbnail_block_array *Array, asset_thumbnail *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_c_counted_string_688853862_counted_string_block_array_counted_string_block_counted_string_block_array_index.h b/generated/block_array_c_counted_string_688853862_counted_string_block_array_counted_string_block_counted_string_block_array_index.h new file mode 100644 index 000000000..5eda31623 --- /dev/null +++ b/generated/block_array_c_counted_string_688853862_counted_string_block_array_counted_string_block_counted_string_block_array_index.h @@ -0,0 +1,176 @@ +// external/bonsai_stdlib/src/poof_functions.h:2375:0 + + + + +link_internal cs +CS( counted_string_block_array_index Index ) +{ + return FSz("(%u)", Index.Index); +} + +link_internal counted_string * +Set( counted_string_block_array *Arr, + counted_string *Element, + counted_string_block_array_index Index ) +{ + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + counted_string_block *Block = GetBlock(Arr, Index); + umm ElementIndex = Index.Index % 32; + auto Slot = Block->Elements+ElementIndex; + *Slot = *Element; + return Slot; +} + +link_internal void +NewBlock( counted_string_block_array *Arr ) +{ + counted_string_block *NewBlock = Allocate( counted_string_block , Arr->Memory, 1); + counted_string_block **NewBlockPtrs = Allocate( counted_string_block*, Arr->Memory, Arr->BlockCount+1); + + RangeIterator_t(u32, BlockI, Arr->BlockCount) + { + NewBlockPtrs[BlockI] = Arr->BlockPtrs[BlockI]; + } + + NewBlockPtrs[Arr->BlockCount] = NewBlock; + + + + Arr->BlockPtrs = NewBlockPtrs; + Arr->BlockCount += 1; +} + +link_internal void +RemoveUnordered( counted_string_block_array *Array, counted_string_block_array_index Index) +{ + auto LastI = LastIndex(Array); + Assert(Index.Index <= LastI.Index); + + auto LastElement = GetPtr(Array, LastI); + Set(Array, LastElement, Index); + Array->ElementCount -= 1; +} + +link_internal void +RemoveOrdered( counted_string_block_array *Array, counted_string_block_array_index IndexToRemove) +{ + Assert(IndexToRemove.Index < Array->ElementCount); + + counted_string *Prev = {}; + + counted_string_block_array_index Max = AtElements(Array); + RangeIteratorRange_t(umm, Index, Max.Index, IndexToRemove.Index) + { + counted_string *E = GetPtr(Array, Index); + + if (Prev) + { + *Prev = *E; + } + + Prev = E; + } + + Array->ElementCount -= 1; +} + +link_internal void +RemoveOrdered( counted_string_block_array *Array, counted_string *Element ) +{ + IterateOver(Array, E, I) + { + if (E == Element) + { + RemoveOrdered(Array, I); + break; + } + } +} + +link_internal counted_string_block_array_index +Find( counted_string_block_array *Array, counted_string *Query) +{ + counted_string_block_array_index Result = {INVALID_BLOCK_ARRAY_INDEX}; + IterateOver(Array, E, Index) + { + if ( E == Query ) + { + Result = Index; + break; + } + } + return Result; +} + + + +link_internal b32 +IsValid(counted_string_block_array_index *Index) +{ + counted_string_block_array_index Test = {INVALID_BLOCK_ARRAY_INDEX}; + b32 Result = (AreEqual(Index, &Test) == False); + return Result; +} + +link_internal counted_string * +Push( counted_string_block_array *Array, counted_string *Element) +{ + Assert(Array->Memory); + + if (AtElements(Array) == Capacity(Array)) + { + NewBlock(Array); + } + + counted_string *Result = Set(Array, Element, AtElements(Array)); + + Array->ElementCount += 1; + + return Result; +} + +link_internal counted_string * +Push( counted_string_block_array *Array ) +{ + counted_string Element = {}; + auto Result = Push(Array, &Element); + return Result; +} + +link_internal void +Insert( counted_string_block_array *Array, counted_string_block_array_index Index, counted_string *Element ) +{ + Assert(Index.Index <= LastIndex(Array).Index); + Assert(Array->Memory); + + // Alocate a new thingy + counted_string *Prev = Push(Array); + + auto Last = LastIndex(Array); + + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) + { + auto E = GetPtr(Array, umm(I)); + *Prev = *E; + Prev = E; + } + + *Prev = *Element; +} + +link_internal void +Insert( counted_string_block_array *Array, u32 Index, counted_string *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( counted_string_block_array *Array, counted_string *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + + + diff --git a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h index 22dc51019..84c7fe7d7 100644 --- a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h +++ b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.cpp:1:0 - +// external/bonsai_stdlib/src/poof_functions.h:2375:0 @@ -141,24 +140,37 @@ Push( entity_ptr_block_array *Array ) } link_internal void -Shift( entity_ptr_block_array *Array, entity_ptr Element ) +Insert( entity_ptr_block_array *Array, entity_ptr_block_array_index Index, entity_ptr Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - entity_ptr Prev = {}; // Alocate a new thingy - Push(Array); + entity_ptr Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( entity_ptr_block_array *Array, u32 Index, entity_ptr Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( entity_ptr_block_array *Array, entity_ptr Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index d395fa401..a18b28110 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -1,5 +1,4 @@ -// src/engine/render/gpu_timer.cpp:1:0 - +// external/bonsai_stdlib/src/poof_functions.h:2375:0 @@ -141,24 +140,37 @@ Push( gpu_timer_block_array *Array ) } link_internal void -Shift( gpu_timer_block_array *Array, gpu_timer *Element ) +Insert( gpu_timer_block_array *Array, gpu_timer_block_array_index Index, gpu_timer *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - gpu_timer *Prev = {}; // Alocate a new thingy - Push(Array); + gpu_timer *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( gpu_timer_block_array *Array, u32 Index, gpu_timer *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( gpu_timer_block_array *Array, gpu_timer *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index fa7f371a3..9ddd20e70 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:4:0 - +// external/bonsai_stdlib/src/poof_functions.h:2375:0 @@ -141,24 +140,37 @@ Push( shader_ptr_block_array *Array ) } link_internal void -Shift( shader_ptr_block_array *Array, shader_ptr Element ) +Insert( shader_ptr_block_array *Array, shader_ptr_block_array_index Index, shader_ptr Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - shader_ptr Prev = {}; // Alocate a new thingy - Push(Array); + shader_ptr Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( shader_ptr_block_array *Array, u32 Index, shader_ptr Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( shader_ptr_block_array *Array, shader_ptr Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index dec400825..bf3779043 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/texture.cpp:5:0 - +// external/bonsai_stdlib/src/poof_functions.h:2375:0 @@ -141,24 +140,37 @@ Push( texture_block_array *Array ) } link_internal void -Shift( texture_block_array *Array, texture *Element ) +Insert( texture_block_array *Array, texture_block_array_index Index, texture *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - texture *Prev = {}; // Alocate a new thingy - Push(Array); + texture *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( texture_block_array *Array, u32 Index, texture *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( texture_block_array *Array, texture *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index 3d2f8c32b..252abdaca 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/primitive_containers.cpp:2:0 - +// external/bonsai_stdlib/src/poof_functions.h:2375:0 @@ -141,24 +140,37 @@ Push( u32_block_array *Array ) } link_internal void -Shift( u32_block_array *Array, u32 *Element ) +Insert( u32_block_array *Array, u32_block_array_index Index, u32 *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - u32 *Prev = {}; // Alocate a new thingy - Push(Array); + u32 *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( u32_block_array *Array, u32 Index, u32 *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( u32_block_array *Array, u32 *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index b97a9ba5b..264057966 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ansi_stream.cpp:3:0 - +// external/bonsai_stdlib/src/poof_functions.h:2375:0 @@ -141,24 +140,37 @@ Push( u8_cursor_block_array *Array ) } link_internal void -Shift( u8_cursor_block_array *Array, u8_cursor *Element ) +Insert( u8_cursor_block_array *Array, u8_cursor_block_array_index Index, u8_cursor *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - u8_cursor *Prev = {}; // Alocate a new thingy - Push(Array); + u8_cursor *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( u8_cursor_block_array *Array, u32 Index, u8_cursor *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( u8_cursor_block_array *Array, u8_cursor *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 84c6eb02d..97b922590 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,5 +1,4 @@ -// src/engine/graphics.h:170:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( dummy_work_queue_entry_build_chunk_mesh_block_array *Array ) } link_internal void -Shift( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Element ) +Insert( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh_block_array_index Index, dummy_work_queue_entry_build_chunk_mesh *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - dummy_work_queue_entry_build_chunk_mesh *Prev = {}; // Alocate a new thingy - Push(Array); + dummy_work_queue_entry_build_chunk_mesh *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, u32 Index, dummy_work_queue_entry_build_chunk_mesh *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( dummy_work_queue_entry_build_chunk_mesh_block_array *Array, dummy_work_queue_entry_build_chunk_mesh *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index ba0a57f10..a58e770fd 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:369:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( entity_block_array *Array ) } link_internal void -Shift( entity_block_array *Array, entity *Element ) +Insert( entity_block_array *Array, entity_block_array_index Index, entity *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - entity *Prev = {}; // Alocate a new thingy - Push(Array); + entity *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( entity_block_array *Array, u32 Index, entity *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( entity_block_array *Array, entity *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_entity_ptr_688856411_h.h b/generated/block_array_entity_ptr_688856411_h.h index 3eac869df..d26d02171 100644 --- a/generated/block_array_entity_ptr_688856411_h.h +++ b/generated/block_array_entity_ptr_688856411_h.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.h:307:0 - +// external/bonsai_stdlib/src/poof_functions.h:2208:0 diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index e27ae7bc9..45c56dd4c 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/file.cpp:8:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( file_traversal_node_block_array *Array ) } link_internal void -Shift( file_traversal_node_block_array *Array, file_traversal_node *Element ) +Insert( file_traversal_node_block_array *Array, file_traversal_node_block_array_index Index, file_traversal_node *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - file_traversal_node *Prev = {}; // Alocate a new thingy - Push(Array); + file_traversal_node *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( file_traversal_node_block_array *Array, u32 Index, file_traversal_node *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( file_traversal_node_block_array *Array, file_traversal_node *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index 45b93beee..f26f8e8e3 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,5 +1,4 @@ -// src/engine/graphics.h:159:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( gpu_readback_buffer_block_array *Array ) } link_internal void -Shift( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element ) +Insert( gpu_readback_buffer_block_array *Array, gpu_readback_buffer_block_array_index Index, gpu_readback_buffer *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - gpu_readback_buffer *Prev = {}; // Alocate a new thingy - Push(Array); + gpu_readback_buffer *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( gpu_readback_buffer_block_array *Array, u32 Index, gpu_readback_buffer *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( gpu_readback_buffer_block_array *Array, gpu_readback_buffer *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 5cabcf466..3e74a1176 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:726:0 - +// external/bonsai_stdlib/src/poof_functions.h:2208:0 diff --git a/generated/block_array_h_counted_string_688853862_0_889429130_894106509_562163350.h b/generated/block_array_h_counted_string_688853862_0_889429130_894106509_562163350.h new file mode 100644 index 000000000..9fa4e9fa5 --- /dev/null +++ b/generated/block_array_h_counted_string_688853862_0_889429130_894106509_562163350.h @@ -0,0 +1,183 @@ +// external/bonsai_stdlib/src/poof_functions.h:2208:0 + + + + +struct counted_string_block +{ + /* u32 Index; */ + umm At; + counted_string Elements[32]; +}; + +struct counted_string_block_array_index +{ + umm Index; +}; + +struct counted_string_block_array +{ + counted_string_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; + memory_arena *Memory; poof(@no_serialize) + +}; + +link_internal counted_string_block_array +CountedStringBlockArray(memory_arena *Memory) +{ + counted_string_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal b32 +AreEqual(counted_string_block_array_index *Thing1, counted_string_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( counted_string_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(counted_string_block_array_index Thing1, counted_string_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( counted_string_block_array_index ) ); + + return Result; +} + + +typedef counted_string_block_array counted_string_paged_list; + +link_internal counted_string_block_array_index +operator++( counted_string_block_array_index &I0 ) +{ + I0.Index++; + return I0; +} + +link_internal b32 +operator<( counted_string_block_array_index I0, counted_string_block_array_index I1 ) +{ + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( counted_string_block_array_index I0, counted_string_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; + return Result; +} + +link_inline umm +GetIndex( counted_string_block_array_index *Index) +{ + umm Result = Index->Index; + return Result; +} + + +link_internal counted_string_block_array_index +ZerothIndex( counted_string_block_array *Arr ) +{ + return {}; +} + +link_internal counted_string_block_array_index +Capacity( counted_string_block_array *Arr ) +{ + counted_string_block_array_index Result = {Arr->BlockCount * 32}; + return Result; +} + +link_internal counted_string_block_array_index +AtElements( counted_string_block_array *Arr ) +{ + counted_string_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( counted_string_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + +link_internal counted_string_block_array_index +LastIndex( counted_string_block_array *Arr ) +{ + counted_string_block_array_index Result = {}; + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; + return Result; +} + +link_internal umm +Count( counted_string_block_array *Arr ) +{ + auto Result = AtElements(Arr).Index; + return Result; +} + +link_internal counted_string_block * +GetBlock( counted_string_block_array *Arr, counted_string_block_array_index Index ) +{ + umm BlockIndex = Index.Index / 32; + Assert(BlockIndex < Arr->BlockCount); + counted_string_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; +} + +link_internal counted_string * +GetPtr( counted_string_block_array *Arr, counted_string_block_array_index Index ) +{ + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + counted_string_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 32; + counted_string *Result = (Block->Elements + ElementIndex); + return Result; +} + + +link_internal counted_string * +GetPtr( counted_string_block_array *Arr, umm Index ) +{ + counted_string_block_array_index I = {Index}; + return GetPtr(Arr, I); +} + + +link_internal counted_string * +TryGetPtr( counted_string_block_array *Arr, counted_string_block_array_index Index) +{ + counted_string * Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr)) + { + Result = GetPtr(Arr, Index); + } + return Result; +} + +link_internal counted_string * +TryGetPtr( counted_string_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, counted_string_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_h_gpu_timer_688735882_0.h b/generated/block_array_h_gpu_timer_688735882_0.h index 6fcbf97b2..1d9c88c88 100644 --- a/generated/block_array_h_gpu_timer_688735882_0.h +++ b/generated/block_array_h_gpu_timer_688735882_0.h @@ -1,5 +1,4 @@ -// src/engine/render/gpu_timer.h:9:0 - +// external/bonsai_stdlib/src/poof_functions.h:2208:0 diff --git a/generated/block_array_h_shader_ptr_688853971_0.h b/generated/block_array_h_shader_ptr_688853971_0.h index 3bafdfeee..0e3fc0301 100644 --- a/generated/block_array_h_shader_ptr_688853971_0.h +++ b/generated/block_array_h_shader_ptr_688853971_0.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:191:0 - +// external/bonsai_stdlib/src/poof_functions.h:2208:0 diff --git a/generated/block_array_h_texture_688856411.h b/generated/block_array_h_texture_688856411.h index 3e753876b..4dc4d2273 100644 --- a/generated/block_array_h_texture_688856411.h +++ b/generated/block_array_h_texture_688856411.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/texture.h:47:0 - +// external/bonsai_stdlib/src/poof_functions.h:2208:0 diff --git a/generated/block_array_h_texture_688856411_0.h b/generated/block_array_h_texture_688856411_0.h index 6bf6f8410..a9c3cf0d4 100644 --- a/generated/block_array_h_texture_688856411_0.h +++ b/generated/block_array_h_texture_688856411_0.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/texture.h:44:0 - +// external/bonsai_stdlib/src/poof_functions.h:2208:0 diff --git a/generated/block_array_h_u32_688856411.h b/generated/block_array_h_u32_688856411.h index a0fc1fbae..630bfa214 100644 --- a/generated/block_array_h_u32_688856411.h +++ b/generated/block_array_h_u32_688856411.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/primitive_containers.h:14:0 - +// external/bonsai_stdlib/src/poof_functions.h:2208:0 diff --git a/generated/block_array_h_u8_cursor_688856411.h b/generated/block_array_h_u8_cursor_688856411.h index 0ce77ca21..47159715c 100644 --- a/generated/block_array_h_u8_cursor_688856411.h +++ b/generated/block_array_h_u8_cursor_688856411.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ansi_stream.h:6:0 - +// external/bonsai_stdlib/src/poof_functions.h:2208:0 diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index 54e17b378..b961ab123 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.h:428:0 - +// external/bonsai_stdlib/src/poof_functions.h:2208:0 diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index 7683eaf7b..c15a99b25 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -1,5 +1,4 @@ -// src/engine/bonsai_type_info.h:11:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( member_info_block_array *Array ) } link_internal void -Shift( member_info_block_array *Array, member_info *Element ) +Insert( member_info_block_array *Array, member_info_block_array_index Index, member_info *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - member_info *Prev = {}; // Alocate a new thingy - Push(Array); + member_info *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( member_info_block_array *Array, u32 Index, member_info *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( member_info_block_array *Array, member_info *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index fdf1eb1f7..d6f6b155d 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -1,5 +1,4 @@ -// src/engine/model.h:94:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( model_block_array *Array ) } link_internal void -Shift( model_block_array *Array, model *Element ) +Insert( model_block_array *Array, model_block_array_index Index, model *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - model *Prev = {}; // Alocate a new thingy - Push(Array); + model *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( model_block_array *Array, u32 Index, model *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( model_block_array *Array, model *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 07ebd8da5..9493b93b0 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -1,5 +1,4 @@ -// src/engine/world.h:85:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( octree_node_ptr_block_array *Array ) } link_internal void -Shift( octree_node_ptr_block_array *Array, octree_node_ptr Element ) +Insert( octree_node_ptr_block_array *Array, octree_node_ptr_block_array_index Index, octree_node_ptr Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - octree_node_ptr Prev = {}; // Alocate a new thingy - Push(Array); + octree_node_ptr Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( octree_node_ptr_block_array *Array, u32 Index, octree_node_ptr Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( octree_node_ptr_block_array *Array, octree_node_ptr Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index c49c0a0de..0261fd543 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -1,5 +1,4 @@ -// src/engine/world.h:88:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( picked_octree_node_block_array *Array ) } link_internal void -Shift( picked_octree_node_block_array *Array, picked_octree_node *Element ) +Insert( picked_octree_node_block_array *Array, picked_octree_node_block_array_index Index, picked_octree_node *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - picked_octree_node *Prev = {}; // Alocate a new thingy - Push(Array); + picked_octree_node *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( picked_octree_node_block_array *Array, u32 Index, picked_octree_node *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( picked_octree_node_block_array *Array, picked_octree_node *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 0a3181a51..4f46c862a 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.h:463:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( standing_spot_block_array *Array ) } link_internal void -Shift( standing_spot_block_array *Array, standing_spot *Element ) +Insert( standing_spot_block_array *Array, standing_spot_block_array_index Index, standing_spot *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - standing_spot *Prev = {}; // Alocate a new thingy - Push(Array); + standing_spot *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( standing_spot_block_array *Array, u32 Index, standing_spot *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( standing_spot_block_array *Array, standing_spot *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index d3b2aaefd..726837dda 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/texture.cpp:8:0 - +// external/bonsai_stdlib/src/poof_functions.h:2375:0 @@ -141,24 +140,37 @@ Push( texture_ptr_block_array *Array ) } link_internal void -Shift( texture_ptr_block_array *Array, texture_ptr Element ) +Insert( texture_ptr_block_array *Array, texture_ptr_block_array_index Index, texture_ptr Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - texture_ptr Prev = {}; // Alocate a new thingy - Push(Array); + texture_ptr Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( texture_ptr_block_array *Array, u32 Index, texture_ptr Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( texture_ptr_block_array *Array, texture_ptr Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index 59c0ca063..84de9cfb4 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -1,5 +1,4 @@ -// src/engine/model.h:88:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( vox_data_block_array *Array ) } link_internal void -Shift( vox_data_block_array *Array, vox_data *Element ) +Insert( vox_data_block_array *Array, vox_data_block_array_index Index, vox_data *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - vox_data *Prev = {}; // Alocate a new thingy - Push(Array); + vox_data *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( vox_data_block_array *Array, u32 Index, vox_data *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( vox_data_block_array *Array, vox_data *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index eb1a49038..89b71d1d4 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -1,5 +1,4 @@ -// src/engine/world_update.h:18:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( voxel_stack_element_block_array *Array ) } link_internal void -Shift( voxel_stack_element_block_array *Array, voxel_stack_element *Element ) +Insert( voxel_stack_element_block_array *Array, voxel_stack_element_block_array_index Index, voxel_stack_element *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - voxel_stack_element *Prev = {}; // Alocate a new thingy - Push(Array); + voxel_stack_element *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( voxel_stack_element_block_array *Array, u32 Index, voxel_stack_element *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( voxel_stack_element_block_array *Array, voxel_stack_element *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index a5e745f07..b3f522d23 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.cpp:4:0 - +// external/bonsai_stdlib/src/poof_functions.h:2375:0 @@ -141,24 +140,37 @@ Push( world_chunk_ptr_block_array *Array ) } link_internal void -Shift( world_chunk_ptr_block_array *Array, world_chunk_ptr Element ) +Insert( world_chunk_ptr_block_array *Array, world_chunk_ptr_block_array_index Index, world_chunk_ptr Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - world_chunk_ptr Prev = {}; // Alocate a new thingy - Push(Array); + world_chunk_ptr Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( world_chunk_ptr_block_array *Array, u32 Index, world_chunk_ptr Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( world_chunk_ptr_block_array *Array, world_chunk_ptr Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index e215fceb7..a6e7055f2 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:1306:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -337,25 +336,38 @@ Push( world_edit_block_array_index_block_array *Array ) } link_internal void -Shift( world_edit_block_array_index_block_array *Array, world_edit_block_array_index *Element ) +Insert( world_edit_block_array_index_block_array *Array, world_edit_block_array_index_block_array_index Index, world_edit_block_array_index *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - world_edit_block_array_index *Prev = {}; // Alocate a new thingy - Push(Array); + world_edit_block_array_index *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( world_edit_block_array_index_block_array *Array, u32 Index, world_edit_block_array_index *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( world_edit_block_array_index_block_array *Array, world_edit_block_array_index *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 0dfd3ccc8..08a42c980 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:1317:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( world_edit_layer_block_array *Array ) } link_internal void -Shift( world_edit_layer_block_array *Array, world_edit_layer *Element ) +Insert( world_edit_layer_block_array *Array, world_edit_layer_block_array_index Index, world_edit_layer *Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - world_edit_layer *Prev = {}; // Alocate a new thingy - Push(Array); + world_edit_layer *Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( world_edit_layer_block_array *Array, u32 Index, world_edit_layer *Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( world_edit_layer_block_array *Array, world_edit_layer *Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 699e265ca..aee23b616 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:1302:0 - +// external/bonsai_stdlib/src/poof_functions.h:2596:0 @@ -323,25 +322,38 @@ Push( world_edit_ptr_block_array *Array ) } link_internal void -Shift( world_edit_ptr_block_array *Array, world_edit_ptr Element ) +Insert( world_edit_ptr_block_array *Array, world_edit_ptr_block_array_index Index, world_edit_ptr Element ) { + Assert(Index.Index <= LastIndex(Array).Index); Assert(Array->Memory); - world_edit_ptr Prev = {}; // Alocate a new thingy - Push(Array); + world_edit_ptr Prev = Push(Array); + + auto Last = LastIndex(Array); - auto End = AtElements(Array); - RangeIteratorReverse(Index, s32(End.Index)) + RangeIteratorReverseRange(I, s32(Last.Index), s32(Index.Index)) { - auto E = GetPtr(Array, umm(Index)); - if (Prev) { *Prev = *E; } + auto E = GetPtr(Array, umm(I)); + *Prev = *E; Prev = E; } *Prev = *Element; } +link_internal void +Insert( world_edit_ptr_block_array *Array, u32 Index, world_edit_ptr Element ) +{ + Insert(Array, { .Index = Index }, Element); +} + +link_internal void +Shift( world_edit_ptr_block_array *Array, world_edit_ptr Element ) +{ + Insert(Array, { .Index = 0 }, Element); +} + diff --git a/generated/bubble_sort_686708022.h b/generated/bubble_sort_686708022.h index ed444f629..7937ed39f 100644 --- a/generated/bubble_sort_686708022.h +++ b/generated/bubble_sort_686708022.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/sort.h:108:0 - +// external/bonsai_stdlib/src/sort.h:39:0 link_internal void BubbleSort(sort_key *Keys, u32 Count) { @@ -245,3 +244,4 @@ BubbleSort_descending(sort_key_string *Keys, u32 Count) return; } + diff --git a/generated/buffer_asset.h b/generated/buffer_asset.h index 375b5362b..43c1db63f 100644 --- a/generated/buffer_asset.h +++ b/generated/buffer_asset.h @@ -1,5 +1,4 @@ -// src/engine/asset.h:194:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct asset_buffer { umm Count; diff --git a/generated/buffer_bitmap.h b/generated/buffer_bitmap.h index 600d07ee1..41173b2d2 100644 --- a/generated/buffer_bitmap.h +++ b/generated/buffer_bitmap.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/bitmap.cpp:37:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct bitmap_buffer { umm Count; diff --git a/generated/buffer_bonsai_type_info.h b/generated/buffer_bonsai_type_info.h index 8d9bab710..d31193dd7 100644 --- a/generated/buffer_bonsai_type_info.h +++ b/generated/buffer_bonsai_type_info.h @@ -1,5 +1,4 @@ -// src/engine/bonsai_type_info.h:34:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct bonsai_type_info_buffer { umm Count; diff --git a/generated/buffer_builder_tuple_cs_cs.h b/generated/buffer_builder_tuple_cs_cs.h index 186d047fb..306609e04 100644 --- a/generated/buffer_builder_tuple_cs_cs.h +++ b/generated/buffer_builder_tuple_cs_cs.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:46:0 - +// external/bonsai_stdlib/src/poof_functions.h:712:0 struct tuple_cs_cs_buffer_builder { tuple_cs_cs_stream Chunks; diff --git a/generated/buffer_c_struct_u32.h b/generated/buffer_c_struct_u32.h index 77563ddce..16744ab05 100644 --- a/generated/buffer_c_struct_u32.h +++ b/generated/buffer_c_struct_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:1:0 - +// external/bonsai_stdlib/src/poof_functions.h:1401:0 link_internal shader_uniform_buffer ShaderUniformBuffer( u32 ElementCount, memory_arena* Memory) { diff --git a/generated/buffer_c_struct_u64.h b/generated/buffer_c_struct_u64.h index eef485922..5725629e8 100644 --- a/generated/buffer_c_struct_u64.h +++ b/generated/buffer_c_struct_u64.h @@ -1,5 +1,4 @@ -// src/engine/model.cpp:1:0 - +// external/bonsai_stdlib/src/poof_functions.h:1401:0 link_internal model_buffer ModelBuffer( u64 ElementCount, memory_arena* Memory) { diff --git a/generated/buffer_c_token.h b/generated/buffer_c_token.h index c27d663d9..56b7900b4 100644 --- a/generated/buffer_c_token.h +++ b/generated/buffer_c_token.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/c_token.cpp:2:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct c_token_buffer { umm Count; diff --git a/generated/buffer_c_token_buffer.h b/generated/buffer_c_token_buffer.h index 6f65923bd..3bd27ccb9 100644 --- a/generated/buffer_c_token_buffer.h +++ b/generated/buffer_c_token_buffer.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/c_token.cpp:5:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct c_token_buffer_buffer { umm Count; diff --git a/generated/buffer_counted_string.h b/generated/buffer_counted_string.h index 3a87ff20e..2f19f523d 100644 --- a/generated/buffer_counted_string.h +++ b/generated/buffer_counted_string.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:18:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct counted_string_buffer { umm Count; diff --git a/generated/buffer_file_traversal_node.h b/generated/buffer_file_traversal_node.h index b1a80e173..9b1ff0667 100644 --- a/generated/buffer_file_traversal_node.h +++ b/generated/buffer_file_traversal_node.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/file.cpp:5:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct file_traversal_node_buffer { umm Count; diff --git a/generated/buffer_h_struct_u32.h b/generated/buffer_h_struct_u32.h index c4f196bc5..376d7253b 100644 --- a/generated/buffer_h_struct_u32.h +++ b/generated/buffer_h_struct_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/shader.h:172:0 - +// external/bonsai_stdlib/src/poof_functions.h:1325:0 struct shader_uniform_buffer { u32 Count; diff --git a/generated/buffer_is_marked_for_growth_untextured_3d_geometry_buffer.h b/generated/buffer_is_marked_for_growth_untextured_3d_geometry_buffer.h index bc5ceed27..8f1f15494 100644 --- a/generated/buffer_is_marked_for_growth_untextured_3d_geometry_buffer.h +++ b/generated/buffer_is_marked_for_growth_untextured_3d_geometry_buffer.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:80:0 - +// src/engine/mesh.h:56:0 link_internal b32 BufferIsMarkedForGrowth(untextured_3d_geometry_buffer *Dest) { diff --git a/generated/buffer_model.h b/generated/buffer_model.h index 4fdabcce8..eae84bc49 100644 --- a/generated/buffer_model.h +++ b/generated/buffer_model.h @@ -1,5 +1,4 @@ -// src/engine/model.h:91:0 - +// external/bonsai_stdlib/src/poof_functions.h:1425:0 struct model_buffer { u64 Count; diff --git a/generated/buffer_octree_node_ptr.h b/generated/buffer_octree_node_ptr.h index cdfbdf23d..b0b03f30a 100644 --- a/generated/buffer_octree_node_ptr.h +++ b/generated/buffer_octree_node_ptr.h @@ -1,5 +1,4 @@ -// src/engine/world.h:62:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct octree_node_ptr_buffer { umm Count; diff --git a/generated/buffer_rect3i.h b/generated/buffer_rect3i.h index 89e49322f..65615a5c5 100644 --- a/generated/buffer_rect3i.h +++ b/generated/buffer_rect3i.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/rect.cpp:1:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct rect3i_buffer { umm Count; diff --git a/generated/buffer_sort_key.h b/generated/buffer_sort_key.h index 911566631..d902b5bf7 100644 --- a/generated/buffer_sort_key.h +++ b/generated/buffer_sort_key.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/sort.cpp:1:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct sort_key_buffer { umm Count; diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 7d32bb6d2..44311ea49 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.h:490:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct standing_spot_buffer { umm Count; diff --git a/generated/buffer_thread_main_callback_type.h b/generated/buffer_thread_main_callback_type.h index 140fdafdb..5aef60391 100644 --- a/generated/buffer_thread_main_callback_type.h +++ b/generated/buffer_thread_main_callback_type.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/thread.cpp:1:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct thread_main_callback_type_buffer { umm Count; diff --git a/generated/buffer_tile_ruleset.h b/generated/buffer_tile_ruleset.h index 70e0c31d6..e13ee6755 100644 --- a/generated/buffer_tile_ruleset.h +++ b/generated/buffer_tile_ruleset.h @@ -1,5 +1,4 @@ -// src/engine/voxel_synthesis.h:65:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct tile_ruleset_buffer { umm Count; diff --git a/generated/buffer_u32.h b/generated/buffer_u32.h index a6ff5cbfc..072748099 100644 --- a/generated/buffer_u32.h +++ b/generated/buffer_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:3:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct u32_buffer { umm Count; diff --git a/generated/buffer_u64.h b/generated/buffer_u64.h index a60ca8b23..c33c7e3c5 100644 --- a/generated/buffer_u64.h +++ b/generated/buffer_u64.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:23:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct u64_buffer { umm Count; diff --git a/generated/buffer_ui_toggle_button_handle.h b/generated/buffer_ui_toggle_button_handle.h index b7187f560..6c5f01af3 100644 --- a/generated/buffer_ui_toggle_button_handle.h +++ b/generated/buffer_ui_toggle_button_handle.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:16:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct ui_toggle_button_handle_buffer { umm Count; diff --git a/generated/buffer_v3i.h b/generated/buffer_v3i.h index 1ae9dba72..74f364937 100644 --- a/generated/buffer_v3i.h +++ b/generated/buffer_v3i.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.cpp:2:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct v3i_buffer { umm Count; diff --git a/generated/buffer_voxel_synth_tile.h b/generated/buffer_voxel_synth_tile.h index fc401451f..bcc1ab7bd 100644 --- a/generated/buffer_voxel_synth_tile.h +++ b/generated/buffer_voxel_synth_tile.h @@ -1,5 +1,4 @@ -// src/engine/voxel_synthesis.h:85:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct voxel_synth_tile_buffer { umm Count; diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index f8d7c2fbe..d3c4b4ca5 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.h:425:0 - +// external/bonsai_stdlib/src/poof_functions.h:1432:0 struct world_chunk_ptr_buffer { umm Count; diff --git a/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3.h b/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3.h index 718201347..197c96aff 100644 --- a/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3.h +++ b/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:604:0 - +// src/engine/mesh.h:555:0 // // Rotate, Scale and Offset // diff --git a/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3_u8.h b/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3_u8.h index 72b6f8a6b..f907caf78 100644 --- a/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/checked_vertex_buffering_functions_h_untextured_3d_geometry_buffer_v3_u8.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:606:0 - +// src/engine/mesh.h:555:0 // // Rotate, Scale and Offset // diff --git a/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_f32.h b/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_f32.h index ded2dcb25..d58994418 100644 --- a/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_f32.h +++ b/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_f32.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:618:0 - +// src/engine/mesh.h:398:0 // // Rotate, Scale and Offset // diff --git a/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_u8.h index 4ca467207..55394e13e 100644 --- a/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/checked_vertex_buffering_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:620:0 - +// src/engine/mesh.h:398:0 // // Rotate, Scale and Offset // diff --git a/generated/copy_normal_buffer_v3_u8_v3.h b/generated/copy_normal_buffer_v3_u8_v3.h index 6a8be4f00..7b04fa18a 100644 --- a/generated/copy_normal_buffer_v3_u8_v3.h +++ b/generated/copy_normal_buffer_v3_u8_v3.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:319:0 - +// src/engine/mesh.h:264:0 link_inline void CopyNormalBuffer( v3_u8 *Dest, v3 *Src, u32 NumVerts, Quaternion Rot) { diff --git a/generated/copy_normal_buffer_v3_u8_v3_u8.h b/generated/copy_normal_buffer_v3_u8_v3_u8.h index 0e1948c09..ebcefc14e 100644 --- a/generated/copy_normal_buffer_v3_u8_v3_u8.h +++ b/generated/copy_normal_buffer_v3_u8_v3_u8.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:317:0 - +// src/engine/mesh.h:264:0 link_inline void CopyNormalBuffer( v3_u8 *Dest, v3_u8 *Src, u32 NumVerts, Quaternion Rot) { diff --git a/generated/copy_normal_buffer_v3_v3.h b/generated/copy_normal_buffer_v3_v3.h index d9504e249..00a4ba65d 100644 --- a/generated/copy_normal_buffer_v3_v3.h +++ b/generated/copy_normal_buffer_v3_v3.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:321:0 - +// src/engine/mesh.h:264:0 link_inline void CopyNormalBuffer( v3 *Dest, v3 *Src, u32 NumVerts, Quaternion Rot) { diff --git a/generated/copy_normal_buffer_v3_v3_u8.h b/generated/copy_normal_buffer_v3_v3_u8.h index f8e7f56d4..39bfc40da 100644 --- a/generated/copy_normal_buffer_v3_v3_u8.h +++ b/generated/copy_normal_buffer_v3_v3_u8.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:323:0 - +// src/engine/mesh.h:264:0 link_inline void CopyNormalBuffer( v3 *Dest, v3_u8 *Src, u32 NumVerts, Quaternion Rot) { diff --git a/generated/copy_vertex_buffer_v3_u8_v3.h b/generated/copy_vertex_buffer_v3_u8_v3.h index 0958f09ff..d618fbb9a 100644 --- a/generated/copy_vertex_buffer_v3_u8_v3.h +++ b/generated/copy_vertex_buffer_v3_u8_v3.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:310:0 - +// src/engine/mesh.h:148:0 // // Offset, Scale, Rotate // diff --git a/generated/copy_vertex_buffer_v3_u8_v3_u8.h b/generated/copy_vertex_buffer_v3_u8_v3_u8.h index ced6939d5..fb29e8b25 100644 --- a/generated/copy_vertex_buffer_v3_u8_v3_u8.h +++ b/generated/copy_vertex_buffer_v3_u8_v3_u8.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:308:0 - +// src/engine/mesh.h:148:0 // // Offset, Scale, Rotate // diff --git a/generated/copy_vertex_buffer_v3_v3.h b/generated/copy_vertex_buffer_v3_v3.h index 1a8e30ce0..385c71b1d 100644 --- a/generated/copy_vertex_buffer_v3_v3.h +++ b/generated/copy_vertex_buffer_v3_v3.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:312:0 - +// src/engine/mesh.h:148:0 // // Offset, Scale, Rotate // diff --git a/generated/copy_vertex_buffer_v3_v3_u8_f32.h b/generated/copy_vertex_buffer_v3_v3_u8_f32.h index e3473faaf..72ab94f86 100644 --- a/generated/copy_vertex_buffer_v3_v3_u8_f32.h +++ b/generated/copy_vertex_buffer_v3_v3_u8_f32.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:314:0 - +// src/engine/mesh.h:148:0 // // Offset, Scale, Rotate // diff --git a/generated/cursor_v3i.h b/generated/cursor_v3i.h index 27da027cc..b789b8a2b 100644 --- a/generated/cursor_v3i.h +++ b/generated/cursor_v3i.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.cpp:5:0 - +// external/bonsai_stdlib/src/poof_functions.h:1538:0 struct v3i_cursor { v3i *Start; @@ -14,11 +13,12 @@ link_internal v3i_cursor V3iCursor(umm ElementCount, memory_arena* Memory) { v3i *Start = (v3i*)PushStruct(Memory, sizeof(v3i)*ElementCount, 1, 0); - v3i_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + v3i_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index 9898ddbd0..677b8810f 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -1,287 +1,287 @@ -// src/engine/render_command.h:220:0 +// external/bonsai_stdlib/src/poof_functions.h:76:0 link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_initialize_noise_buffer A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_initialize_noise_buffer A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_initialize_noise_buffer, .bonsai_render_command_initialize_noise_buffer = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_clear_all_framebuffers A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_clear_all_framebuffers A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_clear_all_framebuffers, .bonsai_render_command_clear_all_framebuffers = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_allocate_texture A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_allocate_texture A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_allocate_texture, .bonsai_render_command_allocate_texture = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_deallocate_texture A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_deallocate_texture A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_deallocate_texture, .bonsai_render_command_deallocate_texture = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_allocate_buffers A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_allocate_buffers A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_allocate_buffers, .bonsai_render_command_allocate_buffers = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_reallocate_buffers A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_reallocate_buffers A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_reallocate_buffers, .bonsai_render_command_reallocate_buffers = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_deallocate_buffers A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_deallocate_buffers A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_deallocate_buffers, .bonsai_render_command_deallocate_buffers = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_deallocate_world_chunk A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_deallocate_world_chunk A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_deallocate_world_chunk, .bonsai_render_command_deallocate_world_chunk = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_do_stuff A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_do_stuff A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_do_stuff, .bonsai_render_command_do_stuff = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_allocate_and_map_gpu_element_buffer A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_allocate_and_map_gpu_element_buffer A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_allocate_and_map_gpu_element_buffer, .bonsai_render_command_allocate_and_map_gpu_element_buffer = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_unmap_gpu_element_buffer A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_unmap_gpu_element_buffer A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_unmap_gpu_element_buffer, .bonsai_render_command_unmap_gpu_element_buffer = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_unmap_and_deallocate_buffer A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_unmap_and_deallocate_buffer A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_unmap_and_deallocate_buffer, .bonsai_render_command_unmap_and_deallocate_buffer = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_setup_shader A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_setup_shader A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_setup_shader, .bonsai_render_command_setup_shader = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_teardown_shader A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_teardown_shader A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_teardown_shader, .bonsai_render_command_teardown_shader = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_set_shader_uniform A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_set_shader_uniform A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_set_shader_uniform, .bonsai_render_command_set_shader_uniform = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_draw_world_chunk_draw_list A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_draw_world_chunk_draw_list A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_draw_world_chunk_draw_list, .bonsai_render_command_draw_world_chunk_draw_list = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_draw_all_entities A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_draw_all_entities A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_draw_all_entities, .bonsai_render_command_draw_all_entities = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_gl_timer_init A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_gl_timer_init A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_gl_timer_init, .bonsai_render_command_gl_timer_init = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_gl_timer_start A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_gl_timer_start A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_gl_timer_start, .bonsai_render_command_gl_timer_start = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_gl_timer_end A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_gl_timer_end A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_gl_timer_end, .bonsai_render_command_gl_timer_end = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_gl_timer_read_value_and_histogram A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_gl_timer_read_value_and_histogram A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_gl_timer_read_value_and_histogram, .bonsai_render_command_gl_timer_read_value_and_histogram = A, - + }; return Result; } link_internal work_queue_entry__bonsai_render_command -WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_cancel_all_noise_readback_jobs A ) +WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_cancel_all_noise_readback_jobs A ) { work_queue_entry__bonsai_render_command Result = { .Type = type_bonsai_render_command_cancel_all_noise_readback_jobs, .bonsai_render_command_cancel_all_noise_readback_jobs = A, - + }; return Result; @@ -290,6 +290,9 @@ WorkQueueEntryBonsaiRenderCommand( bonsai_render_command_cancel_all_noise_readba + + + link_internal bonsai_render_command_initialize_noise_buffer BonsaiRenderCommandInitializeNoiseBuffer( octree_node * DestNode ) { @@ -299,7 +302,8 @@ BonsaiRenderCommandInitializeNoiseBuffer( octree_node * DestNode ) }; - + + return Reuslt; } @@ -312,7 +316,8 @@ BonsaiRenderCommandClearAllFramebuffers( u32 Ignored ) }; - + + return Reuslt; } @@ -323,9 +328,13 @@ BonsaiRenderCommandAllocateTexture( texture * Texture , void * Data ) .Texture = Texture , .Data = Data + + }; + + return Reuslt; } @@ -336,9 +345,13 @@ BonsaiRenderCommandDeallocateTexture( u32 * Buffers , s32 Count ) .Buffers = Buffers , .Count = Count + + }; + + return Reuslt; } @@ -349,9 +362,13 @@ BonsaiRenderCommandAllocateBuffers( u32 * Buffers , s32 Count ) .Buffers = Buffers , .Count = Count + + }; + + return Reuslt; } @@ -362,9 +379,13 @@ BonsaiRenderCommandReallocateBuffers( gpu_element_buffer_handles * Handles , u .Handles = Handles , .Mesh = Mesh + + }; + + return Reuslt; } @@ -375,6 +396,8 @@ BonsaiRenderCommandDeallocateBuffers( u32 * Buffers , s32 Count ) .Buffers = {} , .Count = Count + + }; RangeIterator(Index, s32(Count)) @@ -382,6 +405,7 @@ BonsaiRenderCommandDeallocateBuffers( u32 * Buffers , s32 Count ) Reuslt.Buffers[Index] = Buffers[Index]; } + return Reuslt; } @@ -395,7 +419,8 @@ BonsaiRenderCommandDeallocateWorldChunk( world_chunk * Chunk ) }; - + + return Reuslt; } @@ -408,7 +433,8 @@ BonsaiRenderCommandDoStuff( u32 Ignored ) }; - + + return Reuslt; } @@ -419,15 +445,22 @@ BonsaiRenderCommandAllocateAndMapGpuElementBuffer( data_type Type , u32 Ele .Type = Type , .ElementCount = ElementCount -, - .Dest = Dest -, - .SynChunk = SynChunk -, - .DestNode = DestNode + +, .Dest = Dest + +, .SynChunk = SynChunk + +, .DestNode = DestNode + + }; + + + + + return Reuslt; } @@ -438,9 +471,13 @@ BonsaiRenderCommandUnmapGpuElementBuffer( gpu_mapped_element_buffer Buf , oct .Buf = Buf , .DestNode = DestNode + + }; + + return Reuslt; } @@ -453,7 +490,8 @@ BonsaiRenderCommandUnmapAndDeallocateBuffer( gpu_readback_buffer PBOBuf ) }; - + + return Reuslt; } @@ -466,7 +504,8 @@ BonsaiRenderCommandSetupShader( bonsai_render_command_shader_id ShaderId ) }; - + + return Reuslt; } @@ -479,7 +518,8 @@ BonsaiRenderCommandTeardownShader( bonsai_render_command_shader_id ShaderId }; - + + return Reuslt; } @@ -490,11 +530,16 @@ BonsaiRenderCommandSetShaderUniform( shader_uniform Uniform , shader * Shade .Uniform = Uniform , .Shader = Shader -, - .TextureUnit = TextureUnit + +, .TextureUnit = TextureUnit + + }; + + + return Reuslt; } @@ -505,11 +550,16 @@ BonsaiRenderCommandDrawWorldChunkDrawList( world_chunk_ptr_paged_list * DrawLi .DrawList = DrawList , .Shader = Shader -, - .Camera = Camera + +, .Camera = Camera + + }; + + + return Reuslt; } @@ -522,7 +572,8 @@ BonsaiRenderCommandDrawAllEntities( shader * Shader ) }; - + + return Reuslt; } @@ -535,7 +586,8 @@ BonsaiRenderCommandGlTimerInit( u32 * GlTimerObject ) }; - + + return Reuslt; } @@ -548,7 +600,8 @@ BonsaiRenderCommandGlTimerStart( u32 GlTimerObject ) }; - + + return Reuslt; } @@ -561,7 +614,8 @@ BonsaiRenderCommandGlTimerEnd( u32 GlTimerObject ) }; - + + return Reuslt; } @@ -574,7 +628,8 @@ BonsaiRenderCommandGlTimerReadValueAndHistogram( u32 GlTimerObject ) }; - + + return Reuslt; } @@ -591,3 +646,5 @@ BonsaiRenderCommandCancelAllNoiseReadbackJobs( ) + + diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 1755ba679..20d36236b 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,144 +1,144 @@ -// src/engine/work_queue.h:238:0 +// external/bonsai_stdlib/src/poof_functions.h:49:0 link_internal work_queue_entry -WorkQueueEntry( work_queue_entry_init_world_chunk A ) +WorkQueueEntry( work_queue_entry_init_world_chunk A ) { work_queue_entry Result = { .Type = type_work_queue_entry_init_world_chunk, .work_queue_entry_init_world_chunk = A, - + }; return Result; } link_internal work_queue_entry -WorkQueueEntry( work_queue_entry_finalize_noise_values A ) +WorkQueueEntry( work_queue_entry_finalize_noise_values A ) { work_queue_entry Result = { .Type = type_work_queue_entry_finalize_noise_values, .work_queue_entry_finalize_noise_values = A, - + }; return Result; } link_internal work_queue_entry -WorkQueueEntry( work_queue_entry_build_chunk_mesh A ) +WorkQueueEntry( work_queue_entry_build_chunk_mesh A ) { work_queue_entry Result = { .Type = type_work_queue_entry_build_chunk_mesh, .work_queue_entry_build_chunk_mesh = A, - + }; return Result; } link_internal work_queue_entry -WorkQueueEntry( work_queue_entry_copy_buffer_set A ) +WorkQueueEntry( work_queue_entry_copy_buffer_set A ) { work_queue_entry Result = { .Type = type_work_queue_entry_copy_buffer_set, .work_queue_entry_copy_buffer_set = A, - + }; return Result; } link_internal work_queue_entry -WorkQueueEntry( work_queue_entry_copy_buffer_ref A ) +WorkQueueEntry( work_queue_entry_copy_buffer_ref A ) { work_queue_entry Result = { .Type = type_work_queue_entry_copy_buffer_ref, .work_queue_entry_copy_buffer_ref = A, - + }; return Result; } link_internal work_queue_entry -WorkQueueEntry( work_queue_entry_init_asset A ) +WorkQueueEntry( work_queue_entry_init_asset A ) { work_queue_entry Result = { .Type = type_work_queue_entry_init_asset, .work_queue_entry_init_asset = A, - + }; return Result; } link_internal work_queue_entry -WorkQueueEntry( work_queue_entry_rebuild_mesh A ) +WorkQueueEntry( work_queue_entry_rebuild_mesh A ) { work_queue_entry Result = { .Type = type_work_queue_entry_rebuild_mesh, .work_queue_entry_rebuild_mesh = A, - + }; return Result; } link_internal work_queue_entry -WorkQueueEntry( work_queue_entry_sim_particle_system A ) +WorkQueueEntry( work_queue_entry_sim_particle_system A ) { work_queue_entry Result = { .Type = type_work_queue_entry_sim_particle_system, .work_queue_entry_sim_particle_system = A, - + }; return Result; } link_internal work_queue_entry -WorkQueueEntry( work_queue_entry__bonsai_render_command A ) +WorkQueueEntry( work_queue_entry__bonsai_render_command A ) { work_queue_entry Result = { .Type = type_work_queue_entry__bonsai_render_command, .work_queue_entry__bonsai_render_command = A, - + }; return Result; } link_internal work_queue_entry -WorkQueueEntry( work_queue_entry_async_function_call A ) +WorkQueueEntry( work_queue_entry_async_function_call A ) { work_queue_entry Result = { .Type = type_work_queue_entry_async_function_call, .work_queue_entry_async_function_call = A, - + }; return Result; } link_internal work_queue_entry -WorkQueueEntry( work_queue_entry__align_to_cache_line_helper A ) +WorkQueueEntry( work_queue_entry__align_to_cache_line_helper A ) { work_queue_entry Result = { .Type = type_work_queue_entry__align_to_cache_line_helper, .work_queue_entry__align_to_cache_line_helper = A, - + }; return Result; @@ -146,3 +146,5 @@ WorkQueueEntry( work_queue_entry__align_to_cache_line_helper A ) + + diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 15559dfd0..59aa99f48 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,5 +1,4 @@ // external/bonsai_stdlib/src/ui/ui.h:892:0 - enum ui_render_command_type { type_ui_render_command_noop, diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index 3bef84c95..80ee4fe54 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,5 +1,4 @@ // src/engine/work_queue.h:207:0 - enum work_queue_entry_type { type_work_queue_entry_noop, diff --git a/generated/d_union_work_queue_entry__bonsai_render_command.h b/generated/d_union_work_queue_entry__bonsai_render_command.h index ea541b819..0d66a5c4f 100644 --- a/generated/d_union_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_work_queue_entry__bonsai_render_command.h @@ -1,5 +1,4 @@ // src/engine/render_command.h:179:0 - enum work_queue_entry__bonsai_render_command_type { type_work_queue_entry__bonsai_render_command_noop, diff --git a/generated/deep_copy_u32_stream.h b/generated/deep_copy_u32_stream.h index bcaabffde..59f59408c 100644 --- a/generated/deep_copy_u32_stream.h +++ b/generated/deep_copy_u32_stream.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:15:0 - +// external/bonsai_stdlib/src/poof_functions.h:1296:0 /* link_internal void */ /* DeepCopy( Type.name *Src, Type.name *Dest) */ /* { */ diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 301561cf6..32a6bc463 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:1125:0 - +// src/engine/serdes.h:15:0 Live->Type = Stored->Type; @@ -10,3 +9,7 @@ Live->Perlin = Stored->Perlin; Live->Voronoi = Stored->Voronoi; + + + + diff --git a/generated/default_marshal_particle_system_0.h b/generated/default_marshal_particle_system_0.h index b4db7e731..926746e72 100644 --- a/generated/default_marshal_particle_system_0.h +++ b/generated/default_marshal_particle_system_0.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:283:0 - +// src/engine/serdes.h:15:0 Live->Entropy = Stored->Entropy; @@ -93,3 +92,4 @@ RangeIterator(Index, 6) + diff --git a/generated/default_marshal_world_chunk_0.h b/generated/default_marshal_world_chunk_0.h index 5d13ff442..25ed30097 100644 --- a/generated/default_marshal_world_chunk_0.h +++ b/generated/default_marshal_world_chunk_0.h @@ -1,4 +1,4 @@ -// src/engine/serdes.cpp:55:0 +// src/engine/serdes.h:15:0 Live->Dim = Stored->Dim; @@ -12,9 +12,20 @@ Live->VoxelLighting = Stored->VoxelLighting; + + Live->WorldP = Stored->WorldP; + + + + + + + + + diff --git a/generated/deserialize_struct_camera_0.h b/generated/deserialize_struct_camera_0.h index f66312cfd..758912a79 100644 --- a/generated/deserialize_struct_camera_0.h +++ b/generated/deserialize_struct_camera_0.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:74:0 - +// src/engine/serdes.h:252:0 link_internal b32 Deserialize(u8_cursor *Bytes, camera_0 *Element, memory_arena *Memory, umm Count = 1); @@ -97,7 +96,24 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_0 *Element, memory_arena *Mem // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->GhostId, Memory); + + + + + + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/deserialize_struct_camera_1.h b/generated/deserialize_struct_camera_1.h index 53a172280..029cb414d 100644 --- a/generated/deserialize_struct_camera_1.h +++ b/generated/deserialize_struct_camera_1.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:71:0 - +// src/engine/serdes.h:252:0 link_internal b32 Deserialize(u8_cursor *Bytes, camera_1 *Element, memory_arena *Memory, umm Count = 1); @@ -129,7 +128,28 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera_1 *Element, memory_arena *Mem // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->GhostId, Memory); + + + + + + + + + + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/deserialize_struct_entity.h b/generated/deserialize_struct_entity.h index 8ba8299d6..828082599 100644 --- a/generated/deserialize_struct_entity.h +++ b/generated/deserialize_struct_entity.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:361:0 - +// src/engine/serdes.h:252:0 link_internal b32 Deserialize(u8_cursor *Bytes, entity *Element, memory_arena *Memory, umm Count = 1); @@ -105,6 +104,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor + + b64 HadEmitterPointer = Read_u64(Bytes); Assert(HadEmitterPointer < 2); // Should be 0 or 1 @@ -138,7 +139,20 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor if (EntityUserDataDeserialize) {Result &= EntityUserDataDeserialize(Bytes, &Element->UserType, &Element->UserData, Memory);} - if (HadEmitterPointer) + + + + + + + + + + + + + + if (HadEmitterPointer) { umm Count = 1; @@ -152,6 +166,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity *Element, memory_arena *Memor } + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/deserialize_struct_level_header.h b/generated/deserialize_struct_level_header.h index 3cf6b75c9..856be64d3 100644 --- a/generated/deserialize_struct_level_header.h +++ b/generated/deserialize_struct_level_header.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:383:0 - +// src/engine/serdes.h:252:0 link_internal b32 Deserialize(u8_cursor *Bytes, level_header *Element, memory_arena *Memory, umm Count = 1); @@ -90,7 +89,23 @@ DeserializeCurrentVersion(u8_cursor *Bytes, level_header *Element, memory_arena Result &= Deserialize(Bytes, Element->TerrainDecorationShader, Memory, Count); } + + + + + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/do_editor_ui_for_compound_type_animation.h b/generated/do_editor_ui_for_compound_type_animation.h index 3e8412c86..e8d6c29ef 100644 --- a/generated/do_editor_ui_for_compound_type_animation.h +++ b/generated/do_editor_ui_for_compound_type_animation.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:340:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -234,6 +233,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, animation *Element, cs Name, } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_asset.h b/generated/do_editor_ui_for_compound_type_asset.h index 2f497e147..4a86a17f6 100644 --- a/generated/do_editor_ui_for_compound_type_asset.h +++ b/generated/do_editor_ui_for_compound_type_asset.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:513:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -137,10 +136,17 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset *Element, cs Name, u32 cs MemberName = CSz("(anonymous)"); - + + + + + + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_asset_id.h b/generated/do_editor_ui_for_compound_type_asset_id.h index 372a3f9c5..ff0c4794d 100644 --- a/generated/do_editor_ui_for_compound_type_asset_id.h +++ b/generated/do_editor_ui_for_compound_type_asset_id.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:505:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -80,6 +79,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_id *Element, cs Name, u } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h index 321d7ffe4..eddddfb81 100644 --- a/generated/do_editor_ui_for_compound_type_asset_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_asset_thumbnail.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:381:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -79,6 +78,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_thumbnail *Element, cs } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_bonsai_futex.h b/generated/do_editor_ui_for_compound_type_bonsai_futex.h index 308ca3fed..36072e8fe 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_futex.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_futex.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:346:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -81,6 +80,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_futex *Element, cs Nam PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h index bc2064421..af8ebf8a3 100644 --- a/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h +++ b/generated/do_editor_ui_for_compound_type_bonsai_stdlib.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:279:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -103,6 +102,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na + } + + + { + + + + cs MemberName = CSz("GL"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(opengl*, &Element->GL), + MemberName, + ThisHash, + Params + ); + + + + + + + + + } @@ -135,11 +159,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na - cs MemberName = CSz("GL"); + cs MemberName = CSz("DefaultThreadState"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(opengl*, &Element->GL), + Cast(thread_local_state*, &Element->DefaultThreadState), MemberName, ThisHash, Params @@ -279,6 +303,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, bonsai_stdlib *Element, cs Na } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_brush_layer.h b/generated/do_editor_ui_for_compound_type_brush_layer.h index 0e9fde1dc..9dbd90746 100644 --- a/generated/do_editor_ui_for_compound_type_brush_layer.h +++ b/generated/do_editor_ui_for_compound_type_brush_layer.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:416:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -61,10 +60,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_layer *Element, cs Name cs MemberName = CSz("PrevSettings"); - + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_brush_settings.h b/generated/do_editor_ui_for_compound_type_brush_settings.h index 90ac4bd40..1f46647b5 100644 --- a/generated/do_editor_ui_for_compound_type_brush_settings.h +++ b/generated/do_editor_ui_for_compound_type_brush_settings.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:177:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -290,7 +289,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N cs MemberName = CSz("Iterations"); - + PushNewRow(Ui); @@ -302,7 +301,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N cs MemberName = CSz("Offset"); - + } @@ -313,7 +312,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N cs MemberName = CSz("NoiseBasisOffset"); - + } @@ -332,6 +331,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, brush_settings *Element, cs N } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 4a6e4402b..43c59023c 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:375:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -464,6 +463,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, u32 } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_chunk_data.h b/generated/do_editor_ui_for_compound_type_chunk_data.h index bccfd8acd..1f81987e4 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_data.h +++ b/generated/do_editor_ui_for_compound_type_chunk_data.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:446:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -182,6 +181,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_data *Element, cs Name, } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h index 90f65ae9b..dcced9a60 100644 --- a/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h +++ b/generated/do_editor_ui_for_compound_type_chunk_thumbnail.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:384:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -79,6 +78,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_thumbnail *Element, cs } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_collision_event.h b/generated/do_editor_ui_for_compound_type_collision_event.h index e47303c7e..84d0cc254 100644 --- a/generated/do_editor_ui_for_compound_type_collision_event.h +++ b/generated/do_editor_ui_for_compound_type_collision_event.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:516:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -131,6 +130,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, collision_event *Element, cs } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index 987dc351a..b2585c0e7 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:275:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -212,7 +211,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("FrameEnd"); - + + + + + + + } @@ -223,7 +228,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("FrameBegin"); - + + + + + + + } @@ -234,7 +245,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("RegisterArena"); - + + + + + + + } @@ -245,7 +262,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("UnregisterArena"); - + + + + + + + } @@ -256,7 +279,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("WorkerThreadAdvanceDebugSystem"); - + + + + + + + } @@ -267,7 +296,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("MainThreadAdvanceDebugSystem"); - + + + + + + + } @@ -278,7 +313,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("MutexWait"); - + + + + + + + } @@ -289,7 +330,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("MutexAquired"); - + + + + + + + } @@ -300,7 +347,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("MutexReleased"); - + + + + + + + } @@ -311,7 +364,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("GetProfileScope"); - + + + + + + + } @@ -322,7 +381,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("Debug_Allocate"); - + + + + + + + } @@ -333,7 +398,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("RegisterThread"); - + + + + + + + } @@ -344,7 +415,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("WriteMemoryRecord"); - + + + + + + + } @@ -355,7 +432,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("ClearMemoryRecordsFor"); - + + + + + + + } @@ -366,7 +449,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("TrackDrawCall"); - + + + + + + + } @@ -377,7 +466,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("GetThreadLocalState"); - + + + + + + + } @@ -388,7 +483,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("DebugValue_r32"); - + + + + + + + } @@ -399,7 +500,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("DebugValue_u32"); - + + + + + + + } @@ -410,7 +517,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("DebugValue_u64"); - + + + + + + + } @@ -421,7 +534,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("DumpScopeTreeDataToConsole"); - + + + + + + + } @@ -432,7 +551,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("OpenAndInitializeDebugWindow"); - + + + + + + + } @@ -443,7 +568,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("ProcessInputAndRedrawWindow"); - + + + + + + + } @@ -454,7 +585,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("(anonymous)"); - + + + + + + + } @@ -465,7 +602,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("(anonymous)"); - + + + + + + + } @@ -476,7 +619,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("(anonymous)"); - + + + + + + + } @@ -487,7 +636,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("GetReadScopeTree"); - + + + + + + + } @@ -498,7 +653,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name cs MemberName = CSz("GetWriteScopeTree"); - + + + + + + + } @@ -1015,6 +1176,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_engine_debug.h b/generated/do_editor_ui_for_compound_type_engine_debug.h index 8d875b116..8d1c9a23e 100644 --- a/generated/do_editor_ui_for_compound_type_engine_debug.h +++ b/generated/do_editor_ui_for_compound_type_engine_debug.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:576:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -746,6 +745,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug *Element, cs Nam } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 617ba6e5b..410ff5c43 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:597:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -680,6 +679,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_engine_settings.h b/generated/do_editor_ui_for_compound_type_engine_settings.h index 576995002..eae081b1c 100644 --- a/generated/do_editor_ui_for_compound_type_engine_settings.h +++ b/generated/do_editor_ui_for_compound_type_engine_settings.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:594:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_settings *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { diff --git a/generated/do_editor_ui_for_compound_type_entity.h b/generated/do_editor_ui_for_compound_type_entity.h index e72f9fb14..e52a8f311 100644 --- a/generated/do_editor_ui_for_compound_type_entity.h +++ b/generated/do_editor_ui_for_compound_type_entity.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:485:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -407,6 +406,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity *Element, cs Name, u32 PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_entity_id.h b/generated/do_editor_ui_for_compound_type_entity_id.h index 7b4427bf6..06bf6f13b 100644 --- a/generated/do_editor_ui_for_compound_type_entity_id.h +++ b/generated/do_editor_ui_for_compound_type_entity_id.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:482:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -81,6 +80,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_id *Element, cs Name, PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_entity_position_info.h b/generated/do_editor_ui_for_compound_type_entity_position_info.h index d1c0b8286..a308ebb52 100644 --- a/generated/do_editor_ui_for_compound_type_entity_position_info.h +++ b/generated/do_editor_ui_for_compound_type_entity_position_info.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:519:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -130,6 +129,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_position_info *Element } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_file_traversal_node.h b/generated/do_editor_ui_for_compound_type_file_traversal_node.h index 9a551d5cc..06ed78b18 100644 --- a/generated/do_editor_ui_for_compound_type_file_traversal_node.h +++ b/generated/do_editor_ui_for_compound_type_file_traversal_node.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:470:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -106,6 +105,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_node *Element, PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index 7d53709bb..b306c0d1b 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:372:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -233,6 +232,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, u3 } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h index 18b1f2a1e..ab12b1bd1 100644 --- a/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h +++ b/generated/do_editor_ui_for_compound_type_g_buffer_render_group.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:552:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -205,6 +204,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, g_buffer_render_group *Elemen PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_game_lights.h b/generated/do_editor_ui_for_compound_type_game_lights.h index 1e6d67ba7..33fa04a3c 100644 --- a/generated/do_editor_ui_for_compound_type_game_lights.h +++ b/generated/do_editor_ui_for_compound_type_game_lights.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:546:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -156,6 +155,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_lights *Element, cs Name } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 0eb244e47..4eb99acb6 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:452:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -196,6 +195,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h index 8ea676795..7cff162a1 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_gpu_mapped_element_buffer.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:455:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -79,6 +78,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_mapped_element_buffer *El } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 7a2c7585d..96bd1f2b3 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:567:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -308,7 +307,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u cs MemberName = CSz("Camera"); - + } @@ -520,7 +519,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u cs MemberName = CSz("ColorPalette"); - + } @@ -963,6 +962,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_graphics_settings.h b/generated/do_editor_ui_for_compound_type_graphics_settings.h index 51cb88f6f..dcedea81b 100644 --- a/generated/do_editor_ui_for_compound_type_graphics_settings.h +++ b/generated/do_editor_ui_for_compound_type_graphics_settings.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:591:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -154,6 +153,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics_settings *Element, c } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_input.h b/generated/do_editor_ui_for_compound_type_input.h index fbc2056a1..fa2a45364 100644 --- a/generated/do_editor_ui_for_compound_type_input.h +++ b/generated/do_editor_ui_for_compound_type_input.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:268:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -1630,6 +1629,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input *Element, cs Name, u32 PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_input_event.h b/generated/do_editor_ui_for_compound_type_input_event.h index 674d48407..44c4d60eb 100644 --- a/generated/do_editor_ui_for_compound_type_input_event.h +++ b/generated/do_editor_ui_for_compound_type_input_event.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:265:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -75,6 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, input_event *Element, cs Name PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_keyframe.h b/generated/do_editor_ui_for_compound_type_keyframe.h index 635b774e1..143df8aed 100644 --- a/generated/do_editor_ui_for_compound_type_keyframe.h +++ b/generated/do_editor_ui_for_compound_type_keyframe.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:337:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -81,6 +80,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, keyframe *Element, cs Name, u PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index 884e64765..d3bbe0647 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:419:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -118,6 +117,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_level_editor.h b/generated/do_editor_ui_for_compound_type_level_editor.h index 1e71b5c14..c2f2c770b 100644 --- a/generated/do_editor_ui_for_compound_type_level_editor.h +++ b/generated/do_editor_ui_for_compound_type_level_editor.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:582:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -330,6 +329,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, level_editor *Element, cs Nam } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index e448c5f98..408939849 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:549:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -809,6 +808,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index 5e2f23c26..bc4960403 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:316:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -114,7 +113,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c cs MemberName = CSz("SunP"); - + } @@ -332,6 +331,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index bb51d0b3a..c03f504d8 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:458:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -166,6 +165,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index 7999abe1c..c524a6f60 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:732:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -79,6 +78,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_model.h b/generated/do_editor_ui_for_compound_type_model.h index e86807e8c..50276c6b4 100644 --- a/generated/do_editor_ui_for_compound_type_model.h +++ b/generated/do_editor_ui_for_compound_type_model.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:461:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -179,6 +178,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, model *Element, cs Name, u32 } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_noise_layer.h b/generated/do_editor_ui_for_compound_type_noise_layer.h index a010bca8b..7ac3e94a5 100644 --- a/generated/do_editor_ui_for_compound_type_noise_layer.h +++ b/generated/do_editor_ui_for_compound_type_noise_layer.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:154:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -129,6 +128,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, noise_layer *Element, cs Name } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 6bff6dca4..7b328d33f 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:495:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -284,6 +283,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_particle.h b/generated/do_editor_ui_for_compound_type_particle.h index 50d63f5cb..170fefb1b 100644 --- a/generated/do_editor_ui_for_compound_type_particle.h +++ b/generated/do_editor_ui_for_compound_type_particle.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:331:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -157,6 +156,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle *Element, cs Name, u PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 94bde9c42..9f66ba321 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:334:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -644,6 +643,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h index 6771cde6d..c1fd64765 100644 --- a/generated/do_editor_ui_for_compound_type_perlin_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_perlin_noise_params.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:150:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, perlin_noise_params *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { diff --git a/generated/do_editor_ui_for_compound_type_physics.h b/generated/do_editor_ui_for_compound_type_physics.h index e627e5744..80aac65f2 100644 --- a/generated/do_editor_ui_for_compound_type_physics.h +++ b/generated/do_editor_ui_for_compound_type_physics.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:322:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -156,6 +155,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, physics *Element, cs Name, u3 PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 6f7322684..071b5b6c4 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:369:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { diff --git a/generated/do_editor_ui_for_compound_type_platform.h b/generated/do_editor_ui_for_compound_type_platform.h index d840254f4..771cb4230 100644 --- a/generated/do_editor_ui_for_compound_type_platform.h +++ b/generated/do_editor_ui_for_compound_type_platform.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:271:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -432,6 +431,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, platform *Element, cs Name, u } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_random_series.h b/generated/do_editor_ui_for_compound_type_random_series.h index b310ffec8..d129601c3 100644 --- a/generated/do_editor_ui_for_compound_type_random_series.h +++ b/generated/do_editor_ui_for_compound_type_random_series.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:325:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, random_series *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index ee2249817..05c80a6b5 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:729:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -79,6 +78,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, u32 Pa } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index b68cedfef..9e8cc437b 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:717:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -79,6 +78,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, u32 } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index 0211b7f9f..a517c4df1 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:723:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -79,6 +78,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, u3 } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index e612da817..823f84d4b 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:720:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -79,6 +78,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, u32 } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h index c340e81dc..474bc4202 100644 --- a/generated/do_editor_ui_for_compound_type_render_buffers_2d.h +++ b/generated/do_editor_ui_for_compound_type_render_buffers_2d.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:540:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -130,6 +129,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_buffers_2d *Element, c } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_render_debug.h b/generated/do_editor_ui_for_compound_type_render_debug.h index a9f13e8ba..8d0311744 100644 --- a/generated/do_editor_ui_for_compound_type_render_debug.h +++ b/generated/do_editor_ui_for_compound_type_render_debug.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:570:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -133,6 +132,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_debug *Element, cs Nam PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_render_settings.h b/generated/do_editor_ui_for_compound_type_render_settings.h index a4d996608..9edc604b7 100644 --- a/generated/do_editor_ui_for_compound_type_render_settings.h +++ b/generated/do_editor_ui_for_compound_type_render_settings.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:319:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -272,7 +271,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs cs MemberName = CSz("Ignored"); - + } @@ -283,7 +282,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs cs MemberName = CSz("Headless"); - + PushNewRow(Ui); @@ -514,6 +513,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, render_settings *Element, cs } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 798157bd7..d20c2f7d9 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:543:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -677,6 +676,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_shader.h b/generated/do_editor_ui_for_compound_type_shader.h index 70492429c..33d10e07f 100644 --- a/generated/do_editor_ui_for_compound_type_shader.h +++ b/generated/do_editor_ui_for_compound_type_shader.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:251:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -207,6 +206,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader *Element, cs Name, u32 PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_shape_layer.h b/generated/do_editor_ui_for_compound_type_shape_layer.h index c7b9a8f06..9067706cd 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:175:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -229,6 +228,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer *Element, cs Name } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h b/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h index 01658d91f..335790898 100644 --- a/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h +++ b/generated/do_editor_ui_for_compound_type_shape_layer_advanced_params.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:173:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer_advanced_params *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -130,6 +129,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_layer_advanced_params * } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 972b1f5cf..11833eced 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:558:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_context *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -241,6 +240,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index ef2862e8d..668b9aa39 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:561:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_context *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -167,6 +166,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index edda121d2..7f2013019 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:555:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_context *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -216,6 +215,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h index 31dc3875e..493174e0d 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_brush.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:422:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -119,6 +118,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_brush *Element, cs } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 5587100ea..5ad098871 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:564:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -266,6 +265,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_texture.h b/generated/do_editor_ui_for_compound_type_texture.h index 4cc2758f7..40d37e260 100644 --- a/generated/do_editor_ui_for_compound_type_texture.h +++ b/generated/do_editor_ui_for_compound_type_texture.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:378:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -229,6 +228,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, texture *Element, cs Name, u3 PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_ui_debug.h b/generated/do_editor_ui_for_compound_type_ui_debug.h index cd5bcb3bd..c6b39c85e 100644 --- a/generated/do_editor_ui_for_compound_type_ui_debug.h +++ b/generated/do_editor_ui_for_compound_type_ui_debug.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:573:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -211,6 +210,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_debug *Element, cs Name, u PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_ui_id.h b/generated/do_editor_ui_for_compound_type_ui_id.h index dcff3a10e..c44eaf2cd 100644 --- a/generated/do_editor_ui_for_compound_type_ui_id.h +++ b/generated/do_editor_ui_for_compound_type_ui_id.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:183:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -133,6 +132,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_id *Element, cs Name, u32 PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_ui_toggle.h b/generated/do_editor_ui_for_compound_type_ui_toggle.h index bc4fdafb2..ecdc11c88 100644 --- a/generated/do_editor_ui_for_compound_type_ui_toggle.h +++ b/generated/do_editor_ui_for_compound_type_ui_toggle.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:186:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -77,6 +76,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle *Element, cs Name, PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h index 7ead332b4..81b2a397a 100644 --- a/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h +++ b/generated/do_editor_ui_for_compound_type_untextured_3d_geometry_buffer.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:349:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -61,7 +60,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer cs MemberName = CSz("Next"); - + PushNewRow(Ui); @@ -272,6 +271,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, untextured_3d_geometry_buffer PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h b/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h index 821e1ed90..dbfeeab37 100644 --- a/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h +++ b/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:139:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v2_static_cursor_16 *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -92,6 +91,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2_static_cursor_16 *Element, PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_vertex_material.h b/generated/do_editor_ui_for_compound_type_vertex_material.h index 8b2c31af7..b222c7b14 100644 --- a/generated/do_editor_ui_for_compound_type_vertex_material.h +++ b/generated/do_editor_ui_for_compound_type_vertex_material.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:343:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -107,6 +106,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, vertex_material *Element, cs PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h index 34c57a032..703b77b58 100644 --- a/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_voronoi_noise_params.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:152:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -106,6 +105,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voronoi_noise_params *Element PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_vox_data.h b/generated/do_editor_ui_for_compound_type_vox_data.h index e4e510cbe..437ae65ea 100644 --- a/generated/do_editor_ui_for_compound_type_vox_data.h +++ b/generated/do_editor_ui_for_compound_type_vox_data.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:449:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, vox_data *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index f46b048de..28393c9e2 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:440:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -81,6 +80,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, u32 PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_voxel_lighting.h b/generated/do_editor_ui_for_compound_type_voxel_lighting.h index 26431a7b8..dfe982444 100644 --- a/generated/do_editor_ui_for_compound_type_voxel_lighting.h +++ b/generated/do_editor_ui_for_compound_type_voxel_lighting.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:443:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_lighting *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { diff --git a/generated/do_editor_ui_for_compound_type_white_noise_params.h b/generated/do_editor_ui_for_compound_type_white_noise_params.h index 40dad62c3..acf319e7c 100644 --- a/generated/do_editor_ui_for_compound_type_white_noise_params.h +++ b/generated/do_editor_ui_for_compound_type_white_noise_params.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:148:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, white_noise_params *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { diff --git a/generated/do_editor_ui_for_compound_type_work_queue.h b/generated/do_editor_ui_for_compound_type_work_queue.h index e92b993f6..32e1f98ef 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue.h +++ b/generated/do_editor_ui_for_compound_type_work_queue.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:262:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -131,6 +130,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue *Element, cs Name, } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_work_queue_entry.h b/generated/do_editor_ui_for_compound_type_work_queue_entry.h index 220866474..5539b1d99 100644 --- a/generated/do_editor_ui_for_compound_type_work_queue_entry.h +++ b/generated/do_editor_ui_for_compound_type_work_queue_entry.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:259:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -61,10 +60,17 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, work_queue_entry *Element, cs cs MemberName = CSz("(anonymous)"); - + + + + + + + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 6372ae83a..6aff5b140 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:498:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -212,7 +211,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, u32 cs MemberName = CSz("ChunkFreelistFutex"); - + } @@ -223,7 +222,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, u32 cs MemberName = CSz("ChunkFreelistSentinal"); - + } @@ -260,7 +259,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, u32 cs MemberName = CSz("ChunkDim"); - + } @@ -271,10 +270,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, u32 cs MemberName = CSz("ChunkMemory"); - + } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_world_chunk.h b/generated/do_editor_ui_for_compound_type_world_chunk.h index 6e4294b23..1b132535a 100644 --- a/generated/do_editor_ui_for_compound_type_world_chunk.h +++ b/generated/do_editor_ui_for_compound_type_world_chunk.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:492:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -381,6 +380,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_chunk *Element, cs Name } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h index 53353eb7d..ede83899d 100644 --- a/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h +++ b/generated/do_editor_ui_for_compound_type_world_edit_block_array_index.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:431:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h index 205379e2e..29e19294d 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_cylinder.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:162:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_cylinder *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -81,6 +80,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h index 4adaccf13..0f5c9cd44 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_plane.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:164:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_plane *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -80,6 +79,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h index 66582f1a2..5609ae018 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_rect.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:158:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_rect *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h index 0f533dee4..65b111852 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_sphere.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:160:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_sphere *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -36,7 +35,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ cs MemberName = CSz("Location"); - + } @@ -66,6 +65,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h index 3e79c767b..625050b59 100644 --- a/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h +++ b/generated/do_editor_ui_for_compound_type_world_update_op_shape_params_torus.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:166:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_torus *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -81,6 +80,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_update_op_shape_params_ PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 9b75653a0..08b70aaaa 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:489:0 - +// src/engine/editor.h:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index e6f216259..eabbf7a3e 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:464:0 - +// src/engine/editor.h:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index d99f0c205..d58215a99 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:254:0 - +// src/engine/editor.h:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 9f98fac29..7aaaaabf1 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:248:0 - +// src/engine/editor.h:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index 1ffdb1bc7..a5d3f5743 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:195:0 - +// src/engine/editor.h:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index bb1d1445f..32610c046 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:180:0 - +// src/engine/editor.h:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index 2abfb0d08..e7fbfdca7 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:434:0 - +// src/engine/editor.h:519:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index 9c937b917..bafef3de6 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:510:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -39,6 +38,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index a9472f481..1a1148b9d 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:437:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -150,6 +149,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 7cf07d521..69a060fdc 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:708:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -39,6 +38,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 5f6a59e24..83a4ac8c3 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:579:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -196,6 +195,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Eleme SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index 58a83a170..c86e83451 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:307:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -219,6 +218,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Elemen SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index 42815ae25..fb341a427 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:304:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -48,6 +47,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Nam SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index 1b3d1430a..ae16b8c70 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:467:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -39,6 +38,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 286be4a64..86e5c7d7d 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:703:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -30,6 +29,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index 8c9c04940..f42fa7676 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:328:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -48,6 +47,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 11343268f..0e1449ac0 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:585:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -39,6 +38,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 259794dc7..809546611 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:588:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -30,6 +29,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Elem SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_shape_axis.h b/generated/do_editor_ui_for_enum_shape_axis.h index 380a42a8f..7f381bc3f 100644 --- a/generated/do_editor_ui_for_enum_shape_axis.h +++ b/generated/do_editor_ui_for_enum_shape_axis.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:711:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -84,6 +83,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index 9628fd19c..b628f6655 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:171:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -66,6 +65,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index 3b48b5019..d10626591 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:310:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -66,6 +65,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, c SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index f53fcb85f..e29a7a0d6 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:760:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -39,6 +38,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Na SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index d395e7d06..7dddc6104 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,5 +1,4 @@ -// src/engine/editor.cpp:144:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -165,6 +164,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_enum_voxel_rule_direction.h b/generated/do_editor_ui_for_enum_voxel_rule_direction.h index f89d72ea5..dbbc44c7a 100644 --- a/generated/do_editor_ui_for_enum_voxel_rule_direction.h +++ b/generated/do_editor_ui_for_enum_voxel_rule_direction.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:714:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -75,6 +74,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index b2c28197a..a9afa2d54 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:916:0 - +// src/engine/editor.h:551:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) { @@ -20,6 +19,7 @@ RadioButtonGroup_asset_window_view_mode( renderer_2d *Ui, { { CSz("AssetFiles"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "asset_window_view_mode AssetWindowViewMode_AssetFiles")), AssetWindowViewMode_AssetFiles }, { CSz("AssetTable"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "asset_window_view_mode AssetWindowViewMode_AssetTable")), AssetWindowViewMode_AssetTable }, + }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 6208a1135..7b62d748d 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:1141:0 - +// src/engine/editor.h:551:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) { @@ -20,6 +19,7 @@ RadioButtonGroup_brush_layer_type( renderer_2d *Ui, { { CSz("Noise"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "brush_layer_type BrushLayerType_Noise")), BrushLayerType_Noise }, { CSz("Shape"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "brush_layer_type BrushLayerType_Shape")), BrushLayerType_Shape }, + }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 6c07b098b..21007791c 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:922:0 - +// src/engine/editor.h:551:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) { @@ -23,6 +22,7 @@ RadioButtonGroup_world_edit_blend_mode( renderer_2d *Ui, { CSz("Multiply"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Multiply")), WorldEdit_Mode_Multiply }, { CSz("Threshold"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Threshold")), WorldEdit_Mode_Threshold }, { CSz("Disabled"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_blend_mode WorldEdit_Mode_Disabled")), WorldEdit_Mode_Disabled }, + }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 96d1004a9..35082d189 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:905:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -127,6 +126,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifie SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index dfd4ab516..b4b774369 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:934:0 - +// src/engine/editor.h:551:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) { @@ -23,6 +22,7 @@ RadioButtonGroup_world_edit_brush_type( renderer_2d *Ui, { CSz("Asset"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Asset")), WorldEdit_BrushType_Asset }, { CSz("Entity"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Entity")), WorldEdit_BrushType_Entity }, { CSz("Layered"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_brush_type WorldEdit_BrushType_Layered")), WorldEdit_BrushType_Layered }, + }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 5ddeab098..77c97d9b4 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:927:0 - +// src/engine/editor.h:458:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { @@ -48,6 +47,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode * SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 6f31f1cfe..d693d12e4 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:931:0 - +// src/engine/editor.h:551:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) { @@ -22,6 +21,7 @@ RadioButtonGroup_world_edit_tool( renderer_2d *Ui, { CSz("Select"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Select")), WorldEdit_Tool_Select }, { CSz("Eyedropper"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_Eyedropper")), WorldEdit_Tool_Eyedropper }, { CSz("BlitEntity"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "world_edit_tool WorldEdit_Tool_BlitEntity")), WorldEdit_Tool_BlitEntity }, + }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index 86fe7bfb0..75cb56f00 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:571:0 - +// src/engine/editor.h:259:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { @@ -216,3 +215,5 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, u8 *Value, cs Name, u32 Paren } + + diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index 04e225816..d3e07679a 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:688:0 - +// src/engine/editor.h:224:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) { @@ -16,6 +15,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, u32 Pare DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[2], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[3], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -40,6 +40,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v4 *Value, cs Name, u32 Paren DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[2], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[3], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -63,6 +64,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v3i *Value, cs Name, u32 Pare DoEditorUi(Ui, Window, &Value->E[0], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[2], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -86,6 +88,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v3 *Value, cs Name, u32 Paren DoEditorUi(Ui, Window, &Value->E[0], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[2], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -108,6 +111,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2i *Value, cs Name, u32 Pare PushTableStart(Ui); DoEditorUi(Ui, Window, &Value->E[0], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -130,6 +134,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2 *Value, cs Name, u32 Paren PushTableStart(Ui); DoEditorUi(Ui, Window, &Value->E[0], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -154,6 +159,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, Quaternion *Value, cs Name, u DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[2], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[3], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -178,6 +184,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, m4 *Value, cs Name, u32 Paren DoEditorUi(Ui, Window, &Value->E[1], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[2], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); DoEditorUi(Ui, Window, &Value->E[3], {}, ThisHash, Params, EDITOR_UI_VALUE_RANGE_INSTANCE_NAMES ); + PushTableEnd(Ui); /* PushNewRow(Ui); */ EndColumn(Ui, Start); @@ -187,3 +194,4 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, m4 *Value, cs Name, u32 Paren PushNewRow(Ui); } + diff --git a/generated/flatten_block_array_file_traversal_node.h b/generated/flatten_block_array_file_traversal_node.h index b27ed38de..0b2c6a729 100644 --- a/generated/flatten_block_array_file_traversal_node.h +++ b/generated/flatten_block_array_file_traversal_node.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/file.cpp:11:0 - +// external/bonsai_stdlib/src/poof_functions.h:2574:0 link_internal file_traversal_node_buffer Flatten(file_traversal_node_block_array *Array, memory_arena *Memory) { diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index 162da0e8d..f76c0a8f9 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -1,5 +1,4 @@ -// src/engine/world_update.cpp:482:0 - +// src/engine/world_update.cpp:208:0 random_series ColorEntropy = {4654376543246}; voxel *V = {}; diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index c00fda2ae..21988ebe0 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -169,7 +169,6 @@ - struct initialize_easing_function_visualizer_render_pass_async_params; @@ -510,6 +509,9 @@ WorkQueueEntryAsyncFunction( initialize_easing_function_visualizer_render_pass_a + + + @@ -580,5 +582,6 @@ WorkQueueEntryAsyncFunction( compile_shader_pair_async_params *Params ) + diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index ddd942371..881883fca 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -3,7 +3,6 @@ - link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -84,6 +83,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function *Element, cs } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } @@ -471,6 +471,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit *Element, cs Name, PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } @@ -640,6 +641,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re PushNewRow(Ui); } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } @@ -691,6 +693,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re + link_internal void @@ -896,6 +899,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } @@ -1206,6 +1210,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs + + + diff --git a/generated/for_datatypes_IXWy6K9V.h b/generated/for_datatypes_IXWy6K9V.h index 1907ebde7..61930c762 100644 --- a/generated/for_datatypes_IXWy6K9V.h +++ b/generated/for_datatypes_IXWy6K9V.h @@ -5,13 +5,15 @@ - link_internal b32 poof() InitializeLightingRenderGroup ( lighting_render_group *Element - , texture *gColor + + + + , texture *gColor , texture *gNormal , texture *gDepth , texture *shadowMap @@ -37,6 +39,8 @@ InitializeLightingRenderGroup , b32 *UseLightingBloom , v2 *ApplicationResolution , v2 *ShadowMapResolution + + ) { @@ -48,7 +52,10 @@ InitializeLightingRenderGroup u32 UniformIndex = 0; - Element->gColor = gColor; + + + + Element->gColor = gColor; InitShaderUniform( &Element->Program, UniformIndex++, @@ -256,6 +263,8 @@ InitializeLightingRenderGroup "ShadowMapResolution" ); + + u32 Expected = 26 ; @@ -281,7 +290,10 @@ UseRenderPass_lighting_render_group s32 TextureUnit = 0; s32 UniformIndex = 0; - { + + + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -463,6 +475,8 @@ UseRenderPass_lighting_render_group AssertNoGlErrors; } + + if (UniformIndex != 26 ) @@ -577,10 +591,15 @@ poof() InitializeTerrainDecorationRenderContext ( terrain_decoration_render_context *Element - , texture *DerivsTex + + + + + , texture *DerivsTex , v3 ChunkDim , v3 WorldspaceChunkBasis , v3 ChunkResolution + ) { b32 Result = CompileShaderPair(&Element->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/decoration/default.fragmentshader")); @@ -591,7 +610,11 @@ InitializeTerrainDecorationRenderContext u32 UniformIndex = 0; - Element->DerivsTex = DerivsTex; + + + + + Element->DerivsTex = DerivsTex; InitShaderUniform( &Element->Program, UniformIndex++, @@ -623,6 +646,8 @@ InitializeTerrainDecorationRenderContext "ChunkResolution" ); + + u32 Expected = 4 ; if (UniformIndex != Expected ) { @@ -646,7 +671,11 @@ UseRenderPass_terrain_decoration_render_context s32 TextureUnit = 0; s32 UniformIndex = 0; - { + + + + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -674,6 +703,8 @@ UseRenderPass_terrain_decoration_render_context AssertNoGlErrors; } + + if (UniformIndex != 4 ) { Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots!"); @@ -725,7 +756,11 @@ poof() InitializeTerrainFinalizeRenderContext ( terrain_finalize_render_context *Element - , u32 Ignored + + + + + , u32 Ignored ) { @@ -737,7 +772,11 @@ InitializeTerrainFinalizeRenderContext u32 UniformIndex = 0; - Element->Ignored = Ignored; + + + + + Element->Ignored = Ignored; InitShaderUniform( &Element->Program, UniformIndex++, @@ -770,7 +809,11 @@ UseRenderPass_terrain_finalize_render_context s32 TextureUnit = 0; s32 UniformIndex = 0; - { + + + + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -868,10 +911,15 @@ poof() InitializeWorldEditRenderContext ( world_edit_render_context *Element - , v3 *ChunkDim + + + + + , v3 *ChunkDim , v3 *WorldspaceChunkBasis , v3 *ChunkResolution , s32 Type + ) { b32 Result = CompileShaderPair(&Element->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/world_edit.fragmentshader")); @@ -882,7 +930,11 @@ InitializeWorldEditRenderContext u32 UniformIndex = 0; - Element->ChunkDim = ChunkDim; + + + + + Element->ChunkDim = ChunkDim; InitShaderUniform( &Element->Program, UniformIndex++, @@ -914,6 +966,8 @@ InitializeWorldEditRenderContext "Type" ); + + u32 Expected = 4 ; if (UniformIndex != Expected ) { @@ -937,7 +991,11 @@ UseRenderPass_world_edit_render_context s32 TextureUnit = 0; s32 UniformIndex = 0; - { + + + + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -965,6 +1023,8 @@ UseRenderPass_world_edit_render_context AssertNoGlErrors; } + + if (UniformIndex != 4 ) { Error("Shader (world_edit_render_context) had an incorrect number of uniform slots!"); @@ -1094,8 +1154,11 @@ poof(@async @render) InitializeEasingFunctionVisualizerRenderPass ( easing_function_visualizer_render_pass *Element - , v2 *Points + + + , v2 *Points , u32 *Count + ) { b32 Result = CompileShaderPair(&Element->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "curve_remap_visualizer.fragmentshader")); @@ -1106,7 +1169,9 @@ InitializeEasingFunctionVisualizerRenderPass u32 UniformIndex = 0; - Element->Points = Points; + + + Element->Points = Points; InitShaderUniform( &Element->Program, UniformIndex++, @@ -1122,6 +1187,8 @@ InitializeEasingFunctionVisualizerRenderPass "Count" ); + + u32 Expected = 2 ; if (UniformIndex != Expected ) { @@ -1145,7 +1212,9 @@ UseRenderPass_easing_function_visualizer_render_pass s32 TextureUnit = 0; s32 UniformIndex = 0; - { + + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -1159,6 +1228,8 @@ UseRenderPass_easing_function_visualizer_render_pass AssertNoGlErrors; } + + if (UniformIndex != 2 ) { Error("Shader (easing_function_visualizer_render_pass) had an incorrect number of uniform slots!"); @@ -1234,6 +1305,7 @@ UseShader( easing_function_visualizer_render_pass *Element ) + link_internal b32 @@ -1241,10 +1313,13 @@ poof() InitializeShadowMapShader ( shadow_map_shader *Element - , m4 ModelMatrix + + + , m4 ModelMatrix , m4 ViewProjection , v3 *MinClipP_worldspace , v3 *MaxClipP_worldspace + ) { b32 Result = CompileShaderPair(&Element->Program, CSz("shaders/DepthRTT.vertexshader"), CSz("shaders/DepthRTT.fragmentshader")); @@ -1255,7 +1330,9 @@ InitializeShadowMapShader u32 UniformIndex = 0; - Element->ModelMatrix = ModelMatrix; + + + Element->ModelMatrix = ModelMatrix; InitShaderUniform( &Element->Program, UniformIndex++, @@ -1287,6 +1364,8 @@ InitializeShadowMapShader "MaxClipP_worldspace" ); + + u32 Expected = 4 ; if (UniformIndex != Expected ) { @@ -1310,7 +1389,9 @@ UseRenderPass_shadow_map_shader s32 TextureUnit = 0; s32 UniformIndex = 0; - { + + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -1338,6 +1419,8 @@ UseRenderPass_shadow_map_shader AssertNoGlErrors; } + + if (UniformIndex != 4 ) { Error("Shader (shadow_map_shader) had an incorrect number of uniform slots!"); @@ -1378,7 +1461,9 @@ poof() InitializeBloomUpsampleShader ( bloom_upsample_shader *Element - , f32 *FilterRadius + + + , f32 *FilterRadius ) { @@ -1390,7 +1475,9 @@ InitializeBloomUpsampleShader u32 UniformIndex = 0; - Element->FilterRadius = FilterRadius; + + + Element->FilterRadius = FilterRadius; InitShaderUniform( &Element->Program, UniformIndex++, @@ -1423,7 +1510,9 @@ UseRenderPass_bloom_upsample_shader s32 TextureUnit = 0; s32 UniformIndex = 0; - { + + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -1620,6 +1709,7 @@ UseShader( bloom_upsample_shader *Element ) + link_internal b32 @@ -1627,7 +1717,11 @@ poof() InitializeTerrainDerivsRenderContext ( terrain_derivs_render_context *Element - , v3 Ignored + + + + + , v3 Ignored ) { @@ -1639,7 +1733,11 @@ InitializeTerrainDerivsRenderContext u32 UniformIndex = 0; - Element->Ignored = Ignored; + + + + + Element->Ignored = Ignored; InitShaderUniform( &Element->Program, UniformIndex++, @@ -1672,7 +1770,11 @@ UseRenderPass_terrain_derivs_render_context s32 TextureUnit = 0; s32 UniformIndex = 0; - { + + + + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -1738,7 +1840,9 @@ poof() InitializeBloomDownsampleShader ( bloom_downsample_shader *Element - , v2 *SrcResolution + + + , v2 *SrcResolution ) { @@ -1750,7 +1854,9 @@ InitializeBloomDownsampleShader u32 UniformIndex = 0; - Element->SrcResolution = SrcResolution; + + + Element->SrcResolution = SrcResolution; InitShaderUniform( &Element->Program, UniformIndex++, @@ -1783,7 +1889,9 @@ UseRenderPass_bloom_downsample_shader s32 TextureUnit = 0; s32 UniformIndex = 0; - { + + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -1893,6 +2001,7 @@ UseShader( bloom_downsample_shader *Element ) + link_internal b32 @@ -1900,9 +2009,14 @@ poof() InitializeTerrainShapingRenderContext ( terrain_shaping_render_context *Element - , v3 ChunkDim + + + + + , v3 ChunkDim , v3 WorldspaceChunkBasis , v3 ChunkResolution + ) { b32 Result = CompileShaderPair(&Element->Program, CSz("external/bonsai_stdlib/shaders/Passthrough.vertexshader"), CSz("shaders/terrain/shaping/default.fragmentshader")); @@ -1913,7 +2027,11 @@ InitializeTerrainShapingRenderContext u32 UniformIndex = 0; - Element->ChunkDim = ChunkDim; + + + + + Element->ChunkDim = ChunkDim; InitShaderUniform( &Element->Program, UniformIndex++, @@ -1937,6 +2055,8 @@ InitializeTerrainShapingRenderContext "ChunkResolution" ); + + u32 Expected = 3 ; if (UniformIndex != Expected ) { @@ -1960,7 +2080,11 @@ UseRenderPass_terrain_shaping_render_context s32 TextureUnit = 0; s32 UniformIndex = 0; - { + + + + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -1981,6 +2105,8 @@ UseRenderPass_terrain_shaping_render_context AssertNoGlErrors; } + + if (UniformIndex != 3 ) { Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots!"); @@ -2057,5 +2183,6 @@ UseShader( terrain_shaping_render_context *Element ) + diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h index 564b03371..a4a822476 100644 --- a/generated/for_datatypes_cx51CcgQ.h +++ b/generated/for_datatypes_cx51CcgQ.h @@ -2060,5 +2060,6 @@ DoJob(initialize_easing_function_visualizer_render_pass_async_params *Params) + diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 108795535..9858b86a8 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -169,7 +169,6 @@ - initialize_easing_function_visualizer_render_pass_async_params initialize_easing_function_visualizer_render_pass_async_params; @@ -501,6 +500,9 @@ initialize_easing_function_visualizer_render_pass_async_params initialize_easing + + + @@ -562,5 +564,6 @@ compile_shader_pair_async_params compile_shader_pair_async_params; + diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index b10a83ff1..e0f901aad 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -100,13 +100,35 @@ + + +link_internal b32 +IsValid(ui_brush_layer_actions Value) +{ + b32 Result = False; + switch (Value) + { + case UiBrushLayerAction_NoAction: + case UiBrushLayerAction_MoveUp: + case UiBrushLayerAction_MoveDown: + case UiBrushLayerAction_Duplicate: + case UiBrushLayerAction_Delete: + + { + Result = True; + } + } + return Result; +} link_internal counted_string ToStringPrefixless(ui_brush_layer_actions Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case UiBrushLayerAction_NoAction: { Result = CSz("NoAction"); } break; @@ -115,15 +137,18 @@ ToStringPrefixless(ui_brush_layer_actions Type) case UiBrushLayerAction_Duplicate: { Result = CSz("Duplicate"); } break; case UiBrushLayerAction_Delete: { Result = CSz("Delete"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(ui_brush_layer_actions Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -133,9 +158,10 @@ ToString(ui_brush_layer_actions Type) case UiBrushLayerAction_Duplicate: { Result = CSz("UiBrushLayerAction_Duplicate"); } break; case UiBrushLayerAction_Delete: { Result = CSz("UiBrushLayerAction_Delete"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -150,6 +176,7 @@ UiBrushLayerActions(counted_string S) if (StringsMatch(S, CSz("UiBrushLayerAction_Duplicate"))) { return UiBrushLayerAction_Duplicate; } if (StringsMatch(S, CSz("UiBrushLayerAction_Delete"))) { return UiBrushLayerAction_Delete; } + return Result; } @@ -177,6 +204,7 @@ RadioButtonGroup_ui_brush_layer_actions( renderer_2d *Ui, { CSz("MoveDown"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_MoveDown")), UiBrushLayerAction_MoveDown }, { CSz("Duplicate"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Duplicate")), UiBrushLayerAction_Duplicate }, { CSz("Delete"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_layer_actions UiBrushLayerAction_Delete")), UiBrushLayerAction_Delete }, + }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -204,7 +232,8 @@ PushToolbar( renderer_2d *Ui, ui_toggle_button_handle ButtonHandles[] = { - { + + { CSz("MoveUp"), {}, UiId( @@ -251,6 +280,8 @@ PushToolbar( renderer_2d *Ui, ), UiBrushLayerAction_Delete, }, + + }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -282,25 +313,49 @@ PushToolbar( renderer_2d *Ui, +link_internal b32 +IsValid(selection_modification_mode Value) +{ + b32 Result = False; + switch (Value) + { + case SelectionModificationMode_None: + case SelectionModificationMode_Initialize: + case SelectionModificationMode_Modify: + + { + Result = True; + } + } + return Result; +} + + + link_internal counted_string ToStringPrefixless(selection_modification_mode Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case SelectionModificationMode_None: { Result = CSz("None"); } break; case SelectionModificationMode_Initialize: { Result = CSz("Initialize"); } break; case SelectionModificationMode_Modify: { Result = CSz("Modify"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(selection_modification_mode Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -308,9 +363,10 @@ ToString(selection_modification_mode Type) case SelectionModificationMode_Initialize: { Result = CSz("SelectionModificationMode_Initialize"); } break; case SelectionModificationMode_Modify: { Result = CSz("SelectionModificationMode_Modify"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -323,6 +379,7 @@ SelectionModificationMode(counted_string S) if (StringsMatch(S, CSz("SelectionModificationMode_Initialize"))) { return SelectionModificationMode_Initialize; } if (StringsMatch(S, CSz("SelectionModificationMode_Modify"))) { return SelectionModificationMode_Modify; } + return Result; } @@ -368,6 +425,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_modification_mode * SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); + } else { @@ -405,13 +463,35 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_modification_mode * + + + +link_internal b32 +IsValid(ui_layer_edit_actions Value) +{ + b32 Result = False; + switch (Value) + { + case UiLayerEditAction_NoAction: + case UiLayerEditAction_SetBrush: + case UiLayerEditAction_Duplicate: + case UiLayerEditAction_Delete: + + { + Result = True; + } + } + return Result; +} link_internal counted_string ToStringPrefixless(ui_layer_edit_actions Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case UiLayerEditAction_NoAction: { Result = CSz("NoAction"); } break; @@ -419,15 +499,18 @@ ToStringPrefixless(ui_layer_edit_actions Type) case UiLayerEditAction_Duplicate: { Result = CSz("Duplicate"); } break; case UiLayerEditAction_Delete: { Result = CSz("Delete"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(ui_layer_edit_actions Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -436,9 +519,10 @@ ToString(ui_layer_edit_actions Type) case UiLayerEditAction_Duplicate: { Result = CSz("UiLayerEditAction_Duplicate"); } break; case UiLayerEditAction_Delete: { Result = CSz("UiLayerEditAction_Delete"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -452,6 +536,7 @@ UiLayerEditActions(counted_string S) if (StringsMatch(S, CSz("UiLayerEditAction_Duplicate"))) { return UiLayerEditAction_Duplicate; } if (StringsMatch(S, CSz("UiLayerEditAction_Delete"))) { return UiLayerEditAction_Delete; } + return Result; } @@ -478,6 +563,7 @@ RadioButtonGroup_ui_layer_edit_actions( renderer_2d *Ui, { CSz("SetBrush"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_edit_actions UiLayerEditAction_SetBrush")), UiLayerEditAction_SetBrush }, { CSz("Duplicate"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_edit_actions UiLayerEditAction_Duplicate")), UiLayerEditAction_Duplicate }, { CSz("Delete"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_edit_actions UiLayerEditAction_Delete")), UiLayerEditAction_Delete }, + }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -505,7 +591,8 @@ PushToolbar( renderer_2d *Ui, ui_toggle_button_handle ButtonHandles[] = { - { + + { CSz("S"), CSz("SetBrush"), UiId( @@ -540,6 +627,8 @@ PushToolbar( renderer_2d *Ui, ), UiLayerEditAction_Delete, }, + + }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -563,25 +652,49 @@ PushToolbar( renderer_2d *Ui, +link_internal b32 +IsValid(ui_reorder_action Value) +{ + b32 Result = False; + switch (Value) + { + case UiReorderAction_NoAction: + case UiReorderAction_ReorderUp: + case UiReorderAction_ReorderDown: + + { + Result = True; + } + } + return Result; +} + + + link_internal counted_string ToStringPrefixless(ui_reorder_action Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case UiReorderAction_NoAction: { Result = CSz("NoAction"); } break; case UiReorderAction_ReorderUp: { Result = CSz("ReorderUp"); } break; case UiReorderAction_ReorderDown: { Result = CSz("ReorderDown"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(ui_reorder_action Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -589,9 +702,10 @@ ToString(ui_reorder_action Type) case UiReorderAction_ReorderUp: { Result = CSz("UiReorderAction_ReorderUp"); } break; case UiReorderAction_ReorderDown: { Result = CSz("UiReorderAction_ReorderDown"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -604,6 +718,7 @@ UiReorderAction(counted_string S) if (StringsMatch(S, CSz("UiReorderAction_ReorderUp"))) { return UiReorderAction_ReorderUp; } if (StringsMatch(S, CSz("UiReorderAction_ReorderDown"))) { return UiReorderAction_ReorderDown; } + return Result; } @@ -629,6 +744,7 @@ RadioButtonGroup_ui_reorder_action( renderer_2d *Ui, { CSz("NoAction"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_reorder_action UiReorderAction_NoAction")), UiReorderAction_NoAction }, { CSz("ReorderUp"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_reorder_action UiReorderAction_ReorderUp")), UiReorderAction_ReorderUp }, { CSz("ReorderDown"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_reorder_action UiReorderAction_ReorderDown")), UiReorderAction_ReorderDown }, + }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -656,7 +772,8 @@ PushToolbar( renderer_2d *Ui, ui_toggle_button_handle ButtonHandles[] = { - { + + { CSz("^"), CSz("ReorderUp"), UiId( @@ -679,6 +796,8 @@ PushToolbar( renderer_2d *Ui, ), UiReorderAction_ReorderDown, }, + + }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -747,13 +866,35 @@ PushToolbar( renderer_2d *Ui, + + + +link_internal b32 +IsValid(ui_brush_actions Value) +{ + b32 Result = False; + switch (Value) + { + case UiBrushAction_NoAction: + case UiBrushAction_New: + case UiBrushAction_Save: + case UiBrushAction_Duplicate: + + { + Result = True; + } + } + return Result; +} link_internal counted_string ToStringPrefixless(ui_brush_actions Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case UiBrushAction_NoAction: { Result = CSz("NoAction"); } break; @@ -761,15 +902,18 @@ ToStringPrefixless(ui_brush_actions Type) case UiBrushAction_Save: { Result = CSz("Save"); } break; case UiBrushAction_Duplicate: { Result = CSz("Duplicate"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(ui_brush_actions Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -778,9 +922,10 @@ ToString(ui_brush_actions Type) case UiBrushAction_Save: { Result = CSz("UiBrushAction_Save"); } break; case UiBrushAction_Duplicate: { Result = CSz("UiBrushAction_Duplicate"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -794,6 +939,7 @@ UiBrushActions(counted_string S) if (StringsMatch(S, CSz("UiBrushAction_Save"))) { return UiBrushAction_Save; } if (StringsMatch(S, CSz("UiBrushAction_Duplicate"))) { return UiBrushAction_Duplicate; } + return Result; } @@ -820,6 +966,7 @@ RadioButtonGroup_ui_brush_actions( renderer_2d *Ui, { CSz("New"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_New")), UiBrushAction_New }, { CSz("Save"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Save")), UiBrushAction_Save }, { CSz("Duplicate"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_brush_actions UiBrushAction_Duplicate")), UiBrushAction_Duplicate }, + }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -847,7 +994,8 @@ PushToolbar( renderer_2d *Ui, ui_toggle_button_handle ButtonHandles[] = { - { + + { CSz("New"), {}, UiId( @@ -882,6 +1030,8 @@ PushToolbar( renderer_2d *Ui, ), UiBrushAction_Duplicate, }, + + }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -968,13 +1118,35 @@ PushToolbar( renderer_2d *Ui, + + + +link_internal b32 +IsValid(ui_layer_toolbar_actions Value) +{ + b32 Result = False; + switch (Value) + { + case LayerToolbarActions_NoAction: + case LayerToolbarActions_Rename: + case LayerToolbarActions_Duplicate: + case LayerToolbarActions_Delete: + + { + Result = True; + } + } + return Result; +} link_internal counted_string ToStringPrefixless(ui_layer_toolbar_actions Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case LayerToolbarActions_NoAction: { Result = CSz("NoAction"); } break; @@ -982,15 +1154,18 @@ ToStringPrefixless(ui_layer_toolbar_actions Type) case LayerToolbarActions_Duplicate: { Result = CSz("Duplicate"); } break; case LayerToolbarActions_Delete: { Result = CSz("Delete"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(ui_layer_toolbar_actions Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -999,9 +1174,10 @@ ToString(ui_layer_toolbar_actions Type) case LayerToolbarActions_Duplicate: { Result = CSz("LayerToolbarActions_Duplicate"); } break; case LayerToolbarActions_Delete: { Result = CSz("LayerToolbarActions_Delete"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -1015,6 +1191,7 @@ UiLayerToolbarActions(counted_string S) if (StringsMatch(S, CSz("LayerToolbarActions_Duplicate"))) { return LayerToolbarActions_Duplicate; } if (StringsMatch(S, CSz("LayerToolbarActions_Delete"))) { return LayerToolbarActions_Delete; } + return Result; } @@ -1041,6 +1218,7 @@ RadioButtonGroup_ui_layer_toolbar_actions( renderer_2d *Ui, { CSz("Rename"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Rename")), LayerToolbarActions_Rename }, { CSz("Duplicate"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Duplicate")), LayerToolbarActions_Duplicate }, { CSz("Delete"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_layer_toolbar_actions LayerToolbarActions_Delete")), LayerToolbarActions_Delete }, + }; ui_toggle_button_handle_buffer ButtonBuffer = { @@ -1068,7 +1246,8 @@ PushToolbar( renderer_2d *Ui, ui_toggle_button_handle ButtonHandles[] = { - { + + { CSz("R"), CSz("Rename"), UiId( @@ -1103,6 +1282,8 @@ PushToolbar( renderer_2d *Ui, ), LayerToolbarActions_Delete, }, + + }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h index 285aa380a..2df36b380 100644 --- a/generated/for_datatypes_khY6kwEk.h +++ b/generated/for_datatypes_khY6kwEk.h @@ -689,6 +689,7 @@ struct compile_shader_pair_async_params poof(@async_function_params) cs FragShaderPath; b32 DumpErrors; b32 RegisterForHotReload; + }; @@ -889,6 +890,7 @@ struct initialize_easing_function_visualizer_render_pass_async_params poof(@asyn easing_function_visualizer_render_pass *Element; v2 *Points; u32 *Count; + }; @@ -2034,5 +2036,6 @@ struct initialize_easing_function_visualizer_render_pass_async_params poof(@asyn + diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index bb0e121c3..157743444 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -169,7 +169,6 @@ - type_initialize_easing_function_visualizer_render_pass_async_params, @@ -501,6 +500,9 @@ type_initialize_easing_function_visualizer_render_pass_async_params, + + + @@ -562,5 +564,6 @@ type_compile_shader_pair_async_params, + diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index 7ef6f6d5f..29242637b 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,5 +1,4 @@ -// src/engine/world.h:76:0 - +// external/bonsai_stdlib/src/poof_functions.h:2647:0 struct octree_node_freelist { octree_node *First; diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h index aff58cda5..6d7140d87 100644 --- a/generated/freelist_allocator_world_chunk.h +++ b/generated/freelist_allocator_world_chunk.h @@ -1,5 +1,4 @@ -// src/engine/world.h:79:0 - +// external/bonsai_stdlib/src/poof_functions.h:2647:0 struct world_chunk_freelist { world_chunk *First; diff --git a/generated/gen_are_equal_665365505.h b/generated/gen_are_equal_665365505.h index bcc35db4a..13e111197 100644 --- a/generated/gen_are_equal_665365505.h +++ b/generated/gen_are_equal_665365505.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/primitives.h:234:0 - +// external/bonsai_stdlib/src/primitives.h:213:0 link_internal b32 AreEqual( s64 E1, s64 E2 ) { @@ -131,3 +130,4 @@ AreEqual( u8 *E1, u8 *E2 ) return Result; } + diff --git a/generated/gen_bit_operators_u32.h b/generated/gen_bit_operators_u32.h index 24d4e76f0..b24ac423b 100644 --- a/generated/gen_bit_operators_u32.h +++ b/generated/gen_bit_operators_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/bit_tricks.h:67:0 - +// external/bonsai_stdlib/src/bit_tricks.h:4:0 link_internal u32 UnsetLeastSignificantSetBit(u32 *Input) { diff --git a/generated/gen_bit_operators_u64.h b/generated/gen_bit_operators_u64.h index dfa8e95fb..0660503a5 100644 --- a/generated/gen_bit_operators_u64.h +++ b/generated/gen_bit_operators_u64.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/bit_tricks.h:70:0 - +// external/bonsai_stdlib/src/bit_tricks.h:4:0 link_internal u64 UnsetLeastSignificantSetBit(u64 *Input) { diff --git a/generated/gen_common_vector_v2.h b/generated/gen_common_vector_v2.h index 4dc966545..b3a2cf0aa 100644 --- a/generated/gen_common_vector_v2.h +++ b/generated/gen_common_vector_v2.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:805:0 - +// external/bonsai_stdlib/src/poof_functions.h:450:0 inline r32 LengthSq( v2 Vec ) { @@ -20,6 +19,7 @@ Max( v2 A, v2 B ) v2 Result; Result.E[0] = Max( A.E[0], B.E[0] ); Result.E[1] = Max( A.E[1], B.E[1] ); + return Result; } @@ -29,6 +29,7 @@ Min( v2 A, v2 B ) v2 Result; Result.E[0] = Min( A.E[0], B.E[0] ); Result.E[1] = Min( A.E[1], B.E[1] ); + return Result; } @@ -38,6 +39,7 @@ Abs( v2 Vec ) v2 Result; Result.E[0] = (r32)Abs( Vec.E[0] ); Result.E[1] = (r32)Abs( Vec.E[1] ); + return Result; } @@ -48,6 +50,7 @@ GetSign( v2 Vec ) v2 Result; Result.E[0] = GetSign( Vec.E[0] ); Result.E[1] = GetSign( Vec.E[1] ); + return Result; } @@ -58,6 +61,7 @@ Bilateral( v2 Vec ) v2 Result; Result.E[0] = Bilateral( Vec.E[0] ); Result.E[1] = Bilateral( Vec.E[1] ); + return Result; } @@ -67,6 +71,7 @@ ClampNegative( v2 V ) v2 Result = V; if ( V.E[0] > r32(0) ) Result.E[0] = r32(0); if ( V.E[1] > r32(0) ) Result.E[1] = r32(0); + return Result; } @@ -76,6 +81,7 @@ ClampPositive( v2 V ) v2 Result = V; if ( V.E[0] < r32(0) ) Result.E[0] = r32(0); if ( V.E[1] < r32(0) ) Result.E[1] = r32(0); + return Result; } @@ -87,6 +93,7 @@ Clamp01( v2 V ) if ( V.E[0] > r32(1) ) Result.E[0] = r32(1); if ( V.E[1] < r32(0) ) Result.E[1] = r32(0); if ( V.E[1] > r32(1) ) Result.E[1] = r32(1); + return Result; } diff --git a/generated/gen_common_vector_v3.h b/generated/gen_common_vector_v3.h index ca9df36dc..1092dad77 100644 --- a/generated/gen_common_vector_v3.h +++ b/generated/gen_common_vector_v3.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:808:0 - +// external/bonsai_stdlib/src/poof_functions.h:450:0 inline r32 LengthSq( v3 Vec ) { @@ -21,6 +20,7 @@ Max( v3 A, v3 B ) Result.E[0] = Max( A.E[0], B.E[0] ); Result.E[1] = Max( A.E[1], B.E[1] ); Result.E[2] = Max( A.E[2], B.E[2] ); + return Result; } @@ -31,6 +31,7 @@ Min( v3 A, v3 B ) Result.E[0] = Min( A.E[0], B.E[0] ); Result.E[1] = Min( A.E[1], B.E[1] ); Result.E[2] = Min( A.E[2], B.E[2] ); + return Result; } @@ -41,6 +42,7 @@ Abs( v3 Vec ) Result.E[0] = (r32)Abs( Vec.E[0] ); Result.E[1] = (r32)Abs( Vec.E[1] ); Result.E[2] = (r32)Abs( Vec.E[2] ); + return Result; } @@ -52,6 +54,7 @@ GetSign( v3 Vec ) Result.E[0] = GetSign( Vec.E[0] ); Result.E[1] = GetSign( Vec.E[1] ); Result.E[2] = GetSign( Vec.E[2] ); + return Result; } @@ -63,6 +66,7 @@ Bilateral( v3 Vec ) Result.E[0] = Bilateral( Vec.E[0] ); Result.E[1] = Bilateral( Vec.E[1] ); Result.E[2] = Bilateral( Vec.E[2] ); + return Result; } @@ -73,6 +77,7 @@ ClampNegative( v3 V ) if ( V.E[0] > r32(0) ) Result.E[0] = r32(0); if ( V.E[1] > r32(0) ) Result.E[1] = r32(0); if ( V.E[2] > r32(0) ) Result.E[2] = r32(0); + return Result; } @@ -83,6 +88,7 @@ ClampPositive( v3 V ) if ( V.E[0] < r32(0) ) Result.E[0] = r32(0); if ( V.E[1] < r32(0) ) Result.E[1] = r32(0); if ( V.E[2] < r32(0) ) Result.E[2] = r32(0); + return Result; } @@ -96,6 +102,7 @@ Clamp01( v3 V ) if ( V.E[1] > r32(1) ) Result.E[1] = r32(1); if ( V.E[2] < r32(0) ) Result.E[2] = r32(0); if ( V.E[2] > r32(1) ) Result.E[2] = r32(1); + return Result; } diff --git a/generated/gen_common_vector_v3i.h b/generated/gen_common_vector_v3i.h index 9f8508c09..535f08baa 100644 --- a/generated/gen_common_vector_v3i.h +++ b/generated/gen_common_vector_v3i.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:811:0 - +// external/bonsai_stdlib/src/poof_functions.h:450:0 inline s32 LengthSq( v3i Vec ) { @@ -21,6 +20,7 @@ Max( v3i A, v3i B ) Result.E[0] = Max( A.E[0], B.E[0] ); Result.E[1] = Max( A.E[1], B.E[1] ); Result.E[2] = Max( A.E[2], B.E[2] ); + return Result; } @@ -31,6 +31,7 @@ Min( v3i A, v3i B ) Result.E[0] = Min( A.E[0], B.E[0] ); Result.E[1] = Min( A.E[1], B.E[1] ); Result.E[2] = Min( A.E[2], B.E[2] ); + return Result; } @@ -41,6 +42,7 @@ Abs( v3i Vec ) Result.E[0] = (s32)Abs( Vec.E[0] ); Result.E[1] = (s32)Abs( Vec.E[1] ); Result.E[2] = (s32)Abs( Vec.E[2] ); + return Result; } @@ -52,6 +54,7 @@ GetSign( v3i Vec ) Result.E[0] = GetSign( Vec.E[0] ); Result.E[1] = GetSign( Vec.E[1] ); Result.E[2] = GetSign( Vec.E[2] ); + return Result; } @@ -63,6 +66,7 @@ Bilateral( v3i Vec ) Result.E[0] = Bilateral( Vec.E[0] ); Result.E[1] = Bilateral( Vec.E[1] ); Result.E[2] = Bilateral( Vec.E[2] ); + return Result; } @@ -73,6 +77,7 @@ ClampNegative( v3i V ) if ( V.E[0] > s32(0) ) Result.E[0] = s32(0); if ( V.E[1] > s32(0) ) Result.E[1] = s32(0); if ( V.E[2] > s32(0) ) Result.E[2] = s32(0); + return Result; } @@ -83,6 +88,7 @@ ClampPositive( v3i V ) if ( V.E[0] < s32(0) ) Result.E[0] = s32(0); if ( V.E[1] < s32(0) ) Result.E[1] = s32(0); if ( V.E[2] < s32(0) ) Result.E[2] = s32(0); + return Result; } @@ -96,6 +102,7 @@ Clamp01( v3i V ) if ( V.E[1] > s32(1) ) Result.E[1] = s32(1); if ( V.E[2] < s32(0) ) Result.E[2] = s32(0); if ( V.E[2] > s32(1) ) Result.E[2] = s32(1); + return Result; } diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index c0dfc729d..b874fdfe7 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,5 +1,4 @@ -// src/engine/graphics.h:156:0 - +// external/bonsai_stdlib/src/poof_functions.h:113:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) { @@ -7,9 +6,13 @@ GpuReadbackBuffer( u32 PBO , GLsync Fence ) .PBO = PBO , .Fence = Fence + + }; + + return Reuslt; } diff --git a/generated/gen_constructor_perlin_params.h b/generated/gen_constructor_perlin_params.h index a3886bf60..f85c090d2 100644 --- a/generated/gen_constructor_perlin_params.h +++ b/generated/gen_constructor_perlin_params.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/perlin.h:12:0 - +// external/bonsai_stdlib/src/poof_functions.h:113:0 link_internal perlin_params PerlinParams( u32_8x P0 , u32_8x P1 , f32_8x Fract0 , f32_8x Fract1 , f32_8x Fade ) { @@ -7,15 +6,22 @@ PerlinParams( u32_8x P0 , u32_8x P1 , f32_8x Fract0 , f32_8x Fract1 , f .P0 = P0 , .P1 = P1 -, - .Fract0 = Fract0 -, - .Fract1 = Fract1 -, - .Fade = Fade + +, .Fract0 = Fract0 + +, .Fract1 = Fract1 + +, .Fade = Fade + + }; + + + + + return Reuslt; } diff --git a/generated/gen_constructor_vertex_material.h b/generated/gen_constructor_vertex_material.h index 5b3f33418..ef1bac586 100644 --- a/generated/gen_constructor_vertex_material.h +++ b/generated/gen_constructor_vertex_material.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/mesh.h:35:0 - +// external/bonsai_stdlib/src/poof_functions.h:113:0 link_internal vertex_material VertexMaterial( u16 ColorIndex , u8 Transparency , u8 Emission ) { @@ -7,11 +6,16 @@ VertexMaterial( u16 ColorIndex , u8 Transparency , u8 Emission ) .ColorIndex = ColorIndex , .Transparency = Transparency -, - .Emission = Emission + +, .Emission = Emission + + }; + + + return Reuslt; } diff --git a/generated/gen_constructor_voxel_lighting.h b/generated/gen_constructor_voxel_lighting.h index 9921497ba..a8ffce764 100644 --- a/generated/gen_constructor_voxel_lighting.h +++ b/generated/gen_constructor_voxel_lighting.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.h:124:0 - +// external/bonsai_stdlib/src/poof_functions.h:113:0 link_internal voxel_lighting VoxelLighting( u8 Emission ) { @@ -9,7 +8,8 @@ VoxelLighting( u8 Emission ) }; - + + return Reuslt; } diff --git a/generated/gen_constructor_voxel_stack_element.h b/generated/gen_constructor_voxel_stack_element.h index 707bcbd9b..07462c600 100644 --- a/generated/gen_constructor_voxel_stack_element.h +++ b/generated/gen_constructor_voxel_stack_element.h @@ -1,5 +1,4 @@ -// src/engine/world_update.h:15:0 - +// external/bonsai_stdlib/src/poof_functions.h:113:0 link_internal voxel_stack_element VoxelStackElement( v3i VoxSimP , voxel_rule_direction Dir ) { @@ -7,9 +6,13 @@ VoxelStackElement( v3i VoxSimP , voxel_rule_direction Dir ) .VoxSimP = VoxSimP , .Dir = Dir + + }; + + return Reuslt; } diff --git a/generated/gen_constructor_voxel_synthesis_change_propagation_info.h b/generated/gen_constructor_voxel_synthesis_change_propagation_info.h index 24d08a8b6..580a9bb5b 100644 --- a/generated/gen_constructor_voxel_synthesis_change_propagation_info.h +++ b/generated/gen_constructor_voxel_synthesis_change_propagation_info.h @@ -1,5 +1,4 @@ -// src/engine/voxel_synthesis.h:309:0 - +// external/bonsai_stdlib/src/poof_functions.h:113:0 link_internal voxel_synthesis_change_propagation_info VoxelSynthesisChangePropagationInfo( tile_rule PrevTileOptions , v3i PrevTileP , v3i DirOfTravel ) { @@ -7,11 +6,16 @@ VoxelSynthesisChangePropagationInfo( tile_rule PrevTileOptions , v3i PrevTi .PrevTileOptions = PrevTileOptions , .PrevTileP = PrevTileP -, - .DirOfTravel = DirOfTravel + +, .DirOfTravel = DirOfTravel + + }; + + + return Reuslt; } diff --git a/generated/gen_default_equality_operator_tile_rule_id.h b/generated/gen_default_equality_operator_tile_rule_id.h index 1055c981d..b604d5809 100644 --- a/generated/gen_default_equality_operator_tile_rule_id.h +++ b/generated/gen_default_equality_operator_tile_rule_id.h @@ -1,5 +1,4 @@ -// src/engine/voxel_synthesis.h:21:0 - +// external/bonsai_stdlib/src/poof_functions.h:94:0 link_internal b32 operator==( tile_rule_id E1, tile_rule_id E2 ) { diff --git a/generated/gen_default_equality_operator_ui_id.h b/generated/gen_default_equality_operator_ui_id.h index 9400f4a66..deef15855 100644 --- a/generated/gen_default_equality_operator_ui_id.h +++ b/generated/gen_default_equality_operator_ui_id.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/interactable.h:27:0 - +// external/bonsai_stdlib/src/poof_functions.h:94:0 link_internal b32 operator==( ui_id E1, ui_id E2 ) { diff --git a/generated/gen_hetero_vector_operators_v2_v2i.h b/generated/gen_hetero_vector_operators_v2_v2i.h index bf2610224..9e2d4bb2c 100644 --- a/generated/gen_hetero_vector_operators_v2_v2i.h +++ b/generated/gen_hetero_vector_operators_v2_v2i.h @@ -1,11 +1,11 @@ -// external/bonsai_stdlib/src/vector.h:241:0 - +// external/bonsai_stdlib/src/poof_functions.h:353:0 inline v2 operator+( v2 P1, v2i P2 ) { v2 Result; Result.E[0] = Cast(r32, P1.E[0] + Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] + Cast(r32, P2.E[1])); + return Result; } @@ -17,6 +17,7 @@ operator-( v2 P1, v2i P2 ) v2 Result; Result.E[0] = Cast(r32, P1.E[0] - Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] - Cast(r32, P2.E[1])); + return Result; } @@ -28,6 +29,7 @@ operator*( v2 P1, v2i P2 ) v2 Result; Result.E[0] = Cast(r32, P1.E[0] * Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] * Cast(r32, P2.E[1])); + return Result; } @@ -39,6 +41,7 @@ operator/( v2 P1, v2i P2 ) v2 Result; Result.E[0] = Cast(r32, P1.E[0] / Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] / Cast(r32, P2.E[1])); + return Result; } diff --git a/generated/gen_hetero_vector_operators_v2i_v2.h b/generated/gen_hetero_vector_operators_v2i_v2.h index ef48b0a54..7be21ab45 100644 --- a/generated/gen_hetero_vector_operators_v2i_v2.h +++ b/generated/gen_hetero_vector_operators_v2i_v2.h @@ -1,11 +1,11 @@ -// external/bonsai_stdlib/src/vector.h:244:0 - +// external/bonsai_stdlib/src/poof_functions.h:353:0 inline v2i operator+( v2i P1, v2 P2 ) { v2i Result; Result.E[0] = Cast(s32, P1.E[0] + Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] + Cast(s32, P2.E[1])); + return Result; } @@ -17,6 +17,7 @@ operator-( v2i P1, v2 P2 ) v2i Result; Result.E[0] = Cast(s32, P1.E[0] - Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] - Cast(s32, P2.E[1])); + return Result; } @@ -28,6 +29,7 @@ operator*( v2i P1, v2 P2 ) v2i Result; Result.E[0] = Cast(s32, P1.E[0] * Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] * Cast(s32, P2.E[1])); + return Result; } @@ -39,6 +41,7 @@ operator/( v2i P1, v2 P2 ) v2i Result; Result.E[0] = Cast(s32, P1.E[0] / Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] / Cast(s32, P2.E[1])); + return Result; } diff --git a/generated/gen_hetero_vector_operators_v3_u8_v3.h b/generated/gen_hetero_vector_operators_v3_u8_v3.h index d6da8d70e..ebd4696c4 100644 --- a/generated/gen_hetero_vector_operators_v3_u8_v3.h +++ b/generated/gen_hetero_vector_operators_v3_u8_v3.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:256:0 - +// external/bonsai_stdlib/src/poof_functions.h:353:0 inline v3_u8 operator+( v3_u8 P1, v3 P2 ) { @@ -7,6 +6,7 @@ operator+( v3_u8 P1, v3 P2 ) Result.E[0] = Cast(u8, P1.E[0] + Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] + Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] + Cast(u8, P2.E[2])); + return Result; } @@ -19,6 +19,7 @@ operator-( v3_u8 P1, v3 P2 ) Result.E[0] = Cast(u8, P1.E[0] - Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] - Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] - Cast(u8, P2.E[2])); + return Result; } @@ -31,6 +32,7 @@ operator*( v3_u8 P1, v3 P2 ) Result.E[0] = Cast(u8, P1.E[0] * Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] * Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] * Cast(u8, P2.E[2])); + return Result; } @@ -43,6 +45,7 @@ operator/( v3_u8 P1, v3 P2 ) Result.E[0] = Cast(u8, P1.E[0] / Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] / Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] / Cast(u8, P2.E[2])); + return Result; } diff --git a/generated/gen_hetero_vector_operators_v3_u8_v3i.h b/generated/gen_hetero_vector_operators_v3_u8_v3i.h index 663dc55df..7eefe4661 100644 --- a/generated/gen_hetero_vector_operators_v3_u8_v3i.h +++ b/generated/gen_hetero_vector_operators_v3_u8_v3i.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:253:0 - +// external/bonsai_stdlib/src/poof_functions.h:353:0 inline v3_u8 operator+( v3_u8 P1, v3i P2 ) { @@ -7,6 +6,7 @@ operator+( v3_u8 P1, v3i P2 ) Result.E[0] = Cast(u8, P1.E[0] + Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] + Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] + Cast(u8, P2.E[2])); + return Result; } @@ -19,6 +19,7 @@ operator-( v3_u8 P1, v3i P2 ) Result.E[0] = Cast(u8, P1.E[0] - Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] - Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] - Cast(u8, P2.E[2])); + return Result; } @@ -31,6 +32,7 @@ operator*( v3_u8 P1, v3i P2 ) Result.E[0] = Cast(u8, P1.E[0] * Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] * Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] * Cast(u8, P2.E[2])); + return Result; } @@ -43,6 +45,7 @@ operator/( v3_u8 P1, v3i P2 ) Result.E[0] = Cast(u8, P1.E[0] / Cast(u8, P2.E[0])); Result.E[1] = Cast(u8, P1.E[1] / Cast(u8, P2.E[1])); Result.E[2] = Cast(u8, P1.E[2] / Cast(u8, P2.E[2])); + return Result; } diff --git a/generated/gen_hetero_vector_operators_v3_v3i.h b/generated/gen_hetero_vector_operators_v3_v3i.h index a0cddf39b..5d65a9227 100644 --- a/generated/gen_hetero_vector_operators_v3_v3i.h +++ b/generated/gen_hetero_vector_operators_v3_v3i.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:247:0 - +// external/bonsai_stdlib/src/poof_functions.h:353:0 inline v3 operator+( v3 P1, v3i P2 ) { @@ -7,6 +6,7 @@ operator+( v3 P1, v3i P2 ) Result.E[0] = Cast(r32, P1.E[0] + Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] + Cast(r32, P2.E[1])); Result.E[2] = Cast(r32, P1.E[2] + Cast(r32, P2.E[2])); + return Result; } @@ -19,6 +19,7 @@ operator-( v3 P1, v3i P2 ) Result.E[0] = Cast(r32, P1.E[0] - Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] - Cast(r32, P2.E[1])); Result.E[2] = Cast(r32, P1.E[2] - Cast(r32, P2.E[2])); + return Result; } @@ -31,6 +32,7 @@ operator*( v3 P1, v3i P2 ) Result.E[0] = Cast(r32, P1.E[0] * Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] * Cast(r32, P2.E[1])); Result.E[2] = Cast(r32, P1.E[2] * Cast(r32, P2.E[2])); + return Result; } @@ -43,6 +45,7 @@ operator/( v3 P1, v3i P2 ) Result.E[0] = Cast(r32, P1.E[0] / Cast(r32, P2.E[0])); Result.E[1] = Cast(r32, P1.E[1] / Cast(r32, P2.E[1])); Result.E[2] = Cast(r32, P1.E[2] / Cast(r32, P2.E[2])); + return Result; } diff --git a/generated/gen_hetero_vector_operators_v3i_v3.h b/generated/gen_hetero_vector_operators_v3i_v3.h index 9324b91ba..74951f7fd 100644 --- a/generated/gen_hetero_vector_operators_v3i_v3.h +++ b/generated/gen_hetero_vector_operators_v3i_v3.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:250:0 - +// external/bonsai_stdlib/src/poof_functions.h:353:0 inline v3i operator+( v3i P1, v3 P2 ) { @@ -7,6 +6,7 @@ operator+( v3i P1, v3 P2 ) Result.E[0] = Cast(s32, P1.E[0] + Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] + Cast(s32, P2.E[1])); Result.E[2] = Cast(s32, P1.E[2] + Cast(s32, P2.E[2])); + return Result; } @@ -19,6 +19,7 @@ operator-( v3i P1, v3 P2 ) Result.E[0] = Cast(s32, P1.E[0] - Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] - Cast(s32, P2.E[1])); Result.E[2] = Cast(s32, P1.E[2] - Cast(s32, P2.E[2])); + return Result; } @@ -31,6 +32,7 @@ operator*( v3i P1, v3 P2 ) Result.E[0] = Cast(s32, P1.E[0] * Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] * Cast(s32, P2.E[1])); Result.E[2] = Cast(s32, P1.E[2] * Cast(s32, P2.E[2])); + return Result; } @@ -43,6 +45,7 @@ operator/( v3i P1, v3 P2 ) Result.E[0] = Cast(s32, P1.E[0] / Cast(s32, P2.E[0])); Result.E[1] = Cast(s32, P1.E[1] / Cast(s32, P2.E[1])); Result.E[2] = Cast(s32, P1.E[2] / Cast(s32, P2.E[2])); + return Result; } diff --git a/generated/gen_lerp_f32.h b/generated/gen_lerp_f32.h index 38b06e1d6..fe3652368 100644 --- a/generated/gen_lerp_f32.h +++ b/generated/gen_lerp_f32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/maff.h:22:0 - +// external/bonsai_stdlib/src/poof_functions.h:372:0 inline f32 Lerp(r32 t, f32 P1, f32 P2) { diff --git a/generated/gen_lerp_v2.h b/generated/gen_lerp_v2.h index d4dea8502..e09918421 100644 --- a/generated/gen_lerp_v2.h +++ b/generated/gen_lerp_v2.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:788:0 - +// external/bonsai_stdlib/src/poof_functions.h:372:0 inline v2 Lerp(r32 t, v2 P1, v2 P2) { diff --git a/generated/gen_lerp_v3.h b/generated/gen_lerp_v3.h index 117c54d50..88ba38d0d 100644 --- a/generated/gen_lerp_v3.h +++ b/generated/gen_lerp_v3.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:791:0 - +// external/bonsai_stdlib/src/poof_functions.h:372:0 inline v3 Lerp(r32 t, v3 P1, v3 P2) { diff --git a/generated/gen_map_value_to_range_r32.h b/generated/gen_map_value_to_range_r32.h index 3ad870836..24e1efc05 100644 --- a/generated/gen_map_value_to_range_r32.h +++ b/generated/gen_map_value_to_range_r32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/random.h:203:0 - +// external/bonsai_stdlib/src/random.h:176:0 link_internal r32 MapValueToRange( r32 LowestPossibleValue, r32 Value, r32 HighestPossibleValue) { diff --git a/generated/gen_map_value_to_range_s32.h b/generated/gen_map_value_to_range_s32.h index 4f1f0a57a..eadb33044 100644 --- a/generated/gen_map_value_to_range_s32.h +++ b/generated/gen_map_value_to_range_s32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/random.h:209:0 - +// external/bonsai_stdlib/src/random.h:176:0 link_internal s32 MapValueToRange( s32 LowestPossibleValue, r32 Value, s32 HighestPossibleValue) { diff --git a/generated/gen_map_value_to_range_u32.h b/generated/gen_map_value_to_range_u32.h index 58d1a8629..fe5f4762a 100644 --- a/generated/gen_map_value_to_range_u32.h +++ b/generated/gen_map_value_to_range_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/random.h:206:0 - +// external/bonsai_stdlib/src/random.h:176:0 link_internal u32 MapValueToRange( u32 LowestPossibleValue, r32 Value, u32 HighestPossibleValue) { diff --git a/generated/gen_primitive_deep_copy_715421923.h b/generated/gen_primitive_deep_copy_715421923.h index e6ca97392..b34f9650c 100644 --- a/generated/gen_primitive_deep_copy_715421923.h +++ b/generated/gen_primitive_deep_copy_715421923.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/primitives.h:251:0 - +// external/bonsai_stdlib/src/primitives.h:238:0 link_internal void DeepCopy( s64 *Src, s64 *Dest ) { @@ -51,3 +50,4 @@ DeepCopy( u8 *Src, u8 *Dest ) *Dest = *Src; } + diff --git a/generated/gen_random_between_r32.h b/generated/gen_random_between_r32.h index 19fe39b41..081b38bee 100644 --- a/generated/gen_random_between_r32.h +++ b/generated/gen_random_between_r32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/random.h:229:0 - +// external/bonsai_stdlib/src/random.h:214:0 link_internal r32 RandomBetween( r32 LowestPossibleValue, random_series *Entropy, r32 HighestPossibleValue) { diff --git a/generated/gen_random_between_s32.h b/generated/gen_random_between_s32.h index 07badf979..65da86bc9 100644 --- a/generated/gen_random_between_s32.h +++ b/generated/gen_random_between_s32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/random.h:235:0 - +// external/bonsai_stdlib/src/random.h:214:0 link_internal s32 RandomBetween( s32 LowestPossibleValue, random_series *Entropy, s32 HighestPossibleValue) { diff --git a/generated/gen_random_between_u32.h b/generated/gen_random_between_u32.h index 899933b0b..6e848a593 100644 --- a/generated/gen_random_between_u32.h +++ b/generated/gen_random_between_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/random.h:232:0 - +// external/bonsai_stdlib/src/random.h:214:0 link_internal u32 RandomBetween( u32 LowestPossibleValue, random_series *Entropy, u32 HighestPossibleValue) { diff --git a/generated/gen_read_primitive_from_native_file_803324607.h b/generated/gen_read_primitive_from_native_file_803324607.h index f02e7a2d7..2f622b99a 100644 --- a/generated/gen_read_primitive_from_native_file_803324607.h +++ b/generated/gen_read_primitive_from_native_file_803324607.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:441:0 - +// external/bonsai_stdlib/src/binary_parser.cpp:426:0 link_internal s8 Read_s8(native_file *File) { @@ -57,3 +56,4 @@ Read_u64(native_file *File) return Result; } + diff --git a/generated/gen_read_primitive_from_u8_cursor_little_endian_851742148.h b/generated/gen_read_primitive_from_u8_cursor_little_endian_851742148.h index e7aaf63d5..83c26b2f5 100644 --- a/generated/gen_read_primitive_from_u8_cursor_little_endian_851742148.h +++ b/generated/gen_read_primitive_from_u8_cursor_little_endian_851742148.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:513:0 - +// external/bonsai_stdlib/src/binary_parser.cpp:449:0 link_internal s8 Read_s8(u8 *Source) { @@ -218,3 +217,4 @@ ReadArray_u64(u8_stream *Source, u32 Count) return Result; } + diff --git a/generated/gen_read_primitive_u32.h b/generated/gen_read_primitive_u32.h index 63ec89947..576ae2cf5 100644 --- a/generated/gen_read_primitive_u32.h +++ b/generated/gen_read_primitive_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:572:0 - +// external/bonsai_stdlib/src/binary_parser.cpp:555:0 link_internal bool Read_u32(u8_cursor *Cursor, u32 *Dest) { diff --git a/generated/gen_read_primitive_u64.h b/generated/gen_read_primitive_u64.h index d83fcf2c5..65f2a9898 100644 --- a/generated/gen_read_primitive_u64.h +++ b/generated/gen_read_primitive_u64.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:575:0 - +// external/bonsai_stdlib/src/binary_parser.cpp:555:0 link_internal bool Read_u64(u8_cursor *Cursor, u64 *Dest) { diff --git a/generated/gen_rect_helpers_rect2_v2.h b/generated/gen_rect_helpers_rect2_v2.h index e9e106784..3467efa21 100644 --- a/generated/gen_rect_helpers_rect2_v2.h +++ b/generated/gen_rect_helpers_rect2_v2.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/rect.h:147:0 - +// external/bonsai_stdlib/src/rect.h:58:0 link_internal rect2 RectMinMax(v2 Min, v2 Max) { diff --git a/generated/gen_rect_helpers_rect3_v3.h b/generated/gen_rect_helpers_rect3_v3.h index 480215556..1e2ae8b1f 100644 --- a/generated/gen_rect_helpers_rect3_v3.h +++ b/generated/gen_rect_helpers_rect3_v3.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/rect.h:151:0 - +// external/bonsai_stdlib/src/rect.h:58:0 link_internal rect3 RectMinMax(v3 Min, v3 Max) { diff --git a/generated/gen_rect_helpers_rect3i_v3i.h b/generated/gen_rect_helpers_rect3i_v3i.h index 6650ed521..5619b612a 100644 --- a/generated/gen_rect_helpers_rect3i_v3i.h +++ b/generated/gen_rect_helpers_rect3i_v3i.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/rect.h:154:0 - +// external/bonsai_stdlib/src/rect.h:58:0 link_internal rect3i RectMinMax(v3i Min, v3i Max) { diff --git a/generated/gen_shader_uniform_push_camera.h b/generated/gen_shader_uniform_push_camera.h index c872e3a7b..7fee726d4 100644 --- a/generated/gen_shader_uniform_push_camera.h +++ b/generated/gen_shader_uniform_push_camera.h @@ -1,5 +1,4 @@ -// src/engine/shader.cpp:1:0 - +// external/bonsai_stdlib/src/poof_functions.h:14:0 b32 InitShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name, u16 Count) diff --git a/generated/gen_shader_uniform_push_light.h b/generated/gen_shader_uniform_push_light.h index 1299740c6..3dcb2104f 100644 --- a/generated/gen_shader_uniform_push_light.h +++ b/generated/gen_shader_uniform_push_light.h @@ -1,5 +1,4 @@ -// src/engine/shader.cpp:4:0 - +// external/bonsai_stdlib/src/poof_functions.h:14:0 b32 InitShaderUniform(shader *Shader, u32 Index, light *Value, const char *Name, u16 Count) diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 5a2c18d82..23b6435b9 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:366:0 - +// external/bonsai_stdlib/src/poof_functions.h:14:0 b32 InitShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name, u16 Count) diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 031eb803c..9d5fbc5a3 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:381:0 - +// external/bonsai_stdlib/src/poof_functions.h:14:0 b32 InitShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name, u16 Count) diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index bc4087115..0d719236c 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:378:0 - +// external/bonsai_stdlib/src/poof_functions.h:14:0 b32 InitShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name, u16 Count) diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index 8d1eaa2f7..a02504000 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:363:0 - +// external/bonsai_stdlib/src/poof_functions.h:14:0 b32 InitShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name, u16 Count) diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index f06fdab49..9afecbd22 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:375:0 - +// external/bonsai_stdlib/src/poof_functions.h:14:0 b32 InitShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name, u16 Count) diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index 812ef59a2..8d9f008ba 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:369:0 - +// external/bonsai_stdlib/src/poof_functions.h:14:0 b32 InitShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name, u16 Count) diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index 74d4680f7..475e0114b 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/shader.cpp:372:0 - +// external/bonsai_stdlib/src/poof_functions.h:14:0 b32 InitShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name, u16 Count) diff --git a/generated/gen_vector_area_v2.h b/generated/gen_vector_area_v2.h index 7784ec5a5..e272cf5a2 100644 --- a/generated/gen_vector_area_v2.h +++ b/generated/gen_vector_area_v2.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:799:0 - +// external/bonsai_stdlib/src/poof_functions.h:427:0 inline r32 Area( v2 Vec ) { diff --git a/generated/gen_vector_area_v2i.h b/generated/gen_vector_area_v2i.h index b927aee1b..25a20d96e 100644 --- a/generated/gen_vector_area_v2i.h +++ b/generated/gen_vector_area_v2i.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:802:0 - +// external/bonsai_stdlib/src/poof_functions.h:427:0 inline s32 Area( v2i Vec ) { diff --git a/generated/gen_vector_infix_operator_v3i_688856393.h b/generated/gen_vector_infix_operator_v3i_688856393.h index 3fd15c3ec..26f7123a8 100644 --- a/generated/gen_vector_infix_operator_v3i_688856393.h +++ b/generated/gen_vector_infix_operator_v3i_688856393.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:785:0 - +// external/bonsai_stdlib/src/poof_functions.h:168:0 inline v3i operator&( v3i P1, v3i P2 ) { @@ -7,6 +6,7 @@ operator&( v3i P1, v3i P2 ) .E[0] = P1.E[0] & P2.E[0], .E[1] = P1.E[1] & P2.E[1], .E[2] = P1.E[2] & P2.E[2], + }; return Result; } diff --git a/generated/gen_vector_infix_operator_v3i_688856449.h b/generated/gen_vector_infix_operator_v3i_688856449.h index 2a033548f..f4a68d04c 100644 --- a/generated/gen_vector_infix_operator_v3i_688856449.h +++ b/generated/gen_vector_infix_operator_v3i_688856449.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:782:0 - +// external/bonsai_stdlib/src/poof_functions.h:168:0 inline v3i operator^( v3i P1, v3i P2 ) { @@ -7,6 +6,7 @@ operator^( v3i P1, v3i P2 ) .E[0] = P1.E[0] ^ P2.E[0], .E[1] = P1.E[1] ^ P2.E[1], .E[2] = P1.E[2] ^ P2.E[2], + }; return Result; } diff --git a/generated/gen_vector_normalize_funcs_v2.h b/generated/gen_vector_normalize_funcs_v2.h index 9b4f451d3..a1ae45e23 100644 --- a/generated/gen_vector_normalize_funcs_v2.h +++ b/generated/gen_vector_normalize_funcs_v2.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:814:0 - +// external/bonsai_stdlib/src/poof_functions.h:571:0 inline v2 Normalize( v2 Vec, r32 Length) { diff --git a/generated/gen_vector_normalize_funcs_v3.h b/generated/gen_vector_normalize_funcs_v3.h index 58790374e..835558d96 100644 --- a/generated/gen_vector_normalize_funcs_v3.h +++ b/generated/gen_vector_normalize_funcs_v3.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:817:0 - +// external/bonsai_stdlib/src/poof_functions.h:571:0 inline v3 Normalize( v3 Vec, r32 Length) { diff --git a/generated/gen_vector_operators_v2.h b/generated/gen_vector_operators_v2.h index a48f2d6c1..f4cc7e2f6 100644 --- a/generated/gen_vector_operators_v2.h +++ b/generated/gen_vector_operators_v2.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:223:0 - +// external/bonsai_stdlib/src/poof_functions.h:268:0 link_internal void DeepCopy(v2 *Src, v2 *Dest) { @@ -47,7 +46,8 @@ MaxChannel( v2 P1 ) { r32 Result = P1.E[0]; Result = Cast(r32, Max(Result, P1.E[0])); - Result = Cast(r32, Max(Result, P1.E[1]));; + Result = Cast(r32, Max(Result, P1.E[1])); +; return Result; } @@ -89,6 +89,7 @@ operator+( v2 P1, v2 P2 ) v2 Result = {{ Cast(r32, P1.E[0] + P2.E[0]), Cast(r32, P1.E[1] + P2.E[1]), + }}; return Result; } @@ -99,6 +100,7 @@ operator+( v2 P1, r32 Scalar ) v2 Result = {{ Cast(r32, P1.E[0] + Scalar), Cast(r32, P1.E[1] + Scalar), + }}; return Result; } @@ -109,6 +111,7 @@ operator+( r32 Scalar, v2 P1 ) v2 Result = {{ Cast(r32, Scalar + P1.E[0]), Cast(r32, Scalar + P1.E[1]), + }}; return Result; } @@ -121,6 +124,7 @@ operator-( v2 P1, v2 P2 ) v2 Result = {{ Cast(r32, P1.E[0] - P2.E[0]), Cast(r32, P1.E[1] - P2.E[1]), + }}; return Result; } @@ -131,6 +135,7 @@ operator-( v2 P1, r32 Scalar ) v2 Result = {{ Cast(r32, P1.E[0] - Scalar), Cast(r32, P1.E[1] - Scalar), + }}; return Result; } @@ -141,6 +146,7 @@ operator-( r32 Scalar, v2 P1 ) v2 Result = {{ Cast(r32, Scalar - P1.E[0]), Cast(r32, Scalar - P1.E[1]), + }}; return Result; } @@ -153,6 +159,7 @@ operator*( v2 P1, v2 P2 ) v2 Result = {{ Cast(r32, P1.E[0] * P2.E[0]), Cast(r32, P1.E[1] * P2.E[1]), + }}; return Result; } @@ -163,6 +170,7 @@ operator*( v2 P1, r32 Scalar ) v2 Result = {{ Cast(r32, P1.E[0] * Scalar), Cast(r32, P1.E[1] * Scalar), + }}; return Result; } @@ -173,6 +181,7 @@ operator*( r32 Scalar, v2 P1 ) v2 Result = {{ Cast(r32, Scalar * P1.E[0]), Cast(r32, Scalar * P1.E[1]), + }}; return Result; } @@ -185,6 +194,7 @@ operator/( v2 P1, v2 P2 ) v2 Result = {{ Cast(r32, P1.E[0] / P2.E[0]), Cast(r32, P1.E[1] / P2.E[1]), + }}; return Result; } @@ -195,6 +205,7 @@ operator/( v2 P1, r32 Scalar ) v2 Result = {{ Cast(r32, P1.E[0] / Scalar), Cast(r32, P1.E[1] / Scalar), + }}; return Result; } @@ -205,6 +216,7 @@ operator/( r32 Scalar, v2 P1 ) v2 Result = {{ Cast(r32, Scalar / P1.E[0]), Cast(r32, Scalar / P1.E[1]), + }}; return Result; } @@ -216,6 +228,7 @@ operator+=( v2 &P1, v2 P2 ) { P1.E[0] += P2.E[0]; P1.E[1] += P2.E[1]; + return P1; } @@ -224,6 +237,7 @@ operator+=( v2 &P1, r32 Scalar ) { P1.E[0] += Scalar; P1.E[1] += Scalar; + return P1; } @@ -233,6 +247,7 @@ operator-=( v2 &P1, v2 P2 ) { P1.E[0] -= P2.E[0]; P1.E[1] -= P2.E[1]; + return P1; } @@ -241,6 +256,7 @@ operator-=( v2 &P1, r32 Scalar ) { P1.E[0] -= Scalar; P1.E[1] -= Scalar; + return P1; } @@ -250,6 +266,7 @@ operator*=( v2 &P1, v2 P2 ) { P1.E[0] *= P2.E[0]; P1.E[1] *= P2.E[1]; + return P1; } @@ -258,6 +275,7 @@ operator*=( v2 &P1, r32 Scalar ) { P1.E[0] *= Scalar; P1.E[1] *= Scalar; + return P1; } @@ -267,6 +285,7 @@ operator/=( v2 &P1, v2 P2 ) { P1.E[0] /= P2.E[0]; P1.E[1] /= P2.E[1]; + return P1; } @@ -275,6 +294,7 @@ operator/=( v2 &P1, r32 Scalar ) { P1.E[0] /= Scalar; P1.E[1] /= Scalar; + return P1; } diff --git a/generated/gen_vector_operators_v2i.h b/generated/gen_vector_operators_v2i.h index 2031fbb52..a76c88fb7 100644 --- a/generated/gen_vector_operators_v2i.h +++ b/generated/gen_vector_operators_v2i.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:226:0 - +// external/bonsai_stdlib/src/poof_functions.h:268:0 link_internal void DeepCopy(v2i *Src, v2i *Dest) { @@ -47,7 +46,8 @@ MaxChannel( v2i P1 ) { s32 Result = P1.E[0]; Result = Cast(s32, Max(Result, P1.E[0])); - Result = Cast(s32, Max(Result, P1.E[1]));; + Result = Cast(s32, Max(Result, P1.E[1])); +; return Result; } @@ -89,6 +89,7 @@ operator+( v2i P1, v2i P2 ) v2i Result = {{ Cast(s32, P1.E[0] + P2.E[0]), Cast(s32, P1.E[1] + P2.E[1]), + }}; return Result; } @@ -99,6 +100,7 @@ operator+( v2i P1, s32 Scalar ) v2i Result = {{ Cast(s32, P1.E[0] + Scalar), Cast(s32, P1.E[1] + Scalar), + }}; return Result; } @@ -109,6 +111,7 @@ operator+( s32 Scalar, v2i P1 ) v2i Result = {{ Cast(s32, Scalar + P1.E[0]), Cast(s32, Scalar + P1.E[1]), + }}; return Result; } @@ -121,6 +124,7 @@ operator-( v2i P1, v2i P2 ) v2i Result = {{ Cast(s32, P1.E[0] - P2.E[0]), Cast(s32, P1.E[1] - P2.E[1]), + }}; return Result; } @@ -131,6 +135,7 @@ operator-( v2i P1, s32 Scalar ) v2i Result = {{ Cast(s32, P1.E[0] - Scalar), Cast(s32, P1.E[1] - Scalar), + }}; return Result; } @@ -141,6 +146,7 @@ operator-( s32 Scalar, v2i P1 ) v2i Result = {{ Cast(s32, Scalar - P1.E[0]), Cast(s32, Scalar - P1.E[1]), + }}; return Result; } @@ -153,6 +159,7 @@ operator*( v2i P1, v2i P2 ) v2i Result = {{ Cast(s32, P1.E[0] * P2.E[0]), Cast(s32, P1.E[1] * P2.E[1]), + }}; return Result; } @@ -163,6 +170,7 @@ operator*( v2i P1, s32 Scalar ) v2i Result = {{ Cast(s32, P1.E[0] * Scalar), Cast(s32, P1.E[1] * Scalar), + }}; return Result; } @@ -173,6 +181,7 @@ operator*( s32 Scalar, v2i P1 ) v2i Result = {{ Cast(s32, Scalar * P1.E[0]), Cast(s32, Scalar * P1.E[1]), + }}; return Result; } @@ -185,6 +194,7 @@ operator/( v2i P1, v2i P2 ) v2i Result = {{ Cast(s32, P1.E[0] / P2.E[0]), Cast(s32, P1.E[1] / P2.E[1]), + }}; return Result; } @@ -195,6 +205,7 @@ operator/( v2i P1, s32 Scalar ) v2i Result = {{ Cast(s32, P1.E[0] / Scalar), Cast(s32, P1.E[1] / Scalar), + }}; return Result; } @@ -205,6 +216,7 @@ operator/( s32 Scalar, v2i P1 ) v2i Result = {{ Cast(s32, Scalar / P1.E[0]), Cast(s32, Scalar / P1.E[1]), + }}; return Result; } @@ -216,6 +228,7 @@ operator+=( v2i &P1, v2i P2 ) { P1.E[0] += P2.E[0]; P1.E[1] += P2.E[1]; + return P1; } @@ -224,6 +237,7 @@ operator+=( v2i &P1, s32 Scalar ) { P1.E[0] += Scalar; P1.E[1] += Scalar; + return P1; } @@ -233,6 +247,7 @@ operator-=( v2i &P1, v2i P2 ) { P1.E[0] -= P2.E[0]; P1.E[1] -= P2.E[1]; + return P1; } @@ -241,6 +256,7 @@ operator-=( v2i &P1, s32 Scalar ) { P1.E[0] -= Scalar; P1.E[1] -= Scalar; + return P1; } @@ -250,6 +266,7 @@ operator*=( v2i &P1, v2i P2 ) { P1.E[0] *= P2.E[0]; P1.E[1] *= P2.E[1]; + return P1; } @@ -258,6 +275,7 @@ operator*=( v2i &P1, s32 Scalar ) { P1.E[0] *= Scalar; P1.E[1] *= Scalar; + return P1; } @@ -267,6 +285,7 @@ operator/=( v2i &P1, v2i P2 ) { P1.E[0] /= P2.E[0]; P1.E[1] /= P2.E[1]; + return P1; } @@ -275,6 +294,7 @@ operator/=( v2i &P1, s32 Scalar ) { P1.E[0] /= Scalar; P1.E[1] /= Scalar; + return P1; } diff --git a/generated/gen_vector_operators_v3.h b/generated/gen_vector_operators_v3.h index f8b43bf39..14df01ea7 100644 --- a/generated/gen_vector_operators_v3.h +++ b/generated/gen_vector_operators_v3.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:229:0 - +// external/bonsai_stdlib/src/poof_functions.h:268:0 link_internal void DeepCopy(v3 *Src, v3 *Dest) { @@ -48,7 +47,8 @@ MaxChannel( v3 P1 ) r32 Result = P1.E[0]; Result = Cast(r32, Max(Result, P1.E[0])); Result = Cast(r32, Max(Result, P1.E[1])); - Result = Cast(r32, Max(Result, P1.E[2]));; + Result = Cast(r32, Max(Result, P1.E[2])); +; return Result; } @@ -91,6 +91,7 @@ operator+( v3 P1, v3 P2 ) Cast(r32, P1.E[0] + P2.E[0]), Cast(r32, P1.E[1] + P2.E[1]), Cast(r32, P1.E[2] + P2.E[2]), + }}; return Result; } @@ -102,6 +103,7 @@ operator+( v3 P1, r32 Scalar ) Cast(r32, P1.E[0] + Scalar), Cast(r32, P1.E[1] + Scalar), Cast(r32, P1.E[2] + Scalar), + }}; return Result; } @@ -113,6 +115,7 @@ operator+( r32 Scalar, v3 P1 ) Cast(r32, Scalar + P1.E[0]), Cast(r32, Scalar + P1.E[1]), Cast(r32, Scalar + P1.E[2]), + }}; return Result; } @@ -126,6 +129,7 @@ operator-( v3 P1, v3 P2 ) Cast(r32, P1.E[0] - P2.E[0]), Cast(r32, P1.E[1] - P2.E[1]), Cast(r32, P1.E[2] - P2.E[2]), + }}; return Result; } @@ -137,6 +141,7 @@ operator-( v3 P1, r32 Scalar ) Cast(r32, P1.E[0] - Scalar), Cast(r32, P1.E[1] - Scalar), Cast(r32, P1.E[2] - Scalar), + }}; return Result; } @@ -148,6 +153,7 @@ operator-( r32 Scalar, v3 P1 ) Cast(r32, Scalar - P1.E[0]), Cast(r32, Scalar - P1.E[1]), Cast(r32, Scalar - P1.E[2]), + }}; return Result; } @@ -161,6 +167,7 @@ operator*( v3 P1, v3 P2 ) Cast(r32, P1.E[0] * P2.E[0]), Cast(r32, P1.E[1] * P2.E[1]), Cast(r32, P1.E[2] * P2.E[2]), + }}; return Result; } @@ -172,6 +179,7 @@ operator*( v3 P1, r32 Scalar ) Cast(r32, P1.E[0] * Scalar), Cast(r32, P1.E[1] * Scalar), Cast(r32, P1.E[2] * Scalar), + }}; return Result; } @@ -183,6 +191,7 @@ operator*( r32 Scalar, v3 P1 ) Cast(r32, Scalar * P1.E[0]), Cast(r32, Scalar * P1.E[1]), Cast(r32, Scalar * P1.E[2]), + }}; return Result; } @@ -196,6 +205,7 @@ operator/( v3 P1, v3 P2 ) Cast(r32, P1.E[0] / P2.E[0]), Cast(r32, P1.E[1] / P2.E[1]), Cast(r32, P1.E[2] / P2.E[2]), + }}; return Result; } @@ -207,6 +217,7 @@ operator/( v3 P1, r32 Scalar ) Cast(r32, P1.E[0] / Scalar), Cast(r32, P1.E[1] / Scalar), Cast(r32, P1.E[2] / Scalar), + }}; return Result; } @@ -218,6 +229,7 @@ operator/( r32 Scalar, v3 P1 ) Cast(r32, Scalar / P1.E[0]), Cast(r32, Scalar / P1.E[1]), Cast(r32, Scalar / P1.E[2]), + }}; return Result; } @@ -230,6 +242,7 @@ operator+=( v3 &P1, v3 P2 ) P1.E[0] += P2.E[0]; P1.E[1] += P2.E[1]; P1.E[2] += P2.E[2]; + return P1; } @@ -239,6 +252,7 @@ operator+=( v3 &P1, r32 Scalar ) P1.E[0] += Scalar; P1.E[1] += Scalar; P1.E[2] += Scalar; + return P1; } @@ -249,6 +263,7 @@ operator-=( v3 &P1, v3 P2 ) P1.E[0] -= P2.E[0]; P1.E[1] -= P2.E[1]; P1.E[2] -= P2.E[2]; + return P1; } @@ -258,6 +273,7 @@ operator-=( v3 &P1, r32 Scalar ) P1.E[0] -= Scalar; P1.E[1] -= Scalar; P1.E[2] -= Scalar; + return P1; } @@ -268,6 +284,7 @@ operator*=( v3 &P1, v3 P2 ) P1.E[0] *= P2.E[0]; P1.E[1] *= P2.E[1]; P1.E[2] *= P2.E[2]; + return P1; } @@ -277,6 +294,7 @@ operator*=( v3 &P1, r32 Scalar ) P1.E[0] *= Scalar; P1.E[1] *= Scalar; P1.E[2] *= Scalar; + return P1; } @@ -287,6 +305,7 @@ operator/=( v3 &P1, v3 P2 ) P1.E[0] /= P2.E[0]; P1.E[1] /= P2.E[1]; P1.E[2] /= P2.E[2]; + return P1; } @@ -296,6 +315,7 @@ operator/=( v3 &P1, r32 Scalar ) P1.E[0] /= Scalar; P1.E[1] /= Scalar; P1.E[2] /= Scalar; + return P1; } diff --git a/generated/gen_vector_operators_v3_u8.h b/generated/gen_vector_operators_v3_u8.h index fdca2c453..ec506fe83 100644 --- a/generated/gen_vector_operators_v3_u8.h +++ b/generated/gen_vector_operators_v3_u8.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:235:0 - +// external/bonsai_stdlib/src/poof_functions.h:268:0 link_internal void DeepCopy(v3_u8 *Src, v3_u8 *Dest) { @@ -48,7 +47,8 @@ MaxChannel( v3_u8 P1 ) u8 Result = P1.E[0]; Result = Cast(u8, Max(Result, P1.E[0])); Result = Cast(u8, Max(Result, P1.E[1])); - Result = Cast(u8, Max(Result, P1.E[2]));; + Result = Cast(u8, Max(Result, P1.E[2])); +; return Result; } @@ -91,6 +91,7 @@ operator+( v3_u8 P1, v3_u8 P2 ) Cast(u8, P1.E[0] + P2.E[0]), Cast(u8, P1.E[1] + P2.E[1]), Cast(u8, P1.E[2] + P2.E[2]), + }}; return Result; } @@ -102,6 +103,7 @@ operator+( v3_u8 P1, u8 Scalar ) Cast(u8, P1.E[0] + Scalar), Cast(u8, P1.E[1] + Scalar), Cast(u8, P1.E[2] + Scalar), + }}; return Result; } @@ -113,6 +115,7 @@ operator+( u8 Scalar, v3_u8 P1 ) Cast(u8, Scalar + P1.E[0]), Cast(u8, Scalar + P1.E[1]), Cast(u8, Scalar + P1.E[2]), + }}; return Result; } @@ -126,6 +129,7 @@ operator-( v3_u8 P1, v3_u8 P2 ) Cast(u8, P1.E[0] - P2.E[0]), Cast(u8, P1.E[1] - P2.E[1]), Cast(u8, P1.E[2] - P2.E[2]), + }}; return Result; } @@ -137,6 +141,7 @@ operator-( v3_u8 P1, u8 Scalar ) Cast(u8, P1.E[0] - Scalar), Cast(u8, P1.E[1] - Scalar), Cast(u8, P1.E[2] - Scalar), + }}; return Result; } @@ -148,6 +153,7 @@ operator-( u8 Scalar, v3_u8 P1 ) Cast(u8, Scalar - P1.E[0]), Cast(u8, Scalar - P1.E[1]), Cast(u8, Scalar - P1.E[2]), + }}; return Result; } @@ -161,6 +167,7 @@ operator*( v3_u8 P1, v3_u8 P2 ) Cast(u8, P1.E[0] * P2.E[0]), Cast(u8, P1.E[1] * P2.E[1]), Cast(u8, P1.E[2] * P2.E[2]), + }}; return Result; } @@ -172,6 +179,7 @@ operator*( v3_u8 P1, u8 Scalar ) Cast(u8, P1.E[0] * Scalar), Cast(u8, P1.E[1] * Scalar), Cast(u8, P1.E[2] * Scalar), + }}; return Result; } @@ -183,6 +191,7 @@ operator*( u8 Scalar, v3_u8 P1 ) Cast(u8, Scalar * P1.E[0]), Cast(u8, Scalar * P1.E[1]), Cast(u8, Scalar * P1.E[2]), + }}; return Result; } @@ -196,6 +205,7 @@ operator/( v3_u8 P1, v3_u8 P2 ) Cast(u8, P1.E[0] / P2.E[0]), Cast(u8, P1.E[1] / P2.E[1]), Cast(u8, P1.E[2] / P2.E[2]), + }}; return Result; } @@ -207,6 +217,7 @@ operator/( v3_u8 P1, u8 Scalar ) Cast(u8, P1.E[0] / Scalar), Cast(u8, P1.E[1] / Scalar), Cast(u8, P1.E[2] / Scalar), + }}; return Result; } @@ -218,6 +229,7 @@ operator/( u8 Scalar, v3_u8 P1 ) Cast(u8, Scalar / P1.E[0]), Cast(u8, Scalar / P1.E[1]), Cast(u8, Scalar / P1.E[2]), + }}; return Result; } @@ -230,6 +242,7 @@ operator+=( v3_u8 &P1, v3_u8 P2 ) P1.E[0] += P2.E[0]; P1.E[1] += P2.E[1]; P1.E[2] += P2.E[2]; + return P1; } @@ -239,6 +252,7 @@ operator+=( v3_u8 &P1, u8 Scalar ) P1.E[0] += Scalar; P1.E[1] += Scalar; P1.E[2] += Scalar; + return P1; } @@ -249,6 +263,7 @@ operator-=( v3_u8 &P1, v3_u8 P2 ) P1.E[0] -= P2.E[0]; P1.E[1] -= P2.E[1]; P1.E[2] -= P2.E[2]; + return P1; } @@ -258,6 +273,7 @@ operator-=( v3_u8 &P1, u8 Scalar ) P1.E[0] -= Scalar; P1.E[1] -= Scalar; P1.E[2] -= Scalar; + return P1; } @@ -268,6 +284,7 @@ operator*=( v3_u8 &P1, v3_u8 P2 ) P1.E[0] *= P2.E[0]; P1.E[1] *= P2.E[1]; P1.E[2] *= P2.E[2]; + return P1; } @@ -277,6 +294,7 @@ operator*=( v3_u8 &P1, u8 Scalar ) P1.E[0] *= Scalar; P1.E[1] *= Scalar; P1.E[2] *= Scalar; + return P1; } @@ -287,6 +305,7 @@ operator/=( v3_u8 &P1, v3_u8 P2 ) P1.E[0] /= P2.E[0]; P1.E[1] /= P2.E[1]; P1.E[2] /= P2.E[2]; + return P1; } @@ -296,6 +315,7 @@ operator/=( v3_u8 &P1, u8 Scalar ) P1.E[0] /= Scalar; P1.E[1] /= Scalar; P1.E[2] /= Scalar; + return P1; } diff --git a/generated/gen_vector_operators_v3i.h b/generated/gen_vector_operators_v3i.h index eb27f8bd3..b4b946f34 100644 --- a/generated/gen_vector_operators_v3i.h +++ b/generated/gen_vector_operators_v3i.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:232:0 - +// external/bonsai_stdlib/src/poof_functions.h:268:0 link_internal void DeepCopy(v3i *Src, v3i *Dest) { @@ -48,7 +47,8 @@ MaxChannel( v3i P1 ) s32 Result = P1.E[0]; Result = Cast(s32, Max(Result, P1.E[0])); Result = Cast(s32, Max(Result, P1.E[1])); - Result = Cast(s32, Max(Result, P1.E[2]));; + Result = Cast(s32, Max(Result, P1.E[2])); +; return Result; } @@ -91,6 +91,7 @@ operator+( v3i P1, v3i P2 ) Cast(s32, P1.E[0] + P2.E[0]), Cast(s32, P1.E[1] + P2.E[1]), Cast(s32, P1.E[2] + P2.E[2]), + }}; return Result; } @@ -102,6 +103,7 @@ operator+( v3i P1, s32 Scalar ) Cast(s32, P1.E[0] + Scalar), Cast(s32, P1.E[1] + Scalar), Cast(s32, P1.E[2] + Scalar), + }}; return Result; } @@ -113,6 +115,7 @@ operator+( s32 Scalar, v3i P1 ) Cast(s32, Scalar + P1.E[0]), Cast(s32, Scalar + P1.E[1]), Cast(s32, Scalar + P1.E[2]), + }}; return Result; } @@ -126,6 +129,7 @@ operator-( v3i P1, v3i P2 ) Cast(s32, P1.E[0] - P2.E[0]), Cast(s32, P1.E[1] - P2.E[1]), Cast(s32, P1.E[2] - P2.E[2]), + }}; return Result; } @@ -137,6 +141,7 @@ operator-( v3i P1, s32 Scalar ) Cast(s32, P1.E[0] - Scalar), Cast(s32, P1.E[1] - Scalar), Cast(s32, P1.E[2] - Scalar), + }}; return Result; } @@ -148,6 +153,7 @@ operator-( s32 Scalar, v3i P1 ) Cast(s32, Scalar - P1.E[0]), Cast(s32, Scalar - P1.E[1]), Cast(s32, Scalar - P1.E[2]), + }}; return Result; } @@ -161,6 +167,7 @@ operator*( v3i P1, v3i P2 ) Cast(s32, P1.E[0] * P2.E[0]), Cast(s32, P1.E[1] * P2.E[1]), Cast(s32, P1.E[2] * P2.E[2]), + }}; return Result; } @@ -172,6 +179,7 @@ operator*( v3i P1, s32 Scalar ) Cast(s32, P1.E[0] * Scalar), Cast(s32, P1.E[1] * Scalar), Cast(s32, P1.E[2] * Scalar), + }}; return Result; } @@ -183,6 +191,7 @@ operator*( s32 Scalar, v3i P1 ) Cast(s32, Scalar * P1.E[0]), Cast(s32, Scalar * P1.E[1]), Cast(s32, Scalar * P1.E[2]), + }}; return Result; } @@ -196,6 +205,7 @@ operator/( v3i P1, v3i P2 ) Cast(s32, P1.E[0] / P2.E[0]), Cast(s32, P1.E[1] / P2.E[1]), Cast(s32, P1.E[2] / P2.E[2]), + }}; return Result; } @@ -207,6 +217,7 @@ operator/( v3i P1, s32 Scalar ) Cast(s32, P1.E[0] / Scalar), Cast(s32, P1.E[1] / Scalar), Cast(s32, P1.E[2] / Scalar), + }}; return Result; } @@ -218,6 +229,7 @@ operator/( s32 Scalar, v3i P1 ) Cast(s32, Scalar / P1.E[0]), Cast(s32, Scalar / P1.E[1]), Cast(s32, Scalar / P1.E[2]), + }}; return Result; } @@ -230,6 +242,7 @@ operator+=( v3i &P1, v3i P2 ) P1.E[0] += P2.E[0]; P1.E[1] += P2.E[1]; P1.E[2] += P2.E[2]; + return P1; } @@ -239,6 +252,7 @@ operator+=( v3i &P1, s32 Scalar ) P1.E[0] += Scalar; P1.E[1] += Scalar; P1.E[2] += Scalar; + return P1; } @@ -249,6 +263,7 @@ operator-=( v3i &P1, v3i P2 ) P1.E[0] -= P2.E[0]; P1.E[1] -= P2.E[1]; P1.E[2] -= P2.E[2]; + return P1; } @@ -258,6 +273,7 @@ operator-=( v3i &P1, s32 Scalar ) P1.E[0] -= Scalar; P1.E[1] -= Scalar; P1.E[2] -= Scalar; + return P1; } @@ -268,6 +284,7 @@ operator*=( v3i &P1, v3i P2 ) P1.E[0] *= P2.E[0]; P1.E[1] *= P2.E[1]; P1.E[2] *= P2.E[2]; + return P1; } @@ -277,6 +294,7 @@ operator*=( v3i &P1, s32 Scalar ) P1.E[0] *= Scalar; P1.E[1] *= Scalar; P1.E[2] *= Scalar; + return P1; } @@ -287,6 +305,7 @@ operator/=( v3i &P1, v3i P2 ) P1.E[0] /= P2.E[0]; P1.E[1] /= P2.E[1]; P1.E[2] /= P2.E[2]; + return P1; } @@ -296,6 +315,7 @@ operator/=( v3i &P1, s32 Scalar ) P1.E[0] /= Scalar; P1.E[1] /= Scalar; P1.E[2] /= Scalar; + return P1; } diff --git a/generated/gen_vector_operators_v4.h b/generated/gen_vector_operators_v4.h index 842d4179d..b3ae4ee0c 100644 --- a/generated/gen_vector_operators_v4.h +++ b/generated/gen_vector_operators_v4.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:238:0 - +// external/bonsai_stdlib/src/poof_functions.h:268:0 link_internal void DeepCopy(v4 *Src, v4 *Dest) { @@ -49,7 +48,8 @@ MaxChannel( v4 P1 ) Result = Cast(r32, Max(Result, P1.E[0])); Result = Cast(r32, Max(Result, P1.E[1])); Result = Cast(r32, Max(Result, P1.E[2])); - Result = Cast(r32, Max(Result, P1.E[3]));; + Result = Cast(r32, Max(Result, P1.E[3])); +; return Result; } @@ -93,6 +93,7 @@ operator+( v4 P1, v4 P2 ) Cast(r32, P1.E[1] + P2.E[1]), Cast(r32, P1.E[2] + P2.E[2]), Cast(r32, P1.E[3] + P2.E[3]), + }}; return Result; } @@ -105,6 +106,7 @@ operator+( v4 P1, r32 Scalar ) Cast(r32, P1.E[1] + Scalar), Cast(r32, P1.E[2] + Scalar), Cast(r32, P1.E[3] + Scalar), + }}; return Result; } @@ -117,6 +119,7 @@ operator+( r32 Scalar, v4 P1 ) Cast(r32, Scalar + P1.E[1]), Cast(r32, Scalar + P1.E[2]), Cast(r32, Scalar + P1.E[3]), + }}; return Result; } @@ -131,6 +134,7 @@ operator-( v4 P1, v4 P2 ) Cast(r32, P1.E[1] - P2.E[1]), Cast(r32, P1.E[2] - P2.E[2]), Cast(r32, P1.E[3] - P2.E[3]), + }}; return Result; } @@ -143,6 +147,7 @@ operator-( v4 P1, r32 Scalar ) Cast(r32, P1.E[1] - Scalar), Cast(r32, P1.E[2] - Scalar), Cast(r32, P1.E[3] - Scalar), + }}; return Result; } @@ -155,6 +160,7 @@ operator-( r32 Scalar, v4 P1 ) Cast(r32, Scalar - P1.E[1]), Cast(r32, Scalar - P1.E[2]), Cast(r32, Scalar - P1.E[3]), + }}; return Result; } @@ -169,6 +175,7 @@ operator*( v4 P1, v4 P2 ) Cast(r32, P1.E[1] * P2.E[1]), Cast(r32, P1.E[2] * P2.E[2]), Cast(r32, P1.E[3] * P2.E[3]), + }}; return Result; } @@ -181,6 +188,7 @@ operator*( v4 P1, r32 Scalar ) Cast(r32, P1.E[1] * Scalar), Cast(r32, P1.E[2] * Scalar), Cast(r32, P1.E[3] * Scalar), + }}; return Result; } @@ -193,6 +201,7 @@ operator*( r32 Scalar, v4 P1 ) Cast(r32, Scalar * P1.E[1]), Cast(r32, Scalar * P1.E[2]), Cast(r32, Scalar * P1.E[3]), + }}; return Result; } @@ -207,6 +216,7 @@ operator/( v4 P1, v4 P2 ) Cast(r32, P1.E[1] / P2.E[1]), Cast(r32, P1.E[2] / P2.E[2]), Cast(r32, P1.E[3] / P2.E[3]), + }}; return Result; } @@ -219,6 +229,7 @@ operator/( v4 P1, r32 Scalar ) Cast(r32, P1.E[1] / Scalar), Cast(r32, P1.E[2] / Scalar), Cast(r32, P1.E[3] / Scalar), + }}; return Result; } @@ -231,6 +242,7 @@ operator/( r32 Scalar, v4 P1 ) Cast(r32, Scalar / P1.E[1]), Cast(r32, Scalar / P1.E[2]), Cast(r32, Scalar / P1.E[3]), + }}; return Result; } @@ -244,6 +256,7 @@ operator+=( v4 &P1, v4 P2 ) P1.E[1] += P2.E[1]; P1.E[2] += P2.E[2]; P1.E[3] += P2.E[3]; + return P1; } @@ -254,6 +267,7 @@ operator+=( v4 &P1, r32 Scalar ) P1.E[1] += Scalar; P1.E[2] += Scalar; P1.E[3] += Scalar; + return P1; } @@ -265,6 +279,7 @@ operator-=( v4 &P1, v4 P2 ) P1.E[1] -= P2.E[1]; P1.E[2] -= P2.E[2]; P1.E[3] -= P2.E[3]; + return P1; } @@ -275,6 +290,7 @@ operator-=( v4 &P1, r32 Scalar ) P1.E[1] -= Scalar; P1.E[2] -= Scalar; P1.E[3] -= Scalar; + return P1; } @@ -286,6 +302,7 @@ operator*=( v4 &P1, v4 P2 ) P1.E[1] *= P2.E[1]; P1.E[2] *= P2.E[2]; P1.E[3] *= P2.E[3]; + return P1; } @@ -296,6 +313,7 @@ operator*=( v4 &P1, r32 Scalar ) P1.E[1] *= Scalar; P1.E[2] *= Scalar; P1.E[3] *= Scalar; + return P1; } @@ -307,6 +325,7 @@ operator/=( v4 &P1, v4 P2 ) P1.E[1] /= P2.E[1]; P1.E[2] /= P2.E[2]; P1.E[3] /= P2.E[3]; + return P1; } @@ -317,6 +336,7 @@ operator/=( v4 &P1, r32 Scalar ) P1.E[1] /= Scalar; P1.E[2] /= Scalar; P1.E[3] /= Scalar; + return P1; } diff --git a/generated/gen_wide_vector_operator_688856397_31875099.h b/generated/gen_wide_vector_operator_688856397_31875099.h index 93ad4bea7..37522d97c 100644 --- a/generated/gen_wide_vector_operator_688856397_31875099.h +++ b/generated/gen_wide_vector_operator_688856397_31875099.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/simd_avx2.h:194:0 - +// external/bonsai_stdlib/src/simd_avx2.h:148:0 link_inline f32_8x operator*(f32_8x A, f32_8x B) { diff --git a/generated/gen_wide_vector_operator_688856398_962878887.h b/generated/gen_wide_vector_operator_688856398_962878887.h index b6e318331..7e621c511 100644 --- a/generated/gen_wide_vector_operator_688856398_962878887.h +++ b/generated/gen_wide_vector_operator_688856398_962878887.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/simd_avx2.h:188:0 - +// external/bonsai_stdlib/src/simd_avx2.h:148:0 link_inline f32_8x operator+(f32_8x A, f32_8x B) { diff --git a/generated/gen_wide_vector_operator_688856400_677608083.h b/generated/gen_wide_vector_operator_688856400_677608083.h index e75e7d50e..5ea070739 100644 --- a/generated/gen_wide_vector_operator_688856400_677608083.h +++ b/generated/gen_wide_vector_operator_688856400_677608083.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/simd_avx2.h:191:0 - +// external/bonsai_stdlib/src/simd_avx2.h:148:0 link_inline f32_8x operator-(f32_8x A, f32_8x B) { diff --git a/generated/gen_wide_vector_operator_688856402_974542050.h b/generated/gen_wide_vector_operator_688856402_974542050.h index ff1ad0ff9..22e132328 100644 --- a/generated/gen_wide_vector_operator_688856402_974542050.h +++ b/generated/gen_wide_vector_operator_688856402_974542050.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/simd_avx2.h:197:0 - +// external/bonsai_stdlib/src/simd_avx2.h:148:0 link_inline f32_8x operator/(f32_8x A, f32_8x B) { diff --git a/generated/gen_write_primitive_from_u8_stream_803324607.h b/generated/gen_write_primitive_from_u8_stream_803324607.h index 7bd10db1b..61aa541e0 100644 --- a/generated/gen_write_primitive_from_u8_stream_803324607.h +++ b/generated/gen_write_primitive_from_u8_stream_803324607.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:664:0 - +// external/bonsai_stdlib/src/binary_parser.cpp:629:0 link_internal b32 Write(u8_stream *Dest, s8 *Src) { @@ -217,3 +216,4 @@ Write(u8_cursor_block_array *Dest, u64 Src) return Result; } + diff --git a/generated/generate_cursor_debug_profile_scope.h b/generated/generate_cursor_debug_profile_scope.h index 4f1c2e494..9038fc7ed 100644 --- a/generated/generate_cursor_debug_profile_scope.h +++ b/generated/generate_cursor_debug_profile_scope.h @@ -1,5 +1,4 @@ -// external/bonsai_debug/src/api.h:107:0 - +// external/bonsai_stdlib/src/poof_functions.h:1538:0 struct debug_profile_scope_cursor { debug_profile_scope *Start; @@ -14,11 +13,12 @@ link_internal debug_profile_scope_cursor DebugProfileScopeCursor(umm ElementCount, memory_arena* Memory) { debug_profile_scope *Start = (debug_profile_scope*)PushStruct(Memory, sizeof(debug_profile_scope)*ElementCount, 1, 0); - debug_profile_scope_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + debug_profile_scope_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/generate_cursor_functions_c_token_cursor.h b/generated/generate_cursor_functions_c_token_cursor.h index f735cfff8..c19785198 100644 --- a/generated/generate_cursor_functions_c_token_cursor.h +++ b/generated/generate_cursor_functions_c_token_cursor.h @@ -1,15 +1,15 @@ -// external/bonsai_stdlib/src/c_token.h:390:0 - +// external/bonsai_stdlib/src/poof_functions.h:1560:0 link_internal c_token_cursor CTokenCursor(umm ElementCount, memory_arena* Memory) { c_token *Start = (c_token*)PushStruct(Memory, sizeof(c_token)*ElementCount, 1, 0); - c_token_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + c_token_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/generate_cursor_functions_u64.h b/generated/generate_cursor_functions_u64.h index 91cdc555c..6a3a281fd 100644 --- a/generated/generate_cursor_functions_u64.h +++ b/generated/generate_cursor_functions_u64.h @@ -1,15 +1,15 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:26:0 - +// external/bonsai_stdlib/src/poof_functions.h:1560:0 link_internal u64_cursor U64Cursor(umm ElementCount, memory_arena* Memory) { u64 *Start = (u64*)PushStruct(Memory, sizeof(u64)*ElementCount, 1, 0); - u64_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + u64_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index 47483ca0b..941ac1b88 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,5 +1,4 @@ -// src/engine/world.h:82:0 - +// external/bonsai_stdlib/src/poof_functions.h:1538:0 struct octree_node_ptr_cursor { octree_node_ptr *Start; @@ -14,11 +13,12 @@ link_internal octree_node_ptr_cursor OctreeNodePtrCursor(umm ElementCount, memory_arena* Memory) { octree_node_ptr *Start = (octree_node_ptr*)PushStruct(Memory, sizeof(octree_node_ptr)*ElementCount, 1, 0); - octree_node_ptr_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + octree_node_ptr_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/generate_cursor_parser.h b/generated/generate_cursor_parser.h index 26f447192..688b9ebba 100644 --- a/generated/generate_cursor_parser.h +++ b/generated/generate_cursor_parser.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/c_parser.h:93:0 - +// external/bonsai_stdlib/src/poof_functions.h:1538:0 struct parser_cursor { parser *Start; @@ -14,11 +13,12 @@ link_internal parser_cursor ParserCursor(umm ElementCount, memory_arena* Memory) { parser *Start = (parser*)PushStruct(Memory, sizeof(parser)*ElementCount, 1, 0); - parser_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + parser_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/generate_cursor_struct_u64.h b/generated/generate_cursor_struct_u64.h index 1a9db2d41..0bede233f 100644 --- a/generated/generate_cursor_struct_u64.h +++ b/generated/generate_cursor_struct_u64.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.h:1:0 - +// external/bonsai_stdlib/src/poof_functions.h:1545:0 struct u64_cursor { u64 *Start; diff --git a/generated/generate_cursor_texture.h b/generated/generate_cursor_texture.h index 3e2a31636..9fc439e35 100644 --- a/generated/generate_cursor_texture.h +++ b/generated/generate_cursor_texture.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/texture_cursor.cpp:10:0 - +// external/bonsai_stdlib/src/poof_functions.h:1538:0 struct texture_cursor { texture *Start; @@ -14,11 +13,12 @@ link_internal texture_cursor TextureCursor(umm ElementCount, memory_arena* Memory) { texture *Start = (texture*)PushStruct(Memory, sizeof(texture)*ElementCount, 1, 0); - texture_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + texture_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/generate_cursor_u8.h b/generated/generate_cursor_u8.h index 0cd2080e9..bbfaaaa60 100644 --- a/generated/generate_cursor_u8.h +++ b/generated/generate_cursor_u8.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ansi_stream.h:3:0 - +// external/bonsai_stdlib/src/poof_functions.h:1538:0 struct u8_cursor { u8 *Start; @@ -14,11 +13,12 @@ link_internal u8_cursor U8Cursor(umm ElementCount, memory_arena* Memory) { u8 *Start = (u8*)PushStruct(Memory, sizeof(u8)*ElementCount, 1, 0); - u8_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + u8_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/generate_cursor_v3.h b/generated/generate_cursor_v3.h index 49995e62c..76da62c48 100644 --- a/generated/generate_cursor_v3.h +++ b/generated/generate_cursor_v3.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:40:0 - +// external/bonsai_stdlib/src/poof_functions.h:1538:0 struct v3_cursor { v3 *Start; @@ -14,11 +13,12 @@ link_internal v3_cursor V3Cursor(umm ElementCount, memory_arena* Memory) { v3 *Start = (v3*)PushStruct(Memory, sizeof(v3)*ElementCount, 1, 0); - v3_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + v3_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/generate_cursor_voxel_stack_element.h b/generated/generate_cursor_voxel_stack_element.h index ff83a931f..dfb885823 100644 --- a/generated/generate_cursor_voxel_stack_element.h +++ b/generated/generate_cursor_voxel_stack_element.h @@ -1,5 +1,4 @@ -// src/engine/world_update.h:21:0 - +// external/bonsai_stdlib/src/poof_functions.h:1538:0 struct voxel_stack_element_cursor { voxel_stack_element *Start; @@ -14,11 +13,12 @@ link_internal voxel_stack_element_cursor VoxelStackElementCursor(umm ElementCount, memory_arena* Memory) { voxel_stack_element *Start = (voxel_stack_element*)PushStruct(Memory, sizeof(voxel_stack_element)*ElementCount, 1, 0); - voxel_stack_element_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + voxel_stack_element_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index 951975919..c0c7dc3a4 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,5 +1,4 @@ -// src/engine/world.h:73:0 - +// external/bonsai_stdlib/src/poof_functions.h:1441:0 struct octree_node_ptr_stack { octree_node_ptr *Start; diff --git a/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h b/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h index 96a4cfbd8..1d5a913fe 100644 --- a/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h +++ b/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h @@ -1,5 +1,4 @@ -// src/engine/voxel_synthesis.h:315:0 - +// external/bonsai_stdlib/src/poof_functions.h:1441:0 struct voxel_synthesis_change_propagation_info_stack { voxel_synthesis_change_propagation_info *Start; diff --git a/generated/generate_stream_c_token_buffer.h b/generated/generate_stream_c_token_buffer.h index 520ed3c62..e76e7a562 100644 --- a/generated/generate_stream_c_token_buffer.h +++ b/generated/generate_stream_c_token_buffer.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/c_token.cpp:8:0 - +// external/bonsai_stdlib/src/poof_functions.h:2034:0 struct c_token_buffer_stream_chunk { c_token_buffer Element; diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 03ab78ed1..2ab67ab05 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.h:496:0 - +// external/bonsai_stdlib/src/poof_functions.h:2004:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) { diff --git a/generated/generate_stream_compact_u32.h b/generated/generate_stream_compact_u32.h index ebbfc97a1..6fbae1455 100644 --- a/generated/generate_stream_compact_u32.h +++ b/generated/generate_stream_compact_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:18:0 - +// external/bonsai_stdlib/src/poof_functions.h:2004:0 link_internal u32_buffer Compact(u32_stream *Stream, memory_arena *PermMemory) { diff --git a/generated/generate_stream_compact_u64.h b/generated/generate_stream_compact_u64.h index e46895c8a..6ecf4f520 100644 --- a/generated/generate_stream_compact_u64.h +++ b/generated/generate_stream_compact_u64.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:32:0 - +// external/bonsai_stdlib/src/poof_functions.h:2004:0 link_internal u64_buffer Compact(u64_stream *Stream, memory_arena *PermMemory) { diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index 7395c336e..f93516e52 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.cpp:3049:0 - +// external/bonsai_stdlib/src/poof_functions.h:2004:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) { diff --git a/generated/generate_stream_parser.h b/generated/generate_stream_parser.h index 1f5c7e075..1d25ee996 100644 --- a/generated/generate_stream_parser.h +++ b/generated/generate_stream_parser.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/c_parser.h:96:0 - +// external/bonsai_stdlib/src/poof_functions.h:2034:0 struct parser_stream_chunk { parser Element; diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index c655feffa..50bfaee9d 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.h:493:0 - +// external/bonsai_stdlib/src/poof_functions.h:2034:0 struct standing_spot_stream_chunk { standing_spot Element; diff --git a/generated/generate_stream_tagged_counted_string_stream.h b/generated/generate_stream_tagged_counted_string_stream.h index 53fcd1cbc..731cb878b 100644 --- a/generated/generate_stream_tagged_counted_string_stream.h +++ b/generated/generate_stream_tagged_counted_string_stream.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.h:131:0 - +// external/bonsai_stdlib/src/poof_functions.h:2034:0 struct tagged_counted_string_stream_stream_chunk { tagged_counted_string_stream Element; diff --git a/generated/generate_stream_tuple_cs_cs.h b/generated/generate_stream_tuple_cs_cs.h index 6c9e7418c..2440736a1 100644 --- a/generated/generate_stream_tuple_cs_cs.h +++ b/generated/generate_stream_tuple_cs_cs.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:32:0 - +// external/bonsai_stdlib/src/poof_functions.h:2034:0 struct tuple_cs_cs_stream_chunk { tuple_cs_cs Element; diff --git a/generated/generate_stream_u64.h b/generated/generate_stream_u64.h index 3ec7e9405..2723f306e 100644 --- a/generated/generate_stream_u64.h +++ b/generated/generate_stream_u64.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:29:0 - +// external/bonsai_stdlib/src/poof_functions.h:2034:0 struct u64_stream_chunk { u64 Element; diff --git a/generated/generate_stream_v3i.h b/generated/generate_stream_v3i.h index 3a892ecb0..1b8bca667 100644 --- a/generated/generate_stream_v3i.h +++ b/generated/generate_stream_v3i.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.cpp:8:0 - +// external/bonsai_stdlib/src/poof_functions.h:2034:0 struct v3i_stream_chunk { v3i Element; diff --git a/generated/generate_string_table_Chunk_ID.h b/generated/generate_string_table_Chunk_ID.h index e459fc7c2..f5018f6ed 100644 --- a/generated/generate_string_table_Chunk_ID.h +++ b/generated/generate_string_table_Chunk_ID.h @@ -1,9 +1,42 @@ -// src/engine/loaders/vox.cpp:27:0 +// external/bonsai_stdlib/src/poof_functions.h:1741:0 +link_internal b32 +IsValid(Chunk_ID Value) +{ + b32 Result = False; + switch (Value) + { + case ID_NONE: + case ID_VOX: + case ID_MAIN: + case ID_PACK: + case ID_SIZE: + case ID_XYZI: + case ID_RGBA: + case ID_nTRN: + case ID_nGRP: + case ID_nSHP: + case ID_MATL: + case ID_LAYR: + case ID_rOBJ: + case ID_rCAM: + case ID_NOTE: + case ID_IMAP: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(Chunk_ID Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case ID_NONE: { Result = CSz("NONE"); } break; @@ -23,15 +56,18 @@ ToStringPrefixless(Chunk_ID Type) case ID_NOTE: { Result = CSz("NOTE"); } break; case ID_IMAP: { Result = CSz("IMAP"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(Chunk_ID Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -52,9 +88,10 @@ ToString(Chunk_ID Type) case ID_NOTE: { Result = CSz("ID_NOTE"); } break; case ID_IMAP: { Result = CSz("ID_IMAP"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } diff --git a/generated/generate_string_table_asset_load_state.h b/generated/generate_string_table_asset_load_state.h index 95e8c4a01..7a297cd9d 100644 --- a/generated/generate_string_table_asset_load_state.h +++ b/generated/generate_string_table_asset_load_state.h @@ -1,9 +1,31 @@ -// src/engine/asset.h:141:0 +// external/bonsai_stdlib/src/poof_functions.h:1741:0 +link_internal b32 +IsValid(asset_load_state Value) +{ + b32 Result = False; + switch (Value) + { + case AssetLoadState_Unloaded: + case AssetLoadState_Allocated: + case AssetLoadState_Queued: + case AssetLoadState_Loaded: + case AssetLoadState_Error: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(asset_load_state Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case AssetLoadState_Unloaded: { Result = CSz("Unloaded"); } break; @@ -12,15 +34,18 @@ ToStringPrefixless(asset_load_state Type) case AssetLoadState_Loaded: { Result = CSz("Loaded"); } break; case AssetLoadState_Error: { Result = CSz("Error"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(asset_load_state Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -30,9 +55,10 @@ ToString(asset_load_state Type) case AssetLoadState_Loaded: { Result = CSz("AssetLoadState_Loaded"); } break; case AssetLoadState_Error: { Result = CSz("AssetLoadState_Error"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } diff --git a/generated/generate_string_table_c_token_type.h b/generated/generate_string_table_c_token_type.h index b996a8f4c..2fe65a546 100644 --- a/generated/generate_string_table_c_token_type.h +++ b/generated/generate_string_table_c_token_type.h @@ -1,9 +1,199 @@ -// external/bonsai_stdlib/src/c_token.h:225:0 +// external/bonsai_stdlib/src/poof_functions.h:1741:0 +link_internal b32 +IsValid(c_token_type Value) +{ + b32 Result = False; + switch (Value) + { + case CTokenType_Unknown: + case CT_ControlChar_Start_of_Heading: + case CT_ControlChar_Start_of_Text: + case CT_ControlChar_End_of_Text: + case CT_ControlChar_End_of_Transmission: + case CT_ControlChar_Enquiry: + case CT_ControlChar_Acknowledgement: + case CT_ControlChar_Bell: + case CT_ControlChar_Backspace: + case CT_ControlChar_Vertical_Tab: + case CT_ControlChar_Form_Feed: + case CT_ControlChar_Shift_Out: + case CT_ControlChar_Shift_In: + case CT_ControlChar_Data_Link_Escape: + case CT_ControlChar_Device_Control_1: + case CT_ControlChar_Device_Control_2: + case CT_ControlChar_Device_Control_3: + case CT_ControlChar_Device_Control_4: + case CT_ControlChar_Negative_Acknowledgement: + case CT_ControlChar_Synchronous_Idle: + case CT_ControlChar_End_of_Transmission_Block: + case CT_ControlChar_Cancel: + case CT_ControlChar_End_of_Medium: + case CT_ControlChar_Substitute: + case CT_ControlChar_Escape: + case CT_ControlChar_File_Separator: + case CT_ControlChar_Group_Separator: + case CT_ControlChar_Record_Separator: + case CT_ControlChar_Unit_Separator: + case CT_ControlChar_Delete: + case CTokenType_OpenBracket: + case CTokenType_CloseBracket: + case CTokenType_OpenBrace: + case CTokenType_CloseBrace: + case CTokenType_OpenParen: + case CTokenType_CloseParen: + case CTokenType_Dot: + case CTokenType_Comma: + case CTokenType_Semicolon: + case CTokenType_Colon: + case CTokenType_Hash: + case CTokenType_At: + case CTokenType_Dollar: + case CTokenType_Space: + case CTokenType_Tab: + case CTokenType_Star: + case CTokenType_Ampersand: + case CTokenType_SingleQuote: + case CTokenType_DoubleQuote: + case CTokenType_Equals: + case CTokenType_LT: + case CTokenType_GT: + case CTokenType_Plus: + case CTokenType_Minus: + case CTokenType_Percent: + case CTokenType_Bang: + case CTokenType_Hat: + case CTokenType_Question: + case CTokenType_FSlash: + case CTokenType_BSlash: + case CTokenType_Tilde: + case CTokenType_Backtick: + case CTokenType_Pipe: + case CTokenType_Newline: + case CTokenType_CarrigeReturn: + case CTokenType_EOF: + case CTokenType_CommentSingleLine: + case CTokenType_CommentMultiLine: + case CTokenType_EscapedNewline: + case CTokenType_Identifier: + case CTokenType_StringLiteral: + case CTokenType_CharLiteral: + case CTokenType_IntLiteral: + case CTokenType_DoubleLiteral: + case CTokenType_FloatLiteral: + case CTokenType_Poof: + case CT_Keyword_Noreturn: + case CT_Keyword_Override: + case CT_Keyword_Virtual: + case CT_Keyword_Noexcept: + case CT_Keyword_Explicit: + case CT_Keyword_Constexpr: + case CT_Keyword_Namespace: + case CT_Keyword_Class: + case CTokenType_Struct: + case CTokenType_Enum: + case CTokenType_Union: + case CTokenType_Typedef: + case CTokenType_Using: + case CTokenType_ThreadLocal: + case CTokenType_Const: + case CTokenType_Static: + case CTokenType_Volatile: + case CTokenType_Long: + case CTokenType_Unsigned: + case CTokenType_Signed: + case CTokenType_Bool: + case CTokenType_Auto: + case CTokenType_Void: + case CTokenType_Double: + case CTokenType_Float: + case CTokenType_Char: + case CTokenType_Int: + case CTokenType_Short: + case CTokenType_Inline: + case CTokenType_TemplateKeyword: + case CTokenType_OperatorKeyword: + case CT_Keyword_Public: + case CT_Keyword_Private: + case CT_Keyword_Protected: + case CT_KeywordPragma: + case CT_KeywordAttribute: + case CT_StaticAssert: + case CTokenType_Extern: + case CTokenType_Asm: + case CTokenType_Goto: + case CTokenType_Ellipsis: + case CTokenType_If: + case CTokenType_Else: + case CTokenType_Break: + case CTokenType_Switch: + case CTokenType_Case: + case CT_Keyword_Delete: + case CTokenType_Default: + case CTokenType_For: + case CTokenType_While: + case CTokenType_Continue: + case CTokenType_Return: + case CTokenType_LeftShift: + case CTokenType_RightShift: + case CTokenType_LessEqual: + case CTokenType_GreaterEqual: + case CTokenType_AreEqual: + case CTokenType_NotEqual: + case CTokenType_PlusEquals: + case CTokenType_MinusEquals: + case CTokenType_TimesEquals: + case CTokenType_DivEquals: + case CTokenType_ModEquals: + case CTokenType_AndEquals: + case CTokenType_OrEquals: + case CTokenType_XorEquals: + case CTokenType_Increment: + case CTokenType_Decrement: + case CTokenType_LogicalAnd: + case CTokenType_LogicalOr: + case CTokenType_Arrow: + case CT_ScopeResolutionOperator: + case CT_NameQualifier: + case CT_MacroLiteral: + case CT_MacroLiteral_SelfRefExpansion: + case CT_PreprocessorHasInclude: + case CT_PreprocessorHasIncludeNext: + case CT_PreprocessorPaste: + case CT_PreprocessorPaste_InvalidToken: + case CT_PreprocessorInclude: + case CT_PreprocessorIncludeNext: + case CT_PreprocessorIf: + case CT_PreprocessorElse: + case CT_PreprocessorElif: + case CT_PreprocessorEndif: + case CT_PreprocessorIfDefined: + case CT_PreprocessorIfNotDefined: + case CT_PreprocessorDefine: + case CT_PreprocessorUndef: + case CT_PreprocessorPragma: + case CT_PreprocessorError: + case CT_PreprocessorWarning: + case CT_Preprocessor_VA_ARGS_: + case CT_Preprocessor_Nuked: + case CT_InsertedCode: + case CT_PoofInsertedCode: + case CT_PoofModifiedToken: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(c_token_type Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case CTokenType_Unknown: { Result = CSz("Unknown"); } break; @@ -180,15 +370,18 @@ ToStringPrefixless(c_token_type Type) case CT_PoofInsertedCode: { Result = CSz("PoofInsertedCode"); } break; case CT_PoofModifiedToken: { Result = CSz("PoofModifiedToken"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(c_token_type Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -366,9 +559,10 @@ ToString(c_token_type Type) case CT_PoofInsertedCode: { Result = CSz("CT_PoofInsertedCode"); } break; case CT_PoofModifiedToken: { Result = CSz("CT_PoofModifiedToken"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } diff --git a/generated/generate_string_table_entity_behavior_flags.h b/generated/generate_string_table_entity_behavior_flags.h index 61b2ec88b..7d222920f 100644 --- a/generated/generate_string_table_entity_behavior_flags.h +++ b/generated/generate_string_table_entity_behavior_flags.h @@ -1,9 +1,35 @@ -// src/engine/entity.h:39:0 +// external/bonsai_stdlib/src/poof_functions.h:1741:0 +link_internal b32 +IsValid(entity_behavior_flags Value) +{ + b32 Result = False; + switch (Value) + { + case EntityBehaviorFlags_None: + case EntityBehaviorFlags_Gravity: + case EntityBehaviorFlags_WorldCollision: + case EntityBehaviorFlags_EntityCollision: + case EntityBehaviorFlags_UnspawnOnParticleSystemTerminate: + case EntityBehaviorFlags_FitCollisionVolumeToModel: + case EntityBehaviorFlags_DefatulCameraGhostBehavior: + case EntityBehaviorFlags_WorldCenter: + case EntityBehaviorFlags_Default: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(entity_behavior_flags Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case EntityBehaviorFlags_None: { Result = CSz("None"); } break; @@ -16,6 +42,7 @@ ToStringPrefixless(entity_behavior_flags Type) case EntityBehaviorFlags_WorldCenter: { Result = CSz("WorldCenter"); } break; case EntityBehaviorFlags_Default: { Result = CSz("Default"); } break; + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: @@ -47,13 +74,15 @@ ToStringPrefixless(entity_behavior_flags Type) } break; } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(entity_behavior_flags Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -67,6 +96,7 @@ ToString(entity_behavior_flags Type) case EntityBehaviorFlags_WorldCenter: { Result = CSz("EntityBehaviorFlags_WorldCenter"); } break; case EntityBehaviorFlags_Default: { Result = CSz("EntityBehaviorFlags_Default"); } break; + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: @@ -85,7 +115,7 @@ ToString(entity_behavior_flags Type) } break; } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } diff --git a/generated/generate_string_table_entity_state.h b/generated/generate_string_table_entity_state.h index 1fca516bb..2f386ee4d 100644 --- a/generated/generate_string_table_entity_state.h +++ b/generated/generate_string_table_entity_state.h @@ -1,9 +1,30 @@ -// src/engine/entity.h:36:0 +// external/bonsai_stdlib/src/poof_functions.h:1741:0 +link_internal b32 +IsValid(entity_state Value) +{ + b32 Result = False; + switch (Value) + { + case EntityState_Free: + case EntityState_Spawned: + case EntityState_Destroyed: + case EntityState_Reserved: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(entity_state Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case EntityState_Free: { Result = CSz("Free"); } break; @@ -11,15 +32,18 @@ ToStringPrefixless(entity_state Type) case EntityState_Destroyed: { Result = CSz("Destroyed"); } break; case EntityState_Reserved: { Result = CSz("Reserved"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(entity_state Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -28,9 +52,10 @@ ToString(entity_state Type) case EntityState_Destroyed: { Result = CSz("EntityState_Destroyed"); } break; case EntityState_Reserved: { Result = CSz("EntityState_Reserved"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } diff --git a/generated/generate_string_table_parse_error_code.h b/generated/generate_string_table_parse_error_code.h index 2fa8062ff..30cd89c74 100644 --- a/generated/generate_string_table_parse_error_code.h +++ b/generated/generate_string_table_parse_error_code.h @@ -1,9 +1,52 @@ -// external/bonsai_stdlib/src/c_parser.h:62:0 +// external/bonsai_stdlib/src/poof_functions.h:1741:0 +link_internal b32 +IsValid(parse_error_code Value) +{ + b32 Result = False; + switch (Value) + { + case ParseErrorCode_None: + case ParseErrorCode_ExpectedSemicolonOrEquals: + case ParseErrorCode_StreamEndedUnexpectedly: + case ParseErrorCode_RequireTokenFailed: + case ParseErrorCode_InvalidTokenGenerated: + case ParseErrorCode_MalformedType: + case ParseErrorCode_PoofUserlandError: + case ParseErrorCode_PoofTypeError: + case ParseErrorCode_DUnionParse: + case ParseErrorCode_UndefinedDatatype: + case ParseErrorCode_InvalidKeyword: + case ParseErrorCode_InvalidDirective: + case ParseErrorCode_InvalidOperator: + case ParseErrorCode_InvalidMetaTransformOp: + case ParseErrorCode_InvalidArgument: + case ParseErrorCode_InvalidArgumentType: + case ParseErrorCode_InvalidArgumentCount: + case ParseErrorCode_InvalidName: + case ParseErrorCode_InvalidTag: + case ParseErrorCode_InvalidFunction: + case ParseErrorCode_SyntaxError: + case ParseErrorCode_NotImplemented: + case ParseErrorCode_InputStreamNull: + case ParseErrorCode_InternalCompilerError: + case ParseErrorCode_StackOverflow: + case ParseErrorCode_Unknown: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(parse_error_code Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case ParseErrorCode_None: { Result = CSz("None"); } break; @@ -33,15 +76,18 @@ ToStringPrefixless(parse_error_code Type) case ParseErrorCode_StackOverflow: { Result = CSz("StackOverflow"); } break; case ParseErrorCode_Unknown: { Result = CSz("Unknown"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(parse_error_code Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -72,9 +118,10 @@ ToString(parse_error_code Type) case ParseErrorCode_StackOverflow: { Result = CSz("ParseErrorCode_StackOverflow"); } break; case ParseErrorCode_Unknown: { Result = CSz("ParseErrorCode_Unknown"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } diff --git a/generated/generate_string_table_text_encoding.h b/generated/generate_string_table_text_encoding.h index 2cd7065e8..3f7e06352 100644 --- a/generated/generate_string_table_text_encoding.h +++ b/generated/generate_string_table_text_encoding.h @@ -1,9 +1,38 @@ -// external/bonsai_stdlib/src/ansi_stream.h:32:0 +// external/bonsai_stdlib/src/poof_functions.h:1741:0 +link_internal b32 +IsValid(text_encoding Value) +{ + b32 Result = False; + switch (Value) + { + case TextEncoding_ASCII: + case TextEncoding_UTF8: + case TextEncoding_UTF16LE: + case TextEncoding_UTF16BE: + case TextEncoding_UTF32LE: + case TextEncoding_UTF32BE: + case TextEncoding_UTF7: + case TextEncoding_UTF1: + case TextEncoding_EBCDIC: + case TextEncoding_CSCU: + case TextEncoding_BOCU: + case TextEncoding_GB18030: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(text_encoding Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case TextEncoding_ASCII: { Result = CSz("ASCII"); } break; @@ -19,15 +48,18 @@ ToStringPrefixless(text_encoding Type) case TextEncoding_BOCU: { Result = CSz("BOCU"); } break; case TextEncoding_GB18030: { Result = CSz("GB18030"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(text_encoding Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -44,9 +76,10 @@ ToString(text_encoding Type) case TextEncoding_BOCU: { Result = CSz("TextEncoding_BOCU"); } break; case TextEncoding_GB18030: { Result = CSz("TextEncoding_GB18030"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } diff --git a/generated/generate_string_table_token_cursor_source.h b/generated/generate_string_table_token_cursor_source.h index 7e7fe2bce..ba97f10d4 100644 --- a/generated/generate_string_table_token_cursor_source.h +++ b/generated/generate_string_table_token_cursor_source.h @@ -1,9 +1,37 @@ -// external/bonsai_stdlib/src/c_token.h:256:0 +// external/bonsai_stdlib/src/poof_functions.h:1741:0 +link_internal b32 +IsValid(token_cursor_source Value) +{ + b32 Result = False; + switch (Value) + { + case TokenCursorSource_Unknown: + case TokenCursorSource_RootFile: + case TokenCursorSource_Include: + case TokenCursorSource_MacroExpansion: + case TokenCursorSource_MetaprogrammingExpansion: + case TokenCursorSource_PoofSymbolIteration: + case TokenCursorSource_PasteOperator: + case TokenCursorSource_CommandLineOption: + case TokenCursorSource_BodyText: + case TokenCursorSource_IntermediateRepresentaton: + case TokenCursorSource_Count: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(token_cursor_source Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case TokenCursorSource_Unknown: { Result = CSz("Unknown"); } break; @@ -18,15 +46,18 @@ ToStringPrefixless(token_cursor_source Type) case TokenCursorSource_IntermediateRepresentaton: { Result = CSz("IntermediateRepresentaton"); } break; case TokenCursorSource_Count: { Result = CSz("Count"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(token_cursor_source Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -42,9 +73,10 @@ ToString(token_cursor_source Type) case TokenCursorSource_IntermediateRepresentaton: { Result = CSz("TokenCursorSource_IntermediateRepresentaton"); } break; case TokenCursorSource_Count: { Result = CSz("TokenCursorSource_Count"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } diff --git a/generated/generate_string_table_world_chunk_mesh_bitfield.h b/generated/generate_string_table_world_chunk_mesh_bitfield.h index 99994fa71..282d0ece8 100644 --- a/generated/generate_string_table_world_chunk_mesh_bitfield.h +++ b/generated/generate_string_table_world_chunk_mesh_bitfield.h @@ -1,9 +1,33 @@ -// src/engine/world_chunk.h:216:0 +// external/bonsai_stdlib/src/poof_functions.h:1741:0 +link_internal b32 +IsValid(world_chunk_mesh_bitfield Value) +{ + b32 Result = False; + switch (Value) + { + case MeshBit_None: + case MeshBit_Lod0: + case MeshBit_Lod1: + case MeshBit_Lod2: + case MeshBit_Lod3: + case MeshBit_Lod4: + case MeshBit_Count: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(world_chunk_mesh_bitfield Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case MeshBit_None: { Result = CSz("None"); } break; @@ -14,15 +38,18 @@ ToStringPrefixless(world_chunk_mesh_bitfield Type) case MeshBit_Lod4: { Result = CSz("Lod4"); } break; case MeshBit_Count: { Result = CSz("Count"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(world_chunk_mesh_bitfield Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -34,9 +61,10 @@ ToString(world_chunk_mesh_bitfield Type) case MeshBit_Lod4: { Result = CSz("MeshBit_Lod4"); } break; case MeshBit_Count: { Result = CSz("MeshBit_Count"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } diff --git a/generated/generate_string_table_world_chunk_mesh_index.h b/generated/generate_string_table_world_chunk_mesh_index.h index ab001223e..f67e6cf8b 100644 --- a/generated/generate_string_table_world_chunk_mesh_index.h +++ b/generated/generate_string_table_world_chunk_mesh_index.h @@ -1,9 +1,32 @@ -// src/engine/world_chunk.h:219:0 +// external/bonsai_stdlib/src/poof_functions.h:1741:0 +link_internal b32 +IsValid(world_chunk_mesh_index Value) +{ + b32 Result = False; + switch (Value) + { + case MeshIndex_Lod0: + case MeshIndex_Lod1: + case MeshIndex_Lod2: + case MeshIndex_Lod3: + case MeshIndex_Lod4: + case MeshIndex_Count: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(world_chunk_mesh_index Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case MeshIndex_Lod0: { Result = CSz("Lod0"); } break; @@ -13,15 +36,18 @@ ToStringPrefixless(world_chunk_mesh_index Type) case MeshIndex_Lod4: { Result = CSz("Lod4"); } break; case MeshIndex_Count: { Result = CSz("Count"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(world_chunk_mesh_index Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -32,9 +58,10 @@ ToString(world_chunk_mesh_index Type) case MeshIndex_Lod4: { Result = CSz("MeshIndex_Lod4"); } break; case MeshIndex_Count: { Result = CSz("MeshIndex_Count"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } diff --git a/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h b/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h index 21e3aad4e..99aecc9af 100644 --- a/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h +++ b/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h @@ -1,5 +1,4 @@ -// src/engine/render.cpp:1031:0 - +// src/engine/render.cpp:933:0 link_internal void CopyBufferIntoBuffer( untextured_3d_geometry_buffer *Src, untextured_3d_geometry_buffer *Dest) diff --git a/generated/hashtable_bonsai_type_info.h b/generated/hashtable_bonsai_type_info.h index 0298863d3..38b10165d 100644 --- a/generated/hashtable_bonsai_type_info.h +++ b/generated/hashtable_bonsai_type_info.h @@ -1,5 +1,4 @@ -// src/engine/bonsai_type_info.h:37:0 - +// external/bonsai_stdlib/src/poof_functions.h:775:0 struct bonsai_type_info_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_counted_string.h b/generated/hashtable_counted_string.h index c7c661622..c099b7edc 100644 --- a/generated/hashtable_counted_string.h +++ b/generated/hashtable_counted_string.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:26:0 - +// external/bonsai_stdlib/src/poof_functions.h:775:0 struct counted_string_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_get_bonsai_type_info_902_689333910.h b/generated/hashtable_get_bonsai_type_info_902_689333910.h index 6ae218e72..78ac71cbd 100644 --- a/generated/hashtable_get_bonsai_type_info_902_689333910.h +++ b/generated/hashtable_get_bonsai_type_info_902_689333910.h @@ -1,5 +1,4 @@ -// src/engine/bonsai_type_info.h:46:0 - +// external/bonsai_stdlib/src/poof_functions.h:976:0 bonsai_type_info_linked_list_node* GetBucketByName( bonsai_type_info_hashtable *Table, cs Query ) { diff --git a/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h b/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h index 376f68328..6d394f337 100644 --- a/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h +++ b/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:25:0 - +// external/bonsai_stdlib/src/poof_functions.h:1051:0 maybe_ui_toggle_ptr GetPtrById( ui_toggle_hashtable *Table, ui_id Query ) { diff --git a/generated/hashtable_get_ptr_window_layout_705671517_599498827.h b/generated/hashtable_get_ptr_window_layout_705671517_599498827.h index a7637f0f6..848de4554 100644 --- a/generated/hashtable_get_ptr_window_layout_705671517_599498827.h +++ b/generated/hashtable_get_ptr_window_layout_705671517_599498827.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:34:0 - +// external/bonsai_stdlib/src/poof_functions.h:1051:0 maybe_window_layout_ptr GetPtrByHashtableKey( window_layout_hashtable *Table, ui_id Query ) { diff --git a/generated/hashtable_get_u32_hashtable_wrapper_688719149_688856424.h b/generated/hashtable_get_u32_hashtable_wrapper_688719149_688856424.h index 38fb6256e..e65302e4c 100644 --- a/generated/hashtable_get_u32_hashtable_wrapper_688719149_688856424.h +++ b/generated/hashtable_get_u32_hashtable_wrapper_688719149_688856424.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/primitive_containers.cpp:8:0 - +// external/bonsai_stdlib/src/poof_functions.h:976:0 u32_linked_list_node* GetBucketByValue( u32_hashtable *Table, u32 Query ) { diff --git a/generated/hashtable_get_ui_toggle_31501_688856534.h b/generated/hashtable_get_ui_toggle_31501_688856534.h index bc5a2eac1..8a8fdcf93 100644 --- a/generated/hashtable_get_ui_toggle_31501_688856534.h +++ b/generated/hashtable_get_ui_toggle_31501_688856534.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:22:0 - +// external/bonsai_stdlib/src/poof_functions.h:976:0 ui_toggle_linked_list_node* GetBucketById( ui_toggle_hashtable *Table, ui_id Query ) { diff --git a/generated/hashtable_get_window_layout_705671517_599498827.h b/generated/hashtable_get_window_layout_705671517_599498827.h index c537f2c16..6762e73b9 100644 --- a/generated/hashtable_get_window_layout_705671517_599498827.h +++ b/generated/hashtable_get_window_layout_705671517_599498827.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:32:0 - +// external/bonsai_stdlib/src/poof_functions.h:976:0 window_layout_linked_list_node* GetBucketByHashtableKey( window_layout_hashtable *Table, ui_id Query ) { diff --git a/generated/hashtable_impl_u32.h b/generated/hashtable_impl_u32.h index 4ebce5e0b..eb8f5b127 100644 --- a/generated/hashtable_impl_u32.h +++ b/generated/hashtable_impl_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/primitive_containers.cpp:5:0 - +// external/bonsai_stdlib/src/poof_functions.h:797:0 link_internal b32 AreEqual(u32_linked_list_node *Node1, u32_linked_list_node *Node2 ); link_internal b32 AreEqual(u32 *Element1, u32 *Element2 ); diff --git a/generated/hashtable_impl_ui_toggle.h b/generated/hashtable_impl_ui_toggle.h index c48074759..07e0b23e8 100644 --- a/generated/hashtable_impl_ui_toggle.h +++ b/generated/hashtable_impl_ui_toggle.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:19:0 - +// external/bonsai_stdlib/src/poof_functions.h:797:0 link_internal b32 AreEqual(ui_toggle_linked_list_node *Node1, ui_toggle_linked_list_node *Node2 ); link_internal b32 AreEqual(ui_toggle *Element1, ui_toggle *Element2 ); diff --git a/generated/hashtable_impl_window_layout.h b/generated/hashtable_impl_window_layout.h index f0d9c1fb7..3d072234d 100644 --- a/generated/hashtable_impl_window_layout.h +++ b/generated/hashtable_impl_window_layout.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:29:0 - +// external/bonsai_stdlib/src/poof_functions.h:797:0 link_internal b32 AreEqual(window_layout_linked_list_node *Node1, window_layout_linked_list_node *Node2 ); link_internal b32 AreEqual(window_layout *Element1, window_layout *Element2 ); diff --git a/generated/hashtable_impl_xml_tag.h b/generated/hashtable_impl_xml_tag.h index f02eb17c9..5d4eb6458 100644 --- a/generated/hashtable_impl_xml_tag.h +++ b/generated/hashtable_impl_xml_tag.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/xml.cpp:10:0 - +// external/bonsai_stdlib/src/poof_functions.h:797:0 link_internal b32 AreEqual(xml_tag_linked_list_node *Node1, xml_tag_linked_list_node *Node2 ); link_internal b32 AreEqual(xml_tag *Element1, xml_tag *Element2 ); diff --git a/generated/hashtable_parser.h b/generated/hashtable_parser.h index 7418cd18b..5ebe5af81 100644 --- a/generated/hashtable_parser.h +++ b/generated/hashtable_parser.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/c_parser.cpp:1:0 - +// external/bonsai_stdlib/src/poof_functions.h:775:0 struct parser_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_struct_u32.h b/generated/hashtable_struct_u32.h index 572c94cef..622eb20f1 100644 --- a/generated/hashtable_struct_u32.h +++ b/generated/hashtable_struct_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/primitive_containers.h:34:0 - +// external/bonsai_stdlib/src/poof_functions.h:778:0 struct u32_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_struct_ui_toggle.h b/generated/hashtable_struct_ui_toggle.h index 1502e21c1..4501a0a9e 100644 --- a/generated/hashtable_struct_ui_toggle.h +++ b/generated/hashtable_struct_ui_toggle.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:263:0 - +// external/bonsai_stdlib/src/poof_functions.h:778:0 struct ui_toggle_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_struct_window_layout.h b/generated/hashtable_struct_window_layout.h index a38504bf7..122dee9c1 100644 --- a/generated/hashtable_struct_window_layout.h +++ b/generated/hashtable_struct_window_layout.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:142:0 - +// external/bonsai_stdlib/src/poof_functions.h:778:0 struct window_layout_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_struct_xml_tag.h b/generated/hashtable_struct_xml_tag.h index 8a13040e1..93bbe311b 100644 --- a/generated/hashtable_struct_xml_tag.h +++ b/generated/hashtable_struct_xml_tag.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/xml.h:46:0 - +// external/bonsai_stdlib/src/poof_functions.h:778:0 struct xml_tag_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_to_buffer_bonsai_type_info.h b/generated/hashtable_to_buffer_bonsai_type_info.h index 24f31e944..91a90f471 100644 --- a/generated/hashtable_to_buffer_bonsai_type_info.h +++ b/generated/hashtable_to_buffer_bonsai_type_info.h @@ -1,5 +1,4 @@ -// src/engine/bonsai_type_info.h:40:0 - +// external/bonsai_stdlib/src/poof_functions.h:1085:0 bonsai_type_info_buffer ToBuffer( bonsai_type_info_hashtable *Table, memory_arena *Memory ) { diff --git a/generated/hashtable_voxel_synth_tile.h b/generated/hashtable_voxel_synth_tile.h index 01b73d5a2..d513a37ac 100644 --- a/generated/hashtable_voxel_synth_tile.h +++ b/generated/hashtable_voxel_synth_tile.h @@ -1,5 +1,4 @@ -// src/engine/voxel_synthesis.h:163:0 - +// external/bonsai_stdlib/src/poof_functions.h:775:0 struct voxel_synth_tile_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 18c08b316..3337aec12 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:1273:0 - +// external/bonsai_stdlib/src/poof_functions.h:775:0 struct world_edit_brush_linked_list_node { b32 Tombstoned; diff --git a/generated/index_of_counted_string.h b/generated/index_of_counted_string.h index dbf00a0b5..5889d059d 100644 --- a/generated/index_of_counted_string.h +++ b/generated/index_of_counted_string.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:23:0 - +// external/bonsai_stdlib/src/poof_functions.h:600:0 link_internal umm IndexOf(counted_string_buffer *Buf, counted_string Element) { diff --git a/generated/maybe_asset_id.h b/generated/maybe_asset_id.h index c76c8b422..4566ef0b3 100644 --- a/generated/maybe_asset_id.h +++ b/generated/maybe_asset_id.h @@ -1,5 +1,4 @@ -// src/engine/asset.h:153:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_asset_id { maybe_tag Tag; diff --git a/generated/maybe_asset_ptr.h b/generated/maybe_asset_ptr.h index d20fdc8f2..7e5fe25fa 100644 --- a/generated/maybe_asset_ptr.h +++ b/generated/maybe_asset_ptr.h @@ -1,5 +1,4 @@ -// src/engine/asset.h:197:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_asset_ptr { maybe_tag Tag; diff --git a/generated/maybe_bonsai_type_info.h b/generated/maybe_bonsai_type_info.h index 684bdcdeb..34dc4004a 100644 --- a/generated/maybe_bonsai_type_info.h +++ b/generated/maybe_bonsai_type_info.h @@ -1,5 +1,4 @@ -// src/engine/bonsai_type_info.h:43:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_bonsai_type_info { maybe_tag Tag; diff --git a/generated/maybe_chunk_data.h b/generated/maybe_chunk_data.h index 83be1278f..b4916859b 100644 --- a/generated/maybe_chunk_data.h +++ b/generated/maybe_chunk_data.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.h:180:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_chunk_data { maybe_tag Tag; diff --git a/generated/maybe_entity_ptr.h b/generated/maybe_entity_ptr.h index 47bc689c0..6b30f6304 100644 --- a/generated/maybe_entity_ptr.h +++ b/generated/maybe_entity_ptr.h @@ -1,5 +1,4 @@ -// src/engine/resources.h:10:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_entity_ptr { maybe_tag Tag; diff --git a/generated/maybe_file_traversal_node.h b/generated/maybe_file_traversal_node.h index 2bb6c507b..73c52cf7c 100644 --- a/generated/maybe_file_traversal_node.h +++ b/generated/maybe_file_traversal_node.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/file.h:31:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_file_traversal_node { maybe_tag Tag; diff --git a/generated/maybe_model_buffer.h b/generated/maybe_model_buffer.h index 9f9a91792..af3719d1c 100644 --- a/generated/maybe_model_buffer.h +++ b/generated/maybe_model_buffer.h @@ -1,5 +1,4 @@ -// src/engine/model.h:97:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_model_buffer { maybe_tag Tag; diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index 973870782..ea9cdd458 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.h:460:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_standing_spot { maybe_tag Tag; diff --git a/generated/maybe_u32.h b/generated/maybe_u32.h index 80b1025d6..cb93b3b85 100644 --- a/generated/maybe_u32.h +++ b/generated/maybe_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/primitive_containers.h:29:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_u32 { maybe_tag Tag; diff --git a/generated/maybe_ui_toggle.h b/generated/maybe_ui_toggle.h index 68fe32842..f189fbe9a 100644 --- a/generated/maybe_ui_toggle.h +++ b/generated/maybe_ui_toggle.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:257:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_ui_toggle { maybe_tag Tag; diff --git a/generated/maybe_ui_toggle_ptr.h b/generated/maybe_ui_toggle_ptr.h index 6c9c5e79f..bfe605b10 100644 --- a/generated/maybe_ui_toggle_ptr.h +++ b/generated/maybe_ui_toggle_ptr.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:260:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_ui_toggle_ptr { maybe_tag Tag; diff --git a/generated/maybe_v3.h b/generated/maybe_v3.h index 287e1be6c..f7878ba0b 100644 --- a/generated/maybe_v3.h +++ b/generated/maybe_v3.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1168:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_v3 { maybe_tag Tag; diff --git a/generated/maybe_v3i.h b/generated/maybe_v3i.h index 5061afed5..0cad3723c 100644 --- a/generated/maybe_v3i.h +++ b/generated/maybe_v3i.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1170:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_v3i { maybe_tag Tag; diff --git a/generated/maybe_window_layout.h b/generated/maybe_window_layout.h index 3ac9d65e6..d7df3c626 100644 --- a/generated/maybe_window_layout.h +++ b/generated/maybe_window_layout.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:136:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_window_layout { maybe_tag Tag; diff --git a/generated/maybe_window_layout_ptr.h b/generated/maybe_window_layout_ptr.h index 35e65dfc8..048fb9c78 100644 --- a/generated/maybe_window_layout_ptr.h +++ b/generated/maybe_window_layout_ptr.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:139:0 - +// external/bonsai_stdlib/src/poof_functions.h:2196:0 struct maybe_window_layout_ptr { maybe_tag Tag; diff --git a/generated/mesh_allocator_untextured_3d_geometry_buffer_heap_allocator_190647831.h b/generated/mesh_allocator_untextured_3d_geometry_buffer_heap_allocator_190647831.h index 6dd4524b2..c1be95c48 100644 --- a/generated/mesh_allocator_untextured_3d_geometry_buffer_heap_allocator_190647831.h +++ b/generated/mesh_allocator_untextured_3d_geometry_buffer_heap_allocator_190647831.h @@ -1,5 +1,4 @@ -// src/engine/mesh.cpp:47:0 - +// src/engine/mesh.cpp:3:0 link_internal void AllocateMesh( untextured_3d_geometry_buffer *Mesh, data_type Type, u32 NumVerts, heap_allocator *Memory) { diff --git a/generated/mesh_allocator_untextured_3d_geometry_buffer_memory_arena_372399955.h b/generated/mesh_allocator_untextured_3d_geometry_buffer_memory_arena_372399955.h index fa3fd557c..093655792 100644 --- a/generated/mesh_allocator_untextured_3d_geometry_buffer_memory_arena_372399955.h +++ b/generated/mesh_allocator_untextured_3d_geometry_buffer_memory_arena_372399955.h @@ -1,5 +1,4 @@ -// src/engine/mesh.cpp:44:0 - +// src/engine/mesh.cpp:3:0 link_internal void AllocateMesh( untextured_3d_geometry_buffer *Mesh, data_type Type, u32 NumVerts, memory_arena *Memory) { diff --git a/generated/parse_integer_136174807.h b/generated/parse_integer_136174807.h index bc3bdbaf8..e50774bb6 100644 --- a/generated/parse_integer_136174807.h +++ b/generated/parse_integer_136174807.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.h:862:0 - +// external/bonsai_stdlib/src/counted_string.h:833:0 link_internal b32 ParseInteger(cs String, u32 *Out) { @@ -85,3 +84,4 @@ ParseInteger(cs String, s64 *Out) return Result; } + diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index 97433e4a5..a0ea2d414 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -1,5 +1,4 @@ -// src/engine/render_command.cpp:27:0 - +// src/engine/render_command.cpp:3:0 link_internal void PushBonsaiRenderCommandInitializeNoiseBuffer( work_queue *RenderQueue @@ -246,3 +245,4 @@ PushBonsaiRenderCommandCancelAllNoiseReadbackJobs( + diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index f01d810f4..a7bbd4868 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:758:0 - +// src/engine/editor.h:148:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) { @@ -21,6 +20,7 @@ RadioButtonGroup_ui_noise_type( renderer_2d *Ui, { CSz("Perlin"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_Perlin")), NoiseType_Perlin }, { CSz("Voronoi"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_Voronoi")), NoiseType_Voronoi }, { CSz("White"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "ui_noise_type NoiseType_White")), NoiseType_White }, + }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/rectalinear_iteration_pattern_812652930.h b/generated/rectalinear_iteration_pattern_812652930.h index c87a8f73b..b6b51d9c8 100644 --- a/generated/rectalinear_iteration_pattern_812652930.h +++ b/generated/rectalinear_iteration_pattern_812652930.h @@ -1,5 +1,4 @@ -// src/engine/world_update.cpp:517:0 - +// src/engine/world_update.cpp:308:0 DimIterator(x, y, z, UpdateDim) { b32 OverwriteVoxel = False; diff --git a/generated/scalar_math_fuctions_451039071.h b/generated/scalar_math_fuctions_451039071.h index 15f1c92b6..007f80d75 100644 --- a/generated/scalar_math_fuctions_451039071.h +++ b/generated/scalar_math_fuctions_451039071.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/maff.h:386:0 - +// external/bonsai_stdlib/src/maff.h:371:0 inline r32 Clamp( r32 Min, r32 Value, r32 Max ) { @@ -43,3 +42,4 @@ Clamp( s64 Min, s64 Value, s64 Max ) return Value; } + diff --git a/generated/serdes_collection_world_edit_block_array_index_block_array.h b/generated/serdes_collection_world_edit_block_array_index_block_array.h index 8859e17fc..f3e5bd8b9 100644 --- a/generated/serdes_collection_world_edit_block_array_index_block_array.h +++ b/generated/serdes_collection_world_edit_block_array_index_block_array.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:463:0 - +// src/engine/serdes.h:454:0 link_internal b32 diff --git a/generated/serdes_cursor_v3.h b/generated/serdes_cursor_v3.h index c273eab80..e5c31e6f0 100644 --- a/generated/serdes_cursor_v3.h +++ b/generated/serdes_cursor_v3.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:21:0 - +// src/engine/serdes.h:416:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, v3_cursor* Cursor) { diff --git a/generated/serdes_primitive_592771169.h b/generated/serdes_primitive_592771169.h index d2ffb559c..cefab50c2 100644 --- a/generated/serdes_primitive_592771169.h +++ b/generated/serdes_primitive_592771169.h @@ -1,5 +1,4 @@ -// src/engine/serdes.h:574:0 - +// src/engine/serdes.h:56:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, u8 *Element, umm Count = 1) { @@ -243,3 +242,4 @@ Deserialize(u8_cursor *Bytes, r64 *Element, memory_arena *Ignored = 0, umm Count /* serdes_array(type) */ + diff --git a/generated/serdes_primitive_85387614.h b/generated/serdes_primitive_85387614.h index ef4b69ded..450f6f0f6 100644 --- a/generated/serdes_primitive_85387614.h +++ b/generated/serdes_primitive_85387614.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:18:0 - +// src/engine/serdes.h:56:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, chunk_flag *Element, umm Count = 1) { diff --git a/generated/serdes_struct_bonsai_type_info.h b/generated/serdes_struct_bonsai_type_info.h index 346733f8d..451ea1bb2 100644 --- a/generated/serdes_struct_bonsai_type_info.h +++ b/generated/serdes_struct_bonsai_type_info.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:378:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(bonsai_type_info *Ignored) { @@ -50,7 +49,20 @@ Serialize(u8_cursor_block_array *Bytes, bonsai_type_info *BaseElement, umm Count Result &= Serialize(Bytes, &Element->SizeOfInBytes); // default - + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -91,7 +103,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, bonsai_type_info *Element, memory_ar // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SizeOfInBytes, Memory); + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_bonsai_type_info_buffer.h b/generated/serdes_struct_bonsai_type_info_buffer.h index a6e5a8df4..af5a72f45 100644 --- a/generated/serdes_struct_bonsai_type_info_buffer.h +++ b/generated/serdes_struct_bonsai_type_info_buffer.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:380:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(bonsai_type_info_buffer *Ignored) { @@ -44,7 +43,13 @@ Serialize(u8_cursor_block_array *Bytes, bonsai_type_info_buffer *BaseElement, um if (Element->Start) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } - if (Element->Start) { Result &= Serialize(Bytes, Element->Start, Element->Count ); } + + + + + + + if (Element->Start) { Result &= Serialize(Bytes, Element->Start, Element->Count ); } @@ -80,7 +85,12 @@ DeserializeCurrentVersion(u8_cursor *Bytes, bonsai_type_info_buffer *Element, me b64 HadStartPointer = Read_u64(Bytes); Assert(HadStartPointer < 2); // Should be 0 or 1 - if (HadStartPointer) + + + + + + if (HadStartPointer) { umm Count = Element->Count; diff --git a/generated/serdes_struct_brush_layer.h b/generated/serdes_struct_brush_layer.h index 5bef18e1a..7ea5c54ae 100644 --- a/generated/serdes_struct_brush_layer.h +++ b/generated/serdes_struct_brush_layer.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:445:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(brush_layer *Ignored) { @@ -41,9 +40,13 @@ Serialize(u8_cursor_block_array *Bytes, brush_layer *BaseElement, umm Count = 1) + - + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -72,10 +75,13 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_layer *Element, memory_arena * + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_brush_settings.h b/generated/serdes_struct_brush_settings.h index 38a61900c..c3baa0990 100644 --- a/generated/serdes_struct_brush_settings.h +++ b/generated/serdes_struct_brush_settings.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:442:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(brush_settings *Ignored) { @@ -119,7 +118,42 @@ Serialize(u8_cursor_block_array *Bytes, brush_settings *BaseElement, umm Count = Result &= Serialize(Bytes, &Element->HSVColor); // default - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -236,7 +270,27 @@ DeserializeCurrentVersion(u8_cursor *Bytes, brush_settings *Element, memory_aren // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->HSVColor, Memory); + + + + + + + + + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_camera.h b/generated/serdes_struct_camera.h index c102b51cc..1bdbf8ca8 100644 --- a/generated/serdes_struct_camera.h +++ b/generated/serdes_struct_camera.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:130:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(camera *Ignored) { @@ -58,6 +57,10 @@ Serialize(u8_cursor_block_array *Bytes, camera *BaseElement, umm Count = 1) + + + + Result &= Serialize(Bytes, &Element->TargetPitch); // default @@ -123,7 +126,44 @@ Serialize(u8_cursor_block_array *Bytes, camera *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->GhostId); // default - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -196,6 +236,10 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->TargetPitch, Memory); @@ -272,7 +316,30 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->GhostId, Memory); + + + + + + + + + + + + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_canonical_position.h b/generated/serdes_struct_canonical_position.h index cf93e00ab..a92c13f2c 100644 --- a/generated/serdes_struct_canonical_position.h +++ b/generated/serdes_struct_canonical_position.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:24:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(canonical_position *Ignored) { @@ -43,7 +42,18 @@ Serialize(u8_cursor_block_array *Bytes, canonical_position *BaseElement, umm Cou Result &= Serialize(Bytes, &Element->WorldP); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -76,8 +86,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, canonical_position *Element, memory_ // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldP, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_entity_0.h b/generated/serdes_struct_entity_0.h index 9126ade45..603296d14 100644 --- a/generated/serdes_struct_entity_0.h +++ b/generated/serdes_struct_entity_0.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:358:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(entity_0 *Ignored) { @@ -90,6 +89,8 @@ Serialize(u8_cursor_block_array *Bytes, entity_0 *BaseElement, umm Count = 1) + + if (Element->Emitter) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } @@ -114,10 +115,39 @@ Serialize(u8_cursor_block_array *Bytes, entity_0 *BaseElement, umm Count = 1) if (EntityUserDataSerialize) {Result &= EntityUserDataSerialize(Bytes, Element->UserType, Element->UserData);} - if (Element->Emitter) { Result &= Serialize(Bytes, Element->Emitter); } + + + + + + + + + + + + + + + + + + + if (Element->Emitter) { Result &= Serialize(Bytes, Element->Emitter); } + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -203,6 +233,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Mem + + b64 HadEmitterPointer = Read_u64(Bytes); Assert(HadEmitterPointer < 2); // Should be 0 or 1 @@ -228,7 +260,20 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Mem if (EntityUserDataDeserialize) {Result &= EntityUserDataDeserialize(Bytes, &Element->UserType, &Element->UserData, Memory);} - if (HadEmitterPointer) + + + + + + + + + + + + + + if (HadEmitterPointer) { umm Count = 1; @@ -242,6 +287,10 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_0 *Element, memory_arena *Mem } + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/serdes_struct_entity_1.h b/generated/serdes_struct_entity_1.h index d22e7904c..03f1aad87 100644 --- a/generated/serdes_struct_entity_1.h +++ b/generated/serdes_struct_entity_1.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:355:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(entity_1 *Ignored) { @@ -90,6 +89,8 @@ Serialize(u8_cursor_block_array *Bytes, entity_1 *BaseElement, umm Count = 1) + + if (Element->Emitter) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } @@ -121,10 +122,41 @@ Serialize(u8_cursor_block_array *Bytes, entity_1 *BaseElement, umm Count = 1) if (EntityUserDataSerialize) {Result &= EntityUserDataSerialize(Bytes, Element->UserType, Element->UserData);} - if (Element->Emitter) { Result &= Serialize(Bytes, Element->Emitter); } + + + + + + + + + + + + + + + + + + + if (Element->Emitter) { Result &= Serialize(Bytes, Element->Emitter); } + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -210,6 +242,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem + + b64 HadEmitterPointer = Read_u64(Bytes); Assert(HadEmitterPointer < 2); // Should be 0 or 1 @@ -243,7 +277,20 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem if (EntityUserDataDeserialize) {Result &= EntityUserDataDeserialize(Bytes, &Element->UserType, &Element->UserData, Memory);} - if (HadEmitterPointer) + + + + + + + + + + + + + + if (HadEmitterPointer) { umm Count = 1; @@ -257,6 +304,11 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_1 *Element, memory_arena *Mem } + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/serdes_struct_entity_id.h b/generated/serdes_struct_entity_id.h index df47db61b..2a90f29d2 100644 --- a/generated/serdes_struct_entity_id.h +++ b/generated/serdes_struct_entity_id.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:67:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(entity_id *Ignored) { @@ -43,7 +42,18 @@ Serialize(u8_cursor_block_array *Bytes, entity_id *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Generation); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -76,8 +86,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, entity_id *Element, memory_arena *Me // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Generation, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_file_traversal_node.h b/generated/serdes_struct_file_traversal_node.h index c499b847b..78456c919 100644 --- a/generated/serdes_struct_file_traversal_node.h +++ b/generated/serdes_struct_file_traversal_node.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:302:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(file_traversal_node *Ignored) { @@ -48,7 +47,20 @@ Serialize(u8_cursor_block_array *Bytes, file_traversal_node *BaseElement, umm Co Result &= Serialize(Bytes, &Element->Name); // default - + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -86,7 +98,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, file_traversal_node *Element, memory // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Name, Memory); + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_frustum.h b/generated/serdes_struct_frustum.h index b2f758002..255b5e6bd 100644 --- a/generated/serdes_struct_frustum.h +++ b/generated/serdes_struct_frustum.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:30:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(frustum *Ignored) { @@ -85,7 +84,30 @@ Serialize(u8_cursor_block_array *Bytes, frustum *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Right); // default - + + + + + + + + + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -166,7 +188,21 @@ DeserializeCurrentVersion(u8_cursor *Bytes, frustum *Element, memory_arena *Memo // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Right, Memory); + + + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_keyframe.h b/generated/serdes_struct_keyframe.h index fd856aa4b..a316988c4 100644 --- a/generated/serdes_struct_keyframe.h +++ b/generated/serdes_struct_keyframe.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:262:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(keyframe *Ignored) { @@ -43,7 +42,18 @@ Serialize(u8_cursor_block_array *Bytes, keyframe *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Value); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -76,8 +86,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, keyframe *Element, memory_arena *Mem // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Value, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_layered_brush.h b/generated/serdes_struct_layered_brush.h index cba6e0508..6bdcacef0 100644 --- a/generated/serdes_struct_layered_brush.h +++ b/generated/serdes_struct_layered_brush.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:451:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(layered_brush *Ignored) { @@ -54,7 +53,20 @@ Serialize(u8_cursor_block_array *Bytes, layered_brush *BaseElement, umm Count = Result &= Serialize(Bytes, &Element->AffectExisting); // default - + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -98,7 +110,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, layered_brush *Element, memory_arena // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->AffectExisting, Memory); + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_lighting_settings.h b/generated/serdes_struct_lighting_settings.h index 2f316bb8a..261ece7c3 100644 --- a/generated/serdes_struct_lighting_settings.h +++ b/generated/serdes_struct_lighting_settings.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:372:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(lighting_settings *Ignored) { @@ -127,7 +126,42 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings *BaseElement, umm Coun Result &= Serialize(Bytes, &Element->CurrentSunColor); // default - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -256,7 +290,27 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->CurrentSunColor, Memory); + + + + + + + + + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_model.h b/generated/serdes_struct_model.h index cc3076959..e2e1e0d63 100644 --- a/generated/serdes_struct_model.h +++ b/generated/serdes_struct_model.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:299:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(model *Ignored) { @@ -41,6 +40,8 @@ Serialize(u8_cursor_block_array *Bytes, model *BaseElement, umm Count = 1) + + Result &= Serialize(Bytes, &Element->TransparentMesh); // default @@ -57,7 +58,24 @@ Serialize(u8_cursor_block_array *Bytes, model *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Dim); // default - + + + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -86,6 +104,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, model *Element, memory_arena *Memory + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->TransparentMesh, Memory); @@ -106,7 +126,19 @@ DeserializeCurrentVersion(u8_cursor *Bytes, model *Element, memory_arena *Memory // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Dim, Memory); + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_noise_layer.h b/generated/serdes_struct_noise_layer.h index 23aef03d8..d25864970 100644 --- a/generated/serdes_struct_noise_layer.h +++ b/generated/serdes_struct_noise_layer.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:412:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(noise_layer *Ignored) { @@ -58,7 +57,22 @@ Serialize(u8_cursor_block_array *Bytes, noise_layer *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Voronoi); // default - + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -126,7 +140,17 @@ DeserializeCurrentVersion(u8_cursor *Bytes, noise_layer *Element, memory_arena * // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Voronoi, Memory); + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_noise_layer_0.h b/generated/serdes_struct_noise_layer_0.h index 5cf4fe761..a113c8306 100644 --- a/generated/serdes_struct_noise_layer_0.h +++ b/generated/serdes_struct_noise_layer_0.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:410:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(noise_layer_0 *Ignored) { @@ -48,7 +47,20 @@ Serialize(u8_cursor_block_array *Bytes, noise_layer_0 *BaseElement, umm Count = Result &= Serialize(Bytes, &Element->Voronoi); // default - + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -86,7 +98,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, noise_layer_0 *Element, memory_arena // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Voronoi, Memory); + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_particle_system.h b/generated/serdes_struct_particle_system.h index 2e7185b6f..e09c1b457 100644 --- a/generated/serdes_struct_particle_system.h +++ b/generated/serdes_struct_particle_system.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:290:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(particle_system *Ignored) { @@ -192,9 +191,55 @@ Serialize(u8_cursor_block_array *Bytes, particle_system *BaseElement, umm Count + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -412,9 +457,33 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system *Element, memory_are + + + + + + + + + + + + + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_particle_system_0.h b/generated/serdes_struct_particle_system_0.h index b63862fce..106549b7e 100644 --- a/generated/serdes_struct_particle_system_0.h +++ b/generated/serdes_struct_particle_system_0.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:287:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(particle_system_0 *Ignored) { @@ -189,9 +188,55 @@ Serialize(u8_cursor_block_array *Bytes, particle_system_0 *BaseElement, umm Coun + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -387,9 +432,33 @@ DeserializeCurrentVersion(u8_cursor *Bytes, particle_system_0 *Element, memory_a + + + + + + + + + + + + + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_perlin_noise_params.h b/generated/serdes_struct_perlin_noise_params.h index cf56332c0..36eb74d9c 100644 --- a/generated/serdes_struct_perlin_noise_params.h +++ b/generated/serdes_struct_perlin_noise_params.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:406:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(perlin_noise_params *Ignored) { @@ -43,7 +42,9 @@ Serialize(u8_cursor_block_array *Bytes, perlin_noise_params *BaseElement, umm Co - + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -74,7 +75,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, perlin_noise_params *Element, memory - + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_physics.h b/generated/serdes_struct_physics.h index 2ac8ec369..60c0d0991 100644 --- a/generated/serdes_struct_physics.h +++ b/generated/serdes_struct_physics.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:296:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(physics *Ignored) { @@ -64,7 +63,24 @@ Serialize(u8_cursor_block_array *Bytes, physics *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Speed); // default - + + + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -121,7 +137,18 @@ DeserializeCurrentVersion(u8_cursor *Bytes, physics *Element, memory_arena *Memo // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Speed, Memory); + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_plane.h b/generated/serdes_struct_plane.h index 3b09179ba..4726da60d 100644 --- a/generated/serdes_struct_plane.h +++ b/generated/serdes_struct_plane.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:27:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(plane *Ignored) { @@ -57,7 +56,13 @@ Serialize(u8_cursor_block_array *Bytes, plane *BaseElement, umm Count = 1) - + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -104,7 +109,10 @@ DeserializeCurrentVersion(u8_cursor *Bytes, plane *Element, memory_arena *Memory + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_random_series.h b/generated/serdes_struct_random_series.h index 9701c5f6e..cee282868 100644 --- a/generated/serdes_struct_random_series.h +++ b/generated/serdes_struct_random_series.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:277:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(random_series *Ignored) { @@ -43,7 +42,9 @@ Serialize(u8_cursor_block_array *Bytes, random_series *BaseElement, umm Count = - + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -74,7 +75,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, random_series *Element, memory_arena - + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_rect3.h b/generated/serdes_struct_rect3.h index a141742d7..fb3b05a4a 100644 --- a/generated/serdes_struct_rect3.h +++ b/generated/serdes_struct_rect3.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:268:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(rect3 *Ignored) { @@ -43,7 +42,18 @@ Serialize(u8_cursor_block_array *Bytes, rect3 *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Max); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -76,8 +86,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, rect3 *Element, memory_arena *Memory // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Max, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_rect3cp.h b/generated/serdes_struct_rect3cp.h index e65e300ed..790f81982 100644 --- a/generated/serdes_struct_rect3cp.h +++ b/generated/serdes_struct_rect3cp.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:274:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(rect3cp *Ignored) { @@ -43,7 +42,18 @@ Serialize(u8_cursor_block_array *Bytes, rect3cp *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Max); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -76,8 +86,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, rect3cp *Element, memory_arena *Memo // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Max, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_rect3i.h b/generated/serdes_struct_rect3i.h index 900ffd2ed..31737e22d 100644 --- a/generated/serdes_struct_rect3i.h +++ b/generated/serdes_struct_rect3i.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:271:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(rect3i *Ignored) { @@ -43,7 +42,18 @@ Serialize(u8_cursor_block_array *Bytes, rect3i *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Max); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -76,8 +86,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, rect3i *Element, memory_arena *Memor // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Max, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_render_settings.h b/generated/serdes_struct_render_settings.h index 9cf0b3895..e7ad7a14b 100644 --- a/generated/serdes_struct_render_settings.h +++ b/generated/serdes_struct_render_settings.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:375:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(render_settings *Ignored) { @@ -174,7 +173,56 @@ Serialize(u8_cursor_block_array *Bytes, render_settings *BaseElement, umm Count Result &= Serialize(Bytes, &Element->iLuminanceMapResolution); // default - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -356,7 +404,34 @@ DeserializeCurrentVersion(u8_cursor *Bytes, render_settings *Element, memory_are // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->iLuminanceMapResolution, Memory); + + + + + + + + + + + + + + + + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_shape_layer.h b/generated/serdes_struct_shape_layer.h index 84e7cca82..e3126148b 100644 --- a/generated/serdes_struct_shape_layer.h +++ b/generated/serdes_struct_shape_layer.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:438:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(shape_layer *Ignored) { @@ -83,7 +82,30 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Advanced); // default - + + + + + + + + + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -161,7 +183,21 @@ DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer *Element, memory_arena * // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Advanced, Memory); + + + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_shape_layer_advanced_params.h b/generated/serdes_struct_shape_layer_advanced_params.h index 60ae96618..35eeaa7c1 100644 --- a/generated/serdes_struct_shape_layer_advanced_params.h +++ b/generated/serdes_struct_shape_layer_advanced_params.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:435:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(shape_layer_advanced_params *Ignored) { @@ -57,7 +56,22 @@ Serialize(u8_cursor_block_array *Bytes, shape_layer_advanced_params *BaseElement Result &= Serialize(Bytes, &Element->Axis); // default - + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -106,7 +120,17 @@ DeserializeCurrentVersion(u8_cursor *Bytes, shape_layer_advanced_params *Element // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Axis, Memory); + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_vertex_material.h b/generated/serdes_struct_vertex_material.h index 7a28031a0..ad9590c9b 100644 --- a/generated/serdes_struct_vertex_material.h +++ b/generated/serdes_struct_vertex_material.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:136:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(vertex_material *Ignored) { @@ -50,7 +49,20 @@ Serialize(u8_cursor_block_array *Bytes, vertex_material *BaseElement, umm Count Result &= Serialize(Bytes, &Element->Emission); // default - + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -91,7 +103,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, vertex_material *Element, memory_are // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Emission, Memory); + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_voronoi_noise_params.h b/generated/serdes_struct_voronoi_noise_params.h index 5cb9a4427..2950726d8 100644 --- a/generated/serdes_struct_voronoi_noise_params.h +++ b/generated/serdes_struct_voronoi_noise_params.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:408:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(voronoi_noise_params *Ignored) { @@ -50,7 +49,20 @@ Serialize(u8_cursor_block_array *Bytes, voronoi_noise_params *BaseElement, umm C Result &= Serialize(Bytes, &Element->MaskChance); // default - + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -91,7 +103,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, voronoi_noise_params *Element, memor // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->MaskChance, Memory); + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_vox_data.h b/generated/serdes_struct_vox_data.h index 12c73ca06..de9d8dde3 100644 --- a/generated/serdes_struct_vox_data.h +++ b/generated/serdes_struct_vox_data.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:293:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(vox_data *Ignored) { diff --git a/generated/serdes_struct_voxel.h b/generated/serdes_struct_voxel.h index e43899ac2..44025f6ca 100644 --- a/generated/serdes_struct_voxel.h +++ b/generated/serdes_struct_voxel.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:38:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(voxel *Ignored) { @@ -43,7 +42,18 @@ Serialize(u8_cursor_block_array *Bytes, voxel *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Color); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -76,8 +86,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, voxel *Element, memory_arena *Memory // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Color, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_voxel_lighting.h b/generated/serdes_struct_voxel_lighting.h index d21d4af08..7b972fd24 100644 --- a/generated/serdes_struct_voxel_lighting.h +++ b/generated/serdes_struct_voxel_lighting.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:44:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(voxel_lighting *Ignored) { @@ -43,7 +42,9 @@ Serialize(u8_cursor_block_array *Bytes, voxel_lighting *BaseElement, umm Count = - + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -74,7 +75,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, voxel_lighting *Element, memory_aren - + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_white_noise_params.h b/generated/serdes_struct_white_noise_params.h index a89b2ade1..f0b69c18d 100644 --- a/generated/serdes_struct_white_noise_params.h +++ b/generated/serdes_struct_white_noise_params.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:404:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(white_noise_params *Ignored) { diff --git a/generated/serdes_struct_world_chunk.h b/generated/serdes_struct_world_chunk.h index 9bd4645b5..def6a75b3 100644 --- a/generated/serdes_struct_world_chunk.h +++ b/generated/serdes_struct_world_chunk.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:60:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_chunk *Ignored) { @@ -37,7 +36,8 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { world_chunk *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Dim); // default + + Result &= Serialize(Bytes, &Element->Dim); // default @@ -76,6 +76,8 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) + + Result &= Serialize(Bytes, &Element->DimInChunks); // default @@ -90,9 +92,14 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) + + + + + - if (Element->Occupancy) { Result &= Serialize(Bytes, Element->Occupancy); } + if (Element->Occupancy) { Result &= Serialize(Bytes, Element->Occupancy); } @@ -112,6 +119,16 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk *BaseElement, umm Count = 1) + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -155,7 +172,8 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Dim, Memory); @@ -196,6 +214,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DimInChunks, Memory); @@ -212,9 +232,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * + + + + - if (HadOccupancyPointer) + + if (HadOccupancyPointer) { umm Count = 1; @@ -284,6 +309,13 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk *Element, memory_arena * } + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/serdes_struct_world_chunk_0.h b/generated/serdes_struct_world_chunk_0.h index d1387ed9b..82cddb2f5 100644 --- a/generated/serdes_struct_world_chunk_0.h +++ b/generated/serdes_struct_world_chunk_0.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:49:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_chunk_0 *Ignored) { @@ -34,7 +33,8 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk_0 *BaseElement, umm Count = RangeIterator_t(umm, ElementIndex, Count) { world_chunk_0 *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Dim); // default + + Result &= Serialize(Bytes, &Element->Dim); // default @@ -51,6 +51,8 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk_0 *BaseElement, umm Count = + + Result &= Serialize(Bytes, &Element->WorldP); // default @@ -58,9 +60,21 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk_0 *BaseElement, umm Count = + + + + + + + + + + + + - if (Element->Voxels) { Result &= Serialize(Bytes, Element->Voxels, Cast(umm, Volume(Element->Dim)) ); } + if (Element->Voxels) { Result &= Serialize(Bytes, Element->Voxels, Cast(umm, Volume(Element->Dim)) ); } @@ -68,6 +82,19 @@ Serialize(u8_cursor_block_array *Bytes, world_chunk_0 *BaseElement, umm Count = + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -89,7 +116,8 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk_0 *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Dim, Memory); @@ -107,6 +135,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk_0 *Element, memory_arena + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->WorldP, Memory); @@ -115,9 +145,21 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk_0 *Element, memory_arena + + + + + + + + + + + - if (HadVoxelsPointer) + + if (HadVoxelsPointer) { umm Count = Cast(umm, Volume(Element->Dim)); @@ -145,6 +187,18 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_chunk_0 *Element, memory_arena } + + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/serdes_struct_world_edit.h b/generated/serdes_struct_world_edit.h index 814e20eef..6ee2b624b 100644 --- a/generated/serdes_struct_world_edit.h +++ b/generated/serdes_struct_world_edit.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:457:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_edit *Ignored) { @@ -62,12 +61,27 @@ Serialize(u8_cursor_block_array *Bytes, world_edit *BaseElement, umm Count = 1) Result &= Serialize(Bytes, &Element->Ordinal); // default - if (Element->Brush) { Result &= Serialize(Bytes, Element->Brush); } + + + + + if (Element->Brush) { Result &= Serialize(Bytes, Element->Brush); } + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -120,7 +134,14 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit *Element, memory_arena *M // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Ordinal, Memory); - if (HadBrushPointer) + + + + + + + + if (HadBrushPointer) { umm Count = 1; @@ -134,6 +155,9 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit *Element, memory_arena *M } + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/serdes_struct_world_edit_block_array_index.h b/generated/serdes_struct_world_edit_block_array_index.h index f81ff60d6..5a80da6f0 100644 --- a/generated/serdes_struct_world_edit_block_array_index.h +++ b/generated/serdes_struct_world_edit_block_array_index.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:460:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_edit_block_array_index *Ignored) { @@ -43,7 +42,9 @@ Serialize(u8_cursor_block_array *Bytes, world_edit_block_array_index *BaseElemen - + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -74,7 +75,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_block_array_index *Elemen - + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_world_edit_brush.h b/generated/serdes_struct_world_edit_brush.h index cbb8fa2be..b7ea9dd27 100644 --- a/generated/serdes_struct_world_edit_brush.h +++ b/generated/serdes_struct_world_edit_brush.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:454:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_edit_brush *Ignored) { @@ -56,7 +55,22 @@ Serialize(u8_cursor_block_array *Bytes, world_edit_brush *BaseElement, umm Count Result &= Serialize(Bytes, &Element->Layered); // default - + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -101,7 +115,17 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_brush *Element, memory_ar // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Layered, Memory); + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_world_edit_layer.h b/generated/serdes_struct_world_edit_layer.h index a77e103fb..a09c91e09 100644 --- a/generated/serdes_struct_world_edit_layer.h +++ b/generated/serdes_struct_world_edit_layer.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:466:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_edit_layer *Ignored) { @@ -46,7 +45,18 @@ Serialize(u8_cursor_block_array *Bytes, world_edit_layer *BaseElement, umm Count Result &= Serialize(Bytes, &Element->EditIndices); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -81,8 +91,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_edit_layer *Element, memory_ar // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->EditIndices, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_world_update_op_shape_params_asset.h b/generated/serdes_struct_world_update_op_shape_params_asset.h index b1155b8a1..3f06c1438 100644 --- a/generated/serdes_struct_world_update_op_shape_params_asset.h +++ b/generated/serdes_struct_world_update_op_shape_params_asset.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:415:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_asset *Ignored) { @@ -50,7 +49,20 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_asset *Base Result &= Serialize(Bytes, &Element->Origin); // default - + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -91,7 +103,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_asset * // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Origin, Memory); + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h index 3921fc277..31d9e5dbc 100644 --- a/generated/serdes_struct_world_update_op_shape_params_chunk_data.h +++ b/generated/serdes_struct_world_update_op_shape_params_chunk_data.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:417:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_chunk_data *Ignored) { @@ -43,7 +42,18 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_chunk_data Result &= Serialize(Bytes, &Element->SimSpaceOrigin); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -76,8 +86,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_chunk_d // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->SimSpaceOrigin, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_world_update_op_shape_params_cylinder.h b/generated/serdes_struct_world_update_op_shape_params_cylinder.h index 5926e797a..852654843 100644 --- a/generated/serdes_struct_world_update_op_shape_params_cylinder.h +++ b/generated/serdes_struct_world_update_op_shape_params_cylinder.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:426:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_cylinder *Ignored) { @@ -43,7 +42,18 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_cylinder *B Result &= Serialize(Bytes, &Element->Height); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -76,8 +86,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_cylinde // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Height, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_world_update_op_shape_params_line.h b/generated/serdes_struct_world_update_op_shape_params_line.h index 76d7e728a..60f7e35cd 100644 --- a/generated/serdes_struct_world_update_op_shape_params_line.h +++ b/generated/serdes_struct_world_update_op_shape_params_line.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:424:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_line *Ignored) { @@ -50,7 +49,20 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_line *BaseE Result &= Serialize(Bytes, &Element->Radius); // default - + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -91,7 +103,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_line *E // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Radius, Memory); + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_world_update_op_shape_params_plane.h b/generated/serdes_struct_world_update_op_shape_params_plane.h index 50326cee3..95507167a 100644 --- a/generated/serdes_struct_world_update_op_shape_params_plane.h +++ b/generated/serdes_struct_world_update_op_shape_params_plane.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:428:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_plane *Ignored) { @@ -41,7 +40,18 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_plane *Base Result &= Serialize(Bytes, &Element->Thickness); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -71,8 +81,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_plane * // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Thickness, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_world_update_op_shape_params_rect.h b/generated/serdes_struct_world_update_op_shape_params_rect.h index 82b74eb67..b386a8d0e 100644 --- a/generated/serdes_struct_world_update_op_shape_params_rect.h +++ b/generated/serdes_struct_world_update_op_shape_params_rect.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:420:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_rect *Ignored) { @@ -43,7 +42,9 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_rect *BaseE - + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -74,7 +75,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_rect *E - + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; diff --git a/generated/serdes_struct_world_update_op_shape_params_sphere.h b/generated/serdes_struct_world_update_op_shape_params_sphere.h index fdf903b30..4f2734fac 100644 --- a/generated/serdes_struct_world_update_op_shape_params_sphere.h +++ b/generated/serdes_struct_world_update_op_shape_params_sphere.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:422:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_sphere *Ignored) { @@ -43,7 +42,18 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_sphere *Bas Result &= Serialize(Bytes, &Element->Radius); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -76,8 +86,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_sphere // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Radius, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_struct_world_update_op_shape_params_torus.h b/generated/serdes_struct_world_update_op_shape_params_torus.h index 87fdd95f0..0a4b4733c 100644 --- a/generated/serdes_struct_world_update_op_shape_params_torus.h +++ b/generated/serdes_struct_world_update_op_shape_params_torus.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:430:0 - +// src/engine/serdes.h:495:0 link_internal bonsai_type_info TypeInfo(world_update_op_shape_params_torus *Ignored) { @@ -43,7 +42,18 @@ Serialize(u8_cursor_block_array *Bytes, world_update_op_shape_params_torus *Base Result &= Serialize(Bytes, &Element->MinorRadius); // default - + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } @@ -76,8 +86,16 @@ DeserializeCurrentVersion(u8_cursor *Bytes, world_update_op_shape_params_torus * // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->MinorRadius, Memory); + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); return Result; } diff --git a/generated/serdes_vector_Quaternion.h b/generated/serdes_vector_Quaternion.h index 871a9bc88..9a22a7b32 100644 --- a/generated/serdes_vector_Quaternion.h +++ b/generated/serdes_vector_Quaternion.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:259:0 - +// src/engine/serdes.h:503:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, Quaternion *Element, umm Count = 1) { diff --git a/generated/serdes_vector_v2.h b/generated/serdes_vector_v2.h index d99274dc3..5df988c6d 100644 --- a/generated/serdes_vector_v2.h +++ b/generated/serdes_vector_v2.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:3:0 - +// src/engine/serdes.h:503:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, v2 *Element, umm Count = 1) { diff --git a/generated/serdes_vector_v2i.h b/generated/serdes_vector_v2i.h index b2ad225f8..9f53b47e3 100644 --- a/generated/serdes_vector_v2i.h +++ b/generated/serdes_vector_v2i.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:12:0 - +// src/engine/serdes.h:503:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, v2i *Element, umm Count = 1) { diff --git a/generated/serdes_vector_v3.h b/generated/serdes_vector_v3.h index d51fe84f2..715a229b0 100644 --- a/generated/serdes_vector_v3.h +++ b/generated/serdes_vector_v3.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:6:0 - +// src/engine/serdes.h:503:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, v3 *Element, umm Count = 1) { diff --git a/generated/serdes_vector_v3i.h b/generated/serdes_vector_v3i.h index 3aafd6d34..e2f6404bd 100644 --- a/generated/serdes_vector_v3i.h +++ b/generated/serdes_vector_v3i.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:15:0 - +// src/engine/serdes.h:503:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, v3i *Element, umm Count = 1) { diff --git a/generated/serdes_vector_v4.h b/generated/serdes_vector_v4.h index 73e2be987..702b3f8bf 100644 --- a/generated/serdes_vector_v4.h +++ b/generated/serdes_vector_v4.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:9:0 - +// src/engine/serdes.h:503:0 link_internal b32 Serialize(u8_cursor_block_array *Bytes, v4 *Element, umm Count = 1) { diff --git a/generated/serialize_struct_entity.h b/generated/serialize_struct_entity.h index 72f3b3b5c..20d803013 100644 --- a/generated/serialize_struct_entity.h +++ b/generated/serialize_struct_entity.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:364:0 - +// src/engine/serdes.h:132:0 link_internal bonsai_type_info TypeInfo(entity *Ignored) { @@ -93,6 +92,8 @@ Serialize(u8_cursor_block_array *Bytes, entity *BaseElement, umm Count = 1) + + if (Element->Emitter) { Result &= Write(Bytes, Cast(u8*, &PointerTrue), sizeof(PointerTrue)); } else { Result &= Write(Bytes, Cast(u8*, &PointerFalse), sizeof(PointerFalse)); } @@ -124,10 +125,41 @@ Serialize(u8_cursor_block_array *Bytes, entity *BaseElement, umm Count = 1) if (EntityUserDataSerialize) {Result &= EntityUserDataSerialize(Bytes, Element->UserType, Element->UserData);} - if (Element->Emitter) { Result &= Serialize(Bytes, Element->Emitter); } + + + + + + + + + + + + + + + + + + + if (Element->Emitter) { Result &= Serialize(Bytes, Element->Emitter); } + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); diff --git a/generated/serialize_struct_level_header.h b/generated/serialize_struct_level_header.h index 537dfcda4..11338307d 100644 --- a/generated/serialize_struct_level_header.h +++ b/generated/serialize_struct_level_header.h @@ -1,5 +1,4 @@ -// src/engine/serdes.cpp:386:0 - +// src/engine/serdes.h:132:0 link_internal bonsai_type_info TypeInfo(level_header *Ignored) { @@ -104,7 +103,33 @@ Serialize(u8_cursor_block_array *Bytes, level_header *BaseElement, umm Count = 1 Result &= Serialize(Bytes, Element->TerrainDecorationShader, ThisCount); } - + + + + + + + + + + + + + + + + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); } diff --git a/generated/shader_magic_textured_quad_render_pass.h b/generated/shader_magic_textured_quad_render_pass.h index e5e2a247e..97d77140d 100644 --- a/generated/shader_magic_textured_quad_render_pass.h +++ b/generated/shader_magic_textured_quad_render_pass.h @@ -1,14 +1,16 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:10:0 - +// external/bonsai_stdlib/src/shader.h:6:0 link_internal b32 poof() InitializeTexturedQuadRenderPass ( textured_quad_render_pass *Element - , b32 IsDepthTexture + + + , b32 IsDepthTexture , b32 HasAlphaChannel , s32 TextureSlice , v3 Tint + ) { b32 Result = CompileShaderPair(&Element->Program, CSz(STDLIB_SHADER_PATH "FullPassthrough.vertexshader"), CSz(STDLIB_SHADER_PATH "SimpleTexture.fragmentshader")); @@ -19,7 +21,9 @@ InitializeTexturedQuadRenderPass u32 UniformIndex = 0; - Element->IsDepthTexture = IsDepthTexture; + + + Element->IsDepthTexture = IsDepthTexture; InitShaderUniform( &Element->Program, UniformIndex++, @@ -51,6 +55,8 @@ InitializeTexturedQuadRenderPass "Tint" ); + + u32 Expected = 4 ; if (UniformIndex != Expected ) { @@ -74,7 +80,9 @@ UseRenderPass_textured_quad_render_pass s32 TextureUnit = 0; s32 UniformIndex = 0; - { + + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -102,6 +110,8 @@ UseRenderPass_textured_quad_render_pass AssertNoGlErrors; } + + if (UniformIndex != 4 ) { Error("Shader (textured_quad_render_pass) had an incorrect number of uniform slots!"); diff --git a/generated/static_cursor_v2_0_986190493.h b/generated/static_cursor_v2_0_986190493.h index a48b0d95d..d7efbbcde 100644 --- a/generated/static_cursor_v2_0_986190493.h +++ b/generated/static_cursor_v2_0_986190493.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/vector.h:1173:0 - +// external/bonsai_stdlib/src/poof_functions.h:1233:0 struct v2_static_cursor_16 { diff --git a/generated/staticbuffer_u32_cursor_ptr_961996651.h b/generated/staticbuffer_u32_cursor_ptr_961996651.h index 095ae9755..c9958e874 100644 --- a/generated/staticbuffer_u32_cursor_ptr_961996651.h +++ b/generated/staticbuffer_u32_cursor_ptr_961996651.h @@ -1,5 +1,4 @@ -// src/engine/voxel_synthesis.h:42:0 - +// external/bonsai_stdlib/src/poof_functions.h:1183:0 struct entropy_lists { u32_cursor Start[TILE_RULESETS_COUNT]; diff --git a/generated/stream_and_cursor_counted_string.h b/generated/stream_and_cursor_counted_string.h index 8b58b52e8..126ae9722 100644 --- a/generated/stream_and_cursor_counted_string.h +++ b/generated/stream_and_cursor_counted_string.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.h:123:0 - +// external/bonsai_stdlib/src/poof_functions.h:2054:0 struct counted_string_cursor { counted_string *Start; @@ -14,11 +13,12 @@ link_internal counted_string_cursor CountedStringCursor(umm ElementCount, memory_arena* Memory) { counted_string *Start = (counted_string*)PushStruct(Memory, sizeof(counted_string)*ElementCount, 1, 0); - counted_string_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + counted_string_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/stream_and_cursor_s32.h b/generated/stream_and_cursor_s32.h index 8466e3b92..3726e5f2a 100644 --- a/generated/stream_and_cursor_s32.h +++ b/generated/stream_and_cursor_s32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:36:0 - +// external/bonsai_stdlib/src/poof_functions.h:2054:0 struct s32_cursor { s32 *Start; @@ -14,11 +13,12 @@ link_internal s32_cursor S32Cursor(umm ElementCount, memory_arena* Memory) { s32 *Start = (s32*)PushStruct(Memory, sizeof(s32)*ElementCount, 1, 0); - s32_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + s32_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/stream_and_cursor_u32.h b/generated/stream_and_cursor_u32.h index 3609b2b5a..97bbb7b0e 100644 --- a/generated/stream_and_cursor_u32.h +++ b/generated/stream_and_cursor_u32.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/binary_parser.cpp:9:0 - +// external/bonsai_stdlib/src/poof_functions.h:2054:0 struct u32_cursor { u32 *Start; @@ -14,11 +13,12 @@ link_internal u32_cursor U32Cursor(umm ElementCount, memory_arena* Memory) { u32 *Start = (u32*)PushStruct(Memory, sizeof(u32)*ElementCount, 1, 0); - u32_cursor Result = { - .Start = Start, - .End = Start+ElementCount, - .At = Start, - }; + u32_cursor Result = {}; + + Result.Start = Start; + Result.End = Start+ElementCount; + Result.At = Start; + return Result; } diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index edd94bd23..e1fd7e69a 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,24 +1,47 @@ -// src/engine/editor.cpp:508:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(asset_type Value) +{ + b32 Result = False; + switch (Value) + { + case AssetType_Undefined: + case AssetType_Models: + case AssetType_WorldChunk: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(asset_type Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case AssetType_Undefined: { Result = CSz("Undefined"); } break; case AssetType_Models: { Result = CSz("Models"); } break; case AssetType_WorldChunk: { Result = CSz("WorldChunk"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(asset_type Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -26,9 +49,10 @@ ToString(asset_type Type) case AssetType_Models: { Result = CSz("AssetType_Models"); } break; case AssetType_WorldChunk: { Result = CSz("AssetType_WorldChunk"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -41,6 +65,7 @@ AssetType(counted_string S) if (StringsMatch(S, CSz("AssetType_Models"))) { return AssetType_Models; } if (StringsMatch(S, CSz("AssetType_WorldChunk"))) { return AssetType_WorldChunk; } + return Result; } diff --git a/generated/string_and_value_tables_bitmap_compression_type.h b/generated/string_and_value_tables_bitmap_compression_type.h index 36c69554e..95d3a42c0 100644 --- a/generated/string_and_value_tables_bitmap_compression_type.h +++ b/generated/string_and_value_tables_bitmap_compression_type.h @@ -1,9 +1,36 @@ -// external/bonsai_stdlib/src/bitmap.cpp:76:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(bitmap_compression_type Value) +{ + b32 Result = False; + switch (Value) + { + case BitmapCompressionType_RGB: + case BitmapCompressionType_RLE8: + case BitmapCompressionType_RLE4: + case BitmapCompressionType_BITFIELDS: + case BitmapCompressionType_JPEG: + case BitmapCompressionType_PNG: + case BitmapCompressionType_ALPHABITFIELDS: + case BitmapCompressionType_CMYK: + case BitmapCompressionType_CMYKRLE8: + case BitmapCompressionType_CMYKRLE4: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(bitmap_compression_type Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case BitmapCompressionType_RGB: { Result = CSz("RGB"); } break; @@ -17,15 +44,18 @@ ToStringPrefixless(bitmap_compression_type Type) case BitmapCompressionType_CMYKRLE8: { Result = CSz("CMYKRLE8"); } break; case BitmapCompressionType_CMYKRLE4: { Result = CSz("CMYKRLE4"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(bitmap_compression_type Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -40,9 +70,10 @@ ToString(bitmap_compression_type Type) case BitmapCompressionType_CMYKRLE8: { Result = CSz("BitmapCompressionType_CMYKRLE8"); } break; case BitmapCompressionType_CMYKRLE4: { Result = CSz("BitmapCompressionType_CMYKRLE4"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -62,6 +93,7 @@ BitmapCompressionType(counted_string S) if (StringsMatch(S, CSz("BitmapCompressionType_CMYKRLE8"))) { return BitmapCompressionType_CMYKRLE8; } if (StringsMatch(S, CSz("BitmapCompressionType_CMYKRLE4"))) { return BitmapCompressionType_CMYKRLE4; } + return Result; } diff --git a/generated/string_and_value_tables_chunk_flag.h b/generated/string_and_value_tables_chunk_flag.h index 491b6c45b..d127048d9 100644 --- a/generated/string_and_value_tables_chunk_flag.h +++ b/generated/string_and_value_tables_chunk_flag.h @@ -1,9 +1,32 @@ -// src/engine/world_chunk.h:82:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(chunk_flag Value) +{ + b32 Result = False; + switch (Value) + { + case Chunk_Uninitialized: + case Chunk_Queued: + case Chunk_VoxelsInitialized: + case Chunk_Garbage: + case Chunk_Deallocate: + case Chunk_Freelist: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(chunk_flag Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case Chunk_Uninitialized: { Result = CSz("Uninitialized"); } break; @@ -13,6 +36,7 @@ ToStringPrefixless(chunk_flag Type) case Chunk_Deallocate: { Result = CSz("Deallocate"); } break; case Chunk_Freelist: { Result = CSz("Freelist"); } break; + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: @@ -44,13 +68,15 @@ ToStringPrefixless(chunk_flag Type) } break; } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(chunk_flag Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -61,6 +87,7 @@ ToString(chunk_flag Type) case Chunk_Deallocate: { Result = CSz("Chunk_Deallocate"); } break; case Chunk_Freelist: { Result = CSz("Chunk_Freelist"); } break; + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: @@ -79,7 +106,7 @@ ToString(chunk_flag Type) } break; } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -95,6 +122,7 @@ ChunkFlag(counted_string S) if (StringsMatch(S, CSz("Chunk_Deallocate"))) { return Chunk_Deallocate; } if (StringsMatch(S, CSz("Chunk_Freelist"))) { return Chunk_Freelist; } + return Result; } diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index 2f7f565e4..d0774d62a 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,24 +1,47 @@ -// src/engine/editor.h:706:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(data_type Value) +{ + b32 Result = False; + switch (Value) + { + case DataType_Undefinded: + case DataType_v3: + case DataType_v3_u8: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(data_type Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case DataType_Undefinded: { Result = CSz("Undefinded"); } break; case DataType_v3: { Result = CSz("v3"); } break; case DataType_v3_u8: { Result = CSz("u8"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(data_type Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -26,9 +49,10 @@ ToString(data_type Type) case DataType_v3: { Result = CSz("DataType_v3"); } break; case DataType_v3_u8: { Result = CSz("DataType_v3_u8"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -41,6 +65,7 @@ DataType(counted_string S) if (StringsMatch(S, CSz("DataType_v3"))) { return DataType_v3; } if (StringsMatch(S, CSz("DataType_v3_u8"))) { return DataType_v3_u8; } + return Result; } diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 4cfa78a11..0b50c3805 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,9 +1,34 @@ -// src/engine/editor.cpp:300:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(engine_debug_view_mode Value) +{ + b32 Result = False; + switch (Value) + { + case EngineDebugViewMode_Level: + case EngineDebugViewMode_WorldEdit: + case EngineDebugViewMode_Entities: + case EngineDebugViewMode_Assets: + case EngineDebugViewMode_WorldChunks: + case EngineDebugViewMode_Textures: + case EngineDebugViewMode_RenderSettings: + case EngineDebugViewMode_EngineDebug: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(engine_debug_view_mode Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case EngineDebugViewMode_Level: { Result = CSz("Level"); } break; @@ -15,6 +40,7 @@ ToStringPrefixless(engine_debug_view_mode Type) case EngineDebugViewMode_RenderSettings: { Result = CSz("RenderSettings"); } break; case EngineDebugViewMode_EngineDebug: { Result = CSz("EngineDebug"); } break; + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: @@ -46,13 +72,15 @@ ToStringPrefixless(engine_debug_view_mode Type) } break; } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(engine_debug_view_mode Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -65,6 +93,7 @@ ToString(engine_debug_view_mode Type) case EngineDebugViewMode_RenderSettings: { Result = CSz("EngineDebugViewMode_RenderSettings"); } break; case EngineDebugViewMode_EngineDebug: { Result = CSz("EngineDebugViewMode_EngineDebug"); } break; + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: @@ -83,7 +112,7 @@ ToString(engine_debug_view_mode Type) } break; } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -101,6 +130,7 @@ EngineDebugViewMode(counted_string S) if (StringsMatch(S, CSz("EngineDebugViewMode_RenderSettings"))) { return EngineDebugViewMode_RenderSettings; } if (StringsMatch(S, CSz("EngineDebugViewMode_EngineDebug"))) { return EngineDebugViewMode_EngineDebug; } + return Result; } diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index abed0bcd3..a91ba34cb 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,32 +1,55 @@ -// src/engine/editor.h:1139:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(brush_layer_type Value) +{ + b32 Result = False; + switch (Value) + { + case BrushLayerType_Noise: + case BrushLayerType_Shape: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(brush_layer_type Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case BrushLayerType_Noise: { Result = CSz("Noise"); } break; case BrushLayerType_Shape: { Result = CSz("Shape"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(brush_layer_type Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { case BrushLayerType_Noise: { Result = CSz("BrushLayerType_Noise"); } break; case BrushLayerType_Shape: { Result = CSz("BrushLayerType_Shape"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -38,6 +61,7 @@ BrushLayerType(counted_string S) if (StringsMatch(S, CSz("BrushLayerType_Noise"))) { return BrushLayerType_Noise; } if (StringsMatch(S, CSz("BrushLayerType_Shape"))) { return BrushLayerType_Shape; } + return Result; } diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index befd63793..fd013141d 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,24 +1,47 @@ -// src/engine/editor.cpp:294:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(file_traversal_type Value) +{ + b32 Result = False; + switch (Value) + { + case FileTraversalType_None: + case FileTraversalType_Dir: + case FileTraversalType_File: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(file_traversal_type Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case FileTraversalType_None: { Result = CSz("None"); } break; case FileTraversalType_Dir: { Result = CSz("Dir"); } break; case FileTraversalType_File: { Result = CSz("File"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(file_traversal_type Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -26,9 +49,10 @@ ToString(file_traversal_type Type) case FileTraversalType_Dir: { Result = CSz("FileTraversalType_Dir"); } break; case FileTraversalType_File: { Result = CSz("FileTraversalType_File"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -41,6 +65,7 @@ FileTraversalType(counted_string S) if (StringsMatch(S, CSz("FileTraversalType_Dir"))) { return FileTraversalType_Dir; } if (StringsMatch(S, CSz("FileTraversalType_File"))) { return FileTraversalType_File; } + return Result; } diff --git a/generated/string_and_value_tables_lighting_quality_setting.h b/generated/string_and_value_tables_lighting_quality_setting.h index 364c6e5e7..b272c5010 100644 --- a/generated/string_and_value_tables_lighting_quality_setting.h +++ b/generated/string_and_value_tables_lighting_quality_setting.h @@ -1,9 +1,30 @@ -// src/engine/settings.h:30:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(lighting_quality_setting Value) +{ + b32 Result = False; + switch (Value) + { + case LightingQualitySetting_High: + case LightingQualitySetting_Med: + case LightingQualitySetting_Low: + case LightingQualitySetting_Off: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(lighting_quality_setting Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case LightingQualitySetting_High: { Result = CSz("High"); } break; @@ -11,15 +32,18 @@ ToStringPrefixless(lighting_quality_setting Type) case LightingQualitySetting_Low: { Result = CSz("Low"); } break; case LightingQualitySetting_Off: { Result = CSz("Off"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(lighting_quality_setting Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -28,9 +52,10 @@ ToString(lighting_quality_setting Type) case LightingQualitySetting_Low: { Result = CSz("LightingQualitySetting_Low"); } break; case LightingQualitySetting_Off: { Result = CSz("LightingQualitySetting_Off"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -44,6 +69,7 @@ LightingQualitySetting(counted_string S) if (StringsMatch(S, CSz("LightingQualitySetting_Low"))) { return LightingQualitySetting_Low; } if (StringsMatch(S, CSz("LightingQualitySetting_Off"))) { return LightingQualitySetting_Off; } + return Result; } diff --git a/generated/string_and_value_tables_log_level.h b/generated/string_and_value_tables_log_level.h index 0ba66768c..2c779ee7b 100644 --- a/generated/string_and_value_tables_log_level.h +++ b/generated/string_and_value_tables_log_level.h @@ -1,9 +1,32 @@ -// external/bonsai_stdlib/src/console_io.h:13:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(log_level Value) +{ + b32 Result = False; + switch (Value) + { + case LogLevel_Undefined: + case LogLevel_Verbose: + case LogLevel_Debug: + case LogLevel_Info: + case LogLevel_Error: + case LogLevel_Shush: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(log_level Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case LogLevel_Undefined: { Result = CSz("Undefined"); } break; @@ -13,15 +36,18 @@ ToStringPrefixless(log_level Type) case LogLevel_Error: { Result = CSz("Error"); } break; case LogLevel_Shush: { Result = CSz("Shush"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(log_level Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -32,9 +58,10 @@ ToString(log_level Type) case LogLevel_Error: { Result = CSz("LogLevel_Error"); } break; case LogLevel_Shush: { Result = CSz("LogLevel_Shush"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -50,6 +77,7 @@ LogLevel(counted_string S) if (StringsMatch(S, CSz("LogLevel_Error"))) { return LogLevel_Error; } if (StringsMatch(S, CSz("LogLevel_Shush"))) { return LogLevel_Shush; } + return Result; } diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index 15cb03a51..f35689bdf 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,32 +1,55 @@ -// src/engine/editor.h:701:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(maybe_tag Value) +{ + b32 Result = False; + switch (Value) + { + case Maybe_No: + case Maybe_Yes: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(maybe_tag Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case Maybe_No: { Result = CSz("No"); } break; case Maybe_Yes: { Result = CSz("Yes"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(maybe_tag Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { case Maybe_No: { Result = CSz("Maybe_No"); } break; case Maybe_Yes: { Result = CSz("Maybe_Yes"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -38,6 +61,7 @@ MaybeTag(counted_string S) if (StringsMatch(S, CSz("Maybe_No"))) { return Maybe_No; } if (StringsMatch(S, CSz("Maybe_Yes"))) { return Maybe_Yes; } + return Result; } diff --git a/generated/string_and_value_tables_model_index.h b/generated/string_and_value_tables_model_index.h index 9f48b43a5..1fcb52371 100644 --- a/generated/string_and_value_tables_model_index.h +++ b/generated/string_and_value_tables_model_index.h @@ -1,9 +1,65 @@ -// src/engine/model.h:55:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(model_index Value) +{ + b32 Result = False; + switch (Value) + { + case ModelIndex_None: + case ModelIndex_Enemy_Skeleton_Axe: + case ModelIndex_Enemy_Skeleton_Sword: + case ModelIndex_Enemy_Skeleton_Lasher: + case ModelIndex_Enemy_Skeleton_Archer: + case ModelIndex_Enemy_Skeleton_Spear: + case ModelIndex_Enemy_Skeleton_AxeArmor: + case ModelIndex_Enemy_Skeleton_Hounds: + case ModelIndex_Enemy_Skeleton_Horserider: + case ModelIndex_Enemy_Skeleton_Horsebanner: + case ModelIndex_Enemy_Skeleton_Shaman: + case ModelIndex_Enemy_Skeleton_Champion: + case ModelIndex_Enemy_Skeleton_ChampionChampion: + case ModelIndex_Enemy_Skeleton_Concubiner: + case ModelIndex_Enemy_Skeleton_King: + case ModelIndex_Player_jp: + case ModelIndex_Player_bow: + case ModelIndex_Player_cat: + case ModelIndex_Player_fox: + case ModelIndex_Player_gumi: + case ModelIndex_Player_knight: + case ModelIndex_Player_man: + case ModelIndex_Player_mom: + case ModelIndex_Player_old: + case ModelIndex_Player_poem: + case ModelIndex_Player_rain: + case ModelIndex_Player_sasami: + case ModelIndex_Player_sol: + case ModelIndex_Player_sword: + case ModelIndex_Player_tale: + case ModelIndex_Player_tama: + case ModelIndex_Player_tsurugi: + case ModelIndex_Loot: + case ModelIndex_Projectile: + case ModelIndex_Proton: + case ModelIndex_Bitty0: + case ModelIndex_Bitty1: + case ModelIndex_Level: + case ModelIndex_Count: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(model_index Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case ModelIndex_None: { Result = CSz("None"); } break; @@ -46,15 +102,18 @@ ToStringPrefixless(model_index Type) case ModelIndex_Level: { Result = CSz("Level"); } break; case ModelIndex_Count: { Result = CSz("Count"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(model_index Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -98,9 +157,10 @@ ToString(model_index Type) case ModelIndex_Level: { Result = CSz("ModelIndex_Level"); } break; case ModelIndex_Count: { Result = CSz("ModelIndex_Count"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -149,6 +209,7 @@ ModelIndex(counted_string S) if (StringsMatch(S, CSz("ModelIndex_Level"))) { return ModelIndex_Level; } if (StringsMatch(S, CSz("ModelIndex_Count"))) { return ModelIndex_Count; } + return Result; } diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index 4e4b532f2..f3ce190cf 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,9 +1,30 @@ -// src/engine/editor.cpp:291:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(particle_spawn_type Value) +{ + b32 Result = False; + switch (Value) + { + case ParticleSpawnType_None: + case ParticleSpawnType_Random: + case ParticleSpawnType_Expanding: + case ParticleSpawnType_Contracting: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(particle_spawn_type Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case ParticleSpawnType_None: { Result = CSz("None"); } break; @@ -11,15 +32,18 @@ ToStringPrefixless(particle_spawn_type Type) case ParticleSpawnType_Expanding: { Result = CSz("Expanding"); } break; case ParticleSpawnType_Contracting: { Result = CSz("Contracting"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(particle_spawn_type Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -28,9 +52,10 @@ ToString(particle_spawn_type Type) case ParticleSpawnType_Expanding: { Result = CSz("ParticleSpawnType_Expanding"); } break; case ParticleSpawnType_Contracting: { Result = CSz("ParticleSpawnType_Contracting"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -44,6 +69,7 @@ ParticleSpawnType(counted_string S) if (StringsMatch(S, CSz("ParticleSpawnType_Expanding"))) { return ParticleSpawnType_Expanding; } if (StringsMatch(S, CSz("ParticleSpawnType_Contracting"))) { return ParticleSpawnType_Contracting; } + return Result; } diff --git a/generated/string_and_value_tables_resolution_setting.h b/generated/string_and_value_tables_resolution_setting.h index 5836baa52..91272b924 100644 --- a/generated/string_and_value_tables_resolution_setting.h +++ b/generated/string_and_value_tables_resolution_setting.h @@ -1,24 +1,47 @@ -// src/engine/settings.h:26:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(resolution_setting Value) +{ + b32 Result = False; + switch (Value) + { + case ResolutionSetting_4096x2160: + case ResolutionSetting_1920x1080: + case ResolutionSetting_1280x720: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(resolution_setting Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case ResolutionSetting_4096x2160: { Result = CSz("4096x2160"); } break; case ResolutionSetting_1920x1080: { Result = CSz("1920x1080"); } break; case ResolutionSetting_1280x720: { Result = CSz("1280x720"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(resolution_setting Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -26,9 +49,10 @@ ToString(resolution_setting Type) case ResolutionSetting_1920x1080: { Result = CSz("ResolutionSetting_1920x1080"); } break; case ResolutionSetting_1280x720: { Result = CSz("ResolutionSetting_1280x720"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -41,6 +65,7 @@ ResolutionSetting(counted_string S) if (StringsMatch(S, CSz("ResolutionSetting_1920x1080"))) { return ResolutionSetting_1920x1080; } if (StringsMatch(S, CSz("ResolutionSetting_1280x720"))) { return ResolutionSetting_1280x720; } + return Result; } diff --git a/generated/string_and_value_tables_shader_language_setting.h b/generated/string_and_value_tables_shader_language_setting.h index 651808a10..8cd97c2bf 100644 --- a/generated/string_and_value_tables_shader_language_setting.h +++ b/generated/string_and_value_tables_shader_language_setting.h @@ -1,32 +1,55 @@ -// src/engine/settings.h:32:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(shader_language_setting Value) +{ + b32 Result = False; + switch (Value) + { + case ShaderLanguageSetting_330core: + case ShaderLanguageSetting_310es: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(shader_language_setting Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case ShaderLanguageSetting_330core: { Result = CSz("330core"); } break; case ShaderLanguageSetting_310es: { Result = CSz("310es"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(shader_language_setting Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { case ShaderLanguageSetting_330core: { Result = CSz("ShaderLanguageSetting_330core"); } break; case ShaderLanguageSetting_310es: { Result = CSz("ShaderLanguageSetting_310es"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -38,6 +61,7 @@ ShaderLanguageSetting(counted_string S) if (StringsMatch(S, CSz("ShaderLanguageSetting_330core"))) { return ShaderLanguageSetting_330core; } if (StringsMatch(S, CSz("ShaderLanguageSetting_310es"))) { return ShaderLanguageSetting_310es; } + return Result; } diff --git a/generated/string_and_value_tables_shadow_quality_setting.h b/generated/string_and_value_tables_shadow_quality_setting.h index f671f4a32..dfb7beefd 100644 --- a/generated/string_and_value_tables_shadow_quality_setting.h +++ b/generated/string_and_value_tables_shadow_quality_setting.h @@ -1,9 +1,30 @@ -// src/engine/settings.h:28:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(shadow_quality_setting Value) +{ + b32 Result = False; + switch (Value) + { + case ShadowQualitySetting_High: + case ShadowQualitySetting_Med: + case ShadowQualitySetting_Low: + case ShadowQualitySetting_Off: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(shadow_quality_setting Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case ShadowQualitySetting_High: { Result = CSz("High"); } break; @@ -11,15 +32,18 @@ ToStringPrefixless(shadow_quality_setting Type) case ShadowQualitySetting_Low: { Result = CSz("Low"); } break; case ShadowQualitySetting_Off: { Result = CSz("Off"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(shadow_quality_setting Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -28,9 +52,10 @@ ToString(shadow_quality_setting Type) case ShadowQualitySetting_Low: { Result = CSz("ShadowQualitySetting_Low"); } break; case ShadowQualitySetting_Off: { Result = CSz("ShadowQualitySetting_Off"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -44,6 +69,7 @@ ShadowQualitySetting(counted_string S) if (StringsMatch(S, CSz("ShadowQualitySetting_Low"))) { return ShadowQualitySetting_Low; } if (StringsMatch(S, CSz("ShadowQualitySetting_Off"))) { return ShadowQualitySetting_Off; } + return Result; } diff --git a/generated/string_and_value_tables_shape_axis.h b/generated/string_and_value_tables_shape_axis.h index 9236d2a85..4a9489a2b 100644 --- a/generated/string_and_value_tables_shape_axis.h +++ b/generated/string_and_value_tables_shape_axis.h @@ -1,9 +1,34 @@ -// src/engine/editor.h:94:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(shape_axis Value) +{ + b32 Result = False; + switch (Value) + { + case ShapeAxis_InferFromMajorAxis: + case ShapeAxis_PosX: + case ShapeAxis_NegX: + case ShapeAxis_PosY: + case ShapeAxis_NegY: + case ShapeAxis_PosZ: + case ShapeAxis_NegZ: + case ShapeAxis_Count: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(shape_axis Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case ShapeAxis_InferFromMajorAxis: { Result = CSz("InferFromMajorAxis"); } break; @@ -15,15 +40,18 @@ ToStringPrefixless(shape_axis Type) case ShapeAxis_NegZ: { Result = CSz("NegZ"); } break; case ShapeAxis_Count: { Result = CSz("Count"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(shape_axis Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -36,9 +64,10 @@ ToString(shape_axis Type) case ShapeAxis_NegZ: { Result = CSz("ShapeAxis_NegZ"); } break; case ShapeAxis_Count: { Result = CSz("ShapeAxis_Count"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -56,6 +85,7 @@ ShapeAxis(counted_string S) if (StringsMatch(S, CSz("ShapeAxis_NegZ"))) { return ShapeAxis_NegZ; } if (StringsMatch(S, CSz("ShapeAxis_Count"))) { return ShapeAxis_Count; } + return Result; } diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 3ccd6300c..05c22483e 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,9 +1,32 @@ -// src/engine/editor.h:1070:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(shape_type Value) +{ + b32 Result = False; + switch (Value) + { + case ShapeType_Rect: + case ShapeType_Sphere: + case ShapeType_Line: + case ShapeType_Cylinder: + case ShapeType_Plane: + case ShapeType_Torus: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(shape_type Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case ShapeType_Rect: { Result = CSz("Rect"); } break; @@ -13,15 +36,18 @@ ToStringPrefixless(shape_type Type) case ShapeType_Plane: { Result = CSz("Plane"); } break; case ShapeType_Torus: { Result = CSz("Torus"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(shape_type Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -32,9 +58,10 @@ ToString(shape_type Type) case ShapeType_Plane: { Result = CSz("ShapeType_Plane"); } break; case ShapeType_Torus: { Result = CSz("ShapeType_Torus"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -50,6 +77,7 @@ ShapeType(counted_string S) if (StringsMatch(S, CSz("ShapeType_Plane"))) { return ShapeType_Plane; } if (StringsMatch(S, CSz("ShapeType_Torus"))) { return ShapeType_Torus; } + return Result; } diff --git a/generated/string_and_value_tables_texture_storage_format.h b/generated/string_and_value_tables_texture_storage_format.h index bbdabae42..e4c8d19da 100644 --- a/generated/string_and_value_tables_texture_storage_format.h +++ b/generated/string_and_value_tables_texture_storage_format.h @@ -1,9 +1,38 @@ -// external/bonsai_stdlib/src/to_string.cpp:62:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(texture_storage_format Value) +{ + b32 Result = False; + switch (Value) + { + case TextureStorageFormat_Undefined: + case TextureStorageFormat_R16I: + case TextureStorageFormat_R16F: + case TextureStorageFormat_R32F: + case TextureStorageFormat_RG16F: + case TextureStorageFormat_RG32F: + case TextureStorageFormat_RGB16F: + case TextureStorageFormat_RGB32F: + case TextureStorageFormat_RGBA8: + case TextureStorageFormat_RGBA16F: + case TextureStorageFormat_RGBA32F: + case TextureStorageFormat_Depth32: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(texture_storage_format Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case TextureStorageFormat_Undefined: { Result = CSz("Undefined"); } break; @@ -19,15 +48,18 @@ ToStringPrefixless(texture_storage_format Type) case TextureStorageFormat_RGBA32F: { Result = CSz("RGBA32F"); } break; case TextureStorageFormat_Depth32: { Result = CSz("Depth32"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(texture_storage_format Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -44,9 +76,10 @@ ToString(texture_storage_format Type) case TextureStorageFormat_RGBA32F: { Result = CSz("TextureStorageFormat_RGBA32F"); } break; case TextureStorageFormat_Depth32: { Result = CSz("TextureStorageFormat_Depth32"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -68,6 +101,7 @@ TextureStorageFormat(counted_string S) if (StringsMatch(S, CSz("TextureStorageFormat_RGBA32F"))) { return TextureStorageFormat_RGBA32F; } if (StringsMatch(S, CSz("TextureStorageFormat_Depth32"))) { return TextureStorageFormat_Depth32; } + return Result; } diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index c7d52b105..4de408fd6 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,9 +1,32 @@ -// src/engine/editor.cpp:297:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(tone_mapping_type Value) +{ + b32 Result = False; + switch (Value) + { + case ToneMappingType_None: + case ToneMappingType_Reinhard: + case ToneMappingType_Exposure: + case ToneMappingType_AGX: + case ToneMappingType_AGX_Sepia: + case ToneMappingType_AGX_Punchy: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(tone_mapping_type Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case ToneMappingType_None: { Result = CSz("None"); } break; @@ -13,15 +36,18 @@ ToStringPrefixless(tone_mapping_type Type) case ToneMappingType_AGX_Sepia: { Result = CSz("Sepia"); } break; case ToneMappingType_AGX_Punchy: { Result = CSz("Punchy"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(tone_mapping_type Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -32,9 +58,10 @@ ToString(tone_mapping_type Type) case ToneMappingType_AGX_Sepia: { Result = CSz("ToneMappingType_AGX_Sepia"); } break; case ToneMappingType_AGX_Punchy: { Result = CSz("ToneMappingType_AGX_Punchy"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -50,6 +77,7 @@ ToneMappingType(counted_string S) if (StringsMatch(S, CSz("ToneMappingType_AGX_Sepia"))) { return ToneMappingType_AGX_Sepia; } if (StringsMatch(S, CSz("ToneMappingType_AGX_Punchy"))) { return ToneMappingType_AGX_Punchy; } + return Result; } diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index b2f03c79f..99b748842 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,24 +1,47 @@ -// src/engine/editor.h:756:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(ui_noise_type Value) +{ + b32 Result = False; + switch (Value) + { + case NoiseType_Perlin: + case NoiseType_Voronoi: + case NoiseType_White: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(ui_noise_type Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case NoiseType_Perlin: { Result = CSz("Perlin"); } break; case NoiseType_Voronoi: { Result = CSz("Voronoi"); } break; case NoiseType_White: { Result = CSz("White"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(ui_noise_type Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -26,9 +49,10 @@ ToString(ui_noise_type Type) case NoiseType_Voronoi: { Result = CSz("NoiseType_Voronoi"); } break; case NoiseType_White: { Result = CSz("NoiseType_White"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -41,6 +65,7 @@ UiNoiseType(counted_string S) if (StringsMatch(S, CSz("NoiseType_Voronoi"))) { return NoiseType_Voronoi; } if (StringsMatch(S, CSz("NoiseType_White"))) { return NoiseType_White; } + return Result; } diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index b76202c6d..78cf00b5d 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,9 +1,43 @@ -// src/engine/editor.cpp:142:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(visible_region_size Value) +{ + b32 Result = False; + switch (Value) + { + case VisibleRegionSize_1: + case VisibleRegionSize_2: + case VisibleRegionSize_4: + case VisibleRegionSize_8: + case VisibleRegionSize_16: + case VisibleRegionSize_32: + case VisibleRegionSize_64: + case VisibleRegionSize_128: + case VisibleRegionSize_256: + case VisibleRegionSize_512: + case VisibleRegionSize_1024: + case VisibleRegionSize_2048: + case VisibleRegionSize_4096: + case VisibleRegionSize_8192: + case VisibleRegionSize_16k: + case VisibleRegionSize_32k: + case VisibleRegionSize_64k: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(visible_region_size Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case VisibleRegionSize_1: { Result = CSz("1"); } break; @@ -24,15 +58,18 @@ ToStringPrefixless(visible_region_size Type) case VisibleRegionSize_32k: { Result = CSz("32k"); } break; case VisibleRegionSize_64k: { Result = CSz("64k"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(visible_region_size Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -54,9 +91,10 @@ ToString(visible_region_size Type) case VisibleRegionSize_32k: { Result = CSz("VisibleRegionSize_32k"); } break; case VisibleRegionSize_64k: { Result = CSz("VisibleRegionSize_64k"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -83,6 +121,7 @@ VisibleRegionSize(counted_string S) if (StringsMatch(S, CSz("VisibleRegionSize_32k"))) { return VisibleRegionSize_32k; } if (StringsMatch(S, CSz("VisibleRegionSize_64k"))) { return VisibleRegionSize_64k; } + return Result; } diff --git a/generated/string_and_value_tables_voxel_rule_direction.h b/generated/string_and_value_tables_voxel_rule_direction.h index 197696a0d..2f85f05bf 100644 --- a/generated/string_and_value_tables_voxel_rule_direction.h +++ b/generated/string_and_value_tables_voxel_rule_direction.h @@ -1,9 +1,33 @@ -// src/engine/editor.h:74:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(voxel_rule_direction Value) +{ + b32 Result = False; + switch (Value) + { + case VoxelRuleDir_PosX: + case VoxelRuleDir_NegX: + case VoxelRuleDir_PosY: + case VoxelRuleDir_NegY: + case VoxelRuleDir_PosZ: + case VoxelRuleDir_NegZ: + case VoxelRuleDir_Count: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(voxel_rule_direction Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case VoxelRuleDir_PosX: { Result = CSz("PosX"); } break; @@ -14,15 +38,18 @@ ToStringPrefixless(voxel_rule_direction Type) case VoxelRuleDir_NegZ: { Result = CSz("NegZ"); } break; case VoxelRuleDir_Count: { Result = CSz("Count"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(voxel_rule_direction Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -34,9 +61,10 @@ ToString(voxel_rule_direction Type) case VoxelRuleDir_NegZ: { Result = CSz("VoxelRuleDir_NegZ"); } break; case VoxelRuleDir_Count: { Result = CSz("VoxelRuleDir_Count"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -53,6 +81,7 @@ VoxelRuleDirection(counted_string S) if (StringsMatch(S, CSz("VoxelRuleDir_NegZ"))) { return VoxelRuleDir_NegZ; } if (StringsMatch(S, CSz("VoxelRuleDir_Count"))) { return VoxelRuleDir_Count; } + return Result; } diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 392c13b38..2caad8309 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,9 +1,31 @@ -// src/engine/editor.h:919:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(world_edit_blend_mode Value) +{ + b32 Result = False; + switch (Value) + { + case WorldEdit_Mode_Additive: + case WorldEdit_Mode_Subtractive: + case WorldEdit_Mode_Multiply: + case WorldEdit_Mode_Threshold: + case WorldEdit_Mode_Disabled: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case WorldEdit_Mode_Additive: { Result = CSz("Additive"); } break; @@ -12,15 +34,18 @@ ToStringPrefixless(world_edit_blend_mode Type) case WorldEdit_Mode_Threshold: { Result = CSz("Threshold"); } break; case WorldEdit_Mode_Disabled: { Result = CSz("Disabled"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(world_edit_blend_mode Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -30,9 +55,10 @@ ToString(world_edit_blend_mode Type) case WorldEdit_Mode_Threshold: { Result = CSz("WorldEdit_Mode_Threshold"); } break; case WorldEdit_Mode_Disabled: { Result = CSz("WorldEdit_Mode_Disabled"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -47,6 +73,7 @@ WorldEditBlendMode(counted_string S) if (StringsMatch(S, CSz("WorldEdit_Mode_Threshold"))) { return WorldEdit_Mode_Threshold; } if (StringsMatch(S, CSz("WorldEdit_Mode_Disabled"))) { return WorldEdit_Mode_Disabled; } + return Result; } diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 2aaebb39b..8eb24993c 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,9 +1,31 @@ -// src/engine/editor.h:902:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(world_edit_blend_mode_modifier Value) +{ + b32 Result = False; + switch (Value) + { + case WorldEdit_Modifier_None: + case WorldEdit_ValueModifier_ClampPos: + case WorldEdit_ValueModifier_ClampNeg: + case WorldEdit_ValueModifier_Threshold: + case WorldEdit_ColorModifier_Discard: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case WorldEdit_Modifier_None: { Result = CSz("None"); } break; @@ -12,6 +34,7 @@ ToStringPrefixless(world_edit_blend_mode_modifier Type) case WorldEdit_ValueModifier_Threshold: { Result = CSz("Threshold"); } break; case WorldEdit_ColorModifier_Discard: { Result = CSz("Discard"); } break; + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: @@ -43,13 +66,15 @@ ToStringPrefixless(world_edit_blend_mode_modifier Type) } break; } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(world_edit_blend_mode_modifier Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -59,6 +84,7 @@ ToString(world_edit_blend_mode_modifier Type) case WorldEdit_ValueModifier_Threshold: { Result = CSz("WorldEdit_ValueModifier_Threshold"); } break; case WorldEdit_ColorModifier_Discard: { Result = CSz("WorldEdit_ColorModifier_Discard"); } break; + // TODO(Jesse): This is pretty barf and we could do it in a single allocation, // but the metaprogram might have to be a bit fancier.. default: @@ -77,7 +103,7 @@ ToString(world_edit_blend_mode_modifier Type) } break; } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -92,6 +118,7 @@ WorldEditBlendModeModifier(counted_string S) if (StringsMatch(S, CSz("WorldEdit_ValueModifier_Threshold"))) { return WorldEdit_ValueModifier_Threshold; } if (StringsMatch(S, CSz("WorldEdit_ColorModifier_Discard"))) { return WorldEdit_ColorModifier_Discard; } + return Result; } diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index 0284bb438..f18914772 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,9 +1,30 @@ -// src/engine/editor.h:925:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(world_edit_color_blend_mode Value) +{ + b32 Result = False; + switch (Value) + { + case WorldEdit_ColorBlendMode_ValuePositive: + case WorldEdit_ColorBlendMode_ValueNegative: + case WorldEdit_ColorBlendMode_Surface: + case WorldEdit_ColorBlendMode_Disabled: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case WorldEdit_ColorBlendMode_ValuePositive: { Result = CSz("ValuePositive"); } break; @@ -11,15 +32,18 @@ ToStringPrefixless(world_edit_color_blend_mode Type) case WorldEdit_ColorBlendMode_Surface: { Result = CSz("Surface"); } break; case WorldEdit_ColorBlendMode_Disabled: { Result = CSz("Disabled"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(world_edit_color_blend_mode Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -28,9 +52,10 @@ ToString(world_edit_color_blend_mode Type) case WorldEdit_ColorBlendMode_Surface: { Result = CSz("WorldEdit_ColorBlendMode_Surface"); } break; case WorldEdit_ColorBlendMode_Disabled: { Result = CSz("WorldEdit_ColorBlendMode_Disabled"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -44,6 +69,7 @@ WorldEditColorBlendMode(counted_string S) if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Surface"))) { return WorldEdit_ColorBlendMode_Surface; } if (StringsMatch(S, CSz("WorldEdit_ColorBlendMode_Disabled"))) { return WorldEdit_ColorBlendMode_Disabled; } + return Result; } diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index 6f354e897..cabd2e8f4 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,9 +1,32 @@ -// src/engine/editor.h:790:0 +// external/bonsai_stdlib/src/poof_functions.h:2046:0 +link_internal b32 +IsValid(world_edit_selection_mode Value) +{ + b32 Result = False; + switch (Value) + { + case SelectionMode_Noop: + case SelectionMode_ResizeSingleLinearAxis: + case SelectionMode_ResizeBothLinearAxies: + case SelectionMode_ResizeAllAxies: + case SelectionMode_TranslateLinear: + case SelectionMode_TranslatePlanar: + + { + Result = True; + } + } + return Result; +} + + link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) { + Assert(IsValid(Type)); counted_string Result = {}; + switch (Type) { case SelectionMode_Noop: { Result = CSz("Noop"); } break; @@ -13,15 +36,18 @@ ToStringPrefixless(world_edit_selection_mode Type) case SelectionMode_TranslateLinear: { Result = CSz("TranslateLinear"); } break; case SelectionMode_TranslatePlanar: { Result = CSz("TranslatePlanar"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } link_internal counted_string ToString(world_edit_selection_mode Type) { + Assert(IsValid(Type)); + counted_string Result = {}; switch (Type) { @@ -32,9 +58,10 @@ ToString(world_edit_selection_mode Type) case SelectionMode_TranslateLinear: { Result = CSz("SelectionMode_TranslateLinear"); } break; case SelectionMode_TranslatePlanar: { Result = CSz("SelectionMode_TranslatePlanar"); } break; + } - /* if (Result.Start == 0) { Info("Could not convert value(%d) to (EnumType.name)", Type); } */ + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ return Result; } @@ -50,6 +77,7 @@ WorldEditSelectionMode(counted_string S) if (StringsMatch(S, CSz("SelectionMode_TranslateLinear"))) { return SelectionMode_TranslateLinear; } if (StringsMatch(S, CSz("SelectionMode_TranslatePlanar"))) { return SelectionMode_TranslatePlanar; } + return Result; } diff --git a/generated/string_concat_10.h b/generated/string_concat_10.h index dcddf250b..362762381 100644 --- a/generated/string_concat_10.h +++ b/generated/string_concat_10.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:186:0 - +// external/bonsai_stdlib/src/counted_string.cpp:158:0 link_internal counted_string Concat( cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, cs S6, cs S7, cs S8, cs S9, memory_arena* Memory, umm ExtraChars = 0) { diff --git a/generated/string_concat_2.h b/generated/string_concat_2.h index b2ab665a6..02a7d0d3a 100644 --- a/generated/string_concat_2.h +++ b/generated/string_concat_2.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:170:0 - +// external/bonsai_stdlib/src/counted_string.cpp:158:0 link_internal counted_string Concat( cs S0, cs S1, memory_arena* Memory, umm ExtraChars = 0) { diff --git a/generated/string_concat_3.h b/generated/string_concat_3.h index b1e56041b..64e09c922 100644 --- a/generated/string_concat_3.h +++ b/generated/string_concat_3.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:172:0 - +// external/bonsai_stdlib/src/counted_string.cpp:158:0 link_internal counted_string Concat( cs S0, cs S1, cs S2, memory_arena* Memory, umm ExtraChars = 0) { diff --git a/generated/string_concat_4.h b/generated/string_concat_4.h index 0f135b6a6..9c363c870 100644 --- a/generated/string_concat_4.h +++ b/generated/string_concat_4.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:174:0 - +// external/bonsai_stdlib/src/counted_string.cpp:158:0 link_internal counted_string Concat( cs S0, cs S1, cs S2, cs S3, memory_arena* Memory, umm ExtraChars = 0) { diff --git a/generated/string_concat_5.h b/generated/string_concat_5.h index 3c7206263..603c5cb35 100644 --- a/generated/string_concat_5.h +++ b/generated/string_concat_5.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:176:0 - +// external/bonsai_stdlib/src/counted_string.cpp:158:0 link_internal counted_string Concat( cs S0, cs S1, cs S2, cs S3, cs S4, memory_arena* Memory, umm ExtraChars = 0) { diff --git a/generated/string_concat_6.h b/generated/string_concat_6.h index a1066d201..12bfad8c1 100644 --- a/generated/string_concat_6.h +++ b/generated/string_concat_6.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:178:0 - +// external/bonsai_stdlib/src/counted_string.cpp:158:0 link_internal counted_string Concat( cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, memory_arena* Memory, umm ExtraChars = 0) { diff --git a/generated/string_concat_7.h b/generated/string_concat_7.h index e58cad0e9..e9a8565d4 100644 --- a/generated/string_concat_7.h +++ b/generated/string_concat_7.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:180:0 - +// external/bonsai_stdlib/src/counted_string.cpp:158:0 link_internal counted_string Concat( cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, cs S6, memory_arena* Memory, umm ExtraChars = 0) { diff --git a/generated/string_concat_8.h b/generated/string_concat_8.h index de3c2bb21..c9b588e3c 100644 --- a/generated/string_concat_8.h +++ b/generated/string_concat_8.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:182:0 - +// external/bonsai_stdlib/src/counted_string.cpp:158:0 link_internal counted_string Concat( cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, cs S6, cs S7, memory_arena* Memory, umm ExtraChars = 0) { diff --git a/generated/string_concat_9.h b/generated/string_concat_9.h index a3208f9cf..ad3174e63 100644 --- a/generated/string_concat_9.h +++ b/generated/string_concat_9.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:184:0 - +// external/bonsai_stdlib/src/counted_string.cpp:158:0 link_internal counted_string Concat( cs S0, cs S1, cs S2, cs S3, cs S4, cs S5, cs S6, cs S7, cs S8, memory_arena* Memory, umm ExtraChars = 0) { diff --git a/generated/take_release_sync_lod_element_buffer.h b/generated/take_release_sync_lod_element_buffer.h index f24077e0c..fa744b46d 100644 --- a/generated/take_release_sync_lod_element_buffer.h +++ b/generated/take_release_sync_lod_element_buffer.h @@ -1,5 +1,4 @@ -// src/engine/mesh.cpp:239:0 - +// src/engine/mesh.cpp:121:0 link_internal untextured_3d_geometry_buffer * TakeOwnershipSync( lod_element_buffer *Buf, world_chunk_mesh_bitfield MeshBit) { diff --git a/generated/tiered_mesh_freelist.h b/generated/tiered_mesh_freelist.h index bfe6c128c..c0fe8f04d 100644 --- a/generated/tiered_mesh_freelist.h +++ b/generated/tiered_mesh_freelist.h @@ -1,5 +1,4 @@ -// src/engine/mesh.h:26:0 - +// external/bonsai_stdlib/src/poof_functions.h:1183:0 struct tiered_mesh_freelist { mesh_freelist Start[TIERED_MESH_FREELIST_MAX_ELEMENTS]; diff --git a/generated/to_hex_64_272205387.h b/generated/to_hex_64_272205387.h index 242bb19ec..de9046443 100644 --- a/generated/to_hex_64_272205387.h +++ b/generated/to_hex_64_272205387.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/counted_string.cpp:851:0 - +// external/bonsai_stdlib/src/counted_string.cpp:823:0 link_internal cs ToHex( s64 Value ) { @@ -19,3 +18,4 @@ ToHex( r64 Value ) return Result; } + diff --git a/generated/to_string_primitive_803324607.h b/generated/to_string_primitive_803324607.h index acb1e8c7e..2c67cebe0 100644 --- a/generated/to_string_primitive_803324607.h +++ b/generated/to_string_primitive_803324607.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/to_string.cpp:56:0 - +// external/bonsai_stdlib/src/to_string.cpp:3:0 link_internal cs ToString(s8 *Element) { @@ -61,3 +60,4 @@ ToString(f64 *Element) return Result; } + diff --git a/generated/to_string_texture.h b/generated/to_string_texture.h index b6f31b1d1..d7e468c7d 100644 --- a/generated/to_string_texture.h +++ b/generated/to_string_texture.h @@ -1,16 +1,16 @@ -// external/bonsai_stdlib/src/to_string.cpp:65:0 - +// external/bonsai_stdlib/src/to_string.cpp:36:0 link_internal cs ToString(texture *Element) { cs Result = FSz("ID(%S) Dim(%S) Slices(%S) Channels(%S) IsDepthTexture(%S) Format(%S) DebugName(%S) Queued(%S) ", ToString( & Element->ID) -, ToString( & Element->Dim), - ToString( & Element->Slices), - ToString( & Element->Channels), - ToString( & Element->IsDepthTexture), - ToString( Element->Format), - ToString( & Element->DebugName), - ToString( & Element->Queued)); +, ToString( & Element->Dim) +, ToString( & Element->Slices) +, ToString( & Element->Channels) +, ToString( & Element->IsDepthTexture) +, ToString( Element->Format) +, ToString( & Element->DebugName) +, ToString( & Element->Queued) +); return Result; } diff --git a/generated/to_string_vector_240271411.h b/generated/to_string_vector_240271411.h index 5b71ba2e8..160e9978c 100644 --- a/generated/to_string_vector_240271411.h +++ b/generated/to_string_vector_240271411.h @@ -1,5 +1,4 @@ -// external/bonsai_stdlib/src/to_string.cpp:59:0 - +// external/bonsai_stdlib/src/to_string.cpp:18:0 link_internal cs ToString(v2 *Element) { @@ -15,3 +14,4 @@ ToString(v2i *Element) } + diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 893ca4284..709b3e817 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,5 +1,4 @@ -// src/engine/editor.h:911:0 - +// src/engine/editor.h:134:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, window_layout *Window, @@ -18,6 +17,7 @@ ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, { CSz("Textures"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_Textures")), EngineDebugViewMode_Textures }, { CSz("RenderSettings"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_RenderSettings")), EngineDebugViewMode_RenderSettings }, { CSz("EngineDebug"), {}, UiId(Window, Cast(void*, Element), Cast(void*, "engine_debug_view_mode EngineDebugViewMode_EngineDebug")), EngineDebugViewMode_EngineDebug }, + }; ui_toggle_button_handle_buffer ButtonBuffer = { diff --git a/generated/tuple_822959015.h b/generated/tuple_822959015.h index 137cca18c..03566adfb 100644 --- a/generated/tuple_822959015.h +++ b/generated/tuple_822959015.h @@ -1,9 +1,9 @@ -// external/bonsai_stdlib/src/counted_string.cpp:29:0 - +// external/bonsai_stdlib/src/poof_functions.h:680:0 struct tuple_cs_cs { cs E0; cs E1; + }; /* poof_bind( TupleType <- { tuple_(Types.map.sep(_) (T) {(T.name)} } )*/ @@ -17,6 +17,7 @@ Tuple( cs E0, cs E1 ) { .E0 = E0, .E1 = E1, + }; return Result; } diff --git a/generated/vertex_data_functions_v3.h b/generated/vertex_data_functions_v3.h index 18e384977..193dcd646 100644 --- a/generated/vertex_data_functions_v3.h +++ b/generated/vertex_data_functions_v3.h @@ -1,5 +1,4 @@ -// src/engine/voxel_face.h:213:0 - +// src/engine/voxel_face.h:72:0 inline void RightFaceVertexData( v3 MinP, v3 Diameter, v3 *Result) { diff --git a/generated/vertex_data_functions_v3_u8.h b/generated/vertex_data_functions_v3_u8.h index ed2dd68f8..d0f7a2ac1 100644 --- a/generated/vertex_data_functions_v3_u8.h +++ b/generated/vertex_data_functions_v3_u8.h @@ -1,5 +1,4 @@ -// src/engine/voxel_face.h:216:0 - +// src/engine/voxel_face.h:72:0 inline void RightFaceVertexData( v3_u8 MinP, v3 Diameter, v3_u8 *Result) { diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 85865a4fa..cc26806eb 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.cpp:2061:0 - +// src/engine/world_chunk.cpp:1454:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 *FaceMasks, diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index e874e2030..4e63f5b28 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -1,5 +1,4 @@ -// src/engine/world_chunk.cpp:2064:0 - +// src/engine/world_chunk.cpp:1454:0 link_internal void BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 *FaceMasks, diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 092933627a36ae163811a43421f859c14dd57521..aab1386d624d04fe6a0a97776a3ee6404147e796 100644 GIT binary patch delta 2371 zcmY*bU2L0I8SZiX{}bDB94B^?&rTf2Kgs9Vj$=De!C$ zL@TOBBShhDYaZ=}OLJ zUvDT#7MJmyAqH!4l)ZrCR1ELUq}lT)s{yoU+;}w?qYQlZseC?{$>#HESxw?77&oiC zwQKTvqk+}wOK?wUxh_lxaoZWk2L%W24kYNW3(cW8UMpDHvvhj_Un%q>P>A8pv>pG+ zhfvOM;J8=9a?yshOqac?>?zffs+2dBCjOi&;9gw&_{&^~N{nHZb>h1@2abj$G;)Ks zmLgzi$?BIW@hLo<^0HYRI|}Anz0y)-RlB!5)z8L}>WLvZWnx!EE`P`lV=23We@#Ba zR`?d&$a?XL*Mh_N5I*$x;@gwm=$b52lvdv(X2qwOFz(Gs{JU|zysb3LXm}D>$a{=R ztzBtfM>3rNkBnrxSc>0iYN*#+mGu@@6T`TfcN|O@@%?lUb^9znOD!^)+Bv4%P*5w# zdZkH=Pt#%1%x|V_)WEwFX+%;Ibm15s?6Or#?fTYM^`y9`tXq|uQrb|~cDLZ1IFFB# zvw{t-z5)C$X~q-MH12eobgGt2TWL1Sl^SY8GMq^(hUcd7N7;^L`I4YRFd$j9N@R7N zQwB%l61sFTY>a0$Yz@1WukBV491Kx8o%s8h2M_ z-dP)hbF&y6veSjf4l;|7llshS=U}?Fe|Z5A6L| z&U9fg>%vjLkDV9Qey2Z3eJOUdGIXvffqw@i-hxEjEW|3S7ljwx3i#M%LH79od6)l5 zrrF8selOj)gf(jOhkmzxkLX=*3dk>FClbZ|z9^X|SIM{fy2;9(7Di1RwC?PdNouu9 zy@rrKN&W01-#)>}vR!UBD=*6GirCuS>p5x8&wWm!tVXF9eLYN&5%r(}4|Hy~lu zxQ@fDamgmVU92ql_kMQ~ zsUmk|3--JFwHqyK)p~tf`1`(#*y`bq@`Ny5K9e3XC)PcAxI6*&b#cmDU1wPhDR;GF zlYoBHtzyExb2=AX?jZJEn@kb0KXA<$OS^elJhL<{g zw4TPL4kII(h&rNZ=$@xBa+NId?nK^@p{K-^(>#94251!KP@}oYUlS*_BEjs$)8ka~ h_Rq4yTa&kMIPT@<-_{xQXU?24VR1>i_h>P~{tM$j`3?X8 delta 2399 zcmY*bYfM|`8O~>HAK#6!T>}Pu0Rpzc7>v0X3?^+xGYExg6{?iRIp7068@}Y&uxx9W zR8y-eQWxOS_M?+l(xyMUNlT_qt29l^F3PVZTF5l*$D}HoCT)`@b<-~W(QWMgJ{y$% zJLkK+=Y5~|d7k&&dX3$BjqNVtawf2MrxVwrQQRJvaBn7sZbO8g+wip+37@f#Tjgq1 zspZssyzl~kH<`wtGhw=xfje`NE$SKZ=~gUHEi{e93pfl7VtUG>D~=+bUKKa4>RaGXd+~TO zg?p2Jmft%Z#fy_kwjjRdne?z($h|}8GD)~GVALylwT7FK5E7k!T%WMP)fo^u+#Yve zcEZI{xY-}WC*yW@_Q{JDelfSEZC49;*b~E5y$$7Y9~;M>W5isoY1`|ycwq%|$wl*y zvR*4|@xl^rjtt}aSPk#ARFpS1;)V14q;7KyhmLl!wVUc;pXG~EO}SFr z))cVOF@6F69<@9f0Pl@XP*4k@<-l{Jc3id|2k%8TSz;F{${d2pAey{l$5hqUFBE09 zggdEEq2e{-FMVeAqBvIZ2G}b9EFKR#2;l$+##~j4`JB9SWduL<58z?Ks4HZ#GBJt4 zW(gzxgS2GEKm1X=m5}gre+=b>ku7oT`x2dO6f%og^2*xwW-hPEU%*5CATIR;41y>7 zL!W1BoD{L4DXhd7@cY5b^@Vo_GpxjStnp`z8%b*U=lI*bfwL_8L@(?ZF-4Fbn8&|j z{`$?`SOz!sQCy6fF=vUu8SBL>Q3YqBv+Q}1_#4SCyd9Yrq<}W1^Q-OQ0DuoR$Mc>C>s~s$EiCQ0Y znOH*X9(74Pb^V6ArQo?pH!gXD=;(4aI%v_!6&ysuobH`lAM+Onl^=!2`F%c&%xne#Q4` zLC|cd6RSQ4J13N5^0|rgg0|A;7B6&GtbZqECT}HEFl?(AwpIMnJ4rI-Chdw2W|^{Rz!Wv z=iK*(@e?xMV1EmOp((va+!I(4>i9v6n@BD4Y-Hrh#Ncj8;j6Aq()}`9sB0o%D35E4AxPqmt#Ygt9YB15d=Y78JRXD=IuqIE*vsayj64IeTq-GE13gZRiUVa0xi4ssDo$k@F?n+JY7zU4IHW7|{M zwWY-Vn^p_HVryYpo_xaQCr=Z~$C1@U*1t+kmwPAlYP>Li;*lY%2N-U}rIs+>NQTG~ zm*}V{f!@7lt_Ggf3w1zT$eOKqWNsz0MjPN9I;Ls0;}}sK(foYWGmbkZFWK+>i6MK~ zJP&eT3Nx<9n53!lmii?Hvag%wsuhb;kX_T)&3Mz;gMu+4TxQYOA(R%i z6lAhvo|iBfPF-7WyONh{BH6lKa6W(2V5W|o!ylR>_>cZHaV&{K K{(t9Av;P77P7_f8 diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index 8a80cb663..92068f728 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -343,7 +343,7 @@ WorkQueueEntry( particle_system *System, v3 EntityDelta, v3 RenderSpaceP, r32 dt link_internal void -HandleJob(volatile work_queue_entry *Entry, thread_local_state *Thread, application_api *GameApi) +HandleJob(work_queue_entry *Entry, thread_local_state *Thread, application_api *GameApi) { if ( GameApi->WorkerMain && GameApi->WorkerMain(Entry, Thread)) From 68562048a177fd42c42abebab3eddea525bdf38c Mon Sep 17 00:00:00 2001 From: a pirate Date: Fri, 24 Oct 2025 11:22:23 -0700 Subject: [PATCH 361/421] Update poof --- external/bonsai_stdlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 6f8de62ef..2d4679743 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 6f8de62ef523b74ba600e0ed63295558c93a7295 +Subproject commit 2d46797439562aa406c87b8d932cc63d6d68e368 From 71e5b0c069fd784e4384ce62e39752c768b9a1c8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 27 Oct 2025 10:16:28 -0700 Subject: [PATCH 362/421] Updated poof, synthesize shader uniforms from struct --- examples/terrain_gen/game.cpp | 2 +- generated/are_equal_bonsai_type_info.h | 2 +- generated/are_equal_debug_profile_scope.h | 2 +- generated/are_equal_file_traversal_node.h | 2 +- generated/are_equal_memory_arena_stats.h | 2 +- generated/are_equal_octree_node.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_rect3cp.h | 2 +- generated/are_equal_render_settings.h | 2 +- generated/are_equal_struct.h | 2 +- generated/are_equal_texture.h | 2 +- generated/are_equal_ui_toggle.h | 2 +- ..._voxel_synthesis_change_propagation_info.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- generated/are_equal_xml_property.h | 2 +- generated/are_equal_xml_tag.h | 2 +- generated/are_equal_xml_token.h | 2 +- generated/block_array_bitmap_688853862.h | 2 +- .../block_array_c_asset_thumbnail_688856411.h | 2 +- ...g_block_counted_string_block_array_index.h | 2 +- ...ntity_ptr_688856411_struct_struct_struct.h | 2 +- generated/block_array_c_gpu_timer_688735882.h | 2 +- .../block_array_c_shader_ptr_688853971.h | 2 +- generated/block_array_c_texture_688856411.h | 2 +- generated/block_array_c_u32_688856411.h | 2 +- generated/block_array_c_u8_cursor_688856411.h | 2 +- ...k_queue_entry_build_chunk_mesh_688853862.h | 2 +- generated/block_array_entity_688856407.h | 2 +- .../block_array_entity_ptr_688856411_h.h | 2 +- ...lock_array_file_traversal_node_688853862.h | 2 +- ...lock_array_gpu_readback_buffer_688853862.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- ...88853862_0_889429130_894106509_562163350.h | 2 +- .../block_array_h_gpu_timer_688735882_0.h | 2 +- .../block_array_h_shader_ptr_688853972_0.h | 183 +++++ generated/block_array_h_texture_688856411.h | 2 +- generated/block_array_h_texture_688856411_0.h | 2 +- generated/block_array_h_u32_688856411.h | 2 +- generated/block_array_h_u8_cursor_688856411.h | 2 +- ...lock_array_h_world_chunk_ptr_688853862_0.h | 2 +- generated/block_array_member_info_688856411.h | 2 +- generated/block_array_model_688856411.h | 2 +- .../block_array_octree_node_ptr_688853862.h | 2 +- ...block_array_picked_octree_node_688853862.h | 2 +- .../block_array_standing_spot_688853862.h | 2 +- generated/block_array_texture_ptr_688856411.h | 2 +- generated/block_array_vox_data_688856411.h | 2 +- ...lock_array_voxel_stack_element_688853862.h | 2 +- .../block_array_world_chunk_ptr_688853862.h | 2 +- ...y_world_edit_block_array_index_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/buffer_asset.h | 2 +- generated/buffer_bitmap.h | 2 +- generated/buffer_bonsai_type_info.h | 2 +- generated/buffer_builder_tuple_cs_cs.h | 2 +- generated/buffer_c_struct_u32.h | 2 +- generated/buffer_c_struct_u64.h | 2 +- generated/buffer_c_token.h | 2 +- generated/buffer_c_token_buffer.h | 2 +- generated/buffer_counted_string.h | 2 +- generated/buffer_file_traversal_node.h | 2 +- generated/buffer_h_struct_u32.h | 2 +- generated/buffer_model.h | 2 +- generated/buffer_octree_node_ptr.h | 2 +- generated/buffer_rect3i.h | 2 +- generated/buffer_sort_key.h | 2 +- generated/buffer_standing_spot.h | 2 +- generated/buffer_thread_main_callback_type.h | 2 +- generated/buffer_tile_ruleset.h | 2 +- generated/buffer_u32.h | 2 +- generated/buffer_u64.h | 2 +- generated/buffer_ui_toggle_button_handle.h | 2 +- generated/buffer_v3i.h | 2 +- generated/buffer_voxel_synth_tile.h | 2 +- generated/buffer_world_chunk_ptr.h | 2 +- generated/cursor_v3i.h | 2 +- ..._work_queue_entry__bonsai_render_command.h | 2 +- .../d_union_constructors_work_queue_entry.h | 2 +- generated/deep_copy_u32_stream.h | 2 +- .../flatten_block_array_file_traversal_node.h | 2 +- generated/for_datatypes_Bxw4Q7AW.h | 30 +- generated/for_datatypes_IXWy6K9V.h | 757 +++++++++++++----- generated/for_datatypes_cx51CcgQ.h | 6 +- generated/for_datatypes_khY6kwEk.h | 3 +- generated/freelist_allocator_octree_node.h | 2 +- generated/freelist_allocator_world_chunk.h | 2 +- generated/gen_common_vector_v2.h | 2 +- generated/gen_common_vector_v3.h | 2 +- generated/gen_common_vector_v3i.h | 2 +- .../gen_constructor_gpu_readback_buffer.h | 2 +- generated/gen_constructor_perlin_params.h | 2 +- generated/gen_constructor_vertex_material.h | 2 +- generated/gen_constructor_voxel_lighting.h | 2 +- .../gen_constructor_voxel_stack_element.h | 2 +- ..._voxel_synthesis_change_propagation_info.h | 2 +- ...n_default_equality_operator_tile_rule_id.h | 2 +- .../gen_default_equality_operator_ui_id.h | 2 +- .../gen_hetero_vector_operators_v2_v2i.h | 2 +- .../gen_hetero_vector_operators_v2i_v2.h | 2 +- .../gen_hetero_vector_operators_v3_u8_v3.h | 2 +- .../gen_hetero_vector_operators_v3_u8_v3i.h | 2 +- .../gen_hetero_vector_operators_v3_v3i.h | 2 +- .../gen_hetero_vector_operators_v3i_v3.h | 2 +- generated/gen_lerp_f32.h | 2 +- generated/gen_lerp_v2.h | 2 +- generated/gen_lerp_v3.h | 2 +- generated/gen_shader_uniform_push_camera.h | 6 +- generated/gen_shader_uniform_push_light.h | 6 +- generated/gen_shader_uniform_push_m4.h | 6 +- generated/gen_shader_uniform_push_r32.h | 6 +- generated/gen_shader_uniform_push_s32.h | 6 +- generated/gen_shader_uniform_push_texture.h | 6 +- generated/gen_shader_uniform_push_u32.h | 6 +- generated/gen_shader_uniform_push_v2.h | 6 +- generated/gen_shader_uniform_push_v3.h | 6 +- generated/gen_vector_area_v2.h | 2 +- generated/gen_vector_area_v2i.h | 2 +- .../gen_vector_infix_operator_v3i_688856393.h | 2 +- .../gen_vector_infix_operator_v3i_688856449.h | 2 +- generated/gen_vector_normalize_funcs_v2.h | 2 +- generated/gen_vector_normalize_funcs_v3.h | 2 +- generated/gen_vector_operators_v2.h | 2 +- generated/gen_vector_operators_v2i.h | 2 +- generated/gen_vector_operators_v3.h | 2 +- generated/gen_vector_operators_v3_u8.h | 2 +- generated/gen_vector_operators_v3i.h | 2 +- generated/gen_vector_operators_v4.h | 2 +- .../generate_cursor_debug_profile_scope.h | 2 +- ...generate_cursor_functions_c_token_cursor.h | 2 +- generated/generate_cursor_functions_u64.h | 2 +- generated/generate_cursor_octree_node.h | 2 +- generated/generate_cursor_parser.h | 2 +- generated/generate_cursor_struct_u64.h | 2 +- generated/generate_cursor_texture.h | 2 +- generated/generate_cursor_u8.h | 2 +- generated/generate_cursor_v3.h | 2 +- .../generate_cursor_voxel_stack_element.h | 2 +- generated/generate_stack_octree_node_ptr_0.h | 2 +- ...thesis_change_propagation_info_803395170.h | 2 +- generated/generate_stream_c_token_buffer.h | 2 +- .../generate_stream_compact_standing_spot.h | 2 +- generated/generate_stream_compact_u32.h | 2 +- generated/generate_stream_compact_u64.h | 2 +- generated/generate_stream_compact_v3i.h | 2 +- generated/generate_stream_parser.h | 2 +- generated/generate_stream_standing_spot.h | 2 +- ...rate_stream_tagged_counted_string_stream.h | 2 +- generated/generate_stream_tuple_cs_cs.h | 2 +- generated/generate_stream_u64.h | 2 +- generated/generate_stream_v3i.h | 2 +- generated/generate_string_table_Chunk_ID.h | 2 +- .../generate_string_table_asset_load_state.h | 2 +- .../generate_string_table_c_token_type.h | 2 +- ...erate_string_table_entity_behavior_flags.h | 2 +- .../generate_string_table_entity_state.h | 2 +- .../generate_string_table_parse_error_code.h | 2 +- .../generate_string_table_text_encoding.h | 2 +- ...enerate_string_table_token_cursor_source.h | 2 +- ...e_string_table_world_chunk_mesh_bitfield.h | 2 +- ...rate_string_table_world_chunk_mesh_index.h | 2 +- generated/hashtable_bonsai_type_info.h | 2 +- generated/hashtable_counted_string.h | 2 +- ...table_get_bonsai_type_info_902_689333910.h | 2 +- ...htable_get_ptr_ui_toggle_31501_688856534.h | 2 +- ...et_ptr_window_layout_705671517_599498827.h | 2 +- ...32_hashtable_wrapper_688719149_688856424.h | 2 +- .../hashtable_get_ui_toggle_31501_688856534.h | 2 +- ...le_get_window_layout_705671517_599498827.h | 2 +- generated/hashtable_impl_u32.h | 2 +- generated/hashtable_impl_ui_toggle.h | 2 +- generated/hashtable_impl_window_layout.h | 2 +- generated/hashtable_impl_xml_tag.h | 2 +- generated/hashtable_parser.h | 2 +- generated/hashtable_struct_u32.h | 2 +- generated/hashtable_struct_ui_toggle.h | 2 +- generated/hashtable_struct_window_layout.h | 2 +- generated/hashtable_struct_xml_tag.h | 2 +- .../hashtable_to_buffer_bonsai_type_info.h | 2 +- generated/hashtable_voxel_synth_tile.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- generated/index_of_counted_string.h | 2 +- generated/maybe_asset_id.h | 2 +- generated/maybe_asset_ptr.h | 2 +- generated/maybe_bonsai_type_info.h | 2 +- generated/maybe_chunk_data.h | 2 +- generated/maybe_entity_ptr.h | 2 +- generated/maybe_file_traversal_node.h | 2 +- generated/maybe_model_buffer.h | 2 +- generated/maybe_standing_spot.h | 2 +- generated/maybe_u32.h | 2 +- generated/maybe_ui_toggle.h | 2 +- generated/maybe_ui_toggle_ptr.h | 2 +- generated/maybe_v3.h | 2 +- generated/maybe_v3i.h | 2 +- generated/maybe_window_layout.h | 2 +- generated/maybe_window_layout_ptr.h | 2 +- .../shader_magic_textured_quad_render_pass.h | 64 +- generated/static_cursor_v2_0_986190493.h | 2 +- .../staticbuffer_u32_cursor_ptr_961996651.h | 2 +- generated/stream_and_cursor_counted_string.h | 2 +- generated/stream_and_cursor_s32.h | 2 +- generated/stream_and_cursor_u32.h | 2 +- .../string_and_value_tables_asset_type.h | 2 +- ...and_value_tables_bitmap_compression_type.h | 2 +- .../string_and_value_tables_chunk_flag.h | 2 +- generated/string_and_value_tables_data_type.h | 2 +- ..._and_value_tables_engine_debug_view_mode.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- ...ing_and_value_tables_file_traversal_node.h | 2 +- ...nd_value_tables_lighting_quality_setting.h | 2 +- generated/string_and_value_tables_log_level.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_model_index.h | 2 +- ...ing_and_value_tables_particle_spawn_type.h | 2 +- ...ring_and_value_tables_resolution_setting.h | 2 +- ...and_value_tables_shader_language_setting.h | 2 +- ..._and_value_tables_shadow_quality_setting.h | 2 +- .../string_and_value_tables_shape_axis.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- ..._and_value_tables_texture_storage_format.h | 2 +- ...tring_and_value_tables_tone_mapping_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...ing_and_value_tables_visible_region_size.h | 2 +- ...ng_and_value_tables_voxel_rule_direction.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- generated/tiered_mesh_freelist.h | 2 +- generated/tuple_822959015.h | 2 +- jesse.bonsai.rdbg | Bin 17188 -> 17188 bytes src/engine/api.cpp | 4 +- src/engine/graphics.h | 13 +- src/engine/shader.cpp | 10 +- 235 files changed, 1067 insertions(+), 489 deletions(-) create mode 100644 generated/block_array_h_shader_ptr_688853972_0.h diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 547b8d170..4b0e5b372 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -56,7 +56,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() InitializeEasingFunctionVisualizerRenderPass_Async( RenderQ, &GameState->EasingFunctionVisRP, - 0,0, + EasingFunction, 0); /* InitializeEasingFunctionVisualizerRenderPass_Async( */ diff --git a/generated/are_equal_bonsai_type_info.h b/generated/are_equal_bonsai_type_info.h index eaae82322..e40b6b677 100644 --- a/generated/are_equal_bonsai_type_info.h +++ b/generated/are_equal_bonsai_type_info.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(bonsai_type_info *Thing1, bonsai_type_info *Thing2) { diff --git a/generated/are_equal_debug_profile_scope.h b/generated/are_equal_debug_profile_scope.h index 94baeb23a..b5cfd24e1 100644 --- a/generated/are_equal_debug_profile_scope.h +++ b/generated/are_equal_debug_profile_scope.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(debug_profile_scope *Thing1, debug_profile_scope *Thing2) { diff --git a/generated/are_equal_file_traversal_node.h b/generated/are_equal_file_traversal_node.h index 7596bc873..63428edd0 100644 --- a/generated/are_equal_file_traversal_node.h +++ b/generated/are_equal_file_traversal_node.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(file_traversal_node *Thing1, file_traversal_node *Thing2) { diff --git a/generated/are_equal_memory_arena_stats.h b/generated/are_equal_memory_arena_stats.h index 59f86f545..02d9b0f70 100644 --- a/generated/are_equal_memory_arena_stats.h +++ b/generated/are_equal_memory_arena_stats.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(memory_arena_stats *Thing1, memory_arena_stats *Thing2) { diff --git a/generated/are_equal_octree_node.h b/generated/are_equal_octree_node.h index 6a71a01b5..bda190fa5 100644 --- a/generated/are_equal_octree_node.h +++ b/generated/are_equal_octree_node.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(octree_node *Thing1, octree_node *Thing2) { diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index 59ce6dc7a..e5bab41c2 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) { diff --git a/generated/are_equal_rect3cp.h b/generated/are_equal_rect3cp.h index 635bca7a0..92d80d293 100644 --- a/generated/are_equal_rect3cp.h +++ b/generated/are_equal_rect3cp.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(rect3cp *Thing1, rect3cp *Thing2) { diff --git a/generated/are_equal_render_settings.h b/generated/are_equal_render_settings.h index d92034119..578e734e5 100644 --- a/generated/are_equal_render_settings.h +++ b/generated/are_equal_render_settings.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(render_settings *Thing1, render_settings *Thing2) { diff --git a/generated/are_equal_struct.h b/generated/are_equal_struct.h index a48029a01..ceea8c08a 100644 --- a/generated/are_equal_struct.h +++ b/generated/are_equal_struct.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) { diff --git a/generated/are_equal_texture.h b/generated/are_equal_texture.h index b55db6bf5..4473975db 100644 --- a/generated/are_equal_texture.h +++ b/generated/are_equal_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(texture *Thing1, texture *Thing2) { diff --git a/generated/are_equal_ui_toggle.h b/generated/are_equal_ui_toggle.h index bf8940eb1..ed9d34054 100644 --- a/generated/are_equal_ui_toggle.h +++ b/generated/are_equal_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(ui_toggle *Thing1, ui_toggle *Thing2) { diff --git a/generated/are_equal_voxel_synthesis_change_propagation_info.h b/generated/are_equal_voxel_synthesis_change_propagation_info.h index 24d7aafb4..49f9f8eb5 100644 --- a/generated/are_equal_voxel_synthesis_change_propagation_info.h +++ b/generated/are_equal_voxel_synthesis_change_propagation_info.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(voxel_synthesis_change_propagation_info *Thing1, voxel_synthesis_change_propagation_info *Thing2) { diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 4addc41a6..6db62aae7 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) { diff --git a/generated/are_equal_xml_property.h b/generated/are_equal_xml_property.h index fe96925e8..c2611b3b8 100644 --- a/generated/are_equal_xml_property.h +++ b/generated/are_equal_xml_property.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(xml_property *Thing1, xml_property *Thing2) { diff --git a/generated/are_equal_xml_tag.h b/generated/are_equal_xml_tag.h index 5e39e2ad4..269153283 100644 --- a/generated/are_equal_xml_tag.h +++ b/generated/are_equal_xml_tag.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(xml_tag *Thing1, xml_tag *Thing2) { diff --git a/generated/are_equal_xml_token.h b/generated/are_equal_xml_token.h index 4265ff348..0e9762877 100644 --- a/generated/are_equal_xml_token.h +++ b/generated/are_equal_xml_token.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:624:0 +// external/bonsai_stdlib/src/poof_functions.h:626:0 link_internal b32 AreEqual(xml_token *Thing1, xml_token *Thing2) { diff --git a/generated/block_array_bitmap_688853862.h b/generated/block_array_bitmap_688853862.h index 13293436e..5c638dbd7 100644 --- a/generated/block_array_bitmap_688853862.h +++ b/generated/block_array_bitmap_688853862.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_c_asset_thumbnail_688856411.h b/generated/block_array_c_asset_thumbnail_688856411.h index 6fab3b976..20fa0037e 100644 --- a/generated/block_array_c_asset_thumbnail_688856411.h +++ b/generated/block_array_c_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2375:0 +// external/bonsai_stdlib/src/poof_functions.h:2377:0 diff --git a/generated/block_array_c_counted_string_688853862_counted_string_block_array_counted_string_block_counted_string_block_array_index.h b/generated/block_array_c_counted_string_688853862_counted_string_block_array_counted_string_block_counted_string_block_array_index.h index 5eda31623..c521d4d83 100644 --- a/generated/block_array_c_counted_string_688853862_counted_string_block_array_counted_string_block_counted_string_block_array_index.h +++ b/generated/block_array_c_counted_string_688853862_counted_string_block_array_counted_string_block_counted_string_block_array_index.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2375:0 +// external/bonsai_stdlib/src/poof_functions.h:2377:0 diff --git a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h index 84c7fe7d7..151f09891 100644 --- a/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h +++ b/generated/block_array_c_entity_ptr_688856411_struct_struct_struct.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2375:0 +// external/bonsai_stdlib/src/poof_functions.h:2377:0 diff --git a/generated/block_array_c_gpu_timer_688735882.h b/generated/block_array_c_gpu_timer_688735882.h index a18b28110..26f115cf2 100644 --- a/generated/block_array_c_gpu_timer_688735882.h +++ b/generated/block_array_c_gpu_timer_688735882.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2375:0 +// external/bonsai_stdlib/src/poof_functions.h:2377:0 diff --git a/generated/block_array_c_shader_ptr_688853971.h b/generated/block_array_c_shader_ptr_688853971.h index 9ddd20e70..5c2376230 100644 --- a/generated/block_array_c_shader_ptr_688853971.h +++ b/generated/block_array_c_shader_ptr_688853971.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2375:0 +// external/bonsai_stdlib/src/poof_functions.h:2377:0 diff --git a/generated/block_array_c_texture_688856411.h b/generated/block_array_c_texture_688856411.h index bf3779043..97c67a6c8 100644 --- a/generated/block_array_c_texture_688856411.h +++ b/generated/block_array_c_texture_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2375:0 +// external/bonsai_stdlib/src/poof_functions.h:2377:0 diff --git a/generated/block_array_c_u32_688856411.h b/generated/block_array_c_u32_688856411.h index 252abdaca..cf05d0f51 100644 --- a/generated/block_array_c_u32_688856411.h +++ b/generated/block_array_c_u32_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2375:0 +// external/bonsai_stdlib/src/poof_functions.h:2377:0 diff --git a/generated/block_array_c_u8_cursor_688856411.h b/generated/block_array_c_u8_cursor_688856411.h index 264057966..462ecec10 100644 --- a/generated/block_array_c_u8_cursor_688856411.h +++ b/generated/block_array_c_u8_cursor_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2375:0 +// external/bonsai_stdlib/src/poof_functions.h:2377:0 diff --git a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h index 97b922590..0edc9af52 100644 --- a/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h +++ b/generated/block_array_dummy_work_queue_entry_build_chunk_mesh_688853862.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_entity_688856407.h b/generated/block_array_entity_688856407.h index a58e770fd..ea3bdf20f 100644 --- a/generated/block_array_entity_688856407.h +++ b/generated/block_array_entity_688856407.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_entity_ptr_688856411_h.h b/generated/block_array_entity_ptr_688856411_h.h index d26d02171..05db4d242 100644 --- a/generated/block_array_entity_ptr_688856411_h.h +++ b/generated/block_array_entity_ptr_688856411_h.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2208:0 +// external/bonsai_stdlib/src/poof_functions.h:2210:0 diff --git a/generated/block_array_file_traversal_node_688853862.h b/generated/block_array_file_traversal_node_688853862.h index 45c56dd4c..9c245a9b7 100644 --- a/generated/block_array_file_traversal_node_688853862.h +++ b/generated/block_array_file_traversal_node_688853862.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_gpu_readback_buffer_688853862.h b/generated/block_array_gpu_readback_buffer_688853862.h index f26f8e8e3..e91c533e1 100644 --- a/generated/block_array_gpu_readback_buffer_688853862.h +++ b/generated/block_array_gpu_readback_buffer_688853862.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 3e74a1176..d4031241e 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2208:0 +// external/bonsai_stdlib/src/poof_functions.h:2210:0 diff --git a/generated/block_array_h_counted_string_688853862_0_889429130_894106509_562163350.h b/generated/block_array_h_counted_string_688853862_0_889429130_894106509_562163350.h index 9fa4e9fa5..7e327ae00 100644 --- a/generated/block_array_h_counted_string_688853862_0_889429130_894106509_562163350.h +++ b/generated/block_array_h_counted_string_688853862_0_889429130_894106509_562163350.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2208:0 +// external/bonsai_stdlib/src/poof_functions.h:2210:0 diff --git a/generated/block_array_h_gpu_timer_688735882_0.h b/generated/block_array_h_gpu_timer_688735882_0.h index 1d9c88c88..e04f8127d 100644 --- a/generated/block_array_h_gpu_timer_688735882_0.h +++ b/generated/block_array_h_gpu_timer_688735882_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2208:0 +// external/bonsai_stdlib/src/poof_functions.h:2210:0 diff --git a/generated/block_array_h_shader_ptr_688853972_0.h b/generated/block_array_h_shader_ptr_688853972_0.h new file mode 100644 index 000000000..53cd263da --- /dev/null +++ b/generated/block_array_h_shader_ptr_688853972_0.h @@ -0,0 +1,183 @@ +// external/bonsai_stdlib/src/poof_functions.h:2210:0 + + + + +struct shader_ptr_block +{ + /* u32 Index; */ + umm At; + shader_ptr Elements[64]; +}; + +struct shader_ptr_block_array_index +{ + umm Index; +}; + +struct shader_ptr_block_array +{ + shader_ptr_block **BlockPtrs; poof(@array_length(Element->BlockCount)) + u32 BlockCount; + u32 ElementCount; + memory_arena *Memory; poof(@no_serialize) + +}; + +link_internal shader_ptr_block_array +ShaderPtrBlockArray(memory_arena *Memory) +{ + shader_ptr_block_array Result = {}; + Result.Memory = Memory; + return Result; +} + +link_internal b32 +AreEqual(shader_ptr_block_array_index *Thing1, shader_ptr_block_array_index *Thing2) +{ + if (Thing1 && Thing2) + { + b32 Result = MemoryIsEqual((u8*)Thing1, (u8*)Thing2, sizeof( shader_ptr_block_array_index ) ); + + return Result; + } + else + { + return (Thing1 == Thing2); + } +} + +link_internal b32 +AreEqual(shader_ptr_block_array_index Thing1, shader_ptr_block_array_index Thing2) +{ + b32 Result = MemoryIsEqual((u8*)&Thing1, (u8*)&Thing2, sizeof( shader_ptr_block_array_index ) ); + + return Result; +} + + +typedef shader_ptr_block_array shader_ptr_paged_list; + +link_internal shader_ptr_block_array_index +operator++( shader_ptr_block_array_index &I0 ) +{ + I0.Index++; + return I0; +} + +link_internal b32 +operator<( shader_ptr_block_array_index I0, shader_ptr_block_array_index I1 ) +{ + b32 Result = I0.Index < I1.Index; + return Result; +} + +link_internal b32 +operator==( shader_ptr_block_array_index I0, shader_ptr_block_array_index I1 ) +{ + b32 Result = I0.Index == I1.Index; + return Result; +} + +link_inline umm +GetIndex( shader_ptr_block_array_index *Index) +{ + umm Result = Index->Index; + return Result; +} + + +link_internal shader_ptr_block_array_index +ZerothIndex( shader_ptr_block_array *Arr ) +{ + return {}; +} + +link_internal shader_ptr_block_array_index +Capacity( shader_ptr_block_array *Arr ) +{ + shader_ptr_block_array_index Result = {Arr->BlockCount * 64}; + return Result; +} + +link_internal shader_ptr_block_array_index +AtElements( shader_ptr_block_array *Arr ) +{ + shader_ptr_block_array_index Result = {Arr->ElementCount}; + return Result; +} + + +link_internal umm +TotalElements( shader_ptr_block_array *Arr ) +{ + umm Result = AtElements(Arr).Index; + return Result; +} + + +link_internal shader_ptr_block_array_index +LastIndex( shader_ptr_block_array *Arr ) +{ + shader_ptr_block_array_index Result = {}; + umm Count = AtElements(Arr).Index; + if (Count) Result.Index = Count-1; + return Result; +} + +link_internal umm +Count( shader_ptr_block_array *Arr ) +{ + auto Result = AtElements(Arr).Index; + return Result; +} + +link_internal shader_ptr_block * +GetBlock( shader_ptr_block_array *Arr, shader_ptr_block_array_index Index ) +{ + umm BlockIndex = Index.Index / 64; + Assert(BlockIndex < Arr->BlockCount); + shader_ptr_block *Block = Arr->BlockPtrs[BlockIndex]; + return Block; +} + +link_internal shader_ptr +GetPtr( shader_ptr_block_array *Arr, shader_ptr_block_array_index Index ) +{ + Assert(Arr->BlockPtrs); + Assert(Index.Index < Capacity(Arr).Index); + + shader_ptr_block *Block = GetBlock(Arr, Index); + + umm ElementIndex = Index.Index % 64; + shader_ptr Result = *(Block->Elements + ElementIndex); + return Result; +} + + +link_internal shader_ptr +GetPtr( shader_ptr_block_array *Arr, umm Index ) +{ + shader_ptr_block_array_index I = {Index}; + return GetPtr(Arr, I); +} + + +link_internal shader_ptr +TryGetPtr( shader_ptr_block_array *Arr, shader_ptr_block_array_index Index) +{ + shader_ptr Result = {}; + if (Arr->BlockPtrs && Index < AtElements(Arr)) + { + Result = GetPtr(Arr, Index); + } + return Result; +} + +link_internal shader_ptr +TryGetPtr( shader_ptr_block_array *Arr, umm Index) +{ + auto Result = TryGetPtr(Arr, shader_ptr_block_array_index{Index}); + return Result; +} + diff --git a/generated/block_array_h_texture_688856411.h b/generated/block_array_h_texture_688856411.h index 4dc4d2273..3428614b0 100644 --- a/generated/block_array_h_texture_688856411.h +++ b/generated/block_array_h_texture_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2208:0 +// external/bonsai_stdlib/src/poof_functions.h:2210:0 diff --git a/generated/block_array_h_texture_688856411_0.h b/generated/block_array_h_texture_688856411_0.h index a9c3cf0d4..f0e21c70b 100644 --- a/generated/block_array_h_texture_688856411_0.h +++ b/generated/block_array_h_texture_688856411_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2208:0 +// external/bonsai_stdlib/src/poof_functions.h:2210:0 diff --git a/generated/block_array_h_u32_688856411.h b/generated/block_array_h_u32_688856411.h index 630bfa214..5b810449d 100644 --- a/generated/block_array_h_u32_688856411.h +++ b/generated/block_array_h_u32_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2208:0 +// external/bonsai_stdlib/src/poof_functions.h:2210:0 diff --git a/generated/block_array_h_u8_cursor_688856411.h b/generated/block_array_h_u8_cursor_688856411.h index 47159715c..4da872efb 100644 --- a/generated/block_array_h_u8_cursor_688856411.h +++ b/generated/block_array_h_u8_cursor_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2208:0 +// external/bonsai_stdlib/src/poof_functions.h:2210:0 diff --git a/generated/block_array_h_world_chunk_ptr_688853862_0.h b/generated/block_array_h_world_chunk_ptr_688853862_0.h index b961ab123..f80dc5b8b 100644 --- a/generated/block_array_h_world_chunk_ptr_688853862_0.h +++ b/generated/block_array_h_world_chunk_ptr_688853862_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2208:0 +// external/bonsai_stdlib/src/poof_functions.h:2210:0 diff --git a/generated/block_array_member_info_688856411.h b/generated/block_array_member_info_688856411.h index c15a99b25..3031d9114 100644 --- a/generated/block_array_member_info_688856411.h +++ b/generated/block_array_member_info_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_model_688856411.h b/generated/block_array_model_688856411.h index d6f6b155d..317395ff4 100644 --- a/generated/block_array_model_688856411.h +++ b/generated/block_array_model_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_octree_node_ptr_688853862.h b/generated/block_array_octree_node_ptr_688853862.h index 9493b93b0..a63611788 100644 --- a/generated/block_array_octree_node_ptr_688853862.h +++ b/generated/block_array_octree_node_ptr_688853862.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_picked_octree_node_688853862.h b/generated/block_array_picked_octree_node_688853862.h index 0261fd543..bd6cc538a 100644 --- a/generated/block_array_picked_octree_node_688853862.h +++ b/generated/block_array_picked_octree_node_688853862.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_standing_spot_688853862.h b/generated/block_array_standing_spot_688853862.h index 4f46c862a..83bd96970 100644 --- a/generated/block_array_standing_spot_688853862.h +++ b/generated/block_array_standing_spot_688853862.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_texture_ptr_688856411.h b/generated/block_array_texture_ptr_688856411.h index 726837dda..5b4e42ed8 100644 --- a/generated/block_array_texture_ptr_688856411.h +++ b/generated/block_array_texture_ptr_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2375:0 +// external/bonsai_stdlib/src/poof_functions.h:2377:0 diff --git a/generated/block_array_vox_data_688856411.h b/generated/block_array_vox_data_688856411.h index 84de9cfb4..afc3fccda 100644 --- a/generated/block_array_vox_data_688856411.h +++ b/generated/block_array_vox_data_688856411.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_voxel_stack_element_688853862.h b/generated/block_array_voxel_stack_element_688853862.h index 89b71d1d4..38ab2c879 100644 --- a/generated/block_array_voxel_stack_element_688853862.h +++ b/generated/block_array_voxel_stack_element_688853862.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_world_chunk_ptr_688853862.h b/generated/block_array_world_chunk_ptr_688853862.h index b3f522d23..4180fab16 100644 --- a/generated/block_array_world_chunk_ptr_688853862.h +++ b/generated/block_array_world_chunk_ptr_688853862.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2375:0 +// external/bonsai_stdlib/src/poof_functions.h:2377:0 diff --git a/generated/block_array_world_edit_block_array_index_688735882.h b/generated/block_array_world_edit_block_array_index_688735882.h index a6e7055f2..c5073c04c 100644 --- a/generated/block_array_world_edit_block_array_index_688735882.h +++ b/generated/block_array_world_edit_block_array_index_688735882.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 08a42c980..81d6ca035 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index aee23b616..964b7a118 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2596:0 +// external/bonsai_stdlib/src/poof_functions.h:2598:0 diff --git a/generated/buffer_asset.h b/generated/buffer_asset.h index 43c1db63f..0c88004e4 100644 --- a/generated/buffer_asset.h +++ b/generated/buffer_asset.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct asset_buffer { umm Count; diff --git a/generated/buffer_bitmap.h b/generated/buffer_bitmap.h index 41173b2d2..b975994d5 100644 --- a/generated/buffer_bitmap.h +++ b/generated/buffer_bitmap.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct bitmap_buffer { umm Count; diff --git a/generated/buffer_bonsai_type_info.h b/generated/buffer_bonsai_type_info.h index d31193dd7..23e5a98c3 100644 --- a/generated/buffer_bonsai_type_info.h +++ b/generated/buffer_bonsai_type_info.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct bonsai_type_info_buffer { umm Count; diff --git a/generated/buffer_builder_tuple_cs_cs.h b/generated/buffer_builder_tuple_cs_cs.h index 306609e04..fb8190b71 100644 --- a/generated/buffer_builder_tuple_cs_cs.h +++ b/generated/buffer_builder_tuple_cs_cs.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:712:0 +// external/bonsai_stdlib/src/poof_functions.h:714:0 struct tuple_cs_cs_buffer_builder { tuple_cs_cs_stream Chunks; diff --git a/generated/buffer_c_struct_u32.h b/generated/buffer_c_struct_u32.h index 16744ab05..f9c6a5785 100644 --- a/generated/buffer_c_struct_u32.h +++ b/generated/buffer_c_struct_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1401:0 +// external/bonsai_stdlib/src/poof_functions.h:1403:0 link_internal shader_uniform_buffer ShaderUniformBuffer( u32 ElementCount, memory_arena* Memory) { diff --git a/generated/buffer_c_struct_u64.h b/generated/buffer_c_struct_u64.h index 5725629e8..59cd255b6 100644 --- a/generated/buffer_c_struct_u64.h +++ b/generated/buffer_c_struct_u64.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1401:0 +// external/bonsai_stdlib/src/poof_functions.h:1403:0 link_internal model_buffer ModelBuffer( u64 ElementCount, memory_arena* Memory) { diff --git a/generated/buffer_c_token.h b/generated/buffer_c_token.h index 56b7900b4..c18b475f5 100644 --- a/generated/buffer_c_token.h +++ b/generated/buffer_c_token.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct c_token_buffer { umm Count; diff --git a/generated/buffer_c_token_buffer.h b/generated/buffer_c_token_buffer.h index 3bd27ccb9..fe1e4ad91 100644 --- a/generated/buffer_c_token_buffer.h +++ b/generated/buffer_c_token_buffer.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct c_token_buffer_buffer { umm Count; diff --git a/generated/buffer_counted_string.h b/generated/buffer_counted_string.h index 2f19f523d..13be8cf6b 100644 --- a/generated/buffer_counted_string.h +++ b/generated/buffer_counted_string.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct counted_string_buffer { umm Count; diff --git a/generated/buffer_file_traversal_node.h b/generated/buffer_file_traversal_node.h index 9b1ff0667..a01348cec 100644 --- a/generated/buffer_file_traversal_node.h +++ b/generated/buffer_file_traversal_node.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct file_traversal_node_buffer { umm Count; diff --git a/generated/buffer_h_struct_u32.h b/generated/buffer_h_struct_u32.h index 376d7253b..6c4aff266 100644 --- a/generated/buffer_h_struct_u32.h +++ b/generated/buffer_h_struct_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1325:0 +// external/bonsai_stdlib/src/poof_functions.h:1327:0 struct shader_uniform_buffer { u32 Count; diff --git a/generated/buffer_model.h b/generated/buffer_model.h index eae84bc49..f2079ed39 100644 --- a/generated/buffer_model.h +++ b/generated/buffer_model.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1425:0 +// external/bonsai_stdlib/src/poof_functions.h:1427:0 struct model_buffer { u64 Count; diff --git a/generated/buffer_octree_node_ptr.h b/generated/buffer_octree_node_ptr.h index b0b03f30a..924c2b962 100644 --- a/generated/buffer_octree_node_ptr.h +++ b/generated/buffer_octree_node_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct octree_node_ptr_buffer { umm Count; diff --git a/generated/buffer_rect3i.h b/generated/buffer_rect3i.h index 65615a5c5..9db24bc58 100644 --- a/generated/buffer_rect3i.h +++ b/generated/buffer_rect3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct rect3i_buffer { umm Count; diff --git a/generated/buffer_sort_key.h b/generated/buffer_sort_key.h index d902b5bf7..8e63bc895 100644 --- a/generated/buffer_sort_key.h +++ b/generated/buffer_sort_key.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct sort_key_buffer { umm Count; diff --git a/generated/buffer_standing_spot.h b/generated/buffer_standing_spot.h index 44311ea49..8da01dfa2 100644 --- a/generated/buffer_standing_spot.h +++ b/generated/buffer_standing_spot.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct standing_spot_buffer { umm Count; diff --git a/generated/buffer_thread_main_callback_type.h b/generated/buffer_thread_main_callback_type.h index 5aef60391..f25faf2fd 100644 --- a/generated/buffer_thread_main_callback_type.h +++ b/generated/buffer_thread_main_callback_type.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct thread_main_callback_type_buffer { umm Count; diff --git a/generated/buffer_tile_ruleset.h b/generated/buffer_tile_ruleset.h index e13ee6755..deafc96b2 100644 --- a/generated/buffer_tile_ruleset.h +++ b/generated/buffer_tile_ruleset.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct tile_ruleset_buffer { umm Count; diff --git a/generated/buffer_u32.h b/generated/buffer_u32.h index 072748099..3bb85850a 100644 --- a/generated/buffer_u32.h +++ b/generated/buffer_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct u32_buffer { umm Count; diff --git a/generated/buffer_u64.h b/generated/buffer_u64.h index c33c7e3c5..72c558121 100644 --- a/generated/buffer_u64.h +++ b/generated/buffer_u64.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct u64_buffer { umm Count; diff --git a/generated/buffer_ui_toggle_button_handle.h b/generated/buffer_ui_toggle_button_handle.h index 6c5f01af3..2c140e198 100644 --- a/generated/buffer_ui_toggle_button_handle.h +++ b/generated/buffer_ui_toggle_button_handle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct ui_toggle_button_handle_buffer { umm Count; diff --git a/generated/buffer_v3i.h b/generated/buffer_v3i.h index 74f364937..b3e18e17f 100644 --- a/generated/buffer_v3i.h +++ b/generated/buffer_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct v3i_buffer { umm Count; diff --git a/generated/buffer_voxel_synth_tile.h b/generated/buffer_voxel_synth_tile.h index bcc1ab7bd..cc702da98 100644 --- a/generated/buffer_voxel_synth_tile.h +++ b/generated/buffer_voxel_synth_tile.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct voxel_synth_tile_buffer { umm Count; diff --git a/generated/buffer_world_chunk_ptr.h b/generated/buffer_world_chunk_ptr.h index d3c4b4ca5..4ced6aa3d 100644 --- a/generated/buffer_world_chunk_ptr.h +++ b/generated/buffer_world_chunk_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1432:0 +// external/bonsai_stdlib/src/poof_functions.h:1434:0 struct world_chunk_ptr_buffer { umm Count; diff --git a/generated/cursor_v3i.h b/generated/cursor_v3i.h index b789b8a2b..821540a98 100644 --- a/generated/cursor_v3i.h +++ b/generated/cursor_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1538:0 +// external/bonsai_stdlib/src/poof_functions.h:1540:0 struct v3i_cursor { v3i *Start; diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index 677b8810f..a88c76f13 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:76:0 +// external/bonsai_stdlib/src/poof_functions.h:78:0 link_internal work_queue_entry__bonsai_render_command diff --git a/generated/d_union_constructors_work_queue_entry.h b/generated/d_union_constructors_work_queue_entry.h index 20d36236b..d7f9c1013 100644 --- a/generated/d_union_constructors_work_queue_entry.h +++ b/generated/d_union_constructors_work_queue_entry.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:49:0 +// external/bonsai_stdlib/src/poof_functions.h:51:0 link_internal work_queue_entry diff --git a/generated/deep_copy_u32_stream.h b/generated/deep_copy_u32_stream.h index 59f59408c..f3218ce4a 100644 --- a/generated/deep_copy_u32_stream.h +++ b/generated/deep_copy_u32_stream.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1296:0 +// external/bonsai_stdlib/src/poof_functions.h:1298:0 /* link_internal void */ /* DeepCopy( Type.name *Src, Type.name *Dest) */ /* { */ diff --git a/generated/flatten_block_array_file_traversal_node.h b/generated/flatten_block_array_file_traversal_node.h index 0b2c6a729..c80559602 100644 --- a/generated/flatten_block_array_file_traversal_node.h +++ b/generated/flatten_block_array_file_traversal_node.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2574:0 +// external/bonsai_stdlib/src/poof_functions.h:2576:0 link_internal file_traversal_node_buffer Flatten(file_traversal_node_block_array *Array, memory_arena *Memory) { diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 881883fca..05c8279b1 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -596,11 +596,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re - cs MemberName = CSz("Points"); + cs MemberName = CSz("Func"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(v2*, Element->Points), + Cast(easing_function*, Element->Func), MemberName, ThisHash, Params @@ -614,32 +614,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re - } - - - { - - - - cs MemberName = CSz("Count"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u32*, Element->Count), - MemberName, - ThisHash, - Params - ); - - - - - - - - - PushNewRow(Ui); - } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/for_datatypes_IXWy6K9V.h b/generated/for_datatypes_IXWy6K9V.h index 61930c762..e61a3b058 100644 --- a/generated/for_datatypes_IXWy6K9V.h +++ b/generated/for_datatypes_IXWy6K9V.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:113:0 +// src/engine/graphics.h:110:0 @@ -55,213 +55,395 @@ InitializeLightingRenderGroup - Element->gColor = gColor; + Element->gColor = gColor; InitShaderUniform( &Element->Program, UniformIndex++, - Element->gColor, + + + + Element->gColor, "gColor" - ); + + + ); + - Element->gNormal = gNormal; + + Element->gNormal = gNormal; InitShaderUniform( &Element->Program, UniformIndex++, - Element->gNormal, + + + + Element->gNormal, "gNormal" - ); + - Element->gDepth = gDepth; + ); + + + + Element->gDepth = gDepth; InitShaderUniform( &Element->Program, UniformIndex++, - Element->gDepth, + + + + Element->gDepth, "gDepth" - ); + - Element->shadowMap = shadowMap; + ); + + + + Element->shadowMap = shadowMap; InitShaderUniform( &Element->Program, UniformIndex++, - Element->shadowMap, + + + + Element->shadowMap, "shadowMap" - ); + + + ); - Element->Ssao = Ssao; + + + Element->Ssao = Ssao; InitShaderUniform( &Element->Program, UniformIndex++, - Element->Ssao, + + + + Element->Ssao, "Ssao" - ); + + + ); - Element->TransparencyAccumTex = TransparencyAccumTex; + + + Element->TransparencyAccumTex = TransparencyAccumTex; InitShaderUniform( &Element->Program, UniformIndex++, - Element->TransparencyAccumTex, + + + + Element->TransparencyAccumTex, "TransparencyAccumTex" - ); + + + ); + - Element->TransparencyCountTex = TransparencyCountTex; + + Element->TransparencyCountTex = TransparencyCountTex; InitShaderUniform( &Element->Program, UniformIndex++, - Element->TransparencyCountTex, + + + + Element->TransparencyCountTex, "TransparencyCountTex" - ); + + + ); + - Element->BravoilMyersOIT = BravoilMyersOIT; + + Element->BravoilMyersOIT = BravoilMyersOIT; InitShaderUniform( &Element->Program, UniformIndex++, - Element->BravoilMyersOIT, + + + + Element->BravoilMyersOIT, "BravoilMyersOIT" - ); + + + ); + - Element->BravoilMcGuireOIT = BravoilMcGuireOIT; + + Element->BravoilMcGuireOIT = BravoilMcGuireOIT; InitShaderUniform( &Element->Program, UniformIndex++, - Element->BravoilMcGuireOIT, + + + + Element->BravoilMcGuireOIT, "BravoilMcGuireOIT" - ); + + + ); + - Element->InverseViewMatrix = InverseViewMatrix; + + Element->InverseViewMatrix = InverseViewMatrix; InitShaderUniform( &Element->Program, UniformIndex++, - Element->InverseViewMatrix, + + + + Element->InverseViewMatrix, "InverseViewMatrix" - ); + + + ); + + - Element->InverseProjectionMatrix = InverseProjectionMatrix; + Element->InverseProjectionMatrix = InverseProjectionMatrix; InitShaderUniform( &Element->Program, UniformIndex++, - Element->InverseProjectionMatrix, + + + + Element->InverseProjectionMatrix, "InverseProjectionMatrix" - ); + + + ); + + - Element->ShadowMVP = ShadowMVP; + Element->ShadowMVP = ShadowMVP; InitShaderUniform( &Element->Program, UniformIndex++, - Element->ShadowMVP, + + + + Element->ShadowMVP, "ShadowMVP" - ); + + + ); + - Element->LightColors = LightColors; + + Element->LightColors = LightColors; InitShaderUniform( &Element->Program, UniformIndex++, - Element->LightColors, + + + + Element->LightColors, "LightColors" - ); + - Element->LightPositions = LightPositions; + ); + + + + Element->LightPositions = LightPositions; InitShaderUniform( &Element->Program, UniformIndex++, - Element->LightPositions, + + + + Element->LightPositions, "LightPositions" - ); + - Element->LightIndexToUV = LightIndexToUV; + ); + + + + Element->LightIndexToUV = LightIndexToUV; InitShaderUniform( &Element->Program, UniformIndex++, - Element->LightIndexToUV, + + + + Element->LightIndexToUV, "LightIndexToUV" - ); + + + ); - Element->LightCount = LightCount; + + + Element->LightCount = LightCount; InitShaderUniform( &Element->Program, UniformIndex++, - Element->LightCount, + + + + Element->LightCount, "LightCount" - ); + + + ); - Element->Camera = Camera; + + + Element->Camera = Camera; InitShaderUniform( &Element->Program, UniformIndex++, - Element->Camera, + + + + Element->Camera, "Camera" - ); + + + ); - Element->SunPosition = SunPosition; + + + Element->SunPosition = SunPosition; InitShaderUniform( &Element->Program, UniformIndex++, - Element->SunPosition, + + + + Element->SunPosition, "SunPosition" - ); + + + ); - Element->SunColor = SunColor; + + + Element->SunColor = SunColor; InitShaderUniform( &Element->Program, UniformIndex++, - Element->SunColor, + + + + Element->SunColor, "SunColor" - ); + + + ); + - Element->FogColor = FogColor; + + Element->FogColor = FogColor; InitShaderUniform( &Element->Program, UniformIndex++, - Element->FogColor, + + + + Element->FogColor, "FogColor" - ); + + + ); + - Element->FogPower = FogPower; + + Element->FogPower = FogPower; InitShaderUniform( &Element->Program, UniformIndex++, - Element->FogPower, + + + + Element->FogPower, "FogPower" - ); + + + ); + + - Element->UseSsao = UseSsao; + Element->UseSsao = UseSsao; InitShaderUniform( &Element->Program, UniformIndex++, - Element->UseSsao, + + + + Element->UseSsao, "UseSsao" - ); + + + ); + + - Element->UseShadowMapping = UseShadowMapping; + Element->UseShadowMapping = UseShadowMapping; InitShaderUniform( &Element->Program, UniformIndex++, - Element->UseShadowMapping, + + + + Element->UseShadowMapping, "UseShadowMapping" - ); + + + ); + - Element->UseLightingBloom = UseLightingBloom; + + Element->UseLightingBloom = UseLightingBloom; InitShaderUniform( &Element->Program, UniformIndex++, - Element->UseLightingBloom, + + + + Element->UseLightingBloom, "UseLightingBloom" - ); + - Element->ApplicationResolution = ApplicationResolution; + ); + + + + Element->ApplicationResolution = ApplicationResolution; InitShaderUniform( &Element->Program, UniformIndex++, - Element->ApplicationResolution, + + + + Element->ApplicationResolution, "ApplicationResolution" - ); + - Element->ShadowMapResolution = ShadowMapResolution; + ); + + + + Element->ShadowMapResolution = ShadowMapResolution; InitShaderUniform( &Element->Program, UniformIndex++, - Element->ShadowMapResolution, + + + + Element->ShadowMapResolution, "ShadowMapResolution" - ); + + + ); + + @@ -293,188 +475,214 @@ UseRenderPass_lighting_render_group - { + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } + @@ -614,37 +822,65 @@ InitializeTerrainDecorationRenderContext - Element->DerivsTex = DerivsTex; + Element->DerivsTex = DerivsTex; InitShaderUniform( &Element->Program, UniformIndex++, - Element->DerivsTex, + + + + Element->DerivsTex, "DerivsTex" - ); + + + ); - Element->ChunkDim = ChunkDim; + + + Element->ChunkDim = ChunkDim; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->ChunkDim, + + + + &Element->ChunkDim, "ChunkDim" - ); + + + ); + - Element->WorldspaceChunkBasis = WorldspaceChunkBasis; + + Element->WorldspaceChunkBasis = WorldspaceChunkBasis; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->WorldspaceChunkBasis, + + + + &Element->WorldspaceChunkBasis, "WorldspaceChunkBasis" - ); + + + ); + - Element->ChunkResolution = ChunkResolution; + + Element->ChunkResolution = ChunkResolution; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->ChunkResolution, + + + + &Element->ChunkResolution, "ChunkResolution" - ); + + + ); + + @@ -675,28 +911,31 @@ UseRenderPass_terrain_decoration_render_context - { + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -705,6 +944,7 @@ UseRenderPass_terrain_decoration_render_context + if (UniformIndex != 4 ) { Error("Shader (terrain_decoration_render_context) had an incorrect number of uniform slots!"); @@ -776,13 +1016,20 @@ InitializeTerrainFinalizeRenderContext - Element->Ignored = Ignored; + Element->Ignored = Ignored; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->Ignored, + + + + &Element->Ignored, "Ignored" - ); + + + ); + + @@ -813,7 +1060,7 @@ UseRenderPass_terrain_finalize_render_context - { + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -822,6 +1069,7 @@ UseRenderPass_terrain_finalize_render_context + if (UniformIndex != 1 ) { Error("Shader (terrain_finalize_render_context) had an incorrect number of uniform slots!"); @@ -934,37 +1182,65 @@ InitializeWorldEditRenderContext - Element->ChunkDim = ChunkDim; + Element->ChunkDim = ChunkDim; InitShaderUniform( &Element->Program, UniformIndex++, - Element->ChunkDim, + + + + Element->ChunkDim, "ChunkDim" - ); + + + ); + - Element->WorldspaceChunkBasis = WorldspaceChunkBasis; + + Element->WorldspaceChunkBasis = WorldspaceChunkBasis; InitShaderUniform( &Element->Program, UniformIndex++, - Element->WorldspaceChunkBasis, + + + + Element->WorldspaceChunkBasis, "WorldspaceChunkBasis" - ); + + + ); + - Element->ChunkResolution = ChunkResolution; + + Element->ChunkResolution = ChunkResolution; InitShaderUniform( &Element->Program, UniformIndex++, - Element->ChunkResolution, + + + + Element->ChunkResolution, "ChunkResolution" - ); + + + ); + + - Element->Type = Type; + Element->Type = Type; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->Type, + + + + &Element->Type, "Type" - ); + + + ); + + @@ -995,28 +1271,31 @@ UseRenderPass_world_edit_render_context - { + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -1025,6 +1304,7 @@ UseRenderPass_world_edit_render_context + if (UniformIndex != 4 ) { Error("Shader (world_edit_render_context) had an incorrect number of uniform slots!"); @@ -1156,8 +1436,7 @@ InitializeEasingFunctionVisualizerRenderPass easing_function_visualizer_render_pass *Element - , v2 *Points - , u32 *Count + , easing_function *Func ) { @@ -1171,21 +1450,34 @@ InitializeEasingFunctionVisualizerRenderPass - Element->Points = Points; + Element->Func = Func; InitShaderUniform( &Element->Program, UniformIndex++, - Element->Points, - "Points" - , Cast(u16, *Count)); - Element->Count = Count; + + + Element->Func->Points.Start, + "Points", + &Element->Func->Points.At + + ); + + + Element->Func = Func; InitShaderUniform( &Element->Program, UniformIndex++, - Element->Count, - "Count" - ); + + + + &Element->Func->Points.At, + "Count", + 0 + + ); + + @@ -1214,7 +1506,7 @@ UseRenderPass_easing_function_visualizer_render_pass s32 UniformIndex = 0; - { + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -1230,6 +1522,7 @@ UseRenderPass_easing_function_visualizer_render_pass + if (UniformIndex != 2 ) { Error("Shader (easing_function_visualizer_render_pass) had an incorrect number of uniform slots!"); @@ -1332,37 +1625,65 @@ InitializeShadowMapShader - Element->ModelMatrix = ModelMatrix; + Element->ModelMatrix = ModelMatrix; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->ModelMatrix, + + + + &Element->ModelMatrix, "ModelMatrix" - ); + + + ); + - Element->ViewProjection = ViewProjection; + + Element->ViewProjection = ViewProjection; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->ViewProjection, + + + + &Element->ViewProjection, "ViewProjection" - ); + - Element->MinClipP_worldspace = MinClipP_worldspace; + ); + + + + Element->MinClipP_worldspace = MinClipP_worldspace; InitShaderUniform( &Element->Program, UniformIndex++, - Element->MinClipP_worldspace, + + + + Element->MinClipP_worldspace, "MinClipP_worldspace" - ); + - Element->MaxClipP_worldspace = MaxClipP_worldspace; + ); + + + + Element->MaxClipP_worldspace = MaxClipP_worldspace; InitShaderUniform( &Element->Program, UniformIndex++, - Element->MaxClipP_worldspace, + + + + Element->MaxClipP_worldspace, "MaxClipP_worldspace" - ); + + + ); + + @@ -1391,28 +1712,31 @@ UseRenderPass_shadow_map_shader s32 UniformIndex = 0; - { + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -1421,6 +1745,7 @@ UseRenderPass_shadow_map_shader + if (UniformIndex != 4 ) { Error("Shader (shadow_map_shader) had an incorrect number of uniform slots!"); @@ -1477,13 +1802,20 @@ InitializeBloomUpsampleShader - Element->FilterRadius = FilterRadius; + Element->FilterRadius = FilterRadius; InitShaderUniform( &Element->Program, UniformIndex++, - Element->FilterRadius, + + + + Element->FilterRadius, "FilterRadius" - ); + + + ); + + @@ -1512,7 +1844,7 @@ UseRenderPass_bloom_upsample_shader s32 UniformIndex = 0; - { + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -1521,6 +1853,7 @@ UseRenderPass_bloom_upsample_shader + if (UniformIndex != 1 ) { Error("Shader (bloom_upsample_shader) had an incorrect number of uniform slots!"); @@ -1737,13 +2070,20 @@ InitializeTerrainDerivsRenderContext - Element->Ignored = Ignored; + Element->Ignored = Ignored; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->Ignored, + + + + &Element->Ignored, "Ignored" - ); + + + ); + + @@ -1774,7 +2114,7 @@ UseRenderPass_terrain_derivs_render_context - { + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -1783,6 +2123,7 @@ UseRenderPass_terrain_derivs_render_context + if (UniformIndex != 1 ) { Error("Shader (terrain_derivs_render_context) had an incorrect number of uniform slots!"); @@ -1856,13 +2197,20 @@ InitializeBloomDownsampleShader - Element->SrcResolution = SrcResolution; + Element->SrcResolution = SrcResolution; InitShaderUniform( &Element->Program, UniformIndex++, - Element->SrcResolution, + + + + Element->SrcResolution, "SrcResolution" - ); + + + ); + + @@ -1891,7 +2239,7 @@ UseRenderPass_bloom_downsample_shader s32 UniformIndex = 0; - { + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -1900,6 +2248,7 @@ UseRenderPass_bloom_downsample_shader + if (UniformIndex != 1 ) { Error("Shader (bloom_downsample_shader) had an incorrect number of uniform slots!"); @@ -2031,29 +2380,50 @@ InitializeTerrainShapingRenderContext - Element->ChunkDim = ChunkDim; + Element->ChunkDim = ChunkDim; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->ChunkDim, + + + + &Element->ChunkDim, "ChunkDim" - ); + - Element->WorldspaceChunkBasis = WorldspaceChunkBasis; + ); + + + + Element->WorldspaceChunkBasis = WorldspaceChunkBasis; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->WorldspaceChunkBasis, + + + + &Element->WorldspaceChunkBasis, "WorldspaceChunkBasis" - ); + + + ); - Element->ChunkResolution = ChunkResolution; + + + Element->ChunkResolution = ChunkResolution; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->ChunkResolution, + + + + &Element->ChunkResolution, "ChunkResolution" - ); + + + ); + + @@ -2084,21 +2454,23 @@ UseRenderPass_terrain_shaping_render_context - { + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -2107,6 +2479,7 @@ UseRenderPass_terrain_shaping_render_context + if (UniformIndex != 3 ) { Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots!"); diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h index a4a822476..f6ee01966 100644 --- a/generated/for_datatypes_cx51CcgQ.h +++ b/generated/for_datatypes_cx51CcgQ.h @@ -896,14 +896,14 @@ DoJob(compile_shader_pair_async_params *Params) link_internal void -InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_function_visualizer_render_pass *Element , v2 *Points , u32 *Count , b32* Result ) +InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_function_visualizer_render_pass *Element , easing_function *Func , b32* Result ) { // Make sure we don't accidentally pass something that's not the render queue Assert(Queue == &GetStdlib()->Plat.RenderQ); initialize_easing_function_visualizer_render_pass_async_params Params = { - Result, Element, Points, Count, + Result, Element, Func, }; work_queue_entry Entry = WorkQueueEntryAsyncFunction(&Params); @@ -913,7 +913,7 @@ InitializeEasingFunctionVisualizerRenderPass_Async(work_queue *Queue, easing_fu link_internal void DoJob(initialize_easing_function_visualizer_render_pass_async_params *Params) { - auto Result = InitializeEasingFunctionVisualizerRenderPass( Params->Element , Params->Points , Params->Count ); + auto Result = InitializeEasingFunctionVisualizerRenderPass( Params->Element , Params->Func ); if (Params->Result) { *Params->Result = Result; } } diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h index 2df36b380..948ba9b13 100644 --- a/generated/for_datatypes_khY6kwEk.h +++ b/generated/for_datatypes_khY6kwEk.h @@ -888,8 +888,7 @@ struct initialize_easing_function_visualizer_render_pass_async_params poof(@asyn { b32* Result; easing_function_visualizer_render_pass *Element; - v2 *Points; - u32 *Count; + easing_function *Func; }; diff --git a/generated/freelist_allocator_octree_node.h b/generated/freelist_allocator_octree_node.h index 29242637b..da65cd510 100644 --- a/generated/freelist_allocator_octree_node.h +++ b/generated/freelist_allocator_octree_node.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2647:0 +// external/bonsai_stdlib/src/poof_functions.h:2649:0 struct octree_node_freelist { octree_node *First; diff --git a/generated/freelist_allocator_world_chunk.h b/generated/freelist_allocator_world_chunk.h index 6d7140d87..9602c35f8 100644 --- a/generated/freelist_allocator_world_chunk.h +++ b/generated/freelist_allocator_world_chunk.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2647:0 +// external/bonsai_stdlib/src/poof_functions.h:2649:0 struct world_chunk_freelist { world_chunk *First; diff --git a/generated/gen_common_vector_v2.h b/generated/gen_common_vector_v2.h index b3a2cf0aa..eb575d969 100644 --- a/generated/gen_common_vector_v2.h +++ b/generated/gen_common_vector_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:450:0 +// external/bonsai_stdlib/src/poof_functions.h:452:0 inline r32 LengthSq( v2 Vec ) { diff --git a/generated/gen_common_vector_v3.h b/generated/gen_common_vector_v3.h index 1092dad77..3e45db79a 100644 --- a/generated/gen_common_vector_v3.h +++ b/generated/gen_common_vector_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:450:0 +// external/bonsai_stdlib/src/poof_functions.h:452:0 inline r32 LengthSq( v3 Vec ) { diff --git a/generated/gen_common_vector_v3i.h b/generated/gen_common_vector_v3i.h index 535f08baa..c4ea36291 100644 --- a/generated/gen_common_vector_v3i.h +++ b/generated/gen_common_vector_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:450:0 +// external/bonsai_stdlib/src/poof_functions.h:452:0 inline s32 LengthSq( v3i Vec ) { diff --git a/generated/gen_constructor_gpu_readback_buffer.h b/generated/gen_constructor_gpu_readback_buffer.h index b874fdfe7..4c0bf984d 100644 --- a/generated/gen_constructor_gpu_readback_buffer.h +++ b/generated/gen_constructor_gpu_readback_buffer.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:113:0 +// external/bonsai_stdlib/src/poof_functions.h:115:0 link_internal gpu_readback_buffer GpuReadbackBuffer( u32 PBO , GLsync Fence ) { diff --git a/generated/gen_constructor_perlin_params.h b/generated/gen_constructor_perlin_params.h index f85c090d2..342c4470f 100644 --- a/generated/gen_constructor_perlin_params.h +++ b/generated/gen_constructor_perlin_params.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:113:0 +// external/bonsai_stdlib/src/poof_functions.h:115:0 link_internal perlin_params PerlinParams( u32_8x P0 , u32_8x P1 , f32_8x Fract0 , f32_8x Fract1 , f32_8x Fade ) { diff --git a/generated/gen_constructor_vertex_material.h b/generated/gen_constructor_vertex_material.h index ef1bac586..76e2f944a 100644 --- a/generated/gen_constructor_vertex_material.h +++ b/generated/gen_constructor_vertex_material.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:113:0 +// external/bonsai_stdlib/src/poof_functions.h:115:0 link_internal vertex_material VertexMaterial( u16 ColorIndex , u8 Transparency , u8 Emission ) { diff --git a/generated/gen_constructor_voxel_lighting.h b/generated/gen_constructor_voxel_lighting.h index a8ffce764..9dfb90d8c 100644 --- a/generated/gen_constructor_voxel_lighting.h +++ b/generated/gen_constructor_voxel_lighting.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:113:0 +// external/bonsai_stdlib/src/poof_functions.h:115:0 link_internal voxel_lighting VoxelLighting( u8 Emission ) { diff --git a/generated/gen_constructor_voxel_stack_element.h b/generated/gen_constructor_voxel_stack_element.h index 07462c600..fe1805080 100644 --- a/generated/gen_constructor_voxel_stack_element.h +++ b/generated/gen_constructor_voxel_stack_element.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:113:0 +// external/bonsai_stdlib/src/poof_functions.h:115:0 link_internal voxel_stack_element VoxelStackElement( v3i VoxSimP , voxel_rule_direction Dir ) { diff --git a/generated/gen_constructor_voxel_synthesis_change_propagation_info.h b/generated/gen_constructor_voxel_synthesis_change_propagation_info.h index 580a9bb5b..7a2feeccc 100644 --- a/generated/gen_constructor_voxel_synthesis_change_propagation_info.h +++ b/generated/gen_constructor_voxel_synthesis_change_propagation_info.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:113:0 +// external/bonsai_stdlib/src/poof_functions.h:115:0 link_internal voxel_synthesis_change_propagation_info VoxelSynthesisChangePropagationInfo( tile_rule PrevTileOptions , v3i PrevTileP , v3i DirOfTravel ) { diff --git a/generated/gen_default_equality_operator_tile_rule_id.h b/generated/gen_default_equality_operator_tile_rule_id.h index b604d5809..56318ec4b 100644 --- a/generated/gen_default_equality_operator_tile_rule_id.h +++ b/generated/gen_default_equality_operator_tile_rule_id.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:94:0 +// external/bonsai_stdlib/src/poof_functions.h:96:0 link_internal b32 operator==( tile_rule_id E1, tile_rule_id E2 ) { diff --git a/generated/gen_default_equality_operator_ui_id.h b/generated/gen_default_equality_operator_ui_id.h index deef15855..5178cf0af 100644 --- a/generated/gen_default_equality_operator_ui_id.h +++ b/generated/gen_default_equality_operator_ui_id.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:94:0 +// external/bonsai_stdlib/src/poof_functions.h:96:0 link_internal b32 operator==( ui_id E1, ui_id E2 ) { diff --git a/generated/gen_hetero_vector_operators_v2_v2i.h b/generated/gen_hetero_vector_operators_v2_v2i.h index 9e2d4bb2c..db89dec20 100644 --- a/generated/gen_hetero_vector_operators_v2_v2i.h +++ b/generated/gen_hetero_vector_operators_v2_v2i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:353:0 +// external/bonsai_stdlib/src/poof_functions.h:355:0 inline v2 operator+( v2 P1, v2i P2 ) { diff --git a/generated/gen_hetero_vector_operators_v2i_v2.h b/generated/gen_hetero_vector_operators_v2i_v2.h index 7be21ab45..95e6ada9c 100644 --- a/generated/gen_hetero_vector_operators_v2i_v2.h +++ b/generated/gen_hetero_vector_operators_v2i_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:353:0 +// external/bonsai_stdlib/src/poof_functions.h:355:0 inline v2i operator+( v2i P1, v2 P2 ) { diff --git a/generated/gen_hetero_vector_operators_v3_u8_v3.h b/generated/gen_hetero_vector_operators_v3_u8_v3.h index ebd4696c4..912451aa0 100644 --- a/generated/gen_hetero_vector_operators_v3_u8_v3.h +++ b/generated/gen_hetero_vector_operators_v3_u8_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:353:0 +// external/bonsai_stdlib/src/poof_functions.h:355:0 inline v3_u8 operator+( v3_u8 P1, v3 P2 ) { diff --git a/generated/gen_hetero_vector_operators_v3_u8_v3i.h b/generated/gen_hetero_vector_operators_v3_u8_v3i.h index 7eefe4661..395eec253 100644 --- a/generated/gen_hetero_vector_operators_v3_u8_v3i.h +++ b/generated/gen_hetero_vector_operators_v3_u8_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:353:0 +// external/bonsai_stdlib/src/poof_functions.h:355:0 inline v3_u8 operator+( v3_u8 P1, v3i P2 ) { diff --git a/generated/gen_hetero_vector_operators_v3_v3i.h b/generated/gen_hetero_vector_operators_v3_v3i.h index 5d65a9227..a1214b70d 100644 --- a/generated/gen_hetero_vector_operators_v3_v3i.h +++ b/generated/gen_hetero_vector_operators_v3_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:353:0 +// external/bonsai_stdlib/src/poof_functions.h:355:0 inline v3 operator+( v3 P1, v3i P2 ) { diff --git a/generated/gen_hetero_vector_operators_v3i_v3.h b/generated/gen_hetero_vector_operators_v3i_v3.h index 74951f7fd..252a785e3 100644 --- a/generated/gen_hetero_vector_operators_v3i_v3.h +++ b/generated/gen_hetero_vector_operators_v3i_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:353:0 +// external/bonsai_stdlib/src/poof_functions.h:355:0 inline v3i operator+( v3i P1, v3 P2 ) { diff --git a/generated/gen_lerp_f32.h b/generated/gen_lerp_f32.h index fe3652368..c81c293b4 100644 --- a/generated/gen_lerp_f32.h +++ b/generated/gen_lerp_f32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:372:0 +// external/bonsai_stdlib/src/poof_functions.h:374:0 inline f32 Lerp(r32 t, f32 P1, f32 P2) { diff --git a/generated/gen_lerp_v2.h b/generated/gen_lerp_v2.h index e09918421..2a4429aa3 100644 --- a/generated/gen_lerp_v2.h +++ b/generated/gen_lerp_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:372:0 +// external/bonsai_stdlib/src/poof_functions.h:374:0 inline v2 Lerp(r32 t, v2 P1, v2 P2) { diff --git a/generated/gen_lerp_v3.h b/generated/gen_lerp_v3.h index 88ba38d0d..3ea998243 100644 --- a/generated/gen_lerp_v3.h +++ b/generated/gen_lerp_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:372:0 +// external/bonsai_stdlib/src/poof_functions.h:374:0 inline v3 Lerp(r32 t, v3 P1, v3 P2) { diff --git a/generated/gen_shader_uniform_push_camera.h b/generated/gen_shader_uniform_push_camera.h index 7fee726d4..59955653e 100644 --- a/generated/gen_shader_uniform_push_camera.h +++ b/generated/gen_shader_uniform_push_camera.h @@ -1,7 +1,7 @@ // external/bonsai_stdlib/src/poof_functions.h:14:0 b32 -InitShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name, u16 Count) +InitShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name, u32 *Count) { /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); @@ -21,6 +21,8 @@ InitShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name, u1 b32 InitShaderUniform(shader *Shader, u32 Index, camera *Value, const char *Name) { - return InitShaderUniform(Shader, Index, Value, Name, 1); + // Setting this to null implies a count of 1 + u32 *CountPtr = 0; + return InitShaderUniform(Shader, Index, Value, Name, CountPtr); } diff --git a/generated/gen_shader_uniform_push_light.h b/generated/gen_shader_uniform_push_light.h index 3dcb2104f..f519c2c4c 100644 --- a/generated/gen_shader_uniform_push_light.h +++ b/generated/gen_shader_uniform_push_light.h @@ -1,7 +1,7 @@ // external/bonsai_stdlib/src/poof_functions.h:14:0 b32 -InitShaderUniform(shader *Shader, u32 Index, light *Value, const char *Name, u16 Count) +InitShaderUniform(shader *Shader, u32 Index, light *Value, const char *Name, u32 *Count) { /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); @@ -21,6 +21,8 @@ InitShaderUniform(shader *Shader, u32 Index, light *Value, const char *Name, u16 b32 InitShaderUniform(shader *Shader, u32 Index, light *Value, const char *Name) { - return InitShaderUniform(Shader, Index, Value, Name, 1); + // Setting this to null implies a count of 1 + u32 *CountPtr = 0; + return InitShaderUniform(Shader, Index, Value, Name, CountPtr); } diff --git a/generated/gen_shader_uniform_push_m4.h b/generated/gen_shader_uniform_push_m4.h index 23b6435b9..be7894dd7 100644 --- a/generated/gen_shader_uniform_push_m4.h +++ b/generated/gen_shader_uniform_push_m4.h @@ -1,7 +1,7 @@ // external/bonsai_stdlib/src/poof_functions.h:14:0 b32 -InitShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name, u16 Count) +InitShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name, u32 *Count) { /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); @@ -21,6 +21,8 @@ InitShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name, u16 Co b32 InitShaderUniform(shader *Shader, u32 Index, m4 *Value, const char *Name) { - return InitShaderUniform(Shader, Index, Value, Name, 1); + // Setting this to null implies a count of 1 + u32 *CountPtr = 0; + return InitShaderUniform(Shader, Index, Value, Name, CountPtr); } diff --git a/generated/gen_shader_uniform_push_r32.h b/generated/gen_shader_uniform_push_r32.h index 9d5fbc5a3..6b8efaa31 100644 --- a/generated/gen_shader_uniform_push_r32.h +++ b/generated/gen_shader_uniform_push_r32.h @@ -1,7 +1,7 @@ // external/bonsai_stdlib/src/poof_functions.h:14:0 b32 -InitShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name, u16 Count) +InitShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name, u32 *Count) { /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); @@ -21,6 +21,8 @@ InitShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name, u16 C b32 InitShaderUniform(shader *Shader, u32 Index, r32 *Value, const char *Name) { - return InitShaderUniform(Shader, Index, Value, Name, 1); + // Setting this to null implies a count of 1 + u32 *CountPtr = 0; + return InitShaderUniform(Shader, Index, Value, Name, CountPtr); } diff --git a/generated/gen_shader_uniform_push_s32.h b/generated/gen_shader_uniform_push_s32.h index 0d719236c..c4e59ce77 100644 --- a/generated/gen_shader_uniform_push_s32.h +++ b/generated/gen_shader_uniform_push_s32.h @@ -1,7 +1,7 @@ // external/bonsai_stdlib/src/poof_functions.h:14:0 b32 -InitShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name, u16 Count) +InitShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name, u32 *Count) { /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); @@ -21,6 +21,8 @@ InitShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name, u16 C b32 InitShaderUniform(shader *Shader, u32 Index, s32 *Value, const char *Name) { - return InitShaderUniform(Shader, Index, Value, Name, 1); + // Setting this to null implies a count of 1 + u32 *CountPtr = 0; + return InitShaderUniform(Shader, Index, Value, Name, CountPtr); } diff --git a/generated/gen_shader_uniform_push_texture.h b/generated/gen_shader_uniform_push_texture.h index a02504000..d89b57be2 100644 --- a/generated/gen_shader_uniform_push_texture.h +++ b/generated/gen_shader_uniform_push_texture.h @@ -1,7 +1,7 @@ // external/bonsai_stdlib/src/poof_functions.h:14:0 b32 -InitShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name, u16 Count) +InitShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name, u32 *Count) { /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); @@ -21,6 +21,8 @@ InitShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name, u b32 InitShaderUniform(shader *Shader, u32 Index, texture *Value, const char *Name) { - return InitShaderUniform(Shader, Index, Value, Name, 1); + // Setting this to null implies a count of 1 + u32 *CountPtr = 0; + return InitShaderUniform(Shader, Index, Value, Name, CountPtr); } diff --git a/generated/gen_shader_uniform_push_u32.h b/generated/gen_shader_uniform_push_u32.h index 9afecbd22..33486c0d2 100644 --- a/generated/gen_shader_uniform_push_u32.h +++ b/generated/gen_shader_uniform_push_u32.h @@ -1,7 +1,7 @@ // external/bonsai_stdlib/src/poof_functions.h:14:0 b32 -InitShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name, u16 Count) +InitShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name, u32 *Count) { /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); @@ -21,6 +21,8 @@ InitShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name, u16 C b32 InitShaderUniform(shader *Shader, u32 Index, u32 *Value, const char *Name) { - return InitShaderUniform(Shader, Index, Value, Name, 1); + // Setting this to null implies a count of 1 + u32 *CountPtr = 0; + return InitShaderUniform(Shader, Index, Value, Name, CountPtr); } diff --git a/generated/gen_shader_uniform_push_v2.h b/generated/gen_shader_uniform_push_v2.h index 8d9f008ba..e4505f590 100644 --- a/generated/gen_shader_uniform_push_v2.h +++ b/generated/gen_shader_uniform_push_v2.h @@ -1,7 +1,7 @@ // external/bonsai_stdlib/src/poof_functions.h:14:0 b32 -InitShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name, u16 Count) +InitShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name, u32 *Count) { /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); @@ -21,6 +21,8 @@ InitShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name, u16 Co b32 InitShaderUniform(shader *Shader, u32 Index, v2 *Value, const char *Name) { - return InitShaderUniform(Shader, Index, Value, Name, 1); + // Setting this to null implies a count of 1 + u32 *CountPtr = 0; + return InitShaderUniform(Shader, Index, Value, Name, CountPtr); } diff --git a/generated/gen_shader_uniform_push_v3.h b/generated/gen_shader_uniform_push_v3.h index 475e0114b..e8d2c10e7 100644 --- a/generated/gen_shader_uniform_push_v3.h +++ b/generated/gen_shader_uniform_push_v3.h @@ -1,7 +1,7 @@ // external/bonsai_stdlib/src/poof_functions.h:14:0 b32 -InitShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name, u16 Count) +InitShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name, u32 *Count) { /* Assert(Count); */ Assert(Index < Shader->Uniforms.Count); @@ -21,6 +21,8 @@ InitShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name, u16 Co b32 InitShaderUniform(shader *Shader, u32 Index, v3 *Value, const char *Name) { - return InitShaderUniform(Shader, Index, Value, Name, 1); + // Setting this to null implies a count of 1 + u32 *CountPtr = 0; + return InitShaderUniform(Shader, Index, Value, Name, CountPtr); } diff --git a/generated/gen_vector_area_v2.h b/generated/gen_vector_area_v2.h index e272cf5a2..e5e36cf2c 100644 --- a/generated/gen_vector_area_v2.h +++ b/generated/gen_vector_area_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:427:0 +// external/bonsai_stdlib/src/poof_functions.h:429:0 inline r32 Area( v2 Vec ) { diff --git a/generated/gen_vector_area_v2i.h b/generated/gen_vector_area_v2i.h index 25a20d96e..0377528df 100644 --- a/generated/gen_vector_area_v2i.h +++ b/generated/gen_vector_area_v2i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:427:0 +// external/bonsai_stdlib/src/poof_functions.h:429:0 inline s32 Area( v2i Vec ) { diff --git a/generated/gen_vector_infix_operator_v3i_688856393.h b/generated/gen_vector_infix_operator_v3i_688856393.h index 26f7123a8..5c57d9638 100644 --- a/generated/gen_vector_infix_operator_v3i_688856393.h +++ b/generated/gen_vector_infix_operator_v3i_688856393.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:168:0 +// external/bonsai_stdlib/src/poof_functions.h:170:0 inline v3i operator&( v3i P1, v3i P2 ) { diff --git a/generated/gen_vector_infix_operator_v3i_688856449.h b/generated/gen_vector_infix_operator_v3i_688856449.h index f4a68d04c..6d2269889 100644 --- a/generated/gen_vector_infix_operator_v3i_688856449.h +++ b/generated/gen_vector_infix_operator_v3i_688856449.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:168:0 +// external/bonsai_stdlib/src/poof_functions.h:170:0 inline v3i operator^( v3i P1, v3i P2 ) { diff --git a/generated/gen_vector_normalize_funcs_v2.h b/generated/gen_vector_normalize_funcs_v2.h index a1ae45e23..26fbda967 100644 --- a/generated/gen_vector_normalize_funcs_v2.h +++ b/generated/gen_vector_normalize_funcs_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:571:0 +// external/bonsai_stdlib/src/poof_functions.h:573:0 inline v2 Normalize( v2 Vec, r32 Length) { diff --git a/generated/gen_vector_normalize_funcs_v3.h b/generated/gen_vector_normalize_funcs_v3.h index 835558d96..22f55e988 100644 --- a/generated/gen_vector_normalize_funcs_v3.h +++ b/generated/gen_vector_normalize_funcs_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:571:0 +// external/bonsai_stdlib/src/poof_functions.h:573:0 inline v3 Normalize( v3 Vec, r32 Length) { diff --git a/generated/gen_vector_operators_v2.h b/generated/gen_vector_operators_v2.h index f4cc7e2f6..d87b935bc 100644 --- a/generated/gen_vector_operators_v2.h +++ b/generated/gen_vector_operators_v2.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:268:0 +// external/bonsai_stdlib/src/poof_functions.h:270:0 link_internal void DeepCopy(v2 *Src, v2 *Dest) { diff --git a/generated/gen_vector_operators_v2i.h b/generated/gen_vector_operators_v2i.h index a76c88fb7..9fefb7c1d 100644 --- a/generated/gen_vector_operators_v2i.h +++ b/generated/gen_vector_operators_v2i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:268:0 +// external/bonsai_stdlib/src/poof_functions.h:270:0 link_internal void DeepCopy(v2i *Src, v2i *Dest) { diff --git a/generated/gen_vector_operators_v3.h b/generated/gen_vector_operators_v3.h index 14df01ea7..c4295839a 100644 --- a/generated/gen_vector_operators_v3.h +++ b/generated/gen_vector_operators_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:268:0 +// external/bonsai_stdlib/src/poof_functions.h:270:0 link_internal void DeepCopy(v3 *Src, v3 *Dest) { diff --git a/generated/gen_vector_operators_v3_u8.h b/generated/gen_vector_operators_v3_u8.h index ec506fe83..7c173f1af 100644 --- a/generated/gen_vector_operators_v3_u8.h +++ b/generated/gen_vector_operators_v3_u8.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:268:0 +// external/bonsai_stdlib/src/poof_functions.h:270:0 link_internal void DeepCopy(v3_u8 *Src, v3_u8 *Dest) { diff --git a/generated/gen_vector_operators_v3i.h b/generated/gen_vector_operators_v3i.h index b4b946f34..5b1b86284 100644 --- a/generated/gen_vector_operators_v3i.h +++ b/generated/gen_vector_operators_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:268:0 +// external/bonsai_stdlib/src/poof_functions.h:270:0 link_internal void DeepCopy(v3i *Src, v3i *Dest) { diff --git a/generated/gen_vector_operators_v4.h b/generated/gen_vector_operators_v4.h index b3ae4ee0c..fd9b63d89 100644 --- a/generated/gen_vector_operators_v4.h +++ b/generated/gen_vector_operators_v4.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:268:0 +// external/bonsai_stdlib/src/poof_functions.h:270:0 link_internal void DeepCopy(v4 *Src, v4 *Dest) { diff --git a/generated/generate_cursor_debug_profile_scope.h b/generated/generate_cursor_debug_profile_scope.h index 9038fc7ed..56edb2605 100644 --- a/generated/generate_cursor_debug_profile_scope.h +++ b/generated/generate_cursor_debug_profile_scope.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1538:0 +// external/bonsai_stdlib/src/poof_functions.h:1540:0 struct debug_profile_scope_cursor { debug_profile_scope *Start; diff --git a/generated/generate_cursor_functions_c_token_cursor.h b/generated/generate_cursor_functions_c_token_cursor.h index c19785198..25dde50e4 100644 --- a/generated/generate_cursor_functions_c_token_cursor.h +++ b/generated/generate_cursor_functions_c_token_cursor.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1560:0 +// external/bonsai_stdlib/src/poof_functions.h:1562:0 link_internal c_token_cursor CTokenCursor(umm ElementCount, memory_arena* Memory) diff --git a/generated/generate_cursor_functions_u64.h b/generated/generate_cursor_functions_u64.h index 6a3a281fd..40c9f7703 100644 --- a/generated/generate_cursor_functions_u64.h +++ b/generated/generate_cursor_functions_u64.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1560:0 +// external/bonsai_stdlib/src/poof_functions.h:1562:0 link_internal u64_cursor U64Cursor(umm ElementCount, memory_arena* Memory) diff --git a/generated/generate_cursor_octree_node.h b/generated/generate_cursor_octree_node.h index 941ac1b88..63604a975 100644 --- a/generated/generate_cursor_octree_node.h +++ b/generated/generate_cursor_octree_node.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1538:0 +// external/bonsai_stdlib/src/poof_functions.h:1540:0 struct octree_node_ptr_cursor { octree_node_ptr *Start; diff --git a/generated/generate_cursor_parser.h b/generated/generate_cursor_parser.h index 688b9ebba..31835c22a 100644 --- a/generated/generate_cursor_parser.h +++ b/generated/generate_cursor_parser.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1538:0 +// external/bonsai_stdlib/src/poof_functions.h:1540:0 struct parser_cursor { parser *Start; diff --git a/generated/generate_cursor_struct_u64.h b/generated/generate_cursor_struct_u64.h index 0bede233f..d8ed78b61 100644 --- a/generated/generate_cursor_struct_u64.h +++ b/generated/generate_cursor_struct_u64.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1545:0 +// external/bonsai_stdlib/src/poof_functions.h:1547:0 struct u64_cursor { u64 *Start; diff --git a/generated/generate_cursor_texture.h b/generated/generate_cursor_texture.h index 9fc439e35..0fb028e6c 100644 --- a/generated/generate_cursor_texture.h +++ b/generated/generate_cursor_texture.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1538:0 +// external/bonsai_stdlib/src/poof_functions.h:1540:0 struct texture_cursor { texture *Start; diff --git a/generated/generate_cursor_u8.h b/generated/generate_cursor_u8.h index bbfaaaa60..92c8f3305 100644 --- a/generated/generate_cursor_u8.h +++ b/generated/generate_cursor_u8.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1538:0 +// external/bonsai_stdlib/src/poof_functions.h:1540:0 struct u8_cursor { u8 *Start; diff --git a/generated/generate_cursor_v3.h b/generated/generate_cursor_v3.h index 76da62c48..16cf6895d 100644 --- a/generated/generate_cursor_v3.h +++ b/generated/generate_cursor_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1538:0 +// external/bonsai_stdlib/src/poof_functions.h:1540:0 struct v3_cursor { v3 *Start; diff --git a/generated/generate_cursor_voxel_stack_element.h b/generated/generate_cursor_voxel_stack_element.h index dfb885823..f0872acd7 100644 --- a/generated/generate_cursor_voxel_stack_element.h +++ b/generated/generate_cursor_voxel_stack_element.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1538:0 +// external/bonsai_stdlib/src/poof_functions.h:1540:0 struct voxel_stack_element_cursor { voxel_stack_element *Start; diff --git a/generated/generate_stack_octree_node_ptr_0.h b/generated/generate_stack_octree_node_ptr_0.h index c0c7dc3a4..8ededc1b3 100644 --- a/generated/generate_stack_octree_node_ptr_0.h +++ b/generated/generate_stack_octree_node_ptr_0.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1441:0 +// external/bonsai_stdlib/src/poof_functions.h:1443:0 struct octree_node_ptr_stack { octree_node_ptr *Start; diff --git a/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h b/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h index 1d5a913fe..83e7a8d0a 100644 --- a/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h +++ b/generated/generate_stack_voxel_synthesis_change_propagation_info_803395170.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1441:0 +// external/bonsai_stdlib/src/poof_functions.h:1443:0 struct voxel_synthesis_change_propagation_info_stack { voxel_synthesis_change_propagation_info *Start; diff --git a/generated/generate_stream_c_token_buffer.h b/generated/generate_stream_c_token_buffer.h index e76e7a562..5f826b4aa 100644 --- a/generated/generate_stream_c_token_buffer.h +++ b/generated/generate_stream_c_token_buffer.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2034:0 +// external/bonsai_stdlib/src/poof_functions.h:2036:0 struct c_token_buffer_stream_chunk { c_token_buffer Element; diff --git a/generated/generate_stream_compact_standing_spot.h b/generated/generate_stream_compact_standing_spot.h index 2ab67ab05..388668b7e 100644 --- a/generated/generate_stream_compact_standing_spot.h +++ b/generated/generate_stream_compact_standing_spot.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2004:0 +// external/bonsai_stdlib/src/poof_functions.h:2006:0 link_internal standing_spot_buffer Compact(standing_spot_stream *Stream, memory_arena *PermMemory) { diff --git a/generated/generate_stream_compact_u32.h b/generated/generate_stream_compact_u32.h index 6fbae1455..72d639ec9 100644 --- a/generated/generate_stream_compact_u32.h +++ b/generated/generate_stream_compact_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2004:0 +// external/bonsai_stdlib/src/poof_functions.h:2006:0 link_internal u32_buffer Compact(u32_stream *Stream, memory_arena *PermMemory) { diff --git a/generated/generate_stream_compact_u64.h b/generated/generate_stream_compact_u64.h index 6ecf4f520..5f0007a06 100644 --- a/generated/generate_stream_compact_u64.h +++ b/generated/generate_stream_compact_u64.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2004:0 +// external/bonsai_stdlib/src/poof_functions.h:2006:0 link_internal u64_buffer Compact(u64_stream *Stream, memory_arena *PermMemory) { diff --git a/generated/generate_stream_compact_v3i.h b/generated/generate_stream_compact_v3i.h index f93516e52..51bed0b55 100644 --- a/generated/generate_stream_compact_v3i.h +++ b/generated/generate_stream_compact_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2004:0 +// external/bonsai_stdlib/src/poof_functions.h:2006:0 link_internal v3i_buffer Compact(v3i_stream *Stream, memory_arena *PermMemory) { diff --git a/generated/generate_stream_parser.h b/generated/generate_stream_parser.h index 1d25ee996..1b84afb8a 100644 --- a/generated/generate_stream_parser.h +++ b/generated/generate_stream_parser.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2034:0 +// external/bonsai_stdlib/src/poof_functions.h:2036:0 struct parser_stream_chunk { parser Element; diff --git a/generated/generate_stream_standing_spot.h b/generated/generate_stream_standing_spot.h index 50bfaee9d..978840317 100644 --- a/generated/generate_stream_standing_spot.h +++ b/generated/generate_stream_standing_spot.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2034:0 +// external/bonsai_stdlib/src/poof_functions.h:2036:0 struct standing_spot_stream_chunk { standing_spot Element; diff --git a/generated/generate_stream_tagged_counted_string_stream.h b/generated/generate_stream_tagged_counted_string_stream.h index 731cb878b..4c6975a69 100644 --- a/generated/generate_stream_tagged_counted_string_stream.h +++ b/generated/generate_stream_tagged_counted_string_stream.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2034:0 +// external/bonsai_stdlib/src/poof_functions.h:2036:0 struct tagged_counted_string_stream_stream_chunk { tagged_counted_string_stream Element; diff --git a/generated/generate_stream_tuple_cs_cs.h b/generated/generate_stream_tuple_cs_cs.h index 2440736a1..d9b3b594e 100644 --- a/generated/generate_stream_tuple_cs_cs.h +++ b/generated/generate_stream_tuple_cs_cs.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2034:0 +// external/bonsai_stdlib/src/poof_functions.h:2036:0 struct tuple_cs_cs_stream_chunk { tuple_cs_cs Element; diff --git a/generated/generate_stream_u64.h b/generated/generate_stream_u64.h index 2723f306e..071e10a4f 100644 --- a/generated/generate_stream_u64.h +++ b/generated/generate_stream_u64.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2034:0 +// external/bonsai_stdlib/src/poof_functions.h:2036:0 struct u64_stream_chunk { u64 Element; diff --git a/generated/generate_stream_v3i.h b/generated/generate_stream_v3i.h index 1b8bca667..3fb6f7a0b 100644 --- a/generated/generate_stream_v3i.h +++ b/generated/generate_stream_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2034:0 +// external/bonsai_stdlib/src/poof_functions.h:2036:0 struct v3i_stream_chunk { v3i Element; diff --git a/generated/generate_string_table_Chunk_ID.h b/generated/generate_string_table_Chunk_ID.h index f5018f6ed..aa3203b86 100644 --- a/generated/generate_string_table_Chunk_ID.h +++ b/generated/generate_string_table_Chunk_ID.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1741:0 +// external/bonsai_stdlib/src/poof_functions.h:1743:0 link_internal b32 IsValid(Chunk_ID Value) { diff --git a/generated/generate_string_table_asset_load_state.h b/generated/generate_string_table_asset_load_state.h index 7a297cd9d..7209a26a4 100644 --- a/generated/generate_string_table_asset_load_state.h +++ b/generated/generate_string_table_asset_load_state.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1741:0 +// external/bonsai_stdlib/src/poof_functions.h:1743:0 link_internal b32 IsValid(asset_load_state Value) { diff --git a/generated/generate_string_table_c_token_type.h b/generated/generate_string_table_c_token_type.h index 2fe65a546..58e447a86 100644 --- a/generated/generate_string_table_c_token_type.h +++ b/generated/generate_string_table_c_token_type.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1741:0 +// external/bonsai_stdlib/src/poof_functions.h:1743:0 link_internal b32 IsValid(c_token_type Value) { diff --git a/generated/generate_string_table_entity_behavior_flags.h b/generated/generate_string_table_entity_behavior_flags.h index 7d222920f..46d27d491 100644 --- a/generated/generate_string_table_entity_behavior_flags.h +++ b/generated/generate_string_table_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1741:0 +// external/bonsai_stdlib/src/poof_functions.h:1743:0 link_internal b32 IsValid(entity_behavior_flags Value) { diff --git a/generated/generate_string_table_entity_state.h b/generated/generate_string_table_entity_state.h index 2f386ee4d..fc6091beb 100644 --- a/generated/generate_string_table_entity_state.h +++ b/generated/generate_string_table_entity_state.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1741:0 +// external/bonsai_stdlib/src/poof_functions.h:1743:0 link_internal b32 IsValid(entity_state Value) { diff --git a/generated/generate_string_table_parse_error_code.h b/generated/generate_string_table_parse_error_code.h index 30cd89c74..c31e52f09 100644 --- a/generated/generate_string_table_parse_error_code.h +++ b/generated/generate_string_table_parse_error_code.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1741:0 +// external/bonsai_stdlib/src/poof_functions.h:1743:0 link_internal b32 IsValid(parse_error_code Value) { diff --git a/generated/generate_string_table_text_encoding.h b/generated/generate_string_table_text_encoding.h index 3f7e06352..65c43d843 100644 --- a/generated/generate_string_table_text_encoding.h +++ b/generated/generate_string_table_text_encoding.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1741:0 +// external/bonsai_stdlib/src/poof_functions.h:1743:0 link_internal b32 IsValid(text_encoding Value) { diff --git a/generated/generate_string_table_token_cursor_source.h b/generated/generate_string_table_token_cursor_source.h index ba97f10d4..dd6d896c1 100644 --- a/generated/generate_string_table_token_cursor_source.h +++ b/generated/generate_string_table_token_cursor_source.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1741:0 +// external/bonsai_stdlib/src/poof_functions.h:1743:0 link_internal b32 IsValid(token_cursor_source Value) { diff --git a/generated/generate_string_table_world_chunk_mesh_bitfield.h b/generated/generate_string_table_world_chunk_mesh_bitfield.h index 282d0ece8..dd342a03a 100644 --- a/generated/generate_string_table_world_chunk_mesh_bitfield.h +++ b/generated/generate_string_table_world_chunk_mesh_bitfield.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1741:0 +// external/bonsai_stdlib/src/poof_functions.h:1743:0 link_internal b32 IsValid(world_chunk_mesh_bitfield Value) { diff --git a/generated/generate_string_table_world_chunk_mesh_index.h b/generated/generate_string_table_world_chunk_mesh_index.h index f67e6cf8b..319b502f5 100644 --- a/generated/generate_string_table_world_chunk_mesh_index.h +++ b/generated/generate_string_table_world_chunk_mesh_index.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1741:0 +// external/bonsai_stdlib/src/poof_functions.h:1743:0 link_internal b32 IsValid(world_chunk_mesh_index Value) { diff --git a/generated/hashtable_bonsai_type_info.h b/generated/hashtable_bonsai_type_info.h index 38b10165d..9d65fb770 100644 --- a/generated/hashtable_bonsai_type_info.h +++ b/generated/hashtable_bonsai_type_info.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:775:0 +// external/bonsai_stdlib/src/poof_functions.h:777:0 struct bonsai_type_info_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_counted_string.h b/generated/hashtable_counted_string.h index c099b7edc..38422bace 100644 --- a/generated/hashtable_counted_string.h +++ b/generated/hashtable_counted_string.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:775:0 +// external/bonsai_stdlib/src/poof_functions.h:777:0 struct counted_string_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_get_bonsai_type_info_902_689333910.h b/generated/hashtable_get_bonsai_type_info_902_689333910.h index 78ac71cbd..dbdc19f97 100644 --- a/generated/hashtable_get_bonsai_type_info_902_689333910.h +++ b/generated/hashtable_get_bonsai_type_info_902_689333910.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:976:0 +// external/bonsai_stdlib/src/poof_functions.h:978:0 bonsai_type_info_linked_list_node* GetBucketByName( bonsai_type_info_hashtable *Table, cs Query ) { diff --git a/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h b/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h index 6d394f337..25204aa2a 100644 --- a/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h +++ b/generated/hashtable_get_ptr_ui_toggle_31501_688856534.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1051:0 +// external/bonsai_stdlib/src/poof_functions.h:1053:0 maybe_ui_toggle_ptr GetPtrById( ui_toggle_hashtable *Table, ui_id Query ) { diff --git a/generated/hashtable_get_ptr_window_layout_705671517_599498827.h b/generated/hashtable_get_ptr_window_layout_705671517_599498827.h index 848de4554..9a1ca4f6a 100644 --- a/generated/hashtable_get_ptr_window_layout_705671517_599498827.h +++ b/generated/hashtable_get_ptr_window_layout_705671517_599498827.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1051:0 +// external/bonsai_stdlib/src/poof_functions.h:1053:0 maybe_window_layout_ptr GetPtrByHashtableKey( window_layout_hashtable *Table, ui_id Query ) { diff --git a/generated/hashtable_get_u32_hashtable_wrapper_688719149_688856424.h b/generated/hashtable_get_u32_hashtable_wrapper_688719149_688856424.h index e65302e4c..51f1e0577 100644 --- a/generated/hashtable_get_u32_hashtable_wrapper_688719149_688856424.h +++ b/generated/hashtable_get_u32_hashtable_wrapper_688719149_688856424.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:976:0 +// external/bonsai_stdlib/src/poof_functions.h:978:0 u32_linked_list_node* GetBucketByValue( u32_hashtable *Table, u32 Query ) { diff --git a/generated/hashtable_get_ui_toggle_31501_688856534.h b/generated/hashtable_get_ui_toggle_31501_688856534.h index 8a8fdcf93..f9acaa3e7 100644 --- a/generated/hashtable_get_ui_toggle_31501_688856534.h +++ b/generated/hashtable_get_ui_toggle_31501_688856534.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:976:0 +// external/bonsai_stdlib/src/poof_functions.h:978:0 ui_toggle_linked_list_node* GetBucketById( ui_toggle_hashtable *Table, ui_id Query ) { diff --git a/generated/hashtable_get_window_layout_705671517_599498827.h b/generated/hashtable_get_window_layout_705671517_599498827.h index 6762e73b9..1f4a6d572 100644 --- a/generated/hashtable_get_window_layout_705671517_599498827.h +++ b/generated/hashtable_get_window_layout_705671517_599498827.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:976:0 +// external/bonsai_stdlib/src/poof_functions.h:978:0 window_layout_linked_list_node* GetBucketByHashtableKey( window_layout_hashtable *Table, ui_id Query ) { diff --git a/generated/hashtable_impl_u32.h b/generated/hashtable_impl_u32.h index eb8f5b127..eb6d3106a 100644 --- a/generated/hashtable_impl_u32.h +++ b/generated/hashtable_impl_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:797:0 +// external/bonsai_stdlib/src/poof_functions.h:799:0 link_internal b32 AreEqual(u32_linked_list_node *Node1, u32_linked_list_node *Node2 ); link_internal b32 AreEqual(u32 *Element1, u32 *Element2 ); diff --git a/generated/hashtable_impl_ui_toggle.h b/generated/hashtable_impl_ui_toggle.h index 07e0b23e8..1ea6d93d5 100644 --- a/generated/hashtable_impl_ui_toggle.h +++ b/generated/hashtable_impl_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:797:0 +// external/bonsai_stdlib/src/poof_functions.h:799:0 link_internal b32 AreEqual(ui_toggle_linked_list_node *Node1, ui_toggle_linked_list_node *Node2 ); link_internal b32 AreEqual(ui_toggle *Element1, ui_toggle *Element2 ); diff --git a/generated/hashtable_impl_window_layout.h b/generated/hashtable_impl_window_layout.h index 3d072234d..c10879c4a 100644 --- a/generated/hashtable_impl_window_layout.h +++ b/generated/hashtable_impl_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:797:0 +// external/bonsai_stdlib/src/poof_functions.h:799:0 link_internal b32 AreEqual(window_layout_linked_list_node *Node1, window_layout_linked_list_node *Node2 ); link_internal b32 AreEqual(window_layout *Element1, window_layout *Element2 ); diff --git a/generated/hashtable_impl_xml_tag.h b/generated/hashtable_impl_xml_tag.h index 5d4eb6458..0d4fe6c7f 100644 --- a/generated/hashtable_impl_xml_tag.h +++ b/generated/hashtable_impl_xml_tag.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:797:0 +// external/bonsai_stdlib/src/poof_functions.h:799:0 link_internal b32 AreEqual(xml_tag_linked_list_node *Node1, xml_tag_linked_list_node *Node2 ); link_internal b32 AreEqual(xml_tag *Element1, xml_tag *Element2 ); diff --git a/generated/hashtable_parser.h b/generated/hashtable_parser.h index 5ebe5af81..a33201017 100644 --- a/generated/hashtable_parser.h +++ b/generated/hashtable_parser.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:775:0 +// external/bonsai_stdlib/src/poof_functions.h:777:0 struct parser_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_struct_u32.h b/generated/hashtable_struct_u32.h index 622eb20f1..3f552f5ff 100644 --- a/generated/hashtable_struct_u32.h +++ b/generated/hashtable_struct_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:778:0 +// external/bonsai_stdlib/src/poof_functions.h:780:0 struct u32_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_struct_ui_toggle.h b/generated/hashtable_struct_ui_toggle.h index 4501a0a9e..97f26a1f3 100644 --- a/generated/hashtable_struct_ui_toggle.h +++ b/generated/hashtable_struct_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:778:0 +// external/bonsai_stdlib/src/poof_functions.h:780:0 struct ui_toggle_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_struct_window_layout.h b/generated/hashtable_struct_window_layout.h index 122dee9c1..d2259b01c 100644 --- a/generated/hashtable_struct_window_layout.h +++ b/generated/hashtable_struct_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:778:0 +// external/bonsai_stdlib/src/poof_functions.h:780:0 struct window_layout_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_struct_xml_tag.h b/generated/hashtable_struct_xml_tag.h index 93bbe311b..0723a5734 100644 --- a/generated/hashtable_struct_xml_tag.h +++ b/generated/hashtable_struct_xml_tag.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:778:0 +// external/bonsai_stdlib/src/poof_functions.h:780:0 struct xml_tag_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_to_buffer_bonsai_type_info.h b/generated/hashtable_to_buffer_bonsai_type_info.h index 91a90f471..5a86bee7b 100644 --- a/generated/hashtable_to_buffer_bonsai_type_info.h +++ b/generated/hashtable_to_buffer_bonsai_type_info.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1085:0 +// external/bonsai_stdlib/src/poof_functions.h:1087:0 bonsai_type_info_buffer ToBuffer( bonsai_type_info_hashtable *Table, memory_arena *Memory ) { diff --git a/generated/hashtable_voxel_synth_tile.h b/generated/hashtable_voxel_synth_tile.h index d513a37ac..47d45e75c 100644 --- a/generated/hashtable_voxel_synth_tile.h +++ b/generated/hashtable_voxel_synth_tile.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:775:0 +// external/bonsai_stdlib/src/poof_functions.h:777:0 struct voxel_synth_tile_linked_list_node { b32 Tombstoned; diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 3337aec12..0f983797c 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:775:0 +// external/bonsai_stdlib/src/poof_functions.h:777:0 struct world_edit_brush_linked_list_node { b32 Tombstoned; diff --git a/generated/index_of_counted_string.h b/generated/index_of_counted_string.h index 5889d059d..fff02ac44 100644 --- a/generated/index_of_counted_string.h +++ b/generated/index_of_counted_string.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:600:0 +// external/bonsai_stdlib/src/poof_functions.h:602:0 link_internal umm IndexOf(counted_string_buffer *Buf, counted_string Element) { diff --git a/generated/maybe_asset_id.h b/generated/maybe_asset_id.h index 4566ef0b3..b5bf353f1 100644 --- a/generated/maybe_asset_id.h +++ b/generated/maybe_asset_id.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_asset_id { maybe_tag Tag; diff --git a/generated/maybe_asset_ptr.h b/generated/maybe_asset_ptr.h index 7e5fe25fa..f4a5ef16f 100644 --- a/generated/maybe_asset_ptr.h +++ b/generated/maybe_asset_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_asset_ptr { maybe_tag Tag; diff --git a/generated/maybe_bonsai_type_info.h b/generated/maybe_bonsai_type_info.h index 34dc4004a..f39c9ebba 100644 --- a/generated/maybe_bonsai_type_info.h +++ b/generated/maybe_bonsai_type_info.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_bonsai_type_info { maybe_tag Tag; diff --git a/generated/maybe_chunk_data.h b/generated/maybe_chunk_data.h index b4916859b..340432678 100644 --- a/generated/maybe_chunk_data.h +++ b/generated/maybe_chunk_data.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_chunk_data { maybe_tag Tag; diff --git a/generated/maybe_entity_ptr.h b/generated/maybe_entity_ptr.h index 6b30f6304..ea7752fde 100644 --- a/generated/maybe_entity_ptr.h +++ b/generated/maybe_entity_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_entity_ptr { maybe_tag Tag; diff --git a/generated/maybe_file_traversal_node.h b/generated/maybe_file_traversal_node.h index 73c52cf7c..78fa054ba 100644 --- a/generated/maybe_file_traversal_node.h +++ b/generated/maybe_file_traversal_node.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_file_traversal_node { maybe_tag Tag; diff --git a/generated/maybe_model_buffer.h b/generated/maybe_model_buffer.h index af3719d1c..22a92cd8b 100644 --- a/generated/maybe_model_buffer.h +++ b/generated/maybe_model_buffer.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_model_buffer { maybe_tag Tag; diff --git a/generated/maybe_standing_spot.h b/generated/maybe_standing_spot.h index ea9cdd458..7366867d5 100644 --- a/generated/maybe_standing_spot.h +++ b/generated/maybe_standing_spot.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_standing_spot { maybe_tag Tag; diff --git a/generated/maybe_u32.h b/generated/maybe_u32.h index cb93b3b85..6a336dbc4 100644 --- a/generated/maybe_u32.h +++ b/generated/maybe_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_u32 { maybe_tag Tag; diff --git a/generated/maybe_ui_toggle.h b/generated/maybe_ui_toggle.h index f189fbe9a..2443b7225 100644 --- a/generated/maybe_ui_toggle.h +++ b/generated/maybe_ui_toggle.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_ui_toggle { maybe_tag Tag; diff --git a/generated/maybe_ui_toggle_ptr.h b/generated/maybe_ui_toggle_ptr.h index bfe605b10..e92627c08 100644 --- a/generated/maybe_ui_toggle_ptr.h +++ b/generated/maybe_ui_toggle_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_ui_toggle_ptr { maybe_tag Tag; diff --git a/generated/maybe_v3.h b/generated/maybe_v3.h index f7878ba0b..a0c115e5c 100644 --- a/generated/maybe_v3.h +++ b/generated/maybe_v3.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_v3 { maybe_tag Tag; diff --git a/generated/maybe_v3i.h b/generated/maybe_v3i.h index 0cad3723c..c542cbda2 100644 --- a/generated/maybe_v3i.h +++ b/generated/maybe_v3i.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_v3i { maybe_tag Tag; diff --git a/generated/maybe_window_layout.h b/generated/maybe_window_layout.h index d7df3c626..c134b9120 100644 --- a/generated/maybe_window_layout.h +++ b/generated/maybe_window_layout.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_window_layout { maybe_tag Tag; diff --git a/generated/maybe_window_layout_ptr.h b/generated/maybe_window_layout_ptr.h index 048fb9c78..bd1056004 100644 --- a/generated/maybe_window_layout_ptr.h +++ b/generated/maybe_window_layout_ptr.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2196:0 +// external/bonsai_stdlib/src/poof_functions.h:2198:0 struct maybe_window_layout_ptr { maybe_tag Tag; diff --git a/generated/shader_magic_textured_quad_render_pass.h b/generated/shader_magic_textured_quad_render_pass.h index 97d77140d..ccbf12054 100644 --- a/generated/shader_magic_textured_quad_render_pass.h +++ b/generated/shader_magic_textured_quad_render_pass.h @@ -23,37 +23,65 @@ InitializeTexturedQuadRenderPass - Element->IsDepthTexture = IsDepthTexture; + Element->IsDepthTexture = IsDepthTexture; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->IsDepthTexture, + + + + &Element->IsDepthTexture, "IsDepthTexture" - ); + + + ); + - Element->HasAlphaChannel = HasAlphaChannel; + + Element->HasAlphaChannel = HasAlphaChannel; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->HasAlphaChannel, + + + + &Element->HasAlphaChannel, "HasAlphaChannel" - ); + - Element->TextureSlice = TextureSlice; + ); + + + + Element->TextureSlice = TextureSlice; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->TextureSlice, + + + + &Element->TextureSlice, "TextureSlice" - ); + + + ); - Element->Tint = Tint; + + + Element->Tint = Tint; InitShaderUniform( &Element->Program, UniformIndex++, - &Element->Tint, + + + + &Element->Tint, "Tint" - ); + + + ); + + @@ -82,28 +110,31 @@ UseRenderPass_textured_quad_render_pass s32 UniformIndex = 0; - { + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; AssertNoGlErrors; } - { + + { shader_uniform *Uniform = Element->Uniforms+UniformIndex; BindUniformById(Uniform, &TextureUnit); ++UniformIndex; @@ -112,6 +143,7 @@ UseRenderPass_textured_quad_render_pass + if (UniformIndex != 4 ) { Error("Shader (textured_quad_render_pass) had an incorrect number of uniform slots!"); diff --git a/generated/static_cursor_v2_0_986190493.h b/generated/static_cursor_v2_0_986190493.h index d7efbbcde..b7d1542c8 100644 --- a/generated/static_cursor_v2_0_986190493.h +++ b/generated/static_cursor_v2_0_986190493.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1233:0 +// external/bonsai_stdlib/src/poof_functions.h:1235:0 struct v2_static_cursor_16 { diff --git a/generated/staticbuffer_u32_cursor_ptr_961996651.h b/generated/staticbuffer_u32_cursor_ptr_961996651.h index c9958e874..e63fe0ce5 100644 --- a/generated/staticbuffer_u32_cursor_ptr_961996651.h +++ b/generated/staticbuffer_u32_cursor_ptr_961996651.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1183:0 +// external/bonsai_stdlib/src/poof_functions.h:1185:0 struct entropy_lists { u32_cursor Start[TILE_RULESETS_COUNT]; diff --git a/generated/stream_and_cursor_counted_string.h b/generated/stream_and_cursor_counted_string.h index 126ae9722..4d038e5c9 100644 --- a/generated/stream_and_cursor_counted_string.h +++ b/generated/stream_and_cursor_counted_string.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2054:0 +// external/bonsai_stdlib/src/poof_functions.h:2056:0 struct counted_string_cursor { counted_string *Start; diff --git a/generated/stream_and_cursor_s32.h b/generated/stream_and_cursor_s32.h index 3726e5f2a..1c84accdf 100644 --- a/generated/stream_and_cursor_s32.h +++ b/generated/stream_and_cursor_s32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2054:0 +// external/bonsai_stdlib/src/poof_functions.h:2056:0 struct s32_cursor { s32 *Start; diff --git a/generated/stream_and_cursor_u32.h b/generated/stream_and_cursor_u32.h index 97bbb7b0e..a25cfe1ef 100644 --- a/generated/stream_and_cursor_u32.h +++ b/generated/stream_and_cursor_u32.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2054:0 +// external/bonsai_stdlib/src/poof_functions.h:2056:0 struct u32_cursor { u32 *Start; diff --git a/generated/string_and_value_tables_asset_type.h b/generated/string_and_value_tables_asset_type.h index e1fd7e69a..46ab5991c 100644 --- a/generated/string_and_value_tables_asset_type.h +++ b/generated/string_and_value_tables_asset_type.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(asset_type Value) { diff --git a/generated/string_and_value_tables_bitmap_compression_type.h b/generated/string_and_value_tables_bitmap_compression_type.h index 95d3a42c0..a2d95bb47 100644 --- a/generated/string_and_value_tables_bitmap_compression_type.h +++ b/generated/string_and_value_tables_bitmap_compression_type.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(bitmap_compression_type Value) { diff --git a/generated/string_and_value_tables_chunk_flag.h b/generated/string_and_value_tables_chunk_flag.h index d127048d9..f45b25897 100644 --- a/generated/string_and_value_tables_chunk_flag.h +++ b/generated/string_and_value_tables_chunk_flag.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(chunk_flag Value) { diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index d0774d62a..77f970001 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(data_type Value) { diff --git a/generated/string_and_value_tables_engine_debug_view_mode.h b/generated/string_and_value_tables_engine_debug_view_mode.h index 0b50c3805..d2ac2dfda 100644 --- a/generated/string_and_value_tables_engine_debug_view_mode.h +++ b/generated/string_and_value_tables_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(engine_debug_view_mode Value) { diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index a91ba34cb..0f494cf7b 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(brush_layer_type Value) { diff --git a/generated/string_and_value_tables_file_traversal_node.h b/generated/string_and_value_tables_file_traversal_node.h index fd013141d..7f4b1cf83 100644 --- a/generated/string_and_value_tables_file_traversal_node.h +++ b/generated/string_and_value_tables_file_traversal_node.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(file_traversal_type Value) { diff --git a/generated/string_and_value_tables_lighting_quality_setting.h b/generated/string_and_value_tables_lighting_quality_setting.h index b272c5010..9d3c63552 100644 --- a/generated/string_and_value_tables_lighting_quality_setting.h +++ b/generated/string_and_value_tables_lighting_quality_setting.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(lighting_quality_setting Value) { diff --git a/generated/string_and_value_tables_log_level.h b/generated/string_and_value_tables_log_level.h index 2c779ee7b..3cdd10cb9 100644 --- a/generated/string_and_value_tables_log_level.h +++ b/generated/string_and_value_tables_log_level.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(log_level Value) { diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index f35689bdf..e8f00c933 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(maybe_tag Value) { diff --git a/generated/string_and_value_tables_model_index.h b/generated/string_and_value_tables_model_index.h index 1fcb52371..e64dd9584 100644 --- a/generated/string_and_value_tables_model_index.h +++ b/generated/string_and_value_tables_model_index.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(model_index Value) { diff --git a/generated/string_and_value_tables_particle_spawn_type.h b/generated/string_and_value_tables_particle_spawn_type.h index f3ce190cf..aca670ca9 100644 --- a/generated/string_and_value_tables_particle_spawn_type.h +++ b/generated/string_and_value_tables_particle_spawn_type.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(particle_spawn_type Value) { diff --git a/generated/string_and_value_tables_resolution_setting.h b/generated/string_and_value_tables_resolution_setting.h index 91272b924..ed1d15719 100644 --- a/generated/string_and_value_tables_resolution_setting.h +++ b/generated/string_and_value_tables_resolution_setting.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(resolution_setting Value) { diff --git a/generated/string_and_value_tables_shader_language_setting.h b/generated/string_and_value_tables_shader_language_setting.h index 8cd97c2bf..d1d4e7c0c 100644 --- a/generated/string_and_value_tables_shader_language_setting.h +++ b/generated/string_and_value_tables_shader_language_setting.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(shader_language_setting Value) { diff --git a/generated/string_and_value_tables_shadow_quality_setting.h b/generated/string_and_value_tables_shadow_quality_setting.h index dfb7beefd..62dc1ad15 100644 --- a/generated/string_and_value_tables_shadow_quality_setting.h +++ b/generated/string_and_value_tables_shadow_quality_setting.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(shadow_quality_setting Value) { diff --git a/generated/string_and_value_tables_shape_axis.h b/generated/string_and_value_tables_shape_axis.h index 4a9489a2b..b35dea975 100644 --- a/generated/string_and_value_tables_shape_axis.h +++ b/generated/string_and_value_tables_shape_axis.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(shape_axis Value) { diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 05c22483e..cde640349 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(shape_type Value) { diff --git a/generated/string_and_value_tables_texture_storage_format.h b/generated/string_and_value_tables_texture_storage_format.h index e4c8d19da..d7390a7c6 100644 --- a/generated/string_and_value_tables_texture_storage_format.h +++ b/generated/string_and_value_tables_texture_storage_format.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(texture_storage_format Value) { diff --git a/generated/string_and_value_tables_tone_mapping_type.h b/generated/string_and_value_tables_tone_mapping_type.h index 4de408fd6..4dd302d9e 100644 --- a/generated/string_and_value_tables_tone_mapping_type.h +++ b/generated/string_and_value_tables_tone_mapping_type.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(tone_mapping_type Value) { diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index 99b748842..29024bc82 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(ui_noise_type Value) { diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index 78cf00b5d..88a21fd6d 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(visible_region_size Value) { diff --git a/generated/string_and_value_tables_voxel_rule_direction.h b/generated/string_and_value_tables_voxel_rule_direction.h index 2f85f05bf..d6d81f8b1 100644 --- a/generated/string_and_value_tables_voxel_rule_direction.h +++ b/generated/string_and_value_tables_voxel_rule_direction.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(voxel_rule_direction Value) { diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 2caad8309..bd30645ef 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(world_edit_blend_mode Value) { diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 8eb24993c..d63fb65ce 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(world_edit_blend_mode_modifier Value) { diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index f18914772..88dee992f 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(world_edit_color_blend_mode Value) { diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index cabd2e8f4..070eaaa65 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:2046:0 +// external/bonsai_stdlib/src/poof_functions.h:2048:0 link_internal b32 IsValid(world_edit_selection_mode Value) { diff --git a/generated/tiered_mesh_freelist.h b/generated/tiered_mesh_freelist.h index c0fe8f04d..f1d04c3db 100644 --- a/generated/tiered_mesh_freelist.h +++ b/generated/tiered_mesh_freelist.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:1183:0 +// external/bonsai_stdlib/src/poof_functions.h:1185:0 struct tiered_mesh_freelist { mesh_freelist Start[TIERED_MESH_FREELIST_MAX_ELEMENTS]; diff --git a/generated/tuple_822959015.h b/generated/tuple_822959015.h index 03566adfb..b9129c574 100644 --- a/generated/tuple_822959015.h +++ b/generated/tuple_822959015.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/poof_functions.h:680:0 +// external/bonsai_stdlib/src/poof_functions.h:682:0 struct tuple_cs_cs { cs E0; diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index aab1386d624d04fe6a0a97776a3ee6404147e796..5d6faa1fc1bc54a59daf2a78ec5a94890cf03ee4 100644 GIT binary patch delta 2384 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 U^414g;jPJA*PVBB3lBQ}3u>qJ`v3p{ diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 8f5e01e22..a6fd63b0b 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -515,7 +515,7 @@ Bonsai_Render(engine_resources *Engine) .U32 = &Global_False, .ID = INVALID_SHADER_UNIFORM, .Name = "DrawMinorGrid", - .Count = 1, + .Count = 0, }; shader_uniform MajorGridUniform = @@ -524,7 +524,7 @@ Bonsai_Render(engine_resources *Engine) .U32 = &Global_False, .ID = INVALID_SHADER_UNIFORM, .Name = "DrawMajorGrid", - .Count = 1, + .Count = 0, }; diff --git a/src/engine/graphics.h b/src/engine/graphics.h index faad1e039..f3fda8bd6 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -97,14 +97,11 @@ poof( shader Program; shader_uniform Uniforms[2]; - /* u32 Foo; poof(@uniform) */ - /* u32 Bar; poof(@uniform) */ - /* easing_function *Func; */ - /* poof(@uniform(v2 *Points, Element->Func->Points.Start)) */ - /* poof(@uniform(u32 Count, Element->Func->Points.At)) */ - - v2 *Points; poof(@uniform @array_length(*Count)) - u32 *Count; poof(@uniform) + easing_function *Func; + poof( + @uniform("Points", Element->Func->Points.Start, &Element->Func->Points.At) + @uniform("Count", &Element->Func->Points.At, 0) + ) }; diff --git a/src/engine/shader.cpp b/src/engine/shader.cpp index 658d5c89d..0df4e9cf3 100644 --- a/src/engine/shader.cpp +++ b/src/engine/shader.cpp @@ -12,21 +12,23 @@ BindEngineUniform(shader_uniform *Uniform) { TIMED_FUNCTION(); + s32 Count = Uniform->Count ? s32(*Uniform->Count) : 1; + switch(Uniform->Type) { case ShaderUniform_Light: { TIMED_BLOCK("ShaderUniform_Light"); - Assert(Uniform->Count); - GetGL()->Uniform3fv(Uniform->ID, Uniform->Count, &Uniform->Light->Position.E[0]); + Assert(Count); + GetGL()->Uniform3fv(Uniform->ID, Count, &Uniform->Light->Position.E[0]); END_BLOCK(); } break; case ShaderUniform_Camera: { TIMED_BLOCK("ShaderUniform_Camera"); - Assert(Uniform->Count); - GetGL()->Uniform3fv(Uniform->ID, Uniform->Count, &Uniform->Camera->RenderSpacePosition.E[0]); + Assert(Count); + GetGL()->Uniform3fv(Uniform->ID, Count, &Uniform->Camera->RenderSpacePosition.E[0]); END_BLOCK(); } break; From 9b7aa47110337d340c1919c0c6311e17dd775e66 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 27 Oct 2025 15:38:00 -0700 Subject: [PATCH 363/421] Random hacking on world gen shaders --- examples/terrain_gen/game.cpp | 7 +- examples/terrain_gen/game.h | 2 +- ..._editor_ui_for_compound_type_debug_state.h | 12 +- ...o_editor_ui_for_compound_type_game_state.h | 6 +- ...compound_type_gpu_element_buffer_handles.h | 4 +- .../do_editor_ui_for_compound_type_graphics.h | 4 +- ...ditor_ui_for_compound_type_layered_brush.h | 5 +- ..._for_compound_type_lighting_render_group.h | 4 +- ..._ui_for_compound_type_lod_element_buffer.h | 12 +- ..._editor_ui_for_compound_type_octree_node.h | 4 +- ...tor_ui_for_compound_type_particle_system.h | 8 +- ..._editor_ui_for_compound_type_renderer_2d.h | 8 +- ...struct_terrain_decoration_render_context.h | 4 +- ...e_struct_terrain_finalize_render_context.h | 4 +- ...pe_struct_terrain_shaping_render_context.h | 33 ++- ...nd_type_struct_world_edit_render_context.h | 12 +- ...ui_for_compound_type_v2_static_cursor_16.h | 5 +- ..._ui_for_container_entity_ptr_block_array.h | 2 +- .../do_editor_ui_for_container_model_buffer.h | 2 +- ..._ui_for_container_shader_ptr_block_array.h | 2 +- generated/do_editor_ui_for_container_struct.h | 2 +- ...tor_ui_for_container_ui_toggle_hashtable.h | 2 +- .../do_editor_ui_for_container_v3_cursor.h | 2 +- ...world_edit_block_array_index_block_array.h | 2 +- generated/do_editor_ui_for_enum_asset_type.h | 2 +- generated/do_editor_ui_for_enum_chunk_flag.h | 2 +- generated/do_editor_ui_for_enum_data_type.h | 2 +- ...ditor_ui_for_enum_engine_debug_view_mode.h | 2 +- ...editor_ui_for_enum_entity_behavior_flags.h | 2 +- .../do_editor_ui_for_enum_entity_state.h | 2 +- ...o_editor_ui_for_enum_file_traversal_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- ...o_editor_ui_for_enum_particle_spawn_type.h | 2 +- ...do_editor_ui_for_enum_resolution_setting.h | 2 +- ...itor_ui_for_enum_shader_language_setting.h | 2 +- generated/do_editor_ui_for_enum_shape_axis.h | 2 +- generated/do_editor_ui_for_enum_shape_type.h | 2 +- .../do_editor_ui_for_enum_tone_mapping_type.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...o_editor_ui_for_enum_visible_region_size.h | 2 +- ..._editor_ui_for_enum_voxel_rule_direction.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- generated/for_datatypes_0XxWqGSZ.h | 1 + generated/for_datatypes_Bxw4Q7AW.h | 5 +- generated/for_datatypes_IXWy6K9V.h | 52 +++- generated/for_datatypes_cx51CcgQ.h | 2 + generated/for_datatypes_fkubhsYl.h | 1 + generated/for_datatypes_kh9dwrCf.h | 88 ------- generated/for_datatypes_khY6kwEk.h | 2 + generated/for_datatypes_kv3WBTai.h | 1 + generated/static_cursor_v2_0_986190493.h | 2 +- jesse.make.sh | 2 +- make.sh | 4 +- settings.init | 4 +- shaders/curve_remap_visualizer.fragmentshader | 37 +-- .../decoration/cliffy_hills.fragmentshader | 70 +++-- .../shaping/7_steep_ravines.fragmentshader | 22 +- .../shaping/8_shaped_voronoi_0.fragmentshader | 194 ++++++++++++++ .../shaping/8_shaped_voronoi_1.fragmentshader | 239 ++++++++++++++++++ .../shaping/8_shaped_voronoi_2.fragmentshader | 220 ++++++++++++++++ .../terrain/shaping/default.fragmentshader | 3 + src/engine/editor.cpp | 7 +- src/engine/editor.h | 11 +- src/engine/graphics.h | 23 +- src/engine/render/render_init.cpp | 2 +- src/engine/serdes.h | 4 +- 72 files changed, 955 insertions(+), 237 deletions(-) create mode 100644 shaders/terrain/shaping/8_shaped_voronoi_0.fragmentshader create mode 100644 shaders/terrain/shaping/8_shaped_voronoi_1.fragmentshader create mode 100644 shaders/terrain/shaping/8_shaped_voronoi_2.fragmentshader diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 4b0e5b372..46ad3d3ac 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -47,10 +47,13 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); - easing_function *EasingFunction = &GameState->EasingFunction; + easing_function *EasingFunction = &Graphics->TerrainShapingRC.ReshapeFunc; + GameState->EasingFunction = EasingFunction; Push(&EasingFunction->Points, V2(0,0)); - Push(&EasingFunction->Points, V2(0.5f)); + Push(&EasingFunction->Points, V2(0.47f, 0.10f)); + Push(&EasingFunction->Points, V2(0.67f,0.78f)); + Push(&EasingFunction->Points, V2(0.87f,0.70f)); Push(&EasingFunction->Points, V2(1,1)); InitializeEasingFunctionVisualizerRenderPass_Async( diff --git a/examples/terrain_gen/game.h b/examples/terrain_gen/game.h index 5279bbd4a..257545106 100644 --- a/examples/terrain_gen/game.h +++ b/examples/terrain_gen/game.h @@ -2,7 +2,7 @@ struct game_state { - easing_function EasingFunction; + easing_function *EasingFunction; easing_function_visualizer_render_pass EasingFunctionVisRP; }; diff --git a/generated/do_editor_ui_for_compound_type_debug_state.h b/generated/do_editor_ui_for_compound_type_debug_state.h index b2585c0e7..28348454e 100644 --- a/generated/do_editor_ui_for_compound_type_debug_state.h +++ b/generated/do_editor_ui_for_compound_type_debug_state.h @@ -1030,7 +1030,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, (128)) + s32 End = (128); + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, @@ -1119,7 +1121,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, (1024)) + s32 End = (1024); + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, @@ -1156,7 +1160,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, debug_state *Element, cs Name { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, (4096)) + s32 End = (4096); + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, diff --git a/generated/do_editor_ui_for_compound_type_game_state.h b/generated/do_editor_ui_for_compound_type_game_state.h index 61148c349..b3fb8ae17 100644 --- a/generated/do_editor_ui_for_compound_type_game_state.h +++ b/generated/do_editor_ui_for_compound_type_game_state.h @@ -1,5 +1,4 @@ -// examples/terrain_gen/game.cpp:68:0 - +// src/engine/editor.h:295:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, game_state *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Button) { @@ -39,7 +38,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_state *Element, cs Name, DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(easing_function*, &Element->EasingFunction), + Cast(easing_function*, Element->EasingFunction), MemberName, ThisHash, Params @@ -79,6 +78,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_state *Element, cs Name, } + if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } if (Name.Count) { PushTableEnd(Ui); } } diff --git a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h index 4eb99acb6..e3a1bff97 100644 --- a/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h +++ b/generated/do_editor_ui_for_compound_type_gpu_element_buffer_handles.h @@ -45,7 +45,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, gpu_element_buffer_handles *E { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 3) + s32 End = 3; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 96bd1f2b3..8c472daef 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -866,7 +866,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 2) + s32 End = 2; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, diff --git a/generated/do_editor_ui_for_compound_type_layered_brush.h b/generated/do_editor_ui_for_compound_type_layered_brush.h index d3bbe0647..93c92e0ca 100644 --- a/generated/do_editor_ui_for_compound_type_layered_brush.h +++ b/generated/do_editor_ui_for_compound_type_layered_brush.h @@ -71,7 +71,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, layered_brush *Element, cs Na { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 16) + s32 End = s32(Element->LayerCount); + Assert( End < 16 ); + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, diff --git a/generated/do_editor_ui_for_compound_type_lighting_render_group.h b/generated/do_editor_ui_for_compound_type_lighting_render_group.h index 408939849..8d9cb41f8 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_render_group.h +++ b/generated/do_editor_ui_for_compound_type_lighting_render_group.h @@ -70,7 +70,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_render_group *Elemen { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 26) + s32 End = 26; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, diff --git a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h index c03f504d8..d8ccb68b7 100644 --- a/generated/do_editor_ui_for_compound_type_lod_element_buffer.h +++ b/generated/do_editor_ui_for_compound_type_lod_element_buffer.h @@ -71,7 +71,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, MeshIndex_Count) + s32 End = MeshIndex_Count; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, @@ -108,7 +110,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, MeshIndex_Count) + s32 End = MeshIndex_Count; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, @@ -145,7 +149,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lod_element_buffer *Element, { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, MeshIndex_Count) + s32 End = MeshIndex_Count; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, diff --git a/generated/do_editor_ui_for_compound_type_octree_node.h b/generated/do_editor_ui_for_compound_type_octree_node.h index 7b328d33f..145e39821 100644 --- a/generated/do_editor_ui_for_compound_type_octree_node.h +++ b/generated/do_editor_ui_for_compound_type_octree_node.h @@ -193,7 +193,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, octree_node *Element, cs Name { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 8) + s32 End = 8; + + RangeIterator(ArrayIndex, End) { if (Element->Children[ArrayIndex]) {DoEditorUi(Ui, Window, Element->Children[ArrayIndex], CSz("Child"), ThisHash, Params);}; diff --git a/generated/do_editor_ui_for_compound_type_particle_system.h b/generated/do_editor_ui_for_compound_type_particle_system.h index 9f66ba321..ee60cd69d 100644 --- a/generated/do_editor_ui_for_compound_type_particle_system.h +++ b/generated/do_editor_ui_for_compound_type_particle_system.h @@ -585,7 +585,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 6) + s32 End = 6; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, @@ -623,7 +625,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_system *Element, cs { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, (4096)) + s32 End = (4096); + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index d20c2f7d9..34a054763 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -346,7 +346,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 64) + s32 End = 64; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, @@ -631,7 +633,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 128) + s32 End = 128; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h index 11833eced..c5709ce67 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_decoration_render_context.h @@ -70,7 +70,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_decoration_render_con { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 4) + s32 End = 4; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h index 668b9aa39..917b4604e 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_finalize_render_context.h @@ -70,7 +70,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_finalize_render_conte { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 1) + s32 End = 1; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, diff --git a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h index 7f2013019..dad663469 100644 --- a/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_terrain_shaping_render_context.h @@ -63,14 +63,16 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex if (ToggleButton(Ui, - CSz("v Uniforms[3]"), - CSz("> Uniforms[3]"), + CSz("v Uniforms[5]"), + CSz("> Uniforms[5]"), UiId(Window, "toggle terrain_shaping_render_context shader_uniform Uniforms", Element->Uniforms, ThisHash), Params )) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 3) + s32 End = 5; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, @@ -214,6 +216,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, terrain_shaping_render_contex + } + + + { + + + + cs MemberName = CSz("ReshapeFunc"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(easing_function*, &Element->ReshapeFunc), + MemberName, + ThisHash, + Params + ); + + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h index 5ad098871..cb2c2a192 100644 --- a/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h +++ b/generated/do_editor_ui_for_compound_type_struct_world_edit_render_context.h @@ -70,7 +70,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 4) + s32 End = 4; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, @@ -107,7 +109,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 3) + s32 End = 3; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, @@ -144,7 +148,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_render_context *El { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 3) + s32 End = 3; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, diff --git a/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h b/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h index dbfeeab37..ff1fec1af 100644 --- a/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h +++ b/generated/do_editor_ui_for_compound_type_v2_static_cursor_16.h @@ -45,7 +45,10 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, v2_static_cursor_16 *Element, { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 16) + s32 End = s32(Element->At); + Assert( End < 16 ); + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, diff --git a/generated/do_editor_ui_for_container_entity_ptr_block_array.h b/generated/do_editor_ui_for_container_entity_ptr_block_array.h index 08b70aaaa..cd5a7498c 100644 --- a/generated/do_editor_ui_for_container_entity_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_entity_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:519:0 +// src/engine/editor.h:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_ptr_block_array *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_container_model_buffer.h b/generated/do_editor_ui_for_container_model_buffer.h index eabbf7a3e..9dae81f55 100644 --- a/generated/do_editor_ui_for_container_model_buffer.h +++ b/generated/do_editor_ui_for_container_model_buffer.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:519:0 +// src/engine/editor.h:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, model_buffer *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_container_shader_ptr_block_array.h b/generated/do_editor_ui_for_container_shader_ptr_block_array.h index d58215a99..9d8878770 100644 --- a/generated/do_editor_ui_for_container_shader_ptr_block_array.h +++ b/generated/do_editor_ui_for_container_shader_ptr_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:519:0 +// src/engine/editor.h:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_ptr_block_array *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_container_struct.h b/generated/do_editor_ui_for_container_struct.h index 7aaaaabf1..d384d288d 100644 --- a/generated/do_editor_ui_for_container_struct.h +++ b/generated/do_editor_ui_for_container_struct.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:519:0 +// src/engine/editor.h:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_uniform_buffer *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h index a5d3f5743..45bcbc731 100644 --- a/generated/do_editor_ui_for_container_ui_toggle_hashtable.h +++ b/generated/do_editor_ui_for_container_ui_toggle_hashtable.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:519:0 +// src/engine/editor.h:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_toggle_hashtable *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_container_v3_cursor.h b/generated/do_editor_ui_for_container_v3_cursor.h index 32610c046..b37c05b78 100644 --- a/generated/do_editor_ui_for_container_v3_cursor.h +++ b/generated/do_editor_ui_for_container_v3_cursor.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:519:0 +// src/engine/editor.h:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v3_cursor *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h index e7fbfdca7..abcd134d5 100644 --- a/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h +++ b/generated/do_editor_ui_for_container_world_edit_block_array_index_block_array.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:519:0 +// src/engine/editor.h:526:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_block_array_index_block_array *Container, cs Name, u32 ParentHash, EDITOR_UI_FUNCTION_PROTO_DEFAULTS) { diff --git a/generated/do_editor_ui_for_enum_asset_type.h b/generated/do_editor_ui_for_enum_asset_type.h index bafef3de6..19c8c8d40 100644 --- a/generated/do_editor_ui_for_enum_asset_type.h +++ b/generated/do_editor_ui_for_enum_asset_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, asset_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_chunk_flag.h b/generated/do_editor_ui_for_enum_chunk_flag.h index 1a1148b9d..e095d1c11 100644 --- a/generated/do_editor_ui_for_enum_chunk_flag.h +++ b/generated/do_editor_ui_for_enum_chunk_flag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, chunk_flag *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 69a060fdc..cc41195e9 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h index 83a4ac8c3..c379028f0 100644 --- a/generated/do_editor_ui_for_enum_engine_debug_view_mode.h +++ b/generated/do_editor_ui_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_debug_view_mode *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_entity_behavior_flags.h b/generated/do_editor_ui_for_enum_entity_behavior_flags.h index c86e83451..744d21208 100644 --- a/generated/do_editor_ui_for_enum_entity_behavior_flags.h +++ b/generated/do_editor_ui_for_enum_entity_behavior_flags.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_behavior_flags *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_entity_state.h b/generated/do_editor_ui_for_enum_entity_state.h index fb341a427..6babbadfb 100644 --- a/generated/do_editor_ui_for_enum_entity_state.h +++ b/generated/do_editor_ui_for_enum_entity_state.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, entity_state *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_file_traversal_type.h b/generated/do_editor_ui_for_enum_file_traversal_type.h index ae16b8c70..b1a939a8c 100644 --- a/generated/do_editor_ui_for_enum_file_traversal_type.h +++ b/generated/do_editor_ui_for_enum_file_traversal_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, file_traversal_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 86e5c7d7d..c98b9cb72 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_particle_spawn_type.h b/generated/do_editor_ui_for_enum_particle_spawn_type.h index f42fa7676..cd4166f2c 100644 --- a/generated/do_editor_ui_for_enum_particle_spawn_type.h +++ b/generated/do_editor_ui_for_enum_particle_spawn_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, particle_spawn_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_resolution_setting.h b/generated/do_editor_ui_for_enum_resolution_setting.h index 0e1449ac0..c8326463f 100644 --- a/generated/do_editor_ui_for_enum_resolution_setting.h +++ b/generated/do_editor_ui_for_enum_resolution_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, resolution_setting *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_shader_language_setting.h b/generated/do_editor_ui_for_enum_shader_language_setting.h index 809546611..a0a16ce46 100644 --- a/generated/do_editor_ui_for_enum_shader_language_setting.h +++ b/generated/do_editor_ui_for_enum_shader_language_setting.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shader_language_setting *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_shape_axis.h b/generated/do_editor_ui_for_enum_shape_axis.h index 7f381bc3f..f6690efba 100644 --- a/generated/do_editor_ui_for_enum_shape_axis.h +++ b/generated/do_editor_ui_for_enum_shape_axis.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_axis *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_shape_type.h b/generated/do_editor_ui_for_enum_shape_type.h index b628f6655..23c8d573e 100644 --- a/generated/do_editor_ui_for_enum_shape_type.h +++ b/generated/do_editor_ui_for_enum_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, shape_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_tone_mapping_type.h b/generated/do_editor_ui_for_enum_tone_mapping_type.h index d10626591..2eefc69aa 100644 --- a/generated/do_editor_ui_for_enum_tone_mapping_type.h +++ b/generated/do_editor_ui_for_enum_tone_mapping_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, tone_mapping_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index e29a7a0d6..fb600da10 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index 7dddc6104..08341f7d8 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_enum_voxel_rule_direction.h b/generated/do_editor_ui_for_enum_voxel_rule_direction.h index dbbc44c7a..971bef498 100644 --- a/generated/do_editor_ui_for_enum_voxel_rule_direction.h +++ b/generated/do_editor_ui_for_enum_voxel_rule_direction.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel_rule_direction *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index a9afa2d54..193468287 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:551:0 +// src/engine/editor.h:558:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) { diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index 7b62d748d..8dbfb3ba2 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:551:0 +// src/engine/editor.h:558:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 21007791c..bf6bac200 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:551:0 +// src/engine/editor.h:558:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 35082d189..26ff66d45 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index b4b774369..fa93ac313 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:551:0 +// src/engine/editor.h:558:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 77c97d9b4..63b964227 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:458:0 +// src/engine/editor.h:465:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, u32 ParentHash, ui_render_params *Params = &DefaultUiRenderParams_Generic) { diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index d693d12e4..898039ba1 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:551:0 +// src/engine/editor.h:558:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) { diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index 21988ebe0..fa333ecb9 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -514,6 +514,7 @@ WorkQueueEntryAsyncFunction( initialize_easing_function_visualizer_render_pass_a + struct compile_shader_pair_async_params; diff --git a/generated/for_datatypes_Bxw4Q7AW.h b/generated/for_datatypes_Bxw4Q7AW.h index 05c8279b1..81f59b768 100644 --- a/generated/for_datatypes_Bxw4Q7AW.h +++ b/generated/for_datatypes_Bxw4Q7AW.h @@ -570,7 +570,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, easing_function_visualizer_re { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, 2) + s32 End = 2; + + RangeIterator(ArrayIndex, End) { DoEditorUi(Ui, Window, @@ -1189,5 +1191,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_region *Element, cs + diff --git a/generated/for_datatypes_IXWy6K9V.h b/generated/for_datatypes_IXWy6K9V.h index e61a3b058..ca7137e0f 100644 --- a/generated/for_datatypes_IXWy6K9V.h +++ b/generated/for_datatypes_IXWy6K9V.h @@ -1,4 +1,4 @@ -// src/engine/graphics.h:110:0 +// src/engine/graphics.h:115:0 @@ -2351,6 +2351,7 @@ UseShader( bloom_downsample_shader *Element ) + link_internal b32 @@ -2365,6 +2366,7 @@ InitializeTerrainShapingRenderContext , v3 ChunkDim , v3 WorldspaceChunkBasis , v3 ChunkResolution + , easing_function ReshapeFunc ) { @@ -2425,9 +2427,38 @@ InitializeTerrainShapingRenderContext + Element->ReshapeFunc = ReshapeFunc; + InitShaderUniform( + &Element->Program, + UniformIndex++, + + + + Element->ReshapeFunc.Points.Start, + "SampleRemapCurvePoints", + &Element->ReshapeFunc.Points.At + + ); + + + Element->ReshapeFunc = ReshapeFunc; + InitShaderUniform( + &Element->Program, + UniformIndex++, + + + + &Element->ReshapeFunc.Points.At, + "SampleRemapCurvePointCount", + 0 + + ); + + + - u32 Expected = 3 ; + u32 Expected = 5 ; if (UniformIndex != Expected ) { Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots! Expected (%d), Got (%d)", Expected, UniformIndex); @@ -2478,9 +2509,24 @@ UseRenderPass_terrain_shaping_render_context } + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit); + ++UniformIndex; + AssertNoGlErrors; + } + + { + shader_uniform *Uniform = Element->Uniforms+UniformIndex; + BindUniformById(Uniform, &TextureUnit); + ++UniformIndex; + AssertNoGlErrors; + } + + - if (UniformIndex != 3 ) + if (UniformIndex != 5 ) { Error("Shader (terrain_shaping_render_context) had an incorrect number of uniform slots!"); } diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h index f6ee01966..62887adb5 100644 --- a/generated/for_datatypes_cx51CcgQ.h +++ b/generated/for_datatypes_cx51CcgQ.h @@ -679,6 +679,7 @@ + link_internal void @@ -893,6 +894,7 @@ DoJob(compile_shader_pair_async_params *Params) + link_internal void diff --git a/generated/for_datatypes_fkubhsYl.h b/generated/for_datatypes_fkubhsYl.h index 9858b86a8..a0efd4f00 100644 --- a/generated/for_datatypes_fkubhsYl.h +++ b/generated/for_datatypes_fkubhsYl.h @@ -505,6 +505,7 @@ initialize_easing_function_visualizer_render_pass_async_params initialize_easing + compile_shader_pair_async_params compile_shader_pair_async_params; diff --git a/generated/for_datatypes_kh9dwrCf.h b/generated/for_datatypes_kh9dwrCf.h index e0f901aad..ed502a65f 100644 --- a/generated/for_datatypes_kh9dwrCf.h +++ b/generated/for_datatypes_kh9dwrCf.h @@ -65,24 +65,6 @@ - - - - - - - - - - - - - - - - - - @@ -311,8 +293,6 @@ PushToolbar( renderer_2d *Ui, - - link_internal b32 IsValid(selection_modification_mode Value) { @@ -453,12 +433,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, selection_modification_mode * - - - - - - @@ -651,7 +625,6 @@ PushToolbar( renderer_2d *Ui, - link_internal b32 IsValid(ui_reorder_action Value) { @@ -850,15 +823,6 @@ PushToolbar( renderer_2d *Ui, - - - - - - - - - @@ -1096,18 +1060,6 @@ PushToolbar( renderer_2d *Ui, - - - - - - - - - - - - @@ -1487,46 +1439,6 @@ PushToolbar( renderer_2d *Ui, - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h index 948ba9b13..ed1d5bcde 100644 --- a/generated/for_datatypes_khY6kwEk.h +++ b/generated/for_datatypes_khY6kwEk.h @@ -679,6 +679,7 @@ + struct compile_shader_pair_async_params poof(@async_function_params) @@ -882,6 +883,7 @@ struct compile_shader_pair_async_params poof(@async_function_params) + struct initialize_easing_function_visualizer_render_pass_async_params poof(@async_function_params) diff --git a/generated/for_datatypes_kv3WBTai.h b/generated/for_datatypes_kv3WBTai.h index 157743444..f439ca48c 100644 --- a/generated/for_datatypes_kv3WBTai.h +++ b/generated/for_datatypes_kv3WBTai.h @@ -505,6 +505,7 @@ type_initialize_easing_function_visualizer_render_pass_async_params, + type_compile_shader_pair_async_params, diff --git a/generated/static_cursor_v2_0_986190493.h b/generated/static_cursor_v2_0_986190493.h index b7d1542c8..e2bc60af1 100644 --- a/generated/static_cursor_v2_0_986190493.h +++ b/generated/static_cursor_v2_0_986190493.h @@ -2,7 +2,7 @@ struct v2_static_cursor_16 { - v2 Start[16]; + v2 Start[16]; poof(@array_length(Element->At)) u32 At; }; diff --git a/jesse.make.sh b/jesse.make.sh index c4b277014..687048d17 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/make.sh b/make.sh index ff9c1689e..2774725d4 100755 --- a/make.sh +++ b/make.sh @@ -340,8 +340,8 @@ function RunPoof # RunPoofHelper -o generated examples/turn_based/game.cpp && echo -e "$Success poofed examples/turn_based/game.cpp" & # TrackPid "" $! - # RunPoofHelper -o generated examples/terrain_gen/game.cpp && echo -e "$Success poofed examples/terrain_gen/game.cpp" & - # TrackPid "" $! + RunPoofHelper -o generated examples/terrain_gen/game.cpp && echo -e "$Success poofed examples/terrain_gen/game.cpp" & + TrackPid "" $! # RunPoofHelper -o generated examples/the_wanderer/game.cpp && echo -e "$Success poofed examples/the_wanderer/game.cpp" & # TrackPid "" $! diff --git a/settings.init b/settings.init index 3679271cd..143b2d4d1 100644 --- a/settings.init +++ b/settings.init @@ -4,8 +4,8 @@ // // resolution = ResolutionSetting_4096x2160 - resolution = ResolutionSetting_1920x1080 -// resolution = ResolutionSetting_1280x720 +// resolution = ResolutionSetting_1920x1080 + resolution = ResolutionSetting_1280x720 diff --git a/shaders/curve_remap_visualizer.fragmentshader b/shaders/curve_remap_visualizer.fragmentshader index 5c2d883f6..59f1b5f0d 100644 --- a/shaders/curve_remap_visualizer.fragmentshader +++ b/shaders/curve_remap_visualizer.fragmentshader @@ -15,48 +15,13 @@ WithinTolerance(f32 Epsilon, f32 A, f32 B) } -f32 Remap(f32 SampleX, v2 Points[16], u32 PointCount ) -{ - - f32 Result = -1.f; - v2 PrevP = Points[0]; - for (u32 PointIndex = 1u; PointIndex < PointCount; ++PointIndex) - { - v2 NextP = Points[PointIndex]; - - if (SampleX >= PrevP.x && SampleX < NextP.x) - { - - - r32 Range = PrevP.x - NextP.x; - r32 t = Clamp01((SampleX-NextP.x) / Range); - - Result = CosineInterpolate(t, NextP.y, PrevP.y); - - /* Result = mix(NextP.y, PrevP.y, t); */ - /* Result = QuinticInterpolate(Result); */ - /* Result = QuinticInterpolate(Result); */ - - /* Result = CubicInterpolate(Result); */ - /* Result = Smoothstep(Result); */ - /* Result = Smoothstep(Result); */ - - break; - } - - PrevP = NextP; - } - - /* Result = abs(max(Result, 1.0)); */ - return Result; -} void main() { Output = V4(1,1,1,1); - f32 Mapped = Remap(UV.x, Points, Count); + f32 Mapped = RemapSample(UV.x, Points, Count); if (Mapped == -1.f) { diff --git a/shaders/terrain/decoration/cliffy_hills.fragmentshader b/shaders/terrain/decoration/cliffy_hills.fragmentshader index c1adbe418..fc7825dbe 100644 --- a/shaders/terrain/decoration/cliffy_hills.fragmentshader +++ b/shaders/terrain/decoration/cliffy_hills.fragmentshader @@ -165,23 +165,20 @@ v4 DoCliffs(v3 Basis, v3 Deriv) return V4(ColorValue, NoiseValue); } -v4 DoCliffs_v2(v3 Basis, v3 Deriv) +v4 DoCliffs_v2(v3 Basis, v3 Deriv, v3 InputColor) { + v3 Up = V3(0, 0, 1); v3 Down = V3(0, 0, -1); - v3 ColorValue = V3(0.f); - f32 NoiseValue = 0.f; - - /* NoiseValue = 100.f+MapNoiseValueToFinal(NoiseValue); */ - /* Deriv = normalize(Deriv); */ /* Deriv.xy = abs(Deriv.xy); */ - f32 Cliffness = Clamp01(0.8f+dot(Down, Deriv)); + f32 Cliffness = Clamp01(-dot(Up, Deriv) + 0.6f); f32 Grassness = Clamp01(.15f-Cliffness); - ColorValue = mix(v3(.1,.8,.2), v3(.3), Cliffness); + /* ColorValue = mix(v3(.1,.8,.2), v3(.3), Cliffness); */ /* ColorValue = mix(v3(.1,.8,.2), v3(.3), pow(Cliffness, .2)); */ /* ColorValue = Cliffness > 0.15f ? V3(0.3f) : v3(.1,.8,.2); */ + /* ColorValue = V3(Cliffness); */ /* f32 rng2d = white_noise(Basis.xy); */ /* f32 rng3d = white_noise(Basis); */ @@ -190,15 +187,44 @@ v4 DoCliffs_v2(v3 Basis, v3 Deriv) v3 CliffColor = BaseCliffColor; f32 CliffValue = 0.f; - /* CliffColor = mix(V3(1,0,0), BaseCliffColor, Cliffness); */ + { + v3 v = voronoi_noise(Basis/v3(800,800,500)); + CliffValue += (v.x*2500)*Cliffness; + } + { + v3 v = voronoi_noise(Basis/v3(200,200,1800)); + CliffValue += (v.y*50)*Cliffness; + CliffValue += (v.x*100)*Cliffness; + } + { + v3 v = voronoi_noise(Basis/v3(50,50,100)); + /* CliffValue += (v.y*80)*Cliffness; */ + CliffValue += (v.x*100)*Cliffness; + } + - /* // Main cliffs */ - /* { */ - /* v3 v = voronoi_noise(Basis/v3(200,200,1800)); */ - /* CliffValue += (v.x*100)*Cliffness; */ - /* CliffValue += (v.y*20)*Cliffness; */ - /* CliffColor = mix(CliffColor, BaseCliffColor, clamp(10.f*Cliffness*v.x,0,1)); */ - /* } */ + CliffColor = V3(abs(Cliffness)); + CliffColor = Cliffness > 0.15f ? BaseCliffColor : InputColor; + f32 FullColorThresh = 0.25f; + if (Cliffness > 0.f) + { + if (Cliffness > FullColorThresh) + { + CliffColor = BaseCliffColor; + } + else + { + f32 white = FullColorThresh*white_noise(Basis); + if (white < Cliffness) + { + CliffColor = BaseCliffColor; + } + else + { + CliffColor = InputColor; + } + } + } return V4(CliffColor, CliffValue); @@ -230,11 +256,17 @@ void main() // Put random junk here f32 CosTheta = Dot(Derivs, Normalize(V3(0,0,1))); - v4 Cliffs = DoCliffs_v2(Basis, Derivs); + v4 Cliffs = DoCliffs_v2(Basis, Derivs, ColorValue); + + f32 CliffContrib = exp((-Basis.z)/1300.f); + ColorValue = V3(CliffContrib); + + /* Cliffs.w *= 10.f*CliffContrib; */ + /* Cliffs.w *= CliffContrib; */ /* ColorValue = V3(0.1f, 0.8f, 0.1f); */ - ColorValue = Cliffs.rgb; - NoiseValue += Cliffs.w; + ColorValue = Cliffs.rgb; + NoiseValue += Cliffs.w * CliffContrib; } // diff --git a/shaders/terrain/shaping/7_steep_ravines.fragmentshader b/shaders/terrain/shaping/7_steep_ravines.fragmentshader index 691c93079..0a371cd7b 100644 --- a/shaders/terrain/shaping/7_steep_ravines.fragmentshader +++ b/shaders/terrain/shaping/7_steep_ravines.fragmentshader @@ -1,3 +1,6 @@ +uniform v2 SampleRemapCurvePoints[16]; +uniform u32 SampleRemapCurvePointCount; + uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; @@ -21,12 +24,12 @@ void main() // -- user code -- // { - v3 Period = V3(1200.f); - float Amplitude = 1800.f; + v3 Period = V3(800.f); + float Amplitude = 800.f; /* f32 StartingZDepth = 10000; */ - f32 StartingZDepth = 2000; + f32 StartingZDepth = 1000; /* f32 StartingZDepth = 0; */ - s32 Octaves = 1; + s32 Octaves = 2; NoiseValue = StartingZDepth; v3 Deriv = v3(0.f); @@ -35,12 +38,19 @@ void main() /* v3 warp = v3(gradient_noise_derivs(Basis).x); */ v3 warp = v3(0.f); + { + v3 xyz = Basis / (Period); + v4 gn = gradient_noise_derivs(xyz+warp); + NoiseValue += RemapSample((gn.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount ) * Amplitude; + } - for (s32 Octave = 1; Octave <= Octaves; ++Octave) + for (s32 Octave = 2; Octave <= Octaves; ++Octave) { v3 xyz = Basis / (Period/Octave); v4 gn = gradient_noise_derivs(xyz+warp); - NoiseValue += RemapSample((gn.x+1.f)/2.f)*(Amplitude/Octave); + + NoiseValue += ((gn.x+1.f)/2.f) * Amplitude/Octave; + /* NoiseValue += RemapSample((gn.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount )*(Amplitude/Octave); */ } v3 Up = V3(0, 0, 1); diff --git a/shaders/terrain/shaping/8_shaped_voronoi_0.fragmentshader b/shaders/terrain/shaping/8_shaped_voronoi_0.fragmentshader new file mode 100644 index 000000000..348205527 --- /dev/null +++ b/shaders/terrain/shaping/8_shaped_voronoi_0.fragmentshader @@ -0,0 +1,194 @@ +uniform v2 SampleRemapCurvePoints[16]; +uniform u32 SampleRemapCurvePointCount; + +uniform v3 WorldspaceChunkBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out v4 Output; + + + + + + + + +uvec3 murmurHash33(uvec3 src) { + const uint M = 0x5bd1e995u; + uvec3 h = uvec3(1190494759u, 2147483647u, 3559788179u); + src *= M; src ^= src>>24u; src *= M; + h *= M; h ^= src.x; h *= M; h ^= src.y; h *= M; h ^= src.z; + h ^= h>>13u; h *= M; h ^= h>>15u; + return h; +} + +vec3 hash(vec3 src) { + uvec3 h = murmurHash33(floatBitsToUint(src)); + return uintBitsToFloat(h & 0x007fffffu | 0x3f800000u) - 1.0; +} + +float sdLpDistance(in vec2 p, in float r, in float p_norm) { + // (|x|^p + |y|^p)^(1/p) + vec2 q = abs(p); + float d = pow(pow(q.x, p_norm) + pow(q.y, p_norm), 1.0 / p_norm); + return d - r; +} + +vec2 get_point(vec2 pos) { + ivec2 p = ivec2(floor(pos - 1.)) * 3; + vec3 rng = hash(vec3(float(p.x), float(p.y), float(p.x + p.y))); + return rng.xy; +} + +const vec2 offsets[24] = vec2[24]( + vec2(-2, -2), vec2(-1, -2), vec2(0, -2), vec2(1, -2), vec2(2, -2), + vec2(-2, -1), vec2(-1, -1), vec2(0, -1), vec2(1, -1), vec2(2, -1), + vec2(-2, 0), vec2(-1, 0), vec2(1, 0), vec2(2, 0), + vec2(-2, 1), vec2(-1, 1), vec2(0, 1), vec2(1, 1), vec2(2, 1), + vec2(-2, 2), vec2(-1, 2), vec2(0, 2), vec2(1, 2), vec2(2, 2) +); + +float sdShape(vec2 pos) { + float p_norm = 3.25f; + return sdLpDistance(pos, 0.9, p_norm); +} + +float sdVoronoi(vec2 pos) { + pos -= 0.5; + vec2 p = fract(pos); + + vec2 nearest = get_point(pos); + vec2 lastnearest = vec2(100.); + vec2 current = vec2(0.); + + vec3 dists = vec3( + sdShape(p - nearest), + sdShape(p - lastnearest), + sdShape(p - current) + ); + + for (int i = 0; i < 24; i++) { + current = offsets[i]; + current += get_point(pos + offsets[i]); + dists.z = sdShape(p - current); + if (dists.z < dists.y) { + dists.yz = dists.zy; + lastnearest = current; + } + if (dists.y < dists.x) { + dists.xy = dists.yx; + lastnearest = nearest; + nearest = current; + } + } + + float d = sdShape(p - lastnearest); + return d; +} + +float scene(vec2 p) { + float d = sdVoronoi(p); + return d; +} + +/* vec4 noise( vec2 uv ) { */ +/* vec2 m = vec2(0,0); */ +/* float d = scene(uv); */ + +/* vec3 col = (d>0.0) ? vec3(0.9,0.6,0.3) : vec3(0.65,0.85,1.0); */ +/* col *= 2.0 - exp(-6.0*abs(d)); */ +/* col *= 0.8 + 0.2*cos(150.0*d); */ +/* col = mix( col, vec3(1.0), 1.0-smoothstep(0.0,0.01,abs(d))); */ + +/* if(uv.x<0.)col = vec3(smoothstep(-1., 1., d)); */ + +/* if (d<0.01 && d>0.){col = vec3(0.);} */ + +/* v4 Result = vec4(col,d); */ +/* return Result; */ +/* } */ + + +v4 noise(vec2 uv) +{ + + float d = scene(uv); + v2 m = v2(0); + + + vec3 col = (d > 0.0) ? vec3(0.9, 0.6, 0.3) : vec3(0.65, 0.85, 1.0); + col *= 1.0 - exp(-6.0 * abs(d)); + col *= 0.8 + 0.2 * cos(150.0 * d); + col = mix(col, vec3(1.0), 1.0 - smoothstep(0.0, 0.01, abs(d))); + + if (uv.x < 0.) col = vec3(smoothstep(-1., 1., d)); + + /* d = length(uv - m) - abs(scene(m)); */ + + if (d < 0.01 && d > 0.) col = vec3(0.); + + v4 Result = vec4(col, d); + return Result; +} + + +f32 ClampPositive(f32 Value) +{ + return Value < 0.f ? 0.f : Value; +} + + + + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); + + + vec3 Offset = vec3(0); + vec3 Basis = Offset + WorldspaceChunkBasis + (vec3(x,y,z)*ChunkResolution); + + + // NOTE(Jesse): Set these in the -- user code -- section + vec3 ColorValue = vec3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + f32 StartingZDepth = 800.f; + NoiseValue += StartingZDepth - Basis.z; + + f32 CliffMask = 1.f; + { + vec3 Period = vec3(250.f); + /* vec3 Period = vec3(10.f); */ + float Amplitude = 200.f; + + vec3 xyz = Basis / Period; + v4 N = noise(xyz.xy); + + /* N.w *= -1.f; */ + /* N.w = ClampPositive(N.w); */ + + N.w = (N.w/2.f)+0.5f; + + N.w = RemapSample(N.w, SampleRemapCurvePoints, SampleRemapCurvePointCount ); + + NoiseValue += ClampPositive(N.w * Amplitude); + ColorValue = N.rgb; + } + + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; +} diff --git a/shaders/terrain/shaping/8_shaped_voronoi_1.fragmentshader b/shaders/terrain/shaping/8_shaped_voronoi_1.fragmentshader new file mode 100644 index 000000000..51cc2645c --- /dev/null +++ b/shaders/terrain/shaping/8_shaped_voronoi_1.fragmentshader @@ -0,0 +1,239 @@ +uniform v2 SampleRemapCurvePoints[16]; +uniform u32 SampleRemapCurvePointCount; + +uniform v3 WorldspaceChunkBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out v4 Output; + +#define PI 3.14159265358 + +uvec3 murmurHash33(uvec3 src) { + const uint M = 0x5bd1e995u; + uvec3 h = uvec3(1190494759u, 2147483647u, 3559788179u); + src *= M; src ^= src>>24u; src *= M; + h *= M; h ^= src.x; h *= M; h ^= src.y; h *= M; h ^= src.z; + h ^= h>>13u; h *= M; h ^= h>>15u; + return h; +} + +// 3 outputs, 3 inputs +vec3 hash(vec3 src) { + uvec3 h = murmurHash33(floatBitsToUint(src)); + return uintBitsToFloat(h & 0x007fffffu | 0x3f800000u) - 1.0; +} + +float sdBox( in vec2 p, in vec2 b, in vec4 r ) +{ + r.xy = (p.x>0.0)?r.xy : r.zw; + r.x = (p.y>0.0)?r.x : r.y; + vec2 q = abs(p)-b+r.x; + return min(max(q.x,q.y),0.0) + length(max(q,0.0)) - r.x; +} + +float sdPentagram(in vec2 p, in float r ) +{ + const float k1x = 0.809016994; // cos(¿/ 5) = ¼(¿5+1) + const float k2x = 0.309016994; // sin(¿/10) = ¼(¿5-1) + const float k1y = 0.587785252; // sin(¿/ 5) = ¼¿(10-2¿5) + const float k2y = 0.951056516; // cos(¿/10) = ¼¿(10+2¿5) + const float k1z = 0.726542528; // tan(¿/ 5) = ¿(5-2¿5) + const vec2 ve1 = vec2( k1x,-k1y); + const vec2 ve2 = vec2(-k1x,-k1y); + const vec2 ve3 = vec2( k2x,-k2y); + + p.x = abs(p.x); + p -= 2.0*max(dot(ve1,p),0.0)*ve1; + p -= 2.0*max(dot(ve2,p),0.0)*ve2; + p.x = abs(p.x); + p.y -= r; + return length(p-ve3*clamp(dot(p,ve3),0.0,k1z*r)) + * sign(p.y*ve3.x-p.x*ve3.y); +} + +float sdOrientedBox( in vec2 p, in vec2 a, in vec2 b, float th ) +{ + float l = length(b-a); + vec2 d = (b-a)/l; + vec2 q = p-(a+b)*0.5; + q = mat2(d.x,-d.y,d.y,d.x)*q; + q = abs(q)-vec2(l*0.5,th); + return length(max(q,0.0)) + min(max(q.x,q.y),0.0); +} + +// returns offset to the center of the cell in the current tile +vec3 get_point(vec2 pos){ + ivec2 p = (ivec2(pos) - 1) * 3; + vec3 rng = hash(vec3(float(p.x), float(p.y), float(p.x + p.y))); + return rng.xyz; +} + +const vec2 offsets[24] = vec2[24]( + vec2(-2, -2), + vec2(-1, -2), + vec2(0, -2), + vec2(1, -2), + vec2(2, -2), + vec2(-2, -1), + vec2(-1, -1), + vec2(0, -1), + vec2(1, -1), + vec2(2, -1), + vec2(-2, 0), + vec2(-1, 0), + vec2(1, 0), + vec2(2, 0), + vec2(-2, 1), + vec2(-1, 1), + vec2(0, 1), + vec2(1, 1), + vec2(2, 1), + vec2(-2, 2), + vec2(-1, 2), + vec2(0, 2), + vec2(1, 2), + vec2(2, 2) + +); + +float sdShape(vec2 pos, float rand){ + //return sdBox(pos, vec2(.8), vec4(0.)); + //return sdPentagram(pos, .9); + float r = .7; + rand*=PI*2.; + vec2 v = vec2(sin(rand), cos(rand)); + float d = abs(sdOrientedBox(pos, v, -v, .2))-.2; + return d; +} + +float sdVoronoi(vec2 pos){ + pos-=.5; + vec2 p = fract(pos); + + //nearest is initialized to the center cell because of potential future optimizations to reduce iteration count + vec3 rng = get_point(pos); + vec2 nearest = rng.xy; + vec2 lastnearest = vec2(100.); + vec2 current = vec2(0.); + + vec2 lastrng = vec2(rng.z); + + vec3 dists = vec3( + sdShape(p-nearest, rng.z), + sdShape(p-lastnearest, rng.z), + sdShape(p-current, rng.z)); + + //finding the two nearest points to the sampling point + for (int i = 0; i<24; i++){ + current = offsets[i]; + rng = get_point(pos+offsets[i]); + current += rng.xy; + + dists.z = sdShape(p-current, rng.z); + + if (dists.z0.0) ? vec3(0.9,0.6,0.3) : vec3(0.65,0.85,1.0); + col *= 1.0 - exp(-6.0*abs(d)); + col *= 0.8 + 0.2*cos(150.0*d); + col = mix( col, vec3(1.0), 1.0-smoothstep(0.0,0.01,abs(d))); + + if(uv.x<0.)col = vec3(smoothstep(-1., 1., d)); + + if (d<0.01 && d>0.){col = vec3(0.);} + // Output to screen + v4 fragColor = vec4(col, d); + return fragColor; +} + + + + +f32 ClampPositive(f32 Value) +{ + return Value < 0.f ? 0.f : Value; +} + + + + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); + + + vec3 Offset = vec3(0); + vec3 Basis = Offset + WorldspaceChunkBasis + (vec3(x,y,z)*ChunkResolution); + + + // NOTE(Jesse): Set these in the -- user code -- section + vec3 ColorValue = vec3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + f32 StartingZDepth = 800.f; + NoiseValue += StartingZDepth - Basis.z; + + f32 CliffMask = 1.f; + { + vec3 Period = vec3(150.f); + /* vec3 Period = vec3(10.f); */ + float Amplitude = 400.f; + + vec3 xyz = Basis / Period; + v4 N = noise(xyz.xy); + + N.w *= -1.f; + /* N.w = ClampPositive(N.w); */ + + N.w = (N.w/2.f)+0.5f; + + N.w = RemapSample(N.w, SampleRemapCurvePoints, SampleRemapCurvePointCount ); + + NoiseValue += N.w * Amplitude; + ColorValue = N.rgb; + } + + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; +} diff --git a/shaders/terrain/shaping/8_shaped_voronoi_2.fragmentshader b/shaders/terrain/shaping/8_shaped_voronoi_2.fragmentshader new file mode 100644 index 000000000..8f0df56a3 --- /dev/null +++ b/shaders/terrain/shaping/8_shaped_voronoi_2.fragmentshader @@ -0,0 +1,220 @@ +uniform v2 SampleRemapCurvePoints[16]; +uniform u32 SampleRemapCurvePointCount; + +uniform v3 WorldspaceChunkBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out v4 Output; + + + + + + + + + +uvec3 murmurHash33(uvec3 src) { + const uint M = 0x5bd1e995u; + uvec3 h = uvec3(1190494759u, 2147483647u, 3559788179u); + src *= M; src ^= src>>24u; src *= M; + h *= M; h ^= src.x; h *= M; h ^= src.y; h *= M; h ^= src.z; + h ^= h>>13u; h *= M; h ^= h>>15u; + return h; +} + +// 3 outputs, 3 inputs +vec3 hash(vec3 src) { + uvec3 h = murmurHash33(floatBitsToUint(src)); + return uintBitsToFloat(h & 0x007fffffu | 0x3f800000u) - 1.0; +} + +float sdBox( in vec2 p, in vec2 b, in vec4 r ) +{ + r.xy = (p.x>0.0)?r.xy : r.zw; + r.x = (p.y>0.0)?r.x : r.y; + vec2 q = abs(p)-b+r.x; + return min(max(q.x,q.y),0.0) + length(max(q,0.0)) - r.x; +} + +float sdPentagram(in vec2 p, in float r ) +{ + float k1x = 0.809016994f; + float k2x = 0.309016994f; + float k1y = 0.587785252f; + float k2y = 0.951056516f; + float k1z = 0.726542528f; + vec2 ve1 = vec2( k1x,-k1y); + vec2 ve2 = vec2(-k1x,-k1y); + vec2 ve3 = vec2( k2x,-k2y); + + p.x = abs(p.x); + p -= 2.0*max(dot(ve1,p),0.0)*ve1; + p -= 2.0*max(dot(ve2,p),0.0)*ve2; + p.x = abs(p.x); + p.y -= r; + return length(p-ve3*clamp(dot(p,ve3),0.0,k1z*r)) + * sign(p.y*ve3.x-p.x*ve3.y); +} + +// returns offset to the center of the cell in the current tile +vec2 get_point(vec2 pos){ + ivec2 p = ivec2(floor(pos - 1.)) * 3; + vec3 rng = hash(vec3(float(p.x), float(p.y), float(p.x + p.y))); + return rng.xy; +} + +const vec2 offsets[24] = vec2[24]( + vec2(-2, -2), + vec2(-1, -2), + vec2(0, -2), + vec2(1, -2), + vec2(2, -2), + vec2(-2, -1), + vec2(-1, -1), + vec2(0, -1), + vec2(1, -1), + vec2(2, -1), + vec2(-2, 0), + vec2(-1, 0), + vec2(1, 0), + vec2(2, 0), + vec2(-2, 1), + vec2(-1, 1), + vec2(0, 1), + vec2(1, 1), + vec2(2, 1), + vec2(-2, 2), + vec2(-1, 2), + vec2(0, 2), + vec2(1, 2), + vec2(2, 2) + +); + +float sdShape(vec2 pos){ + //return sdBox(pos, vec2(.8), vec4(0.)); + return sdPentagram(pos, .9); +} + +float sdVoronoi(vec2 pos){ + pos-=.5; + vec2 p = fract(pos); + + //nearest is initialized to the center cell because of potential future optimizations to reduce iteration count + vec2 nearest = get_point(pos); + vec2 lastnearest = vec2(100.); + vec2 current = vec2(0.); + + vec3 dists = vec3( + sdShape(p-nearest), + sdShape(p-lastnearest), + sdShape(p-current)); + + //finding the two nearest points to the sampling point + for (int i = 0; i<24; i++){ + current = offsets[i]; + current += get_point(pos+offsets[i]); + dists.z = sdShape(p-current); + if (dists.z0.0) ? vec3(0.9,0.6,0.3) : vec3(0.65,0.85,1.0); + col *= 2.0 - exp(-6.0*abs(d)); + col *= 0.8 + 0.2*cos(150.0*d); + col = mix( col, vec3(1.0), 1.0-smoothstep(0.0,0.01,abs(d))); + + if(uv.x<0.)col = vec3(smoothstep(-1., 1., d)); + + if (d<0.01 && d>0.){col = vec3(0.);} + + v4 Result = vec4(col,d); + return Result; +} + + + + +f32 ClampPositive(f32 Value) +{ + return Value < 0.f ? 0.f : Value; +} + + + + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); + + + vec3 Offset = vec3(0); + vec3 Basis = Offset + WorldspaceChunkBasis + (vec3(x,y,z)*ChunkResolution); + + + // NOTE(Jesse): Set these in the -- user code -- section + vec3 ColorValue = vec3(0.f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + f32 StartingZDepth = 800.f; + NoiseValue += StartingZDepth - Basis.z; + + f32 CliffMask = 1.f; + { + vec3 Period = vec3(250.f); + /* vec3 Period = vec3(10.f); */ + float Amplitude = 800.f; + + vec3 xyz = Basis / Period; + v4 N = noise(xyz.xy); + N.w *= -1.f; + N.w = ClampPositive(N.w); + + N.w = (N.w/2.f)+0.5f; + + N.w = RemapSample(N.w, SampleRemapCurvePoints, SampleRemapCurvePointCount ); + + NoiseValue += ClampPositive(N.w * Amplitude); + ColorValue = N.rgb; + } + + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; +} diff --git a/shaders/terrain/shaping/default.fragmentshader b/shaders/terrain/shaping/default.fragmentshader index e24655041..e22f19a66 100644 --- a/shaders/terrain/shaping/default.fragmentshader +++ b/shaders/terrain/shaping/default.fragmentshader @@ -1,3 +1,6 @@ +uniform v2 SampleRemapCurvePoints[16]; +uniform u32 SampleRemapCurvePointCount; + uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 78307f697..b1cae3dd3 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -389,8 +389,8 @@ poof(do_editor_ui_for_compound_type(chunk_thumbnail)) poof( for_datatypes(enum) - func (enum_t) { - + func (enum_t) + { enum_t.has_tag(gen_ui_toolbar)? { string_and_value_tables(enum_t) @@ -525,7 +525,8 @@ poof(do_editor_ui_for_compound_type(entity_position_info)) poof( for_datatypes(struct) - func (struct_t) { + func (struct_t) + { struct_t.has_tag(do_editor_ui)? { do_editor_ui_for_compound_type(struct_t) diff --git a/src/engine/editor.h b/src/engine/editor.h index 5243a323b..8a766d608 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -354,7 +354,14 @@ poof( { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); PushNewRow(Ui); - RangeIterator(ArrayIndex, member.array) + member.has_tag(array_length)? + { + s32 End = s32((member.tag_value(array_length))); + Assert( End < member.array ); + }{ + s32 End = member.array; + } + RangeIterator(ArrayIndex, End) { member.has_tag(custom_ui)? { @@ -1200,7 +1207,7 @@ struct layered_brush // because the deserialization code isn't smart enough to not stomp on the // texture handles when it marshals old types to the current one. s32 LayerCount; - brush_layer Layers [MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount)) + brush_layer Layers [MAX_BRUSH_LAYERS]; poof(@array_length(Element->LayerCount)) /* chunk_thumbnail LayerPreviews[MAX_BRUSH_LAYERS]; poof(@array_length(LayerCount) @no_serialize) */ /* chunk_thumbnail SeedLayer; poof(@no_serialize) // NOTE(Jesse): Special layer that acts as the seed value */ diff --git a/src/engine/graphics.h b/src/engine/graphics.h index f3fda8bd6..ea9f05f07 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -1,4 +1,9 @@ - +struct easing_function +poof(@do_editor_ui) +{ + cs Name; + v2_static_cursor_16 Points; +}; struct terrain_shaping_render_context poof( @render_pass @@ -6,13 +11,20 @@ poof( @render_pass @frag_source_file("shaders/terrain/shaping/default.fragmentshader") ) { shader Program; - shader_uniform Uniforms[3]; + shader_uniform Uniforms[5]; texture DestTex; framebuffer DestFBO; v3 ChunkDim; poof(@uniform) v3 WorldspaceChunkBasis; poof(@uniform) v3 ChunkResolution; poof(@uniform) + + easing_function ReshapeFunc; + poof( + @uniform("SampleRemapCurvePoints", Element->ReshapeFunc.Points.Start, &Element->ReshapeFunc.Points.At) + @uniform("SampleRemapCurvePointCount", &Element->ReshapeFunc.Points.At, 0) + ) + }; struct terrain_derivs_render_context @@ -78,13 +90,6 @@ poof( @render_pass }; -struct easing_function -poof(@do_editor_ui) -{ - cs Name; - v2_static_cursor_16 Points; -}; - struct easing_function_visualizer_render_pass poof( @render_pass diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 6ddd1e6da..e4abb3c23 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -721,7 +721,7 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr { terrain_shaping_render_context *RC = &Result->TerrainShapingRC; - InitializeTerrainShapingRenderContext(RC, ChunkDim, {}, {}); + InitializeTerrainShapingRenderContext(RC, ChunkDim, {}, {}, RC->ReshapeFunc); RC->DestFBO = GenFramebuffer(); RC->DestTex = MakeTexture_RGBA(V2i(68, 68*68), Cast(v4*, 0), CSz("TerrainShaping"), 1, TextureStorageFormat_RGBA32F); diff --git a/src/engine/serdes.h b/src/engine/serdes.h index 280e7eec4..8b3117609 100644 --- a/src/engine/serdes.h +++ b/src/engine/serdes.h @@ -198,7 +198,7 @@ poof( member.has_tag(array_length)? { // TODO(Jesse): Should this really be a safe cast? - umm ThisCount = umm(Element->member.tag_value(array_length)); + umm ThisCount = umm((member.tag_value(array_length))); } { umm ThisCount = member.array; @@ -318,7 +318,7 @@ poof( member.has_tag(array_length)? { // TODO(Jesse): Should this really be a safe cast? - umm Count = umm(Element->member.tag_value(array_length)); + umm Count = umm((member.tag_value(array_length))); } { umm Count = member.array; From 2eabeb32ec6599d750ccd40cd0f505b27ede326c Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 27 Oct 2025 17:19:51 -0700 Subject: [PATCH 364/421] Setup for sending normal data to CPU --- examples/terrain_gen/game.cpp | 9 +--- external/bonsai_stdlib | 2 +- .../terrain/TerrainFinalize.fragmentshader | 10 +++++ shaders/terrain/derivs.fragmentshader | 42 ++----------------- src/engine/api.cpp | 21 ++++++---- src/engine/graphics.h | 2 +- src/engine/world_chunk.cpp | 22 ++++++---- 7 files changed, 45 insertions(+), 63 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 46ad3d3ac..5bfffdaf6 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -62,13 +62,6 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() EasingFunction, 0); - /* InitializeEasingFunctionVisualizerRenderPass_Async( */ - /* RenderQ, */ - /* &GameState->EasingFunctionVisRP, */ - /* /1* EasingFunction->Points.Start, *1/ */ - /* /1* &EasingFunction->Points.At, *1/ */ - /* 0); */ - SpawnEntity(CameraGhost); return GameState; } @@ -138,7 +131,7 @@ BONSAI_API_MAIN_THREAD_CALLBACK() { if (FileNode->Type == FileTraversalType_File) { - b32 Selected = Contains(Resources->Graphics.TerrainShapingRC.Program.FragSourceFilename, FileNode->Name); + b32 Selected = Contains(Resources->Graphics.TerrainDecorationRC.Program.FragSourceFilename, FileNode->Name); if (Button(Ui, FileNode->Name, UiId(&Window, "shader file name", I++), Selected)) { // Force engine to reload new shader diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 2d4679743..3433ba79b 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 2d46797439562aa406c87b8d932cc63d6d68e368 +Subproject commit 3433ba79be7d8ce8ee9d3079e505f5019a1804d5 diff --git a/shaders/terrain/TerrainFinalize.fragmentshader b/shaders/terrain/TerrainFinalize.fragmentshader index e371ea79a..918d8b2de 100644 --- a/shaders/terrain/TerrainFinalize.fragmentshader +++ b/shaders/terrain/TerrainFinalize.fragmentshader @@ -1,4 +1,5 @@ uniform sampler2D InputTex; +uniform v3 ChunkResolution; in vec2 UV; out uint Output; @@ -12,7 +13,16 @@ void main() v3 ColorValue = TexLookup.rgb; uint SolidBit = NoiseValue > 0.f ? 1u : 0u; + + + ivec2 InputTexDim = ivec2(66); + ivec2 OutputTexDim = ivec2(66); + + v3 Normal = abs(ComputeNormal(InputTex, gl_FragCoord.xy, InputTexDim, OutputTexDim, 1.f)); + + uint PackedNormal = PackRGB(Normal); uint PackedColor = PackRGB(ColorValue); + /* Output = (SolidBit << 15) | PackedNormal; */ Output = (SolidBit << 15) | PackedColor; } diff --git a/shaders/terrain/derivs.fragmentshader b/shaders/terrain/derivs.fragmentshader index eedfe9339..fe6849573 100644 --- a/shaders/terrain/derivs.fragmentshader +++ b/shaders/terrain/derivs.fragmentshader @@ -1,4 +1,3 @@ -uniform v3 WorldspaceChunkBasis; uniform v3 ChunkResolution; uniform sampler2D InputTex; @@ -9,43 +8,8 @@ out vec3 Output; void main() { - s32 x = s32(floor(gl_FragCoord.x)); - s32 z = s32(floor(gl_FragCoord.y / 66)); - s32 y = s32(floor(gl_FragCoord.y - (z*66))); + ivec2 InputTexDim = ivec2(68); + ivec2 OutputTexDim = ivec2(66); - ivec2 InputTexCoord = ivec2(gl_FragCoord.x + 1, (y + 1) + (z * 68) + 68 ); - f32 CurrentNoiseValue = texelFetch(InputTex, InputTexCoord, 0).a; - - v3 Normal = v3(0.f); - - /* if (x == 0 || x == 65) { Output = V3(1,0,0); return; } */ - /* if (y == 0 || y == 65) { Output = V3(1,1,0); return; } */ - /* if (z == 0 || z == 65) { Output = V3(1,0,1); return; } */ - - /* if (x == 60 || y == 60 || z == 60) { Output = Normalize(V3(1,0,0)); return; } */ - - for ( s32 dz = -1; dz < 2; ++ dz) - for ( s32 dy = -1; dy < 2; ++ dy) - for ( s32 dx = -1; dx < 2; ++ dx) - { - if (dz == 0 && dy == 0 && dx == 0) continue; // Skip the middle-most voxel - - s32 xCoord = InputTexCoord.x + dx; - s32 yCoord = InputTexCoord.y + dy; - s32 zCoord = dz * 68; - - f32 Next = texelFetch(InputTex, ivec2(xCoord, yCoord+zCoord), 0).a; - f32 Diff = Next-(dz*ChunkResolution.z) - Truncate(CurrentNoiseValue); - // NOTE(Jesse): Can't do this because we end up with complete nonsense on - // the edges for some unknown reason - /* if (Diff > 0) */ - - // TODO(Jesse): Recompute with a small random variance to the weight if this is 0? - // EDIT(Jesse): Why exactly would we do this?? Sounds like a bad idea.. ? - Normal += V3(dx,dy,dz)*Diff; - } - - // Invert because we accumulate the value by pointing 'at' the cell we're checking - // - Output = -1.f * Normalize(Normal); + Output = ComputeNormal(InputTex, gl_FragCoord.xy, InputTexDim, OutputTexDim, ChunkResolution.z); } diff --git a/src/engine/api.cpp b/src/engine/api.cpp index a6fd63b0b..2ac8b2d2c 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -91,11 +91,12 @@ Bonsai_FrameBegin(engine_resources *Resources) }); - if ( VRChanged || - Resources->Graphics.WorldEditRC.Program.HotReloaded || - Resources->Graphics.TerrainShapingRC.Program.HotReloaded || - Resources->Graphics.TerrainDerivsRC.Program.HotReloaded || - Resources->Graphics.TerrainDecorationRC.Program.HotReloaded ) + if ( VRChanged || + Resources->Graphics.WorldEditRC.Program.HotReloaded || + Resources->Graphics.TerrainShapingRC.Program.HotReloaded || + Resources->Graphics.TerrainDecorationRC.Program.HotReloaded || + Resources->Graphics.TerrainDerivsRC.Program.HotReloaded || + Resources->Graphics.TerrainFinalizeRC.Program.HotReloaded ) { auto Plat = &Resources->Stdlib.Plat; @@ -633,7 +634,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ auto Chunk = Node->Chunk; u16 *NoiseValues = Job->NoiseData; - v3i NoiseDim = Job->NoiseDim; + v3i NoiseDim = Job->NoiseDim; Assert(NoiseValues); Assert(Chunk); @@ -652,7 +653,13 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ if (ChunkSum && ChunkSum < u32(Volume(SynChunk->Dim))) { - MakeFaceMasks_NoExteriorFaces(SynChunk->Occupancy, SynChunk->xOccupancyBorder, SynChunk->FaceMasks, SynChunk->Voxels, SynChunk->Dim, {}, SynChunk->Dim); + MakeFaceMasks_NoExteriorFaces(SynChunk->Occupancy, + SynChunk->xOccupancyBorder, + SynChunk->FaceMasks, + SynChunk->Voxels, + SynChunk->Dim, + {}, + SynChunk->Dim); Assert(SynChunk->Dim.x == 64); Assert(SynChunk->Dim.y == 66); diff --git a/src/engine/graphics.h b/src/engine/graphics.h index ea9f05f07..eaeec242f 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -233,8 +233,8 @@ struct graphics terrain_shaping_render_context TerrainShapingRC; terrain_decoration_render_context TerrainDecorationRC; terrain_derivs_render_context TerrainDerivsRC; + terrain_finalize_render_context TerrainFinalizeRC; - terrain_finalize_render_context TerrainFinalizeRC; world_edit_render_context WorldEditRC; // NOTE(Jesse): The array NoiseReadbackJobs stores the PBOs, but there's a 3 diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index df48f853c..c3eeab005 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -1461,13 +1461,13 @@ poof( v3i SrcChunkMin, v3i SrcChunkMax, - // TODO(Jesse)(immediate, poof): @poof_parens_bug - (buffer_t.name) *Dest, - (buffer_t.name) *Unused, + // TODO(Jesse)(immediate, poof): @poof_parens_bug + (buffer_t.name) *Dest, + (buffer_t.name) *Unused, - // NOTE(Jesse): This is so we can offset vertices such that we center - // entity models about 0 and rotation works properly. - vert_t.name VertexOffset = {}) + // NOTE(Jesse): This is so we can offset vertices such that we center + // entity models about 0 and rotation works properly. + vert_t.name VertexOffset = {}) { /* HISTOGRAM_FUNCTION(); */ TIMED_FUNCTION(); @@ -3606,7 +3606,15 @@ BuildMipMesh( voxel *Voxels, v3i VoxDim, v3i InnerMin, v3i InnerMax, world_ch #if 1 link_internal void -RebuildWorldChunkMesh(thread_local_state *Thread, world_chunk *Chunk, v3i MinOffset, v3i MaxOffset, world_chunk_mesh_bitfield MeshBit, geo_u3d *Dest, memory_arena *TempMem, v3 VertexOffset = {}) +RebuildWorldChunkMesh( + thread_local_state *Thread, + world_chunk *Chunk, + v3i MinOffset, + v3i MaxOffset, + world_chunk_mesh_bitfield MeshBit, + geo_u3d *Dest, + memory_arena *TempMem, + v3 VertexOffset = {}) { /* HISTOGRAM_FUNCTION(); */ TIMED_FUNCTION(); From 461469f0aa3eb060887e671f9372945a16836105 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 27 Oct 2025 19:09:50 -0700 Subject: [PATCH 365/421] Plumb up sending normal data to CPU --- .../do_editor_ui_for_compound_type_voxel.h | 26 +++++++++++++++++++ generated/for_datatypes_cx51CcgQ.h | 1 + generated/for_datatypes_khY6kwEk.h | 1 + generated/serdes_struct_voxel.h | 18 +++++++++++++ ..._and_value_tables_texture_storage_format.h | 8 ++++++ make.sh | 4 +-- readme.md | 2 ++ shaders/gBuffer.fragmentshader | 1 + .../terrain/TerrainFinalize.fragmentshader | 3 +-- src/engine/api.cpp | 2 +- src/engine/graphics.h | 2 +- src/engine/render/render_init.cpp | 4 +-- src/engine/render_loop.cpp | 6 ++--- src/engine/work_queue.h | 2 +- src/engine/world.cpp | 2 +- src/engine/world_chunk.cpp | 21 ++++++++------- src/engine/world_chunk.h | 1 + src/engine/world_update.cpp | 3 ++- 18 files changed, 84 insertions(+), 23 deletions(-) diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 28393c9e2..311aa4ea8 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -77,6 +77,32 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, u32 + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("Normal"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(u16*, &Element->Normal), + MemberName, + ThisHash, + Params + ); + + + + + + + + PushNewRow(Ui); } diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h index 62887adb5..32cb40ad2 100644 --- a/generated/for_datatypes_cx51CcgQ.h +++ b/generated/for_datatypes_cx51CcgQ.h @@ -680,6 +680,7 @@ + link_internal void diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h index ed1d5bcde..f8cc3a576 100644 --- a/generated/for_datatypes_khY6kwEk.h +++ b/generated/for_datatypes_khY6kwEk.h @@ -680,6 +680,7 @@ + struct compile_shader_pair_async_params poof(@async_function_params) diff --git a/generated/serdes_struct_voxel.h b/generated/serdes_struct_voxel.h index 44025f6ca..a4eb5f622 100644 --- a/generated/serdes_struct_voxel.h +++ b/generated/serdes_struct_voxel.h @@ -47,12 +47,21 @@ Serialize(u8_cursor_block_array *Bytes, voxel *BaseElement, umm Count = 1) + Result &= Serialize(Bytes, &Element->Normal); // default + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -90,10 +99,19 @@ DeserializeCurrentVersion(u8_cursor *Bytes, voxel *Element, memory_arena *Memory + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->Normal, Memory); + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/string_and_value_tables_texture_storage_format.h b/generated/string_and_value_tables_texture_storage_format.h index d7390a7c6..975486190 100644 --- a/generated/string_and_value_tables_texture_storage_format.h +++ b/generated/string_and_value_tables_texture_storage_format.h @@ -8,6 +8,8 @@ IsValid(texture_storage_format Value) case TextureStorageFormat_Undefined: case TextureStorageFormat_R16I: case TextureStorageFormat_R16F: + case TextureStorageFormat_R32I: + case TextureStorageFormat_R32UI: case TextureStorageFormat_R32F: case TextureStorageFormat_RG16F: case TextureStorageFormat_RG32F: @@ -38,6 +40,8 @@ ToStringPrefixless(texture_storage_format Type) case TextureStorageFormat_Undefined: { Result = CSz("Undefined"); } break; case TextureStorageFormat_R16I: { Result = CSz("R16I"); } break; case TextureStorageFormat_R16F: { Result = CSz("R16F"); } break; + case TextureStorageFormat_R32I: { Result = CSz("R32I"); } break; + case TextureStorageFormat_R32UI: { Result = CSz("R32UI"); } break; case TextureStorageFormat_R32F: { Result = CSz("R32F"); } break; case TextureStorageFormat_RG16F: { Result = CSz("RG16F"); } break; case TextureStorageFormat_RG32F: { Result = CSz("RG32F"); } break; @@ -66,6 +70,8 @@ ToString(texture_storage_format Type) case TextureStorageFormat_Undefined: { Result = CSz("TextureStorageFormat_Undefined"); } break; case TextureStorageFormat_R16I: { Result = CSz("TextureStorageFormat_R16I"); } break; case TextureStorageFormat_R16F: { Result = CSz("TextureStorageFormat_R16F"); } break; + case TextureStorageFormat_R32I: { Result = CSz("TextureStorageFormat_R32I"); } break; + case TextureStorageFormat_R32UI: { Result = CSz("TextureStorageFormat_R32UI"); } break; case TextureStorageFormat_R32F: { Result = CSz("TextureStorageFormat_R32F"); } break; case TextureStorageFormat_RG16F: { Result = CSz("TextureStorageFormat_RG16F"); } break; case TextureStorageFormat_RG32F: { Result = CSz("TextureStorageFormat_RG32F"); } break; @@ -91,6 +97,8 @@ TextureStorageFormat(counted_string S) if (StringsMatch(S, CSz("TextureStorageFormat_Undefined"))) { return TextureStorageFormat_Undefined; } if (StringsMatch(S, CSz("TextureStorageFormat_R16I"))) { return TextureStorageFormat_R16I; } if (StringsMatch(S, CSz("TextureStorageFormat_R16F"))) { return TextureStorageFormat_R16F; } + if (StringsMatch(S, CSz("TextureStorageFormat_R32I"))) { return TextureStorageFormat_R32I; } + if (StringsMatch(S, CSz("TextureStorageFormat_R32UI"))) { return TextureStorageFormat_R32UI; } if (StringsMatch(S, CSz("TextureStorageFormat_R32F"))) { return TextureStorageFormat_R32F; } if (StringsMatch(S, CSz("TextureStorageFormat_RG16F"))) { return TextureStorageFormat_RG16F; } if (StringsMatch(S, CSz("TextureStorageFormat_RG32F"))) { return TextureStorageFormat_RG32F; } diff --git a/make.sh b/make.sh index 2774725d4..250c55b2e 100755 --- a/make.sh +++ b/make.sh @@ -328,8 +328,8 @@ function RunPoof # [ -d src/generated ] && rm -Rf src/generated # [ -d generated ] && rm -Rf generated - RunPoofHelper -o ./ src/poof_ctags_stub.cpp && echo -e "$Success poofed src/poof_ctags_stub.cpp" & - TrackPid "" $! + # RunPoofHelper -o ./ src/poof_ctags_stub.cpp && echo -e "$Success poofed src/poof_ctags_stub.cpp" & + # TrackPid "" $! # RunPoofHelper -o generated examples/ui_test/game.cpp && echo -e "$Success poofed examples/ui_test/game.cpp" & # TrackPid "" $! diff --git a/readme.md b/readme.md index e9d4c3e44..a8b7078b2 100644 --- a/readme.md +++ b/readme.md @@ -117,6 +117,8 @@ https://discord.gg/kmRpgXBh75 ------------------------------------------------------------------------------- ## Renderer +[ ] HRC : https://github.com/entropylost/amitabha + [ ] SSR : https://lettier.github.io/3d-game-shaders-for-beginners/screen-space-reflection.html [ ] Screen-space lines : https://mattdesl.svbtle.com/drawing-lines-is-hard diff --git a/shaders/gBuffer.fragmentshader b/shaders/gBuffer.fragmentshader index 990cce3cd..135648d1f 100644 --- a/shaders/gBuffer.fragmentshader +++ b/shaders/gBuffer.fragmentshader @@ -152,5 +152,6 @@ void main() /* FinalColor.xyz = vec3(abs(CorrectedPos.w)); */ #endif + /* gColor = v4(abs(vertexN_worldspace),1.f); */ gColor = FinalColor; } diff --git a/shaders/terrain/TerrainFinalize.fragmentshader b/shaders/terrain/TerrainFinalize.fragmentshader index 918d8b2de..2115abb2e 100644 --- a/shaders/terrain/TerrainFinalize.fragmentshader +++ b/shaders/terrain/TerrainFinalize.fragmentshader @@ -23,6 +23,5 @@ void main() uint PackedNormal = PackRGB(Normal); uint PackedColor = PackRGB(ColorValue); - /* Output = (SolidBit << 15) | PackedNormal; */ - Output = (SolidBit << 15) | PackedColor; + Output = (SolidBit << 30) | (PackedNormal << 15) | PackedColor; } diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 2ac8b2d2c..52399cfb1 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -633,7 +633,7 @@ WorkerThread_ApplicationDefaultImplementation(BONSAI_API_WORKER_THREAD_CALLBACK_ auto Node = Job->DestNode; auto Chunk = Node->Chunk; - u16 *NoiseValues = Job->NoiseData; + u32 *NoiseValues = Job->NoiseData; v3i NoiseDim = Job->NoiseDim; Assert(NoiseValues); Assert(Chunk); diff --git a/src/engine/graphics.h b/src/engine/graphics.h index eaeec242f..209ea70f2 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -235,7 +235,7 @@ struct graphics terrain_derivs_render_context TerrainDerivsRC; terrain_finalize_render_context TerrainFinalizeRC; - world_edit_render_context WorldEditRC; + world_edit_render_context WorldEditRC; // NOTE(Jesse): The array NoiseReadbackJobs stores the PBOs, but there's a 3 // step process going on. First, the job is dispatched (copy values into PBO) diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index e4abb3c23..bc17604f5 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -787,8 +787,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr u32 Channels = 1; u32 Slices = 1; // @shared_terrain_texture - TerrainFinalizeRC->DestTex = GenTexture(TextureDim, CSz("TerrainFinalizeTexture"), TextureStorageFormat_R16I, Channels, Slices, False); - GetGL()->TexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, TextureDim.x, TextureDim.y, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); + TerrainFinalizeRC->DestTex = GenTexture(TextureDim, CSz("TerrainFinalizeTexture"), TextureStorageFormat_R32UI, Channels, Slices, False); + GetGL()->TexImage2D(GL_TEXTURE_2D, 0, GL_R32UI, TextureDim.x, TextureDim.y, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, 0); AssertNoGlErrors; GetGL()->BindTexture(GL_TEXTURE_2D, 0); } diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 267dbfec6..662e9e3bf 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -617,7 +617,7 @@ DrainRenderQueue(engine_resources *Engine) v3i NoiseDim = V3i(66); s32 NoiseElementCount = s32(Volume(CurrentAccumulationTexture->Dim)); - s32 NoiseByteCount = NoiseElementCount*s32(sizeof(u16)); + s32 NoiseByteCount = NoiseElementCount*s32(sizeof(u32)); { TIMED_NAMED_BLOCK(GenPboAndInitTransfer); @@ -629,7 +629,7 @@ DrainRenderQueue(engine_resources *Engine) GetGL()->BindBuffer(GL_PIXEL_PACK_BUFFER, PBO); GetGL()->BufferData(GL_PIXEL_PACK_BUFFER, NoiseByteCount, 0, GL_STREAM_READ); AssertNoGlErrors; - GetGL()->ReadPixels(0, 0, CurrentAccumulationTexture->Dim.x, CurrentAccumulationTexture->Dim.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, 0); + GetGL()->ReadPixels(0, 0, CurrentAccumulationTexture->Dim.x, CurrentAccumulationTexture->Dim.y, GL_RED_INTEGER, GL_UNSIGNED_INT, 0); AssertNoGlErrors; GetGL()->BindBuffer(GL_PIXEL_PACK_BUFFER, 0); @@ -839,7 +839,7 @@ DrainRenderQueue(engine_resources *Engine) /* Info("(%d) Binding and Mapping PBOJob(0x%x) PBO(%u) JobCount(%d) JobIndex(%u)", ThreadLocal_ThreadIndex, PBOJob, PBOJob->PBOBuf.PBO, JobCount, JobIndex.Index); */ GetGL()->BindBuffer(GL_PIXEL_PACK_BUFFER, PBOJob->PBOBuf.PBO); AssertNoGlErrors; - u16 *NoiseValues = Cast(u16*, GetGL()->MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); + u32 *NoiseValues = Cast(u32*, GetGL()->MapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)); AssertNoGlErrors; auto BuildMeshJob = WorkQueueEntry(WorkQueueEntryFinalizeNoiseValues(PBOJob->PBOBuf, NoiseValues, PBOJob->NoiseDim, PBOJob->DestNode)); diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index 92068f728..93a1e9574 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -64,7 +64,7 @@ struct work_queue_entry_finalize_noise_values { gpu_readback_buffer PBOBuf; - u16 *NoiseData; + u32 *NoiseData; v3i NoiseDim; octree_node *DestNode; diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 2fac8f302..d9497584d 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -198,7 +198,7 @@ GatherVoxelsOverlappingArea(world *World, rect3i SimSpaceAABB, world_chunk_ptr_b u32 TotalVoxels = (u32)TotalVoxels_signed; - voxel UnsetVoxel = { 0xff, 0xffff }; + voxel UnsetVoxel = { 0xff, 0xffff, 0xffff }; for (u32 VoxelIndex = 0; VoxelIndex < TotalVoxels; ++VoxelIndex) { Voxels[VoxelIndex] = UnsetVoxel; } v3i SimSpaceQueryMinP = SimSpaceAABB.Min; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index c3eeab005..fab86af20 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -3732,7 +3732,7 @@ WorkQueueEntryBuildWorldChunkMesh(world_chunk *SynChunk, octree_node *DestNode) } link_internal work_queue_entry_finalize_noise_values -WorkQueueEntryFinalizeNoiseValues(gpu_readback_buffer PBOBuf, u16 *NoiseData, v3i NoiseDim, octree_node *Chunk) +WorkQueueEntryFinalizeNoiseValues(gpu_readback_buffer PBOBuf, u32 *NoiseData, v3i NoiseDim, octree_node *Chunk) { work_queue_entry_finalize_noise_values Result = { PBOBuf, NoiseData, NoiseDim, Chunk }; return Result; @@ -4743,7 +4743,7 @@ DrawPickedChunks(renderer_2d* Group, render_entity_to_texture_group *PickedChunk #endif // BONSAI_DEBUG_SYSTEM_API link_internal u32 -FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, u16 *NoiseValues, v3i SrcToDest, s64 zMin) +FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, u32 *NoiseValues, v3i SrcToDest, s64 zMin) { TIMED_FUNCTION(); u32 ChunkSum = 0; @@ -4764,12 +4764,14 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); - u16 ThisNoiseV = NoiseValues[NoiseIndex]; - u64 NoiseChoice = (ThisNoiseV >> 15); + u32 ThisNoiseV = NoiseValues[NoiseIndex]; + u64 NoiseChoice = (ThisNoiseV >> 30); Assert(NoiseChoice == 1 || NoiseChoice == 0); ChunkSum += u32(NoiseChoice); - u16 NoiseColor = ThisNoiseV & ((1 << 15) -1); + u16 FifteenBits = (1<<5)-1; + u16 NoiseColor = u16(ThisNoiseV) & FifteenBits; + u16 PackedNormal = u16(ThisNoiseV>>15) & FifteenBits; u32 FiveBits = (1<<5)-1; u32 R = (ThisNoiseV >> 10) & FiveBits; @@ -4792,6 +4794,7 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No /* } */ Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); + Chunk->Voxels[ChunkIndex].Normal = PackedNormal*u16(NoiseChoice); /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ if (GetEngineDebug()->MarkChunkBorderVoxels) { @@ -4828,8 +4831,8 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No v3i BorderP = V3i(0, yNoise, zNoise); s32 BorderIndex = GetIndex(BorderP, NoiseDim); - u16 ThisNoiseV = NoiseValues[BorderIndex]; - u64 NoiseChoice = (ThisNoiseV >> 15); + u32 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = (ThisNoiseV >> 30); Assert(NoiseChoice == 1 || NoiseChoice == 0); u64 Bit = NoiseChoice << (yNoise-1); x0Bits |= Bit; @@ -4839,8 +4842,8 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No v3i BorderP = V3i(65, yNoise, zNoise); s32 BorderIndex = GetIndex(BorderP, NoiseDim); - u16 ThisNoiseV = NoiseValues[BorderIndex]; - u64 NoiseChoice = (ThisNoiseV >> 15); + u32 ThisNoiseV = NoiseValues[BorderIndex]; + u64 NoiseChoice = (ThisNoiseV >> 30); Assert(NoiseChoice == 1 || NoiseChoice == 0); u64 Bit = NoiseChoice << (yNoise-1); x1Bits |= Bit; diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index d28a006c1..a6a5cd92e 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -114,6 +114,7 @@ struct voxel { u8 Transparency; u16 Color; + u16 Normal; }; struct voxel_lighting diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index e18fa36af..b34ec2419 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -779,9 +779,10 @@ WorldEdit_shape_chunk_data_Default(apply_world_edit_params *Params, v3 SimOrigin { UNPACK_APPLY_WORLD_EDIT_PARAMS(Params); - voxel InvertV = { Params->Transparency, Params->Color }; + NotImplemented; #if 0 + voxel InvertV = { Params->Transparency, Params->Color, 0xffff }; switch (Mode) { case WorldEdit_Mode_Disabled: {} break; From 095eb683d32f21875591b049eb1de9aa364cd99e Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 28 Oct 2025 09:19:31 -0700 Subject: [PATCH 366/421] Change to per-voxel normals --- external/bonsai_stdlib | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 44 +++++- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 44 +++++- shaders/Lighting.fragmentshader | 3 + .../terrain/TerrainFinalize.fragmentshader | 2 + .../shaping/7_steep_ravines.fragmentshader | 18 ++- src/engine/world_chunk.cpp | 127 ++++++++++++------ 8 files changed, 183 insertions(+), 59 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 3433ba79b..5dd043799 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 3433ba79be7d8ce8ee9d3079e505f5019a1804d5 +Subproject commit 5dd043799fca671f8bce08d00f4714a94f168da0 diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 36c6680ed..119d4374b 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3622:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3629:0 diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index cc26806eb..ae6225c63 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -23,6 +23,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, Assert(SrcChunkDim == V3i(64, 66, 66)); v3 VertexData[VERTS_PER_FACE]; + v3 NormalData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; s32 Result = 0; @@ -50,10 +51,16 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + LeftFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, v3_LeftFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (RightFaces) @@ -62,9 +69,14 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + RightFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, v3_RightFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (FrontFaces) @@ -73,9 +85,14 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + FrontFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, v3_FrontFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (BackFaces) @@ -84,9 +101,14 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + BackFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, v3_BackFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (TopFaces) @@ -95,9 +117,14 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + TopFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, v3_TopFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (BotFaces) @@ -106,9 +133,14 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u32 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + BottomFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, v3_BottomFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 4e63f5b28..2e60d8367 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -23,6 +23,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, Assert(SrcChunkDim == V3i(64, 66, 66)); v3_u8 VertexData[VERTS_PER_FACE]; + v3_u8 NormalData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; s32 Result = 0; @@ -50,10 +51,16 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + LeftFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, v3_u8_LeftFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (RightFaces) @@ -62,9 +69,14 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + RightFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, v3_u8_RightFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (FrontFaces) @@ -73,9 +85,14 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + FrontFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, v3_u8_FrontFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (BackFaces) @@ -84,9 +101,14 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + BackFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, v3_u8_BackFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (TopFaces) @@ -95,9 +117,14 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + TopFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, v3_u8_TopFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (BotFaces) @@ -106,9 +133,14 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u32 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + BottomFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, v3_u8_BottomFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } diff --git a/shaders/Lighting.fragmentshader b/shaders/Lighting.fragmentshader index 57e5ebaab..b946dedc5 100644 --- a/shaders/Lighting.fragmentshader +++ b/shaders/Lighting.fragmentshader @@ -397,6 +397,9 @@ void main() } out_LightColor = V4(TotalLight + TransparencyContrib, 1.f); + + /* out_LightColor = V4(FragNormal, 1.f); */ + /* out_LightColor = V4(Emission, 0.f, 0.f, 1.f); */ /* return; */ diff --git a/shaders/terrain/TerrainFinalize.fragmentshader b/shaders/terrain/TerrainFinalize.fragmentshader index 2115abb2e..bd329f9a9 100644 --- a/shaders/terrain/TerrainFinalize.fragmentshader +++ b/shaders/terrain/TerrainFinalize.fragmentshader @@ -20,8 +20,10 @@ void main() v3 Normal = abs(ComputeNormal(InputTex, gl_FragCoord.xy, InputTexDim, OutputTexDim, 1.f)); + /* uint PackedNormal = PackRGB(Normalize(V3(1,1,1))); */ uint PackedNormal = PackRGB(Normal); uint PackedColor = PackRGB(ColorValue); + /* uint PackedColor = PackedNormal; */ Output = (SolidBit << 30) | (PackedNormal << 15) | PackedColor; } diff --git a/shaders/terrain/shaping/7_steep_ravines.fragmentshader b/shaders/terrain/shaping/7_steep_ravines.fragmentshader index 0a371cd7b..a23de3bc6 100644 --- a/shaders/terrain/shaping/7_steep_ravines.fragmentshader +++ b/shaders/terrain/shaping/7_steep_ravines.fragmentshader @@ -38,19 +38,27 @@ void main() /* v3 warp = v3(gradient_noise_derivs(Basis).x); */ v3 warp = v3(0.f); + { + v3 xyz = Basis / (15000.f); + /* v3 N = voronoi_noise(xyz+warp); */ + v4 N = gradient_noise_derivs(xyz+warp); + NoiseValue += RemapSample((N.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount ) * 10000.f; + /* NoiseValue += N.x * 20000.f; */ + } + { v3 xyz = Basis / (Period); - v4 gn = gradient_noise_derivs(xyz+warp); - NoiseValue += RemapSample((gn.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount ) * Amplitude; + v4 N = gradient_noise_derivs(xyz+warp); + NoiseValue += RemapSample((N.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount ) * Amplitude; } for (s32 Octave = 2; Octave <= Octaves; ++Octave) { v3 xyz = Basis / (Period/Octave); - v4 gn = gradient_noise_derivs(xyz+warp); + v4 N = gradient_noise_derivs(xyz+warp); - NoiseValue += ((gn.x+1.f)/2.f) * Amplitude/Octave; - /* NoiseValue += RemapSample((gn.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount )*(Amplitude/Octave); */ + NoiseValue += ((N.x+1.f)/2.f) * Amplitude/Octave; + /* NoiseValue += RemapSample((N.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount )*(Amplitude/Octave); */ } v3 Up = V3(0, 0, 1); diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index fab86af20..9d88d376f 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -1477,6 +1477,7 @@ poof( Assert(SrcChunkDim == V3i(64, 66, 66)); vert_t.name VertexData[VERTS_PER_FACE]; + vert_t.name NormalData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; s32 Result = 0; @@ -1504,10 +1505,16 @@ poof( u64 This = UnsetLeastSignificantSetBit(&LeftFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); + u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + LeftFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, (vert_t.name)_LeftFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (RightFaces) @@ -1516,9 +1523,14 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + RightFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, (vert_t.name)_RightFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (FrontFaces) @@ -1527,9 +1539,14 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + FrontFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, (vert_t.name)_FrontFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (BackFaces) @@ -1538,9 +1555,14 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + BackFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, (vert_t.name)_BackFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (TopFaces) @@ -1549,9 +1571,14 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + TopFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, (vert_t.name)_TopFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } while (BotFaces) @@ -1560,9 +1587,14 @@ poof( u32 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; + v3 Normal = UnpackV3_15b(PNormal); + FillArray(Normal, NormalData, VERTS_PER_FACE); + BottomFaceVertexData( VertexOffset+P, Dim, VertexData); FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, (vert_t.name)_BottomFaceNormalData, Materials); + BufferFaceData(Dest, VertexData, NormalData, Materials); } @@ -4766,41 +4798,56 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No u32 ThisNoiseV = NoiseValues[NoiseIndex]; u64 NoiseChoice = (ThisNoiseV >> 30); - Assert(NoiseChoice == 1 || NoiseChoice == 0); - ChunkSum += u32(NoiseChoice); - - u16 FifteenBits = (1<<5)-1; - u16 NoiseColor = u16(ThisNoiseV) & FifteenBits; - u16 PackedNormal = u16(ThisNoiseV>>15) & FifteenBits; - - u32 FiveBits = (1<<5)-1; - u32 R = (ThisNoiseV >> 10) & FiveBits; - u32 G = (ThisNoiseV >> 5) & FiveBits; - u32 B = (ThisNoiseV >> 0) & FiveBits; - - NoiseColor = RGBtoPackedHSV(V3( - f32(R)/f32(FiveBits), - f32(G)/f32(FiveBits), - f32(B)/f32(FiveBits) - )); - - Assert(xChunk < 64); - Mask |= (NoiseChoice << xChunk); - - /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ - /* if (NormalIndex > -1) */ - /* { */ - /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ - /* } */ - - Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); - Chunk->Voxels[ChunkIndex].Normal = PackedNormal*u16(NoiseChoice); - /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ - if (GetEngineDebug()->MarkChunkBorderVoxels) + /* if (NoiseChoice == 1) */ { - if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } - if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } - if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } + Assert(NoiseChoice == 1 || NoiseChoice == 0); + ChunkSum += u32(NoiseChoice); + + u16 FifteenBits = (1<<15)-1; + u16 NoiseColor = u16(ThisNoiseV) & FifteenBits; + u16 PackedNormal = u16(ThisNoiseV>>15) & FifteenBits; + + /* Info("Color(%3d) Normal(%3d)", s32(NoiseColor), s32(PackedNormal)); */ + + /* u32 X = (PackedNormal >> 10) & FiveBits; */ + /* u32 Y = (PackedNormal >> 5) & FiveBits; */ + /* u32 Z = (PackedNormal >> 0) & FiveBits; */ + + /* PackedNormal = RGBtoPackedHSV(V3( */ + /* f32(X)/f32(FiveBits), */ + /* f32(Y)/f32(FiveBits), */ + /* f32(B)/f32(FiveBits) */ + /* )); */ + + u32 FiveBits = (1<<5)-1; + u32 R = (NoiseColor >> 10) & FiveBits; + u32 G = (NoiseColor >> 5) & FiveBits; + u32 B = (NoiseColor >> 0) & FiveBits; + + NoiseColor = RGBtoPackedHSV(V3( + f32(R)/f32(FiveBits), + f32(G)/f32(FiveBits), + f32(B)/f32(FiveBits) + )); + + Assert(xChunk < 64); + Mask |= (NoiseChoice << xChunk); + + /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ + /* if (NormalIndex > -1) */ + /* { */ + /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ + /* } */ + + Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); + Chunk->Voxels[ChunkIndex].Normal = PackedNormal*u16(NoiseChoice); + /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ + if (GetEngineDebug()->MarkChunkBorderVoxels) + { + if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } + if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } + if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } + } } } From 3b9e1d2c47a5c9c9302bf333caa134d29e558025 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 28 Oct 2025 10:17:58 -0700 Subject: [PATCH 367/421] Optimize BuildWorldChunkMeshFromMarkedVoxels_Naieve (~3m -> 600k) --- external/bonsai_stdlib | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 99 ++++++++++++------- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 99 ++++++++++++------- src/engine/mesh.h | 2 +- src/engine/world_chunk.cpp | 99 ++++++++++++------- 5 files changed, 200 insertions(+), 101 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 5dd043799..89e5d8a43 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 5dd043799fca671f8bce08d00f4714a94f168da0 +Subproject commit 89e5d8a43950fb0675f7b0df9c2937cc75c5e694 diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index ae6225c63..388bc9ff3 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -26,7 +26,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, v3 NormalData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; - s32 Result = 0; for ( s32 zBlock = 1; zBlock < SrcChunkDim.z-1; ++zBlock ) { s32 z = zBlock-1; @@ -44,7 +43,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, v3 Dim = V3(1.f, 1.f, 1.f); - u64 BaseVoxelOffset = u64(GetIndex(0, yBlock, zBlock, SrcChunkDim)); while (LeftFaces) { @@ -53,14 +51,19 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_LeftFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); + + v3 *DestVerts = Cast( v3*, Dest->Verts) + Dest->At; + v3 *DestNormals = Cast( v3*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; - LeftFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + LeftFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (RightFaces) @@ -71,12 +74,18 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_RightFaceNormalData[0] + UnpackV3_15b(PNormal)); - RightFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); + + v3 *DestVerts = Cast( v3*, Dest->Verts) + Dest->At; + v3 *DestNormals = Cast( v3*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; + + RightFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (FrontFaces) @@ -87,12 +96,18 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_FrontFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); - FrontFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + v3 *DestVerts = Cast( v3*, Dest->Verts) + Dest->At; + v3 *DestNormals = Cast( v3*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; + + FrontFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (BackFaces) @@ -103,12 +118,18 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_BackFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); - BackFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + v3 *DestVerts = Cast( v3*, Dest->Verts) + Dest->At; + v3 *DestNormals = Cast( v3*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; + + BackFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (TopFaces) @@ -119,12 +140,18 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_TopFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); - TopFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + v3 *DestVerts = Cast( v3*, Dest->Verts) + Dest->At; + v3 *DestNormals = Cast( v3*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; + + TopFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (BotFaces) @@ -135,12 +162,18 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_BottomFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); + + v3 *DestVerts = Cast( v3*, Dest->Verts) + Dest->At; + v3 *DestNormals = Cast( v3*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; - BottomFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + BottomFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index 2e60d8367..b99270874 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -26,7 +26,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, v3_u8 NormalData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; - s32 Result = 0; for ( s32 zBlock = 1; zBlock < SrcChunkDim.z-1; ++zBlock ) { s32 z = zBlock-1; @@ -44,7 +43,6 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, v3 Dim = V3(1.f, 1.f, 1.f); - u64 BaseVoxelOffset = u64(GetIndex(0, yBlock, zBlock, SrcChunkDim)); while (LeftFaces) { @@ -53,14 +51,19 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_LeftFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); + + v3_u8 *DestVerts = Cast( v3_u8*, Dest->Verts) + Dest->At; + v3_u8 *DestNormals = Cast( v3_u8*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; - LeftFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + LeftFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (RightFaces) @@ -71,12 +74,18 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_RightFaceNormalData[0] + UnpackV3_15b(PNormal)); - RightFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); + + v3_u8 *DestVerts = Cast( v3_u8*, Dest->Verts) + Dest->At; + v3_u8 *DestNormals = Cast( v3_u8*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; + + RightFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (FrontFaces) @@ -87,12 +96,18 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_FrontFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); - FrontFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + v3_u8 *DestVerts = Cast( v3_u8*, Dest->Verts) + Dest->At; + v3_u8 *DestNormals = Cast( v3_u8*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; + + FrontFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (BackFaces) @@ -103,12 +118,18 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_BackFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); - BackFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + v3_u8 *DestVerts = Cast( v3_u8*, Dest->Verts) + Dest->At; + v3_u8 *DestNormals = Cast( v3_u8*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; + + BackFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (TopFaces) @@ -119,12 +140,18 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_TopFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); - TopFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + v3_u8 *DestVerts = Cast( v3_u8*, Dest->Verts) + Dest->At; + v3_u8 *DestNormals = Cast( v3_u8*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; + + TopFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (BotFaces) @@ -135,12 +162,18 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_BottomFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); + + v3_u8 *DestVerts = Cast( v3_u8*, Dest->Verts) + Dest->At; + v3_u8 *DestNormals = Cast( v3_u8*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; - BottomFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + BottomFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } diff --git a/src/engine/mesh.h b/src/engine/mesh.h index b2e0c77db..e1f2ce23a 100644 --- a/src/engine/mesh.h +++ b/src/engine/mesh.h @@ -13,9 +13,9 @@ struct mesh_freelist { #if BONSAI_INTERNAL bonsai_futex DebugFutex; - u32 MeshSize; #endif + u32 MeshSize; volatile freelist_entry *FirstFreeMesh; }; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 9d88d376f..b4c3c8ba6 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -1480,7 +1480,6 @@ poof( vert_t.name NormalData[VERTS_PER_FACE]; matl Materials[VERTS_PER_FACE]; - s32 Result = 0; for ( s32 zBlock = 1; zBlock < SrcChunkDim.z-1; ++zBlock ) { s32 z = zBlock-1; @@ -1498,7 +1497,6 @@ poof( v3 Dim = V3(1.f, 1.f, 1.f); - u64 BaseVoxelOffset = u64(GetIndex(0, yBlock, zBlock, SrcChunkDim)); while (LeftFaces) { @@ -1507,14 +1505,19 @@ poof( v3 P = V3(s32(xOffset), y, z); u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; - u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_LeftFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); + + vert_t.name *DestVerts = Cast( vert_t.name*, Dest->Verts) + Dest->At; + vert_t.name *DestNormals = Cast( vert_t.name*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; - LeftFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + LeftFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (RightFaces) @@ -1525,12 +1528,18 @@ poof( u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_RightFaceNormalData[0] + UnpackV3_15b(PNormal)); - RightFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); + + vert_t.name *DestVerts = Cast( vert_t.name*, Dest->Verts) + Dest->At; + vert_t.name *DestNormals = Cast( vert_t.name*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; + + RightFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (FrontFaces) @@ -1541,12 +1550,18 @@ poof( u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_FrontFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); - FrontFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + vert_t.name *DestVerts = Cast( vert_t.name*, Dest->Verts) + Dest->At; + vert_t.name *DestNormals = Cast( vert_t.name*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; + + FrontFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (BackFaces) @@ -1557,12 +1572,18 @@ poof( u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_BackFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); - BackFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + vert_t.name *DestVerts = Cast( vert_t.name*, Dest->Verts) + Dest->At; + vert_t.name *DestNormals = Cast( vert_t.name*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; + + BackFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (TopFaces) @@ -1573,12 +1594,18 @@ poof( u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_TopFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); - TopFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + vert_t.name *DestVerts = Cast( vert_t.name*, Dest->Verts) + Dest->At; + vert_t.name *DestNormals = Cast( vert_t.name*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; + + TopFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } while (BotFaces) @@ -1589,12 +1616,18 @@ poof( u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = UnpackV3_15b(PNormal); - FillArray(Normal, NormalData, VERTS_PER_FACE); + v3 Normal = Normalize(0.25f*v3_BottomFaceNormalData[0] + UnpackV3_15b(PNormal)); + + Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); + + vert_t.name *DestVerts = Cast( vert_t.name*, Dest->Verts) + Dest->At; + vert_t.name *DestNormals = Cast( vert_t.name*, Dest->Normals) + Dest->At; + vertex_material *DestMats = Dest->Mat + Dest->At; - BottomFaceVertexData( VertexOffset+P, Dim, VertexData); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), Materials, VERTS_PER_FACE); - BufferFaceData(Dest, VertexData, NormalData, Materials); + BottomFaceVertexData( VertexOffset+P, Dim, DestVerts); + FillArray(Normal, DestNormals, VERTS_PER_FACE); + FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + Dest->At += VERTS_PER_FACE; } From ca6cff13008bc1db45c77a1aca13025b01d560e4 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 28 Oct 2025 10:56:49 -0700 Subject: [PATCH 368/421] Optimize FinalizeOccupancyMasksFromNoiseValues (7.6m -> 600k) --- external/bonsai_stdlib | 2 +- .../do_editor_ui_for_compound_type_voxel.h | 65 +--------- ...on_pattern_199741702_161749140_632272777.h | 5 +- generated/serdes_struct_voxel.h | 54 +------- ...nctions_untextured_3d_geometry_buffer_v3.h | 24 ++-- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 24 ++-- .../terrain/TerrainFinalize.fragmentshader | 2 +- src/engine/color.h | 2 +- src/engine/loaders/vox.cpp | 12 +- src/engine/terrain.cpp | 2 +- src/engine/voxel_synthesis.cpp | 2 +- src/engine/voxel_synthesis.h | 2 +- src/engine/world.cpp | 3 + src/engine/world_chunk.cpp | 117 +++++++----------- src/engine/world_chunk.h | 21 ++-- src/engine/world_update.cpp | 9 +- 16 files changed, 108 insertions(+), 238 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 89e5d8a43..1c908f329 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 89e5d8a43950fb0675f7b0df9c2937cc75c5e694 +Subproject commit 1c908f329d338b931339bf8d859113e4aebdcc36 diff --git a/generated/do_editor_ui_for_compound_type_voxel.h b/generated/do_editor_ui_for_compound_type_voxel.h index 311aa4ea8..ff4172b61 100644 --- a/generated/do_editor_ui_for_compound_type_voxel.h +++ b/generated/do_editor_ui_for_compound_type_voxel.h @@ -34,15 +34,8 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, u32 - cs MemberName = CSz("Transparency"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u8*, &Element->Transparency), - MemberName, - ThisHash, - Params - ); + cs MemberName = CSz("(anonymous)"); + @@ -50,61 +43,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, voxel *Element, cs Name, u32 - - PushNewRow(Ui); - - } - - - { - - - cs MemberName = CSz("Color"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u16*, &Element->Color), - MemberName, - ThisHash, - Params - ); - - - - - - - - - PushNewRow(Ui); - - } - - - { - - - - cs MemberName = CSz("Normal"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u16*, &Element->Normal), - MemberName, - ThisHash, - Params - ); - - - - - - - - - PushNewRow(Ui); - } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h index f76c0a8f9..f8a4f2923 100644 --- a/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h +++ b/generated/flood_fill_iteration_pattern_199741702_161749140_632272777.h @@ -88,13 +88,14 @@ while (AtElements(&Stack)) NotImplemented; /* if (V->Flags & Voxel_Filled) */ { - V->Color = MagicaVoxelDefaultPaletteToPackedHSV(SafeTruncateU8(RandomBetween((u32)MCV_GREY_5, &ColorEntropy, (u32)MCV_GREY_8+1))); + /* V->RGBColor = MagicaVoxelDefaultPaletteToPackedRGB(SafeTruncateU8(RandomBetween((u32)MCV_GREY_5, &ColorEntropy, (u32)MCV_GREY_8+1))); */ } } else if (LengthSq(CenterToVoxP) < RadiusSquared) { - V->Color = MagicaVoxelDefaultPaletteToPackedHSV(MCV_GREY_8); + NotImplemented; + /* V->RGBColor = MagicaVoxelDefaultPaletteToPackedRGB(MCV_GREY_8); */ } diff --git a/generated/serdes_struct_voxel.h b/generated/serdes_struct_voxel.h index a4eb5f622..c7d40b4cd 100644 --- a/generated/serdes_struct_voxel.h +++ b/generated/serdes_struct_voxel.h @@ -33,35 +33,10 @@ Serialize(u8_cursor_block_array *Bytes, voxel *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { voxel *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->Transparency); // default - - - - - - - Result &= Serialize(Bytes, &Element->Color); // default - - - - - - - Result &= Serialize(Bytes, &Element->Normal); // default - - - - - - - - - - - + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -83,35 +58,10 @@ link_internal b32 DeserializeCurrentVersion(u8_cursor *Bytes, voxel *Element, memory_arena *Memory) { b32 Result = True; - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Transparency, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Color, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Normal, Memory); - - - - - + - - MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 388bc9ff3..1a3d67834 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -50,7 +50,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_LeftFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -62,7 +62,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, LeftFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -71,7 +71,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_RightFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -84,7 +84,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, RightFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -93,7 +93,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 This = UnsetLeastSignificantSetBit(&FrontFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_FrontFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -106,7 +106,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, FrontFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -115,7 +115,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 This = UnsetLeastSignificantSetBit(&BackFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_BackFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -128,7 +128,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, BackFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -137,7 +137,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 This = UnsetLeastSignificantSetBit(&TopFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_TopFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -150,7 +150,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, TopFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -159,7 +159,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u64 This = UnsetLeastSignificantSetBit(&BotFaces); u32 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_BottomFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -172,7 +172,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, BottomFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index b99270874..ef04e0bbf 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -50,7 +50,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_LeftFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -62,7 +62,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, LeftFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -71,7 +71,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_RightFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -84,7 +84,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, RightFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -93,7 +93,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 This = UnsetLeastSignificantSetBit(&FrontFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_FrontFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -106,7 +106,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, FrontFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -115,7 +115,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 This = UnsetLeastSignificantSetBit(&BackFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_BackFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -128,7 +128,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, BackFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -137,7 +137,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 This = UnsetLeastSignificantSetBit(&TopFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_TopFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -150,7 +150,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, TopFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -159,7 +159,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u64 This = UnsetLeastSignificantSetBit(&BotFaces); u32 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_BottomFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -172,7 +172,7 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, BottomFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } diff --git a/shaders/terrain/TerrainFinalize.fragmentshader b/shaders/terrain/TerrainFinalize.fragmentshader index bd329f9a9..4ec3e490f 100644 --- a/shaders/terrain/TerrainFinalize.fragmentshader +++ b/shaders/terrain/TerrainFinalize.fragmentshader @@ -25,5 +25,5 @@ void main() uint PackedColor = PackRGB(ColorValue); /* uint PackedColor = PackedNormal; */ - Output = (SolidBit << 30) | (PackedNormal << 15) | PackedColor; + Output = (SolidBit << 31) | (PackedNormal << 16) | PackedColor; } diff --git a/src/engine/color.h b/src/engine/color.h index 455b53666..d9fccf2f5 100644 --- a/src/engine/color.h +++ b/src/engine/color.h @@ -288,6 +288,6 @@ link_internal u16 MagicaVoxelDefaultPaletteToPackedHSV(u16 MagicaVoxelIndex) { v3 HSV = MagicaVoxelDefaultPaletteToHSV(MagicaVoxelIndex); - u16 Result = PackHSVColor(HSV); + u16 Result = PackV3_16b(HSV); return Result; } diff --git a/src/engine/loaders/vox.cpp b/src/engine/loaders/vox.cpp index 889073211..09184c788 100644 --- a/src/engine/loaders/vox.cpp +++ b/src/engine/loaders/vox.cpp @@ -198,7 +198,7 @@ LoadVoxData(v3_cursor *ColorPalette, memory_arena *TempMemory, memory_arena *Per b32 HadPaletteData = False; - v3 TempHSVPalette[256] = {}; + v3 TempRGBPalette[256] = {}; @@ -248,8 +248,8 @@ LoadVoxData(v3_cursor *ColorPalette, memory_arena *TempMemory, memory_arena *Per u8 B = ReadChar(ModelFile, &bytesRemaining); u8 A = ReadChar(ModelFile, &bytesRemaining); - v3 ThisColor = RGBtoHSV(V3(R,G,B)/255.f); - TempHSVPalette[PaletteIndex] = ThisColor; + /* v3 ThisColor = RGBtoHSV(V3(R,G,B)/255.f); */ + TempRGBPalette[PaletteIndex] = V3(R,G,B)/255.f; /* v3 ThisColor = V3(R,G,B); */ #if 1 #else @@ -507,11 +507,11 @@ LoadVoxData(v3_cursor *ColorPalette, memory_arena *TempMemory, memory_arena *Per DimIterator(x, y, z, Chunk->Dim) { s32 Index = GetIndex(x, y, z, Chunk->Dim); - u16 PaletteIndex = Chunk->Voxels[Index].Color; + u16 PaletteIndex = Chunk->Voxels[Index].RGBColor; if (HadPaletteData) - { Chunk->Voxels[Index].Color = PackHSVColor(TempHSVPalette[PaletteIndex]); } + { Chunk->Voxels[Index].RGBColor = PackV3_16b(TempRGBPalette[PaletteIndex]); } else - { Chunk->Voxels[Index].Color = PackHSVColor(MagicaVoxelDefaultPaletteToHSV(PaletteIndex)); } + { Chunk->Voxels[Index].RGBColor = PackV3_16b(MagicaVoxelDefaultPaletteToRGB(PaletteIndex)); } } } } diff --git a/src/engine/terrain.cpp b/src/engine/terrain.cpp index 29039a271..460311272 100644 --- a/src/engine/terrain.cpp +++ b/src/engine/terrain.cpp @@ -3085,7 +3085,7 @@ Terrain_Voronoi3D( world_chunk *Chunk, /* SetFlag(&Chunk->Voxels[VoxIndex], (voxel_flag)(Voxel_Filled*IsFilled)); */ SetOccupancyBit(Chunk, VoxIndex, s32(IsFilled)); - Chunk->Voxels[VoxIndex].Color = PackHSVColor(RGBColor)*u8(IsFilled); + Chunk->Voxels[VoxIndex].Color = PackV3_16b(RGBColor)*u8(IsFilled); ChunkSum += IsFilled; } } diff --git a/src/engine/voxel_synthesis.cpp b/src/engine/voxel_synthesis.cpp index 29d939003..b19b68de9 100644 --- a/src/engine/voxel_synthesis.cpp +++ b/src/engine/voxel_synthesis.cpp @@ -73,7 +73,7 @@ BakeVoxelSynthesisRules(const char* InputVox) s32 VIndex = GetIndex(xIndex, yIndex, zIndex, ModelDim); NotImplemented; /* Vox.ChunkData->Voxels[VIndex].Flags = {}; */ - Vox.ChunkData->Voxels[VIndex].Color = RGBtoPackedHSV(RGB_GRASS_GREEN); + Vox.ChunkData->Voxels[VIndex].RGBColor = PackV3_16b(RGB_GRASS_GREEN); } MakeFaceMasks_NoExteriorFaces( Vox.ChunkData->Occupancy, Vox.ChunkData->xOccupancyBorder, Vox.ChunkData->FaceMasks, Vox.ChunkData->Voxels, Vox.ChunkData->Dim, {}, Vox.ChunkData->Dim); diff --git a/src/engine/voxel_synthesis.h b/src/engine/voxel_synthesis.h index c22957023..955fb90b6 100644 --- a/src/engine/voxel_synthesis.h +++ b/src/engine/voxel_synthesis.h @@ -124,7 +124,7 @@ AreEqual(voxel_synth_tile *T0, voxel_synth_tile *T1) #else /* (T0->Voxels[i].Flags&Voxel_Filled) == (T1->Voxels[i].Flags&Voxel_Filled) && */ #endif - (T0->Voxels[i].Color) == (T1->Voxels[i].Color); + (T0->Voxels[i].RGBColor) == (T1->Voxels[i].RGBColor); if (!Result) break; } diff --git a/src/engine/world.cpp b/src/engine/world.cpp index d9497584d..d6d247a89 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -189,6 +189,8 @@ GatherRangesOverlapping(world *World, rect3i SimSpaceAABB, world_chunk_ptr_buffe link_internal void GatherVoxelsOverlappingArea(world *World, rect3i SimSpaceAABB, world_chunk_ptr_buffer *ChunkBuffer, voxel *Voxels, s32 VoxelCount) { + NotImplemented; +#if 0 Assert(Volume(SimSpaceAABB) == VoxelCount); v3i SimSpaceQueryDim = GetDim(SimSpaceAABB); @@ -240,6 +242,7 @@ GatherVoxelsOverlappingArea(world *World, rect3i SimSpaceAABB, world_chunk_ptr_b } } } +#endif } link_internal world_chunk diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index b4c3c8ba6..88c86de9d 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -691,7 +691,7 @@ MergeChunksOffset(world_chunk *Src, world_chunk *Dest, voxel_position Offset) if (SrcOccupancy) { SetOccupancyBit(Dest, DestIndex, SrcOccupancy); } /* DestV->Flags |= (SrcV->Flags & Voxel_Filled); */ - if (SrcV->Color) { DestV->Color = SrcV->Color; } + if (SrcV->RGBColor) { DestV->RGBColor = SrcV->RGBColor; } /* if (!DestV->Color) { DestV->Color = SrcV->Color; } */ Dest->FilledCount += SrcOccupancy; @@ -1135,7 +1135,7 @@ DrawDebugVoxels( voxel *Voxels, // TODO(Jesse): This copy could be avoided in multiple ways, and should be. /* v3 Color = GetColorData(Voxel->Color); */ - FillArray(VertexMaterial(Voxel->Color, 0.f, 0.f), Materials, VERTS_PER_FACE); + FillArray(VertexMaterial(Voxel->RGBColor, 0.f, 0.f), Materials, VERTS_PER_FACE); NotImplemented; @@ -1224,7 +1224,7 @@ Step(voxel *Voxels, v3i SrcDim, v3i StepDir, v3i StepShape, v3i *AtP, voxel_flag { s32 VoxI = GetIndex(Next, SrcDim); voxel *V = Voxels + VoxI; - if ( (V->Flags&FaceFlag) && V->Color == PackedHSV && TransparencyIsSimilar(V->Transparency, Transparency)) + if ( (V->Flags&FaceFlag) && V->RGBColor == PackedHSV && TransparencyIsSimilar(V->Transparency, Transparency)) { /* UnSetFlag((voxel_flag*)&V->Flags, FaceFlag); */ } @@ -1253,18 +1253,18 @@ Step(voxel *Voxels, v3i SrcDim, v3i StepDir, v3i StepShape, v3i *AtP, voxel_flag /* global_variable random_series ColorEntropy = {33453}; */ link_internal v3 -DoXStepping(voxel *Voxels, v3i SrcChunkDim, v3i SrcP, voxel_flag Face, u16 Color, u8 Transparency) +DoXStepping(voxel *Voxels, v3i SrcChunkDim, v3i SrcP, voxel_flag Face, u16 RGBColor, u8 Transparency) { v3i AtY = SrcP; s32 DidStepY = 0; - while (Step(Voxels, SrcChunkDim, {{0, 1, 0}}, {{0, 1, 0}}, &AtY, Face, Color, Transparency )) + while (Step(Voxels, SrcChunkDim, {{0, 1, 0}}, {{0, 1, 0}}, &AtY, Face, RGBColor, Transparency )) { DidStepY++; } s32 DidStepZ = 0; v3i AtZ = SrcP; - while (Step(Voxels, SrcChunkDim, {{0, 0, 1}}, {{0, DidStepY, 1}}, &AtZ, Face, Color, Transparency )) + while (Step(Voxels, SrcChunkDim, {{0, 0, 1}}, {{0, DidStepY, 1}}, &AtZ, Face, RGBColor, Transparency )) { DidStepZ++; } @@ -1285,18 +1285,18 @@ DoXStepping(voxel *Voxels, v3i SrcChunkDim, v3i SrcP, voxel_flag Face, u16 Color } link_internal v3 -DoYStepping(voxel *Voxels, v3i SrcChunkDim, v3i SrcP, voxel_flag Face, u16 Color, u8 Transparency) +DoYStepping(voxel *Voxels, v3i SrcChunkDim, v3i SrcP, voxel_flag Face, u16 RGBColor, u8 Transparency) { v3i AtX = SrcP; s32 DidStepX = 0; - while (Step(Voxels, SrcChunkDim, {{1, 0, 0}}, {{1, 0, 0}}, &AtX, Face, Color, Transparency)) + while (Step(Voxels, SrcChunkDim, {{1, 0, 0}}, {{1, 0, 0}}, &AtX, Face, RGBColor, Transparency)) { DidStepX++; } s32 DidStepZ = 0; v3i AtZ = SrcP; - while (Step(Voxels, SrcChunkDim, {{0, 0, 1}}, {{DidStepX, 0, 1}}, &AtZ, Face, Color, Transparency )) + while (Step(Voxels, SrcChunkDim, {{0, 0, 1}}, {{DidStepX, 0, 1}}, &AtZ, Face, RGBColor, Transparency )) { DidStepZ++; } @@ -1317,18 +1317,18 @@ DoYStepping(voxel *Voxels, v3i SrcChunkDim, v3i SrcP, voxel_flag Face, u16 Color } link_internal v3 -DoZStepping(voxel *Voxels, v3i SrcChunkDim, v3i SrcP, voxel_flag Face, u16 Color, u8 Transparency) +DoZStepping(voxel *Voxels, v3i SrcChunkDim, v3i SrcP, voxel_flag Face, u16 RGBColor, u8 Transparency) { v3i AtX = SrcP; s32 DidStepX = 0; - while (Step(Voxels, SrcChunkDim, {{1, 0, 0}}, {{1, 0, 0}}, &AtX, Face, Color, Transparency )) + while (Step(Voxels, SrcChunkDim, {{1, 0, 0}}, {{1, 0, 0}}, &AtX, Face, RGBColor, Transparency )) { DidStepX++; } s32 DidStepY = 0; v3i AtY = SrcP; - while (Step(Voxels, SrcChunkDim, {{0, 1, 0}}, {{DidStepX, 1, 0}}, &AtY, Face, Color, Transparency )) + while (Step(Voxels, SrcChunkDim, {{0, 1, 0}}, {{DidStepX, 1, 0}}, &AtY, Face, RGBColor, Transparency )) { DidStepY++; } @@ -1352,7 +1352,7 @@ DoZStepping(voxel *Voxels, v3i SrcChunkDim, v3i SrcP, voxel_flag Face, u16 Color link_inline u16 GetVoxelColor(s32 Index, voxel *Voxels) { - return Voxels[Index].Color; + return Voxels[Index].RGBColor; } #if 0 @@ -1504,7 +1504,7 @@ poof( u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_LeftFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -1516,7 +1516,7 @@ poof( LeftFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -1525,7 +1525,7 @@ poof( u64 This = UnsetLeastSignificantSetBit(&RightFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_RightFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -1538,7 +1538,7 @@ poof( RightFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -1547,7 +1547,7 @@ poof( u64 This = UnsetLeastSignificantSetBit(&FrontFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_FrontFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -1560,7 +1560,7 @@ poof( FrontFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -1569,7 +1569,7 @@ poof( u64 This = UnsetLeastSignificantSetBit(&BackFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_BackFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -1582,7 +1582,7 @@ poof( BackFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -1591,7 +1591,7 @@ poof( u64 This = UnsetLeastSignificantSetBit(&TopFaces); u64 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_TopFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -1604,7 +1604,7 @@ poof( TopFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -1613,7 +1613,7 @@ poof( u64 This = UnsetLeastSignificantSetBit(&BotFaces); u32 xOffset = GetIndexOfSingleSetBit(This); v3 P = V3(s32(xOffset), y, z); - u16 HSVColor = Voxels[BaseVoxelOffset+xOffset].Color; + u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; v3 Normal = Normalize(0.25f*v3_BottomFaceNormalData[0] + UnpackV3_15b(PNormal)); @@ -1626,7 +1626,7 @@ poof( BottomFaceVertexData( VertexOffset+P, Dim, DestVerts); FillArray(Normal, DestNormals, VERTS_PER_FACE); - FillArray(VertexMaterial(HSVColor, 0.f, 0.f), DestMats, VERTS_PER_FACE); + FillArray(VertexMaterial(RGB, 0.f, 0.f), DestMats, VERTS_PER_FACE); Dest->At += VERTS_PER_FACE; } @@ -4811,6 +4811,7 @@ link_internal u32 FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i NoiseDim, u32 *NoiseValues, v3i SrcToDest, s64 zMin) { TIMED_FUNCTION(); + /* HISTOGRAM_FUNCTION(); */ u32 ChunkSum = 0; TIMED_NAMED_BLOCK(NoiseFinalize); @@ -4823,6 +4824,8 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No u64 Mask = 0; for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) { + Assert(xChunk < 64); + v3i ChunkP = V3i(xChunk, yChunk, zChunk); v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); @@ -4830,56 +4833,22 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); u32 ThisNoiseV = NoiseValues[NoiseIndex]; - u64 NoiseChoice = (ThisNoiseV >> 30); - /* if (NoiseChoice == 1) */ + u64 NoiseChoice = (ThisNoiseV >> 31); + Assert(NoiseChoice == 1 || NoiseChoice == 0); + + if (NoiseChoice == 1) { - Assert(NoiseChoice == 1 || NoiseChoice == 0); - ChunkSum += u32(NoiseChoice); - - u16 FifteenBits = (1<<15)-1; - u16 NoiseColor = u16(ThisNoiseV) & FifteenBits; - u16 PackedNormal = u16(ThisNoiseV>>15) & FifteenBits; - - /* Info("Color(%3d) Normal(%3d)", s32(NoiseColor), s32(PackedNormal)); */ - - /* u32 X = (PackedNormal >> 10) & FiveBits; */ - /* u32 Y = (PackedNormal >> 5) & FiveBits; */ - /* u32 Z = (PackedNormal >> 0) & FiveBits; */ - - /* PackedNormal = RGBtoPackedHSV(V3( */ - /* f32(X)/f32(FiveBits), */ - /* f32(Y)/f32(FiveBits), */ - /* f32(B)/f32(FiveBits) */ - /* )); */ - - u32 FiveBits = (1<<5)-1; - u32 R = (NoiseColor >> 10) & FiveBits; - u32 G = (NoiseColor >> 5) & FiveBits; - u32 B = (NoiseColor >> 0) & FiveBits; - - NoiseColor = RGBtoPackedHSV(V3( - f32(R)/f32(FiveBits), - f32(G)/f32(FiveBits), - f32(B)/f32(FiveBits) - )); - - Assert(xChunk < 64); - Mask |= (NoiseChoice << xChunk); - - /* s32 NormalIndex = TryGetIndex(ChunkP-V3i(0,1,1), NormalsDim); */ - /* if (NormalIndex > -1) */ - /* { */ - /* Chunk->Voxels[ChunkIndex].Color = RGBtoPackedHSV(Abs(Normals[NormalIndex])); */ - /* } */ - - Chunk->Voxels[ChunkIndex].Color = NoiseColor*u16(NoiseChoice); - Chunk->Voxels[ChunkIndex].Normal = PackedNormal*u16(NoiseChoice); - /* Chunk->Voxels[ChunkIndex].Color = u16(RandomU32(&DEBUG_ENTROPY)); */ + ChunkSum++; + Mask |= (1 << xChunk); + + u32 OccupancyBitMask = ~(1u << 31); + Chunk->Voxels[ChunkIndex].Data = ThisNoiseV & OccupancyBitMask; + if (GetEngineDebug()->MarkChunkBorderVoxels) { - if (xChunk == 0) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_RED)*u16(NoiseChoice); } - if (yChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_PINK)*u16(NoiseChoice); } - if (zChunk == 1) { Chunk->Voxels[ChunkIndex].Color = PackHSVColor(HSV_BLUE)*u16(NoiseChoice); } + if (xChunk == 0) { Chunk->Voxels[ChunkIndex].RGBColor = PackV3_16b(RGB_RED)*u16(NoiseChoice); } + if (yChunk == 1) { Chunk->Voxels[ChunkIndex].RGBColor = PackV3_16b(RGB_PINK)*u16(NoiseChoice); } + if (zChunk == 1) { Chunk->Voxels[ChunkIndex].RGBColor = PackV3_16b(RGB_BLUE)*u16(NoiseChoice); } } } } @@ -4912,7 +4881,7 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No s32 BorderIndex = GetIndex(BorderP, NoiseDim); u32 ThisNoiseV = NoiseValues[BorderIndex]; - u64 NoiseChoice = (ThisNoiseV >> 30); + u64 NoiseChoice = (ThisNoiseV >> 31); Assert(NoiseChoice == 1 || NoiseChoice == 0); u64 Bit = NoiseChoice << (yNoise-1); x0Bits |= Bit; @@ -4923,7 +4892,7 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No s32 BorderIndex = GetIndex(BorderP, NoiseDim); u32 ThisNoiseV = NoiseValues[BorderIndex]; - u64 NoiseChoice = (ThisNoiseV >> 30); + u64 NoiseChoice = (ThisNoiseV >> 31); Assert(NoiseChoice == 1 || NoiseChoice == 0); u64 Bit = NoiseChoice << (yNoise-1); x1Bits |= Bit; diff --git a/src/engine/world_chunk.h b/src/engine/world_chunk.h index a6a5cd92e..ce23c32c6 100644 --- a/src/engine/world_chunk.h +++ b/src/engine/world_chunk.h @@ -112,9 +112,15 @@ CAssert(Voxel_MarkBit < u8_MAX); // TODO(Jesse): Surely we can compress this.. but do we care? struct voxel { - u8 Transparency; - u16 Color; - u16 Normal; + union poof(@no_serialize) + { + u32 Data; + struct + { + u16 RGBColor; + u16 Normal; + }; + }; }; struct voxel_lighting @@ -128,7 +134,8 @@ poof(gen_constructor(voxel_lighting)) b32 operator==(voxel &V1, voxel &V2) { - b32 Result = V1.Transparency == V2.Transparency && V1.Color == V2.Color; + /* b32 Result = V1.Transparency == V2.Transparency && V1.RGBColor == V2.RGBColor; */ + b32 Result = V1.RGBColor == V2.RGBColor; return Result; } @@ -150,10 +157,10 @@ struct boundary_voxel this->Offset.y = y; this->Offset.z = z; - this->V.Color = w; + this->V.RGBColor = w; /* this->V.Flags = Voxel_Empty; */ - this->V.Transparency = 0; + /* this->V.Transparency = 0; */ } boundary_voxel(voxel *V_in, voxel_position Offset_in) @@ -617,7 +624,7 @@ MarshalMagicaVoxelEncodedColors(voxel *Src, voxel *Dest, v3i Dim) RangeIterator(Index, Max) { Dest[Index] = Src[Index]; - Dest[Index].Color = PackHSVColor(MagicaVoxelDefaultPaletteToHSV(Src[Index].Color)); + Dest[Index].RGBColor = PackV3_16b(MagicaVoxelDefaultPaletteToRGB(Src[Index].RGBColor)); } } diff --git a/src/engine/world_update.cpp b/src/engine/world_update.cpp index b34ec2419..911ad091a 100644 --- a/src/engine/world_update.cpp +++ b/src/engine/world_update.cpp @@ -496,13 +496,14 @@ WorldEdit_shape_sphere_Flood(apply_world_edit_params *Params, thread_local_state NotImplemented; /* if (V->Flags & Voxel_Filled) */ { - V->Color = MagicaVoxelDefaultPaletteToPackedHSV(SafeTruncateU8(RandomBetween((u32)MCV_GREY_5, &ColorEntropy, (u32)MCV_GREY_8+1))); + /* V->RGBColor = MagicaVoxelDefaultPaletteToPackedRGB(SafeTruncateU8(RandomBetween((u32)MCV_GREY_5, &ColorEntropy, (u32)MCV_GREY_8+1))); */ } } else if (LengthSq(CenterToVoxP) < RadiusSquared) { - V->Color = MagicaVoxelDefaultPaletteToPackedHSV(MCV_GREY_8); + NotImplemented; + /* V->RGBColor = MagicaVoxelDefaultPaletteToPackedRGB(MCV_GREY_8); */ } } )) @@ -828,7 +829,7 @@ ApplyUpdateToRegion(thread_local_state *Thread, work_queue_entry_update_world_re world_edit_shape Shape = Job->Brush.Shape; /* v3i FloodOrigin = V3i(Job->Brush.SimFloodOrigin); */ - u16 NewColor = PackHSVColor(Job->HSVColor); + u16 NewColor = PackV3_16b(Job->HSVColor); u8 NewTransparency = Job->Transparency; voxel _NewVoxelValue = {}; @@ -981,7 +982,7 @@ DoWorldUpdate(work_queue *Queue, world *World, thread_local_state *Thread, work_ world_edit_shape Shape = Job->Brush.Shape; /* v3i FloodOrigin = V3i(Job->Brush.SimFloodOrigin); */ - u16 NewColor = PackHSVColor(Job->HSVColor); + u16 NewColor = PackV3_16b(Job->HSVColor); u8 NewTransparency = Job->Transparency; cp MaxP = Job->MaxP; cp MinP = Job->MinP; From c0582f2be56e7195014d223ae18900522dc8bf43 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 28 Oct 2025 11:25:07 -0700 Subject: [PATCH 369/421] Add frustum culling back in --- ...ent_buffer_untextured_3d_geometry_buffer.h | 2 +- jesse.bonsai.rdbg | Bin 17188 -> 17555 bytes src/engine/render.cpp | 4 ++++ src/engine/world.cpp | 14 ++++++++++---- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h b/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h index 99aecc9af..da9f9f61f 100644 --- a/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h +++ b/generated/gpu_buffer_lod_element_buffer_untextured_3d_geometry_buffer.h @@ -1,4 +1,4 @@ -// src/engine/render.cpp:933:0 +// src/engine/render.cpp:935:0 link_internal void CopyBufferIntoBuffer( untextured_3d_geometry_buffer *Src, untextured_3d_geometry_buffer *Dest) diff --git a/jesse.bonsai.rdbg b/jesse.bonsai.rdbg index 5d6faa1fc1bc54a59daf2a78ec5a94890cf03ee4..b66ac28b997ff18d4cf48335474e3a49a7681019 100644 GIT binary patch delta 2532 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 arNnbm&NMXKYHn!IVE4HDN3YIi8vg?oeo+em diff --git a/src/engine/render.cpp b/src/engine/render.cpp index 2473ec1ff..00683c283 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -864,6 +864,8 @@ SetupVertexAttribsFor_world_chunk_element_buffer(gpu_element_buffer_handles *Han link_internal void SetupVertexAttribsFor_u3d_geo_element_buffer(gpu_element_buffer_handles *Handles) { + TIMED_FUNCTION(); + AssertNoGlErrors; GetGL()->EnableVertexAttribArray(VERTEX_POSITION_LAYOUT_LOCATION); GetGL()->EnableVertexAttribArray(VERTEX_NORMAL_LAYOUT_LOCATION); @@ -1147,6 +1149,8 @@ DrawLod( engine_resources *Engine, Quaternion Rotation, v3 Scale ) { + TIMED_FUNCTION(); + UNPACK_ENGINE_RESOURCES(Engine); AssertNoGlErrors; diff --git a/src/engine/world.cpp b/src/engine/world.cpp index d6d247a89..481a3801e 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -928,8 +928,11 @@ DrawOctreeRecursive( engine_resources *Engine, if (HasGpuMesh(&Chunk->Mesh)) { - Push(MainDrawList, Chunk); - Push(ShadowMapDrawList, Chunk); + if (IsInFrustum( World, Camera, Chunk )) + { + Push(MainDrawList, Chunk); + Push(ShadowMapDrawList, Chunk); + } } } } @@ -959,8 +962,11 @@ DrawOctreeRecursive( engine_resources *Engine, if (HasGpuMesh(&Chunk->Mesh)) { - Push(MainDrawList, Chunk); - Push(ShadowMapDrawList, Chunk); + if (IsInFrustum( World, Camera, Chunk )) + { + Push(MainDrawList, Chunk); + Push(ShadowMapDrawList, Chunk); + } } } } From 0b085394feacdd8ec03b831be4b0991007021a70 Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 28 Oct 2025 17:54:50 -0700 Subject: [PATCH 370/421] Reinstate frustum culling, fix a race condition at startup --- examples/terrain_gen/game.cpp | 3 +- external/bonsai_stdlib | 2 +- ...nymous_async_function_call_type_rQAZtEUA.h | 2 +- generated/d_union_work_queue_entry.h | 2 +- .../do_editor_ui_for_compound_type_camera.h | 75 +++++++ ...or_ui_for_compound_type_engine_resources.h | 25 +++ .../do_editor_ui_for_compound_type_frustum.h | 30 +-- .../do_editor_ui_for_compound_type_graphics.h | 10 +- .../do_editor_ui_for_compound_type_plane.h | 29 +-- generated/for_datatypes_0XxWqGSZ.h | 2 +- generated/for_datatypes_cx51CcgQ.h | 6 +- generated/for_datatypes_khY6kwEk.h | 4 + generated/gen_constructor_bbVSMD1T.h | 18 ++ generated/serdes_struct_camera.h | 54 +++++ generated/serdes_struct_frustum.h | 22 +- generated/serdes_struct_plane.h | 24 +-- generated/serdes_struct_v1bB0O62.h | 105 ++++++++++ generated/string_and_value_tables_ZQctkgyx.h | 108 ++++++++++ generated/string_and_value_tables_lJfyCh3Y.h | 68 ++++++ generated/string_and_value_tables_oeasGVdN.h | 152 ++++++++++++++ shaders/Lighting.fragmentshader | 2 +- shaders/gBuffer.vertexshader | 2 +- src/engine/api.cpp | 17 +- src/engine/camera.cpp | 194 +++++++++++------- src/engine/camera.h | 37 ++-- src/engine/editor.cpp | 2 +- src/engine/graphics.h | 2 +- src/engine/render.cpp | 8 +- src/engine/render.h | 2 +- src/engine/render/render_init.cpp | 29 ++- src/engine/render_command.h | 3 + src/engine/render_loop.cpp | 11 +- src/engine/resources.h | 2 + src/engine/serdes.cpp | 3 + src/engine/work_queue.h | 6 + src/engine/world_chunk.cpp | 2 +- src/game_loader.cpp | 11 +- 37 files changed, 833 insertions(+), 241 deletions(-) create mode 100644 generated/gen_constructor_bbVSMD1T.h create mode 100644 generated/serdes_struct_v1bB0O62.h create mode 100644 generated/string_and_value_tables_ZQctkgyx.h create mode 100644 generated/string_and_value_tables_lJfyCh3Y.h create mode 100644 generated/string_and_value_tables_oeasGVdN.h diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 5bfffdaf6..c0c52f6df 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -19,7 +19,8 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() world_position WorldCenter = V3i(100, 100, 0); canonical_position CameraTargetP = {}; - auto VisibleRegionSize = VisibleRegionSize_128; + /* auto VisibleRegionSize = VisibleRegionSize_128; */ + auto VisibleRegionSize = VisibleRegionSize_1024; /* auto VisibleRegionSize = VisibleRegionSize_8192; */ v3i VisibleRegion = V3i(VisibleRegionSize); f32 DistanceFromTarget = 5000.f; diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 1c908f329..5abcdae17 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 1c908f329d338b931339bf8d859113e4aebdcc36 +Subproject commit 5abcdae17cb19775915fd001fc2fab90b3c09847 diff --git a/generated/anonymous_async_function_call_type_rQAZtEUA.h b/generated/anonymous_async_function_call_type_rQAZtEUA.h index 56131ed1c..9eacc33b6 100644 --- a/generated/anonymous_async_function_call_type_rQAZtEUA.h +++ b/generated/anonymous_async_function_call_type_rQAZtEUA.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:287:0 +// src/engine/work_queue.h:293:0 { tmatch( initialize_easing_function_visualizer_render_pass_async_params, Task, Job ); DoJob(Job); diff --git a/generated/d_union_work_queue_entry.h b/generated/d_union_work_queue_entry.h index 80ee4fe54..bbaf13d21 100644 --- a/generated/d_union_work_queue_entry.h +++ b/generated/d_union_work_queue_entry.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:207:0 +// src/engine/work_queue.h:210:0 enum work_queue_entry_type { type_work_queue_entry_noop, diff --git a/generated/do_editor_ui_for_compound_type_camera.h b/generated/do_editor_ui_for_compound_type_camera.h index 43c59023c..92aecfa32 100644 --- a/generated/do_editor_ui_for_compound_type_camera.h +++ b/generated/do_editor_ui_for_compound_type_camera.h @@ -462,6 +462,81 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, camera *Element, cs Name, u32 + } + + + { + + + + cs MemberName = CSz("ViewProjection"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(m4*, &Element->ViewProjection), + MemberName, + ThisHash, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("InverseViewMatrix"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(m4*, &Element->InverseViewMatrix), + MemberName, + ThisHash, + Params + ); + + + + + + + + + + } + + + { + + + + cs MemberName = CSz("InverseProjectionMatrix"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(m4*, &Element->InverseProjectionMatrix), + MemberName, + ThisHash, + Params + ); + + + + + + + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/generated/do_editor_ui_for_compound_type_engine_resources.h b/generated/do_editor_ui_for_compound_type_engine_resources.h index 410ff5c43..a9cc35180 100644 --- a/generated/do_editor_ui_for_compound_type_engine_resources.h +++ b/generated/do_editor_ui_for_compound_type_engine_resources.h @@ -30,6 +30,31 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, engine_resources *Element, cs if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } + { + + + + cs MemberName = CSz("ReadyToStartMainLoop"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(bonsai_futex*, &Element->ReadyToStartMainLoop), + MemberName, + ThisHash, + Params + ); + + + + + + + + + + } + + { diff --git a/generated/do_editor_ui_for_compound_type_frustum.h b/generated/do_editor_ui_for_compound_type_frustum.h index b306c0d1b..6ab57ef70 100644 --- a/generated/do_editor_ui_for_compound_type_frustum.h +++ b/generated/do_editor_ui_for_compound_type_frustum.h @@ -77,32 +77,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, u3 - PushNewRow(Ui); - - } - - - { - - - - cs MemberName = CSz("width"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(f32*, &Element->width), - MemberName, - ThisHash, - Params - ); - - - - - - - - PushNewRow(Ui); } @@ -163,11 +137,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, frustum *Element, cs Name, u3 - cs MemberName = CSz("Bot"); + cs MemberName = CSz("Bottom"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(plane*, &Element->Bot), + Cast(plane*, &Element->Bottom), MemberName, ThisHash, Params diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 8c472daef..58cc6b2e9 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -35,12 +35,13 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u cs MemberName = CSz("Initialized"); - DoEditorUi(Ui, + DoEditorUi(Ui, Window, - Cast(b8*, &Element->Initialized), + // Cast to remove const/volatile keywords if they're there + Cast(bonsai_futex*, &Element->Initialized), MemberName, ThisHash, - &DefaultUiRenderParams_Checkbox + Params ); @@ -48,8 +49,9 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - PushNewRow(Ui); + + } diff --git a/generated/do_editor_ui_for_compound_type_plane.h b/generated/do_editor_ui_for_compound_type_plane.h index 071b5b6c4..0e6812a5c 100644 --- a/generated/do_editor_ui_for_compound_type_plane.h +++ b/generated/do_editor_ui_for_compound_type_plane.h @@ -30,31 +30,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, u32 if (DidToggle) { OPEN_INDENT_FOR_TOGGLEABLE_REGION(); } - { - - - - cs MemberName = CSz("P"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->P), - MemberName, - ThisHash, - Params - ); - - - - - - - - - - } - - { @@ -84,11 +59,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, plane *Element, cs Name, u32 - cs MemberName = CSz("d"); + cs MemberName = CSz("DistanceToOrigin"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->d), + Cast(f32*, &Element->DistanceToOrigin), MemberName, ThisHash, Params diff --git a/generated/for_datatypes_0XxWqGSZ.h b/generated/for_datatypes_0XxWqGSZ.h index fa333ecb9..8d97bad69 100644 --- a/generated/for_datatypes_0XxWqGSZ.h +++ b/generated/for_datatypes_0XxWqGSZ.h @@ -1,4 +1,4 @@ -// src/engine/work_queue.h:244:0 +// src/engine/work_queue.h:250:0 diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h index 32cb40ad2..b324c3ee1 100644 --- a/generated/for_datatypes_cx51CcgQ.h +++ b/generated/for_datatypes_cx51CcgQ.h @@ -1,4 +1,6 @@ -// src/engine/work_queue.h:267:0 +// src/engine/work_queue.h:273:0 + + @@ -895,6 +897,8 @@ DoJob(compile_shader_pair_async_params *Params) + + diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h index f8cc3a576..b619b7662 100644 --- a/generated/for_datatypes_khY6kwEk.h +++ b/generated/for_datatypes_khY6kwEk.h @@ -680,6 +680,8 @@ + + @@ -884,6 +886,8 @@ struct compile_shader_pair_async_params poof(@async_function_params) + + diff --git a/generated/gen_constructor_bbVSMD1T.h b/generated/gen_constructor_bbVSMD1T.h new file mode 100644 index 000000000..e0af74029 --- /dev/null +++ b/generated/gen_constructor_bbVSMD1T.h @@ -0,0 +1,18 @@ +// external/bonsai_stdlib/src/poof_functions.h:115:0 +link_internal plane +Plane( v3 Normal , f32 DistanceToOrigin ) +{ + plane Reuslt = { + .Normal = Normal + +, .DistanceToOrigin = DistanceToOrigin + + + }; + + + + + return Reuslt; +} + diff --git a/generated/serdes_struct_camera.h b/generated/serdes_struct_camera.h index 1bdbf8ca8..6c4f23c3f 100644 --- a/generated/serdes_struct_camera.h +++ b/generated/serdes_struct_camera.h @@ -131,6 +131,27 @@ Serialize(u8_cursor_block_array *Bytes, camera *BaseElement, umm Count = 1) + Result &= Serialize(Bytes, &Element->ViewProjection); // default + + + + + + + Result &= Serialize(Bytes, &Element->InverseViewMatrix); // default + + + + + + + Result &= Serialize(Bytes, &Element->InverseProjectionMatrix); // default + + + + + + @@ -156,6 +177,12 @@ Serialize(u8_cursor_block_array *Bytes, camera *BaseElement, umm Count = 1) + + + + + + @@ -320,6 +347,30 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->ViewProjection, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->InverseViewMatrix, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->InverseProjectionMatrix, Memory); + + + + + @@ -335,6 +386,9 @@ DeserializeCurrentVersion(u8_cursor *Bytes, camera *Element, memory_arena *Memor + + + diff --git a/generated/serdes_struct_frustum.h b/generated/serdes_struct_frustum.h index 255b5e6bd..126e654be 100644 --- a/generated/serdes_struct_frustum.h +++ b/generated/serdes_struct_frustum.h @@ -47,13 +47,6 @@ Serialize(u8_cursor_block_array *Bytes, frustum *BaseElement, umm Count = 1) - Result &= Serialize(Bytes, &Element->width); // default - - - - - - Result &= Serialize(Bytes, &Element->FOV); // default @@ -68,7 +61,7 @@ Serialize(u8_cursor_block_array *Bytes, frustum *BaseElement, umm Count = 1) - Result &= Serialize(Bytes, &Element->Bot); // default + Result &= Serialize(Bytes, &Element->Bottom); // default @@ -102,8 +95,6 @@ Serialize(u8_cursor_block_array *Bytes, frustum *BaseElement, umm Count = 1) - - @@ -144,14 +135,6 @@ DeserializeCurrentVersion(u8_cursor *Bytes, frustum *Element, memory_arena *Memo - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->width, Memory); - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->FOV, Memory); @@ -170,7 +153,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, frustum *Element, memory_arena *Memo // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->Bot, Memory); + Result &= Deserialize(Bytes, &Element->Bottom, Memory); @@ -201,7 +184,6 @@ DeserializeCurrentVersion(u8_cursor *Bytes, frustum *Element, memory_arena *Memo - MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/serdes_struct_plane.h b/generated/serdes_struct_plane.h index 4726da60d..de1d78533 100644 --- a/generated/serdes_struct_plane.h +++ b/generated/serdes_struct_plane.h @@ -33,21 +33,14 @@ Serialize(u8_cursor_block_array *Bytes, plane *BaseElement, umm Count = 1) RangeIterator_t(umm, ElementIndex, Count) { plane *Element = BaseElement + ElementIndex; - Result &= Serialize(Bytes, &Element->P); // default + Result &= Serialize(Bytes, &Element->Normal); // default - Result &= Serialize(Bytes, &Element->Normal); // default - - - - - - - Result &= Serialize(Bytes, &Element->d); // default + Result &= Serialize(Bytes, &Element->DistanceToOrigin); // default @@ -60,8 +53,6 @@ Serialize(u8_cursor_block_array *Bytes, plane *BaseElement, umm Count = 1) - - MAYBE_WRITE_DEBUG_OBJECT_DELIM(); @@ -85,14 +76,6 @@ DeserializeCurrentVersion(u8_cursor *Bytes, plane *Element, memory_arena *Memory b32 Result = True; // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->P, Memory); - - - - - - // NOTE(Jesse): Unfortunately we can't check for primitives because - // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->Normal, Memory); @@ -101,7 +84,7 @@ DeserializeCurrentVersion(u8_cursor *Bytes, plane *Element, memory_arena *Memory // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize - Result &= Deserialize(Bytes, &Element->d, Memory); + Result &= Deserialize(Bytes, &Element->DistanceToOrigin, Memory); @@ -111,7 +94,6 @@ DeserializeCurrentVersion(u8_cursor *Bytes, plane *Element, memory_arena *Memory - MAYBE_READ_DEBUG_OBJECT_DELIM(); diff --git a/generated/serdes_struct_v1bB0O62.h b/generated/serdes_struct_v1bB0O62.h new file mode 100644 index 000000000..c0ace4be4 --- /dev/null +++ b/generated/serdes_struct_v1bB0O62.h @@ -0,0 +1,105 @@ +// src/engine/serdes.h:495:0 +link_internal bonsai_type_info +TypeInfo(m4 *Ignored) +{ + bonsai_type_info Result = {}; + + Result.Name = CSz("m4"); + Result.Version = 0 ; + + /* type.map(member) */ + /* { */ + /* { */ + /* member_info Member = {CSz("member.name"), CSz("member.name"), 0x(member.hash)}; */ + /* Push(&Result.Members, &Member); */ + /* } */ + /* } */ + + return Result; +} + +link_internal b32 +Serialize(u8_cursor_block_array *Bytes, m4 *BaseElement, umm Count = 1) +{ + Assert(Count > 0); + + u64 PointerTrue = True; + u64 PointerFalse = False; + + b32 Result = True; + + + + RangeIterator_t(umm, ElementIndex, Count) + { + m4 *Element = BaseElement + ElementIndex; + { + umm ThisCount = 4; + + Result &= Serialize(Bytes, Element->E, ThisCount); + } + + + + + + + + + + + + MAYBE_WRITE_DEBUG_OBJECT_DELIM(); + } + + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, m4 *Element, memory_arena *Memory, umm Count = 1); + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, m4 *Element, memory_arena *Memory); + + + + +link_internal b32 +DeserializeCurrentVersion(u8_cursor *Bytes, m4 *Element, memory_arena *Memory) +{ + b32 Result = True; + { + umm Count = 4; + + Result &= Deserialize(Bytes, Element->E, Memory, Count); + } + + + + + + + + + + + MAYBE_READ_DEBUG_OBJECT_DELIM(); + return Result; +} + +link_internal b32 +Deserialize(u8_cursor *Bytes, m4 *Element, memory_arena *Memory, umm Count) +{ + Assert(Count > 0); + + b32 Result = True; + RangeIterator_t(umm, ElementIndex, Count) + { + Result &= DeserializeCurrentVersion(Bytes, Element+ElementIndex, Memory); + + } + + return Result; +} + + diff --git a/generated/string_and_value_tables_ZQctkgyx.h b/generated/string_and_value_tables_ZQctkgyx.h new file mode 100644 index 000000000..a196268e7 --- /dev/null +++ b/generated/string_and_value_tables_ZQctkgyx.h @@ -0,0 +1,108 @@ +// external/bonsai_stdlib/src/poof_functions.h:2048:0 +link_internal b32 +IsValid(work_queue_entry_type Value) +{ + b32 Result = False; + switch (Value) + { + case type_work_queue_entry_noop: + case type_work_queue_entry_init_world_chunk: + case type_work_queue_entry_finalize_noise_values: + case type_work_queue_entry_build_chunk_mesh: + case type_work_queue_entry_copy_buffer_set: + case type_work_queue_entry_copy_buffer_ref: + case type_work_queue_entry_init_asset: + case type_work_queue_entry_rebuild_mesh: + case type_work_queue_entry_sim_particle_system: + case type_work_queue_entry__bonsai_render_command: + case type_work_queue_entry_async_function_call: + case type_work_queue_entry__align_to_cache_line_helper: + + { + Result = True; + } + } + return Result; +} + + + +link_internal counted_string +ToStringPrefixless(work_queue_entry_type Type) +{ + Assert(IsValid(Type)); + counted_string Result = {}; + + switch (Type) + { + case type_work_queue_entry_noop: { Result = CSz("noop"); } break; + case type_work_queue_entry_init_world_chunk: { Result = CSz("chunk"); } break; + case type_work_queue_entry_finalize_noise_values: { Result = CSz("values"); } break; + case type_work_queue_entry_build_chunk_mesh: { Result = CSz("mesh"); } break; + case type_work_queue_entry_copy_buffer_set: { Result = CSz("set"); } break; + case type_work_queue_entry_copy_buffer_ref: { Result = CSz("ref"); } break; + case type_work_queue_entry_init_asset: { Result = CSz("asset"); } break; + case type_work_queue_entry_rebuild_mesh: { Result = CSz("mesh"); } break; + case type_work_queue_entry_sim_particle_system: { Result = CSz("system"); } break; + case type_work_queue_entry__bonsai_render_command: { Result = CSz("bonsai_render_command"); } break; + case type_work_queue_entry_async_function_call: { Result = CSz("call"); } break; + case type_work_queue_entry__align_to_cache_line_helper: { Result = CSz("align_to_cache_line_helper"); } break; + + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(work_queue_entry_type Type) +{ + Assert(IsValid(Type)); + + counted_string Result = {}; + switch (Type) + { + case type_work_queue_entry_noop: { Result = CSz("type_work_queue_entry_noop"); } break; + case type_work_queue_entry_init_world_chunk: { Result = CSz("type_work_queue_entry_init_world_chunk"); } break; + case type_work_queue_entry_finalize_noise_values: { Result = CSz("type_work_queue_entry_finalize_noise_values"); } break; + case type_work_queue_entry_build_chunk_mesh: { Result = CSz("type_work_queue_entry_build_chunk_mesh"); } break; + case type_work_queue_entry_copy_buffer_set: { Result = CSz("type_work_queue_entry_copy_buffer_set"); } break; + case type_work_queue_entry_copy_buffer_ref: { Result = CSz("type_work_queue_entry_copy_buffer_ref"); } break; + case type_work_queue_entry_init_asset: { Result = CSz("type_work_queue_entry_init_asset"); } break; + case type_work_queue_entry_rebuild_mesh: { Result = CSz("type_work_queue_entry_rebuild_mesh"); } break; + case type_work_queue_entry_sim_particle_system: { Result = CSz("type_work_queue_entry_sim_particle_system"); } break; + case type_work_queue_entry__bonsai_render_command: { Result = CSz("type_work_queue_entry__bonsai_render_command"); } break; + case type_work_queue_entry_async_function_call: { Result = CSz("type_work_queue_entry_async_function_call"); } break; + case type_work_queue_entry__align_to_cache_line_helper: { Result = CSz("type_work_queue_entry__align_to_cache_line_helper"); } break; + + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ + return Result; +} + +link_internal work_queue_entry_type +WorkQueueEntryType(counted_string S) +{ + work_queue_entry_type Result = {}; + + if (StringsMatch(S, CSz("type_work_queue_entry_noop"))) { return type_work_queue_entry_noop; } + if (StringsMatch(S, CSz("type_work_queue_entry_init_world_chunk"))) { return type_work_queue_entry_init_world_chunk; } + if (StringsMatch(S, CSz("type_work_queue_entry_finalize_noise_values"))) { return type_work_queue_entry_finalize_noise_values; } + if (StringsMatch(S, CSz("type_work_queue_entry_build_chunk_mesh"))) { return type_work_queue_entry_build_chunk_mesh; } + if (StringsMatch(S, CSz("type_work_queue_entry_copy_buffer_set"))) { return type_work_queue_entry_copy_buffer_set; } + if (StringsMatch(S, CSz("type_work_queue_entry_copy_buffer_ref"))) { return type_work_queue_entry_copy_buffer_ref; } + if (StringsMatch(S, CSz("type_work_queue_entry_init_asset"))) { return type_work_queue_entry_init_asset; } + if (StringsMatch(S, CSz("type_work_queue_entry_rebuild_mesh"))) { return type_work_queue_entry_rebuild_mesh; } + if (StringsMatch(S, CSz("type_work_queue_entry_sim_particle_system"))) { return type_work_queue_entry_sim_particle_system; } + if (StringsMatch(S, CSz("type_work_queue_entry__bonsai_render_command"))) { return type_work_queue_entry__bonsai_render_command; } + if (StringsMatch(S, CSz("type_work_queue_entry_async_function_call"))) { return type_work_queue_entry_async_function_call; } + if (StringsMatch(S, CSz("type_work_queue_entry__align_to_cache_line_helper"))) { return type_work_queue_entry__align_to_cache_line_helper; } + + + return Result; +} + + diff --git a/generated/string_and_value_tables_lJfyCh3Y.h b/generated/string_and_value_tables_lJfyCh3Y.h new file mode 100644 index 000000000..dee96370a --- /dev/null +++ b/generated/string_and_value_tables_lJfyCh3Y.h @@ -0,0 +1,68 @@ +// external/bonsai_stdlib/src/poof_functions.h:2048:0 +link_internal b32 +IsValid(async_function_call_type Value) +{ + b32 Result = False; + switch (Value) + { + case type_initialize_easing_function_visualizer_render_pass_async_params: + case type_compile_shader_pair_async_params: + + { + Result = True; + } + } + return Result; +} + + + +link_internal counted_string +ToStringPrefixless(async_function_call_type Type) +{ + Assert(IsValid(Type)); + counted_string Result = {}; + + switch (Type) + { + case type_initialize_easing_function_visualizer_render_pass_async_params: { Result = CSz("params"); } break; + case type_compile_shader_pair_async_params: { Result = CSz("params"); } break; + + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(async_function_call_type Type) +{ + Assert(IsValid(Type)); + + counted_string Result = {}; + switch (Type) + { + case type_initialize_easing_function_visualizer_render_pass_async_params: { Result = CSz("type_initialize_easing_function_visualizer_render_pass_async_params"); } break; + case type_compile_shader_pair_async_params: { Result = CSz("type_compile_shader_pair_async_params"); } break; + + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ + return Result; +} + +link_internal async_function_call_type +AsyncFunctionCallType(counted_string S) +{ + async_function_call_type Result = {}; + + if (StringsMatch(S, CSz("type_initialize_easing_function_visualizer_render_pass_async_params"))) { return type_initialize_easing_function_visualizer_render_pass_async_params; } + if (StringsMatch(S, CSz("type_compile_shader_pair_async_params"))) { return type_compile_shader_pair_async_params; } + + + return Result; +} + + diff --git a/generated/string_and_value_tables_oeasGVdN.h b/generated/string_and_value_tables_oeasGVdN.h new file mode 100644 index 000000000..b838dabc3 --- /dev/null +++ b/generated/string_and_value_tables_oeasGVdN.h @@ -0,0 +1,152 @@ +// external/bonsai_stdlib/src/poof_functions.h:2048:0 +link_internal b32 +IsValid(work_queue_entry__bonsai_render_command_type Value) +{ + b32 Result = False; + switch (Value) + { + case type_work_queue_entry__bonsai_render_command_noop: + case type_bonsai_render_command_initialize_noise_buffer: + case type_bonsai_render_command_clear_all_framebuffers: + case type_bonsai_render_command_allocate_texture: + case type_bonsai_render_command_deallocate_texture: + case type_bonsai_render_command_allocate_buffers: + case type_bonsai_render_command_reallocate_buffers: + case type_bonsai_render_command_deallocate_buffers: + case type_bonsai_render_command_deallocate_world_chunk: + case type_bonsai_render_command_do_stuff: + case type_bonsai_render_command_allocate_and_map_gpu_element_buffer: + case type_bonsai_render_command_unmap_gpu_element_buffer: + case type_bonsai_render_command_unmap_and_deallocate_buffer: + case type_bonsai_render_command_setup_shader: + case type_bonsai_render_command_teardown_shader: + case type_bonsai_render_command_set_shader_uniform: + case type_bonsai_render_command_draw_world_chunk_draw_list: + case type_bonsai_render_command_draw_all_entities: + case type_bonsai_render_command_gl_timer_init: + case type_bonsai_render_command_gl_timer_start: + case type_bonsai_render_command_gl_timer_end: + case type_bonsai_render_command_gl_timer_read_value_and_histogram: + case type_bonsai_render_command_cancel_all_noise_readback_jobs: + + { + Result = True; + } + } + return Result; +} + + + +link_internal counted_string +ToStringPrefixless(work_queue_entry__bonsai_render_command_type Type) +{ + Assert(IsValid(Type)); + counted_string Result = {}; + + switch (Type) + { + case type_work_queue_entry__bonsai_render_command_noop: { Result = CSz("bonsai_render_command_noop"); } break; + case type_bonsai_render_command_initialize_noise_buffer: { Result = CSz("buffer"); } break; + case type_bonsai_render_command_clear_all_framebuffers: { Result = CSz("framebuffers"); } break; + case type_bonsai_render_command_allocate_texture: { Result = CSz("texture"); } break; + case type_bonsai_render_command_deallocate_texture: { Result = CSz("texture"); } break; + case type_bonsai_render_command_allocate_buffers: { Result = CSz("buffers"); } break; + case type_bonsai_render_command_reallocate_buffers: { Result = CSz("buffers"); } break; + case type_bonsai_render_command_deallocate_buffers: { Result = CSz("buffers"); } break; + case type_bonsai_render_command_deallocate_world_chunk: { Result = CSz("chunk"); } break; + case type_bonsai_render_command_do_stuff: { Result = CSz("stuff"); } break; + case type_bonsai_render_command_allocate_and_map_gpu_element_buffer: { Result = CSz("buffer"); } break; + case type_bonsai_render_command_unmap_gpu_element_buffer: { Result = CSz("buffer"); } break; + case type_bonsai_render_command_unmap_and_deallocate_buffer: { Result = CSz("buffer"); } break; + case type_bonsai_render_command_setup_shader: { Result = CSz("shader"); } break; + case type_bonsai_render_command_teardown_shader: { Result = CSz("shader"); } break; + case type_bonsai_render_command_set_shader_uniform: { Result = CSz("uniform"); } break; + case type_bonsai_render_command_draw_world_chunk_draw_list: { Result = CSz("list"); } break; + case type_bonsai_render_command_draw_all_entities: { Result = CSz("entities"); } break; + case type_bonsai_render_command_gl_timer_init: { Result = CSz("init"); } break; + case type_bonsai_render_command_gl_timer_start: { Result = CSz("start"); } break; + case type_bonsai_render_command_gl_timer_end: { Result = CSz("end"); } break; + case type_bonsai_render_command_gl_timer_read_value_and_histogram: { Result = CSz("histogram"); } break; + case type_bonsai_render_command_cancel_all_noise_readback_jobs: { Result = CSz("jobs"); } break; + + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ + return Result; +} + +link_internal counted_string +ToString(work_queue_entry__bonsai_render_command_type Type) +{ + Assert(IsValid(Type)); + + counted_string Result = {}; + switch (Type) + { + case type_work_queue_entry__bonsai_render_command_noop: { Result = CSz("type_work_queue_entry__bonsai_render_command_noop"); } break; + case type_bonsai_render_command_initialize_noise_buffer: { Result = CSz("type_bonsai_render_command_initialize_noise_buffer"); } break; + case type_bonsai_render_command_clear_all_framebuffers: { Result = CSz("type_bonsai_render_command_clear_all_framebuffers"); } break; + case type_bonsai_render_command_allocate_texture: { Result = CSz("type_bonsai_render_command_allocate_texture"); } break; + case type_bonsai_render_command_deallocate_texture: { Result = CSz("type_bonsai_render_command_deallocate_texture"); } break; + case type_bonsai_render_command_allocate_buffers: { Result = CSz("type_bonsai_render_command_allocate_buffers"); } break; + case type_bonsai_render_command_reallocate_buffers: { Result = CSz("type_bonsai_render_command_reallocate_buffers"); } break; + case type_bonsai_render_command_deallocate_buffers: { Result = CSz("type_bonsai_render_command_deallocate_buffers"); } break; + case type_bonsai_render_command_deallocate_world_chunk: { Result = CSz("type_bonsai_render_command_deallocate_world_chunk"); } break; + case type_bonsai_render_command_do_stuff: { Result = CSz("type_bonsai_render_command_do_stuff"); } break; + case type_bonsai_render_command_allocate_and_map_gpu_element_buffer: { Result = CSz("type_bonsai_render_command_allocate_and_map_gpu_element_buffer"); } break; + case type_bonsai_render_command_unmap_gpu_element_buffer: { Result = CSz("type_bonsai_render_command_unmap_gpu_element_buffer"); } break; + case type_bonsai_render_command_unmap_and_deallocate_buffer: { Result = CSz("type_bonsai_render_command_unmap_and_deallocate_buffer"); } break; + case type_bonsai_render_command_setup_shader: { Result = CSz("type_bonsai_render_command_setup_shader"); } break; + case type_bonsai_render_command_teardown_shader: { Result = CSz("type_bonsai_render_command_teardown_shader"); } break; + case type_bonsai_render_command_set_shader_uniform: { Result = CSz("type_bonsai_render_command_set_shader_uniform"); } break; + case type_bonsai_render_command_draw_world_chunk_draw_list: { Result = CSz("type_bonsai_render_command_draw_world_chunk_draw_list"); } break; + case type_bonsai_render_command_draw_all_entities: { Result = CSz("type_bonsai_render_command_draw_all_entities"); } break; + case type_bonsai_render_command_gl_timer_init: { Result = CSz("type_bonsai_render_command_gl_timer_init"); } break; + case type_bonsai_render_command_gl_timer_start: { Result = CSz("type_bonsai_render_command_gl_timer_start"); } break; + case type_bonsai_render_command_gl_timer_end: { Result = CSz("type_bonsai_render_command_gl_timer_end"); } break; + case type_bonsai_render_command_gl_timer_read_value_and_histogram: { Result = CSz("type_bonsai_render_command_gl_timer_read_value_and_histogram"); } break; + case type_bonsai_render_command_cancel_all_noise_readback_jobs: { Result = CSz("type_bonsai_render_command_cancel_all_noise_readback_jobs"); } break; + + + + } + /* if (Result.Start == 0) { Info("Could not convert value(%d) to (enum_t.name)", Type); } */ + return Result; +} + +link_internal work_queue_entry__bonsai_render_command_type +WorkQueueEntryBonsaiRenderCommandType(counted_string S) +{ + work_queue_entry__bonsai_render_command_type Result = {}; + + if (StringsMatch(S, CSz("type_work_queue_entry__bonsai_render_command_noop"))) { return type_work_queue_entry__bonsai_render_command_noop; } + if (StringsMatch(S, CSz("type_bonsai_render_command_initialize_noise_buffer"))) { return type_bonsai_render_command_initialize_noise_buffer; } + if (StringsMatch(S, CSz("type_bonsai_render_command_clear_all_framebuffers"))) { return type_bonsai_render_command_clear_all_framebuffers; } + if (StringsMatch(S, CSz("type_bonsai_render_command_allocate_texture"))) { return type_bonsai_render_command_allocate_texture; } + if (StringsMatch(S, CSz("type_bonsai_render_command_deallocate_texture"))) { return type_bonsai_render_command_deallocate_texture; } + if (StringsMatch(S, CSz("type_bonsai_render_command_allocate_buffers"))) { return type_bonsai_render_command_allocate_buffers; } + if (StringsMatch(S, CSz("type_bonsai_render_command_reallocate_buffers"))) { return type_bonsai_render_command_reallocate_buffers; } + if (StringsMatch(S, CSz("type_bonsai_render_command_deallocate_buffers"))) { return type_bonsai_render_command_deallocate_buffers; } + if (StringsMatch(S, CSz("type_bonsai_render_command_deallocate_world_chunk"))) { return type_bonsai_render_command_deallocate_world_chunk; } + if (StringsMatch(S, CSz("type_bonsai_render_command_do_stuff"))) { return type_bonsai_render_command_do_stuff; } + if (StringsMatch(S, CSz("type_bonsai_render_command_allocate_and_map_gpu_element_buffer"))) { return type_bonsai_render_command_allocate_and_map_gpu_element_buffer; } + if (StringsMatch(S, CSz("type_bonsai_render_command_unmap_gpu_element_buffer"))) { return type_bonsai_render_command_unmap_gpu_element_buffer; } + if (StringsMatch(S, CSz("type_bonsai_render_command_unmap_and_deallocate_buffer"))) { return type_bonsai_render_command_unmap_and_deallocate_buffer; } + if (StringsMatch(S, CSz("type_bonsai_render_command_setup_shader"))) { return type_bonsai_render_command_setup_shader; } + if (StringsMatch(S, CSz("type_bonsai_render_command_teardown_shader"))) { return type_bonsai_render_command_teardown_shader; } + if (StringsMatch(S, CSz("type_bonsai_render_command_set_shader_uniform"))) { return type_bonsai_render_command_set_shader_uniform; } + if (StringsMatch(S, CSz("type_bonsai_render_command_draw_world_chunk_draw_list"))) { return type_bonsai_render_command_draw_world_chunk_draw_list; } + if (StringsMatch(S, CSz("type_bonsai_render_command_draw_all_entities"))) { return type_bonsai_render_command_draw_all_entities; } + if (StringsMatch(S, CSz("type_bonsai_render_command_gl_timer_init"))) { return type_bonsai_render_command_gl_timer_init; } + if (StringsMatch(S, CSz("type_bonsai_render_command_gl_timer_start"))) { return type_bonsai_render_command_gl_timer_start; } + if (StringsMatch(S, CSz("type_bonsai_render_command_gl_timer_end"))) { return type_bonsai_render_command_gl_timer_end; } + if (StringsMatch(S, CSz("type_bonsai_render_command_gl_timer_read_value_and_histogram"))) { return type_bonsai_render_command_gl_timer_read_value_and_histogram; } + if (StringsMatch(S, CSz("type_bonsai_render_command_cancel_all_noise_readback_jobs"))) { return type_bonsai_render_command_cancel_all_noise_readback_jobs; } + + + return Result; +} + + diff --git a/shaders/Lighting.fragmentshader b/shaders/Lighting.fragmentshader index b946dedc5..faa48bdf8 100644 --- a/shaders/Lighting.fragmentshader +++ b/shaders/Lighting.fragmentshader @@ -307,7 +307,7 @@ void main() */ // TODO(Jesse): Can do squared? float DistanceToFrag = distance(Camera, FragWorldP); - float MaxFogDist = 200000.f; + float MaxFogDist = 1000000.f; float FogContrib = clamp( DistanceToFrag / MaxFogDist, 0.f, 1.f); v3 Fog = FogContrib * FogColor * FogPower; diff --git a/shaders/gBuffer.vertexshader b/shaders/gBuffer.vertexshader index f33cf5935..4061a9148 100644 --- a/shaders/gBuffer.vertexshader +++ b/shaders/gBuffer.vertexshader @@ -35,7 +35,7 @@ void main() int Emission = in_TransEmiss.y; /* MaterialColor = texelFetch(ColorPalette, ivec2(ColorIndex, 0), 0).rgb; */ - MaterialColor = UnpackHSVColorToRGB(s32(ColorIndex)); + MaterialColor = UnpackHSVColor(int(ColorIndex)); /* MaterialColor = texelFetch(ColorPalette, ivec2(5, 0), 0).rgb; */ /* MaterialColor = V3(1,0,1); */ TransEmiss = V2(float(Transparency)/255.f, float(Emission)/(255.f/RENDERER_MAX_LIGHT_EMISSION_VALUE)); diff --git a/src/engine/api.cpp b/src/engine/api.cpp index 52399cfb1..3fabc2b2e 100644 --- a/src/engine/api.cpp +++ b/src/engine/api.cpp @@ -7,6 +7,7 @@ Bonsai_OnLibraryLoad(engine_resources *Resources) if (ThreadLocal_ThreadIndex == -1) { SetThreadLocal_ThreadIndex(0); } else { Assert(ThreadLocal_ThreadIndex == 0); } + Global_Stdlib = &Resources->Stdlib; Assert(Resources->Stdlib.ThreadStates); return True; } @@ -22,8 +23,6 @@ Bonsai_Init(engine_resources *Resources) Result &= InitEditor(&Resources->Editor); Result &= InitEngineResources(Resources); - /* Initialize_Global_UpdateWorldCallbackTable(); */ - return Result; } @@ -242,7 +241,7 @@ Bonsai_FrameBegin(engine_resources *Resources) { if (Camera == &Graphics->GameCamera) { - Resources->MaybeMouseRay = ComputeCameraSpaceRayFromCursor(Resources, &gBuffer->ViewProjection, &Resources->Graphics.GameCamera, World->ChunkDim); + Resources->MaybeMouseRay = ComputeCameraSpaceRayFromCursor(Resources, Camera, World->ChunkDim); ray *Ray = &Resources->MaybeMouseRay.Ray; v3 GameCameraSimSpaceP = GetSimSpaceP(World, Graphics->GameCamera.CurrentP); @@ -459,14 +458,12 @@ Bonsai_Simulate(engine_resources *Resources) Camera = Graphics->Camera; } - m4 ViewMat = ViewMatrix(World->ChunkDim, Camera); - - // TODO(Jesse)(correctness, nopush): This should actually be passing the back-buffer resolution?? - m4 ProjMat = ProjectionMatrix(Camera, Plat->ScreenDim); + /* m4 *ViewMat = ViewMatrix(World->ChunkDim, Camera); */ + /* m4 *ProjMat = ProjectionMatrix(Camera, Plat->ScreenDim); */ - Resources->Graphics.gBuffer->InverseViewMatrix = Inverse(ViewMat); - Resources->Graphics.gBuffer->InverseProjectionMatrix = Inverse(ProjMat); - Resources->Graphics.gBuffer->ViewProjection = ProjMat * ViewMat; + Resources->Graphics.gBuffer->ViewProjection = Camera->ViewProjection; + Resources->Graphics.gBuffer->InverseViewMatrix = Camera->InverseViewMatrix; + Resources->Graphics.gBuffer->InverseProjectionMatrix = Camera->InverseProjectionMatrix; #if BONSAI_DEBUG_SYSTEM_API Debug_DoWorldChunkPicking(Resources); diff --git a/src/engine/camera.cpp b/src/engine/camera.cpp index 345edc47a..608080001 100644 --- a/src/engine/camera.cpp +++ b/src/engine/camera.cpp @@ -2,7 +2,51 @@ link_internal void UpdateCameraP(world *World, cp TargetViewP, camera *Camera) { - TIMED_FUNCTION(); +} + +link_inline v2 +GetMouseDelta(platform *Plat) +{ + r32 DPToWorldModifier = -0.001f; + v2 Result = Plat->MouseDP * DPToWorldModifier; + return Result; +} + +link_internal void +UpdateGameCamera( world *World, + v2 ScreenDim, + v2 MouseDelta, + r32 CameraZoomDelta, + cp TargetViewP, + camera *Camera, + r32 Dt ) +{ + // TODO(Jesse): Make these vary by DistanceFromTarget, such that the mouse feels the same amount of sensitive zoomed in as out. + Camera->TargetYaw += MouseDelta.x; + Camera->TargetPitch += MouseDelta.y; + Camera->TargetPitch = ClampBetween(0.0, Camera->TargetPitch, PI32); + + r32 t = 1.f; + if (Camera->Blend > 0.f && Dt > 0.f) + { + t = Min(1.f, Camera->Blend*Dt); + } + + Camera->Yaw = Lerp(t, Camera->Yaw, Camera->TargetYaw); + Camera->Pitch = Lerp(t, Camera->Pitch, Camera->TargetPitch); + + /* Camera->DistanceFromTarget += MouseDelta.y*Camera->DistanceFromTarget; */ + Camera->TargetDistanceFromTarget += CameraZoomDelta * Camera->DistanceFromTarget; + + Camera->DistanceFromTarget = Lerp(t, Camera->DistanceFromTarget, Camera->TargetDistanceFromTarget); + + Camera->DistanceFromTarget = ClampMin(Camera->DistanceFromTarget, Camera->Frust.nearClip); + Camera->DistanceFromTarget = ClampMax(Camera->DistanceFromTarget, Camera->Frust.farClip); + + Camera->TargetDistanceFromTarget = ClampMin(Camera->TargetDistanceFromTarget, Camera->Frust.nearClip); + Camera->TargetDistanceFromTarget = ClampMax(Camera->TargetDistanceFromTarget, Camera->Frust.farClip); + + // TODO(Jesse): Remove? if (Camera->DistanceFromTarget < 0.1f) { Camera->DistanceFromTarget = 0.1f; } if (Camera->TargetDistanceFromTarget < 0.1f) { Camera->TargetDistanceFromTarget = 0.1f; } @@ -21,19 +65,31 @@ UpdateCameraP(world *World, cp TargetViewP, camera *Camera) Camera->RenderSpacePosition = GetRenderP(World->ChunkDim, Camera->CurrentP, Camera); + m4 View = ViewMatrix(World->ChunkDim, Camera); + m4 Proj = ProjectionMatrix(Camera, ScreenDim); + + Camera->ViewProjection = Proj * View; + Camera->InverseViewMatrix = Inverse(View); + Camera->InverseProjectionMatrix = Inverse(Proj); + + + + #if 1 // // Frustum computation // - v3 FrustLength = V3(0.0f, 0.0f, Camera->Frust.farClip); - v3 FarHeight = ( V3( 0.0f, ((Camera->Frust.farClip - Camera->Frust.nearClip)/Cos(Camera->Frust.FOV/2.0f)) * Sin(Camera->Frust.FOV/2.0f), 0.0f)); - v3 FarWidth = V3( FarHeight.y, 0.0f, 0.0f); + /* v3 FrustLength = V3(0.0f, 0.0f, Camera->Frust.farClip); */ + /* v3 FarHeight = ( V3( 0.0f, */ + /* ((Camera->Frust.farClip - Camera->Frust.nearClip)/Cos(Camera->Frust.FOV/2.0f)) * Sin(Camera->Frust.FOV/2.0f), */ + /* 0.0f)); */ + /* v3 FarWidth = V3( FarHeight.y, 0.0f, 0.0f); */ - v3 MaxMax = Normalize(FrustLength + FarHeight + FarWidth); - v3 MaxMin = Normalize(FrustLength + FarHeight - FarWidth); - v3 MinMax = Normalize(FrustLength - FarHeight + FarWidth); - v3 MinMin = Normalize(FrustLength - FarHeight - FarWidth); + /* v3 MaxMax = Normalize(FrustLength + FarHeight + FarWidth); */ + /* v3 MaxMin = Normalize(FrustLength + FarHeight - FarWidth); */ + /* v3 MinMax = Normalize(FrustLength - FarHeight + FarWidth); */ + /* v3 MinMin = Normalize(FrustLength - FarHeight - FarWidth); */ v3 Front = V3(0,0,1); v3 Target = Camera->Front; @@ -53,10 +109,10 @@ UpdateCameraP(world *World, cp TargetViewP, camera *Camera) /* MinMin = Normalize(Rotate(MinMin, GrossRotation)); */ /* MinMax = Normalize(Rotate(MinMax, GrossRotation)); */ - MaxMin = Normalize(Rotate(MaxMin, FinalRotation)); - MaxMax = Normalize(Rotate(MaxMax, FinalRotation)); - MinMin = Normalize(Rotate(MinMin, FinalRotation)); - MinMax = Normalize(Rotate(MinMax, FinalRotation)); + /* MaxMin = Normalize(Rotate(MaxMin, FinalRotation)); */ + /* MaxMax = Normalize(Rotate(MaxMax, FinalRotation)); */ + /* MinMin = Normalize(Rotate(MinMin, FinalRotation)); */ + /* MinMax = Normalize(Rotate(MinMax, FinalRotation)); */ #if DEBUG_DRAW_FRUSTUM_AT_ORIGIN { @@ -72,15 +128,35 @@ UpdateCameraP(world *World, cp TargetViewP, camera *Camera) v3 CameraSimP = GetSimSpaceP(World, Camera->CurrentP); - plane Top(CameraSimP, Normalize(Cross(MaxMax, MaxMin))); - plane Bot(CameraSimP, Normalize(Cross(MinMin, MinMax))); - plane Left(CameraSimP, Normalize(Cross(MinMax, MaxMax))); - plane Right(CameraSimP, Normalize(Cross(MaxMin, MinMin))); +#if 0 + plane Top = Plane(CameraSimP, Normalize(Cross(MaxMax, MaxMin))); + plane Bot = Plane(CameraSimP, Normalize(Cross(MinMin, MinMax))); + plane Left = Plane(CameraSimP, Normalize(Cross(MinMax, MaxMax))); + plane Right = Plane(CameraSimP, Normalize(Cross(MaxMin, MinMin))); Camera->Frust.Top = Top; Camera->Frust.Bot = Bot; Camera->Frust.Left = Left; Camera->Frust.Right = Right; +#else + auto zNear = Camera->Frust.nearClip; + auto zFar = Camera->Frust.farClip; + auto fovY = Camera->Frust.FOV; + auto aspect = ScreenDim.x/ScreenDim.y; + + f32 halfVSide = zFar * Tan(Rads(fovY*0.5f)); + f32 halfHSide = halfVSide * aspect; + v3 frontMultFar = zFar * Camera->Front; + + auto SimP = GetSimSpaceP(World, Camera->CurrentP); + + /* Camera->Frust.Near = Plane( Camera->RenderSpacePosition + zNear * Camera->Front, Camera->Front ); */ + /* Camera->Frust.Far = Plane( Camera->RenderSpacePosition + frontMultFar, -1.f*Camera->Front ); */ + Camera->Frust.Right = Plane( SimP, Normalize(Cross(frontMultFar - Camera->Right * halfHSide, Camera->Up)) ); + Camera->Frust.Left = Plane( SimP, Normalize(Cross(Camera->Up,frontMultFar + Camera->Right * halfHSide)) ); + Camera->Frust.Top = Plane( SimP, Normalize(Cross(Camera->Right, frontMultFar - Camera->Up * halfVSide)) ); + Camera->Frust.Bottom = Plane( SimP, Normalize(Cross(frontMultFar + Camera->Up * halfVSide, Camera->Right)) ); +#endif #endif @@ -92,52 +168,13 @@ UpdateCameraP(world *World, cp TargetViewP, camera *Camera) return; } -link_inline v2 -GetMouseDelta(platform *Plat) -{ - r32 DPToWorldModifier = -0.001f; - v2 Result = Plat->MouseDP * DPToWorldModifier; - return Result; -} - -link_internal void -UpdateGameCamera( world *World, - v2 MouseDelta, - r32 CameraZoomDelta, - cp TargetViewP, - camera *Camera, - r32 Dt ) -{ - // TODO(Jesse): Make these vary by DistanceFromTarget, such that the mouse feels the same amount of sensitive zoomed in as out. - Camera->TargetYaw += MouseDelta.x; - Camera->TargetPitch += MouseDelta.y; - Camera->TargetPitch = ClampBetween(0.0, Camera->TargetPitch, PI32); - - r32 t = 1.f; - if (Camera->Blend > 0.f && Dt > 0.f) - { - t = Min(1.f, Camera->Blend*Dt); - } - - Camera->Yaw = Lerp(t, Camera->Yaw, Camera->TargetYaw); - Camera->Pitch = Lerp(t, Camera->Pitch, Camera->TargetPitch); - - /* Camera->DistanceFromTarget += MouseDelta.y*Camera->DistanceFromTarget; */ - Camera->TargetDistanceFromTarget += CameraZoomDelta * Camera->DistanceFromTarget; - - Camera->DistanceFromTarget = Lerp(t, Camera->DistanceFromTarget, Camera->TargetDistanceFromTarget); - Camera->DistanceFromTarget = ClampMin(Camera->DistanceFromTarget, Camera->Frust.nearClip); - Camera->DistanceFromTarget = ClampMax(Camera->DistanceFromTarget, Camera->Frust.farClip); - - UpdateCameraP(World, TargetViewP, Camera); -} - link_internal void SetCameraTarget(v3 Target, camera *Camera) { - world *World = GetWorld(); - UpdateGameCamera(World, {}, {}, Canonical_Position(World->ChunkDim, Target, {}), Camera, 0.33f); + engine_resources *Engine = GetEngineResources(); + world *World = Engine->World; + UpdateGameCamera(World, Engine->Stdlib.Plat.ScreenDim, {}, {}, Canonical_Position(World->ChunkDim, Target, {}), Camera, 0.33f); } link_internal void @@ -150,6 +187,8 @@ UpdateGameCamera( world *World, b32 DoPositionDelta, b32 DoZoomDelta ) { + engine_resources *Engine = GetEngineResources(); + v2 UpdateMouseDelta = {}; f32 CameraZoomDelta = {}; if (Input) // TODO(Jesse): Assert here ..? @@ -167,7 +206,7 @@ UpdateGameCamera( world *World, } - UpdateGameCamera(World, UpdateMouseDelta, CameraZoomDelta, NewTarget, Camera, Dt); + UpdateGameCamera(World, Engine->Stdlib.Plat.ScreenDim, UpdateMouseDelta, CameraZoomDelta, NewTarget, Camera, Dt); } link_internal void @@ -180,7 +219,6 @@ StandardCamera(camera* Camera, f32 FarClip, f32 DistanceFromTarget, f32 Blend) Camera->Frust.farClip = FarClip; Camera->Frust.nearClip = 0.5f; - Camera->Frust.width = 30.0f; // Someone already set FOV .. probably when deserializing stored runtime settings. if (Camera->Frust.FOV == 0.f) @@ -208,17 +246,10 @@ IsInFrustum(world *World, camera *Camera, canonical_position P) v3 TestP = GetSimSpaceP(World, P); - // This says if we're on the back-side of the plane by more than the dim of a - // world chunk, we're outside the frustum - /* Result &= (DistanceToPlane(&Camera->Frust.Top, TestP) < -1*World->ChunkDim.y); */ - /* Result &= (DistanceToPlane(&Camera->Frust.Bot, TestP) < -1*World->ChunkDim.y); */ - /* Result &= (DistanceToPlane(&Camera->Frust.Left, TestP) < -1*World->ChunkDim.x); */ - /* Result &= (DistanceToPlane(&Camera->Frust.Right, TestP) < -1*World->ChunkDim.x); */ - - Result &= (DistanceToPlane(&Camera->Frust.Top, TestP) > 0); - Result &= (DistanceToPlane(&Camera->Frust.Bot, TestP) > 0); - Result &= (DistanceToPlane(&Camera->Frust.Left, TestP) > 0); - Result &= (DistanceToPlane(&Camera->Frust.Right, TestP) > 0); + Result &= (DistanceToPlane(&Camera->Frust.Top, TestP) > 0.f); + Result &= (DistanceToPlane(&Camera->Frust.Bottom, TestP) > 0.f); + Result &= (DistanceToPlane(&Camera->Frust.Left, TestP) > 0.f); + Result &= (DistanceToPlane(&Camera->Frust.Right, TestP) > 0.f); return Result; } @@ -236,8 +267,17 @@ link_internal bool IsInFrustum( world *World, camera *Camera, world_chunk *Chunk ) { v3 ChunkMid = (Chunk->DimInChunks*World->ChunkDim)/2.f; - cp P1 = Canonical_Position(ChunkMid, Chunk->WorldP ); - bool Result = IsInFrustum(World, Camera, P1); + + Assert(Chunk->Dim == V3i(64)); + r32 ChunkRadius = Length(Chunk->Dim*Chunk->DimInChunks)/2.f; + + v3 TestP = GetSimSpaceP(World, Chunk); + + b32 Result = (DistanceToPlane(&Camera->Frust.Top, TestP) < ChunkRadius); + Result &= (DistanceToPlane(&Camera->Frust.Bottom, TestP) < ChunkRadius); + Result &= (DistanceToPlane(&Camera->Frust.Left, TestP) < ChunkRadius); + Result &= (DistanceToPlane(&Camera->Frust.Right, TestP) < ChunkRadius); + return Result; } @@ -262,7 +302,7 @@ Unproject(v2 ScreenP, r32 ClipZDepth, v2 ScreenDim, m4 *InvViewProj) // // NOTE(Jesse): Returns a sim-space ray link_internal maybe_ray -ComputeCameraSpaceRayFromCursor(engine_resources *Engine, m4* ViewProjection, camera *Camera, v3i WorldChunkDim) +ComputeCameraSpaceRayFromCursor(engine_resources *Engine, camera *Camera, v3i WorldChunkDim) { platform *Plat = &Engine->Stdlib.Plat; world *World = Engine->World; @@ -270,17 +310,17 @@ ComputeCameraSpaceRayFromCursor(engine_resources *Engine, m4* ViewProjection, ca maybe_ray Result = {}; m4 InverseViewProjection; - if (Inverse(Cast(r32*, ViewProjection), Cast(r32*, &InverseViewProjection))) + if (Inverse(&Camera->ViewProjection.E[0][0], &InverseViewProjection.E[0][0])) { v3 MouseMinWorldP = Unproject( Plat->MouseP, 0.0f, Plat->ScreenDim, - &InverseViewProjection); + &InverseViewProjection); v3 MouseMaxWorldP = Unproject( Plat->MouseP, 1.0f, Plat->ScreenDim, - &InverseViewProjection); + &InverseViewProjection); v3 RayDirection = Normalize(MouseMaxWorldP - MouseMinWorldP); diff --git a/src/engine/camera.h b/src/engine/camera.h index 47bf1df12..aa789ea40 100644 --- a/src/engine/camera.h +++ b/src/engine/camera.h @@ -1,31 +1,24 @@ struct plane { - v3 P; v3 Normal; - r32 d; - - plane( v3 P_in, v3 Normal_in ) - { - this->P = P_in; - this->Normal = Normal_in; - - this->d = -1.0f * (Normal.x*P.x + Normal.y*P.y + Normal.z*P.z); - - Assert(Normal.x*P.x + Normal.y*P.y + Normal.z*P.z + this->d == 0); - } - - plane() { Clear(this); } + f32 DistanceToOrigin; }; +link_internal plane +Plane( v3 Point, v3 Normal ) +{ + plane Reuslt = { Normal, Dot(Normal, Point) }; + return Reuslt; +} + struct frustum { f32 farClip; f32 nearClip; - f32 width; f32 FOV; plane Top; - plane Bot; + plane Bottom; plane Left; plane Right; }; @@ -58,6 +51,10 @@ struct camera poof(@version(2)) v3 Up; entity_id GhostId; + + m4 ViewProjection; + m4 InverseViewMatrix; + m4 InverseProjectionMatrix; }; struct camera_1 @@ -137,6 +134,9 @@ GetCameraRelativeInput(hotkeys *Hotkeys, camera *Camera) inline r32 DistanceToPlane(plane *Plane, v3 P) { + // https://learnopengl.com/Guest-Articles/2021/Scene/Frustum-Culling + r32 Result = Dot(Plane->Normal, P) - Plane->DistanceToOrigin; +#if 0 r32 x = Plane->P.x; r32 y = Plane->P.y; r32 z = Plane->P.z; @@ -148,8 +148,9 @@ DistanceToPlane(plane *Plane, v3 P) r32 d = Plane->d; Assert(a*x + b*y + c*z + d == 0); - r32 Distance = a*P.x + b*P.y + c*P.z + d; - return Distance; + r32 Result = a*P.x + b*P.y + c*P.z + d; +#endif + return Result; } link_internal v3 diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index b1cae3dd3..b2f004dd0 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -871,7 +871,7 @@ InteractWithThumbnailTexture(engine_resources *Engine, renderer_2d *Ui, window_l if (Ui->Input->LMB.Pressed) { MouseDP = MouseDelta*2.f; } if (Ui->Input->RMB.Pressed) { CameraZDelta += MouseDelta.y*2.f; } } - UpdateGameCamera(GetWorld(), MouseDP, CameraZDelta, {}, ThumbCamera, 0.f); + UpdateGameCamera(GetWorld(), Engine->Stdlib.Plat.ScreenDim, MouseDP, CameraZDelta, {}, ThumbCamera, 0.f); /* if (Ui->Input->LMB.Pressed == False && Hover(Ui, &B)) { PushTooltip(Ui, ToString(Texture)); } */ diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 209ea70f2..f557f2587 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -174,7 +174,7 @@ poof(block_array(dummy_work_queue_entry_build_chunk_mesh, {32})) struct graphics { - b32 Initialized; + bonsai_futex Initialized; volatile b32 RenderGate; diff --git a/src/engine/render.cpp b/src/engine/render.cpp index 00683c283..a22388551 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -736,10 +736,10 @@ DrawFrustum(world *World, graphics *Graphics, camera *Camera) auto Dest = ReserveBufferSpace(GpuBuffer, VERTS_PER_LINE*4); v3 SimSpaceP = GetSimSpaceP(World, Camera->CurrentP); - DEBUG_DrawLine(&Dest, line(SimSpaceP+Camera->Front*200.f, Camera->Frust.Top.Normal*5.f), RGB_RED, 0.2f ); - DEBUG_DrawLine(&Dest, line(SimSpaceP+Camera->Front*200.f, Camera->Frust.Bot.Normal*5.f), RGB_BLUE, 0.2f ); - DEBUG_DrawLine(&Dest, line(SimSpaceP+Camera->Front*200.f, Camera->Frust.Left.Normal*5.f), RGB_GREEN, 0.2f ); - DEBUG_DrawLine(&Dest, line(SimSpaceP+Camera->Front*200.f, Camera->Frust.Right.Normal*5.f), RGB_YELLOW, 0.2f ); + DEBUG_DrawLine(&Dest, line(SimSpaceP+Camera->Front*200.f, Camera->Frust.Top.Normal*5.f), RGB_RED, 0.2f ); + DEBUG_DrawLine(&Dest, line(SimSpaceP+Camera->Front*200.f, Camera->Frust.Bottom.Normal*5.f), RGB_BLUE, 0.2f ); + DEBUG_DrawLine(&Dest, line(SimSpaceP+Camera->Front*200.f, Camera->Frust.Left.Normal*5.f), RGB_GREEN, 0.2f ); + DEBUG_DrawLine(&Dest, line(SimSpaceP+Camera->Front*200.f, Camera->Frust.Right.Normal*5.f), RGB_YELLOW, 0.2f ); } link_internal void diff --git a/src/engine/render.h b/src/engine/render.h index 7907bdadf..09f9a22c8 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -41,7 +41,6 @@ struct g_buffer_render_group m4 InverseViewMatrix; m4 InverseProjectionMatrix; - m4 ViewProjection; u32 GlTimerObject; @@ -198,6 +197,7 @@ ProjectionMatrix(camera *Camera, v2 ScreenDim) ScreenDim, Camera->Frust.nearClip, Camera->Frust.farClip); + return Result; } diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index bc17604f5..2d8cfce22 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -293,15 +293,14 @@ CreateGbufferShader(shader *Shader, graphics *Graphics, memory_arena *GraphicsMe } link_internal b32 -MakeSsaoShader( - shader *Shader, - memory_arena *GraphicsMemory, - g_buffer_textures *gTextures, - texture *SsaoNoiseTexture, - v3 *SsaoNoiseTile, - m4 *InverseViewMatrix, - m4 *InverseProjectionMatrix, - m4 *ViewProjection ) +MakeSsaoShader( shader *Shader, + memory_arena *GraphicsMemory, + g_buffer_textures *gTextures, + texture *SsaoNoiseTexture, + v3 *SsaoNoiseTile, + m4 *InverseViewMatrix, + m4 *InverseProjectionMatrix, + m4 *ViewProjection ) { b32 Result = CompileShaderPair(Shader, CSz(STDLIB_SHADER_PATH "Passthrough.vertexshader"), CSz(BONSAI_SHADER_PATH "Ao.fragmentshader") ); @@ -504,7 +503,7 @@ DefaultRenderSettings(render_settings *Settings, engine_settings *EngineSettings link_internal b32 GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *GraphicsMemory) { - Assert(Result->Initialized == False); + Assert(FutexIsSignaled(&Result->Initialized) == False); shadow_render_group *SG = Allocate(shadow_render_group, GraphicsMemory, 1); @@ -651,7 +650,15 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr } - Ensure(CreateGbufferShader(&gBuffer->gBufferShader, Result, GraphicsMemory, &Result->MinClipP_worldspace, &Result->MaxClipP_worldspace, &gBuffer->ViewProjection, Result->Camera, &Result->ColorPaletteTexture)); + Ensure( + CreateGbufferShader(&gBuffer->gBufferShader, + Result, + GraphicsMemory, + &Result->MinClipP_worldspace, + &Result->MaxClipP_worldspace, + &gBuffer->ViewProjection, + Result->Camera, + &Result->ColorPaletteTexture)); MakeSsaoShader(&AoGroup->Shader, GraphicsMemory, diff --git a/src/engine/render_command.h b/src/engine/render_command.h index e98a3c62f..939f1ecfb 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -217,6 +217,9 @@ poof( ) #include +poof(string_and_value_tables(work_queue_entry__bonsai_render_command_type)) +#include + poof(d_union_all_constructors(work_queue_entry__bonsai_render_command)) #include diff --git a/src/engine/render_loop.cpp b/src/engine/render_loop.cpp index 662e9e3bf..12833bb93 100644 --- a/src/engine/render_loop.cpp +++ b/src/engine/render_loop.cpp @@ -2,11 +2,15 @@ link_export void DrainRenderQueue(engine_resources *Engine) { UNPACK_ENGINE_RESOURCES(Engine); + Assert(EntityTable); AssertNoGlErrors; + /* RenderInfo("DrainRenderQueue"); */ + while (work_queue_entry *Job = PopWorkQueueEntry(RenderQ)) { + /* RenderInfo("%S", ToString(Job->Type)); */ /* TIMED_NAMED_BLOCK(RENDER_LOOP); */ tswitch(Job) { @@ -26,11 +30,13 @@ DrainRenderQueue(engine_resources *Engine) } break; { tmatch(work_queue_entry_async_function_call, Job, RPC) + /* RenderInfo("%S", ToString(RPC->Type)); */ TIMED_NAMED_BLOCK(work_queue_entry_async_function_call); DispatchAsyncFunctionCall(RPC); } break; { tmatch(work_queue_entry__bonsai_render_command, Job, RenderCommand) + /* RenderInfo("%S", ToString(RenderCommand->Type)); */ tswitch(RenderCommand) { InvalidCase(type_work_queue_entry__bonsai_render_command_noop); @@ -910,10 +916,13 @@ RenderThread_Main(void *ThreadStartupParams) MapGpuBuffer(&Ui->TextGroup->Buf); FullBarrier; - Engine->Graphics.Initialized = True; + SignalFutex(&Engine->Graphics.Initialized); if (InitResult) { + // Wait for main thread to complete initialization + while (FutexIsSignaled(&Engine->ReadyToStartMainLoop) == False) { SleepMs(1); }; + bonsai_futex *WorkerThreadsExitFutex = &Plat->WorkerThreadsExitFutex; while ( FutexNotSignaled(WorkerThreadsExitFutex) ) { diff --git a/src/engine/resources.h b/src/engine/resources.h index 37d1550b2..1e75ff690 100644 --- a/src/engine/resources.h +++ b/src/engine/resources.h @@ -35,6 +35,8 @@ struct asset_system struct engine_resources { + bonsai_futex ReadyToStartMainLoop; + bonsai_stdlib Stdlib; engine_api EngineApi; diff --git a/src/engine/serdes.cpp b/src/engine/serdes.cpp index 48d3b5c30..39be84072 100644 --- a/src/engine/serdes.cpp +++ b/src/engine/serdes.cpp @@ -24,6 +24,9 @@ poof(serdes_cursor(v3)) poof(serdes_struct(canonical_position)) #include +poof(serdes_struct(m4)) +#include + poof(serdes_struct(plane)) #include diff --git a/src/engine/work_queue.h b/src/engine/work_queue.h index 93a1e9574..1fecbd2ef 100644 --- a/src/engine/work_queue.h +++ b/src/engine/work_queue.h @@ -201,6 +201,9 @@ struct work_queue_entry_async_function_call }; }; +poof(string_and_value_tables(async_function_call_type)) +#include + poof( @@ -231,6 +234,9 @@ poof( ) #include +poof(string_and_value_tables(work_queue_entry_type)) +#include + // nocheckin // TODO(Jesse): Turn this on /* CAssert(sizeof(work_queue_entry) % CACHE_LINE_SIZE == 0); */ diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 88c86de9d..9b24a67a3 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -2829,7 +2829,7 @@ BigBits2015_BestFittingPlaneFor(boundary_voxels* BoundingPoints) InvalidCodePath(); } - Result.Plane = plane(Centroid, Normal); + Result.Plane = Plane(Centroid, Normal); Result.Complete = True; } } diff --git a/src/game_loader.cpp b/src/game_loader.cpp index 270d8d31d..c053b2fdd 100644 --- a/src/game_loader.cpp +++ b/src/game_loader.cpp @@ -166,9 +166,7 @@ main( s32 ArgCount, const char ** Args ) EngineResources, &CustomWorkerProcs )); - while (EngineResources->Graphics.Initialized == False) { SleepMs(1); } - - /* EngineResources->DebugState = Global_DebugStatePointer; */ + while (FutexIsSignaled(&EngineResources->Graphics.Initialized) == False) { SleepMs(1); } Assert(EngineResources->Stdlib.ThreadStates); @@ -194,16 +192,13 @@ main( s32 ArgCount, const char ** Args ) if (GameApi->GameInit) { -#if PLATFORM_WINDOW_IMPLEMENTATIONS - // Block till RenderMain is initialized in case game wants to do rendering things in init..? - // TODO(Jesse): Is there any reason to actually do this? - while (EngineResources->Graphics.Initialized == False) { SleepMs(1); } -#endif EngineResources->GameState = GameApi->GameInit(EngineResources, MainThread); if (!EngineResources->GameState) { Error("Initializing Game :( "); return 1; } } + SignalFutex(&EngineResources->ReadyToStartMainLoop); + /* * Main Game loop */ From 40c12df84b0e87ef51aae3c9585996bbdffd23ef Mon Sep 17 00:00:00 2001 From: a pirate Date: Tue, 28 Oct 2025 19:29:34 -0700 Subject: [PATCH 371/421] Minor bugfix and optimization in FinalizeOccupancyMasksFromNoiseValues --- src/engine/world_chunk.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 9b24a67a3..69d68c63b 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -4813,7 +4813,6 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No TIMED_FUNCTION(); /* HISTOGRAM_FUNCTION(); */ u32 ChunkSum = 0; - TIMED_NAMED_BLOCK(NoiseFinalize); { TIMED_NAMED_BLOCK(NoiseFinalize0); @@ -4822,34 +4821,35 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No for ( s32 yChunk = 0; yChunk < Chunk->Dim.y; ++ yChunk) { u64 Mask = 0; + +#pragma unroll(2) for ( s32 xChunk = 0; xChunk < Chunk->Dim.x; ++ xChunk) { - Assert(xChunk < 64); + /* Assert(xChunk < 64); */ - v3i ChunkP = V3i(xChunk, yChunk, zChunk); v3i NoiseP = V3i(xChunk+1, yChunk, zChunk); - - s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); s32 NoiseIndex = GetIndex(NoiseP, NoiseDim); u32 ThisNoiseV = NoiseValues[NoiseIndex]; u64 NoiseChoice = (ThisNoiseV >> 31); - Assert(NoiseChoice == 1 || NoiseChoice == 0); + /* Assert(NoiseChoice == 1 || NoiseChoice == 0); */ if (NoiseChoice == 1) { - ChunkSum++; - Mask |= (1 << xChunk); + ChunkSum += NoiseChoice; + Mask |= (NoiseChoice << xChunk); + v3i ChunkP = V3i(xChunk, yChunk, zChunk); + s32 ChunkIndex = GetIndex(ChunkP, Chunk->Dim); u32 OccupancyBitMask = ~(1u << 31); Chunk->Voxels[ChunkIndex].Data = ThisNoiseV & OccupancyBitMask; - if (GetEngineDebug()->MarkChunkBorderVoxels) - { - if (xChunk == 0) { Chunk->Voxels[ChunkIndex].RGBColor = PackV3_16b(RGB_RED)*u16(NoiseChoice); } - if (yChunk == 1) { Chunk->Voxels[ChunkIndex].RGBColor = PackV3_16b(RGB_PINK)*u16(NoiseChoice); } - if (zChunk == 1) { Chunk->Voxels[ChunkIndex].RGBColor = PackV3_16b(RGB_BLUE)*u16(NoiseChoice); } - } + /* if (GetEngineDebug()->MarkChunkBorderVoxels) */ + /* { */ + /* if (xChunk == 0) { Chunk->Voxels[ChunkIndex].RGBColor = PackV3_16b(RGB_RED)*u16(NoiseChoice); } */ + /* if (yChunk == 1) { Chunk->Voxels[ChunkIndex].RGBColor = PackV3_16b(RGB_PINK)*u16(NoiseChoice); } */ + /* if (zChunk == 1) { Chunk->Voxels[ChunkIndex].RGBColor = PackV3_16b(RGB_BLUE)*u16(NoiseChoice); } */ + /* } */ } } From ebccb0bbdf6ba0a29fa031866daf8fd8e1459fab Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 29 Oct 2025 08:34:14 -0700 Subject: [PATCH 372/421] Hunting for bug in LoD'd normals --- examples/terrain_gen/game.cpp | 2 +- external/bonsai_stdlib | 2 +- ...nctions_untextured_3d_geometry_buffer_v3.h | 19 ++++--- ...ions_untextured_3d_geometry_buffer_v3_u8.h | 19 ++++--- jesse.make.sh | 2 +- shaders/Lighting.fragmentshader | 2 +- shaders/gBuffer.vertexshader | 2 +- .../terrain/TerrainFinalize.fragmentshader | 4 +- .../shaping/7_steep_ravines.fragmentshader | 51 +++++++++++-------- .../terrain/shaping/default.fragmentshader | 2 +- src/engine/camera.cpp | 7 ++- src/engine/entity.cpp | 2 +- src/engine/render.h | 2 +- src/engine/world_chunk.cpp | 19 ++++--- 14 files changed, 83 insertions(+), 52 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index c0c52f6df..7fad9215b 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -24,7 +24,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* auto VisibleRegionSize = VisibleRegionSize_8192; */ v3i VisibleRegion = V3i(VisibleRegionSize); f32 DistanceFromTarget = 5000.f; - f32 FarClip = 500000.f; + f32 FarClip = 1000000.f; StandardCamera(Graphics->Camera, FarClip, DistanceFromTarget); AllocateWorld(World, WorldCenter, WORLD_CHUNK_DIM, VisibleRegionSize); diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 5abcdae17..09a3233de 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 5abcdae17cb19775915fd001fc2fab90b3c09847 +Subproject commit 09a3233de0df4c39f3c70e26fab059fbd62ae170 diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h index 1a3d67834..8799d256f 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3.h @@ -51,8 +51,10 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, v3 P = V3(s32(xOffset), y, z); u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_LeftFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -74,7 +76,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_RightFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -96,7 +99,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_FrontFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -118,7 +122,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_BackFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -140,7 +145,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_TopFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -162,7 +168,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3( voxel *Voxels, u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_BottomFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); diff --git a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h index ef04e0bbf..e09ceb4db 100644 --- a/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h +++ b/generated/world_chunk_mesh_functions_untextured_3d_geometry_buffer_v3_u8.h @@ -51,8 +51,10 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, v3 P = V3(s32(xOffset), y, z); u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_LeftFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -74,7 +76,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_RightFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -96,7 +99,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_FrontFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -118,7 +122,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_BackFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -140,7 +145,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_TopFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -162,7 +168,8 @@ BuildWorldChunkMeshFromMarkedVoxels_Naieve_v3_u8( voxel *Voxels, u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_BottomFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); diff --git a/jesse.make.sh b/jesse.make.sh index 687048d17..c4b277014 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -OPT="-O2" +# OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/shaders/Lighting.fragmentshader b/shaders/Lighting.fragmentshader index faa48bdf8..960cdcae9 100644 --- a/shaders/Lighting.fragmentshader +++ b/shaders/Lighting.fragmentshader @@ -149,8 +149,8 @@ void main() /* Diffuse *= Emission; */ + /* vec3 FragNormal = gColorTexel.rgb; */ vec3 FragNormal = texelFetch(gNormal, texelCoord, 0).rgb; - /* vec3 FragNormal = texture(gNormal, gBufferUV).rgb; */ vec3 ShadowVisibility = vec3(1.0f); diff --git a/shaders/gBuffer.vertexshader b/shaders/gBuffer.vertexshader index 4061a9148..546879bfe 100644 --- a/shaders/gBuffer.vertexshader +++ b/shaders/gBuffer.vertexshader @@ -35,7 +35,7 @@ void main() int Emission = in_TransEmiss.y; /* MaterialColor = texelFetch(ColorPalette, ivec2(ColorIndex, 0), 0).rgb; */ - MaterialColor = UnpackHSVColor(int(ColorIndex)); + MaterialColor = UnpackV3_15b(int(ColorIndex)); /* MaterialColor = texelFetch(ColorPalette, ivec2(5, 0), 0).rgb; */ /* MaterialColor = V3(1,0,1); */ TransEmiss = V2(float(Transparency)/255.f, float(Emission)/(255.f/RENDERER_MAX_LIGHT_EMISSION_VALUE)); diff --git a/shaders/terrain/TerrainFinalize.fragmentshader b/shaders/terrain/TerrainFinalize.fragmentshader index 4ec3e490f..5e318ac15 100644 --- a/shaders/terrain/TerrainFinalize.fragmentshader +++ b/shaders/terrain/TerrainFinalize.fragmentshader @@ -14,11 +14,11 @@ void main() uint SolidBit = NoiseValue > 0.f ? 1u : 0u; - ivec2 InputTexDim = ivec2(66); ivec2 OutputTexDim = ivec2(66); - v3 Normal = abs(ComputeNormal(InputTex, gl_FragCoord.xy, InputTexDim, OutputTexDim, 1.f)); + v3 Normal = ComputeNormal(InputTex, gl_FragCoord.xy, InputTexDim, OutputTexDim, 1.f); + /* v3 Normal = Normalize(V3(1,1,0)); */ /* uint PackedNormal = PackRGB(Normalize(V3(1,1,1))); */ uint PackedNormal = PackRGB(Normal); diff --git a/shaders/terrain/shaping/7_steep_ravines.fragmentshader b/shaders/terrain/shaping/7_steep_ravines.fragmentshader index a23de3bc6..61179b09a 100644 --- a/shaders/terrain/shaping/7_steep_ravines.fragmentshader +++ b/shaders/terrain/shaping/7_steep_ravines.fragmentshader @@ -27,9 +27,8 @@ void main() v3 Period = V3(800.f); float Amplitude = 800.f; /* f32 StartingZDepth = 10000; */ - f32 StartingZDepth = 1000; + f32 StartingZDepth = 15000; /* f32 StartingZDepth = 0; */ - s32 Octaves = 2; NoiseValue = StartingZDepth; v3 Deriv = v3(0.f); @@ -39,27 +38,39 @@ void main() v3 warp = v3(0.f); { - v3 xyz = Basis / (15000.f); + v3 xyz = Basis / (12000.f); /* v3 N = voronoi_noise(xyz+warp); */ - v4 N = gradient_noise_derivs(xyz+warp); - NoiseValue += RemapSample((N.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount ) * 10000.f; - /* NoiseValue += N.x * 20000.f; */ + f32 Mask = (gradient_noise_derivs(Basis/20000.f).x+1.f)/2.f; + /* Mask = RemapSample(Mask, SampleRemapCurvePoints, SampleRemapCurvePointCount ); */ + f32 N = ridge_noise(xyz+warp)*Mask; + /* NoiseValue += RemapSample((N+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount ) * 10000.f; */ + NoiseValue += N * 20000.f; } - { - v3 xyz = Basis / (Period); - v4 N = gradient_noise_derivs(xyz+warp); - NoiseValue += RemapSample((N.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount ) * Amplitude; - } - - for (s32 Octave = 2; Octave <= Octaves; ++Octave) - { - v3 xyz = Basis / (Period/Octave); - v4 N = gradient_noise_derivs(xyz+warp); - - NoiseValue += ((N.x+1.f)/2.f) * Amplitude/Octave; - /* NoiseValue += RemapSample((N.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount )*(Amplitude/Octave); */ - } + /* { */ + /* v3 xyz = Basis / (15000.f); */ + /* /1* v3 N = voronoi_noise(xyz+warp); *1/ */ + /* v4 N = gradient_noise_derivs(xyz+warp); */ + /* NoiseValue += RemapSample((N.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount ) * 10000.f; */ + /* /1* NoiseValue += N.x * 20000.f; *1/ */ + /* } */ + + /* { */ + /* v3 xyz = Basis / (Period); */ + /* v4 N = gradient_noise_derivs(xyz+warp); */ + /* NoiseValue += RemapSample((N.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount ) * Amplitude; */ + /* } */ + + /* s32 Octaves = 4; */ + /* f32 B = 0.f; */ + /* for (s32 Octave = 1; Octave <= Octaves; ++Octave) */ + /* { */ + /* v3 xyz = Basis / (Period/Octave); */ + /* f32 N = billow_noise(xyz+warp); */ + /* B = max(N, B); */ + /* /1* NoiseValue += RemapSample((N.x+1.f)/2.f, SampleRemapCurvePoints, SampleRemapCurvePointCount )*(Amplitude/Octave); *1/ */ + /* } */ + /* NoiseValue += B * Amplitude; */ v3 Up = V3(0, 0, 1); diff --git a/shaders/terrain/shaping/default.fragmentshader b/shaders/terrain/shaping/default.fragmentshader index e22f19a66..5f25a4d1c 100644 --- a/shaders/terrain/shaping/default.fragmentshader +++ b/shaders/terrain/shaping/default.fragmentshader @@ -19,7 +19,7 @@ void main() // NOTE(Jesse): Set these in the -- user code -- section - v3 ColorValue = V3(0.f); + v3 ColorValue = V3(0.1f, 0.8f, 0.1f); f32 NoiseValue = 0.f; // diff --git a/src/engine/camera.cpp b/src/engine/camera.cpp index 608080001..70a7d966d 100644 --- a/src/engine/camera.cpp +++ b/src/engine/camera.cpp @@ -212,13 +212,12 @@ UpdateGameCamera( world *World, link_internal void StandardCamera(camera* Camera, f32 FarClip, f32 DistanceFromTarget, f32 Blend) { - Clear(Camera); *Camera = {}; Camera->Blend = Blend; Camera->Frust.farClip = FarClip; - Camera->Frust.nearClip = 0.5f; + Camera->Frust.nearClip = 0.05f; // Someone already set FOV .. probably when deserializing stored runtime settings. if (Camera->Frust.FOV == 0.f) @@ -313,12 +312,12 @@ ComputeCameraSpaceRayFromCursor(engine_resources *Engine, camera *Camera, v3i Wo if (Inverse(&Camera->ViewProjection.E[0][0], &InverseViewProjection.E[0][0])) { v3 MouseMinWorldP = Unproject( Plat->MouseP, - 0.0f, + 0.1f, Plat->ScreenDim, &InverseViewProjection); v3 MouseMaxWorldP = Unproject( Plat->MouseP, - 1.0f, + 0.5f, Plat->ScreenDim, &InverseViewProjection); diff --git a/src/engine/entity.cpp b/src/engine/entity.cpp index 1000a5004..e9f0983b8 100644 --- a/src/engine/entity.cpp +++ b/src/engine/entity.cpp @@ -1519,7 +1519,7 @@ SimulateEntity(engine_resources *Resources, entity *Entity, r32 dt, v3i VisibleR if (Input->Q.Pressed) { Offset.z -= 1.f; } Offset = Normalize(Offset); - Entity->P.Offset += Offset * Plat->dt * (CameraSpeed*(1.f/GLOBAL_RENDER_SCALE_FACTOR)); + Entity->P.Offset += Offset * Plat->dt * (CameraSpeed); } } diff --git a/src/engine/render.h b/src/engine/render.h index 09f9a22c8..0c98e1ac1 100644 --- a/src/engine/render.h +++ b/src/engine/render.h @@ -1,7 +1,7 @@ struct world_chunk; -#define GLOBAL_RENDER_SCALE_FACTOR (1.00f) +#define GLOBAL_RENDER_SCALE_FACTOR (0.001f) #define DEFAULT_LINE_THICKNESS (0.3f) diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 69d68c63b..567b22257 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -1505,8 +1505,10 @@ poof( v3 P = V3(s32(xOffset), y, z); u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; + u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_LeftFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -1528,7 +1530,8 @@ poof( u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_RightFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -1550,7 +1553,8 @@ poof( u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_FrontFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -1572,7 +1576,8 @@ poof( u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_BackFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -1594,7 +1599,8 @@ poof( u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_TopFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); @@ -1616,7 +1622,8 @@ poof( u16 RGB = Voxels[BaseVoxelOffset+xOffset].RGBColor; u16 PNormal = Voxels[BaseVoxelOffset+xOffset].Normal; - v3 Normal = Normalize(0.25f*v3_BottomFaceNormalData[0] + UnpackV3_15b(PNormal)); + v3 Normal = (UnpackV3_15b(PNormal)); + /* Assert(Length(Normal) > 0.f); */ Assert(BufferHasRoomFor(Dest, VERTS_PER_FACE)); From 5f4912f058688c1d95a8caed9d617084a1e736a9 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 29 Oct 2025 10:13:20 -0700 Subject: [PATCH 373/421] Fix overflow in length computation in frustum intersection test --- generated/for_datatypes_cx51CcgQ.h | 1 + generated/for_datatypes_khY6kwEk.h | 1 + jesse.make.sh | 2 +- settings.init | 4 +- shaders/Lighting.fragmentshader | 2 +- .../terrain/decoration/billow.fragmentshader | 48 +++++++++++++++++++ src/engine/camera.cpp | 36 ++++++++------ src/engine/world.cpp | 4 +- 8 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 shaders/terrain/decoration/billow.fragmentshader diff --git a/generated/for_datatypes_cx51CcgQ.h b/generated/for_datatypes_cx51CcgQ.h index b324c3ee1..3adc539e4 100644 --- a/generated/for_datatypes_cx51CcgQ.h +++ b/generated/for_datatypes_cx51CcgQ.h @@ -683,6 +683,7 @@ + link_internal void diff --git a/generated/for_datatypes_khY6kwEk.h b/generated/for_datatypes_khY6kwEk.h index b619b7662..f6272e536 100644 --- a/generated/for_datatypes_khY6kwEk.h +++ b/generated/for_datatypes_khY6kwEk.h @@ -683,6 +683,7 @@ + struct compile_shader_pair_async_params poof(@async_function_params) diff --git a/jesse.make.sh b/jesse.make.sh index c4b277014..687048d17 100644 --- a/jesse.make.sh +++ b/jesse.make.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -# OPT="-O2" +OPT="-O2" ./make.sh RunPoof [ $? -ne 0 ] && exit 1 diff --git a/settings.init b/settings.init index 143b2d4d1..b03910a45 100644 --- a/settings.init +++ b/settings.init @@ -4,8 +4,8 @@ // // resolution = ResolutionSetting_4096x2160 -// resolution = ResolutionSetting_1920x1080 - resolution = ResolutionSetting_1280x720 + resolution = ResolutionSetting_1920x1080 +// resolution = ResolutionSetting_1280x720 diff --git a/shaders/Lighting.fragmentshader b/shaders/Lighting.fragmentshader index 960cdcae9..8aca067fb 100644 --- a/shaders/Lighting.fragmentshader +++ b/shaders/Lighting.fragmentshader @@ -307,7 +307,7 @@ void main() */ // TODO(Jesse): Can do squared? float DistanceToFrag = distance(Camera, FragWorldP); - float MaxFogDist = 1000000.f; + float MaxFogDist = 1000.f; float FogContrib = clamp( DistanceToFrag / MaxFogDist, 0.f, 1.f); v3 Fog = FogContrib * FogColor * FogPower; diff --git a/shaders/terrain/decoration/billow.fragmentshader b/shaders/terrain/decoration/billow.fragmentshader new file mode 100644 index 000000000..f85602449 --- /dev/null +++ b/shaders/terrain/decoration/billow.fragmentshader @@ -0,0 +1,48 @@ +uniform v2 SampleRemapCurvePoints[16]; +uniform u32 SampleRemapCurvePointCount; + +uniform v3 WorldspaceChunkBasis; +uniform v3 ChunkResolution; + +uniform sampler2D DerivsTex; +uniform sampler2D InputTex; + +in vec2 UV; +out v4 Output; + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 66); + f32 y = floor(gl_FragCoord.y - (z*66)); + + + v3 Offset = V3(0); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); + + ivec2 InputTexCoord = ivec2(gl_FragCoord.x + 1, (y + 1) + (z * 68) + 68 ); + v4 TexLookup = texelFetch(InputTex, InputTexCoord, 0); + v3 Derivs = texelFetch(DerivsTex, ivec2(gl_FragCoord.xy) + ivec2(0, 0), 0).xyz; + + // NOTE(Jesse): Set these in the -- user code -- section + vec3 ColorValue = TexLookup.rgb; + f32 NoiseValue = TexLookup.a; + // + // -- user code -- + // + + { + v3 xyz = Basis/50.f; + f32 Billow = billow_noise(xyz, 5)*15.f; + NoiseValue += Billow; + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; + + /* Output = (SolidBit << 15) | PackedColor; */ +} diff --git a/src/engine/camera.cpp b/src/engine/camera.cpp index 70a7d966d..052d9b27c 100644 --- a/src/engine/camera.cpp +++ b/src/engine/camera.cpp @@ -253,33 +253,39 @@ IsInFrustum(world *World, camera *Camera, canonical_position P) return Result; } -link_internal bool -IsInFrustum( world *World, camera *Camera, octree_node *Chunk ) +link_internal f32 +SignedDistanceToFrustum( camera *Camera, v3 P) { - v3 ChunkMid = (Chunk->Resolution*World->ChunkDim)/2.f; - cp P1 = Canonical_Position(ChunkMid, Chunk->WorldP ); - bool Result = IsInFrustum(World, Camera, P1); + f32 Result = (DistanceToPlane(&Camera->Frust.Top, P)); + Result = Max(Result, DistanceToPlane(&Camera->Frust.Bottom, P)); + Result = Max(Result, DistanceToPlane(&Camera->Frust.Left, P)); + Result = Max(Result, DistanceToPlane(&Camera->Frust.Right, P)); return Result; } link_internal bool IsInFrustum( world *World, camera *Camera, world_chunk *Chunk ) { - v3 ChunkMid = (Chunk->DimInChunks*World->ChunkDim)/2.f; - Assert(Chunk->Dim == V3i(64)); - r32 ChunkRadius = Length(Chunk->Dim*Chunk->DimInChunks)/2.f; - - v3 TestP = GetSimSpaceP(World, Chunk); - - b32 Result = (DistanceToPlane(&Camera->Frust.Top, TestP) < ChunkRadius); - Result &= (DistanceToPlane(&Camera->Frust.Bottom, TestP) < ChunkRadius); - Result &= (DistanceToPlane(&Camera->Frust.Left, TestP) < ChunkRadius); - Result &= (DistanceToPlane(&Camera->Frust.Right, TestP) < ChunkRadius); + v3 Dim = V3(Chunk->Dim)*V3(Chunk->DimInChunks); + r32 Radius = Length(Dim)/2.f; + v3 Center = GetSimSpaceP(World, Chunk) + Radius; + b32 Result = SignedDistanceToFrustum(Camera, Center) < Radius; + /* b32 Result = True; */ + return Result; +} +link_internal bool +IsInFrustum( world *World, camera *Camera, octree_node *Node ) +{ + r32 Radius = Length(V3(64)*V3(Node->Resolution))/2.f; + v3 Center = GetSimSpaceP(World, Node->WorldP) + Radius; + /* b32 Result = SignedDistanceToFrustum(Camera, Center) < Radius; */ + b32 Result = SignedDistanceToFrustum(Camera, Center) < Radius; return Result; } + link_internal v3 Unproject(v2 ScreenP, r32 ClipZDepth, v2 ScreenDim, m4 *InvViewProj) { diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 481a3801e..823430307 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -623,7 +623,7 @@ ComputePriorityIndex(world *World, octree_node *Node, octree_node *Parent, camer // Penalize nodes not in the frustum if (IsInFrustum(World, GameCamera, Node) == False) { - IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, IdealListIndex+15); + IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, IdealListIndex+150); } // Prefer chunks closer to the camera @@ -941,6 +941,8 @@ DrawOctreeRecursive( engine_resources *Engine, case OctreeNodeType_Leaf: { + + if (Node->Dirty && NotSet(Node->Flags, Chunk_Queued)) { PushOctreeNodeToPriorityQueue(World, GameCamera, Queue, Node, Parent); From 67568ad9077b4ed0477f56a040faf289d3b2ba64 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 29 Oct 2025 12:03:13 -0700 Subject: [PATCH 374/421] Rework ComputePriorityIndex --- src/engine/world.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 823430307..4198c400e 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -620,19 +620,22 @@ ComputePriorityIndex(world *World, octree_node *Node, octree_node *Parent, camer { s32 IdealListIndex = RatioToListIndex(2*Node->Resolution.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); - // Penalize nodes not in the frustum - if (IsInFrustum(World, GameCamera, Node) == False) + // Penalize nodes who's parent is not in the frustum + if (Parent) { - IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, IdealListIndex+150); + if (IsInFrustum(World, GameCamera, Parent) == False) + { + /* IdealListIndex = OCTREE_PRIORITY_QUEUE_LIST_COUNT-1; */ + IdealListIndex = Min(OCTREE_PRIORITY_QUEUE_LIST_COUNT-1, IdealListIndex+128); + } } // Prefer chunks closer to the camera - v3 SimP = GetSimSpaceP(World, Node->WorldP); - v3 CameraSimP = GetSimSpaceP(World, GameCamera->CurrentP); - s32 DistanceFactor = RatioToListIndex(Abs(Distance(SimP, CameraSimP)) / 500.f); - - IdealListIndex = Max(0, IdealListIndex-DistanceFactor); + /* v3 SimP = GetSimSpaceP(World, Node->WorldP); */ + /* v3 CameraSimP = GetSimSpaceP(World, GameCamera->CurrentP); */ + /* s32 DistanceFactor = RatioToListIndex(Abs(Distance(SimP, CameraSimP)) / 500.f); */ + /* IdealListIndex = Max(0, IdealListIndex-DistanceFactor); */ // Prefer chunks who have a higher chance of having geometry if (Parent && Parent->Chunk && HasGpuMesh(&Parent->Chunk->Mesh)) From affc02f5aebb54daa1c436beaef00a2e82040607 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 29 Oct 2025 12:33:03 -0700 Subject: [PATCH 375/421] Minor tuning --- examples/terrain_gen/game.cpp | 4 +++- src/engine/world.cpp | 17 +++++------------ src/engine/world.h | 2 +- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 7fad9215b..80bb628f2 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -20,8 +20,9 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() canonical_position CameraTargetP = {}; /* auto VisibleRegionSize = VisibleRegionSize_128; */ - auto VisibleRegionSize = VisibleRegionSize_1024; + /* auto VisibleRegionSize = VisibleRegionSize_1024; */ /* auto VisibleRegionSize = VisibleRegionSize_8192; */ + auto VisibleRegionSize = VisibleRegionSize_64k; v3i VisibleRegion = V3i(VisibleRegionSize); f32 DistanceFromTarget = 5000.f; f32 FarClip = 1000000.f; @@ -45,6 +46,7 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() /* CameraGhost->P.WorldP = WorldCenter; */ /* CameraGhost->P.WorldP = WorldCenter + VisibleRegion/2; */ CameraGhost->P.WorldP = VisibleRegion/2; + CameraGhost->P.WorldP.z = 1000; CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 4198c400e..0ab4027fc 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -550,19 +550,12 @@ ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) { UNPACK_ENGINE_RESOURCES(Engine); - v3i Result = {}; - - if (entity *Ghost = GetEntity(EntityTable, GameCamera->GhostId)) - { - rect3 NodeRect = GetSimSpaceAABB(World, Node); - v3 GhostP = GetSimSpaceP(World, Ghost); - r32 Distance = DistanceToBox(GhostP, NodeRect); - s32 DistanceInChunks = s32(Distance) / s32(World->ChunkDim.x); - - Result = Max(V3i(1), V3i(DistanceInChunks / OCTREE_CHUNKS_PER_RESOLUTION_STEP)); - /* Result = V3i(DistanceInChunks); */ - } + rect3 NodeRect = GetSimSpaceAABB(World, Node); + v3 CameraP = GetSimSpaceP(World, GameCamera->CurrentP); + r32 Distance = DistanceToBox(CameraP, NodeRect); + s32 DistanceInChunks = s32(Distance) / s32(World->ChunkDim.x); + v3i Result = Max(V3i(1), V3i(DistanceInChunks / OCTREE_CHUNKS_PER_RESOLUTION_STEP)); return Result; } link_internal b32 diff --git a/src/engine/world.h b/src/engine/world.h index 925ffce49..3cbadd693 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -103,7 +103,7 @@ struct world octree_node_freelist OctreeNodeFreelist; octree_node_freelist OctreeNodeDeferFreelist; // Chunks that were queued, to be freed later. -#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (72) +#define MAX_OCTREE_NODES_QUEUED_PER_FRAME (64) s32 MaxOctreeNodesToQueuePerFrame = MAX_OCTREE_NODES_QUEUED_PER_FRAME; #undef MAX_OCTREE_NODES_QUEUED_PER_FRAME From 1c7134fa5e45e9a4997b2965c674f05665077b95 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 29 Oct 2025 12:42:12 -0700 Subject: [PATCH 376/421] Fix a bug in "Render Settings" window --- external/bonsai_stdlib | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 26 ------------------- src/engine/debug.cpp | 2 +- 3 files changed, 2 insertions(+), 28 deletions(-) diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 09a3233de..0f2e77594 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 09a3233de0df4c39f3c70e26fab059fbd62ae170 +Subproject commit 0f2e77594393d7c1ba798bcaa77f8ddac72f1f1f diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index 34a054763..378838eba 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -152,32 +152,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name - } - - - { - - - - cs MemberName = CSz("InteractionStackTop"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(u64*, &Element->InteractionStackTop), - MemberName, - ThisHash, - Params - ); - - - - - - - - - PushNewRow(Ui); - } diff --git a/src/engine/debug.cpp b/src/engine/debug.cpp index c402f6297..5547871fd 100644 --- a/src/engine/debug.cpp +++ b/src/engine/debug.cpp @@ -662,7 +662,7 @@ DoEngineDebug(engine_resources *Engine) if (ViewMode & EngineDebugViewMode_RenderSettings) { v2 WindowDim = {{1200.f, 250.f}}; - window_layout *RenderSettingsWindow = GetOrCreateWindow(Ui, "Graphics Settings", WindowLayoutFlag_Align_Right); + window_layout *RenderSettingsWindow = GetOrCreateWindow(Ui, "Graphics Settings", window_layout_flags(WindowLayoutFlag_Default | WindowLayoutFlag_Align_Right)); render_settings *Settings = &Graphics->Settings; PushWindowStart(Ui, RenderSettingsWindow); From 44f1b3c5378761509d9ff5e806ccc8739ec39e70 Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 29 Oct 2025 13:26:49 -0700 Subject: [PATCH 377/421] Make OCTREE_CHUNKS_PER_RESOLUTION_STEP a runtime variable, change draw lists to contain octree_nodes, and offset meshes by their nodes Resolution --- ..._work_queue_entry__bonsai_render_command.h | 2 +- ..._work_queue_entry__bonsai_render_command.h | 2 +- .../do_editor_ui_for_compound_type_graphics.h | 4 +-- .../do_editor_ui_for_compound_type_world.h | 26 +++++++++++++++++ ..._work_queue_entry__bonsai_render_command.h | 2 +- src/engine/graphics.h | 4 +-- src/engine/render.cpp | 29 +++++++++++++++++++ src/engine/render_command.cpp | 2 +- src/engine/render_command.h | 3 +- src/engine/world.cpp | 22 +++++++------- src/engine/world.h | 2 ++ src/engine/world_chunk.cpp | 1 + 12 files changed, 78 insertions(+), 21 deletions(-) diff --git a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h index a88c76f13..9ac98dba2 100644 --- a/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_all_constructors_work_queue_entry__bonsai_render_command.h @@ -544,7 +544,7 @@ BonsaiRenderCommandSetShaderUniform( shader_uniform Uniform , shader * Shade } link_internal bonsai_render_command_draw_world_chunk_draw_list -BonsaiRenderCommandDrawWorldChunkDrawList( world_chunk_ptr_paged_list * DrawList , shader * Shader , camera * Camera ) +BonsaiRenderCommandDrawWorldChunkDrawList( octree_node_ptr_block_array * DrawList , shader * Shader , camera * Camera ) { bonsai_render_command_draw_world_chunk_draw_list Reuslt = { .DrawList = DrawList diff --git a/generated/d_union_work_queue_entry__bonsai_render_command.h b/generated/d_union_work_queue_entry__bonsai_render_command.h index 0d66a5c4f..6c437fb41 100644 --- a/generated/d_union_work_queue_entry__bonsai_render_command.h +++ b/generated/d_union_work_queue_entry__bonsai_render_command.h @@ -1,4 +1,4 @@ -// src/engine/render_command.h:179:0 +// src/engine/render_command.h:180:0 enum work_queue_entry__bonsai_render_command_type { type_work_queue_entry__bonsai_render_command_noop, diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index 58cc6b2e9..cd9fd83f0 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -349,7 +349,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_chunk_ptr_paged_list*, &Element->MainDrawList), + Cast(octree_node_ptr_paged_list*, &Element->MainDrawList), MemberName, ThisHash, Params @@ -374,7 +374,7 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(world_chunk_ptr_paged_list*, &Element->ShadowMapDrawList), + Cast(octree_node_ptr_paged_list*, &Element->ShadowMapDrawList), MemberName, ThisHash, Params diff --git a/generated/do_editor_ui_for_compound_type_world.h b/generated/do_editor_ui_for_compound_type_world.h index 6aff5b140..f410de2e7 100644 --- a/generated/do_editor_ui_for_compound_type_world.h +++ b/generated/do_editor_ui_for_compound_type_world.h @@ -201,6 +201,32 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, world *Element, cs Name, u32 + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("ChunksPerResolutionStep"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(s32*, &Element->ChunksPerResolutionStep), + MemberName, + ThisHash, + Params + ); + + + + + + + + PushNewRow(Ui); } diff --git a/generated/push_render_command_work_queue_entry__bonsai_render_command.h b/generated/push_render_command_work_queue_entry__bonsai_render_command.h index a0ea2d414..b52de5bed 100644 --- a/generated/push_render_command_work_queue_entry__bonsai_render_command.h +++ b/generated/push_render_command_work_queue_entry__bonsai_render_command.h @@ -167,7 +167,7 @@ PushBonsaiRenderCommandSetShaderUniform( link_internal void PushBonsaiRenderCommandDrawWorldChunkDrawList( work_queue *RenderQueue - , world_chunk_ptr_paged_list* DrawList , shader* Shader , camera* Camera + , octree_node_ptr_block_array* DrawList , shader* Shader , camera* Camera ) { work_queue_entry Work = WorkQueueEntry( diff --git a/src/engine/graphics.h b/src/engine/graphics.h index f557f2587..122848423 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -198,8 +198,8 @@ struct graphics r32 Exposure; - world_chunk_ptr_paged_list MainDrawList; - world_chunk_ptr_paged_list ShadowMapDrawList; + octree_node_ptr_paged_list MainDrawList; + octree_node_ptr_paged_list ShadowMapDrawList; // NOTE(Jesse): This is a stencil region for cutting out the selection region // such that we can reneder an appropriate temporary mesh in the case that diff --git a/src/engine/render.cpp b/src/engine/render.cpp index a22388551..17eff1225 100644 --- a/src/engine/render.cpp +++ b/src/engine/render.cpp @@ -1521,6 +1521,35 @@ ComputeDrawListsAndQueueUnallocatedChunks(engine_resources *Engine) #endif } +link_internal void +RenderDrawList(engine_resources *Engine, octree_node_ptr_paged_list *DrawList, shader *Shader, camera *Camera) +{ + world *World = Engine->World;; + + IterateOver(DrawList, Node, NodeIndex) + { + auto Chunk = Node->Chunk; + Assert(Chunk); + + // In case gpu meshes got deallocated after the chunk was added to the draw list + if (HasGpuMesh(&Chunk->Mesh)) + { + v3 Offset = -1.f*V3(Node->Resolution*0.25f); + v3 Basis = Offset; + if (Camera) + { + Basis += GetRenderP(World->ChunkDim, Chunk->WorldP, Camera); + } + else + { + Basis += GetSimSpaceP(World, Chunk->WorldP); + } + DrawLod(Engine, Shader, &Chunk->Mesh, Basis, Quaternion(), V3(Chunk->DimInChunks)); + AssertNoGlErrors; + } + } +} + link_internal void RenderDrawList(engine_resources *Engine, world_chunk_ptr_paged_list *DrawList, shader *Shader, camera *Camera) { diff --git a/src/engine/render_command.cpp b/src/engine/render_command.cpp index 705317212..2601a0bcf 100644 --- a/src/engine/render_command.cpp +++ b/src/engine/render_command.cpp @@ -75,7 +75,7 @@ PushSetupShaderCommand(work_queue *RenderQueue, bonsai_render_command_shader_id } link_internal void -PushDrawWorldChunkDrawListCommand(work_queue *RenderQueue, world_chunk_ptr_paged_list *DrawList, shader *Shader, camera *Camera) +PushDrawWorldChunkDrawListCommand(work_queue *RenderQueue, octree_node_ptr_paged_list *DrawList, shader *Shader, camera *Camera) { work_queue_entry Work = WorkQueueEntry(WorkQueueEntryBonsaiRenderCommand(BonsaiRenderCommandDrawWorldChunkDrawList(DrawList, Shader, Camera))); PushWorkQueueEntry(RenderQueue, &Work); diff --git a/src/engine/render_command.h b/src/engine/render_command.h index 939f1ecfb..f1eb04eaa 100644 --- a/src/engine/render_command.h +++ b/src/engine/render_command.h @@ -98,9 +98,10 @@ struct bonsai_render_command_draw_all_entities shader *Shader; }; +struct octree_node_ptr_block_array; struct bonsai_render_command_draw_world_chunk_draw_list { - world_chunk_ptr_paged_list *DrawList; + octree_node_ptr_block_array *DrawList; shader *Shader; camera *Camera; }; diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 0ab4027fc..48dbef729 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -543,8 +543,6 @@ DEBUG_OctreeTraversal( engine_resources *Engine, octree_node *Node, octree_stats } } -#define OCTREE_CHUNKS_PER_RESOLUTION_STEP (4) - link_internal v3i ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) { @@ -555,7 +553,7 @@ ComputeNodeDesiredResolution(engine_resources *Engine, octree_node *Node) r32 Distance = DistanceToBox(CameraP, NodeRect); s32 DistanceInChunks = s32(Distance) / s32(World->ChunkDim.x); - v3i Result = Max(V3i(1), V3i(DistanceInChunks / OCTREE_CHUNKS_PER_RESOLUTION_STEP)); + v3i Result = Max(V3i(1), V3i(DistanceInChunks / Engine->World->ChunksPerResolutionStep)); return Result; } link_internal b32 @@ -611,7 +609,7 @@ OctreeLeafShouldSplit(engine_resources *Engine, octree_node *Node) link_internal s32 ComputePriorityIndex(world *World, octree_node *Node, octree_node *Parent, camera *GameCamera) { - s32 IdealListIndex = RatioToListIndex(2*Node->Resolution.x/OCTREE_CHUNKS_PER_RESOLUTION_STEP); + s32 IdealListIndex = RatioToListIndex(2*Node->Resolution.x/World->ChunksPerResolutionStep); // Penalize nodes who's parent is not in the frustum if (Parent) @@ -866,8 +864,8 @@ DrawOctreeRecursive( engine_resources *Engine, octree_node *Node, octree_node *Parent, octree_node_priority_queue *Queue, - world_chunk_ptr_paged_list *MainDrawList, - world_chunk_ptr_paged_list *ShadowMapDrawList, + octree_node_ptr_paged_list *MainDrawList, + octree_node_ptr_paged_list *ShadowMapDrawList, octree_stats *Stats, u32 Depth = 0 ) { @@ -926,8 +924,8 @@ DrawOctreeRecursive( engine_resources *Engine, { if (IsInFrustum( World, Camera, Chunk )) { - Push(MainDrawList, Chunk); - Push(ShadowMapDrawList, Chunk); + Push(MainDrawList, Node); + Push(ShadowMapDrawList, Node); } } } @@ -962,8 +960,8 @@ DrawOctreeRecursive( engine_resources *Engine, { if (IsInFrustum( World, Camera, Chunk )) { - Push(MainDrawList, Chunk); - Push(ShadowMapDrawList, Chunk); + Push(MainDrawList, Node); + Push(ShadowMapDrawList, Node); } } } @@ -1019,8 +1017,8 @@ MaintainWorldOctree(engine_resources *Engine) #endif - world_chunk_ptr_paged_list *MainDrawList = &Graphics->MainDrawList; - world_chunk_ptr_paged_list *ShadowMapDrawList = &Graphics->ShadowMapDrawList; + auto *MainDrawList = &Graphics->MainDrawList; + auto *ShadowMapDrawList = &Graphics->ShadowMapDrawList; // Reset world_chunk draw lists { diff --git a/src/engine/world.h b/src/engine/world.h index 3cbadd693..33368a0b6 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -107,6 +107,8 @@ struct world s32 MaxOctreeNodesToQueuePerFrame = MAX_OCTREE_NODES_QUEUED_PER_FRAME; #undef MAX_OCTREE_NODES_QUEUED_PER_FRAME + s32 ChunksPerResolutionStep = 4; + bonsai_futex ChunkFreelistFutex; poof(@ui_skip) world_chunk ChunkFreelistSentinal; poof(@ui_skip) s32 FreeChunkCount; diff --git a/src/engine/world_chunk.cpp b/src/engine/world_chunk.cpp index 567b22257..313cb44fd 100644 --- a/src/engine/world_chunk.cpp +++ b/src/engine/world_chunk.cpp @@ -4910,6 +4910,7 @@ FinalizeOccupancyMasksFromNoiseValues(world_chunk *Chunk, v3i WorldBasis, v3i No Chunk->xOccupancyBorder[((zNoise-1)*2)+1] = x1Bits; } } + return ChunkSum; } From d93c3178e24cd7ee886a3d2bdafc2a2b22bcd68e Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 29 Oct 2025 15:39:49 -0700 Subject: [PATCH 378/421] FAFing with world gen --- .../do_editor_ui_for_compound_type_graphics.h | 51 ----- ...r_ui_for_compound_type_lighting_settings.h | 41 ++++ ...o_editor_ui_for_enum_visible_region_size.h | 36 ++++ generated/serdes_struct_lighting_settings.h | 36 ++++ ...ing_and_value_tables_visible_region_size.h | 16 ++ shaders/Lighting.fragmentshader | 2 +- .../decoration/cliffy_hills.fragmentshader | 181 +----------------- .../terrain/shaping/7_archway.fragmentshader | 114 +++++++++++ .../shaping/7_steep_pillars.fragmentshader | 80 ++++++++ src/engine/graphics.h | 2 - src/engine/render/render_init.cpp | 7 +- src/engine/render_settings.h | 3 + src/engine/world.h | 4 + 13 files changed, 337 insertions(+), 236 deletions(-) create mode 100644 shaders/terrain/shaping/7_archway.fragmentshader create mode 100644 shaders/terrain/shaping/7_steep_pillars.fragmentshader diff --git a/generated/do_editor_ui_for_compound_type_graphics.h b/generated/do_editor_ui_for_compound_type_graphics.h index cd9fd83f0..50432fd36 100644 --- a/generated/do_editor_ui_for_compound_type_graphics.h +++ b/generated/do_editor_ui_for_compound_type_graphics.h @@ -175,57 +175,6 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, graphics *Element, cs Name, u - } - - - { - - - - cs MemberName = CSz("FogPower"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(r32*, &Element->FogPower), - MemberName, - ThisHash, - Params - ); - - - - - - - - - PushNewRow(Ui); - - } - - - { - - - - cs MemberName = CSz("FogColor"); - DoEditorUi(Ui, - Window, - // Cast to remove const/volatile keywords if they're there - Cast(v3*, &Element->FogColor), - MemberName, - ThisHash, - Params - ); - - - - - - - - - } diff --git a/generated/do_editor_ui_for_compound_type_lighting_settings.h b/generated/do_editor_ui_for_compound_type_lighting_settings.h index bc4960403..b23078e70 100644 --- a/generated/do_editor_ui_for_compound_type_lighting_settings.h +++ b/generated/do_editor_ui_for_compound_type_lighting_settings.h @@ -116,6 +116,47 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, lighting_settings *Element, c + } + + + { + + + + cs MemberName = CSz("FogPower"); + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(r32*, &Element->FogPower), + MemberName, + ThisHash, + Params + ); + + + + + + + + + PushNewRow(Ui); + + } + + + { + + + + cs MemberName = CSz("FogColor"); + PushColumn(Ui, CSz("FogColor")); DoColorPickerToggle(Ui, Window, &Element->FogColor, False, ThisHash); + + + + + + } diff --git a/generated/do_editor_ui_for_enum_visible_region_size.h b/generated/do_editor_ui_for_enum_visible_region_size.h index 08341f7d8..d4482f74d 100644 --- a/generated/do_editor_ui_for_enum_visible_region_size.h +++ b/generated/do_editor_ui_for_enum_visible_region_size.h @@ -161,6 +161,42 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, visible_region_size *Element, *Element = VisibleRegionSize_64k; + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("128k"), UiId(Window, "enum VisibleRegionSize_128k", Element, ThisHash), Params)) + { + *Element = VisibleRegionSize_128k; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("256k"), UiId(Window, "enum VisibleRegionSize_256k", Element, ThisHash), Params)) + { + *Element = VisibleRegionSize_256k; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("512k"), UiId(Window, "enum VisibleRegionSize_512k", Element, ThisHash), Params)) + { + *Element = VisibleRegionSize_512k; + + + SetToggleButton(Ui, ToggleButtonId, False); + } + PushNewRow(Ui); + if (Name.Count) { PushColumn(Ui, CSz("|")); } // Skip the first Name column + if (Button(Ui, CSz("1024k"), UiId(Window, "enum VisibleRegionSize_1024k", Element, ThisHash), Params)) + { + *Element = VisibleRegionSize_1024k; + + SetToggleButton(Ui, ToggleButtonId, False); } PushNewRow(Ui); diff --git a/generated/serdes_struct_lighting_settings.h b/generated/serdes_struct_lighting_settings.h index 261ece7c3..8434baf56 100644 --- a/generated/serdes_struct_lighting_settings.h +++ b/generated/serdes_struct_lighting_settings.h @@ -61,6 +61,20 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings *BaseElement, umm Coun + Result &= Serialize(Bytes, &Element->FogPower); // default + + + + + + + Result &= Serialize(Bytes, &Element->FogColor); // default + + + + + + Result &= Serialize(Bytes, &Element->DawnIntensity); // default @@ -156,6 +170,10 @@ Serialize(u8_cursor_block_array *Bytes, lighting_settings *BaseElement, umm Coun + + + + @@ -214,6 +232,22 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->FogPower, Memory); + + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because + // strings are considered primitive, but need memory to deserialize + Result &= Deserialize(Bytes, &Element->FogColor, Memory); + + + + + // NOTE(Jesse): Unfortunately we can't check for primitives because // strings are considered primitive, but need memory to deserialize Result &= Deserialize(Bytes, &Element->DawnIntensity, Memory); @@ -307,6 +341,8 @@ DeserializeCurrentVersion(u8_cursor *Bytes, lighting_settings *Element, memory_a + + diff --git a/generated/string_and_value_tables_visible_region_size.h b/generated/string_and_value_tables_visible_region_size.h index 88a21fd6d..17ab1da3f 100644 --- a/generated/string_and_value_tables_visible_region_size.h +++ b/generated/string_and_value_tables_visible_region_size.h @@ -22,6 +22,10 @@ IsValid(visible_region_size Value) case VisibleRegionSize_16k: case VisibleRegionSize_32k: case VisibleRegionSize_64k: + case VisibleRegionSize_128k: + case VisibleRegionSize_256k: + case VisibleRegionSize_512k: + case VisibleRegionSize_1024k: { Result = True; @@ -57,6 +61,10 @@ ToStringPrefixless(visible_region_size Type) case VisibleRegionSize_16k: { Result = CSz("16k"); } break; case VisibleRegionSize_32k: { Result = CSz("32k"); } break; case VisibleRegionSize_64k: { Result = CSz("64k"); } break; + case VisibleRegionSize_128k: { Result = CSz("128k"); } break; + case VisibleRegionSize_256k: { Result = CSz("256k"); } break; + case VisibleRegionSize_512k: { Result = CSz("512k"); } break; + case VisibleRegionSize_1024k: { Result = CSz("1024k"); } break; @@ -90,6 +98,10 @@ ToString(visible_region_size Type) case VisibleRegionSize_16k: { Result = CSz("VisibleRegionSize_16k"); } break; case VisibleRegionSize_32k: { Result = CSz("VisibleRegionSize_32k"); } break; case VisibleRegionSize_64k: { Result = CSz("VisibleRegionSize_64k"); } break; + case VisibleRegionSize_128k: { Result = CSz("VisibleRegionSize_128k"); } break; + case VisibleRegionSize_256k: { Result = CSz("VisibleRegionSize_256k"); } break; + case VisibleRegionSize_512k: { Result = CSz("VisibleRegionSize_512k"); } break; + case VisibleRegionSize_1024k: { Result = CSz("VisibleRegionSize_1024k"); } break; @@ -120,6 +132,10 @@ VisibleRegionSize(counted_string S) if (StringsMatch(S, CSz("VisibleRegionSize_16k"))) { return VisibleRegionSize_16k; } if (StringsMatch(S, CSz("VisibleRegionSize_32k"))) { return VisibleRegionSize_32k; } if (StringsMatch(S, CSz("VisibleRegionSize_64k"))) { return VisibleRegionSize_64k; } + if (StringsMatch(S, CSz("VisibleRegionSize_128k"))) { return VisibleRegionSize_128k; } + if (StringsMatch(S, CSz("VisibleRegionSize_256k"))) { return VisibleRegionSize_256k; } + if (StringsMatch(S, CSz("VisibleRegionSize_512k"))) { return VisibleRegionSize_512k; } + if (StringsMatch(S, CSz("VisibleRegionSize_1024k"))) { return VisibleRegionSize_1024k; } return Result; diff --git a/shaders/Lighting.fragmentshader b/shaders/Lighting.fragmentshader index 8aca067fb..5f9f90d83 100644 --- a/shaders/Lighting.fragmentshader +++ b/shaders/Lighting.fragmentshader @@ -307,7 +307,7 @@ void main() */ // TODO(Jesse): Can do squared? float DistanceToFrag = distance(Camera, FragWorldP); - float MaxFogDist = 1000.f; + float MaxFogDist = 30000.f; float FogContrib = clamp( DistanceToFrag / MaxFogDist, 0.f, 1.f); v3 Fog = FogContrib * FogColor * FogPower; diff --git a/shaders/terrain/decoration/cliffy_hills.fragmentshader b/shaders/terrain/decoration/cliffy_hills.fragmentshader index fc7825dbe..958512478 100644 --- a/shaders/terrain/decoration/cliffy_hills.fragmentshader +++ b/shaders/terrain/decoration/cliffy_hills.fragmentshader @@ -7,182 +7,14 @@ uniform sampler2D InputTex; in vec2 UV; out v4 Output; -v4 DoCliffs(v3 Basis, v3 Deriv) -{ - v3 Down = V3(0, 0, -1); - - v3 ColorValue = V3(0.f); - f32 NoiseValue = 0.f; - - /* NoiseValue = 100.f+MapNoiseValueToFinal(NoiseValue); */ - - /* Deriv = normalize(Deriv); */ - /* Deriv.xy = abs(Deriv.xy); */ - f32 Cliffness = Clamp01(0.8f+dot(Down, Deriv)); - f32 Grassness = Clamp01(.15f-Cliffness); - - ColorValue = mix(v3(.1,.8,.2), v3(.3), Cliffness); - /* ColorValue = mix(v3(.1,.8,.2), v3(.3), pow(Cliffness, .2)); */ - /* ColorValue = Cliffness > 0.15f ? V3(0.3f) : v3(.1,.8,.2); */ - - // Grassy ripples -#if 0 - { - v4 gWobble = gradient_noise_derivs(Basis/v3(30, 30, 80)); - NoiseValue += gWobble.x*Grassness*50; - ColorValue += V3(0.f, 1.f, 0.f)*gWobble.x*Grassness*1.5f; - } -#endif - - - f32 rng2d = white_noise(Basis.xy); - f32 rng3d = white_noise(Basis); - - v3 BaseCliffColor = V3(0.08f); - v3 CliffColor = BaseCliffColor; - f32 CliffValue = 0.f; - - // Main cliffs - { - v3 v = voronoi_noise(Basis/v3(200,200,1800)); - CliffValue += (v.x*100)*Cliffness; - CliffValue += (v.y*20)*Cliffness; - CliffColor = mix(CliffColor, BaseCliffColor, clamp(10.f*Cliffness*v.x,0,1)); - } - -#if 0 - { - v3 v = voronoi_noise(Basis/v3(100,100,600)); - v.x += 0.5f; - v.x = v.x*v.x; - - if (v.x > 0.28f) - { - CliffValue += (v.x*25)*Cliffness; - /* CliffValue += (v.y*10)*Cliffness; */ - CliffColor = mix(CliffColor, v3(.7), Cliffness*v.x); - } - } - { - v3 v = voronoi_noise(Basis/v3(50,50,200)); - v.x += 0.50f; - v.x = v.x * v.x; - - if (v.x > 0.30) - { - /* CliffValue += (v.x)*Cliffness; */ - CliffValue += (v.x*10)*pow(Cliffness,3); - CliffColor = mix(CliffColor, v3(.9), Cliffness*v.x*v.x); - } - } - { - CliffValue += rng3d * 0.1f; - CliffColor = mix(CliffColor, v3(1.f), rng3d*Cliffness*.2); - } -#endif - - /* if (CliffValue > 12.f) */ - { - NoiseValue += CliffValue; - ColorValue = CliffColor; - } - -#if 0 - - f32 gravel_patch_stregth = value_noise_derivs(150+(Basis/300)).x; - gravel_patch_stregth += value_noise_derivs(150+(Basis/160)).x; - gravel_patch_stregth += value_noise_derivs(150+(Basis/80)).x; - gravel_patch_stregth += value_noise_derivs(150+(Basis/40)).x; - gravel_patch_stregth += value_noise_derivs(150+(Basis/20)).x; - gravel_patch_stregth += value_noise_derivs(150+(Basis/8)).x; - gravel_patch_stregth = max(gravel_patch_stregth, 0.f); - - - // Grass & Flowers -#if 0 - { - f32 n = clamp(rng2d-0.7f, 0.f, 1.f); - - f32 GrassValue = 90*n*Grassness; - - f32 tFlower = Basis.z - (GrassValue + NoiseValue); - tFlower = max(tFlower, 0); - - - f32 grass_patch_stregth = value_noise_derivs(Basis/80).x; - grass_patch_stregth += value_noise_derivs(Basis/40).x; - grass_patch_stregth += value_noise_derivs(Basis/20).x; - grass_patch_stregth += value_noise_derivs(Basis/8).x; - grass_patch_stregth = max(grass_patch_stregth-gravel_patch_stregth, 0.f); - - NoiseValue += GrassValue*grass_patch_stregth; - - f32 tColor = (grass_patch_stregth / 2.f)*Grassness; - ColorValue = mix(ColorValue, V3(.6f, .8f, .1f), tColor); - - /* if (rng2d > 0.99f) */ - /* { */ - /* ColorValue = mix(ColorValue, V3(.5f, .5f, .5f), tFlower); */ - /* } */ - /* if (rng2d > 0.995f) */ - /* { */ - /* ColorValue = mix(ColorValue, V3(.5f, .2f, .5f), tFlower); */ - /* } */ - - - /* ColorValue *= tFlower; */ - - /* ColorValue = V3(tFlower); */ - /* ColorValue = V3(GrassValue/1.f); */ - } -#endif - - // Rocky edges - /* { */ - /* f32 MinDotValue = 0.6f; */ - /* v3 v = voronoi_noise(Basis/v3(20,20,20)); */ - /* f32 Power = 100*gravel_patch_stregth*Cliffness*abs(clamp(Cliffness-MinDotValue, -MinDotValue, 0)); */ - /* if (v.x*Power > 3.f) */ - /* { */ - /* NoiseValue += v.x*Power; */ - /* ColorValue = v3(1.0); */ - /* } */ - /* } */ - /* { */ - /* f32 MinDotValue = 0.4f; */ - /* v3 v = voronoi_noise(Basis/v3(10,10,10)); */ - /* f32 Power = 400*gravel_patch_stregth*Cliffness*abs(clamp(Cliffness-MinDotValue, -MinDotValue, 0)); */ - /* NoiseValue += v.x*Power; */ - /* /1* NoiseValue -= ((1.f/v.x)*2)*Power; *1/ */ - /* ColorValue = mix(ColorValue, v3(1.0), Power/3*v.x); */ - /* } */ - -#endif - - /* ColorValue = V3(Grassness, Cliffness, 0.f); */ - /* ColorValue = V3(Cliffness); */ - - return V4(ColorValue, NoiseValue); -} - -v4 DoCliffs_v2(v3 Basis, v3 Deriv, v3 InputColor) +v4 DoCliffs(v3 Basis, v3 Deriv, v3 InputColor) { v3 Up = V3(0, 0, 1); v3 Down = V3(0, 0, -1); - /* Deriv = normalize(Deriv); */ - /* Deriv.xy = abs(Deriv.xy); */ f32 Cliffness = Clamp01(-dot(Up, Deriv) + 0.6f); f32 Grassness = Clamp01(.15f-Cliffness); - /* ColorValue = mix(v3(.1,.8,.2), v3(.3), Cliffness); */ - /* ColorValue = mix(v3(.1,.8,.2), v3(.3), pow(Cliffness, .2)); */ - /* ColorValue = Cliffness > 0.15f ? V3(0.3f) : v3(.1,.8,.2); */ - /* ColorValue = V3(Cliffness); */ - - /* f32 rng2d = white_noise(Basis.xy); */ - /* f32 rng3d = white_noise(Basis); */ - v3 BaseCliffColor = V3(0.08f); v3 CliffColor = BaseCliffColor; f32 CliffValue = 0.f; @@ -198,7 +30,6 @@ v4 DoCliffs_v2(v3 Basis, v3 Deriv, v3 InputColor) } { v3 v = voronoi_noise(Basis/v3(50,50,100)); - /* CliffValue += (v.y*80)*Cliffness; */ CliffValue += (v.x*100)*Cliffness; } @@ -256,16 +87,10 @@ void main() // Put random junk here f32 CosTheta = Dot(Derivs, Normalize(V3(0,0,1))); - v4 Cliffs = DoCliffs_v2(Basis, Derivs, ColorValue); + v4 Cliffs = DoCliffs(Basis, Derivs, ColorValue); + ColorValue = Cliffs.rgb; f32 CliffContrib = exp((-Basis.z)/1300.f); - ColorValue = V3(CliffContrib); - - /* Cliffs.w *= 10.f*CliffContrib; */ - /* Cliffs.w *= CliffContrib; */ - /* ColorValue = V3(0.1f, 0.8f, 0.1f); */ - - ColorValue = Cliffs.rgb; NoiseValue += Cliffs.w * CliffContrib; } diff --git a/shaders/terrain/shaping/7_archway.fragmentshader b/shaders/terrain/shaping/7_archway.fragmentshader new file mode 100644 index 000000000..890d4b6c2 --- /dev/null +++ b/shaders/terrain/shaping/7_archway.fragmentshader @@ -0,0 +1,114 @@ +uniform v2 SampleRemapCurvePoints[16]; +uniform u32 SampleRemapCurvePointCount; + +uniform v3 WorldspaceChunkBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out v4 Output; + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); + + v3 Offset = V3(0); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.2f, 0.8f, 0.2f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + v3 Period = V3(800.f); + float Amplitude = 800.f; + /* f32 StartingZDepth = 10000; */ + f32 StartingZDepth = 1000000; + /* f32 StartingZDepth = 0; */ + NoiseValue = StartingZDepth; + + v3 Deriv = v3(0.f); + /* f32 warp = 0.f; */ + + /* v3 warp = v3(gradient_noise_derivs(Basis).x); */ + v3 warp = v3(0.f); + + f32 Mask; + { + f32 XOff = 700000.f; + v3 xyz = Basis / V3(XOff, XOff, 1700000.f); + Mask = (1.f+gradient_noise_derivs(xyz+warp).x)/2.f; + /* Mask = ridge_noise(xyz); */ + Mask = Smoothstep(Mask); + /* Mask = RemapSample(Mask, SampleRemapCurvePoints, SampleRemapCurvePointCount ); */ + Mask = Mask*Mask * 2.35; + } + + s32 Octaves = s32(Mask*10); + while (Octaves > 0) + { + v3 xyz = Basis / V3(18000.f, 18000.f, 50000.f) / Octaves; + f32 N = Mask * (1.f+gradient_noise_derivs(xyz+warp).x)/2.f; + NoiseValue += N*N*N*N * (20000.f*Octaves); + + --Octaves; + } + + + // Scrub + { + v3 xyz = Basis / V3(50000.f, 50000.f, 10000.f); + f32 Perturb = 30000.f*(1.f+gradient_noise_derivs(xyz+warp).x)/2.f; + + if ( (NoiseValue+Perturb) > 1030000.f) + { + ColorValue = V3(0.3f, 0.7f, 0.2f); + } + + } + + // Scrub + { + v3 xyz = Basis / V3(50000.f, 50000.f, 10000.f); + f32 Perturb = 30000.f*(1.f+gradient_noise_derivs(xyz+warp).x)/2.f; + + if ( (NoiseValue+Perturb) > 1140000.f) + { + ColorValue = V3(0.4f, 0.6f, 0.3f); + } + + } + + + // Snow + { + /* v3 xyz = Basis / V3(7000.f, 7000.f, 170000.f); */ + /* f32 Perturb = 10000.f*(1.f+gradient_noise_derivs(xyz+warp).x)/2.f; */ + v3 xyz = Basis / V3(50000.f, 50000.f, 100000.f); + f32 Perturb = 30000.f*(1.f+gradient_noise_derivs(xyz+warp).x)/2.f; + + if ( (NoiseValue+Perturb) > 1150000.f) + { + ColorValue = V3(1.f); + } + } + + + NoiseValue -= Basis.z; + /* NoiseValue = StartingZDepth; */ + + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; + + /* Output = (SolidBit << 15) | PackedColor; */ +} diff --git a/shaders/terrain/shaping/7_steep_pillars.fragmentshader b/shaders/terrain/shaping/7_steep_pillars.fragmentshader new file mode 100644 index 000000000..0fd1ee6cd --- /dev/null +++ b/shaders/terrain/shaping/7_steep_pillars.fragmentshader @@ -0,0 +1,80 @@ +uniform v2 SampleRemapCurvePoints[16]; +uniform u32 SampleRemapCurvePointCount; + +uniform v3 WorldspaceChunkBasis; +uniform v3 ChunkResolution; + +in vec2 UV; +out v4 Output; + +void main() +{ + f32 x = floor(gl_FragCoord.x); + f32 z = floor(gl_FragCoord.y / 68); + f32 y = floor(gl_FragCoord.y - (z*68)); + + v3 Offset = V3(0); + v3 Basis = Offset + WorldspaceChunkBasis + (v3(x,y,z)*ChunkResolution); + + // NOTE(Jesse): Set these in the -- user code -- section + v3 ColorValue = V3(0.1f, 0.7f, 0.1f); + f32 NoiseValue = 0.f; + + // + // -- user code -- + // + { + v3 Period = V3(800.f); + float Amplitude = 800.f; + /* f32 StartingZDepth = 10000; */ + f32 StartingZDepth = 50000; + /* f32 StartingZDepth = 0; */ + NoiseValue = StartingZDepth; + + v3 Deriv = v3(0.f); + /* f32 warp = 0.f; */ + + /* v3 warp = v3(gradient_noise_derivs(Basis).x); */ + v3 warp = v3(0.f); + + f32 Mask; + { + v3 xyz = Basis / V3(100000.f, 100000.f, 1000000.f); + Mask = (1.f+gradient_noise_derivs(xyz+warp).x)/2.f; + } + + Mask = Mask*Mask*Mask * 3.f; +#if 0 + NoiseValue += Mask; +#else + s32 Octaves = 9; + while (Octaves > 0) + { + v3 xyz = Basis / V3(18000.f, 18000.f, 50000.f) / Octaves; + /* v3 N = voronoi_noise(xyz+warp); */ + /* f32 Mask = (gradient_noise_derivs(Basis/20000.f).x+1.f)/2.f; */ + /* Mask = RemapSample(Mask, SampleRemapCurvePoints, SampleRemapCurvePointCount ); */ + f32 N = Mask * (1.f+gradient_noise_derivs(xyz+warp).x)/2.f; + /* f32 Remapped = RemapSample(N, SampleRemapCurvePoints, SampleRemapCurvePointCount ); */ + /* NoiseValue += RemapSample(N, SampleRemapCurvePoints, SampleRemapCurvePointCount ) * 10000.f; */ + /* NoiseValue += Remapped*Remapped * 20000.f; */ + NoiseValue += N*N*N*N * (25000.f*Octaves); + + --Octaves; + } +#endif + + NoiseValue -= Basis.z; + /* NoiseValue = StartingZDepth; */ + + } + + // + // -- end user code -- + // + + Output.rgb = ColorValue; + Output.a = NoiseValue; + + /* Output = (SolidBit << 15) | PackedColor; */ +} diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 122848423..c95292da4 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -185,8 +185,6 @@ struct graphics v3 SunBasis; - r32 FogPower; - v3 FogColor; v3 SkyColor; // Default cameras, game code can do it's own thing if it wants to. diff --git a/src/engine/render/render_init.cpp b/src/engine/render/render_init.cpp index 2d8cfce22..e5862e4a8 100644 --- a/src/engine/render/render_init.cpp +++ b/src/engine/render/render_init.cpp @@ -543,9 +543,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr Result->PrevSettings = Result->Settings; Result->Exposure = 1.5f; - Result->FogPower = 2.f; - Result->FogColor = V3(0.01f, 0.04f, 0.25f); + Result->SkyColor = V3(0.001f, 0.001f, 0.35f); AllocateGpuElementBuffer(Result->GpuBuffers + 0, DataType_v3, (u32)Megabytes(1)); @@ -609,8 +608,8 @@ GraphicsInit(graphics *Result, engine_settings *EngineSettings, memory_arena *Gr &Result->Settings.Lighting.SunP, &Result->Settings.Lighting.CurrentSunColor, - &Result->FogColor, - &Result->FogPower, + &Result->Settings.Lighting.FogColor, + &Result->Settings.Lighting.FogPower, &Result->Settings.UseSsao, &Result->Settings.UseShadowMapping, diff --git a/src/engine/render_settings.h b/src/engine/render_settings.h index 2451422e5..40ca05ebe 100644 --- a/src/engine/render_settings.h +++ b/src/engine/render_settings.h @@ -17,6 +17,9 @@ struct lighting_settings v3 SunP; poof(@ui_skip) + r32 FogPower; + v3 FogColor; poof(@custom_ui(PushColumn(Ui, CSz("FogColor")); DoColorPickerToggle(Ui, Window, &Element->FogColor, False, ThisHash))) + f32 DawnIntensity; poof(@ui_value_range(0.f, 3.f)) v3 DawnHSV; poof(@custom_ui(PushColumn(Ui, CSz("DawnColor")); DoColorPickerToggle(Ui, Window, &Element->DawnHSV, False, ThisHash))) diff --git a/src/engine/world.h b/src/engine/world.h index 33368a0b6..fd2a41477 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -20,6 +20,10 @@ enum visible_region_size VisibleRegionSize_16k = (1 << 14), // 104.8 km VisibleRegionSize_32k = (1 << 15), // 209.6 km VisibleRegionSize_64k = (1 << 16), // 419.2 km + VisibleRegionSize_128k = (1 << 17), // 838.4 km + VisibleRegionSize_256k = (1 << 18), // big + VisibleRegionSize_512k = (1 << 19), // big + VisibleRegionSize_1024k = (1 << 20), // big }; enum octree_node_type From b0b90a57e7794cb6c0915db3a7ad19214419063a Mon Sep 17 00:00:00 2001 From: a pirate Date: Wed, 29 Oct 2025 18:02:23 -0700 Subject: [PATCH 379/421] More terrain gen hacking --- examples/terrain_gen/game.cpp | 4 +++- examples/terrain_gen/game.h | 4 +++- .../do_editor_ui_for_compound_type_game_state.h | 15 +++++++++++++-- shaders/terrain/shaping/7_archway.fragmentshader | 7 +++++-- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/examples/terrain_gen/game.cpp b/examples/terrain_gen/game.cpp index 80bb628f2..d1bec1ef2 100644 --- a/examples/terrain_gen/game.cpp +++ b/examples/terrain_gen/game.cpp @@ -50,6 +50,8 @@ BONSAI_API_MAIN_THREAD_INIT_CALLBACK() CameraGhost->Behavior = entity_behavior_flags(CameraGhost->Behavior|EntityBehaviorFlags_DefatulCameraGhostBehavior|EntityBehaviorFlags_WorldCenter); + GameState->VisibleRegionSize = &World->VisibleRegionSize; + easing_function *EasingFunction = &Graphics->TerrainShapingRC.ReshapeFunc; GameState->EasingFunction = EasingFunction; @@ -86,7 +88,7 @@ BONSAI_API_MAIN_THREAD_CALLBACK() { window_layout *Window = GetOrCreateWindow(Ui, "GameState"); PushWindowStart(Ui, Window); - DoEditorUi(Ui, Window, GameState, CSz("Game State"), u32(Hash(Window))); + DoEditorUi(Ui, Window, GameState, {}, u32(Hash(Window))); PushWindowEnd(Ui, Window); } diff --git a/examples/terrain_gen/game.h b/examples/terrain_gen/game.h index 257545106..f946733ca 100644 --- a/examples/terrain_gen/game.h +++ b/examples/terrain_gen/game.h @@ -3,6 +3,8 @@ struct game_state { easing_function *EasingFunction; - easing_function_visualizer_render_pass EasingFunctionVisRP; + visible_region_size *VisibleRegionSize; + + easing_function_visualizer_render_pass EasingFunctionVisRP; poof(@ui_skip) }; diff --git a/generated/do_editor_ui_for_compound_type_game_state.h b/generated/do_editor_ui_for_compound_type_game_state.h index b3fb8ae17..bb9667ff1 100644 --- a/generated/do_editor_ui_for_compound_type_game_state.h +++ b/generated/do_editor_ui_for_compound_type_game_state.h @@ -59,11 +59,11 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_state *Element, cs Name, - cs MemberName = CSz("EasingFunctionVisRP"); + cs MemberName = CSz("VisibleRegionSize"); DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there - Cast(easing_function_visualizer_render_pass*, &Element->EasingFunctionVisRP), + Cast(visible_region_size*, Element->VisibleRegionSize), MemberName, ThisHash, Params @@ -77,6 +77,17 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, game_state *Element, cs Name, + } + + + { + + + + cs MemberName = CSz("EasingFunctionVisRP"); + + + } if (DidToggle) { CLOSE_INDENT_FOR_TOGGLEABLE_REGION(); } diff --git a/shaders/terrain/shaping/7_archway.fragmentshader b/shaders/terrain/shaping/7_archway.fragmentshader index 890d4b6c2..e6c08475c 100644 --- a/shaders/terrain/shaping/7_archway.fragmentshader +++ b/shaders/terrain/shaping/7_archway.fragmentshader @@ -40,12 +40,12 @@ void main() f32 Mask; { f32 XOff = 700000.f; - v3 xyz = Basis / V3(XOff, XOff, 1700000.f); + v3 xyz = Basis / V3(XOff, XOff, 2000000.f); Mask = (1.f+gradient_noise_derivs(xyz+warp).x)/2.f; /* Mask = ridge_noise(xyz); */ Mask = Smoothstep(Mask); /* Mask = RemapSample(Mask, SampleRemapCurvePoints, SampleRemapCurvePointCount ); */ - Mask = Mask*Mask * 2.35; + Mask = Mask*1.6; } s32 Octaves = s32(Mask*10); @@ -97,6 +97,9 @@ void main() } } + r32 white = white_noise(Basis); + ColorValue *= Clamp01(1.6f+white); + NoiseValue -= Basis.z; /* NoiseValue = StartingZDepth; */ From 5b3bd231a09fe22f713626ccaac50db00e74112f Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 30 Oct 2025 08:15:19 -0700 Subject: [PATCH 380/421] Add mountain.png --- readme.md | 4 +++- screenshots/mountain.png | Bin 0 -> 414920 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 screenshots/mountain.png diff --git a/readme.md b/readme.md index a8b7078b2..aee82610f 100644 --- a/readme.md +++ b/readme.md @@ -64,7 +64,7 @@ https://discord.gg/kmRpgXBh75 * Primitive Physics -![banner]( screenshots/platapus.png) +![banner]( screenshots/mountain.png) ## Terrain Generation @@ -141,6 +141,8 @@ https://discord.gg/kmRpgXBh75 [ ] Lumen-style GI screen-space radiance caching : https://www.youtube.com/watch?v=2GYXuM10riw +![banner]( screenshots/platapus.png) + ------------------------------------------------------------------------------- ## Terrain diff --git a/screenshots/mountain.png b/screenshots/mountain.png new file mode 100644 index 0000000000000000000000000000000000000000..0768db09fb11e8b82396741696f6f5dbb6951605 GIT binary patch literal 414920 zcmeEtXH-*N*KH7`NL7&DRX~v5y9gG#B7#5w>Ae$r5$Rn(I)aFRh!A?{EmSE{S_q-H z00HSWlzaT%`#z7}`|tj~d*tYV5t4KEUVF~9=9)X|ndTF+>kQXHAP||#Q)O)sh|mZG z!ov~~0KW+>3(W@p!*kbu@(@%u#Iy$daMfB-LlFe3NFX^gy$1YD?DACK9RwnW|Gw~g zoWEFrK$it7%8EMP#vA8ebxg<)D?Wkn&-F8Sw5cGKAAYwD-o4LL*3Nk^vE1;|2rc7i zgCOu`zZ≫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

    Jn{IY;@B7eoD5!4XLUq4 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 !Oa)MiC^T&>0D#q^`J67u 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

    !iT`;&c?Re>u@AQ7bg4FG$?J!o5Zoa7kvhmC&! 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 z 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 literal 0 HcmV?d00001 From 71d078fa4c852ad1164626509b790020edbd850b Mon Sep 17 00:00:00 2001 From: a pirate Date: Thu, 30 Oct 2025 09:06:36 -0700 Subject: [PATCH 381/421] Add ridgeline.png --- readme.md | 13 ++++++++----- screenshots/ridgeline.png | Bin 0 -> 624161 bytes 2 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 screenshots/ridgeline.png diff --git a/readme.md b/readme.md index aee82610f..e74c24ba8 100644 --- a/readme.md +++ b/readme.md @@ -73,7 +73,7 @@ https://discord.gg/kmRpgXBh75 * 1D, 2D and 3D noise library * Terrain derivitives available in second-stage terrain "decoration" -![banner](screenshots/pillar.png) +![banner](screenshots/ridgeline.png) ## Editing @@ -108,10 +108,6 @@ https://discord.gg/kmRpgXBh75 ![banner](screenshots/8_skele.png) -![banner](screenshots/dusk_defence.png) - -![banner](screenshots/5_skele.png) - # Wishlist ------------------------------------------------------------------------------- @@ -159,6 +155,8 @@ https://discord.gg/kmRpgXBh75 * https://graphics.stanford.edu/courses/cs164-10-spring/Handouts/isotropic.pdf * https://inria.hal.science/inria-00071612/document +![banner](screenshots/pillar.png) + ------------------------------------------------------------------------------- ## Assets @@ -167,6 +165,9 @@ https://discord.gg/kmRpgXBh75 [ ] Sound : mp3, ogg, ..? decompresser + +![banner](screenshots/5_skele.png) + ------------------------------------------------------------------------------- ## Datastructures @@ -189,6 +190,8 @@ https://discord.gg/kmRpgXBh75 [ ] More interpolation goodies : https://paulbourke.net/miscellaneous/interpolation/ +![banner](screenshots/dusk_defence.png) + ## Goodies [ ] Better (faster) Sin/Cos ? https://www.shadertoy.com/view/432yWW diff --git a/screenshots/ridgeline.png b/screenshots/ridgeline.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee24cea2d4deece5024831beb5cc1c03d526a52 GIT binary patch literal 624161 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

    ?$UIQ}GMbCu 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

    UB>w2jKwP^a;*& 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�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 Date: Sun, 4 May 2025 13:33:39 -0700 Subject: [PATCH 222/421] WIP start implementing button bars --- examples/terrain_gen/game_types.h | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- generated/are_equal_brush_settings.h | 2 +- generated/are_equal_perlin_noise_params.h | 2 +- generated/are_equal_world_edit_brush.h | 2 +- .../block_array_h_asset_thumbnail_688856411.h | 2 +- generated/block_array_world_edit_688735882.h | 2 +- .../block_array_world_edit_layer_688735882.h | 2 +- .../block_array_world_edit_ptr_688735882.h | 2 +- generated/d_union_ui_render_command.h | 2 +- generated/default_marshal_brush_settings_0.h | 2 +- generated/default_marshal_brush_settings_1.h | 2 +- generated/default_marshal_brush_settings_2.h | 2 +- generated/default_marshal_noise_layer_0.h | 2 +- ...do_editor_ui_for_compound_type_maybe_ray.h | 2 +- .../do_editor_ui_for_compound_type_ray.h | 2 +- .../do_editor_ui_for_compound_type_rect3.h | 2 +- .../do_editor_ui_for_compound_type_rect3cp.h | 2 +- .../do_editor_ui_for_compound_type_rect3i.h | 2 +- ..._editor_ui_for_compound_type_renderer_2d.h | 16 +++++++ generated/do_editor_ui_for_enum_data_type.h | 2 +- generated/do_editor_ui_for_enum_maybe_tag.h | 2 +- .../do_editor_ui_for_enum_ui_noise_type.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ...adio_enum_world_edit_blend_mode_modifier.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...r_radio_enum_world_edit_color_blend_mode.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- .../do_editor_ui_for_scalar_type_688724926.h | 2 +- .../do_editor_ui_for_vector_type_688873645.h | 2 +- generated/hashtable_world_edit_brush.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 11 ++++- ...group_for_bitfield_enum_terrain_gen_type.h | 9 ++++ ...on_group_for_bitfield_enum_ui_noise_type.h | 11 ++++- generated/string_and_value_tables_data_type.h | 2 +- ...g_and_value_tables_enum_brush_layer_type.h | 2 +- generated/string_and_value_tables_maybe_tag.h | 2 +- .../string_and_value_tables_shape_type.h | 2 +- .../string_and_value_tables_ui_noise_type.h | 2 +- ...g_and_value_tables_world_edit_blend_mode.h | 2 +- ...ue_tables_world_edit_blend_mode_modifier.h | 2 +- ...value_tables_world_edit_color_blend_mode.h | 2 +- ...d_value_tables_world_edit_selection_mode.h | 2 +- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- src/engine/editor.cpp | 10 ++++- src/engine/editor.h | 45 ++++++++++++++++--- 50 files changed, 135 insertions(+), 55 deletions(-) diff --git a/examples/terrain_gen/game_types.h b/examples/terrain_gen/game_types.h index b59764956..9addf0b00 100644 --- a/examples/terrain_gen/game_types.h +++ b/examples/terrain_gen/game_types.h @@ -22,7 +22,7 @@ enum terrain_gen_type TerrainGenType_Debug = (1 << 16), }; -poof(radio_button_group_for_bitfield_enum(terrain_gen_type)) +poof(radio_button_group_for_enum(terrain_gen_type)) #include poof(string_and_value_tables(terrain_gen_type)) diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index ac1174146..536c837bd 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2359:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2360:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 37bf71bef..9a2d41fd7 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3339:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3340:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index d79265196..75427e111 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2312:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2313:0 case type_ui_render_command_window_start: { diff --git a/generated/are_equal_brush_settings.h b/generated/are_equal_brush_settings.h index 76137a6b1..559fc45ff 100644 --- a/generated/are_equal_brush_settings.h +++ b/generated/are_equal_brush_settings.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:963:0 +// src/engine/editor.h:994:0 link_internal b32 AreEqual(brush_settings *Thing1, brush_settings *Thing2) diff --git a/generated/are_equal_perlin_noise_params.h b/generated/are_equal_perlin_noise_params.h index e3c36eeaa..8744c3abd 100644 --- a/generated/are_equal_perlin_noise_params.h +++ b/generated/are_equal_perlin_noise_params.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:703:0 +// src/engine/editor.h:734:0 link_internal b32 AreEqual(perlin_noise_params *Thing1, perlin_noise_params *Thing2) diff --git a/generated/are_equal_world_edit_brush.h b/generated/are_equal_world_edit_brush.h index 14aac37cb..7eaa67161 100644 --- a/generated/are_equal_world_edit_brush.h +++ b/generated/are_equal_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1140:0 +// src/engine/editor.h:1171:0 link_internal b32 AreEqual(world_edit_brush *Thing1, world_edit_brush *Thing2) diff --git a/generated/block_array_h_asset_thumbnail_688856411.h b/generated/block_array_h_asset_thumbnail_688856411.h index 696c80ffd..a05d43bbf 100644 --- a/generated/block_array_h_asset_thumbnail_688856411.h +++ b/generated/block_array_h_asset_thumbnail_688856411.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:538:0 +// src/engine/editor.h:569:0 diff --git a/generated/block_array_world_edit_688735882.h b/generated/block_array_world_edit_688735882.h index 1c1b5b8ce..ab89bc9be 100644 --- a/generated/block_array_world_edit_688735882.h +++ b/generated/block_array_world_edit_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1155:0 +// src/engine/editor.h:1186:0 diff --git a/generated/block_array_world_edit_layer_688735882.h b/generated/block_array_world_edit_layer_688735882.h index 1a8d4ed77..4994c2be3 100644 --- a/generated/block_array_world_edit_layer_688735882.h +++ b/generated/block_array_world_edit_layer_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1166:0 +// src/engine/editor.h:1197:0 diff --git a/generated/block_array_world_edit_ptr_688735882.h b/generated/block_array_world_edit_ptr_688735882.h index 75989e806..0a7a58f61 100644 --- a/generated/block_array_world_edit_ptr_688735882.h +++ b/generated/block_array_world_edit_ptr_688735882.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1158:0 +// src/engine/editor.h:1189:0 diff --git a/generated/d_union_ui_render_command.h b/generated/d_union_ui_render_command.h index 4f68b4047..cd2285cf5 100644 --- a/generated/d_union_ui_render_command.h +++ b/generated/d_union_ui_render_command.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.h:814:0 +// external/bonsai_stdlib/src/ui/ui.h:832:0 enum ui_render_command_type { diff --git a/generated/default_marshal_brush_settings_0.h b/generated/default_marshal_brush_settings_0.h index f26bbf857..534df7549 100644 --- a/generated/default_marshal_brush_settings_0.h +++ b/generated/default_marshal_brush_settings_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1028:0 +// src/engine/editor.h:1059:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_1.h b/generated/default_marshal_brush_settings_1.h index 8345b1029..fd14f37d8 100644 --- a/generated/default_marshal_brush_settings_1.h +++ b/generated/default_marshal_brush_settings_1.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1021:0 +// src/engine/editor.h:1052:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_brush_settings_2.h b/generated/default_marshal_brush_settings_2.h index 190170c95..bcedc82c4 100644 --- a/generated/default_marshal_brush_settings_2.h +++ b/generated/default_marshal_brush_settings_2.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1014:0 +// src/engine/editor.h:1045:0 Live->Type = Stored->Type; diff --git a/generated/default_marshal_noise_layer_0.h b/generated/default_marshal_noise_layer_0.h index 104a53eff..13c86f542 100644 --- a/generated/default_marshal_noise_layer_0.h +++ b/generated/default_marshal_noise_layer_0.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:889:0 +// src/engine/editor.h:920:0 Live->Type = Stored->Type; diff --git a/generated/do_editor_ui_for_compound_type_maybe_ray.h b/generated/do_editor_ui_for_compound_type_maybe_ray.h index c14b8310b..8a1d6e153 100644 --- a/generated/do_editor_ui_for_compound_type_maybe_ray.h +++ b/generated/do_editor_ui_for_compound_type_maybe_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:544:0 +// src/engine/editor.h:575:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_ray.h b/generated/do_editor_ui_for_compound_type_ray.h index 55f9c41d5..33dc33770 100644 --- a/generated/do_editor_ui_for_compound_type_ray.h +++ b/generated/do_editor_ui_for_compound_type_ray.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:541:0 +// src/engine/editor.h:572:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ray *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3.h b/generated/do_editor_ui_for_compound_type_rect3.h index 47704fde4..7efb1ecef 100644 --- a/generated/do_editor_ui_for_compound_type_rect3.h +++ b/generated/do_editor_ui_for_compound_type_rect3.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:529:0 +// src/engine/editor.h:560:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3 *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3cp.h b/generated/do_editor_ui_for_compound_type_rect3cp.h index 3e4c17262..59ac2c4e0 100644 --- a/generated/do_editor_ui_for_compound_type_rect3cp.h +++ b/generated/do_editor_ui_for_compound_type_rect3cp.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:535:0 +// src/engine/editor.h:566:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3cp *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_rect3i.h b/generated/do_editor_ui_for_compound_type_rect3i.h index 492414fac..679937bd5 100644 --- a/generated/do_editor_ui_for_compound_type_rect3i.h +++ b/generated/do_editor_ui_for_compound_type_rect3i.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:532:0 +// src/engine/editor.h:563:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, rect3i *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Button) diff --git a/generated/do_editor_ui_for_compound_type_renderer_2d.h b/generated/do_editor_ui_for_compound_type_renderer_2d.h index ee43eddcf..15eb5d867 100644 --- a/generated/do_editor_ui_for_compound_type_renderer_2d.h +++ b/generated/do_editor_ui_for_compound_type_renderer_2d.h @@ -283,6 +283,22 @@ DoEditorUi(renderer_2d *Ui, window_layout *Window, renderer_2d *Element, cs Name + DoEditorUi(Ui, + Window, + // Cast to remove const/volatile keywords if they're there + Cast(layer_toolbar_actions*, &Element->LayerToolbarAction), + CSz("LayerToolbarAction"), + Params + ); + + + + + + + + + DoEditorUi(Ui, Window, // Cast to remove const/volatile keywords if they're there diff --git a/generated/do_editor_ui_for_enum_data_type.h b/generated/do_editor_ui_for_enum_data_type.h index 74dab13b7..99a34089c 100644 --- a/generated/do_editor_ui_for_enum_data_type.h +++ b/generated/do_editor_ui_for_enum_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:526:0 +// src/engine/editor.h:557:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, data_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_maybe_tag.h b/generated/do_editor_ui_for_enum_maybe_tag.h index 39889a390..c7d6ad69c 100644 --- a/generated/do_editor_ui_for_enum_maybe_tag.h +++ b/generated/do_editor_ui_for_enum_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:521:0 +// src/engine/editor.h:552:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, maybe_tag *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_enum_ui_noise_type.h b/generated/do_editor_ui_for_enum_ui_noise_type.h index bbefef355..f51ab78ed 100644 --- a/generated/do_editor_ui_for_enum_ui_noise_type.h +++ b/generated/do_editor_ui_for_enum_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:573:0 +// src/engine/editor.h:604:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, ui_noise_type *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 656950df7..5659fbd0c 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:731:0 +// src/engine/editor.h:762:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, asset_window_view_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index fb22f0a54..f67245372 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:905:0 +// src/engine/editor.h:936:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, brush_layer_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 6dc66d067..8f35ff6d2 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:737:0 +// src/engine/editor.h:768:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_blend_mode Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h index 22ce5a7e6..fe1177c54 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:720:0 +// src/engine/editor.h:751:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_blend_mode_modifier *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 56952f320..088b0ab5b 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:749:0 +// src/engine/editor.h:780:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_brush_type Selection) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h index 44cc5e8e7..986a01aec 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:742:0 +// src/engine/editor.h:773:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, world_edit_color_blend_mode *Element, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic) diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 617fc3c1b..7462f2ab1 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:746:0 +// src/engine/editor.h:777:0 link_internal void RadioSelect(ui_toggle_button_group *RadioGroup, world_edit_tool Selection) diff --git a/generated/do_editor_ui_for_scalar_type_688724926.h b/generated/do_editor_ui_for_scalar_type_688724926.h index 51d4d7c6e..9800f2a44 100644 --- a/generated/do_editor_ui_for_scalar_type_688724926.h +++ b/generated/do_editor_ui_for_scalar_type_688724926.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:396:0 +// src/engine/editor.h:427:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, s64 *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/do_editor_ui_for_vector_type_688873645.h b/generated/do_editor_ui_for_vector_type_688873645.h index 5d97a58c4..0e33ec6bc 100644 --- a/generated/do_editor_ui_for_vector_type_688873645.h +++ b/generated/do_editor_ui_for_vector_type_688873645.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:508:0 +// src/engine/editor.h:539:0 link_internal void DoEditorUi(renderer_2d *Ui, window_layout *Window, v4i *Value, cs Name, ui_render_params *Params = &DefaultUiRenderParams_Generic, EDITOR_UI_VALUE_RANGE_PROTO_DEFAULTS) diff --git a/generated/hashtable_world_edit_brush.h b/generated/hashtable_world_edit_brush.h index 37d8f692a..fce11d431 100644 --- a/generated/hashtable_world_edit_brush.h +++ b/generated/hashtable_world_edit_brush.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:1143:0 +// src/engine/editor.h:1174:0 struct world_edit_brush_linked_list_node { diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index 16329d82b..bcbf51132 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -1,4 +1,12 @@ -// src/engine/editor.h:559:0 +// src/engine/editor.h:590:0 + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, level_editor_flags Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} link_internal ui_toggle_button_group RadioButtonGroup_level_editor_flags( renderer_2d *Ui, @@ -24,3 +32,4 @@ RadioButtonGroup_level_editor_flags( renderer_2d *Ui, } + diff --git a/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h b/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h index 12bdcbfad..9e774908d 100644 --- a/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h +++ b/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h @@ -1,5 +1,13 @@ // examples/terrain_gen/game_types.h:25:0 +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, terrain_gen_type Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} + link_internal ui_toggle_button_group RadioButtonGroup_terrain_gen_type( renderer_2d *Ui, window_layout *Window, @@ -39,3 +47,4 @@ RadioButtonGroup_terrain_gen_type( renderer_2d *Ui, } + diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index 3d6cab4c5..c76c0c9f9 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -1,4 +1,12 @@ -// src/engine/editor.h:571:0 +// src/engine/editor.h:602:0 + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, ui_noise_type Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} link_internal ui_toggle_button_group RadioButtonGroup_ui_noise_type( renderer_2d *Ui, @@ -25,3 +33,4 @@ RadioButtonGroup_ui_noise_type( renderer_2d *Ui, } + diff --git a/generated/string_and_value_tables_data_type.h b/generated/string_and_value_tables_data_type.h index dea82dff1..8a07ff26f 100644 --- a/generated/string_and_value_tables_data_type.h +++ b/generated/string_and_value_tables_data_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:524:0 +// src/engine/editor.h:555:0 link_internal counted_string ToStringPrefixless(data_type Type) diff --git a/generated/string_and_value_tables_enum_brush_layer_type.h b/generated/string_and_value_tables_enum_brush_layer_type.h index 6e0bc7f60..268142585 100644 --- a/generated/string_and_value_tables_enum_brush_layer_type.h +++ b/generated/string_and_value_tables_enum_brush_layer_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:903:0 +// src/engine/editor.h:934:0 link_internal counted_string ToStringPrefixless(brush_layer_type Type) diff --git a/generated/string_and_value_tables_maybe_tag.h b/generated/string_and_value_tables_maybe_tag.h index f0c17fc99..9a824257c 100644 --- a/generated/string_and_value_tables_maybe_tag.h +++ b/generated/string_and_value_tables_maybe_tag.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:519:0 +// src/engine/editor.h:550:0 link_internal counted_string ToStringPrefixless(maybe_tag Type) diff --git a/generated/string_and_value_tables_shape_type.h b/generated/string_and_value_tables_shape_type.h index 851bf5e9c..5b3429395 100644 --- a/generated/string_and_value_tables_shape_type.h +++ b/generated/string_and_value_tables_shape_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:851:0 +// src/engine/editor.h:882:0 link_internal counted_string ToStringPrefixless(shape_type Type) diff --git a/generated/string_and_value_tables_ui_noise_type.h b/generated/string_and_value_tables_ui_noise_type.h index fea08f072..5ca335110 100644 --- a/generated/string_and_value_tables_ui_noise_type.h +++ b/generated/string_and_value_tables_ui_noise_type.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:569:0 +// src/engine/editor.h:600:0 link_internal counted_string ToStringPrefixless(ui_noise_type Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode.h b/generated/string_and_value_tables_world_edit_blend_mode.h index 0c7a482d7..63fcad829 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:734:0 +// src/engine/editor.h:765:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h index 04f63fcb5..1bbe0fca2 100644 --- a/generated/string_and_value_tables_world_edit_blend_mode_modifier.h +++ b/generated/string_and_value_tables_world_edit_blend_mode_modifier.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:717:0 +// src/engine/editor.h:748:0 link_internal counted_string ToStringPrefixless(world_edit_blend_mode_modifier Type) diff --git a/generated/string_and_value_tables_world_edit_color_blend_mode.h b/generated/string_and_value_tables_world_edit_color_blend_mode.h index e9304a143..a657f3380 100644 --- a/generated/string_and_value_tables_world_edit_color_blend_mode.h +++ b/generated/string_and_value_tables_world_edit_color_blend_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:740:0 +// src/engine/editor.h:771:0 link_internal counted_string ToStringPrefixless(world_edit_color_blend_mode Type) diff --git a/generated/string_and_value_tables_world_edit_selection_mode.h b/generated/string_and_value_tables_world_edit_selection_mode.h index f21e0db2a..092c98cf2 100644 --- a/generated/string_and_value_tables_world_edit_selection_mode.h +++ b/generated/string_and_value_tables_world_edit_selection_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:603:0 +// src/engine/editor.h:634:0 link_internal counted_string ToStringPrefixless(world_edit_selection_mode Type) diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index 817bafbb6..d439e23fd 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -1,4 +1,4 @@ -// src/engine/editor.h:726:0 +// src/engine/editor.h:757:0 link_internal ui_toggle_button_group ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index 90f716e0b..a12da73ab 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2395,6 +2395,9 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo ApplyEditToOctree(Engine, Edit, TempMemory); } +poof(toolbar_for_enum(layer_toolbar_actions)) +#include + link_internal void DoWorldEditor(engine_resources *Engine) { @@ -2895,8 +2898,11 @@ DoWorldEditor(engine_resources *Engine) local_persist window_layout AllEditsWindow = WindowLayout("All Edits", WindowLayoutFlag_Align_Bottom); PushWindowStart(Ui, &AllEditsWindow); - /* PushToolbarStart(); */ - /* PushToolbarEnd(); */ + + + PushToolbar(Ui, &AllEditsWindow, {}, &Ui->LayerToolbarAction); + + /* if ( */ PushTableStart(Ui); IterateOver(&Editor->Layers, Layer, LayerIndex) diff --git a/src/engine/editor.h b/src/engine/editor.h index 2c7d02e02..9eb3aa642 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -47,6 +47,7 @@ poof( } ) +// radio group poof( func radio_button_group_for_enum(enum_t) { @@ -68,15 +69,45 @@ poof( } ) -// TODO(Jesse) This is now the same as the radio button path, remove it poof( - func radio_button_group_for_bitfield_enum(enum_t) + func toolbar_for_enum(enum_t) { - generic_button_group_for_enum(enum_t, {Radio}, {|ToggleButtonGroupFlags_RadioButtons}) - } -) + radio_button_group_for_enum(enum_t) + link_internal ui_toggle_button_group + PushToolbar( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + enum_t.name *Element, + ui_render_params *Params = &DefaultUiRenderParams_Toolbar, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) + { + /* auto Result = RadioButtonGroup_(enum_t.name)(Ui, Window, GroupName, Element, Params, ExtraFlags); */ + ui_toggle_button_handle ButtonHandles[] = + { + enum_t.map(enum_v) + { + { CSz("enum_v.name.strip_all_prefix"), UiId(Window, Cast(void*, Element), Cast(void*, "enum_t.name enum_v.name")), enum_v.name }, + } + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = {}; + Result.Ui = Ui; + Result.Flags = ToggleButtonGroupFlags_None; + Result.Buttons = ButtonBuffer; + Result.EnumValue = Cast(u32*, Element); + + DrawButtonGroup(&Result, CSz("Uhh")); + return Result; + } + } +) poof( @@ -556,7 +587,7 @@ enum level_editor_flags /* LevelEditorFlags_RecomputeStandingSpotsOnLevelLoad = (1 << 1), */ }; -poof(radio_button_group_for_bitfield_enum(level_editor_flags)); +poof(radio_button_group_for_enum(level_editor_flags)); #include enum ui_noise_type @@ -568,7 +599,7 @@ enum ui_noise_type poof(string_and_value_tables(ui_noise_type)) #include -poof(radio_button_group_for_bitfield_enum(ui_noise_type)); +poof(radio_button_group_for_enum(ui_noise_type)); #include poof(do_editor_ui_for_enum(ui_noise_type)) #include From b82d2f36459c31c4d293c43fbf248d209dfb54e1 Mon Sep 17 00:00:00 2001 From: a pirate Date: Sun, 4 May 2025 14:49:07 -0700 Subject: [PATCH 223/421] Add toolbars --- external/bonsai_stdlib | 2 +- ...mous_function_ui_render_command_RuTTrHiW.h | 2 +- generated/anonymous_input_Lwen2qoF.h | 2 +- .../anonymous_ui_render_command_nKuoMe2B.h | 2 +- ...ui_for_radio_enum_asset_window_view_mode.h | 2 +- ...ditor_ui_for_radio_enum_brush_layer_type.h | 2 +- ..._ui_for_radio_enum_world_edit_blend_mode.h | 2 +- ..._ui_for_radio_enum_world_edit_brush_type.h | 2 +- ...editor_ui_for_radio_enum_world_edit_tool.h | 2 +- ...oup_for_bitfield_enum_level_editor_flags.h | 2 +- ...group_for_bitfield_enum_terrain_gen_type.h | 2 +- ...on_group_for_bitfield_enum_ui_noise_type.h | 2 +- generated/string_and_value_tables_enum.h | 27 ++++---- ...on_group_for_enum_engine_debug_view_mode.h | 2 +- generated/toolbar_for_enum_enum.h | 69 +++++++++++++++++++ src/engine/editor.cpp | 10 ++- src/engine/editor.h | 8 +-- 17 files changed, 109 insertions(+), 31 deletions(-) create mode 100644 generated/toolbar_for_enum_enum.h diff --git a/external/bonsai_stdlib b/external/bonsai_stdlib index 67a8945de..aee9c8be8 160000 --- a/external/bonsai_stdlib +++ b/external/bonsai_stdlib @@ -1 +1 @@ -Subproject commit 67a8945debf8152c3d1702a138265278e9e4a86a +Subproject commit aee9c8be8bd685165ce013265ae41cf8d410f8f1 diff --git a/generated/anonymous_function_ui_render_command_RuTTrHiW.h b/generated/anonymous_function_ui_render_command_RuTTrHiW.h index 536c837bd..7ccb9cc4c 100644 --- a/generated/anonymous_function_ui_render_command_RuTTrHiW.h +++ b/generated/anonymous_function_ui_render_command_RuTTrHiW.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2360:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2376:0 case type_ui_render_command_window_start: { diff --git a/generated/anonymous_input_Lwen2qoF.h b/generated/anonymous_input_Lwen2qoF.h index 9a2d41fd7..7c52d93e3 100644 --- a/generated/anonymous_input_Lwen2qoF.h +++ b/generated/anonymous_input_Lwen2qoF.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:3340:0 +// external/bonsai_stdlib/src/ui/ui.cpp:3356:0 if (Input->Dot.Clicked) { diff --git a/generated/anonymous_ui_render_command_nKuoMe2B.h b/generated/anonymous_ui_render_command_nKuoMe2B.h index 75427e111..672dbca70 100644 --- a/generated/anonymous_ui_render_command_nKuoMe2B.h +++ b/generated/anonymous_ui_render_command_nKuoMe2B.h @@ -1,4 +1,4 @@ -// external/bonsai_stdlib/src/ui/ui.cpp:2313:0 +// external/bonsai_stdlib/src/ui/ui.cpp:2329:0 case type_ui_render_command_window_start: { diff --git a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h index 5659fbd0c..d4f344da3 100644 --- a/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h +++ b/generated/do_editor_ui_for_radio_enum_asset_window_view_mode.h @@ -27,7 +27,7 @@ RadioButtonGroup_asset_window_view_mode( renderer_2d *Ui, ButtonHandles }; - ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_RadioButtons)); + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); return Result; } diff --git a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h index f67245372..e93ca4a8b 100644 --- a/generated/do_editor_ui_for_radio_enum_brush_layer_type.h +++ b/generated/do_editor_ui_for_radio_enum_brush_layer_type.h @@ -27,7 +27,7 @@ RadioButtonGroup_brush_layer_type( renderer_2d *Ui, ButtonHandles }; - ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_RadioButtons)); + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); return Result; } diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h index 8f35ff6d2..82732fc10 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_blend_mode.h @@ -29,7 +29,7 @@ RadioButtonGroup_world_edit_blend_mode( renderer_2d *Ui, ButtonHandles }; - ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_RadioButtons)); + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); return Result; } diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h index 088b0ab5b..f014589ee 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_brush_type.h @@ -30,7 +30,7 @@ RadioButtonGroup_world_edit_brush_type( renderer_2d *Ui, ButtonHandles }; - ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_RadioButtons)); + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); return Result; } diff --git a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h index 7462f2ab1..572ab560a 100644 --- a/generated/do_editor_ui_for_radio_enum_world_edit_tool.h +++ b/generated/do_editor_ui_for_radio_enum_world_edit_tool.h @@ -29,7 +29,7 @@ RadioButtonGroup_world_edit_tool( renderer_2d *Ui, ButtonHandles }; - ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_RadioButtons)); + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); return Result; } diff --git a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h index bcbf51132..0dee7d360 100644 --- a/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h +++ b/generated/radio_button_group_for_bitfield_enum_level_editor_flags.h @@ -27,7 +27,7 @@ RadioButtonGroup_level_editor_flags( renderer_2d *Ui, ButtonHandles }; - ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_RadioButtons)); + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); return Result; } diff --git a/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h b/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h index 9e774908d..b8b1e725b 100644 --- a/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h +++ b/generated/radio_button_group_for_bitfield_enum_terrain_gen_type.h @@ -42,7 +42,7 @@ RadioButtonGroup_terrain_gen_type( renderer_2d *Ui, ButtonHandles }; - ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_RadioButtons)); + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); return Result; } diff --git a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h index c76c0c9f9..538a5ad02 100644 --- a/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h +++ b/generated/radio_button_group_for_bitfield_enum_ui_noise_type.h @@ -28,7 +28,7 @@ RadioButtonGroup_ui_noise_type( renderer_2d *Ui, ButtonHandles }; - ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_RadioButtons)); + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); return Result; } diff --git a/generated/string_and_value_tables_enum.h b/generated/string_and_value_tables_enum.h index 6e0bc7f60..c889ab211 100644 --- a/generated/string_and_value_tables_enum.h +++ b/generated/string_and_value_tables_enum.h @@ -1,13 +1,14 @@ -// src/engine/editor.h:903:0 +// src/engine/editor.cpp:2398:0 link_internal counted_string -ToStringPrefixless(brush_layer_type Type) +ToStringPrefixless(layer_toolbar_actions Type) { counted_string Result = {}; switch (Type) { - case BrushLayerType_Noise: { Result = CSz("Noise"); } break; - case BrushLayerType_Shape: { Result = CSz("Shape"); } break; + case LayerToolbarActions_New: { Result = CSz("New"); } break; + case LayerToolbarActions_Delete: { Result = CSz("Delete"); } break; + case LayerToolbarActions_Rename: { Result = CSz("Rename"); } break; } @@ -16,13 +17,14 @@ ToStringPrefixless(brush_layer_type Type) } link_internal counted_string -ToString(brush_layer_type Type) +ToString(layer_toolbar_actions Type) { counted_string Result = {}; switch (Type) { - case BrushLayerType_Noise: { Result = CSz("BrushLayerType_Noise"); } break; - case BrushLayerType_Shape: { Result = CSz("BrushLayerType_Shape"); } break; + case LayerToolbarActions_New: { Result = CSz("LayerToolbarActions_New"); } break; + case LayerToolbarActions_Delete: { Result = CSz("LayerToolbarActions_Delete"); } break; + case LayerToolbarActions_Rename: { Result = CSz("LayerToolbarActions_Rename"); } break; } @@ -30,13 +32,14 @@ ToString(brush_layer_type Type) return Result; } -link_internal brush_layer_type -BrushLayerType(counted_string S) +link_internal layer_toolbar_actions +LayerToolbarActions(counted_string S) { - brush_layer_type Result = {}; + layer_toolbar_actions Result = {}; - if (StringsMatch(S, CSz("BrushLayerType_Noise"))) { return BrushLayerType_Noise; } - if (StringsMatch(S, CSz("BrushLayerType_Shape"))) { return BrushLayerType_Shape; } + if (StringsMatch(S, CSz("LayerToolbarActions_New"))) { return LayerToolbarActions_New; } + if (StringsMatch(S, CSz("LayerToolbarActions_Delete"))) { return LayerToolbarActions_Delete; } + if (StringsMatch(S, CSz("LayerToolbarActions_Rename"))) { return LayerToolbarActions_Rename; } return Result; } diff --git a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h index d439e23fd..efd611add 100644 --- a/generated/toggle_button_group_for_enum_engine_debug_view_mode.h +++ b/generated/toggle_button_group_for_enum_engine_debug_view_mode.h @@ -25,7 +25,7 @@ ToggleButtonGroup_engine_debug_view_mode( renderer_2d *Ui, ButtonHandles }; - ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_MultiSelectButtons)); + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeMultiSelectButton)); return Result; } diff --git a/generated/toolbar_for_enum_enum.h b/generated/toolbar_for_enum_enum.h new file mode 100644 index 000000000..c1cab337c --- /dev/null +++ b/generated/toolbar_for_enum_enum.h @@ -0,0 +1,69 @@ +// src/engine/editor.cpp:2400:0 + +link_internal void +RadioSelect(ui_toggle_button_group *RadioGroup, layer_toolbar_actions Selection) +{ + ui_toggle_button_handle *ToggleHandle = RadioGroup->Buttons.Start + Selection; + SetRadioButton(RadioGroup, ToggleHandle, True); + /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ +} + +link_internal ui_toggle_button_group +RadioButtonGroup_layer_toolbar_actions( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + layer_toolbar_actions *Element, + ui_render_params *Params = &DefaultUiRenderParams_Generic, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + ui_toggle_button_handle ButtonHandles[] = + { + { CSz("New"), UiId(Window, Cast(void*, Element), Cast(void*, "layer_toolbar_actions LayerToolbarActions_New")), LayerToolbarActions_New }, + { CSz("Delete"), UiId(Window, Cast(void*, Element), Cast(void*, "layer_toolbar_actions LayerToolbarActions_Delete")), LayerToolbarActions_Delete }, + { CSz("Rename"), UiId(Window, Cast(void*, Element), Cast(void*, "layer_toolbar_actions LayerToolbarActions_Rename")), LayerToolbarActions_Rename }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = DrawButtonGroupForEnum(Ui, &ButtonBuffer, GroupName, Cast(u32*, Element), Params, ui_toggle_button_group_flags(ExtraFlags|ToggleButtonGroupFlags_TypeRadioButton)); + return Result; +} + + + + +link_internal ui_toggle_button_group +PushToolbar( renderer_2d *Ui, + window_layout *Window, + cs GroupName, + layer_toolbar_actions *Element, + ui_render_params *Params = &DefaultUiRenderParams_Toolbar, + ui_toggle_button_group_flags ExtraFlags = ToggleButtonGroupFlags_None) +{ + /* auto Result = RadioButtonGroup_(enum_t.name)(Ui, Window, GroupName, Element, Params, ExtraFlags); */ + + ui_toggle_button_handle ButtonHandles[] = + { + { CSz("New"), UiId(Window, Cast(void*, Element), Cast(void*, "layer_toolbar_actions LayerToolbarActions_New")), LayerToolbarActions_New }, + { CSz("Delete"), UiId(Window, Cast(void*, Element), Cast(void*, "layer_toolbar_actions LayerToolbarActions_Delete")), LayerToolbarActions_Delete }, + { CSz("Rename"), UiId(Window, Cast(void*, Element), Cast(void*, "layer_toolbar_actions LayerToolbarActions_Rename")), LayerToolbarActions_Rename }, + }; + + ui_toggle_button_handle_buffer ButtonBuffer = { + ArrayCount(ButtonHandles), + ButtonHandles + }; + + ui_toggle_button_group Result = {}; + Result.Ui = Ui; + Result.Flags = ToggleButtonGroupFlags_TypePlainButton; + Result.Buttons = ButtonBuffer; + Result.EnumStorage = Cast(u32*, Element); + + DrawButtonGroup(&Result, CSz("Uhh")); + return Result; +} + diff --git a/src/engine/editor.cpp b/src/engine/editor.cpp index a12da73ab..ebb918057 100644 --- a/src/engine/editor.cpp +++ b/src/engine/editor.cpp @@ -2395,6 +2395,9 @@ UpdateWorldEdit(engine_resources *Engine, world_edit *Edit, rect3cp Region, memo ApplyEditToOctree(Engine, Edit, TempMemory); } +poof(string_and_value_tables(layer_toolbar_actions)) +#include + poof(toolbar_for_enum(layer_toolbar_actions)) #include @@ -2899,8 +2902,11 @@ DoWorldEditor(engine_resources *Engine) PushWindowStart(Ui, &AllEditsWindow); - - PushToolbar(Ui, &AllEditsWindow, {}, &Ui->LayerToolbarAction); + ui_toggle_button_group Toolbar = PushToolbar(Ui, &AllEditsWindow, {}, &Ui->LayerToolbarAction); + if (Toolbar.AnyElementClicked) + { + Info("%S", ToString(Ui->LayerToolbarAction)); + } /* if ( */ diff --git a/src/engine/editor.h b/src/engine/editor.h index 9eb3aa642..dccf583ab 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -39,7 +39,7 @@ poof( { enum_t.has_tag(bitfield)? { - generic_button_group_for_enum(enum_t, {Toggle}, {|ToggleButtonGroupFlags_MultiSelectButtons}) + generic_button_group_for_enum(enum_t, {Toggle}, {|ToggleButtonGroupFlags_TypeMultiSelectButton}) } { poof_error { Enum without @bitfield tag (enum_t.name) cannot create a multi-select button group. } @@ -64,7 +64,7 @@ poof( /* Ensure( ToggleRadioButton(RadioGroup, ToggleHandle) ); */ } - generic_button_group_for_enum(enum_t, {Radio}, {|ToggleButtonGroupFlags_RadioButtons}) + generic_button_group_for_enum(enum_t, {Radio}, {|ToggleButtonGroupFlags_TypeRadioButton}) } } ) @@ -99,9 +99,9 @@ poof( ui_toggle_button_group Result = {}; Result.Ui = Ui; - Result.Flags = ToggleButtonGroupFlags_None; + Result.Flags = ToggleButtonGroupFlags_TypePlainButton; Result.Buttons = ButtonBuffer; - Result.EnumValue = Cast(u32*, Element); + Result.EnumStorage = Cast(u32*, Element); DrawButtonGroup(&Result, CSz("Uhh")); return Result; From d35e8fcbc9f93e49a2358a894ea391174c0d96b8 Mon Sep 17 00:00:00 2001 From: a pirate Date: Mon, 5 May 2025 08:54:11 -0700 Subject: [PATCH 224/421] Update README --- readme.md | 3 ++- screenshots/brush.png | Bin 0 -> 597387 bytes screenshots/logo.png | Bin 71511 -> 0 bytes 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 screenshots/brush.png delete mode 100644 screenshots/logo.png diff --git a/readme.md b/readme.md index f5b14b404..60a31d11c 100644 --- a/readme.md +++ b/readme.md @@ -78,7 +78,7 @@ See the docs on the [build process](docs/01_build_process.md). * Layer-based brush GUI * (coming soon) Fully programmable custom brush shaders -![banner](screenshots/profiler.png) +![banner](screenshots/brush.png) ## Performance Profiler @@ -88,6 +88,7 @@ See the docs on the [build process](docs/01_build_process.md). * Context Switches (windows only) * Physical Core (windows only) +![banner](screenshots/profiler.png) # Gallery diff --git a/screenshots/brush.png b/screenshots/brush.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8bcc4dbc19b9c1e4ed5aab34496e238c2d9e4a GIT binary patch literal 597387 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